@tastic/hud 0.24.0 → 0.25.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.
@@ -48,6 +48,7 @@ __export(chrome_exports, {
48
48
  PopoverBody: () => PopoverBody,
49
49
  PressAwayOverlay: () => PressAwayOverlay,
50
50
  RotatedFrame: () => RotatedFrame,
51
+ SecondaryButton: () => SecondaryButton,
51
52
  StaggeredWord: () => StaggeredWord,
52
53
  StatRow: () => StatRow,
53
54
  StatSection: () => StatSection,
@@ -239,7 +240,7 @@ function ActivityStatSection({ stats, fg, fgMuted, sectionBg }) {
239
240
  // src/BaseSettingsDialog.tsx
240
241
  var import_auto_paper6 = require("@rific/auto-paper");
241
242
  var import_core4 = require("@rific/core");
242
- var import_feedback_press2 = require("@rific/feedback-press");
243
+ var import_feedback_press3 = require("@rific/feedback-press");
243
244
  var import_updater = require("@rific/updater");
244
245
  var import_core5 = require("@tastic/core");
245
246
  var import_react6 = require("react");
@@ -249,7 +250,7 @@ var import_react_native_safe_area_context2 = require("react-native-safe-area-con
249
250
 
250
251
  // src/ConfirmDialog.tsx
251
252
  var import_auto_paper5 = require("@rific/auto-paper");
252
- var import_feedback_press = require("@rific/feedback-press");
253
+ var import_feedback_press2 = require("@rific/feedback-press");
253
254
  var import_core2 = require("@tastic/core");
254
255
  var import_react3 = require("react");
255
256
  var import_react_native10 = require("react-native");
@@ -382,6 +383,14 @@ var styles6 = import_react_native8.StyleSheet.create({
382
383
  card: { overflow: "hidden" }
383
384
  });
384
385
 
386
+ // src/SecondaryButton.tsx
387
+ var import_feedback_press = require("@rific/feedback-press");
388
+ var import_jsx_runtime8 = require("react/jsx-runtime");
389
+ function SecondaryButton({ style, ...props }) {
390
+ const { fg } = useOverlayCardColors();
391
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_feedback_press.Button, { mode: "outlined", textColor: fg, ...props, style: [overlayActionStyles.actionButton, style] });
392
+ }
393
+
385
394
  // src/useCompactDialog.ts
386
395
  var import_core = require("@tastic/core");
387
396
  var import_react2 = require("react");
@@ -400,7 +409,7 @@ function useCompactDialog(rotation = 0) {
400
409
  }
401
410
 
402
411
  // src/ConfirmDialog.tsx
403
- var import_jsx_runtime8 = require("react/jsx-runtime");
412
+ var import_jsx_runtime9 = require("react/jsx-runtime");
404
413
  function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation = 0, icon = "help-circle-outline", destructive = false }) {
405
414
  const { colors } = (0, import_auto_paper5.useAutoPaperTheme)();
406
415
  const { fg } = useOverlayCardColors();
@@ -421,12 +430,12 @@ function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onC
421
430
  const accent = destructive ? colors.danger : colors.primary;
422
431
  const onAccent = destructive ? colors.onDanger : colors.onPrimary;
423
432
  const showCancel = cancelLabel !== void 0 && onCancel !== void 0;
424
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native_paper6.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(OverlayBackdrop, { style: styles7.overlay, onLayout, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(OverlayCard, { style: [styles7.card, (0, import_core2.toRotationStyle)(rotation)], children: [
425
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DialogHeader, { icon, title, color: accent, compact }),
426
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native_paper6.Text, { variant: "bodyLarge", style: [styles7.body, { color: fg }], children: message }),
427
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native10.View, { style: overlayActionStyles.actions, children: [
428
- showCancel && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_feedback_press.Button, { mode: "outlined", onPress: onCancel, style: overlayActionStyles.actionButton, children: cancelLabel }),
429
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_feedback_press.Button, { mode: "contained", onPress: onConfirm, style: showCancel ? overlayActionStyles.actionButton : overlayActionStyles.actionButtonSingle, buttonColor: accent, textColor: onAccent, children: confirmLabel })
433
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native_paper6.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(OverlayBackdrop, { style: styles7.overlay, onLayout, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(OverlayCard, { style: [styles7.card, (0, import_core2.toRotationStyle)(rotation)], children: [
434
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(DialogHeader, { icon, title, color: accent, compact }),
435
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native_paper6.Text, { variant: "bodyLarge", style: [styles7.body, { color: fg }], children: message }),
436
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native10.View, { style: overlayActionStyles.actions, children: [
437
+ showCancel && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SecondaryButton, { onPress: onCancel, children: cancelLabel }),
438
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_feedback_press2.Button, { mode: "contained", onPress: onConfirm, style: showCancel ? overlayActionStyles.actionButton : overlayActionStyles.actionButtonSingle, buttonColor: accent, textColor: onAccent, children: confirmLabel })
430
439
  ] })
431
440
  ] }) }) });
432
441
  }
@@ -457,7 +466,7 @@ var import_react4 = require("react");
457
466
  var import_react_native11 = require("react-native");
458
467
  var import_react_native_paper7 = require("react-native-paper");
459
468
  var import_react_native_safe_area_context = require("react-native-safe-area-context");
460
- var import_jsx_runtime9 = require("react/jsx-runtime");
469
+ var import_jsx_runtime10 = require("react/jsx-runtime");
461
470
  function RotatedFrame({ children, rotation: rotationOverride, rotatedSafeArea = false, portalHost = false, passThrough = false, maxContentWidth }) {
462
471
  const ambientRotation = (0, import_core3.useRotation)();
463
472
  const rotation = rotationOverride ?? ambientRotation;
@@ -466,8 +475,8 @@ function RotatedFrame({ children, rotation: rotationOverride, rotatedSafeArea =
466
475
  const rawInsets = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
467
476
  const insets = (0, import_react4.useMemo)(() => rotatedSafeArea ? (0, import_core3.rotateInsets)(rawInsets, rotation) : rawInsets, [rotatedSafeArea, rawInsets, rotation]);
468
477
  const cappedWidth = maxContentWidth !== void 0 && width > height ? maxContentWidth : void 0;
469
- const column = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native11.View, { style: [styles8.column, cappedWidth !== void 0 && { maxWidth: cappedWidth }], pointerEvents: passThrough ? "box-none" : void 0, children });
470
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core3.FakeLandscapeView, { rotation, passThrough, style: styles8.root, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native_safe_area_context.SafeAreaInsetsContext.Provider, { value: insets, children: portalHost ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native_paper7.Portal.Host, { children: column }) : column }) });
478
+ const column = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native11.View, { style: [styles8.column, cappedWidth !== void 0 && { maxWidth: cappedWidth }], pointerEvents: passThrough ? "box-none" : void 0, children });
479
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core3.FakeLandscapeView, { rotation, passThrough, style: styles8.root, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_safe_area_context.SafeAreaInsetsContext.Provider, { value: insets, children: portalHost ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper7.Portal.Host, { children: column }) : column }) });
471
480
  }
472
481
  var styles8 = import_react_native11.StyleSheet.create({
473
482
  // A centred column: full width up to `maxWidth`, so a capped frame sits in the middle of a wider window.
@@ -502,9 +511,9 @@ function useUpdateConfirmBridge() {
502
511
  }
503
512
 
504
513
  // src/BaseSettingsDialog.tsx
505
- var import_jsx_runtime10 = require("react/jsx-runtime");
514
+ var import_jsx_runtime11 = require("react/jsx-runtime");
506
515
  function SettingIcon({ source, color, containerColor }) {
507
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: [styles9.iconBadge, { backgroundColor: containerColor }], children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Icon, { source, size: 18, color }) });
516
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.View, { style: [styles9.iconBadge, { backgroundColor: containerColor }], children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Icon, { source, size: 18, color }) });
508
517
  }
509
518
  function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound = false, hideHaptics = false, hideAppearance = false, hideUpdateCheck = false, onUpdateError, onShowHowToPlay, children }) {
510
519
  const { colors } = (0, import_auto_paper6.useAutoPaperTheme)();
@@ -516,12 +525,12 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
516
525
  const insets = (0, import_core5.rotateInsets)((0, import_react_native_safe_area_context2.useSafeAreaInsets)(), rotation);
517
526
  const sheetWidth = Math.min(overlayStyles.card.maxWidth, (turned ? window.height : window.width) - 2 * Math.max(insets.left, insets.right, SHEET_GUTTER));
518
527
  const isTouchPrimary = (0, import_core5.useIsTouchPrimaryDevice)();
519
- const { settings: hapticSettings, set: setHapticSettings } = (0, import_feedback_press2.useHapticSettings)();
520
- const { settings: soundSettings, set: setSoundSettings } = (0, import_feedback_press2.useSoundSettings)();
528
+ const { settings: hapticSettings, set: setHapticSettings } = (0, import_feedback_press3.useHapticSettings)();
529
+ const { settings: soundSettings, set: setSoundSettings } = (0, import_feedback_press3.useSoundSettings)();
521
530
  const { settings: keepAwakeSettings, set: setKeepAwakeSettings } = (0, import_core4.useKeepAwakeSettings)();
522
531
  const expoKeepAwake = (0, import_core4.useExpoKeepAwake)();
523
- const sound = (0, import_react6.useContext)(import_feedback_press2.SoundContext);
524
- const { forceShort: forceHapticFeedback } = (0, import_feedback_press2.useVibration)();
532
+ const sound = (0, import_react6.useContext)(import_feedback_press3.SoundContext);
533
+ const { forceShort: forceHapticFeedback } = (0, import_feedback_press3.useVibration)();
525
534
  const { settings: themeSettings, set: setThemeSettings } = (0, import_auto_paper6.useThemeSettings)();
526
535
  const expoBlur = (0, import_auto_paper6.useBlurModule)();
527
536
  const [infoMessage, setInfoMessage] = (0, import_react6.useState)(null);
@@ -545,36 +554,36 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
545
554
  const showBlur = showAppearance && import_react_native12.Platform.OS !== "android" && expoBlur !== void 0 && expoBlur !== null;
546
555
  const showUpdateCheck = import_react_native12.Platform.OS !== "web" && !hideUpdateCheck;
547
556
  if (!opened) return null;
548
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(RotatedFrame, { rotation, rotatedSafeArea: true, portalHost: true, passThrough: true, children: [
549
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper6.Dialog, { visible, onDismiss, style: [styles9.dialog, { width: sheetWidth }], children: [
550
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper6.Dialog.ScrollArea, { style: styles9.scrollArea, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper6.FadingScrollView, { contentContainerStyle: styles9.scrollContent, showsVerticalScrollIndicator: false, children: [
551
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DialogHeader, { icon: "cog", title: "Settings", compact: compactHeader }),
552
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.content, children: [
553
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleGroup, children: [
554
- showLockOrientation && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => onLockOrientationChange(!lockOrientation), style: styles9.toggleButton, accessibilityLabel: `Lock orientation ${lockOrientation ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
555
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: lockOrientation ? "lock" : "lock-open-variant-outline", color: lockOrientation ? colors.tertiary : colors.onSurfaceVariant, containerColor: lockOrientation ? colors.tertiaryContainer : colors.surfaceVariant }),
556
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
557
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Lock Orientation" }),
558
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Pin current layout" })
557
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(RotatedFrame, { rotation, rotatedSafeArea: true, portalHost: true, passThrough: true, children: [
558
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_auto_paper6.Dialog, { visible, onDismiss, style: [styles9.dialog, { width: sheetWidth }], children: [
559
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_auto_paper6.Dialog.ScrollArea, { style: styles9.scrollArea, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_auto_paper6.FadingScrollView, { contentContainerStyle: styles9.scrollContent, showsVerticalScrollIndicator: false, children: [
560
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DialogHeader, { icon: "cog", title: "Settings", compact: compactHeader }),
561
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.content, children: [
562
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleGroup, children: [
563
+ showLockOrientation && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.TouchableRipple, { onPress: () => onLockOrientationChange(!lockOrientation), style: styles9.toggleButton, accessibilityLabel: `Lock orientation ${lockOrientation ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
564
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: lockOrientation ? "lock" : "lock-open-variant-outline", color: lockOrientation ? colors.tertiary : colors.onSurfaceVariant, containerColor: lockOrientation ? colors.tertiaryContainer : colors.surfaceVariant }),
565
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
566
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Lock Orientation" }),
567
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Pin current layout" })
559
568
  ] })
560
569
  ] }) }),
561
- showEdgeGuard && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => onDeferBottomEdgeGestures(!deferBottomEdgeGestures), style: styles9.toggleButton, accessibilityLabel: `Edge guard ${deferBottomEdgeGestures ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
562
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: deferBottomEdgeGestures ? "shield-check-outline" : "shield-off-outline", color: deferBottomEdgeGestures ? colors.tertiary : colors.onSurfaceVariant, containerColor: deferBottomEdgeGestures ? colors.tertiaryContainer : colors.surfaceVariant }),
563
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
564
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Edge Guard" }),
565
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Require second swipe" })
570
+ showEdgeGuard && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.TouchableRipple, { onPress: () => onDeferBottomEdgeGestures(!deferBottomEdgeGestures), style: styles9.toggleButton, accessibilityLabel: `Edge guard ${deferBottomEdgeGestures ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
571
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: deferBottomEdgeGestures ? "shield-check-outline" : "shield-off-outline", color: deferBottomEdgeGestures ? colors.tertiary : colors.onSurfaceVariant, containerColor: deferBottomEdgeGestures ? colors.tertiaryContainer : colors.surfaceVariant }),
572
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
573
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Edge Guard" }),
574
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Require second swipe" })
566
575
  ] })
567
576
  ] }) }),
568
- showKeepAwake && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => setKeepAwakeSettings({ enabled: !keepAwakeSettings.enabled }), style: styles9.toggleButton, accessibilityLabel: `Keep awake ${keepAwakeSettings.enabled ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
569
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: keepAwakeSettings.enabled ? "eye" : "eye-closed", color: keepAwakeSettings.enabled ? colors.tertiary : colors.onSurfaceVariant, containerColor: keepAwakeSettings.enabled ? colors.tertiaryContainer : colors.surfaceVariant }),
570
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
571
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Keep Awake" }),
572
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Stop auto-lock mid-match" })
577
+ showKeepAwake && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.TouchableRipple, { onPress: () => setKeepAwakeSettings({ enabled: !keepAwakeSettings.enabled }), style: styles9.toggleButton, accessibilityLabel: `Keep awake ${keepAwakeSettings.enabled ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
578
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: keepAwakeSettings.enabled ? "eye" : "eye-closed", color: keepAwakeSettings.enabled ? colors.tertiary : colors.onSurfaceVariant, containerColor: keepAwakeSettings.enabled ? colors.tertiaryContainer : colors.surfaceVariant }),
579
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
580
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Keep Awake" }),
581
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Stop auto-lock mid-match" })
573
582
  ] })
574
583
  ] }) }),
575
- (showSound || showHaptics) && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleRow, children: [
576
- showSound && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
577
- import_feedback_press2.TouchableRipple,
584
+ (showSound || showHaptics) && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleRow, children: [
585
+ showSound && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
586
+ import_feedback_press3.TouchableRipple,
578
587
  {
579
588
  soundDisabled: true,
580
589
  onPress: () => {
@@ -584,14 +593,14 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
584
593
  },
585
594
  style: styles9.toggleButtonInRow,
586
595
  accessibilityLabel: `Sound ${soundSettings.enabled ? "on" : "off"}`,
587
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
588
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: soundSettings.enabled ? "volume-high" : "volume-off", color: soundSettings.enabled ? colors.tertiary : colors.onSurfaceVariant, containerColor: soundSettings.enabled ? colors.tertiaryContainer : colors.surfaceVariant }),
589
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Sound" })
596
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
597
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: soundSettings.enabled ? "volume-high" : "volume-off", color: soundSettings.enabled ? colors.tertiary : colors.onSurfaceVariant, containerColor: soundSettings.enabled ? colors.tertiaryContainer : colors.surfaceVariant }),
598
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Sound" })
590
599
  ] })
591
600
  }
592
601
  ),
593
- showHaptics && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
594
- import_feedback_press2.TouchableRipple,
602
+ showHaptics && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
603
+ import_feedback_press3.TouchableRipple,
595
604
  {
596
605
  hapticDisabled: true,
597
606
  onPress: () => {
@@ -601,15 +610,15 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
601
610
  },
602
611
  style: styles9.toggleButtonInRow,
603
612
  accessibilityLabel: `Haptics ${hapticSettings.vibrate ? "on" : "off"}`,
604
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
605
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: hapticSettings.vibrate ? "vibrate" : "vibrate-off", color: hapticSettings.vibrate ? colors.tertiary : colors.onSurfaceVariant, containerColor: hapticSettings.vibrate ? colors.tertiaryContainer : colors.surfaceVariant }),
606
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Haptics" })
613
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
614
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: hapticSettings.vibrate ? "vibrate" : "vibrate-off", color: hapticSettings.vibrate ? colors.tertiary : colors.onSurfaceVariant, containerColor: hapticSettings.vibrate ? colors.tertiaryContainer : colors.surfaceVariant }),
615
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Haptics" })
607
616
  ] })
608
617
  }
609
618
  )
610
619
  ] }),
611
- onShowHowToPlay && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
612
- import_feedback_press2.TouchableRipple,
620
+ onShowHowToPlay && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
621
+ import_feedback_press3.TouchableRipple,
613
622
  {
614
623
  onPress: () => {
615
624
  onDismiss();
@@ -617,42 +626,42 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
617
626
  },
618
627
  style: styles9.toggleButton,
619
628
  accessibilityLabel: "How to Play",
620
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
621
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: "help-circle-outline", color: colors.secondary, containerColor: colors.secondaryContainer }),
622
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
623
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "How to Play" }),
624
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Replay quick intro" })
629
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
630
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: "help-circle-outline", color: colors.secondary, containerColor: colors.secondaryContainer }),
631
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
632
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "How to Play" }),
633
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Replay quick intro" })
625
634
  ] })
626
635
  ] })
627
636
  }
628
637
  )
629
638
  ] }),
630
- showAppearance && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.section, children: [
631
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "labelMedium", style: [styles9.sectionLabel, { color: colors.onSurfaceVariant }], children: "APPEARANCE" }),
632
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper6.AutoAppearancePicker, { showLabels: false }),
633
- showBlur && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => setThemeSettings({ blur: !themeSettings.blur }), style: styles9.toggleButton, accessibilityLabel: `Blur ${themeSettings.blur ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
634
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: themeSettings.blur ? "blur" : "blur-off", color: themeSettings.blur ? colors.tertiary : colors.onSurfaceVariant, containerColor: themeSettings.blur ? colors.tertiaryContainer : colors.surfaceVariant }),
635
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
636
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Blur" }),
637
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Frost behind dialogs" })
639
+ showAppearance && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.section, children: [
640
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "labelMedium", style: [styles9.sectionLabel, { color: colors.onSurfaceVariant }], children: "APPEARANCE" }),
641
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_auto_paper6.AutoAppearancePicker, { showLabels: false }),
642
+ showBlur && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.TouchableRipple, { onPress: () => setThemeSettings({ blur: !themeSettings.blur }), style: styles9.toggleButton, accessibilityLabel: `Blur ${themeSettings.blur ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
643
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: themeSettings.blur ? "blur" : "blur-off", color: themeSettings.blur ? colors.tertiary : colors.onSurfaceVariant, containerColor: themeSettings.blur ? colors.tertiaryContainer : colors.surfaceVariant }),
644
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
645
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Blur" }),
646
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper8.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Frost behind dialogs" })
638
647
  ] })
639
648
  ] }) })
640
649
  ] }),
641
650
  children,
642
- showUpdateCheck && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.section, children: [
643
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native_paper8.Text, { variant: "labelMedium", style: [styles9.sectionLabel, { color: colors.onSurfaceVariant }], children: [
651
+ showUpdateCheck && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles9.section, children: [
652
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native_paper8.Text, { variant: "labelMedium", style: [styles9.sectionLabel, { color: colors.onSurfaceVariant }], children: [
644
653
  "VERSION ",
645
654
  version,
646
655
  updateReady ? " \xB7 UPDATE READY" : ""
647
656
  ] }),
648
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.Button, { mode: "outlined", onPress: check, loading: checking, disabled: checking, children: "Check for Updates" })
657
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.Button, { mode: "outlined", onPress: check, loading: checking, disabled: checking, children: "Check for Updates" })
649
658
  ] })
650
659
  ] })
651
660
  ] }) }),
652
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: [overlayActionStyles.actions, styles9.footer], children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.Button, { mode: "contained", onPress: onDismiss, style: overlayActionStyles.actionButtonSingle, buttonColor: colors.primary, textColor: colors.onPrimary, children: "Done" }) })
661
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native12.View, { style: [overlayActionStyles.actions, styles9.footer], children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.Button, { mode: "contained", onPress: onDismiss, style: overlayActionStyles.actionButtonSingle, buttonColor: colors.primary, textColor: colors.onPrimary, children: "Done" }) })
653
662
  ] }),
654
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ConfirmDialog, { visible: !!updateManifest, title: "Update Available", message: updateManifestDate ? `Released ${updateManifestDate.toLocaleDateString()} at ${updateManifestDate.toLocaleTimeString()}` : "", confirmLabel: "Restart", cancelLabel: "Later", icon: "update", rotation: 0, onConfirm: () => respondToUpdateConfirm(true), onCancel: () => respondToUpdateConfirm(false) }),
655
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ConfirmDialog, { visible: !!infoMessage, title: infoMessage?.title ?? "", message: infoMessage?.message ?? "", confirmLabel: "OK", icon: "information-outline", rotation: 0, onConfirm: () => setInfoMessage(null), onCancel: () => setInfoMessage(null) })
663
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ConfirmDialog, { visible: !!updateManifest, title: "Update Available", message: updateManifestDate ? `Released ${updateManifestDate.toLocaleDateString()} at ${updateManifestDate.toLocaleTimeString()}` : "", confirmLabel: "Restart", cancelLabel: "Later", icon: "update", rotation: 0, onConfirm: () => respondToUpdateConfirm(true), onCancel: () => respondToUpdateConfirm(false) }),
664
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ConfirmDialog, { visible: !!infoMessage, title: infoMessage?.title ?? "", message: infoMessage?.message ?? "", confirmLabel: "OK", icon: "information-outline", rotation: 0, onConfirm: () => setInfoMessage(null), onCancel: () => setInfoMessage(null) })
656
665
  ] }) });
657
666
  }
658
667
  var SHEET_GUTTER = 24;
@@ -741,12 +750,12 @@ var styles9 = import_react_native12.StyleSheet.create({
741
750
 
742
751
  // src/BaseStatsScreen.tsx
743
752
  var import_auto_paper7 = require("@rific/auto-paper");
744
- var import_feedback_press3 = require("@rific/feedback-press");
753
+ var import_feedback_press4 = require("@rific/feedback-press");
745
754
  var import_core6 = require("@tastic/core");
746
755
  var import_react7 = require("react");
747
756
  var import_react_native13 = require("react-native");
748
757
  var import_react_native_paper9 = require("react-native-paper");
749
- var import_jsx_runtime11 = require("react/jsx-runtime");
758
+ var import_jsx_runtime12 = require("react/jsx-runtime");
750
759
  function BaseStatsScreen({ rotation: rotationOverride, title = "Achievements", titleVariant = "headlineSmall", onBack, backLabel = "Back", hitSlop, insets, onReset, resetLabel = "Reset All Stats", resetConfirmTitle = "Reset Everything?", resetConfirmBody = "This permanently erases all stats and achievements. This cannot be undone.", fg: fgOverride, bg: bgOverride, children }) {
751
760
  const { dark, colors } = (0, import_auto_paper7.useAutoPaperTheme)();
752
761
  const ambientRotation = (0, import_core6.useRotation)();
@@ -755,16 +764,16 @@ function BaseStatsScreen({ rotation: rotationOverride, title = "Achievements", t
755
764
  const showReset = !!onReset;
756
765
  const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
757
766
  const bg = bgOverride ?? (dark ? "#000000" : "#FFFFFF");
758
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: [styles10.container, { backgroundColor: bg }], children: [
759
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: [styles10.header, { paddingTop: 8 + insets.top, paddingLeft: 8 + insets.left }], children: [
760
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.IconButton, { icon: "arrow-left", iconColor: fg, size: 24, hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
761
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Text, { variant: titleVariant, style: [styles10.title, { color: fg }], children: title })
767
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles10.container, { backgroundColor: bg }], children: [
768
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles10.header, { paddingTop: 8 + insets.top, paddingLeft: 8 + insets.left }], children: [
769
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_feedback_press4.IconButton, { icon: "arrow-left", iconColor: fg, size: 24, hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
770
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native_paper9.Text, { variant: titleVariant, style: [styles10.title, { color: fg }], children: title })
762
771
  ] }),
763
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_auto_paper7.FadingScrollView, { style: styles10.scrollView, contentContainerStyle: [styles10.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
772
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_auto_paper7.FadingScrollView, { style: styles10.scrollView, contentContainerStyle: [styles10.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
764
773
  children,
765
- showReset && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.Button, { mode: "contained", onPress: () => setConfirmResetVisible(true), buttonColor: colors.danger, textColor: colors.onDanger, style: styles10.resetButton, children: resetLabel })
774
+ showReset && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_feedback_press4.Button, { mode: "contained", onPress: () => setConfirmResetVisible(true), buttonColor: colors.danger, textColor: colors.onDanger, style: styles10.resetButton, children: resetLabel })
766
775
  ] }),
767
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
776
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
768
777
  ConfirmDialog,
769
778
  {
770
779
  visible: confirmResetVisible,
@@ -817,14 +826,14 @@ var styles10 = import_react_native13.StyleSheet.create({
817
826
  // src/ContentGutter.tsx
818
827
  var import_core7 = require("@tastic/core");
819
828
  var import_react_native14 = require("react-native");
820
- var import_jsx_runtime12 = require("react/jsx-runtime");
829
+ var import_jsx_runtime13 = require("react/jsx-runtime");
821
830
  function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }) {
822
831
  const { width: windowWidth } = (0, import_core7.useRotatedWindowDimensions)();
823
832
  const { contentWidth, gutterWidth } = (0, import_core7.computeContentBounds)(windowWidth, maxContentWidth ?? Infinity);
824
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native14.View, { style: [styles11.row, style], children: [
825
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles11.gutter, { width: gutterWidth }], children: leftGutter }),
826
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: { width: contentWidth }, children }),
827
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native14.View, { style: [styles11.gutter, { width: gutterWidth }], children: rightGutter })
833
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_react_native14.View, { style: [styles11.row, style], children: [
834
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native14.View, { style: [styles11.gutter, { width: gutterWidth }], children: leftGutter }),
835
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native14.View, { style: { width: contentWidth }, children }),
836
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native14.View, { style: [styles11.gutter, { width: gutterWidth }], children: rightGutter })
828
837
  ] });
829
838
  }
830
839
  var styles11 = import_react_native14.StyleSheet.create({
@@ -839,13 +848,13 @@ var styles11 = import_react_native14.StyleSheet.create({
839
848
  });
840
849
 
841
850
  // src/CornerActionButtons.tsx
842
- var import_feedback_press4 = require("@rific/feedback-press");
851
+ var import_feedback_press5 = require("@rific/feedback-press");
843
852
  var import_react_native15 = require("react-native");
844
- var import_jsx_runtime13 = require("react/jsx-runtime");
853
+ var import_jsx_runtime14 = require("react/jsx-runtime");
845
854
  function CornerActionButtons({ onBack, onSettings, fg, insets, backIcon = "arrow-left", backLabel = "Back", hitSlop }) {
846
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
847
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_feedback_press4.IconButton, { icon: backIcon, iconColor: fg, size: 24, style: [styles12.back, { top: 8 + insets.top, left: 8 + insets.left }], hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
848
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_feedback_press4.IconButton, { icon: "cog", iconColor: fg, size: 24, style: [styles12.topRight, { top: 8 + insets.top, right: 8 + insets.right }], hitSlop, onPress: onSettings, accessibilityLabel: "Settings" })
855
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
856
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_feedback_press5.IconButton, { icon: backIcon, iconColor: fg, size: 24, style: [styles12.back, { top: 8 + insets.top, left: 8 + insets.left }], hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
857
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_feedback_press5.IconButton, { icon: "cog", iconColor: fg, size: 24, style: [styles12.topRight, { top: 8 + insets.top, right: 8 + insets.right }], hitSlop, onPress: onSettings, accessibilityLabel: "Settings" })
849
858
  ] });
850
859
  }
851
860
  var styles12 = import_react_native15.StyleSheet.create({
@@ -859,14 +868,14 @@ var styles12 = import_react_native15.StyleSheet.create({
859
868
 
860
869
  // src/InlineColorPicker.tsx
861
870
  var import_auto_paper8 = require("@rific/auto-paper");
862
- var import_feedback_press5 = require("@rific/feedback-press");
871
+ var import_feedback_press6 = require("@rific/feedback-press");
863
872
  var import_core8 = require("@tastic/core");
864
873
  var import_react_native18 = require("react-native");
865
874
  var import_react_native_paper10 = require("react-native-paper");
866
875
 
867
876
  // src/PopoverBody.tsx
868
877
  var import_react_native16 = require("react-native");
869
- var import_jsx_runtime14 = require("react/jsx-runtime");
878
+ var import_jsx_runtime15 = require("react/jsx-runtime");
870
879
  var CARET_SIZE = 7;
871
880
  var CARET_RING_OFFSET = 2;
872
881
  var CARET_DIP = 1;
@@ -880,11 +889,11 @@ function PopoverBody({ visible, children, align = "center", verticalAlign = "bel
880
889
  const caretFill = above ? "borderTopColor" : "borderBottomColor";
881
890
  const caretWidthProp = above ? "borderTopWidth" : "borderBottomWidth";
882
891
  const caretEdge = (size) => above ? { bottom: -size + CARET_DIP } : { top: -size + CARET_DIP };
883
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native16.View, { style: [styles13.content, alignStyle, verticalStyle], children: [
892
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_native16.View, { style: [styles13.content, alignStyle, verticalStyle], children: [
884
893
  children,
885
- caretColor && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
886
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native16.View, { style: [styles13.caret, caretOffset(ringSize), caretEdge(ringSize), { [caretFill]: caretBorderColor ?? caretColor, [caretWidthProp]: ringSize, borderLeftWidth: ringSize, borderRightWidth: ringSize }] }),
887
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native16.View, { style: [styles13.caret, caretOffset(CARET_SIZE), caretEdge(CARET_SIZE - CARET_RING_OFFSET), { [caretFill]: caretColor, [caretWidthProp]: CARET_SIZE, borderLeftWidth: CARET_SIZE, borderRightWidth: CARET_SIZE }] })
894
+ caretColor && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
895
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native16.View, { style: [styles13.caret, caretOffset(ringSize), caretEdge(ringSize), { [caretFill]: caretBorderColor ?? caretColor, [caretWidthProp]: ringSize, borderLeftWidth: ringSize, borderRightWidth: ringSize }] }),
896
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native16.View, { style: [styles13.caret, caretOffset(CARET_SIZE), caretEdge(CARET_SIZE - CARET_RING_OFFSET), { [caretFill]: caretColor, [caretWidthProp]: CARET_SIZE, borderLeftWidth: CARET_SIZE, borderRightWidth: CARET_SIZE }] })
888
897
  ] })
889
898
  ] });
890
899
  }
@@ -943,7 +952,7 @@ function rotateRect(x, y, width, height, rotation, windowWidth, windowHeight) {
943
952
  const [newDx, newDy, newWidth, newHeight] = rotation === 180 ? [-dx, -dy, width, height] : rotation === 90 ? [-dy, dx, height, width] : [dy, -dx, height, width];
944
953
  return { x: cx + newDx - newWidth / 2, y: cy + newDy - newHeight / 2, width: newWidth, height: newHeight };
945
954
  }
946
- function useAutoAlign(open, contentWidth, contentHeight, rotation = 0) {
955
+ function useAutoAlign(open, contentWidth, contentHeight, rotation = 0, bounds) {
947
956
  const triggerRef = (0, import_react8.useRef)(null);
948
957
  const { width: windowWidth, height: windowHeight } = (0, import_react_native17.useWindowDimensions)();
949
958
  const [align, setAlign] = (0, import_react8.useState)("center");
@@ -955,34 +964,43 @@ function useAutoAlign(open, contentWidth, contentHeight, rotation = 0) {
955
964
  setPrevOpen(open);
956
965
  if (open) setMeasured(false);
957
966
  }
958
- const measure = (0, import_react8.useCallback)(() => {
959
- triggerRef.current?.measureInWindow((rawX, rawY, rawWidth, rawHeight) => {
967
+ (0, import_react8.useEffect)(() => {
968
+ if (!open) return;
969
+ const place = (limits) => (rawX, rawY, rawWidth, rawHeight) => {
960
970
  const { x, y, width: triggerWidth, height: triggerHeight } = rotateRect(rawX, rawY, rawWidth, rawHeight, rotation, windowWidth, windowHeight);
961
971
  const centerX = x + triggerWidth / 2;
962
- const overflowsRight = centerX + contentWidth / 2 > windowWidth - EDGE_MARGIN;
963
- const overflowsLeft = centerX - contentWidth / 2 < EDGE_MARGIN;
972
+ const overflowsRight = centerX + contentWidth / 2 > limits.right - EDGE_MARGIN;
973
+ const overflowsLeft = centerX - contentWidth / 2 < limits.left + EDGE_MARGIN;
964
974
  if (overflowsRight && !overflowsLeft) setAlign("right");
965
975
  else if (overflowsLeft && !overflowsRight) setAlign("left");
966
976
  else setAlign("center");
967
- const roomBelow = windowHeight - (y + triggerHeight) - EDGE_MARGIN;
968
- const roomAbove = y - EDGE_MARGIN;
977
+ const roomBelow = limits.bottom - (y + triggerHeight) - EDGE_MARGIN;
978
+ const roomAbove = y - limits.top - EDGE_MARGIN;
969
979
  const above = contentHeight > roomBelow && roomAbove > roomBelow;
970
980
  setVerticalAlign(above ? "above" : "below");
971
981
  setMaxHeight(Math.max(above ? roomAbove : roomBelow, 0));
972
982
  setMeasured(true);
983
+ };
984
+ const screen = { left: 0, top: 0, right: windowWidth, bottom: windowHeight };
985
+ const boundsView = bounds?.current;
986
+ if (!boundsView) {
987
+ triggerRef.current?.measureInWindow(place(screen));
988
+ return;
989
+ }
990
+ boundsView.measureInWindow((rawX, rawY, rawWidth, rawHeight) => {
991
+ const b = rotateRect(rawX, rawY, rawWidth, rawHeight, rotation, windowWidth, windowHeight);
992
+ triggerRef.current?.measureInWindow(place({ left: Math.max(b.x, 0), top: Math.max(b.y, 0), right: Math.min(b.x + b.width, windowWidth), bottom: Math.min(b.y + b.height, windowHeight) }));
973
993
  });
974
- }, [contentWidth, contentHeight, windowWidth, windowHeight, rotation]);
975
- (0, import_react8.useEffect)(() => {
976
- if (open) measure();
977
- }, [open, measure]);
994
+ }, [open, contentWidth, contentHeight, windowWidth, windowHeight, rotation, bounds]);
978
995
  return { align, maxHeight, measured, triggerRef, verticalAlign };
979
996
  }
980
997
 
981
998
  // src/InlineColorPicker.tsx
982
- var import_jsx_runtime15 = require("react/jsx-runtime");
999
+ var import_jsx_runtime16 = require("react/jsx-runtime");
983
1000
  var EMOJI_PATTERN = /\p{Extended_Pictographic}/u;
984
1001
  var DEFAULT_SIZE = 48;
985
1002
  var SWATCH_SIZE = 28;
1003
+ var SWATCH_RING_WIDTH = 2;
986
1004
  var SWATCHES_PADDING = 8;
987
1005
  var SWATCHES_GAP = 6;
988
1006
  var SWATCHES_BORDER_WIDTH = 2;
@@ -1000,14 +1018,17 @@ function getInlineColorPickerContentSize(swatchCount, windowWidth, columns) {
1000
1018
  const height = SWATCHES_BORDER_WIDTH * 2 + SWATCHES_PADDING * 2 + SWATCH_SIZE * rows + SWATCHES_GAP * (rows - 1);
1001
1019
  return { width, height };
1002
1020
  }
1003
- function InlineColorPicker({ id, host, value, onChange, previewValue, swatches = import_auto_paper8.defaultColors, takenValue, allowSwapTaken, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, icon = "palette", tag, labelFontFamily = MONO_FONT, autoDismiss = true, columns, size = DEFAULT_SIZE }) {
1021
+ function SwatchDrawing({ size, children }) {
1022
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native18.View, { style: [styles14.drawing, { borderRadius: size / 2, height: size, width: size }], children });
1023
+ }
1024
+ function InlineColorPicker({ id, host, value, onChange, previewValue, swatches = import_auto_paper8.defaultColors, takenValue, allowSwapTaken, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, icon = "palette", tag, labelFontFamily = MONO_FONT, autoDismiss = true, columns, size = DEFAULT_SIZE, renderSwatch, bounds }) {
1004
1025
  const ambientRotation = (0, import_core8.useRotation)();
1005
1026
  const rotation = rotationOverride ?? ambientRotation;
1006
1027
  const menuBg = dark ? "#000000" : "#FFFFFF";
1007
1028
  const { width: windowWidth } = (0, import_react_native18.useWindowDimensions)();
1008
1029
  const { width: swatchesWidth, height: swatchesHeight } = getInlineColorPickerContentSize(swatches.length, windowWidth, columns);
1009
1030
  const open = host.openId === id;
1010
- const auto = useAutoAlign(open, swatchesWidth, swatchesHeight, rotation);
1031
+ const auto = useAutoAlign(open, swatchesWidth, swatchesHeight, rotation, bounds);
1011
1032
  const placement = alignOverride ?? auto;
1012
1033
  const { maxHeight, measured, triggerRef, verticalAlign } = placement;
1013
1034
  const align = forcedAlign ?? placement.align;
@@ -1015,15 +1036,23 @@ function InlineColorPicker({ id, host, value, onChange, previewValue, swatches =
1015
1036
  const displayValue = displayFor(value);
1016
1037
  const contrastColor = (0, import_auto_paper8.getContrastColor)(displayValue);
1017
1038
  const tagFontSize = size * (tag && EMOJI_PATTERN.test(tag) ? 0.6 : 0.4);
1018
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_native18.View, { style: [styles14.anchor, open && styles14.anchorOpen], children: [
1019
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_feedback_press5.TouchableRipple, { onPress: () => host.toggle(id), borderless: true, style: [styles14.trigger, { backgroundColor: displayValue, borderRadius: size / 2, height: size, width: size }], children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native18.View, { ref: triggerRef, collapsable: false, style: styles14.triggerMeasure, children: tag ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_paper10.Text, { style: [styles14.tagLabel, { color: contrastColor, fontFamily: labelFontFamily, fontSize: tagFontSize }], numberOfLines: 1, adjustsFontSizeToFit: true, children: tag }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_paper10.Icon, { source: icon, size: size * 0.6, color: contrastColor }) }) }),
1020
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: displayValue, caretBorderWidth: SWATCHES_BORDER_WIDTH, triggerSize: size, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native18.ScrollView, { style: [styles14.swatches, { backgroundColor: menuBg, borderColor: displayValue, width: swatchesWidth, maxHeight }], contentContainerStyle: styles14.swatchesContent, showsVerticalScrollIndicator: false, children: swatches.map((swatch) => {
1039
+ const triggerDrawing = renderSwatch?.(displayValue, size, "trigger") ?? null;
1040
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native18.View, { style: [styles14.anchor, open && styles14.anchorOpen], children: [
1041
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_feedback_press6.TouchableRipple, { onPress: () => host.toggle(id), borderless: true, style: [styles14.trigger, triggerDrawing === null && { backgroundColor: displayValue }, { borderRadius: size / 2, height: size, width: size }], children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native18.View, { ref: triggerRef, collapsable: false, style: styles14.triggerMeasure, children: [
1042
+ triggerDrawing !== null && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SwatchDrawing, { size, children: triggerDrawing }),
1043
+ tag ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native_paper10.Text, { style: [styles14.tagLabel, { color: contrastColor, fontFamily: labelFontFamily, fontSize: tagFontSize }], numberOfLines: 1, adjustsFontSizeToFit: true, children: tag }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native_paper10.Icon, { source: icon, size: size * 0.6, color: contrastColor })
1044
+ ] }) }),
1045
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: displayValue, caretBorderWidth: SWATCHES_BORDER_WIDTH, triggerSize: size, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native18.ScrollView, { style: [styles14.swatches, { backgroundColor: menuBg, borderColor: displayValue, width: swatchesWidth, maxHeight }], contentContainerStyle: styles14.swatchesContent, showsVerticalScrollIndicator: false, children: swatches.map((swatch) => {
1021
1046
  const selected = swatch.value.toLowerCase() === value.toLowerCase();
1022
1047
  const taken = !selected && !!takenValue && swatch.value.toLowerCase() === takenValue.toLowerCase();
1023
1048
  const swappable = taken && allowSwapTaken;
1024
1049
  const swatchDisplay = displayFor(swatch.value);
1025
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1026
- import_feedback_press5.TouchableRipple,
1050
+ const contrast = (0, import_auto_paper8.getContrastColor)(swatchDisplay);
1051
+ const drawnSize = selected ? SWATCH_SIZE - 2 * SWATCH_RING_WIDTH : SWATCH_SIZE;
1052
+ const drawing = renderSwatch?.(swatchDisplay, drawnSize, "swatch") ?? null;
1053
+ const mark = selected ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native_paper10.Icon, { source: "check", size: 16, color: contrast }) : swappable ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native_paper10.Icon, { source: "swap-horizontal", size: 16, color: contrast }) : taken ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native_paper10.Icon, { source: "close", size: 16, color: contrast }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native18.View, {});
1054
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1055
+ import_feedback_press6.TouchableRipple,
1027
1056
  {
1028
1057
  disabled: taken && !swappable,
1029
1058
  onPress: () => {
@@ -1031,8 +1060,11 @@ function InlineColorPicker({ id, host, value, onChange, previewValue, swatches =
1031
1060
  if (autoDismiss) host.close();
1032
1061
  },
1033
1062
  borderless: true,
1034
- style: [styles14.swatch, { backgroundColor: swatchDisplay }, selected && styles14.swatchSelected, taken && !swappable && styles14.swatchTaken],
1035
- children: selected ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_paper10.Icon, { source: "check", size: 16, color: (0, import_auto_paper8.getContrastColor)(swatchDisplay) }) : swappable ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_paper10.Icon, { source: "swap-horizontal", size: 16, color: (0, import_auto_paper8.getContrastColor)(swatchDisplay) }) : taken ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_paper10.Icon, { source: "close", size: 16, color: (0, import_auto_paper8.getContrastColor)(swatchDisplay) }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native18.View, {})
1063
+ style: [styles14.swatch, drawing === null && { backgroundColor: swatchDisplay }, selected && styles14.swatchSelected, taken && !swappable && styles14.swatchTaken],
1064
+ children: drawing !== null ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native18.View, { style: styles14.swatchFace, children: [
1065
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SwatchDrawing, { size: drawnSize, children: drawing }),
1066
+ mark
1067
+ ] }) : mark
1036
1068
  },
1037
1069
  swatch.value
1038
1070
  );
@@ -1049,6 +1081,14 @@ var styles14 = import_react_native18.StyleSheet.create({
1049
1081
  anchorOpen: {
1050
1082
  zIndex: 100
1051
1083
  },
1084
+ // A renderSwatch drawing (see SwatchDrawing).
1085
+ drawing: {
1086
+ left: 0,
1087
+ overflow: "hidden",
1088
+ pointerEvents: "none",
1089
+ position: "absolute",
1090
+ top: 0
1091
+ },
1052
1092
  swatch: {
1053
1093
  alignItems: "center",
1054
1094
  borderRadius: SWATCH_SIZE / 2,
@@ -1056,9 +1096,19 @@ var styles14 = import_react_native18.StyleSheet.create({
1056
1096
  justifyContent: "center",
1057
1097
  width: SWATCH_SIZE
1058
1098
  },
1099
+ // A drawn swatch (see SwatchDrawing) and its mark: the whole circle inside the selected one's ring.
1100
+ swatchFace: {
1101
+ alignItems: "center",
1102
+ bottom: 0,
1103
+ justifyContent: "center",
1104
+ left: 0,
1105
+ position: "absolute",
1106
+ right: 0,
1107
+ top: 0
1108
+ },
1059
1109
  swatchSelected: {
1060
1110
  borderColor: "#ffffff",
1061
- borderWidth: 2
1111
+ borderWidth: SWATCH_RING_WIDTH
1062
1112
  },
1063
1113
  swatchTaken: {
1064
1114
  opacity: 0.35
@@ -1112,17 +1162,17 @@ var styles14 = import_react_native18.StyleSheet.create({
1112
1162
 
1113
1163
  // src/PressAwayOverlay.tsx
1114
1164
  var import_react_native19 = require("react-native");
1115
- var import_jsx_runtime16 = require("react/jsx-runtime");
1165
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1116
1166
  function PressAwayOverlay({ active, onPress, style }) {
1117
1167
  if (!active) return null;
1118
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native19.Pressable, { accessibilityLabel: "Dismiss", accessibilityRole: "button", onPress, style: [import_react_native19.StyleSheet.absoluteFill, style] });
1168
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native19.Pressable, { accessibilityLabel: "Dismiss", accessibilityRole: "button", onPress, style: [import_react_native19.StyleSheet.absoluteFill, style] });
1119
1169
  }
1120
1170
 
1121
1171
  // src/StaggeredWord.tsx
1122
1172
  var import_react9 = require("react");
1123
1173
  var import_react_native20 = require("react-native");
1124
1174
  var import_react_native_reanimated = __toESM(require("react-native-reanimated"));
1125
- var import_jsx_runtime17 = require("react/jsx-runtime");
1175
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1126
1176
  var STAGGER_MS = 45;
1127
1177
  var LETTER_DURATION_MS = 320;
1128
1178
  function getStaggeredWordDuration(letterCount) {
@@ -1138,10 +1188,10 @@ function AnimatedLetter({ char, index, color, reducedMotion, fontFamily, fontSiz
1138
1188
  opacity: progress.value,
1139
1189
  transform: [{ translateY: (1 - progress.value) * 12 }, { scale: 0.85 + progress.value * 0.15 }]
1140
1190
  }));
1141
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_reanimated.default.Text, { allowFontScaling: false, style: [{ color, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, style], children: char });
1191
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_reanimated.default.Text, { allowFontScaling: false, style: [{ color, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, style], children: char });
1142
1192
  }
1143
1193
  function StaggeredWord({ word, color, fontFamily, fontSize, lineHeight, reducedMotion, startIndex = 0, fontWeight = "bold", letterSpacing, style, onLayout }) {
1144
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native20.View, { style: [styles15.row, style], onLayout, children: word.split("").map((char, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(AnimatedLetter, { char, index: startIndex + i, color, reducedMotion, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, i)) });
1194
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native20.View, { style: [styles15.row, style], onLayout, children: word.split("").map((char, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(AnimatedLetter, { char, index: startIndex + i, color, reducedMotion, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, i)) });
1145
1195
  }
1146
1196
  var styles15 = import_react_native20.StyleSheet.create({
1147
1197
  row: {
@@ -1151,12 +1201,12 @@ var styles15 = import_react_native20.StyleSheet.create({
1151
1201
 
1152
1202
  // src/UpdateDialog.tsx
1153
1203
  var import_updater2 = require("@rific/updater");
1154
- var import_jsx_runtime18 = require("react/jsx-runtime");
1204
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1155
1205
  function UpdateDialog({ rotation = 0, autoCheck = true, autoPrompt = true, onError }) {
1156
1206
  const { manifest, onConfirm, respond } = useUpdateConfirmBridge();
1157
1207
  (0, import_updater2.useUpdater)({ autoCheck, autoPrompt, onConfirm, onError });
1158
1208
  const date = manifest ? new Date(manifest.createdAt) : null;
1159
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ConfirmDialog, { visible: !!manifest, title: "Update Available", message: date ? `Released ${date.toLocaleDateString()} at ${date.toLocaleTimeString()}` : "", confirmLabel: "Restart", cancelLabel: "Later", icon: "update", rotation, onConfirm: () => respond(true), onCancel: () => respond(false) });
1209
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ConfirmDialog, { visible: !!manifest, title: "Update Available", message: date ? `Released ${date.toLocaleDateString()} at ${date.toLocaleTimeString()}` : "", confirmLabel: "Restart", cancelLabel: "Later", icon: "update", rotation, onConfirm: () => respond(true), onCancel: () => respond(false) });
1160
1210
  }
1161
1211
 
1162
1212
  // src/usePopoverHost.ts
@@ -1189,6 +1239,7 @@ function usePopoverHost() {
1189
1239
  PopoverBody,
1190
1240
  PressAwayOverlay,
1191
1241
  RotatedFrame,
1242
+ SecondaryButton,
1192
1243
  StaggeredWord,
1193
1244
  StatRow,
1194
1245
  StatSection,