@entropy-softworks/ui 2026.8.28 → 2026.8.30
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/LockOverlay.d.ts +12 -1
- package/lib/components/auth/LockOverlay.d.ts.map +1 -1
- package/lib/components/auth/LockOverlay.jsx +4 -4
- package/lib/components/auth/LockOverlay.jsx.map +1 -1
- package/lib/components/dropdown-menu.d.ts.map +1 -1
- package/lib/components/dropdown-menu.jsx +8 -1
- package/lib/components/dropdown-menu.jsx.map +1 -1
- package/package.json +1 -1
- package/src/components/auth/LockOverlay.tsx +15 -3
- package/src/components/dropdown-menu.tsx +8 -1
|
@@ -22,6 +22,17 @@ interface LockOverlayProps {
|
|
|
22
22
|
* Face ID prompt".
|
|
23
23
|
*/
|
|
24
24
|
onBiometricUnlock?: () => Promise<void> | void;
|
|
25
|
+
/**
|
|
26
|
+
* Whether `onBiometricUnlock` fires automatically on mount. Defaults
|
|
27
|
+
* to true (the original behavior) — set false for a re-lock triggered
|
|
28
|
+
* by idle timeout rather than a fresh app launch, so the OS biometric
|
|
29
|
+
* sensor doesn't pop up unprompted every time the session times out
|
|
30
|
+
* from inactivity. The manual "Unlock with Biometrics Instead" button
|
|
31
|
+
* is unaffected by this — it's still shown (and still works) whenever
|
|
32
|
+
* `onBiometricUnlock` is provided, regardless of this flag; only the
|
|
33
|
+
* automatic first attempt is what this suppresses.
|
|
34
|
+
*/
|
|
35
|
+
autoPromptBiometric?: boolean;
|
|
25
36
|
}
|
|
26
37
|
/**
|
|
27
38
|
* Unlock form for session-locked flows (e.g. vault re-lock after idle).
|
|
@@ -30,6 +41,6 @@ interface LockOverlayProps {
|
|
|
30
41
|
* unlock work begins so the fiber tree no longer references the
|
|
31
42
|
* plaintext during PBKDF2 / WebCrypto derivation.
|
|
32
43
|
*/
|
|
33
|
-
export declare function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUnlock, }: LockOverlayProps): React.JSX.Element;
|
|
44
|
+
export declare function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUnlock, autoPromptBiometric, }: LockOverlayProps): React.JSX.Element;
|
|
34
45
|
export {};
|
|
35
46
|
//# sourceMappingURL=LockOverlay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAiB3D,UAAU,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,4CAA4C;IAC5C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"LockOverlay.d.ts","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAiB3D,UAAU,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,4CAA4C;IAC5C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,mBAA0B,GAC3B,EAAE,gBAAgB,qBAsNlB"}
|
|
@@ -15,7 +15,7 @@ import { useAppConfig } from "../../context/AppConfigContext";
|
|
|
15
15
|
* unlock work begins so the fiber tree no longer references the
|
|
16
16
|
* plaintext during PBKDF2 / WebCrypto derivation.
|
|
17
17
|
*/
|
|
18
|
-
export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUnlock, }) {
|
|
18
|
+
export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUnlock, autoPromptBiometric = true, }) {
|
|
19
19
|
const { appName, Logo } = useAppConfig();
|
|
20
20
|
const { colorScheme } = useColorScheme();
|
|
21
21
|
const isDark = colorScheme === "dark";
|
|
@@ -44,7 +44,7 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
44
44
|
// neither settling — reported as a black screen the app never
|
|
45
45
|
// recovered from, root-caused on 2026-08-17. There is no such field
|
|
46
46
|
// for Android to react to until biometric unlock has actually failed.
|
|
47
|
-
const [mode, setMode] = useState(onBiometricUnlock ? "biometric" : "password");
|
|
47
|
+
const [mode, setMode] = useState(onBiometricUnlock && autoPromptBiometric ? "biometric" : "password");
|
|
48
48
|
const triggerBiometricUnlock = React.useCallback(async () => {
|
|
49
49
|
if (!onBiometricUnlock) {
|
|
50
50
|
return;
|
|
@@ -59,11 +59,11 @@ export function LockOverlay({ onUnlock, onSignOut, successMessage, onBiometricUn
|
|
|
59
59
|
}
|
|
60
60
|
}, [onBiometricUnlock]);
|
|
61
61
|
useEffect(() => {
|
|
62
|
-
if (onBiometricUnlock && !hasAutoPrompted.current) {
|
|
62
|
+
if (onBiometricUnlock && autoPromptBiometric && !hasAutoPrompted.current) {
|
|
63
63
|
hasAutoPrompted.current = true;
|
|
64
64
|
void triggerBiometricUnlock();
|
|
65
65
|
}
|
|
66
|
-
}, [onBiometricUnlock, triggerBiometricUnlock]);
|
|
66
|
+
}, [onBiometricUnlock, autoPromptBiometric, triggerBiometricUnlock]);
|
|
67
67
|
useEffect(() => {
|
|
68
68
|
if (biometricState === "prompting") {
|
|
69
69
|
pulse.value = withRepeat(withTiming(1.12, { duration: 650, easing: Easing.inOut(Easing.ease) }), -1, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockOverlay.jsx","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,4BAA4B,CAAC;AAC/C,OAAO,QAAQ,EAAE,EACf,MAAM,EACN,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"LockOverlay.jsx","sourceRoot":"","sources":["../../../src/components/auth/LockOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAY,IAAI,EAAkB,MAAM,cAAc,CAAC;AAE9D,QAAA,MAAM,YAAY;;;;;;;CAA6B,CAAC;AAChD,QAAA,MAAM,mBAAmB;;;;;;;;CAAgC,CAAC;AAE1D,QAAA,MAAM,mBAAmB;;;;;
|
|
1
|
+
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAY,IAAI,EAAkB,MAAM,cAAc,CAAC;AAE9D,QAAA,MAAM,YAAY;;;;;;;CAA6B,CAAC;AAChD,QAAA,MAAM,mBAAmB;;;;;;;;CAAgC,CAAC;AAE1D,QAAA,MAAM,mBAAmB;;;;;0HAyCvB,CAAC;AAGH,QAAA,MAAM,gBAAgB;;;;;;;;kEAcpB,CAAC;AAGH,QAAA,MAAM,wBAAwB;;;;;;;;;;kEAsB5B,CAAC;AAGH,QAAA,MAAM,iBAAiB;;gHASrB,CAAC;AAGH,QAAA,MAAM,qBAAqB;;;;kEASzB,CAAC;AAGH,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,CAAC"}
|
|
@@ -14,7 +14,14 @@ const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...pr
|
|
|
14
14
|
return <DropdownMenuPrimitive.Portal>{content}</DropdownMenuPrimitive.Portal>;
|
|
15
15
|
}
|
|
16
16
|
return (<DropdownMenuPrimitive.Portal>
|
|
17
|
-
|
|
17
|
+
{/* absolute inset-0: without explicit full-screen sizing this
|
|
18
|
+
renders at its default (shrink-to-fit) size — effectively
|
|
19
|
+
zero-area, so it never actually intercepts a tap anywhere
|
|
20
|
+
outside the menu content itself. The primitive's own
|
|
21
|
+
onPress-closes-on-tap behavior was always correct; it just
|
|
22
|
+
never had anything to receive that tap. Reported as "tapping
|
|
23
|
+
elsewhere doesn't dismiss the dropdown," 2026-08-17. */}
|
|
24
|
+
<DropdownMenuPrimitive.Overlay className="absolute inset-0 animate-in fade-in-0"/>
|
|
18
25
|
{content}
|
|
19
26
|
</DropdownMenuPrimitive.Portal>);
|
|
20
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-menu.jsx","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,qBAAqB,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAkB,MAAM,cAAc,CAAC;AAE9D,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAChD,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,OAAO,CAAC;AAE1D,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAG1C,CAAC,EAAE,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjD,MAAM,OAAO,GAAG,CACd,CAAC,qBAAqB,CAAC,OAAO,CAC5B,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,SAAS,CAAC,CAAC,EAAE,CACX,wHAAwH,EACxH,SAAS,CACV,CAAC,CACF,KAAK,CAAC,CACJ,QAAQ,CAAC,EAAE,KAAK,KAAK;YACnB,CAAC,CAAE,EAAE,SAAS,EAAE,kCAAkC,EACtB;YAC5B,CAAC,CAAC,SACN,CAAC,CACD,IAAI,KAAK,CAAC,EACV,CACH,CAAC;IAEF,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,qEAAqE;QACrE,gDAAgD;QAChD,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,CACL,CAAC,qBAAqB,CAAC,MAAM,CAC3B;MAAA,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"dropdown-menu.jsx","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -38,6 +38,17 @@ interface LockOverlayProps {
|
|
|
38
38
|
* Face ID prompt".
|
|
39
39
|
*/
|
|
40
40
|
onBiometricUnlock?: () => Promise<void> | void;
|
|
41
|
+
/**
|
|
42
|
+
* Whether `onBiometricUnlock` fires automatically on mount. Defaults
|
|
43
|
+
* to true (the original behavior) — set false for a re-lock triggered
|
|
44
|
+
* by idle timeout rather than a fresh app launch, so the OS biometric
|
|
45
|
+
* sensor doesn't pop up unprompted every time the session times out
|
|
46
|
+
* from inactivity. The manual "Unlock with Biometrics Instead" button
|
|
47
|
+
* is unaffected by this — it's still shown (and still works) whenever
|
|
48
|
+
* `onBiometricUnlock` is provided, regardless of this flag; only the
|
|
49
|
+
* automatic first attempt is what this suppresses.
|
|
50
|
+
*/
|
|
51
|
+
autoPromptBiometric?: boolean;
|
|
41
52
|
}
|
|
42
53
|
|
|
43
54
|
/**
|
|
@@ -52,6 +63,7 @@ export function LockOverlay({
|
|
|
52
63
|
onSignOut,
|
|
53
64
|
successMessage,
|
|
54
65
|
onBiometricUnlock,
|
|
66
|
+
autoPromptBiometric = true,
|
|
55
67
|
}: LockOverlayProps) {
|
|
56
68
|
const { appName, Logo } = useAppConfig();
|
|
57
69
|
const { colorScheme } = useColorScheme();
|
|
@@ -83,7 +95,7 @@ export function LockOverlay({
|
|
|
83
95
|
// recovered from, root-caused on 2026-08-17. There is no such field
|
|
84
96
|
// for Android to react to until biometric unlock has actually failed.
|
|
85
97
|
const [mode, setMode] = useState<"biometric" | "password">(
|
|
86
|
-
onBiometricUnlock ? "biometric" : "password"
|
|
98
|
+
onBiometricUnlock && autoPromptBiometric ? "biometric" : "password"
|
|
87
99
|
);
|
|
88
100
|
|
|
89
101
|
const triggerBiometricUnlock = React.useCallback(async () => {
|
|
@@ -100,11 +112,11 @@ export function LockOverlay({
|
|
|
100
112
|
}, [onBiometricUnlock]);
|
|
101
113
|
|
|
102
114
|
useEffect(() => {
|
|
103
|
-
if (onBiometricUnlock && !hasAutoPrompted.current) {
|
|
115
|
+
if (onBiometricUnlock && autoPromptBiometric && !hasAutoPrompted.current) {
|
|
104
116
|
hasAutoPrompted.current = true;
|
|
105
117
|
void triggerBiometricUnlock();
|
|
106
118
|
}
|
|
107
|
-
}, [onBiometricUnlock, triggerBiometricUnlock]);
|
|
119
|
+
}, [onBiometricUnlock, autoPromptBiometric, triggerBiometricUnlock]);
|
|
108
120
|
|
|
109
121
|
useEffect(() => {
|
|
110
122
|
if (biometricState === "prompting") {
|
|
@@ -36,7 +36,14 @@ const DropdownMenuContent = React.forwardRef<
|
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
38
|
<DropdownMenuPrimitive.Portal>
|
|
39
|
-
|
|
39
|
+
{/* absolute inset-0: without explicit full-screen sizing this
|
|
40
|
+
renders at its default (shrink-to-fit) size — effectively
|
|
41
|
+
zero-area, so it never actually intercepts a tap anywhere
|
|
42
|
+
outside the menu content itself. The primitive's own
|
|
43
|
+
onPress-closes-on-tap behavior was always correct; it just
|
|
44
|
+
never had anything to receive that tap. Reported as "tapping
|
|
45
|
+
elsewhere doesn't dismiss the dropdown," 2026-08-17. */}
|
|
46
|
+
<DropdownMenuPrimitive.Overlay className="absolute inset-0 animate-in fade-in-0" />
|
|
40
47
|
{content}
|
|
41
48
|
</DropdownMenuPrimitive.Portal>
|
|
42
49
|
);
|