@tastic/hud 0.7.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -8
- package/dist/SkiaGate.d.mts +13 -0
- package/dist/SkiaGate.d.ts +13 -0
- package/dist/SkiaGate.js +45 -0
- package/dist/SkiaGate.mjs +6 -0
- package/dist/chunk-XEOFR236.mjs +21 -0
- package/dist/index.d.mts +20 -17
- package/dist/index.d.ts +20 -17
- package/dist/index.js +250 -214
- package/dist/index.mjs +166 -145
- package/package.json +13 -6
- package/src/BaseSettingsDialog.tsx +9 -6
- package/src/BaseStatsScreen.tsx +54 -93
- package/src/ConfirmDialog.tsx +29 -3
- package/src/InlineColorPicker.tsx +10 -4
- package/src/SectionedDropdown.tsx +17 -3
- package/src/SkiaGate.tsx +45 -0
- package/src/SkiaGate.web.tsx +9 -0
- package/src/TriggerGaugeHost.tsx +12 -20
- package/src/index.ts +8 -7
- package/src/useAutoAlign.ts +58 -16
package/README.md
CHANGED
|
@@ -5,10 +5,11 @@ dropdowns, color pickers, gauges, ready buttons, and dialogs. Every interactive
|
|
|
5
5
|
to one player's own zone on a shared screen, so it never blocks the rest of the screen the way a
|
|
6
6
|
full-screen modal would.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
Depends on [`@tastic/core`](https://github.com/jayrdeaton/react-native-game-core) for live device-
|
|
9
|
+
rotation tracking (see Rotation below) — every popover/dialog here reads it directly, so it stays
|
|
10
|
+
legible even rotated 180° inside a [`@tastic/split-screen`](https://github.com/jayrdeaton/react-native-split-screen)
|
|
11
|
+
zone (that package's own two-player layout engine is what actually owns the rotated zone; this kit
|
|
12
|
+
and split-screen don't depend on each other, they just both sit on `@tastic/core`).
|
|
12
13
|
|
|
13
14
|
## Why not a modal?
|
|
14
15
|
|
|
@@ -39,6 +40,34 @@ corner of the screen.
|
|
|
39
40
|
- **`ReadyButton`** — a per-player or standalone ready toggle.
|
|
40
41
|
- **`PressAwayOverlay`** — an invisible full-bleed tap-catcher for press-away-to-close. This is the
|
|
41
42
|
one piece that needs care in a split-screen layout — see below.
|
|
43
|
+
- **`BaseSettingsDialog`** / **`BaseStatsScreen`** / **`ConfirmDialog`** — shared shells for the
|
|
44
|
+
settings sheet, an achievements/stats screen, and a plain confirm-or-cancel dialog, each factored
|
|
45
|
+
out after being independently copied into several games. See Rotation below for how each of these
|
|
46
|
+
(plus `SectionedDropdown`/`InlineColorPicker`) handles rotating inside a `@tastic/split-screen`
|
|
47
|
+
zone.
|
|
48
|
+
|
|
49
|
+
## Rotation
|
|
50
|
+
|
|
51
|
+
`SectionedDropdown`, `InlineColorPicker`, `BaseSettingsDialog`, and `BaseStatsScreen` all read the
|
|
52
|
+
device's live rotation themselves, via [`@tastic/core`](https://github.com/jayrdeaton/react-native-game-core)'s
|
|
53
|
+
`useRotation()` — you don't need to pass anything for a popover/dialog to read correctly no matter
|
|
54
|
+
which way the phone is held, as long as your app mounts `@tastic/core`'s `OrientationProvider`
|
|
55
|
+
(or `@tastic/split-screen`'s `AccelerometerOrientationProvider`, a compat alias for the same thing)
|
|
56
|
+
somewhere above it.
|
|
57
|
+
|
|
58
|
+
Each of the four also still accepts an explicit `rotation` prop, which overrides the ambient read
|
|
59
|
+
when present — reach for it only when a specific instance genuinely needs to differ from the live
|
|
60
|
+
app-wide rotation (e.g. a fading, lagged `panelLayout` value mid-transition, rather than the raw
|
|
61
|
+
live reading — see `@tastic/split-screen`'s own `DualZoneLayout` docs for why that lag exists).
|
|
62
|
+
|
|
63
|
+
This matters more than it might look: `useAutoAlign` (what `SectionedDropdown`/`InlineColorPicker`
|
|
64
|
+
use to pick left/right/above/below) measures a trigger via `measureInWindow`, which reports the
|
|
65
|
+
trigger's **pre-transform** layout position — confirmed against a real rotated screen, not just
|
|
66
|
+
reasoned about. Inside a `FakeLandscapeView`-rotated zone (or any other ancestor rotated the same
|
|
67
|
+
way — a bare CSS `transform: rotate()`, not a real OS-level orientation change), that pre-transform
|
|
68
|
+
position can be nowhere near where the trigger actually is on screen, which is exactly the bug this
|
|
69
|
+
rotation-awareness fixes: without it, a popover can pick an alignment for where its trigger *used to
|
|
70
|
+
be* before rotating, clipping off the edge it's actually now near instead of the one it was near.
|
|
42
71
|
|
|
43
72
|
## The press-away pattern (read this before wiring it up)
|
|
44
73
|
|
|
@@ -89,9 +118,19 @@ your shared/global settings) gets the whole-screen overlay; every other player's
|
|
|
89
118
|
must stay mounted (shielding, if not actually closing anything) whenever *any* host with broader
|
|
90
119
|
reach is open — not just their own.
|
|
91
120
|
|
|
92
|
-
## Install
|
|
121
|
+
## Install
|
|
93
122
|
|
|
94
|
-
|
|
123
|
+
Published to the public npm registry as `@tastic/hud`. The self-reading rotation behavior described
|
|
124
|
+
above is newer than the latest published version, though — for now it only exists in local,
|
|
125
|
+
`yalc`-linked builds (see below) until it's published for real; the published version's `rotation`
|
|
126
|
+
prop on these four components defaults to a plain `0` rather than reading `@tastic/core`'s
|
|
127
|
+
`useRotation()`.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm install @tastic/hud
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Local dev via yalc (for unpublished changes)
|
|
95
134
|
|
|
96
135
|
```bash
|
|
97
136
|
cd react-native-hud
|
|
@@ -110,5 +149,6 @@ linked consumer at once.
|
|
|
110
149
|
|
|
111
150
|
`react`, `react-native`, `react-native-paper` (`Icon`, `IconButton`, `Text`), `@rific/auto-paper`
|
|
112
151
|
(`defaultColors`, `getContrastColor`, `getBlendedColor`, `SeedColor`), `@rific/feedback-press`
|
|
113
|
-
(`IconButton`, `TouchableRipple`)
|
|
114
|
-
|
|
152
|
+
(`IconButton`, `TouchableRipple`), [`@tastic/core`](https://github.com/jayrdeaton/react-native-game-core)
|
|
153
|
+
(>=0.1.0 — `useRotation()`, see Rotation above) — none of these are bundled, so use whatever
|
|
154
|
+
versions your app already has.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ComponentType, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SkiaGateProps<P extends object> {
|
|
5
|
+
getComponent: () => Promise<{
|
|
6
|
+
default: ComponentType<P>;
|
|
7
|
+
}>;
|
|
8
|
+
componentProps: P;
|
|
9
|
+
fallback?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
declare function SkiaGate<P extends object>({ getComponent, componentProps, fallback }: SkiaGateProps<P>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element | null;
|
|
12
|
+
|
|
13
|
+
export { SkiaGate, type SkiaGateProps };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ComponentType, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SkiaGateProps<P extends object> {
|
|
5
|
+
getComponent: () => Promise<{
|
|
6
|
+
default: ComponentType<P>;
|
|
7
|
+
}>;
|
|
8
|
+
componentProps: P;
|
|
9
|
+
fallback?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
declare function SkiaGate<P extends object>({ getComponent, componentProps, fallback }: SkiaGateProps<P>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element | null;
|
|
12
|
+
|
|
13
|
+
export { SkiaGate, type SkiaGateProps };
|
package/dist/SkiaGate.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/SkiaGate.tsx
|
|
21
|
+
var SkiaGate_exports = {};
|
|
22
|
+
__export(SkiaGate_exports, {
|
|
23
|
+
SkiaGate: () => SkiaGate
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(SkiaGate_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
|
+
function SkiaGate({ getComponent, componentProps, fallback = null }) {
|
|
29
|
+
const [Component, setComponent] = (0, import_react.useState)(null);
|
|
30
|
+
(0, import_react.useEffect)(() => {
|
|
31
|
+
let cancelled = false;
|
|
32
|
+
getComponent().then((mod) => {
|
|
33
|
+
if (!cancelled) setComponent(() => mod.default);
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
cancelled = true;
|
|
37
|
+
};
|
|
38
|
+
}, [getComponent]);
|
|
39
|
+
if (!Component) return fallback;
|
|
40
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...componentProps });
|
|
41
|
+
}
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
SkiaGate
|
|
45
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/SkiaGate.tsx
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
function SkiaGate({ getComponent, componentProps, fallback = null }) {
|
|
5
|
+
const [Component, setComponent] = useState(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
let cancelled = false;
|
|
8
|
+
getComponent().then((mod) => {
|
|
9
|
+
if (!cancelled) setComponent(() => mod.default);
|
|
10
|
+
});
|
|
11
|
+
return () => {
|
|
12
|
+
cancelled = true;
|
|
13
|
+
};
|
|
14
|
+
}, [getComponent]);
|
|
15
|
+
if (!Component) return fallback;
|
|
16
|
+
return /* @__PURE__ */ jsx(Component, { ...componentProps });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
SkiaGate
|
|
21
|
+
};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, RefObject } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle, View } from 'react-native';
|
|
4
|
+
import { ViewRotation } from '@tastic/core';
|
|
4
5
|
import { SeedColor } from '@rific/auto-paper';
|
|
6
|
+
export { SkiaGate, SkiaGateProps } from './SkiaGate.mjs';
|
|
5
7
|
|
|
6
8
|
declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
|
|
7
9
|
interface Props$c {
|
|
@@ -35,7 +37,7 @@ interface BaseSettingsDialogProps {
|
|
|
35
37
|
onUpdateError?: (message: string) => void;
|
|
36
38
|
children?: ReactNode;
|
|
37
39
|
}
|
|
38
|
-
declare function BaseSettingsDialog({ visible, onDismiss, rotation, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, children }: BaseSettingsDialogProps): react.JSX.Element;
|
|
40
|
+
declare function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, children }: BaseSettingsDialogProps): react.JSX.Element;
|
|
39
41
|
|
|
40
42
|
type MD3TextVariant = 'displayLarge' | 'displayMedium' | 'displaySmall' | 'headlineLarge' | 'headlineMedium' | 'headlineSmall' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'labelLarge' | 'labelMedium' | 'labelSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall';
|
|
41
43
|
interface Props$b {
|
|
@@ -55,11 +57,9 @@ interface Props$b {
|
|
|
55
57
|
resetConfirmBody?: string;
|
|
56
58
|
fg?: string;
|
|
57
59
|
bg?: string;
|
|
58
|
-
cardBg?: string;
|
|
59
|
-
accentColor?: string;
|
|
60
60
|
children: ReactNode;
|
|
61
61
|
}
|
|
62
|
-
declare function BaseStatsScreen({ rotation, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride,
|
|
62
|
+
declare function BaseStatsScreen({ rotation: rotationOverride, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride, children }: Props$b): react.JSX.Element;
|
|
63
63
|
|
|
64
64
|
interface ConfirmDialogProps {
|
|
65
65
|
visible: boolean;
|
|
@@ -84,6 +84,17 @@ interface Props$a {
|
|
|
84
84
|
}
|
|
85
85
|
declare function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }: Props$a): react.JSX.Element;
|
|
86
86
|
|
|
87
|
+
type PopoverAlign = 'left' | 'right' | 'center';
|
|
88
|
+
type PopoverVerticalAlign = 'below' | 'above';
|
|
89
|
+
type PopoverRotation = ViewRotation;
|
|
90
|
+
declare function useAutoAlign(open: boolean, contentWidth: number, contentHeight: number, rotation?: PopoverRotation): {
|
|
91
|
+
align: PopoverAlign;
|
|
92
|
+
maxHeight: number;
|
|
93
|
+
measured: boolean;
|
|
94
|
+
triggerRef: react.RefObject<View | null>;
|
|
95
|
+
verticalAlign: PopoverVerticalAlign;
|
|
96
|
+
};
|
|
97
|
+
|
|
87
98
|
interface PopoverHost {
|
|
88
99
|
openId: string | null;
|
|
89
100
|
toggle: (id: string) => void;
|
|
@@ -126,6 +137,7 @@ interface Props$9 {
|
|
|
126
137
|
onAccentColor?: string;
|
|
127
138
|
dark: boolean;
|
|
128
139
|
align?: 'left' | 'right' | 'center';
|
|
140
|
+
rotation?: PopoverRotation;
|
|
129
141
|
autoDismiss?: boolean;
|
|
130
142
|
labelFontFamily?: string;
|
|
131
143
|
allClearLabels?: {
|
|
@@ -133,7 +145,7 @@ interface Props$9 {
|
|
|
133
145
|
clear: string;
|
|
134
146
|
};
|
|
135
147
|
}
|
|
136
|
-
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: alignOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$9): react.JSX.Element;
|
|
148
|
+
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: alignOverride, rotation: rotationOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$9): react.JSX.Element;
|
|
137
149
|
|
|
138
150
|
interface ControlSchemePickerProps<T extends string | number> {
|
|
139
151
|
id: string;
|
|
@@ -190,6 +202,7 @@ interface Props$7 {
|
|
|
190
202
|
allowSwapTaken?: boolean;
|
|
191
203
|
dark: boolean;
|
|
192
204
|
align?: 'left' | 'right' | 'center';
|
|
205
|
+
rotation?: PopoverRotation;
|
|
193
206
|
icon?: string;
|
|
194
207
|
tag?: string;
|
|
195
208
|
labelFontFamily?: string;
|
|
@@ -197,17 +210,7 @@ interface Props$7 {
|
|
|
197
210
|
columns?: number;
|
|
198
211
|
size?: number;
|
|
199
212
|
}
|
|
200
|
-
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: alignOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$7): react.JSX.Element;
|
|
201
|
-
|
|
202
|
-
type PopoverAlign = 'left' | 'right' | 'center';
|
|
203
|
-
type PopoverVerticalAlign = 'below' | 'above';
|
|
204
|
-
declare function useAutoAlign(open: boolean, contentWidth: number, contentHeight: number): {
|
|
205
|
-
align: PopoverAlign;
|
|
206
|
-
maxHeight: number;
|
|
207
|
-
measured: boolean;
|
|
208
|
-
triggerRef: react.RefObject<View | null>;
|
|
209
|
-
verticalAlign: PopoverVerticalAlign;
|
|
210
|
-
};
|
|
213
|
+
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: alignOverride, rotation: rotationOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$7): react.JSX.Element;
|
|
211
214
|
|
|
212
215
|
declare const LABELED_DROPDOWN_POPOVER_WIDTH = 180;
|
|
213
216
|
declare function getLabeledDropdownContentHeight(optionCount: number): number;
|
|
@@ -306,4 +309,4 @@ interface TriggerGaugeProps {
|
|
|
306
309
|
|
|
307
310
|
declare function TriggerGaugeHost(props: TriggerGaugeProps): react.JSX.Element;
|
|
308
311
|
|
|
309
|
-
export { AchievementRow, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, ControlSchemePicker, type ControlSchemePickerProps, CornerActionButtons, type CornerStatusBadgeSeat, CornerStatusBadges, type CornerStatusBadgesProps, InlineColorPicker, LABELED_DROPDOWN_POPOVER_WIDTH, LOCKED_BADGE_COLOR, LabeledDropdown, type LabeledDropdownOption, MONO_FONT, type MenuOption, type MenuSection, type MultiSelectSection, type OrientationMode, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverVerticalAlign, PressAwayOverlay, ReadyButton, SectionedDropdown, SharedActionBand, type SingleSelectSection, StatRow, StatSection, TriggerGaugeHost, type TriggerGaugeProps, getLabeledDropdownContentHeight, loadSkiaWeb, useAutoAlign, usePopoverHost };
|
|
312
|
+
export { AchievementRow, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, ControlSchemePicker, type ControlSchemePickerProps, CornerActionButtons, type CornerStatusBadgeSeat, CornerStatusBadges, type CornerStatusBadgesProps, InlineColorPicker, LABELED_DROPDOWN_POPOVER_WIDTH, LOCKED_BADGE_COLOR, LabeledDropdown, type LabeledDropdownOption, MONO_FONT, type MenuOption, type MenuSection, type MultiSelectSection, type OrientationMode, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverRotation, type PopoverVerticalAlign, PressAwayOverlay, ReadyButton, SectionedDropdown, SharedActionBand, type SingleSelectSection, StatRow, StatSection, TriggerGaugeHost, type TriggerGaugeProps, getLabeledDropdownContentHeight, loadSkiaWeb, useAutoAlign, usePopoverHost };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, RefObject } from 'react';
|
|
3
3
|
import { StyleProp, ViewStyle, View } from 'react-native';
|
|
4
|
+
import { ViewRotation } from '@tastic/core';
|
|
4
5
|
import { SeedColor } from '@rific/auto-paper';
|
|
6
|
+
export { SkiaGate, SkiaGateProps } from './SkiaGate.js';
|
|
5
7
|
|
|
6
8
|
declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
|
|
7
9
|
interface Props$c {
|
|
@@ -35,7 +37,7 @@ interface BaseSettingsDialogProps {
|
|
|
35
37
|
onUpdateError?: (message: string) => void;
|
|
36
38
|
children?: ReactNode;
|
|
37
39
|
}
|
|
38
|
-
declare function BaseSettingsDialog({ visible, onDismiss, rotation, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, children }: BaseSettingsDialogProps): react.JSX.Element;
|
|
40
|
+
declare function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, children }: BaseSettingsDialogProps): react.JSX.Element;
|
|
39
41
|
|
|
40
42
|
type MD3TextVariant = 'displayLarge' | 'displayMedium' | 'displaySmall' | 'headlineLarge' | 'headlineMedium' | 'headlineSmall' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'labelLarge' | 'labelMedium' | 'labelSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall';
|
|
41
43
|
interface Props$b {
|
|
@@ -55,11 +57,9 @@ interface Props$b {
|
|
|
55
57
|
resetConfirmBody?: string;
|
|
56
58
|
fg?: string;
|
|
57
59
|
bg?: string;
|
|
58
|
-
cardBg?: string;
|
|
59
|
-
accentColor?: string;
|
|
60
60
|
children: ReactNode;
|
|
61
61
|
}
|
|
62
|
-
declare function BaseStatsScreen({ rotation, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride,
|
|
62
|
+
declare function BaseStatsScreen({ rotation: rotationOverride, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride, children }: Props$b): react.JSX.Element;
|
|
63
63
|
|
|
64
64
|
interface ConfirmDialogProps {
|
|
65
65
|
visible: boolean;
|
|
@@ -84,6 +84,17 @@ interface Props$a {
|
|
|
84
84
|
}
|
|
85
85
|
declare function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }: Props$a): react.JSX.Element;
|
|
86
86
|
|
|
87
|
+
type PopoverAlign = 'left' | 'right' | 'center';
|
|
88
|
+
type PopoverVerticalAlign = 'below' | 'above';
|
|
89
|
+
type PopoverRotation = ViewRotation;
|
|
90
|
+
declare function useAutoAlign(open: boolean, contentWidth: number, contentHeight: number, rotation?: PopoverRotation): {
|
|
91
|
+
align: PopoverAlign;
|
|
92
|
+
maxHeight: number;
|
|
93
|
+
measured: boolean;
|
|
94
|
+
triggerRef: react.RefObject<View | null>;
|
|
95
|
+
verticalAlign: PopoverVerticalAlign;
|
|
96
|
+
};
|
|
97
|
+
|
|
87
98
|
interface PopoverHost {
|
|
88
99
|
openId: string | null;
|
|
89
100
|
toggle: (id: string) => void;
|
|
@@ -126,6 +137,7 @@ interface Props$9 {
|
|
|
126
137
|
onAccentColor?: string;
|
|
127
138
|
dark: boolean;
|
|
128
139
|
align?: 'left' | 'right' | 'center';
|
|
140
|
+
rotation?: PopoverRotation;
|
|
129
141
|
autoDismiss?: boolean;
|
|
130
142
|
labelFontFamily?: string;
|
|
131
143
|
allClearLabels?: {
|
|
@@ -133,7 +145,7 @@ interface Props$9 {
|
|
|
133
145
|
clear: string;
|
|
134
146
|
};
|
|
135
147
|
}
|
|
136
|
-
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: alignOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$9): react.JSX.Element;
|
|
148
|
+
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: alignOverride, rotation: rotationOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$9): react.JSX.Element;
|
|
137
149
|
|
|
138
150
|
interface ControlSchemePickerProps<T extends string | number> {
|
|
139
151
|
id: string;
|
|
@@ -190,6 +202,7 @@ interface Props$7 {
|
|
|
190
202
|
allowSwapTaken?: boolean;
|
|
191
203
|
dark: boolean;
|
|
192
204
|
align?: 'left' | 'right' | 'center';
|
|
205
|
+
rotation?: PopoverRotation;
|
|
193
206
|
icon?: string;
|
|
194
207
|
tag?: string;
|
|
195
208
|
labelFontFamily?: string;
|
|
@@ -197,17 +210,7 @@ interface Props$7 {
|
|
|
197
210
|
columns?: number;
|
|
198
211
|
size?: number;
|
|
199
212
|
}
|
|
200
|
-
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: alignOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$7): react.JSX.Element;
|
|
201
|
-
|
|
202
|
-
type PopoverAlign = 'left' | 'right' | 'center';
|
|
203
|
-
type PopoverVerticalAlign = 'below' | 'above';
|
|
204
|
-
declare function useAutoAlign(open: boolean, contentWidth: number, contentHeight: number): {
|
|
205
|
-
align: PopoverAlign;
|
|
206
|
-
maxHeight: number;
|
|
207
|
-
measured: boolean;
|
|
208
|
-
triggerRef: react.RefObject<View | null>;
|
|
209
|
-
verticalAlign: PopoverVerticalAlign;
|
|
210
|
-
};
|
|
213
|
+
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: alignOverride, rotation: rotationOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$7): react.JSX.Element;
|
|
211
214
|
|
|
212
215
|
declare const LABELED_DROPDOWN_POPOVER_WIDTH = 180;
|
|
213
216
|
declare function getLabeledDropdownContentHeight(optionCount: number): number;
|
|
@@ -306,4 +309,4 @@ interface TriggerGaugeProps {
|
|
|
306
309
|
|
|
307
310
|
declare function TriggerGaugeHost(props: TriggerGaugeProps): react.JSX.Element;
|
|
308
311
|
|
|
309
|
-
export { AchievementRow, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, ControlSchemePicker, type ControlSchemePickerProps, CornerActionButtons, type CornerStatusBadgeSeat, CornerStatusBadges, type CornerStatusBadgesProps, InlineColorPicker, LABELED_DROPDOWN_POPOVER_WIDTH, LOCKED_BADGE_COLOR, LabeledDropdown, type LabeledDropdownOption, MONO_FONT, type MenuOption, type MenuSection, type MultiSelectSection, type OrientationMode, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverVerticalAlign, PressAwayOverlay, ReadyButton, SectionedDropdown, SharedActionBand, type SingleSelectSection, StatRow, StatSection, TriggerGaugeHost, type TriggerGaugeProps, getLabeledDropdownContentHeight, loadSkiaWeb, useAutoAlign, usePopoverHost };
|
|
312
|
+
export { AchievementRow, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, ControlSchemePicker, type ControlSchemePickerProps, CornerActionButtons, type CornerStatusBadgeSeat, CornerStatusBadges, type CornerStatusBadgesProps, InlineColorPicker, LABELED_DROPDOWN_POPOVER_WIDTH, LOCKED_BADGE_COLOR, LabeledDropdown, type LabeledDropdownOption, MONO_FONT, type MenuOption, type MenuSection, type MultiSelectSection, type OrientationMode, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverRotation, type PopoverVerticalAlign, PressAwayOverlay, ReadyButton, SectionedDropdown, SharedActionBand, type SingleSelectSection, StatRow, StatSection, TriggerGaugeHost, type TriggerGaugeProps, getLabeledDropdownContentHeight, loadSkiaWeb, useAutoAlign, usePopoverHost };
|