@entropy-softworks/ui 2026.8.35 → 2026.8.37
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/lib/components/auth/PasswordStrengthMeter.d.ts +9 -0
- package/lib/components/auth/PasswordStrengthMeter.d.ts.map +1 -1
- package/lib/components/auth/PasswordStrengthMeter.jsx +10 -4
- package/lib/components/auth/PasswordStrengthMeter.jsx.map +1 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js +1 -0
- package/lib/components/index.js.map +1 -1
- package/lib/components/profile/SecurityTab.d.ts +5 -1
- package/lib/components/profile/SecurityTab.d.ts.map +1 -1
- package/lib/components/profile/SecurityTab.jsx.map +1 -1
- package/lib/components/segmented-toggle.d.ts +9 -0
- package/lib/components/segmented-toggle.d.ts.map +1 -1
- package/lib/components/segmented-toggle.jsx +4 -0
- package/lib/components/segmented-toggle.jsx.map +1 -1
- package/lib/components/social-connections.d.ts +22 -5
- package/lib/components/social-connections.d.ts.map +1 -1
- package/lib/components/social-connections.jsx +37 -11
- package/lib/components/social-connections.jsx.map +1 -1
- package/lib/components/update-overlay.d.ts +41 -0
- package/lib/components/update-overlay.d.ts.map +1 -0
- package/lib/components/update-overlay.jsx +132 -0
- package/lib/components/update-overlay.jsx.map +1 -0
- package/lib/context/AppConfigContext.d.ts +27 -0
- package/lib/context/AppConfigContext.d.ts.map +1 -1
- package/lib/context/AppConfigContext.jsx.map +1 -1
- package/lib/demos/extension-popup.d.ts +212 -0
- package/lib/demos/extension-popup.d.ts.map +1 -0
- package/lib/demos/extension-popup.jsx +1172 -0
- package/lib/demos/extension-popup.jsx.map +1 -0
- package/lib/demos/index.d.ts +11 -0
- package/lib/demos/index.d.ts.map +1 -0
- package/lib/demos/index.js +14 -0
- package/lib/demos/index.js.map +1 -0
- package/lib/screens/auth/AuthScreen.d.ts +75 -1
- package/lib/screens/auth/AuthScreen.d.ts.map +1 -1
- package/lib/screens/auth/AuthScreen.jsx +356 -122
- package/lib/screens/auth/AuthScreen.jsx.map +1 -1
- package/lib/services/auth.service.d.ts +5 -1
- package/lib/services/auth.service.d.ts.map +1 -1
- package/lib/services/auth.service.js +5 -1
- package/lib/services/auth.service.js.map +1 -1
- package/package.json +7 -1
- package/src/components/auth/PasswordStrengthMeter.tsx +25 -3
- package/src/components/index.ts +1 -0
- package/src/components/profile/SecurityTab.tsx +11 -1
- package/src/components/segmented-toggle.tsx +13 -0
- package/src/components/social-connections.tsx +66 -20
- package/src/components/update-overlay.tsx +206 -0
- package/src/context/AppConfigContext.tsx +27 -0
- package/src/demos/extension-popup.tsx +2051 -0
- package/src/demos/index.ts +38 -0
- package/src/screens/auth/AuthScreen.tsx +701 -312
- package/src/services/auth.service.ts +13 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Vault browser-extension popup, as a shared component.
|
|
3
|
+
*
|
|
4
|
+
* A faithful recreation of `clients/extension` — the real popup's routes,
|
|
5
|
+
* layout, copy, field labels, sort options and tag/folder structure — running on
|
|
6
|
+
* sample data that never leaves the device. Interactive: open an item, copy a
|
|
7
|
+
* field, reveal a TOTP, switch tabs, walk into settings.
|
|
8
|
+
*
|
|
9
|
+
* It lives HERE rather than in either consumer because both the marketing site
|
|
10
|
+
* and the Vault app show it, and two copies of a 1,000-line recreation would
|
|
11
|
+
* drift the moment the real extension changed. Same reasoning as sharing
|
|
12
|
+
* `PasswordGenerator` instead of rewriting it per app.
|
|
13
|
+
*
|
|
14
|
+
* Two things the website's original did that this deliberately does not:
|
|
15
|
+
*
|
|
16
|
+
* * **No `auto` mode.** That drove a synthetic cursor with `querySelector` and
|
|
17
|
+
* `getBoundingClientRect`, which has no meaning on native. It belongs to that
|
|
18
|
+
* page's choreography, not to the extension, so the showcase keeps it.
|
|
19
|
+
* * **No drag-and-drop in the tags tab.** It used `@dnd-kit`, which is DOM-only.
|
|
20
|
+
* The grip handles remain as affordances because removing them would change
|
|
21
|
+
* the layout this exists to reproduce, but they do not drag.
|
|
22
|
+
*
|
|
23
|
+
* Everything else is the original, moved rather than rewritten.
|
|
24
|
+
*/
|
|
25
|
+
import React from "react";
|
|
26
|
+
import { ScrollView } from "react-native";
|
|
27
|
+
/**
|
|
28
|
+
* The real popup's frame, in px.
|
|
29
|
+
*
|
|
30
|
+
* `HEIGHT` is Chrome's *maximum* for a browser action popup, not a fixed size —
|
|
31
|
+
* the real popup is as tall as it needs to be, up to this. So a host with less
|
|
32
|
+
* vertical room may render it shorter (see the `height` prop) without the thing
|
|
33
|
+
* on screen becoming a lie about what the extension looks like; the item list
|
|
34
|
+
* scrolls inside, exactly as it does at full height.
|
|
35
|
+
*/
|
|
36
|
+
export declare const EXTENSION_POPUP_WIDTH = 380;
|
|
37
|
+
export declare const EXTENSION_POPUP_HEIGHT = 600;
|
|
38
|
+
/** Below this the chrome crowds out the list and it stops reading as the popup. */
|
|
39
|
+
export declare const EXTENSION_POPUP_MIN_HEIGHT = 320;
|
|
40
|
+
export declare function useInk(): {
|
|
41
|
+
fg: string;
|
|
42
|
+
muted: string;
|
|
43
|
+
bg: string;
|
|
44
|
+
border: string;
|
|
45
|
+
secondary: string;
|
|
46
|
+
danger: string;
|
|
47
|
+
star: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function vaultVars(dark: boolean): Record<string, string>;
|
|
50
|
+
export interface Account {
|
|
51
|
+
username: string;
|
|
52
|
+
password: string;
|
|
53
|
+
totp_secret?: string;
|
|
54
|
+
notes?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface Tag {
|
|
57
|
+
name: string;
|
|
58
|
+
color: string;
|
|
59
|
+
icon?: "tag" | "circle" | "star";
|
|
60
|
+
}
|
|
61
|
+
export interface Item {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
url: string;
|
|
65
|
+
favorite: boolean;
|
|
66
|
+
tags: Tag[];
|
|
67
|
+
accounts: Account[];
|
|
68
|
+
created: string;
|
|
69
|
+
updated: string;
|
|
70
|
+
}
|
|
71
|
+
export declare const T: {
|
|
72
|
+
social: Tag;
|
|
73
|
+
shopping: Tag;
|
|
74
|
+
finance: Tag;
|
|
75
|
+
streaming: Tag;
|
|
76
|
+
gaming: Tag;
|
|
77
|
+
};
|
|
78
|
+
export declare const ITEMS: Item[];
|
|
79
|
+
export declare const SORT_OPTIONS: readonly [{
|
|
80
|
+
readonly value: "name_asc";
|
|
81
|
+
readonly label: "Name (A-Z)";
|
|
82
|
+
readonly cmp: (a: Item, b: Item) => number;
|
|
83
|
+
}, {
|
|
84
|
+
readonly value: "name_desc";
|
|
85
|
+
readonly label: "Name (Z-A)";
|
|
86
|
+
readonly cmp: (a: Item, b: Item) => number;
|
|
87
|
+
}, {
|
|
88
|
+
readonly value: "updated_newest";
|
|
89
|
+
readonly label: "Recently updated";
|
|
90
|
+
readonly cmp: (a: Item, b: Item) => number;
|
|
91
|
+
}, {
|
|
92
|
+
readonly value: "created_newest";
|
|
93
|
+
readonly label: "Newest first";
|
|
94
|
+
readonly cmp: (a: Item, b: Item) => number;
|
|
95
|
+
}, {
|
|
96
|
+
readonly value: "created_oldest";
|
|
97
|
+
readonly label: "Oldest first";
|
|
98
|
+
readonly cmp: (a: Item, b: Item) => number;
|
|
99
|
+
}];
|
|
100
|
+
export declare function host(url: string): string;
|
|
101
|
+
export declare function favicon(url: string): string;
|
|
102
|
+
export declare function ItemIcon({ url, size, radius, }: {
|
|
103
|
+
url: string;
|
|
104
|
+
size?: number;
|
|
105
|
+
radius?: number;
|
|
106
|
+
}): React.JSX.Element;
|
|
107
|
+
export declare function useCopy(): {
|
|
108
|
+
copied: string | null;
|
|
109
|
+
copy: (key: string, text: string) => void;
|
|
110
|
+
};
|
|
111
|
+
export declare function totpCode(seed: string, step: number): string;
|
|
112
|
+
export declare function useTotp(secret?: string): {
|
|
113
|
+
code: string;
|
|
114
|
+
remaining: number;
|
|
115
|
+
};
|
|
116
|
+
export declare function RingCountdown({ remaining, size, period, color, }: {
|
|
117
|
+
remaining: number;
|
|
118
|
+
size?: number;
|
|
119
|
+
period?: number;
|
|
120
|
+
color: string;
|
|
121
|
+
}): React.JSX.Element;
|
|
122
|
+
export declare function VaultItemRow({ item, ink, onPress, highlight, }: {
|
|
123
|
+
item: Item;
|
|
124
|
+
ink: ReturnType<typeof useInk>;
|
|
125
|
+
onPress: () => void;
|
|
126
|
+
highlight?: boolean;
|
|
127
|
+
}): React.JSX.Element;
|
|
128
|
+
export declare function Dropdown({ open, onToggle, label, icon, children, ink, }: {
|
|
129
|
+
open: boolean;
|
|
130
|
+
onToggle: () => void;
|
|
131
|
+
label: string;
|
|
132
|
+
icon?: React.ReactNode;
|
|
133
|
+
children: React.ReactNode;
|
|
134
|
+
ink: ReturnType<typeof useInk>;
|
|
135
|
+
}): React.JSX.Element;
|
|
136
|
+
export declare function VaultList({ ink, onOpen, items, scrollRef, highlightId, }: {
|
|
137
|
+
ink: ReturnType<typeof useInk>;
|
|
138
|
+
onOpen: (id: string) => void;
|
|
139
|
+
items?: Item[];
|
|
140
|
+
scrollRef?: React.Ref<ScrollView>;
|
|
141
|
+
highlightId?: string | null;
|
|
142
|
+
}): React.JSX.Element;
|
|
143
|
+
export declare function FieldRow({ label, value, ink, copied, copy, secret, totp, }: {
|
|
144
|
+
label: string;
|
|
145
|
+
value: string;
|
|
146
|
+
ink: ReturnType<typeof useInk>;
|
|
147
|
+
copied: string | null;
|
|
148
|
+
copy: (k: string, t: string) => void;
|
|
149
|
+
secret?: boolean;
|
|
150
|
+
totp?: ReturnType<typeof useTotp>;
|
|
151
|
+
}): React.JSX.Element;
|
|
152
|
+
export declare function ItemDetail({ item, ink, onBack, onDelete, forceCopiedLabel, scrollRef, }: {
|
|
153
|
+
item: Item;
|
|
154
|
+
ink: ReturnType<typeof useInk>;
|
|
155
|
+
onBack: () => void;
|
|
156
|
+
onDelete?: () => void;
|
|
157
|
+
forceCopiedLabel?: string | null;
|
|
158
|
+
scrollRef?: React.Ref<ScrollView>;
|
|
159
|
+
}): React.JSX.Element | null;
|
|
160
|
+
/**
|
|
161
|
+
* The mark in the popup header.
|
|
162
|
+
*
|
|
163
|
+
* Supplied by the caller rather than loaded from a path. The original pointed
|
|
164
|
+
* at `/products/vault_light.png`, which only resolves on the marketing site —
|
|
165
|
+
* a shared package cannot reach into one consumer's public directory. Falls
|
|
166
|
+
* back to the wordmark so the header is never empty.
|
|
167
|
+
*/
|
|
168
|
+
export declare function VaultMark({ logo }: {
|
|
169
|
+
logo?: React.ReactNode;
|
|
170
|
+
}): React.JSX.Element;
|
|
171
|
+
export type ExtRoute = {
|
|
172
|
+
r: "main";
|
|
173
|
+
} | {
|
|
174
|
+
r: "detail";
|
|
175
|
+
id: string;
|
|
176
|
+
} | {
|
|
177
|
+
r: "settings";
|
|
178
|
+
} | {
|
|
179
|
+
r: "new";
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* A parent-driven view of the popup.
|
|
183
|
+
*
|
|
184
|
+
* Lets a scene puppet the popup — scroll the list, highlight a row, open it,
|
|
185
|
+
* show a field as copied — while the popup keeps owning how any of that looks.
|
|
186
|
+
* All of it is RN-safe, which is why it survived the move.
|
|
187
|
+
*
|
|
188
|
+
* What did NOT survive is the original's self-driving `auto` mode: it steered a
|
|
189
|
+
* synthetic cursor with `querySelector` and `getBoundingClientRect`, which have
|
|
190
|
+
* no meaning on native. A scene that wants that keeps its own cursor and drives
|
|
191
|
+
* this controller instead.
|
|
192
|
+
*/
|
|
193
|
+
export interface ExtensionPopupController {
|
|
194
|
+
route: ExtRoute;
|
|
195
|
+
highlightId: string | null;
|
|
196
|
+
autoCopied: string | null;
|
|
197
|
+
listScrollRef: React.Ref<ScrollView>;
|
|
198
|
+
detailScrollRef: React.Ref<ScrollView>;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The browser-extension popup.
|
|
202
|
+
*
|
|
203
|
+
* Interactive by default. Pass `external` to have a parent scene drive it.
|
|
204
|
+
*/
|
|
205
|
+
export declare function ExtensionPopup({ logo, external, height, }?: {
|
|
206
|
+
logo?: React.ReactNode;
|
|
207
|
+
external?: ExtensionPopupController;
|
|
208
|
+
/** Frame height. Defaults to the full 600; see `EXTENSION_POPUP_HEIGHT`. */
|
|
209
|
+
height?: number;
|
|
210
|
+
}): React.JSX.Element;
|
|
211
|
+
export default ExtensionPopup;
|
|
212
|
+
//# sourceMappingURL=extension-popup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-popup.d.ts","sourceRoot":"","sources":["../../src/demos/extension-popup.tsx"],"names":[],"mappings":"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"}
|