@tastic/hud 0.14.2 → 0.15.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/README.md +110 -79
- package/dist/chrome/index.d.mts +239 -0
- package/dist/chrome/index.d.ts +239 -0
- package/dist/chrome/index.js +772 -0
- package/dist/chrome/index.mjs +44 -0
- package/dist/chunk-OTMMST5M.mjs +645 -0
- package/dist/guide/index.js +3 -3
- package/dist/guide/index.mjs +3 -3
- package/dist/index.d.mts +21 -252
- package/dist/index.d.ts +21 -252
- package/dist/index.js +20 -20
- package/dist/index.mjs +186 -791
- package/package.json +8 -1
- package/src/AchievementCatalogSection.tsx +1 -1
- package/src/AchievementRow.tsx +9 -9
- package/src/BaseSettingsDialog.tsx +31 -31
- package/src/BaseStatsScreen.tsx +13 -13
- package/src/ConfirmDialog.tsx +2 -2
- package/src/ControlSchemePicker.tsx +9 -9
- package/src/CornerActionButtons.tsx +6 -6
- package/src/CornerStatusBadges.tsx +8 -8
- package/src/InlineColorPicker.tsx +30 -30
- package/src/LabeledDropdown.tsx +8 -8
- package/src/PlayerSetupPanel.tsx +25 -25
- package/src/PopoverBody.tsx +16 -16
- package/src/PressAwayOverlay.tsx +2 -2
- package/src/ReadyButton.tsx +3 -3
- package/src/SectionedDropdown.tsx +31 -31
- package/src/SharedActionBand.tsx +6 -6
- package/src/SkiaGate.tsx +5 -5
- package/src/SkiaGate.web.tsx +2 -2
- package/src/StaggeredWord.tsx +9 -9
- package/src/StatRow.tsx +3 -3
- package/src/StatSection.tsx +3 -3
- package/src/TriggerGauge.tsx +54 -54
- package/src/TriggerGaugeHost.tsx +2 -2
- package/src/chrome/index.ts +22 -0
- package/src/fonts.ts +1 -1
- package/src/guide/DirectionKeysHint.tsx +3 -3
- package/src/guide/GuideProvider.tsx +7 -7
- package/src/guide/HowToPlayDialog.tsx +7 -7
- package/src/guide/SeatDiagram.tsx +3 -3
- package/src/guide/SwipeHint.tsx +4 -4
- package/src/guide/guideSlice.ts +7 -7
- package/src/guide/index.ts +4 -3
- package/src/guide/types.ts +1 -1
- package/src/index.ts +1 -1
- package/src/loadSkiaWeb.ts +2 -2
- package/src/loadSkiaWeb.web.ts +2 -2
- package/src/overlayCard.ts +3 -3
- package/src/useAutoAlign.ts +23 -23
- package/src/usePopoverHost.ts +1 -1
- package/src/useZoneClampedAlign.ts +23 -23
package/dist/index.d.ts
CHANGED
|
@@ -1,36 +1,13 @@
|
|
|
1
|
+
export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, ConfirmDialogProps, ContentGutter, CornerActionButtons, LOCKED_BADGE_COLOR, MONO_FONT, OverlayCardColors, RotatedFrame, RotatedFrameProps, StaggeredWord, StaggeredWordProps, StatRow, StatSection, UpdateDialog, UpdateDialogProps, getOverlayCardColors, getStaggeredWordDuration, overlayActionStyles, overlayStyles } from './chrome/index.js';
|
|
1
2
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { RefObject, ReactNode } from 'react';
|
|
4
|
+
import { AchievementTier } from '@tastic/achievements';
|
|
4
5
|
import { Profile } from '@tastic/profile';
|
|
5
|
-
import { ViewStyle,
|
|
6
|
+
import { ViewStyle, View, StyleProp } from 'react-native';
|
|
6
7
|
import { ViewRotation } from '@tastic/core';
|
|
7
8
|
import { SeedColor } from '@rific/auto-paper';
|
|
8
9
|
export { SkiaGate, SkiaGateProps } from './SkiaGate.js';
|
|
9
10
|
|
|
10
|
-
interface Props$f {
|
|
11
|
-
rows: AchievementCatalogRow[];
|
|
12
|
-
label?: string;
|
|
13
|
-
fg?: string;
|
|
14
|
-
fgMuted?: string;
|
|
15
|
-
}
|
|
16
|
-
declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride }: Props$f): react.JSX.Element;
|
|
17
|
-
|
|
18
|
-
declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
|
|
19
|
-
interface Props$e {
|
|
20
|
-
icon: string;
|
|
21
|
-
title: string;
|
|
22
|
-
description: string;
|
|
23
|
-
badgeColor: string;
|
|
24
|
-
unlockedLabel?: string;
|
|
25
|
-
checkColor?: string;
|
|
26
|
-
progress?: number;
|
|
27
|
-
deviceMarker?: boolean;
|
|
28
|
-
fg?: string;
|
|
29
|
-
fgMuted?: string;
|
|
30
|
-
sectionBg?: string;
|
|
31
|
-
}
|
|
32
|
-
declare function AchievementRow({ icon, title, description, badgeColor, unlockedLabel, checkColor, progress, deviceMarker, fg: fgOverride, fgMuted: fgMutedOverride, sectionBg: sectionBgOverride }: Props$e): react.JSX.Element;
|
|
33
|
-
|
|
34
11
|
interface UnlockedAchievement {
|
|
35
12
|
id: string;
|
|
36
13
|
icon: string;
|
|
@@ -41,7 +18,7 @@ interface AchievementUnlockOwner {
|
|
|
41
18
|
profile?: Profile | null;
|
|
42
19
|
color: string;
|
|
43
20
|
}
|
|
44
|
-
interface Props$
|
|
21
|
+
interface Props$7<Seat extends number> {
|
|
45
22
|
unlocks: Partial<Record<Seat, UnlockedAchievement[]>>;
|
|
46
23
|
seats: readonly Seat[];
|
|
47
24
|
owners: Record<Seat, AchievementUnlockOwner>;
|
|
@@ -49,81 +26,7 @@ interface Props$d<Seat extends number> {
|
|
|
49
26
|
fg?: string;
|
|
50
27
|
style?: ViewStyle;
|
|
51
28
|
}
|
|
52
|
-
declare function AchievementUnlockList<Seat extends number>({ unlocks, seats, owners, tierColors, fg: fgOverride, style }: Props$
|
|
53
|
-
|
|
54
|
-
interface ActivityStats {
|
|
55
|
-
distinctDaysPlayed: number;
|
|
56
|
-
currentDayStreak: number;
|
|
57
|
-
bestDayStreak: number;
|
|
58
|
-
}
|
|
59
|
-
interface Props$c {
|
|
60
|
-
stats: ActivityStats;
|
|
61
|
-
}
|
|
62
|
-
declare function ActivityStatSection({ stats }: Props$c): react.JSX.Element;
|
|
63
|
-
|
|
64
|
-
interface BaseSettingsDialogProps {
|
|
65
|
-
visible: boolean;
|
|
66
|
-
onDismiss: () => void;
|
|
67
|
-
rotation?: ViewRotation;
|
|
68
|
-
version: string | number;
|
|
69
|
-
lockOrientation?: boolean;
|
|
70
|
-
onLockOrientationChange?: (value: boolean) => void;
|
|
71
|
-
deferBottomEdgeGestures?: boolean;
|
|
72
|
-
onDeferBottomEdgeGestures?: (value: boolean) => void;
|
|
73
|
-
hideSound?: boolean;
|
|
74
|
-
hideHaptics?: boolean;
|
|
75
|
-
hideAppearance?: boolean;
|
|
76
|
-
hideUpdateCheck?: boolean;
|
|
77
|
-
onUpdateError?: (message: string) => void;
|
|
78
|
-
onShowHowToPlay?: () => void;
|
|
79
|
-
children?: ReactNode;
|
|
80
|
-
}
|
|
81
|
-
declare function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, onShowHowToPlay, children }: BaseSettingsDialogProps): react.JSX.Element | null;
|
|
82
|
-
|
|
83
|
-
type MD3TextVariant = 'displayLarge' | 'displayMedium' | 'displaySmall' | 'headlineLarge' | 'headlineMedium' | 'headlineSmall' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'labelLarge' | 'labelMedium' | 'labelSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall';
|
|
84
|
-
interface Props$b {
|
|
85
|
-
rotation?: ViewRotation;
|
|
86
|
-
title?: string;
|
|
87
|
-
titleVariant?: MD3TextVariant;
|
|
88
|
-
onBack: () => void;
|
|
89
|
-
insets: {
|
|
90
|
-
top: number;
|
|
91
|
-
left: number;
|
|
92
|
-
bottom: number;
|
|
93
|
-
right: number;
|
|
94
|
-
};
|
|
95
|
-
onReset?: () => void;
|
|
96
|
-
resetLabel?: string;
|
|
97
|
-
resetConfirmTitle?: string;
|
|
98
|
-
resetConfirmBody?: string;
|
|
99
|
-
fg?: string;
|
|
100
|
-
bg?: string;
|
|
101
|
-
children: ReactNode;
|
|
102
|
-
}
|
|
103
|
-
declare function BaseStatsScreen({ rotation: rotationOverride, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride, children }: Props$b): react.JSX.Element;
|
|
104
|
-
|
|
105
|
-
interface ConfirmDialogProps {
|
|
106
|
-
visible: boolean;
|
|
107
|
-
title: string;
|
|
108
|
-
message: ReactNode;
|
|
109
|
-
confirmLabel: string;
|
|
110
|
-
cancelLabel?: string;
|
|
111
|
-
onConfirm: () => void;
|
|
112
|
-
onCancel?: () => void;
|
|
113
|
-
rotation?: ViewRotation;
|
|
114
|
-
icon?: string;
|
|
115
|
-
destructive?: boolean;
|
|
116
|
-
}
|
|
117
|
-
declare function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation, icon, destructive }: ConfirmDialogProps): react.JSX.Element | null;
|
|
118
|
-
|
|
119
|
-
interface Props$a {
|
|
120
|
-
maxContentWidth?: number;
|
|
121
|
-
leftGutter?: ReactNode;
|
|
122
|
-
rightGutter?: ReactNode;
|
|
123
|
-
style?: StyleProp<ViewStyle>;
|
|
124
|
-
children: ReactNode;
|
|
125
|
-
}
|
|
126
|
-
declare function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }: Props$a): react.JSX.Element;
|
|
29
|
+
declare function AchievementUnlockList<Seat extends number>({ unlocks, seats, owners, tierColors, fg: fgOverride, style }: Props$7<Seat>): react.JSX.Element | null;
|
|
127
30
|
|
|
128
31
|
type PopoverAlign = 'left' | 'right' | 'center';
|
|
129
32
|
type PopoverVerticalAlign = 'below' | 'above';
|
|
@@ -174,7 +77,7 @@ interface MultiSelectSection<T extends string | number> {
|
|
|
174
77
|
allClear?: boolean;
|
|
175
78
|
}
|
|
176
79
|
type MenuSection = SingleSelectSection<any> | MultiSelectSection<any>;
|
|
177
|
-
interface Props$
|
|
80
|
+
interface Props$6 {
|
|
178
81
|
id: string;
|
|
179
82
|
host: PopoverHost;
|
|
180
83
|
icon: string;
|
|
@@ -194,7 +97,7 @@ interface Props$9 {
|
|
|
194
97
|
clear: string;
|
|
195
98
|
};
|
|
196
99
|
}
|
|
197
|
-
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$
|
|
100
|
+
declare function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, autoDismiss, labelFontFamily, allClearLabels }: Props$6): react.JSX.Element;
|
|
198
101
|
|
|
199
102
|
interface ControlSchemePickerProps<T extends string | number> {
|
|
200
103
|
id: string;
|
|
@@ -214,20 +117,6 @@ interface ControlSchemePickerProps<T extends string | number> {
|
|
|
214
117
|
}
|
|
215
118
|
declare function ControlSchemePicker<T extends string | number>({ id, host, value, onChange, options, takenValue, accentColor, mutedColor, onAccentColor, dark, align, alignOverride, rotation, labelFontFamily }: ControlSchemePickerProps<T>): react.JSX.Element | null;
|
|
216
119
|
|
|
217
|
-
interface Props$8 {
|
|
218
|
-
onBack: () => void;
|
|
219
|
-
onSettings: () => void;
|
|
220
|
-
fg: string;
|
|
221
|
-
insets: {
|
|
222
|
-
top: number;
|
|
223
|
-
left: number;
|
|
224
|
-
right: number;
|
|
225
|
-
};
|
|
226
|
-
backIcon?: string;
|
|
227
|
-
backLabel?: string;
|
|
228
|
-
}
|
|
229
|
-
declare function CornerActionButtons({ onBack, onSettings, fg, insets, backIcon, backLabel }: Props$8): react.JSX.Element;
|
|
230
|
-
|
|
231
120
|
type OrientationMode = 'faceToFace' | 'sideBySide';
|
|
232
121
|
interface CornerStatusBadgeSeat {
|
|
233
122
|
icon?: string;
|
|
@@ -240,13 +129,11 @@ interface CornerStatusBadgesProps {
|
|
|
240
129
|
}
|
|
241
130
|
declare function CornerStatusBadges({ orientationMode, p1OnRight, p1, p2 }: CornerStatusBadgesProps): react.JSX.Element;
|
|
242
131
|
|
|
243
|
-
declare const MONO_FONT: string;
|
|
244
|
-
|
|
245
132
|
declare function getInlineColorPickerContentSize(swatchCount: number, windowWidth: number, columns?: number): {
|
|
246
133
|
width: number;
|
|
247
134
|
height: number;
|
|
248
135
|
};
|
|
249
|
-
interface Props$
|
|
136
|
+
interface Props$5 {
|
|
250
137
|
id: string;
|
|
251
138
|
host: PopoverHost;
|
|
252
139
|
value: string;
|
|
@@ -266,7 +153,7 @@ interface Props$7 {
|
|
|
266
153
|
columns?: number;
|
|
267
154
|
size?: number;
|
|
268
155
|
}
|
|
269
|
-
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$
|
|
156
|
+
declare function InlineColorPicker({ id, host, value, onChange, previewValue, swatches, takenValue, allowSwapTaken, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, icon, tag, labelFontFamily, autoDismiss, columns, size }: Props$5): react.JSX.Element;
|
|
270
157
|
|
|
271
158
|
declare const LABELED_DROPDOWN_POPOVER_WIDTH = 180;
|
|
272
159
|
declare function getLabeledDropdownContentHeight(optionCount: number): number;
|
|
@@ -275,7 +162,7 @@ interface LabeledDropdownOption<T extends string> {
|
|
|
275
162
|
label: string;
|
|
276
163
|
icon?: string;
|
|
277
164
|
}
|
|
278
|
-
interface Props$
|
|
165
|
+
interface Props$4<T extends string> {
|
|
279
166
|
id: string;
|
|
280
167
|
host: PopoverHost;
|
|
281
168
|
options: LabeledDropdownOption<T>[];
|
|
@@ -286,54 +173,10 @@ interface Props$6<T extends string> {
|
|
|
286
173
|
align?: 'left' | 'right' | 'center';
|
|
287
174
|
alignOverride?: AlignResult;
|
|
288
175
|
}
|
|
289
|
-
declare function LabeledDropdown<T extends string>({ id, host, options, value, onChange, color, dark, align: forcedAlign, alignOverride }: Props$
|
|
176
|
+
declare function LabeledDropdown<T extends string>({ id, host, options, value, onChange, color, dark, align: forcedAlign, alignOverride }: Props$4<T>): react.JSX.Element;
|
|
290
177
|
|
|
291
178
|
declare function loadSkiaWeb(): Promise<void>;
|
|
292
179
|
|
|
293
|
-
interface OverlayCardColors {
|
|
294
|
-
fg: string;
|
|
295
|
-
fgMuted: string;
|
|
296
|
-
cardBg: string;
|
|
297
|
-
cardBorder: string;
|
|
298
|
-
}
|
|
299
|
-
declare function getOverlayCardColors(dark: boolean): OverlayCardColors;
|
|
300
|
-
declare const overlayStyles: {
|
|
301
|
-
card: {
|
|
302
|
-
alignItems: "center";
|
|
303
|
-
borderRadius: number;
|
|
304
|
-
borderWidth: number;
|
|
305
|
-
gap: number;
|
|
306
|
-
maxWidth: number;
|
|
307
|
-
padding: number;
|
|
308
|
-
};
|
|
309
|
-
overlay: {
|
|
310
|
-
alignItems: "center";
|
|
311
|
-
backgroundColor: string;
|
|
312
|
-
bottom: number;
|
|
313
|
-
justifyContent: "center";
|
|
314
|
-
left: number;
|
|
315
|
-
position: "absolute";
|
|
316
|
-
right: number;
|
|
317
|
-
top: number;
|
|
318
|
-
};
|
|
319
|
-
};
|
|
320
|
-
declare const overlayActionStyles: {
|
|
321
|
-
actionButton: {
|
|
322
|
-
flexGrow: number;
|
|
323
|
-
minWidth: number;
|
|
324
|
-
};
|
|
325
|
-
actionButtonSingle: {
|
|
326
|
-
minWidth: number;
|
|
327
|
-
};
|
|
328
|
-
actions: {
|
|
329
|
-
flexDirection: "row";
|
|
330
|
-
flexWrap: "wrap";
|
|
331
|
-
gap: number;
|
|
332
|
-
justifyContent: "center";
|
|
333
|
-
width: "100%";
|
|
334
|
-
};
|
|
335
|
-
};
|
|
336
|
-
|
|
337
180
|
declare function getColorPopoverId(idPrefix: string): string;
|
|
338
181
|
declare function getCpuDifficultyPopoverId(idPrefix: string): string;
|
|
339
182
|
interface PlayerSetupPanelProps<C extends string = string> {
|
|
@@ -370,7 +213,7 @@ interface PlayerSetupPanelProps<C extends string = string> {
|
|
|
370
213
|
}
|
|
371
214
|
declare function PlayerSetupPanel<C extends string = string>({ idPrefix, host, label, labelFontFamily, color, onColorChange, swatches, takenColor, allowSwapTaken, colorAlignOverride, colorRotation, isHuman, secondPicker, secondPickerId, ready, onToggleReady, dark, showReadyButton, profiles, selectedProfileId, takenProfileId, guestLabel, onProfileSelect, onManageProfiles, cpuDifficulty, cpuDifficultyOptions, onCpuDifficultyChange, cpuDifficultyAlignOverride, humanIcon, cpuIcon }: PlayerSetupPanelProps<C>): react.JSX.Element;
|
|
372
215
|
|
|
373
|
-
interface Props$
|
|
216
|
+
interface Props$3 {
|
|
374
217
|
visible: boolean;
|
|
375
218
|
children: ReactNode;
|
|
376
219
|
align?: 'left' | 'right' | 'center';
|
|
@@ -380,59 +223,25 @@ interface Props$5 {
|
|
|
380
223
|
caretBorderWidth?: number;
|
|
381
224
|
triggerSize?: number;
|
|
382
225
|
}
|
|
383
|
-
declare function PopoverBody({ visible, children, align, verticalAlign, caretColor, caretBorderColor, caretBorderWidth, triggerSize }: Props$
|
|
226
|
+
declare function PopoverBody({ visible, children, align, verticalAlign, caretColor, caretBorderColor, caretBorderWidth, triggerSize }: Props$3): react.JSX.Element | null;
|
|
384
227
|
|
|
385
|
-
interface Props$
|
|
228
|
+
interface Props$2 {
|
|
386
229
|
active: boolean;
|
|
387
230
|
onPress: () => void;
|
|
388
231
|
style?: StyleProp<ViewStyle>;
|
|
389
232
|
}
|
|
390
|
-
declare function PressAwayOverlay({ active, onPress, style }: Props$
|
|
233
|
+
declare function PressAwayOverlay({ active, onPress, style }: Props$2): react.JSX.Element | null;
|
|
391
234
|
|
|
392
|
-
interface Props$
|
|
235
|
+
interface Props$1 {
|
|
393
236
|
color: string;
|
|
394
237
|
ready: boolean;
|
|
395
238
|
onToggleReady: () => void;
|
|
396
239
|
style?: StyleProp<ViewStyle>;
|
|
397
240
|
labelFontFamily?: string;
|
|
398
241
|
}
|
|
399
|
-
declare function ReadyButton({ color, ready, onToggleReady, style, labelFontFamily }: Props$
|
|
242
|
+
declare function ReadyButton({ color, ready, onToggleReady, style, labelFontFamily }: Props$1): react.JSX.Element;
|
|
400
243
|
|
|
401
|
-
interface
|
|
402
|
-
children: ReactNode;
|
|
403
|
-
/** The angle to turn the frame by. Defaults to the live physical hold (@tastic/core's useRotation); pass it
|
|
404
|
-
* when the caller already has the exact angle it wants, e.g. a dialog handed its caller's rotation, or 0 for
|
|
405
|
-
* one that already sits inside a turned frame. */
|
|
406
|
-
rotation?: ViewRotation;
|
|
407
|
-
/** Give everything inside the frame the safe-area insets already remapped onto the frame's own edges (see
|
|
408
|
-
* @tastic/core's rotateInsets), so a component that reads `useSafeAreaInsets()` itself (a library screen,
|
|
409
|
-
* Paper's Modal, a toaster) lands on the right edge when the frame is turned. Leave it off for content that
|
|
410
|
-
* rotates the insets itself, which would otherwise rotate them twice. */
|
|
411
|
-
rotatedSafeArea?: boolean;
|
|
412
|
-
/** Mount a Paper Portal.Host INSIDE the frame, so a dialog (Paper's Portal otherwise mounts at the app root,
|
|
413
|
-
* outside the frame) is laid out against the frame's footprint and turned with it. The dialog must then be
|
|
414
|
-
* told `rotation={0}`. */
|
|
415
|
-
portalHost?: boolean;
|
|
416
|
-
/** Let touches fall through the frame to whatever is beneath it, so only its children claim them. For a frame
|
|
417
|
-
* laid OVER other content (a dialog layer, a root-level overlay); a screen that owns the window leaves it off. */
|
|
418
|
-
passThrough?: boolean;
|
|
419
|
-
/** Cap on the content column's width in the WIDE layout only (the rotated footprint is landscape), centred: a
|
|
420
|
-
* stats list or a roster stretched across an 874pt-wide landscape screen reads badly. Portrait is never capped,
|
|
421
|
-
* so a portrait iPad or desktop window keeps its full width. Omit for no cap. */
|
|
422
|
-
maxContentWidth?: number;
|
|
423
|
-
}
|
|
424
|
-
/** A frame turned to follow the phone while the OS stays portrait-locked (see @tastic/core's FakeLandscapeView),
|
|
425
|
-
* sized to the turned footprint so its content lays out against the short edge at +/-90. The tree is IDENTICAL
|
|
426
|
-
* at every angle, so a rotation never remounts what is inside: `FakeLandscapeView > SafeArea provider >
|
|
427
|
-
* [Portal.Host] > column`. `rotation`, `rotatedSafeArea`, `passThrough` and `maxContentWidth` only change styles
|
|
428
|
-
* and values, but `portalHost` adds or removes the Portal.Host element, so it must be STATIC per call site
|
|
429
|
-
* (flipping it at runtime would remount everything inside).
|
|
430
|
-
*
|
|
431
|
-
* Safe for tap-driven content only: react-native-gesture-handler's translation deltas are untransformed, so
|
|
432
|
-
* never put a gesture-tracked game board inside it. */
|
|
433
|
-
declare function RotatedFrame({ children, rotation: rotationOverride, rotatedSafeArea, portalHost, passThrough, maxContentWidth }: RotatedFrameProps): react.JSX.Element;
|
|
434
|
-
|
|
435
|
-
interface Props$2 {
|
|
244
|
+
interface Props {
|
|
436
245
|
onBack: () => void;
|
|
437
246
|
onSettings: () => void;
|
|
438
247
|
onRandomize?: () => void;
|
|
@@ -441,39 +250,7 @@ interface Props$2 {
|
|
|
441
250
|
popoverOpen: boolean;
|
|
442
251
|
children: ReactNode;
|
|
443
252
|
}
|
|
444
|
-
declare function SharedActionBand({ onBack, onSettings, onRandomize, onReset, fg, popoverOpen, children }: Props
|
|
445
|
-
|
|
446
|
-
declare function getStaggeredWordDuration(letterCount: number): number;
|
|
447
|
-
interface StaggeredWordProps {
|
|
448
|
-
word: string;
|
|
449
|
-
color: string;
|
|
450
|
-
fontFamily: string;
|
|
451
|
-
fontSize: number;
|
|
452
|
-
lineHeight: number;
|
|
453
|
-
reducedMotion: boolean;
|
|
454
|
-
startIndex?: number;
|
|
455
|
-
fontWeight?: TextStyle['fontWeight'];
|
|
456
|
-
letterSpacing?: number;
|
|
457
|
-
style?: StyleProp<ViewStyle>;
|
|
458
|
-
onLayout?: (e: LayoutChangeEvent) => void;
|
|
459
|
-
}
|
|
460
|
-
declare function StaggeredWord({ word, color, fontFamily, fontSize, lineHeight, reducedMotion, startIndex, fontWeight, letterSpacing, style, onLayout }: StaggeredWordProps): react.JSX.Element;
|
|
461
|
-
|
|
462
|
-
interface Props$1 {
|
|
463
|
-
label: string;
|
|
464
|
-
value: string;
|
|
465
|
-
fg?: string;
|
|
466
|
-
fgMuted?: string;
|
|
467
|
-
}
|
|
468
|
-
declare function StatRow({ label, value, fg: fgOverride, fgMuted: fgMutedOverride }: Props$1): react.JSX.Element;
|
|
469
|
-
|
|
470
|
-
interface Props {
|
|
471
|
-
label: string;
|
|
472
|
-
fg?: string;
|
|
473
|
-
sectionBg?: string;
|
|
474
|
-
children: ReactNode;
|
|
475
|
-
}
|
|
476
|
-
declare function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, children }: Props): react.JSX.Element;
|
|
253
|
+
declare function SharedActionBand({ onBack, onSettings, onRandomize, onReset, fg, popoverOpen, children }: Props): react.JSX.Element;
|
|
477
254
|
|
|
478
255
|
interface TriggerGaugeProps {
|
|
479
256
|
segments: number;
|
|
@@ -488,14 +265,6 @@ interface TriggerGaugeProps {
|
|
|
488
265
|
|
|
489
266
|
declare function TriggerGaugeHost(props: TriggerGaugeProps): react.JSX.Element;
|
|
490
267
|
|
|
491
|
-
interface UpdateDialogProps {
|
|
492
|
-
rotation?: ViewRotation;
|
|
493
|
-
autoCheck?: boolean;
|
|
494
|
-
autoPrompt?: boolean;
|
|
495
|
-
onError?: (message: string) => void;
|
|
496
|
-
}
|
|
497
|
-
declare function UpdateDialog({ rotation, autoCheck, autoPrompt, onError }: UpdateDialogProps): react.JSX.Element;
|
|
498
|
-
|
|
499
268
|
interface QuitConfirmation {
|
|
500
269
|
/** Wire directly to <ConfirmDialog visible={...}>. */
|
|
501
270
|
confirmVisible: boolean;
|
|
@@ -508,4 +277,4 @@ declare function useQuitConfirmation(hasProgress: () => boolean, onConfirmedBack
|
|
|
508
277
|
|
|
509
278
|
declare function useZoneClampedAlign(open: boolean, contentWidth: number, contentHeight: number, rotation?: PopoverRotation): ReturnType<typeof useAutoAlign>;
|
|
510
279
|
|
|
511
|
-
export {
|
|
280
|
+
export { AchievementUnlockList, type AchievementUnlockOwner, type AlignResult, ControlSchemePicker, type ControlSchemePickerProps, type CornerStatusBadgeSeat, CornerStatusBadges, type CornerStatusBadgesProps, InlineColorPicker, LABELED_DROPDOWN_POPOVER_WIDTH, LabeledDropdown, type LabeledDropdownOption, type MenuOption, type MenuSection, type MultiSelectSection, type OrientationMode, PlayerSetupPanel, type PlayerSetupPanelProps, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverRotation, type PopoverVerticalAlign, PressAwayOverlay, type QuitConfirmation, ReadyButton, SectionedDropdown, SharedActionBand, type SingleSelectSection, TriggerGaugeHost, type TriggerGaugeProps, type UnlockedAchievement, getColorPopoverId, getCpuDifficultyPopoverId, getInlineColorPickerContentSize, getLabeledDropdownContentHeight, loadSkiaWeb, useAutoAlign, usePopoverHost, useQuitConfirmation, useZoneClampedAlign };
|
package/dist/index.js
CHANGED
|
@@ -391,7 +391,7 @@ function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, chil
|
|
|
391
391
|
] });
|
|
392
392
|
}
|
|
393
393
|
var styles5 = import_react_native6.StyleSheet.create({
|
|
394
|
-
// Bold and full-contrast (fg), not the original fontless/fgMuted treatment
|
|
394
|
+
// Bold and full-contrast (fg), not the original fontless/fgMuted treatment - that read at the
|
|
395
395
|
// same visual weight as StatRow's own row labels below it (both used the identical muted color;
|
|
396
396
|
// letterSpacing/variant alone didn't separate them enough to read as "this is the group header"
|
|
397
397
|
// at a glance). Matches AchievementRow's own title styling (bold + fg) below it in the same list.
|
|
@@ -528,14 +528,14 @@ var styles6 = import_react_native8.StyleSheet.create({
|
|
|
528
528
|
textAlign: "center"
|
|
529
529
|
},
|
|
530
530
|
// Additive on top of overlayCard's own shared `card` shape (borderRadius/borderWidth/gap/maxWidth/
|
|
531
|
-
// padding)
|
|
531
|
+
// padding) - claims its full allowance instead of just maxWidth alone, which only caps how wide the
|
|
532
532
|
// card is allowed to get - without an explicit width, a flex-centered child sizes to its own content
|
|
533
533
|
// instead of stretching, so the card (and therefore actions below) can end up narrower than the
|
|
534
534
|
// screen actually has room for, needlessly forcing the action row to wrap sooner than it has to.
|
|
535
535
|
card: {
|
|
536
536
|
width: "100%"
|
|
537
537
|
},
|
|
538
|
-
// Additive on top of overlayCard's own shared `overlay` backdrop
|
|
538
|
+
// Additive on top of overlayCard's own shared `overlay` backdrop - gives the card room to breathe
|
|
539
539
|
// from the screen edges now that it reliably stretches to fill its full width allowance (see
|
|
540
540
|
// card's own width comment) - without this, width: '100%' would run the card edge-to-edge on a
|
|
541
541
|
// screen narrower than maxWidth's own 360.
|
|
@@ -732,7 +732,7 @@ var styles8 = import_react_native10.StyleSheet.create({
|
|
|
732
732
|
gap: 24,
|
|
733
733
|
paddingVertical: 20
|
|
734
734
|
},
|
|
735
|
-
// Caps the card so it never grows past the screen
|
|
735
|
+
// Caps the card so it never grows past the screen - without this the dialog just keeps
|
|
736
736
|
// growing to fit its content and the overflow gets clipped by the screen edge, which is
|
|
737
737
|
// what happened in landscape where there's less height to work with. Dialog.ScrollArea +
|
|
738
738
|
// ScrollView below then take over and let the content scroll within that bound.
|
|
@@ -856,7 +856,7 @@ var styles9 = import_react_native11.StyleSheet.create({
|
|
|
856
856
|
resetButton: {
|
|
857
857
|
marginTop: 16
|
|
858
858
|
},
|
|
859
|
-
// Bounds the ScrollView to the space `container`'s flex:1 actually gives it
|
|
859
|
+
// Bounds the ScrollView to the space `container`'s flex:1 actually gives it - without this, a
|
|
860
860
|
// ScrollView with only a contentContainerStyle isn't reliably height-constrained on native (it
|
|
861
861
|
// can render at its full unclipped content height instead of the screen's), which leaves the
|
|
862
862
|
// header's back button touch target unreliable underneath it.
|
|
@@ -935,7 +935,7 @@ var styles11 = import_react_native13.StyleSheet.create({
|
|
|
935
935
|
height: 0,
|
|
936
936
|
position: "absolute",
|
|
937
937
|
width: 0,
|
|
938
|
-
// Explicit, not left to DOM order
|
|
938
|
+
// Explicit, not left to DOM order - the box it dips into is itself a position:'relative' view,
|
|
939
939
|
// which React Native Web always gives an implicit zIndex:0 (see PopoverBody's stacking-context
|
|
940
940
|
// notes elsewhere in this codebase), so painting on top needs a real zIndex to beat that
|
|
941
941
|
// reliably rather than relying on being the later sibling.
|
|
@@ -954,7 +954,7 @@ var styles11 = import_react_native13.StyleSheet.create({
|
|
|
954
954
|
top: "100%"
|
|
955
955
|
},
|
|
956
956
|
// Stretched to the anchor's own (trigger) width, with alignItems centering the actual (usually
|
|
957
|
-
// much wider) popover box inside via plain flexbox
|
|
957
|
+
// much wider) popover box inside via plain flexbox - not `left:'50%'` plus a percentage
|
|
958
958
|
// `transform`, which depends on native resolving the box's own auto width before applying the
|
|
959
959
|
// transform and has proven unreliable there, visibly shifting the box off-center.
|
|
960
960
|
contentCenter: {
|
|
@@ -1179,7 +1179,7 @@ var styles13 = import_react_native16.StyleSheet.create({
|
|
|
1179
1179
|
position: "relative"
|
|
1180
1180
|
},
|
|
1181
1181
|
// React Native Web gives every position:'relative' view an explicit zIndex (0, not 'auto'),
|
|
1182
|
-
// which makes each one its own stacking context
|
|
1182
|
+
// which makes each one its own stacking context - so a zIndex set only on the popover content
|
|
1183
1183
|
// below only wins comparisons within this anchor's own box, not against this anchor's own later
|
|
1184
1184
|
// siblings (e.g. a Ready button), which are otherwise painted on top by DOM-order tiebreak.
|
|
1185
1185
|
// Elevating the anchor itself, only while its popover is open, fixes that at the right level.
|
|
@@ -1206,7 +1206,7 @@ var styles13 = import_react_native16.StyleSheet.create({
|
|
|
1206
1206
|
flexDirection: "row",
|
|
1207
1207
|
gap: 8
|
|
1208
1208
|
},
|
|
1209
|
-
// Same opacity as ProfilePicker's rowDisabled / InlineColorPicker's swatchTaken
|
|
1209
|
+
// Same opacity as ProfilePicker's rowDisabled / InlineColorPicker's swatchTaken - the fleet's
|
|
1210
1210
|
// established "shown, not removed" treatment for another seat's own current pick.
|
|
1211
1211
|
itemTaken: {
|
|
1212
1212
|
opacity: 0.35
|
|
@@ -1222,7 +1222,7 @@ var styles13 = import_react_native16.StyleSheet.create({
|
|
|
1222
1222
|
shadowOpacity: 0.3,
|
|
1223
1223
|
shadowRadius: 8
|
|
1224
1224
|
},
|
|
1225
|
-
// Separate from `menu` itself
|
|
1225
|
+
// Separate from `menu` itself - a ScrollView's own style sets the scrolling frame's bounds
|
|
1226
1226
|
// (including the maxHeight that actually caps it), while padding/gap belong to its
|
|
1227
1227
|
// contentContainerStyle, which sizes to the *unclamped* content instead of the frame.
|
|
1228
1228
|
menuContent: {
|
|
@@ -1370,7 +1370,7 @@ var styles16 = import_react_native20.StyleSheet.create({
|
|
|
1370
1370
|
anchor: {
|
|
1371
1371
|
position: "relative"
|
|
1372
1372
|
},
|
|
1373
|
-
// See SectionedDropdown's identical comment
|
|
1373
|
+
// See SectionedDropdown's identical comment - React Native Web gives every position:'relative' view
|
|
1374
1374
|
// its own stacking context, so the elevation has to live on the anchor itself, not just the
|
|
1375
1375
|
// popover content nested inside it, to correctly paint above this anchor's own later siblings.
|
|
1376
1376
|
anchorOpen: {
|
|
@@ -1398,12 +1398,12 @@ var styles16 = import_react_native20.StyleSheet.create({
|
|
|
1398
1398
|
shadowOffset: { height: 2, width: 0 },
|
|
1399
1399
|
shadowOpacity: 0.3,
|
|
1400
1400
|
shadowRadius: 8
|
|
1401
|
-
// width is set inline above
|
|
1401
|
+
// width is set inline above - border-box sizing means it has to include the border too
|
|
1402
1402
|
// (2*SWATCHES_BORDER_WIDTH), not just padding+content, or exactly enough room goes missing that
|
|
1403
1403
|
// the last column silently wraps to a new row. Anything wider than the exact sum just shows as
|
|
1404
1404
|
// dead space on the right edge of each row instead.
|
|
1405
1405
|
},
|
|
1406
|
-
// Separate from `swatches` itself
|
|
1406
|
+
// Separate from `swatches` itself - see SectionedDropdown's identical menu/menuContent split.
|
|
1407
1407
|
// The scroll frame's own bounds (including maxHeight) live on the ScrollView; the actual grid
|
|
1408
1408
|
// wrapping belongs to its contentContainerStyle, which sizes to the unclamped content instead.
|
|
1409
1409
|
swatchesContent: {
|
|
@@ -1416,7 +1416,7 @@ var styles16 = import_react_native20.StyleSheet.create({
|
|
|
1416
1416
|
fontWeight: "700",
|
|
1417
1417
|
letterSpacing: 0.5
|
|
1418
1418
|
},
|
|
1419
|
-
// borderRadius/height/width come from the `size` prop instead (see render-site override)
|
|
1419
|
+
// borderRadius/height/width come from the `size` prop instead (see render-site override) - no
|
|
1420
1420
|
// fixed default here, since this style object is shared by every caller regardless of size.
|
|
1421
1421
|
trigger: {
|
|
1422
1422
|
alignItems: "center",
|
|
@@ -1424,7 +1424,7 @@ var styles16 = import_react_native20.StyleSheet.create({
|
|
|
1424
1424
|
justifyContent: "center"
|
|
1425
1425
|
},
|
|
1426
1426
|
// Wraps just the icon/tag, inside the TouchableRipple, purely so useAutoAlign has a plain View
|
|
1427
|
-
// to attach its measurement ref to
|
|
1427
|
+
// to attach its measurement ref to - TouchableRipple itself doesn't forward a ref to a
|
|
1428
1428
|
// measurable native node. Padded horizontally so a multi-character tag doesn't butt right up
|
|
1429
1429
|
// against the trigger's own circular edge (an icon alone doesn't need it, but this style is
|
|
1430
1430
|
// shared by both).
|
|
@@ -1485,7 +1485,7 @@ var styles17 = import_react_native21.StyleSheet.create({
|
|
|
1485
1485
|
position: "relative"
|
|
1486
1486
|
},
|
|
1487
1487
|
// React Native Web gives every position:'relative' view its own stacking context, so the
|
|
1488
|
-
// elevation has to live on the anchor itself
|
|
1488
|
+
// elevation has to live on the anchor itself - see PopoverBody's own stacking-context notes.
|
|
1489
1489
|
anchorOpen: {
|
|
1490
1490
|
zIndex: 100
|
|
1491
1491
|
},
|
|
@@ -1606,13 +1606,13 @@ var styles19 = import_react_native23.StyleSheet.create({
|
|
|
1606
1606
|
alignItems: "center",
|
|
1607
1607
|
gap: 12
|
|
1608
1608
|
},
|
|
1609
|
-
// See SectionedDropdown's anchorOpen comment
|
|
1609
|
+
// See SectionedDropdown's anchorOpen comment - this panel is typically a sibling of another
|
|
1610
1610
|
// panel (and/or a shared-controls row), so a popover escaping this panel's bounds needs the panel
|
|
1611
1611
|
// itself elevated, not just the popover content, to paint above a later sibling.
|
|
1612
1612
|
panelOpen: {
|
|
1613
1613
|
zIndex: 100
|
|
1614
1614
|
},
|
|
1615
|
-
// Same gap as `panel`'s own vertical rhythm, reused horizontally
|
|
1615
|
+
// Same gap as `panel`'s own vertical rhythm, reused horizontally - the color picker and (when
|
|
1616
1616
|
// present) secondPicker sit side by side within this row instead of stacked in the panel's own
|
|
1617
1617
|
// column.
|
|
1618
1618
|
pickerRow: {
|
|
@@ -1620,10 +1620,10 @@ var styles19 = import_react_native23.StyleSheet.create({
|
|
|
1620
1620
|
flexDirection: "row",
|
|
1621
1621
|
gap: 12
|
|
1622
1622
|
},
|
|
1623
|
-
// A popover is an absolutely-positioned sibling of its own trigger
|
|
1623
|
+
// A popover is an absolutely-positioned sibling of its own trigger - so a tall one (the color
|
|
1624
1624
|
// swatch grid) can extend down far enough to overlap the ReadyButton below, which paints on top of
|
|
1625
1625
|
// it by default DOM order since it's a later sibling within `panel`. `panel`'s own panelOpen
|
|
1626
|
-
// elevation only helps this panel paint above OTHER panels (see its own comment)
|
|
1626
|
+
// elevation only helps this panel paint above OTHER panels (see its own comment) - it does nothing
|
|
1627
1627
|
// for stacking *within* this panel, since React Native Web gives each View its own stacking
|
|
1628
1628
|
// context. This is what actually fixes that: elevate pickerRow itself above its own later sibling
|
|
1629
1629
|
// whenever one of its own popovers is open.
|