@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.
Files changed (53) hide show
  1. package/README.md +110 -79
  2. package/dist/chrome/index.d.mts +239 -0
  3. package/dist/chrome/index.d.ts +239 -0
  4. package/dist/chrome/index.js +772 -0
  5. package/dist/chrome/index.mjs +44 -0
  6. package/dist/chunk-OTMMST5M.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 +20 -20
  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 +6 -6
  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
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 { ReactNode, RefObject } from 'react';
3
- import { AchievementCatalogRow, AchievementTier } from '@tastic/achievements';
3
+ import { RefObject, ReactNode } from 'react';
4
+ import { AchievementTier } from '@tastic/achievements';
4
5
  import { Profile } from '@tastic/profile';
5
- import { ViewStyle, StyleProp, View, TextStyle, LayoutChangeEvent } from 'react-native';
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$d<Seat extends number> {
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$d<Seat>): react.JSX.Element | null;
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$9 {
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$9): react.JSX.Element;
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$7 {
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$7): react.JSX.Element;
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$6<T extends string> {
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$6<T>): react.JSX.Element;
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$5 {
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$5): react.JSX.Element | null;
226
+ declare function PopoverBody({ visible, children, align, verticalAlign, caretColor, caretBorderColor, caretBorderWidth, triggerSize }: Props$3): react.JSX.Element | null;
384
227
 
385
- interface Props$4 {
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$4): react.JSX.Element | null;
233
+ declare function PressAwayOverlay({ active, onPress, style }: Props$2): react.JSX.Element | null;
391
234
 
392
- interface Props$3 {
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$3): react.JSX.Element;
242
+ declare function ReadyButton({ color, ready, onToggleReady, style, labelFontFamily }: Props$1): react.JSX.Element;
400
243
 
401
- interface RotatedFrameProps {
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$2): react.JSX.Element;
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 { AchievementCatalogSection, AchievementRow, AchievementUnlockList, type AchievementUnlockOwner, ActivityStatSection, type AlignResult, 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 OverlayCardColors, PlayerSetupPanel, type PlayerSetupPanelProps, type PopoverAlign, PopoverBody, type PopoverHost, type PopoverRotation, type PopoverVerticalAlign, PressAwayOverlay, type QuitConfirmation, ReadyButton, RotatedFrame, type RotatedFrameProps, SectionedDropdown, SharedActionBand, type SingleSelectSection, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, TriggerGaugeHost, type TriggerGaugeProps, type UnlockedAchievement, UpdateDialog, type UpdateDialogProps, getColorPopoverId, getCpuDifficultyPopoverId, getInlineColorPickerContentSize, getLabeledDropdownContentHeight, getOverlayCardColors, getStaggeredWordDuration, loadSkiaWeb, overlayActionStyles, overlayStyles, useAutoAlign, usePopoverHost, useQuitConfirmation, useZoneClampedAlign };
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 — that read at the
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) — claims its full allowance instead of just maxWidth alone, which only caps how wide the
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 — gives the card room to breathe
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 — without this the dialog just keeps
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 — without this, a
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 — the box it dips into is itself a position:'relative' view,
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 — not `left:'50%'` plus a percentage
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 — so a zIndex set only on the popover content
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 — the fleet's
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 — a ScrollView's own style sets the scrolling frame's bounds
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 — React Native Web gives every position:'relative' view
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 — border-box sizing means it has to include the border too
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 — see SectionedDropdown's identical menu/menuContent split.
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) — no
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 — TouchableRipple itself doesn't forward a ref to a
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 — see PopoverBody's own stacking-context notes.
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 — this panel is typically a sibling of another
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 — the color picker and (when
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 — so a tall one (the color
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) — it does nothing
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.