@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.
- package/README.md +21 -6
- package/dist/chrome/index.d.mts +14 -5
- package/dist/chrome/index.d.ts +14 -5
- package/dist/chrome/index.js +176 -125
- package/dist/chrome/index.mjs +4 -2
- package/dist/{chunk-BXG44LIA.mjs → chunk-AJD4FMG5.mjs} +65 -23
- package/dist/{chunk-PUF6TABL.mjs → chunk-CBH7GQKI.mjs} +10 -1
- package/dist/guide/index.js +40 -32
- package/dist/guide/index.mjs +3 -2
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +238 -187
- package/dist/index.mjs +8 -6
- package/package.json +6 -6
- package/src/BaseSettingsDialog.tsx +5 -3
- package/src/ConfirmDialog.tsx +2 -5
- package/src/InlineColorPicker.tsx +65 -7
- package/src/SecondaryButton.tsx +17 -0
- package/src/chrome/index.ts +3 -2
- package/src/guide/HowToPlayDialog.tsx +4 -7
- package/src/index.ts +3 -2
- package/src/useAutoAlign.ts +50 -21
package/dist/chrome/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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,
|
|
425
|
-
/* @__PURE__ */ (0,
|
|
426
|
-
/* @__PURE__ */ (0,
|
|
427
|
-
/* @__PURE__ */ (0,
|
|
428
|
-
showCancel && /* @__PURE__ */ (0,
|
|
429
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
470
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
514
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
506
515
|
function SettingIcon({ source, color, containerColor }) {
|
|
507
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
520
|
-
const { settings: soundSettings, set: setSoundSettings } = (0,
|
|
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)(
|
|
524
|
-
const { forceShort: forceHapticFeedback } = (0,
|
|
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,
|
|
549
|
-
/* @__PURE__ */ (0,
|
|
550
|
-
/* @__PURE__ */ (0,
|
|
551
|
-
/* @__PURE__ */ (0,
|
|
552
|
-
/* @__PURE__ */ (0,
|
|
553
|
-
/* @__PURE__ */ (0,
|
|
554
|
-
showLockOrientation && /* @__PURE__ */ (0,
|
|
555
|
-
/* @__PURE__ */ (0,
|
|
556
|
-
/* @__PURE__ */ (0,
|
|
557
|
-
/* @__PURE__ */ (0,
|
|
558
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
562
|
-
/* @__PURE__ */ (0,
|
|
563
|
-
/* @__PURE__ */ (0,
|
|
564
|
-
/* @__PURE__ */ (0,
|
|
565
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
569
|
-
/* @__PURE__ */ (0,
|
|
570
|
-
/* @__PURE__ */ (0,
|
|
571
|
-
/* @__PURE__ */ (0,
|
|
572
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
576
|
-
showSound && /* @__PURE__ */ (0,
|
|
577
|
-
|
|
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,
|
|
588
|
-
/* @__PURE__ */ (0,
|
|
589
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
594
|
-
|
|
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,
|
|
605
|
-
/* @__PURE__ */ (0,
|
|
606
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
612
|
-
|
|
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,
|
|
621
|
-
/* @__PURE__ */ (0,
|
|
622
|
-
/* @__PURE__ */ (0,
|
|
623
|
-
/* @__PURE__ */ (0,
|
|
624
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
631
|
-
/* @__PURE__ */ (0,
|
|
632
|
-
/* @__PURE__ */ (0,
|
|
633
|
-
showBlur && /* @__PURE__ */ (0,
|
|
634
|
-
/* @__PURE__ */ (0,
|
|
635
|
-
/* @__PURE__ */ (0,
|
|
636
|
-
/* @__PURE__ */ (0,
|
|
637
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
643
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
655
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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
|
|
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,
|
|
759
|
-
/* @__PURE__ */ (0,
|
|
760
|
-
/* @__PURE__ */ (0,
|
|
761
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
825
|
-
/* @__PURE__ */ (0,
|
|
826
|
-
/* @__PURE__ */ (0,
|
|
827
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
851
|
+
var import_feedback_press5 = require("@rific/feedback-press");
|
|
843
852
|
var import_react_native15 = require("react-native");
|
|
844
|
-
var
|
|
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,
|
|
847
|
-
/* @__PURE__ */ (0,
|
|
848
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
886
|
-
/* @__PURE__ */ (0,
|
|
887
|
-
/* @__PURE__ */ (0,
|
|
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
|
-
|
|
959
|
-
|
|
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 >
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
1019
|
-
|
|
1020
|
-
/* @__PURE__ */ (0,
|
|
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
|
-
|
|
1026
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|