@multiplatform.one/theme 7.79.0 → 7.81.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/package.json +5 -5
- package/src/menuRow.ts +17 -0
- package/src/theme/overlaySurfaces.tsx +31 -2
- package/src/theme/useSchemePreference.native.ts +35 -10
- package/src/theme/useSchemePreference.spec.tsx +100 -33
- package/src/theme/v3TokenRoles.ts +1 -1
- package/types/menuRow.d.ts +23 -0
- package/types/menuRow.d.ts.map +1 -1
- package/types/theme/overlaySurfaces.d.ts +26 -0
- package/types/theme/overlaySurfaces.d.ts.map +1 -1
- package/types/theme/useSchemePreference.native.d.ts.map +1 -1
- package/types/theme/v3TokenRoles.d.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/theme",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.81.0",
|
|
4
4
|
"description": "Tamagui theme system for multiplatform.one",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"multiplatform",
|
|
@@ -72,8 +72,8 @@
|
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@multiplatform.one/platform": "^7.
|
|
76
|
-
"@multiplatform.one/store": "^7.
|
|
75
|
+
"@multiplatform.one/platform": "^7.81.0",
|
|
76
|
+
"@multiplatform.one/store": "^7.81.0",
|
|
77
77
|
"@tamagui/animations-react-native": "2.7.6",
|
|
78
78
|
"@tamagui/colors": "2.7.6",
|
|
79
79
|
"@tamagui/config": "2.7.6",
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@expo/prebuild-config": "55.0.18",
|
|
92
|
-
"@multiplatform.one/config": "7.
|
|
93
|
-
"@multiplatform.one/test-utils": "7.
|
|
92
|
+
"@multiplatform.one/config": "7.81.0",
|
|
93
|
+
"@multiplatform.one/test-utils": "7.81.0",
|
|
94
94
|
"@tamagui/animations-css": "2.7.6",
|
|
95
95
|
"@tamagui/animations-reanimated": "2.7.6",
|
|
96
96
|
"@tamagui/font-inter": "2.7.6",
|
package/src/menuRow.ts
CHANGED
|
@@ -64,6 +64,23 @@ export function menuRowChecked(scheme: ColorScheme) {
|
|
|
64
64
|
/** The check mark on a `menuRowChecked` row: the theme's accent (FZ-8557). */
|
|
65
65
|
export const menuRowCheckInk = "$accentColor" as const;
|
|
66
66
|
|
|
67
|
+
/**
|
|
68
|
+
* The check mark's glyph on every menu and picker row (LC-262, FZ-8557): the
|
|
69
|
+
* 14px bold check Clay rated 4/4 in FZ-8355 r6. Forms and components each draw
|
|
70
|
+
* it through a thin `CheckGlyph` that reads this one recipe, in
|
|
71
|
+
* `useMenuRowCheckInk`'s paint.
|
|
72
|
+
*/
|
|
73
|
+
export const menuRowCheckGlyph = { size: 14, weight: "bold" } as const;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The glyph a menu row's leading icon draws at (FZ-8557 r3, LC-262). A menu
|
|
77
|
+
* whose rows carry icons draws its check at this glyph too, so both share one
|
|
78
|
+
* stroke.
|
|
79
|
+
*/
|
|
80
|
+
export const menuRowIconGlyph = { size: 18, weight: "bold" } as const;
|
|
81
|
+
|
|
82
|
+
export type MenuRowGlyph = { readonly size: number; readonly weight: "bold" };
|
|
83
|
+
|
|
67
84
|
type ThemeValues = Record<string, { val?: unknown } | undefined>;
|
|
68
85
|
|
|
69
86
|
function isHueless(paint: string): boolean {
|
|
@@ -19,6 +19,35 @@ import {
|
|
|
19
19
|
type ViewProps,
|
|
20
20
|
} from "tamagui";
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* The scrim under every modal surface: dialogs, alerts and sheets (FZ-8557).
|
|
24
|
+
* `$shadow4` is the SHC console's `backgroundScrim` weight (light 0.26, dark
|
|
25
|
+
* 0.58 there; 0.22 and 0.45 here), the dim an iOS sheet lays over its page.
|
|
26
|
+
* `$shadow6` read as a heavy grey wash in light.
|
|
27
|
+
*/
|
|
28
|
+
export const overlayScrim = "$shadow4" as const;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A sheet's grabber (HIG, FZ-8557): a 36×5 capsule inside the sheet's top
|
|
32
|
+
* edge, 6pt down, drawn over the frame rather than floating on the scrim.
|
|
33
|
+
* Spread on `Sheet.Handle`; the frame keeps `sheetGrabberClearance` clear.
|
|
34
|
+
*/
|
|
35
|
+
export const sheetGrabber = {
|
|
36
|
+
width: 36,
|
|
37
|
+
height: 5,
|
|
38
|
+
borderRadius: 100,
|
|
39
|
+
backgroundColor: "$color8",
|
|
40
|
+
opacity: 0.45,
|
|
41
|
+
alignSelf: "center",
|
|
42
|
+
marginHorizontal: 0,
|
|
43
|
+
marginTop: 0,
|
|
44
|
+
marginBottom: -11,
|
|
45
|
+
zIndex: 10,
|
|
46
|
+
} as const;
|
|
47
|
+
|
|
48
|
+
/** The top inset a sheet's content keeps clear of its grabber. */
|
|
49
|
+
export const sheetGrabberClearance = 16;
|
|
50
|
+
|
|
22
51
|
// ── Overlay frame focus (LC-71) ──────────────────────────────────────────
|
|
23
52
|
// Radix Dialog.Content / Primer Dialog are tabIndex=-1 and auto-focused on
|
|
24
53
|
// open. The frame is not a control: UA :focus-visible must not ring the
|
|
@@ -247,7 +276,7 @@ export const DialogOverlay = forwardRef<
|
|
|
247
276
|
return (
|
|
248
277
|
<Dialog.Overlay
|
|
249
278
|
ref={ref}
|
|
250
|
-
backgroundColor=
|
|
279
|
+
backgroundColor={overlayScrim}
|
|
251
280
|
{...transitionProps(knobProps.motion.scrim)}
|
|
252
281
|
enterStyle={scrimFade}
|
|
253
282
|
exitStyle={scrimFade}
|
|
@@ -313,7 +342,7 @@ export const AlertDialogOverlay = forwardRef<
|
|
|
313
342
|
return (
|
|
314
343
|
<AlertDialog.Overlay
|
|
315
344
|
ref={ref}
|
|
316
|
-
backgroundColor=
|
|
345
|
+
backgroundColor={overlayScrim}
|
|
317
346
|
{...transitionProps(knobProps.motion.scrim)}
|
|
318
347
|
enterStyle={scrimFade}
|
|
319
348
|
exitStyle={scrimFade}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useSyncExternalStore } from "react";
|
|
2
|
-
import { Appearance
|
|
2
|
+
import { Appearance } from "react-native";
|
|
3
3
|
import { useDidFinishSSR } from "tamagui";
|
|
4
4
|
import { isWeb } from "@multiplatform.one/platform";
|
|
5
5
|
import { getStoredScheme, setStoredScheme, subscribeStoredScheme } from "./schemeStore";
|
|
@@ -12,22 +12,47 @@ export interface SchemePreference {
|
|
|
12
12
|
}
|
|
13
13
|
const serverScheme = (): ThemeScheme => "system";
|
|
14
14
|
|
|
15
|
+
// RN's Appearance.setColorScheme("unspecified") writes "unspecified" into the
|
|
16
|
+
// JS cache that getColorScheme/useColorScheme read, with no change event, so
|
|
17
|
+
// System resolved light until the OS flipped (FZ-8708). The native scheme is
|
|
18
|
+
// read once before the first override and then only from change events.
|
|
19
|
+
let nativeScheme: "light" | "dark" | undefined;
|
|
20
|
+
const nativeListeners = new Set<() => void>();
|
|
21
|
+
|
|
22
|
+
function getNativeScheme(): "light" | "dark" {
|
|
23
|
+
if (nativeScheme === undefined) {
|
|
24
|
+
nativeScheme = Appearance.getColorScheme() === "dark" ? "dark" : "light";
|
|
25
|
+
Appearance.addChangeListener(({ colorScheme }) => {
|
|
26
|
+
if ((colorScheme !== "light" && colorScheme !== "dark") || colorScheme === nativeScheme) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
nativeScheme = colorScheme;
|
|
30
|
+
nativeListeners.forEach((listener) => listener());
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return nativeScheme;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function subscribeNativeScheme(listener: () => void) {
|
|
37
|
+
getNativeScheme();
|
|
38
|
+
nativeListeners.add(listener);
|
|
39
|
+
return () => {
|
|
40
|
+
nativeListeners.delete(listener);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
15
44
|
export function useSchemePreference(): SchemePreference {
|
|
16
45
|
const setting = useSyncExternalStore(subscribeStoredScheme, getStoredScheme, serverScheme);
|
|
17
|
-
const os =
|
|
46
|
+
const os = useSyncExternalStore(subscribeNativeScheme, getNativeScheme, getNativeScheme);
|
|
18
47
|
const hydrated = useDidFinishSSR();
|
|
19
48
|
useEffect(() => {
|
|
20
|
-
if (
|
|
49
|
+
if (isWeb) return;
|
|
50
|
+
getNativeScheme();
|
|
51
|
+
Appearance.setColorScheme(setting === "system" ? "unspecified" : setting);
|
|
21
52
|
}, [setting]);
|
|
22
53
|
return {
|
|
23
54
|
setting: hydrated ? setting : "system",
|
|
24
|
-
value: !hydrated
|
|
25
|
-
? "light"
|
|
26
|
-
: setting === "system"
|
|
27
|
-
? os === "dark"
|
|
28
|
-
? "dark"
|
|
29
|
-
: "light"
|
|
30
|
-
: setting,
|
|
55
|
+
value: !hydrated ? "light" : setting === "system" ? os : setting,
|
|
31
56
|
set: setStoredScheme,
|
|
32
57
|
};
|
|
33
58
|
}
|
|
@@ -1,51 +1,118 @@
|
|
|
1
|
-
import { act, cleanup, renderHook } from "@testing-library/react";
|
|
2
|
-
import { afterEach, expect, it, vi } from "vitest";
|
|
1
|
+
import { act, cleanup, render, renderHook } from "@testing-library/react";
|
|
2
|
+
import { afterEach, beforeEach, expect, it, vi } from "vitest";
|
|
3
3
|
import { useSyncExternalStore } from "react";
|
|
4
|
+
import type { SchemePreference } from "./useSchemePreference.native";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
// Mirrors react-native 0.83 Libraries/Utilities/Appearance.js over RCTAppearance:
|
|
7
|
+
// the JS side caches the first native read, setColorScheme overwrites that
|
|
8
|
+
// cache with its argument and emits nothing, and native emits a change only
|
|
9
|
+
// when the window's effective style moves.
|
|
10
|
+
const rn = vi.hoisted(() => ({
|
|
11
|
+
os: "light" as "light" | "dark",
|
|
12
|
+
override: "unspecified" as string,
|
|
13
|
+
current: "light" as string,
|
|
14
|
+
cache: null as { colorScheme: string } | null,
|
|
15
|
+
listeners: new Set<(value: { colorScheme: string }) => void>(),
|
|
9
16
|
}));
|
|
17
|
+
function syncNative() {
|
|
18
|
+
const effective = rn.override === "unspecified" ? rn.os : rn.override;
|
|
19
|
+
if (effective === rn.current) return;
|
|
20
|
+
rn.current = effective;
|
|
21
|
+
rn.cache = { colorScheme: effective };
|
|
22
|
+
rn.listeners.forEach((listener) => listener({ colorScheme: effective }));
|
|
23
|
+
}
|
|
10
24
|
vi.mock("@multiplatform.one/platform", () => ({ isWeb: false }));
|
|
11
25
|
vi.mock("@multiplatform.one/store", () => ({
|
|
12
26
|
storage: { getItem: () => null, setItem: () => {} },
|
|
13
27
|
}));
|
|
14
28
|
vi.mock("tamagui", () => ({ useDidFinishSSR: () => true }));
|
|
15
|
-
vi.mock("react-native", () =>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
(
|
|
19
|
-
|
|
20
|
-
return () => {
|
|
21
|
-
os.listeners.delete(l);
|
|
22
|
-
};
|
|
23
|
-
},
|
|
24
|
-
() => os.forced ?? os.value,
|
|
25
|
-
),
|
|
26
|
-
Appearance: {
|
|
27
|
-
setColorScheme: (value: string | null) => {
|
|
28
|
-
os.forced = value === "unspecified" ? null : value;
|
|
29
|
-
os.listeners.forEach((l) => l());
|
|
29
|
+
vi.mock("react-native", () => {
|
|
30
|
+
const Appearance = {
|
|
31
|
+
getColorScheme: () => {
|
|
32
|
+
if (rn.cache == null) rn.cache = { colorScheme: rn.current };
|
|
33
|
+
return rn.cache.colorScheme;
|
|
30
34
|
},
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
35
|
+
setColorScheme: (value: string) => {
|
|
36
|
+
rn.cache = { colorScheme: value };
|
|
37
|
+
queueMicrotask(() => {
|
|
38
|
+
rn.override = value;
|
|
39
|
+
syncNative();
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
addChangeListener: (listener: (value: { colorScheme: string }) => void) => {
|
|
43
|
+
rn.listeners.add(listener);
|
|
44
|
+
return { remove: () => rn.listeners.delete(listener) };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const subscribe = (onChange: () => void) => {
|
|
48
|
+
const subscription = Appearance.addChangeListener(onChange);
|
|
49
|
+
return () => subscription.remove();
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
Appearance,
|
|
53
|
+
useColorScheme: () => useSyncExternalStore(subscribe, Appearance.getColorScheme),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
let useSchemePreference: () => SchemePreference;
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
vi.resetModules();
|
|
60
|
+
rn.cache = null;
|
|
61
|
+
rn.listeners.clear();
|
|
62
|
+
rn.override = "unspecified";
|
|
63
|
+
({ useSchemePreference } = await import("./useSchemePreference.native"));
|
|
64
|
+
});
|
|
34
65
|
afterEach(cleanup);
|
|
35
66
|
|
|
36
|
-
|
|
67
|
+
function flipOs(scheme: "light" | "dark") {
|
|
68
|
+
rn.os = scheme;
|
|
69
|
+
syncNative();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
it("system follows the OS scheme on first render, before any change event (FZ-8708)", async () => {
|
|
73
|
+
rn.os = "dark";
|
|
74
|
+
rn.current = "dark";
|
|
75
|
+
const seen: string[] = [];
|
|
76
|
+
function Probe({ tick }: { tick: number }) {
|
|
77
|
+
const { value } = useSchemePreference();
|
|
78
|
+
seen.push(`${tick}:${value}`);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const view = render(<Probe tick={0} />);
|
|
82
|
+
expect(seen[0]).toBe("0:dark");
|
|
83
|
+
await act(async () => {});
|
|
84
|
+
expect(rn.cache).toEqual({ colorScheme: "unspecified" });
|
|
85
|
+
view.rerender(<Probe tick={1} />);
|
|
86
|
+
expect(seen.at(-1)).toBe("1:dark");
|
|
87
|
+
expect(seen.filter((entry) => entry.endsWith("light"))).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("keeps the OS scheme when Dark goes back to System on a dark OS, and follows later OS flips", async () => {
|
|
91
|
+
rn.os = "dark";
|
|
92
|
+
rn.current = "dark";
|
|
93
|
+
const hook = renderHook(useSchemePreference);
|
|
94
|
+
await act(async () => hook.result.current.set("dark"));
|
|
95
|
+
expect(rn.override).toBe("dark");
|
|
96
|
+
await act(async () => hook.result.current.set("system"));
|
|
97
|
+
expect(rn.override).toBe("unspecified");
|
|
98
|
+
expect(hook.result.current.value).toBe("dark");
|
|
99
|
+
act(() => flipOs("light"));
|
|
100
|
+
expect(hook.result.current.value).toBe("light");
|
|
101
|
+
expect(hook.result.current.setting).toBe("system");
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("shares selection, clears the native override for System and follows subsequent OS changes", async () => {
|
|
105
|
+
rn.os = "light";
|
|
106
|
+
rn.current = "light";
|
|
37
107
|
const first = renderHook(useSchemePreference);
|
|
38
108
|
const second = renderHook(useSchemePreference);
|
|
39
|
-
act(() => first.result.current.set("dark"));
|
|
109
|
+
await act(async () => first.result.current.set("dark"));
|
|
40
110
|
expect(second.result.current.value).toBe("dark");
|
|
41
|
-
expect(
|
|
42
|
-
act(() => first.result.current.set("system"));
|
|
43
|
-
expect(
|
|
111
|
+
expect(rn.override).toBe("dark");
|
|
112
|
+
await act(async () => first.result.current.set("system"));
|
|
113
|
+
expect(rn.override).toBe("unspecified");
|
|
44
114
|
expect(second.result.current.value).toBe("light");
|
|
45
|
-
act(() =>
|
|
46
|
-
os.value = "dark";
|
|
47
|
-
os.listeners.forEach((l) => l());
|
|
48
|
-
});
|
|
115
|
+
act(() => flipOs("dark"));
|
|
49
116
|
expect(second.result.current.value).toBe("dark");
|
|
50
117
|
expect(second.result.current.setting).toBe("system");
|
|
51
118
|
});
|
|
@@ -14,7 +14,7 @@ export const v3TokenRoles = {
|
|
|
14
14
|
backgroundChrome: "background",
|
|
15
15
|
backgroundStrong: "color3",
|
|
16
16
|
backgroundSunk: "color3",
|
|
17
|
-
backgroundScrim: "
|
|
17
|
+
backgroundScrim: "shadow4",
|
|
18
18
|
hairline: "borderColorHairline",
|
|
19
19
|
hairlineStrong: "borderColor",
|
|
20
20
|
colorSubtle: "textMuted",
|
package/types/menuRow.d.ts
CHANGED
|
@@ -59,6 +59,29 @@ export declare function menuRowChecked(scheme: ColorScheme): {
|
|
|
59
59
|
};
|
|
60
60
|
/** The check mark on a `menuRowChecked` row: the theme's accent (FZ-8557). */
|
|
61
61
|
export declare const menuRowCheckInk: "$accentColor";
|
|
62
|
+
/**
|
|
63
|
+
* The check mark's glyph on every menu and picker row (LC-262, FZ-8557): the
|
|
64
|
+
* 14px bold check Clay rated 4/4 in FZ-8355 r6. Forms and components each draw
|
|
65
|
+
* it through a thin `CheckGlyph` that reads this one recipe, in
|
|
66
|
+
* `useMenuRowCheckInk`'s paint.
|
|
67
|
+
*/
|
|
68
|
+
export declare const menuRowCheckGlyph: {
|
|
69
|
+
readonly size: 14;
|
|
70
|
+
readonly weight: "bold";
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The glyph a menu row's leading icon draws at (FZ-8557 r3, LC-262). A menu
|
|
74
|
+
* whose rows carry icons draws its check at this glyph too, so both share one
|
|
75
|
+
* stroke.
|
|
76
|
+
*/
|
|
77
|
+
export declare const menuRowIconGlyph: {
|
|
78
|
+
readonly size: 18;
|
|
79
|
+
readonly weight: "bold";
|
|
80
|
+
};
|
|
81
|
+
export type MenuRowGlyph = {
|
|
82
|
+
readonly size: number;
|
|
83
|
+
readonly weight: "bold";
|
|
84
|
+
};
|
|
62
85
|
type ThemeValues = Record<string, {
|
|
63
86
|
val?: unknown;
|
|
64
87
|
} | undefined>;
|
package/types/menuRow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menuRow.d.ts","sourceRoot":"","sources":["../src/menuRow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW;;;;;;;;EAOjD;AAED,8EAA8E;AAC9E,eAAO,MAAM,eAAe,EAAG,cAAuB,CAAC;AAEvD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AASjE;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKjE;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
1
|
+
{"version":3,"file":"menuRow.d.ts","sourceRoot":"","sources":["../src/menuRow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW;;;;;;;;EAOjD;AAED,8EAA8E;AAC9E,eAAO,MAAM,eAAe,EAAG,cAAuB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;CAAwC,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;CAAwC,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AASjE;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKjE;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { type DialogContentProps as TamaguiDialogContentProps, type SizeTokens, type TamaguiElement } from "tamagui";
|
|
3
|
+
/**
|
|
4
|
+
* The scrim under every modal surface: dialogs, alerts and sheets (FZ-8557).
|
|
5
|
+
* `$shadow4` is the SHC console's `backgroundScrim` weight (light 0.26, dark
|
|
6
|
+
* 0.58 there; 0.22 and 0.45 here), the dim an iOS sheet lays over its page.
|
|
7
|
+
* `$shadow6` read as a heavy grey wash in light.
|
|
8
|
+
*/
|
|
9
|
+
export declare const overlayScrim: "$shadow4";
|
|
10
|
+
/**
|
|
11
|
+
* A sheet's grabber (HIG, FZ-8557): a 36×5 capsule inside the sheet's top
|
|
12
|
+
* edge, 6pt down, drawn over the frame rather than floating on the scrim.
|
|
13
|
+
* Spread on `Sheet.Handle`; the frame keeps `sheetGrabberClearance` clear.
|
|
14
|
+
*/
|
|
15
|
+
export declare const sheetGrabber: {
|
|
16
|
+
readonly width: 36;
|
|
17
|
+
readonly height: 5;
|
|
18
|
+
readonly borderRadius: 100;
|
|
19
|
+
readonly backgroundColor: "$color8";
|
|
20
|
+
readonly opacity: 0.45;
|
|
21
|
+
readonly alignSelf: "center";
|
|
22
|
+
readonly marginHorizontal: 0;
|
|
23
|
+
readonly marginTop: 0;
|
|
24
|
+
readonly marginBottom: -11;
|
|
25
|
+
readonly zIndex: 10;
|
|
26
|
+
};
|
|
27
|
+
/** The top inset a sheet's content keeps clear of its grabber. */
|
|
28
|
+
export declare const sheetGrabberClearance = 16;
|
|
3
29
|
type OpenAutoFocus = (event: Event) => void;
|
|
4
30
|
/**
|
|
5
31
|
* The house open focus for a raw `Dialog.Content`, which `DialogContent` and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlaySurfaces.d.ts","sourceRoot":"","sources":["../../src/theme/overlaySurfaces.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAOL,KAAK,kBAAkB,IAAI,yBAAyB,EAEpD,KAAK,UAAU,EACf,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"overlaySurfaces.d.ts","sourceRoot":"","sources":["../../src/theme/overlaySurfaces.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAOL,KAAK,kBAAkB,IAAI,yBAAyB,EAEpD,KAAK,UAAU,EACf,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAG,UAAmB,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;CAWf,CAAC;AAEX,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,KAAK,CAAC;AA6DxC,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAmC5C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,eAAe,EAAE,EAAE;IAAE,eAAe,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAG9F;AAID,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,mDAE9B,CAAC;AAEH,wBAAgB,sBAAsB,IAAI,wBAAwB,CAEjE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAQD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC,GAAG;IACzE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,aAAa;eAJb,SAAS;WACb,UAAU;kDAcjB,CAAC;AA8DH;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;eAEiB,SAAS;kDAelD,CAAC;AAOH,eAAO,MAAM,kBAAkB;eA5GlB,SAAS;WACb,UAAU;kDAqHlB,CAAC;AAgCF,eAAO,MAAM,kBAAkB;;;;;;;;eAEY,SAAS;kDAelD,CAAC;AAiBH,eAAO,MAAM,cAAc;eALd,SAAS;IACpB,iEAAiE;sBAC/C,aAAa;kDA0BhC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSchemePreference.native.d.ts","sourceRoot":"","sources":["../../src/theme/useSchemePreference.native.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"useSchemePreference.native.d.ts","sourceRoot":"","sources":["../../src/theme/useSchemePreference.native.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC;AAgCD,wBAAgB,mBAAmB,IAAI,gBAAgB,CActD"}
|
|
@@ -14,7 +14,7 @@ export declare const v3TokenRoles: {
|
|
|
14
14
|
readonly backgroundChrome: "background";
|
|
15
15
|
readonly backgroundStrong: "color3";
|
|
16
16
|
readonly backgroundSunk: "color3";
|
|
17
|
-
readonly backgroundScrim: "
|
|
17
|
+
readonly backgroundScrim: "shadow4";
|
|
18
18
|
readonly hairline: "borderColorHairline";
|
|
19
19
|
readonly hairlineStrong: "borderColor";
|
|
20
20
|
readonly colorSubtle: "textMuted";
|