@tastic/hud 0.14.2 → 0.16.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.
Files changed (53) hide show
  1. package/README.md +117 -80
  2. package/dist/chrome/index.d.mts +240 -0
  3. package/dist/chrome/index.d.ts +240 -0
  4. package/dist/chrome/index.js +772 -0
  5. package/dist/chrome/index.mjs +44 -0
  6. package/dist/chunk-JXRBXQLQ.mjs +645 -0
  7. package/dist/guide/index.js +3 -3
  8. package/dist/guide/index.mjs +3 -3
  9. package/dist/index.d.mts +21 -252
  10. package/dist/index.d.ts +21 -252
  11. package/dist/index.js +23 -23
  12. package/dist/index.mjs +186 -791
  13. package/package.json +8 -1
  14. package/src/AchievementCatalogSection.tsx +1 -1
  15. package/src/AchievementRow.tsx +9 -9
  16. package/src/BaseSettingsDialog.tsx +31 -31
  17. package/src/BaseStatsScreen.tsx +13 -13
  18. package/src/ConfirmDialog.tsx +2 -2
  19. package/src/ControlSchemePicker.tsx +9 -9
  20. package/src/CornerActionButtons.tsx +18 -10
  21. package/src/CornerStatusBadges.tsx +8 -8
  22. package/src/InlineColorPicker.tsx +30 -30
  23. package/src/LabeledDropdown.tsx +8 -8
  24. package/src/PlayerSetupPanel.tsx +25 -25
  25. package/src/PopoverBody.tsx +16 -16
  26. package/src/PressAwayOverlay.tsx +2 -2
  27. package/src/ReadyButton.tsx +3 -3
  28. package/src/SectionedDropdown.tsx +31 -31
  29. package/src/SharedActionBand.tsx +6 -6
  30. package/src/SkiaGate.tsx +5 -5
  31. package/src/SkiaGate.web.tsx +2 -2
  32. package/src/StaggeredWord.tsx +9 -9
  33. package/src/StatRow.tsx +3 -3
  34. package/src/StatSection.tsx +3 -3
  35. package/src/TriggerGauge.tsx +54 -54
  36. package/src/TriggerGaugeHost.tsx +2 -2
  37. package/src/chrome/index.ts +22 -0
  38. package/src/fonts.ts +1 -1
  39. package/src/guide/DirectionKeysHint.tsx +3 -3
  40. package/src/guide/GuideProvider.tsx +7 -7
  41. package/src/guide/HowToPlayDialog.tsx +7 -7
  42. package/src/guide/SeatDiagram.tsx +3 -3
  43. package/src/guide/SwipeHint.tsx +4 -4
  44. package/src/guide/guideSlice.ts +7 -7
  45. package/src/guide/index.ts +4 -3
  46. package/src/guide/types.ts +1 -1
  47. package/src/index.ts +1 -1
  48. package/src/loadSkiaWeb.ts +2 -2
  49. package/src/loadSkiaWeb.web.ts +2 -2
  50. package/src/overlayCard.ts +3 -3
  51. package/src/useAutoAlign.ts +23 -23
  52. package/src/usePopoverHost.ts +1 -1
  53. package/src/useZoneClampedAlign.ts +23 -23
@@ -0,0 +1,240 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { AchievementCatalogRow } from '@tastic/achievements';
4
+ import { ViewRotation } from '@tastic/core';
5
+ import { StyleProp, ViewStyle, Insets, TextStyle, LayoutChangeEvent } from 'react-native';
6
+
7
+ interface Props$7 {
8
+ rows: AchievementCatalogRow[];
9
+ label?: string;
10
+ fg?: string;
11
+ fgMuted?: string;
12
+ }
13
+ declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride }: Props$7): react.JSX.Element;
14
+
15
+ declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
16
+ interface Props$6 {
17
+ icon: string;
18
+ title: string;
19
+ description: string;
20
+ badgeColor: string;
21
+ unlockedLabel?: string;
22
+ checkColor?: string;
23
+ progress?: number;
24
+ deviceMarker?: boolean;
25
+ fg?: string;
26
+ fgMuted?: string;
27
+ sectionBg?: string;
28
+ }
29
+ declare function AchievementRow({ icon, title, description, badgeColor, unlockedLabel, checkColor, progress, deviceMarker, fg: fgOverride, fgMuted: fgMutedOverride, sectionBg: sectionBgOverride }: Props$6): react.JSX.Element;
30
+
31
+ interface ActivityStats {
32
+ distinctDaysPlayed: number;
33
+ currentDayStreak: number;
34
+ bestDayStreak: number;
35
+ }
36
+ interface Props$5 {
37
+ stats: ActivityStats;
38
+ }
39
+ declare function ActivityStatSection({ stats }: Props$5): react.JSX.Element;
40
+
41
+ interface BaseSettingsDialogProps {
42
+ visible: boolean;
43
+ onDismiss: () => void;
44
+ rotation?: ViewRotation;
45
+ version: string | number;
46
+ lockOrientation?: boolean;
47
+ onLockOrientationChange?: (value: boolean) => void;
48
+ deferBottomEdgeGestures?: boolean;
49
+ onDeferBottomEdgeGestures?: (value: boolean) => void;
50
+ hideSound?: boolean;
51
+ hideHaptics?: boolean;
52
+ hideAppearance?: boolean;
53
+ hideUpdateCheck?: boolean;
54
+ onUpdateError?: (message: string) => void;
55
+ onShowHowToPlay?: () => void;
56
+ children?: ReactNode;
57
+ }
58
+ declare function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, onShowHowToPlay, children }: BaseSettingsDialogProps): react.JSX.Element | null;
59
+
60
+ type MD3TextVariant = 'displayLarge' | 'displayMedium' | 'displaySmall' | 'headlineLarge' | 'headlineMedium' | 'headlineSmall' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'labelLarge' | 'labelMedium' | 'labelSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall';
61
+ interface Props$4 {
62
+ rotation?: ViewRotation;
63
+ title?: string;
64
+ titleVariant?: MD3TextVariant;
65
+ onBack: () => void;
66
+ insets: {
67
+ top: number;
68
+ left: number;
69
+ bottom: number;
70
+ right: number;
71
+ };
72
+ onReset?: () => void;
73
+ resetLabel?: string;
74
+ resetConfirmTitle?: string;
75
+ resetConfirmBody?: string;
76
+ fg?: string;
77
+ bg?: string;
78
+ children: ReactNode;
79
+ }
80
+ declare function BaseStatsScreen({ rotation: rotationOverride, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride, children }: Props$4): react.JSX.Element;
81
+
82
+ interface ConfirmDialogProps {
83
+ visible: boolean;
84
+ title: string;
85
+ message: ReactNode;
86
+ confirmLabel: string;
87
+ cancelLabel?: string;
88
+ onConfirm: () => void;
89
+ onCancel?: () => void;
90
+ rotation?: ViewRotation;
91
+ icon?: string;
92
+ destructive?: boolean;
93
+ }
94
+ declare function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation, icon, destructive }: ConfirmDialogProps): react.JSX.Element | null;
95
+
96
+ interface Props$3 {
97
+ maxContentWidth?: number;
98
+ leftGutter?: ReactNode;
99
+ rightGutter?: ReactNode;
100
+ style?: StyleProp<ViewStyle>;
101
+ children: ReactNode;
102
+ }
103
+ declare function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }: Props$3): react.JSX.Element;
104
+
105
+ interface Props$2 {
106
+ onBack: () => void;
107
+ onSettings: () => void;
108
+ fg: string;
109
+ insets: {
110
+ top: number;
111
+ left: number;
112
+ right: number;
113
+ };
114
+ backIcon?: string;
115
+ backLabel?: string;
116
+ hitSlop?: number | Insets;
117
+ }
118
+ declare function CornerActionButtons({ onBack, onSettings, fg, insets, backIcon, backLabel, hitSlop }: Props$2): react.JSX.Element;
119
+
120
+ declare const MONO_FONT: string;
121
+
122
+ interface OverlayCardColors {
123
+ fg: string;
124
+ fgMuted: string;
125
+ cardBg: string;
126
+ cardBorder: string;
127
+ }
128
+ declare function getOverlayCardColors(dark: boolean): OverlayCardColors;
129
+ declare const overlayStyles: {
130
+ card: {
131
+ alignItems: "center";
132
+ borderRadius: number;
133
+ borderWidth: number;
134
+ gap: number;
135
+ maxWidth: number;
136
+ padding: number;
137
+ };
138
+ overlay: {
139
+ alignItems: "center";
140
+ backgroundColor: string;
141
+ bottom: number;
142
+ justifyContent: "center";
143
+ left: number;
144
+ position: "absolute";
145
+ right: number;
146
+ top: number;
147
+ };
148
+ };
149
+ declare const overlayActionStyles: {
150
+ actionButton: {
151
+ flexGrow: number;
152
+ minWidth: number;
153
+ };
154
+ actionButtonSingle: {
155
+ minWidth: number;
156
+ };
157
+ actions: {
158
+ flexDirection: "row";
159
+ flexWrap: "wrap";
160
+ gap: number;
161
+ justifyContent: "center";
162
+ width: "100%";
163
+ };
164
+ };
165
+
166
+ interface RotatedFrameProps {
167
+ children: ReactNode;
168
+ /** The angle to turn the frame by. Defaults to the live physical hold (@tastic/core's useRotation); pass it
169
+ * when the caller already has the exact angle it wants, e.g. a dialog handed its caller's rotation, or 0 for
170
+ * one that already sits inside a turned frame. */
171
+ rotation?: ViewRotation;
172
+ /** Give everything inside the frame the safe-area insets already remapped onto the frame's own edges (see
173
+ * @tastic/core's rotateInsets), so a component that reads `useSafeAreaInsets()` itself (a library screen,
174
+ * Paper's Modal, a toaster) lands on the right edge when the frame is turned. Leave it off for content that
175
+ * rotates the insets itself, which would otherwise rotate them twice. */
176
+ rotatedSafeArea?: boolean;
177
+ /** Mount a Paper Portal.Host INSIDE the frame, so a dialog (Paper's Portal otherwise mounts at the app root,
178
+ * outside the frame) is laid out against the frame's footprint and turned with it. The dialog must then be
179
+ * told `rotation={0}`. */
180
+ portalHost?: boolean;
181
+ /** Let touches fall through the frame to whatever is beneath it, so only its children claim them. For a frame
182
+ * laid OVER other content (a dialog layer, a root-level overlay); a screen that owns the window leaves it off. */
183
+ passThrough?: boolean;
184
+ /** Cap on the content column's width in the WIDE layout only (the rotated footprint is landscape), centred: a
185
+ * stats list or a roster stretched across an 874pt-wide landscape screen reads badly. Portrait is never capped,
186
+ * so a portrait iPad or desktop window keeps its full width. Omit for no cap. */
187
+ maxContentWidth?: number;
188
+ }
189
+ /** A frame turned to follow the phone while the OS stays portrait-locked (see @tastic/core's FakeLandscapeView),
190
+ * sized to the turned footprint so its content lays out against the short edge at +/-90. The tree is IDENTICAL
191
+ * at every angle, so a rotation never remounts what is inside: `FakeLandscapeView > SafeArea provider >
192
+ * [Portal.Host] > column`. `rotation`, `rotatedSafeArea`, `passThrough` and `maxContentWidth` only change styles
193
+ * and values, but `portalHost` adds or removes the Portal.Host element, so it must be STATIC per call site
194
+ * (flipping it at runtime would remount everything inside).
195
+ *
196
+ * Safe for tap-driven content only: react-native-gesture-handler's translation deltas are untransformed, so
197
+ * never put a gesture-tracked game board inside it. */
198
+ declare function RotatedFrame({ children, rotation: rotationOverride, rotatedSafeArea, portalHost, passThrough, maxContentWidth }: RotatedFrameProps): react.JSX.Element;
199
+
200
+ declare function getStaggeredWordDuration(letterCount: number): number;
201
+ interface StaggeredWordProps {
202
+ word: string;
203
+ color: string;
204
+ fontFamily: string;
205
+ fontSize: number;
206
+ lineHeight: number;
207
+ reducedMotion: boolean;
208
+ startIndex?: number;
209
+ fontWeight?: TextStyle['fontWeight'];
210
+ letterSpacing?: number;
211
+ style?: StyleProp<ViewStyle>;
212
+ onLayout?: (e: LayoutChangeEvent) => void;
213
+ }
214
+ declare function StaggeredWord({ word, color, fontFamily, fontSize, lineHeight, reducedMotion, startIndex, fontWeight, letterSpacing, style, onLayout }: StaggeredWordProps): react.JSX.Element;
215
+
216
+ interface Props$1 {
217
+ label: string;
218
+ value: string;
219
+ fg?: string;
220
+ fgMuted?: string;
221
+ }
222
+ declare function StatRow({ label, value, fg: fgOverride, fgMuted: fgMutedOverride }: Props$1): react.JSX.Element;
223
+
224
+ interface Props {
225
+ label: string;
226
+ fg?: string;
227
+ sectionBg?: string;
228
+ children: ReactNode;
229
+ }
230
+ declare function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, children }: Props): react.JSX.Element;
231
+
232
+ interface UpdateDialogProps {
233
+ rotation?: ViewRotation;
234
+ autoCheck?: boolean;
235
+ autoPrompt?: boolean;
236
+ onError?: (message: string) => void;
237
+ }
238
+ declare function UpdateDialog({ rotation, autoCheck, autoPrompt, onError }: UpdateDialogProps): react.JSX.Element;
239
+
240
+ export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, LOCKED_BADGE_COLOR, MONO_FONT, type OverlayCardColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, getOverlayCardColors, getStaggeredWordDuration, overlayActionStyles, overlayStyles };
@@ -0,0 +1,240 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { AchievementCatalogRow } from '@tastic/achievements';
4
+ import { ViewRotation } from '@tastic/core';
5
+ import { StyleProp, ViewStyle, Insets, TextStyle, LayoutChangeEvent } from 'react-native';
6
+
7
+ interface Props$7 {
8
+ rows: AchievementCatalogRow[];
9
+ label?: string;
10
+ fg?: string;
11
+ fgMuted?: string;
12
+ }
13
+ declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride }: Props$7): react.JSX.Element;
14
+
15
+ declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
16
+ interface Props$6 {
17
+ icon: string;
18
+ title: string;
19
+ description: string;
20
+ badgeColor: string;
21
+ unlockedLabel?: string;
22
+ checkColor?: string;
23
+ progress?: number;
24
+ deviceMarker?: boolean;
25
+ fg?: string;
26
+ fgMuted?: string;
27
+ sectionBg?: string;
28
+ }
29
+ declare function AchievementRow({ icon, title, description, badgeColor, unlockedLabel, checkColor, progress, deviceMarker, fg: fgOverride, fgMuted: fgMutedOverride, sectionBg: sectionBgOverride }: Props$6): react.JSX.Element;
30
+
31
+ interface ActivityStats {
32
+ distinctDaysPlayed: number;
33
+ currentDayStreak: number;
34
+ bestDayStreak: number;
35
+ }
36
+ interface Props$5 {
37
+ stats: ActivityStats;
38
+ }
39
+ declare function ActivityStatSection({ stats }: Props$5): react.JSX.Element;
40
+
41
+ interface BaseSettingsDialogProps {
42
+ visible: boolean;
43
+ onDismiss: () => void;
44
+ rotation?: ViewRotation;
45
+ version: string | number;
46
+ lockOrientation?: boolean;
47
+ onLockOrientationChange?: (value: boolean) => void;
48
+ deferBottomEdgeGestures?: boolean;
49
+ onDeferBottomEdgeGestures?: (value: boolean) => void;
50
+ hideSound?: boolean;
51
+ hideHaptics?: boolean;
52
+ hideAppearance?: boolean;
53
+ hideUpdateCheck?: boolean;
54
+ onUpdateError?: (message: string) => void;
55
+ onShowHowToPlay?: () => void;
56
+ children?: ReactNode;
57
+ }
58
+ declare function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound, hideHaptics, hideAppearance, hideUpdateCheck, onUpdateError, onShowHowToPlay, children }: BaseSettingsDialogProps): react.JSX.Element | null;
59
+
60
+ type MD3TextVariant = 'displayLarge' | 'displayMedium' | 'displaySmall' | 'headlineLarge' | 'headlineMedium' | 'headlineSmall' | 'titleLarge' | 'titleMedium' | 'titleSmall' | 'labelLarge' | 'labelMedium' | 'labelSmall' | 'bodyLarge' | 'bodyMedium' | 'bodySmall';
61
+ interface Props$4 {
62
+ rotation?: ViewRotation;
63
+ title?: string;
64
+ titleVariant?: MD3TextVariant;
65
+ onBack: () => void;
66
+ insets: {
67
+ top: number;
68
+ left: number;
69
+ bottom: number;
70
+ right: number;
71
+ };
72
+ onReset?: () => void;
73
+ resetLabel?: string;
74
+ resetConfirmTitle?: string;
75
+ resetConfirmBody?: string;
76
+ fg?: string;
77
+ bg?: string;
78
+ children: ReactNode;
79
+ }
80
+ declare function BaseStatsScreen({ rotation: rotationOverride, title, titleVariant, onBack, insets, onReset, resetLabel, resetConfirmTitle, resetConfirmBody, fg: fgOverride, bg: bgOverride, children }: Props$4): react.JSX.Element;
81
+
82
+ interface ConfirmDialogProps {
83
+ visible: boolean;
84
+ title: string;
85
+ message: ReactNode;
86
+ confirmLabel: string;
87
+ cancelLabel?: string;
88
+ onConfirm: () => void;
89
+ onCancel?: () => void;
90
+ rotation?: ViewRotation;
91
+ icon?: string;
92
+ destructive?: boolean;
93
+ }
94
+ declare function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation, icon, destructive }: ConfirmDialogProps): react.JSX.Element | null;
95
+
96
+ interface Props$3 {
97
+ maxContentWidth?: number;
98
+ leftGutter?: ReactNode;
99
+ rightGutter?: ReactNode;
100
+ style?: StyleProp<ViewStyle>;
101
+ children: ReactNode;
102
+ }
103
+ declare function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }: Props$3): react.JSX.Element;
104
+
105
+ interface Props$2 {
106
+ onBack: () => void;
107
+ onSettings: () => void;
108
+ fg: string;
109
+ insets: {
110
+ top: number;
111
+ left: number;
112
+ right: number;
113
+ };
114
+ backIcon?: string;
115
+ backLabel?: string;
116
+ hitSlop?: number | Insets;
117
+ }
118
+ declare function CornerActionButtons({ onBack, onSettings, fg, insets, backIcon, backLabel, hitSlop }: Props$2): react.JSX.Element;
119
+
120
+ declare const MONO_FONT: string;
121
+
122
+ interface OverlayCardColors {
123
+ fg: string;
124
+ fgMuted: string;
125
+ cardBg: string;
126
+ cardBorder: string;
127
+ }
128
+ declare function getOverlayCardColors(dark: boolean): OverlayCardColors;
129
+ declare const overlayStyles: {
130
+ card: {
131
+ alignItems: "center";
132
+ borderRadius: number;
133
+ borderWidth: number;
134
+ gap: number;
135
+ maxWidth: number;
136
+ padding: number;
137
+ };
138
+ overlay: {
139
+ alignItems: "center";
140
+ backgroundColor: string;
141
+ bottom: number;
142
+ justifyContent: "center";
143
+ left: number;
144
+ position: "absolute";
145
+ right: number;
146
+ top: number;
147
+ };
148
+ };
149
+ declare const overlayActionStyles: {
150
+ actionButton: {
151
+ flexGrow: number;
152
+ minWidth: number;
153
+ };
154
+ actionButtonSingle: {
155
+ minWidth: number;
156
+ };
157
+ actions: {
158
+ flexDirection: "row";
159
+ flexWrap: "wrap";
160
+ gap: number;
161
+ justifyContent: "center";
162
+ width: "100%";
163
+ };
164
+ };
165
+
166
+ interface RotatedFrameProps {
167
+ children: ReactNode;
168
+ /** The angle to turn the frame by. Defaults to the live physical hold (@tastic/core's useRotation); pass it
169
+ * when the caller already has the exact angle it wants, e.g. a dialog handed its caller's rotation, or 0 for
170
+ * one that already sits inside a turned frame. */
171
+ rotation?: ViewRotation;
172
+ /** Give everything inside the frame the safe-area insets already remapped onto the frame's own edges (see
173
+ * @tastic/core's rotateInsets), so a component that reads `useSafeAreaInsets()` itself (a library screen,
174
+ * Paper's Modal, a toaster) lands on the right edge when the frame is turned. Leave it off for content that
175
+ * rotates the insets itself, which would otherwise rotate them twice. */
176
+ rotatedSafeArea?: boolean;
177
+ /** Mount a Paper Portal.Host INSIDE the frame, so a dialog (Paper's Portal otherwise mounts at the app root,
178
+ * outside the frame) is laid out against the frame's footprint and turned with it. The dialog must then be
179
+ * told `rotation={0}`. */
180
+ portalHost?: boolean;
181
+ /** Let touches fall through the frame to whatever is beneath it, so only its children claim them. For a frame
182
+ * laid OVER other content (a dialog layer, a root-level overlay); a screen that owns the window leaves it off. */
183
+ passThrough?: boolean;
184
+ /** Cap on the content column's width in the WIDE layout only (the rotated footprint is landscape), centred: a
185
+ * stats list or a roster stretched across an 874pt-wide landscape screen reads badly. Portrait is never capped,
186
+ * so a portrait iPad or desktop window keeps its full width. Omit for no cap. */
187
+ maxContentWidth?: number;
188
+ }
189
+ /** A frame turned to follow the phone while the OS stays portrait-locked (see @tastic/core's FakeLandscapeView),
190
+ * sized to the turned footprint so its content lays out against the short edge at +/-90. The tree is IDENTICAL
191
+ * at every angle, so a rotation never remounts what is inside: `FakeLandscapeView > SafeArea provider >
192
+ * [Portal.Host] > column`. `rotation`, `rotatedSafeArea`, `passThrough` and `maxContentWidth` only change styles
193
+ * and values, but `portalHost` adds or removes the Portal.Host element, so it must be STATIC per call site
194
+ * (flipping it at runtime would remount everything inside).
195
+ *
196
+ * Safe for tap-driven content only: react-native-gesture-handler's translation deltas are untransformed, so
197
+ * never put a gesture-tracked game board inside it. */
198
+ declare function RotatedFrame({ children, rotation: rotationOverride, rotatedSafeArea, portalHost, passThrough, maxContentWidth }: RotatedFrameProps): react.JSX.Element;
199
+
200
+ declare function getStaggeredWordDuration(letterCount: number): number;
201
+ interface StaggeredWordProps {
202
+ word: string;
203
+ color: string;
204
+ fontFamily: string;
205
+ fontSize: number;
206
+ lineHeight: number;
207
+ reducedMotion: boolean;
208
+ startIndex?: number;
209
+ fontWeight?: TextStyle['fontWeight'];
210
+ letterSpacing?: number;
211
+ style?: StyleProp<ViewStyle>;
212
+ onLayout?: (e: LayoutChangeEvent) => void;
213
+ }
214
+ declare function StaggeredWord({ word, color, fontFamily, fontSize, lineHeight, reducedMotion, startIndex, fontWeight, letterSpacing, style, onLayout }: StaggeredWordProps): react.JSX.Element;
215
+
216
+ interface Props$1 {
217
+ label: string;
218
+ value: string;
219
+ fg?: string;
220
+ fgMuted?: string;
221
+ }
222
+ declare function StatRow({ label, value, fg: fgOverride, fgMuted: fgMutedOverride }: Props$1): react.JSX.Element;
223
+
224
+ interface Props {
225
+ label: string;
226
+ fg?: string;
227
+ sectionBg?: string;
228
+ children: ReactNode;
229
+ }
230
+ declare function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, children }: Props): react.JSX.Element;
231
+
232
+ interface UpdateDialogProps {
233
+ rotation?: ViewRotation;
234
+ autoCheck?: boolean;
235
+ autoPrompt?: boolean;
236
+ onError?: (message: string) => void;
237
+ }
238
+ declare function UpdateDialog({ rotation, autoCheck, autoPrompt, onError }: UpdateDialogProps): react.JSX.Element;
239
+
240
+ export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, LOCKED_BADGE_COLOR, MONO_FONT, type OverlayCardColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, getOverlayCardColors, getStaggeredWordDuration, overlayActionStyles, overlayStyles };