@tastic/hud 0.22.0 → 0.24.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 +85 -15
- package/dist/chrome/index.d.mts +87 -18
- package/dist/chrome/index.d.ts +87 -18
- package/dist/chrome/index.js +309 -22
- package/dist/chrome/index.mjs +13 -1
- package/dist/chunk-3TCJHMJP.mjs +14 -0
- package/dist/{chunk-N7A7W72S.mjs → chunk-BXG44LIA.mjs} +298 -19
- package/dist/index.d.mts +13 -84
- package/dist/index.d.ts +13 -84
- package/dist/index.js +120 -127
- package/dist/index.mjs +107 -374
- package/dist/skia/index.d.mts +5 -0
- package/dist/skia/index.d.ts +5 -0
- package/dist/{SkiaGate.js → skia/index.js} +17 -21
- package/dist/skia/index.mjs +8 -0
- package/package.json +9 -8
- package/src/BaseSettingsDialog.tsx +13 -13
- package/src/TriggerGaugeHost.tsx +20 -14
- package/src/chrome/index.ts +12 -4
- package/src/guide/index.ts +1 -1
- package/src/index.ts +2 -2
- package/src/loadSkiaWeb.web.ts +7 -4
- package/src/locateSkiaWebFile.ts +16 -0
- package/src/skia/index.ts +12 -0
- package/dist/SkiaGate.d.mts +0 -13
- package/dist/SkiaGate.d.ts +0 -13
- package/dist/SkiaGate.mjs +0 -6
- package/dist/chunk-XEOFR236.mjs +0 -21
- package/src/SkiaGate.tsx +0 -45
- package/src/SkiaGate.web.tsx +0 -9
package/dist/index.js
CHANGED
|
@@ -38,22 +38,22 @@ __export(TriggerGauge_exports, {
|
|
|
38
38
|
function TriggerGauge({ segments, litIndices, size, accentColor, mutedColor, dashWidth, startDeg = DEFAULT_START_DEG, endDeg = startDeg }) {
|
|
39
39
|
const totalDurationMs = MOUNT_DURATION_MS + Math.max(0, segments - 1) * MOUNT_STAGGER_MS;
|
|
40
40
|
const mountProgress = (0, import_react_native_reanimated.useSharedValue)(0);
|
|
41
|
-
(0,
|
|
41
|
+
(0, import_react8.useLayoutEffect)(() => {
|
|
42
42
|
mountProgress.value = (0, import_react_native_reanimated.withTiming)(1, { duration: totalDurationMs, easing: import_react_native_reanimated.Easing.out(import_react_native_reanimated.Easing.cubic) });
|
|
43
43
|
}, []);
|
|
44
44
|
const rawSweepDeg = ((endDeg - startDeg) % 360 + 360) % 360;
|
|
45
45
|
const totalSweepDeg = rawSweepDeg === 0 ? 360 : rawSweepDeg;
|
|
46
46
|
const step = segments > 0 ? totalSweepDeg / segments : 0;
|
|
47
|
-
const centerDeg = (0,
|
|
47
|
+
const centerDeg = (0, import_react8.useCallback)((i) => startDeg + (i + 0.5) * step, [startDeg, step]);
|
|
48
48
|
const singleSelect = litIndices.length === 1;
|
|
49
49
|
const angleDeg = (0, import_react_native_reanimated.useSharedValue)(centerDeg(litIndices[0] ?? 0));
|
|
50
50
|
const litIndicesKey = [...litIndices].sort((a, b) => a - b).join(",");
|
|
51
|
-
const [transitionFrom, setTransitionFrom] = (0,
|
|
51
|
+
const [transitionFrom, setTransitionFrom] = (0, import_react8.useState)(litIndices);
|
|
52
52
|
const transitionFromKey = [...transitionFrom].sort((a, b) => a - b).join(",");
|
|
53
|
-
const lastKeyRef = (0,
|
|
54
|
-
const lastIndicesRef = (0,
|
|
53
|
+
const lastKeyRef = (0, import_react8.useRef)(litIndicesKey);
|
|
54
|
+
const lastIndicesRef = (0, import_react8.useRef)(litIndices);
|
|
55
55
|
const selectionProgress = (0, import_react_native_reanimated.useSharedValue)(1);
|
|
56
|
-
(0,
|
|
56
|
+
(0, import_react8.useLayoutEffect)(() => {
|
|
57
57
|
if (litIndicesKey !== lastKeyRef.current) {
|
|
58
58
|
if (singleSelect && lastIndicesRef.current.length === 1) {
|
|
59
59
|
angleDeg.value = (0, import_react_native_reanimated.withTiming)(centerDeg(litIndices[0]), { duration: SELECTION_TRANSITION_DURATION_MS, easing: import_react_native_reanimated.Easing.out(import_react_native_reanimated.Easing.cubic) });
|
|
@@ -82,7 +82,7 @@ function TriggerGauge({ segments, litIndices, size, accentColor, mutedColor, das
|
|
|
82
82
|
if (mountProgress.value < 1) {
|
|
83
83
|
const startFrac = i * MOUNT_STAGGER_MS / totalDurationMs;
|
|
84
84
|
const endFrac = startFrac + MOUNT_DURATION_MS / totalDurationMs;
|
|
85
|
-
local = (0,
|
|
85
|
+
local = (0, import_core8.clamp)((mountProgress.value - startFrac) / (endFrac - startFrac), 0, 1);
|
|
86
86
|
}
|
|
87
87
|
const sweep = dashAngleDeg * local;
|
|
88
88
|
if (sweep <= 0) continue;
|
|
@@ -106,7 +106,7 @@ function TriggerGauge({ segments, litIndices, size, accentColor, mutedColor, das
|
|
|
106
106
|
if (!isLitNow) continue;
|
|
107
107
|
const startFrac = i * MOUNT_STAGGER_MS / totalDurationMs;
|
|
108
108
|
const endFrac = startFrac + MOUNT_DURATION_MS / totalDurationMs;
|
|
109
|
-
local = (0,
|
|
109
|
+
local = (0, import_core8.clamp)((mountProgress.value - startFrac) / (endFrac - startFrac), 0, 1);
|
|
110
110
|
} else if (isLitNow === wasLit) {
|
|
111
111
|
local = 1;
|
|
112
112
|
} else if (isLitNow) {
|
|
@@ -130,21 +130,21 @@ function TriggerGauge({ segments, litIndices, size, accentColor, mutedColor, das
|
|
|
130
130
|
height: canvasSize,
|
|
131
131
|
width: canvasSize
|
|
132
132
|
};
|
|
133
|
-
return /* @__PURE__ */ (0,
|
|
134
|
-
/* @__PURE__ */ (0,
|
|
135
|
-
/* @__PURE__ */ (0,
|
|
133
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native17.View, { style: [styles14.container, gaugeSizeStyle], pointerEvents: "none", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_native_skia.Canvas, { style: canvasSizeStyle, children: [
|
|
134
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_skia.Path, { path: unlitPath, style: "stroke", strokeWidth: UNLIT_THICKNESS, strokeCap: "round", color: mutedColor, opacity: 0.35 }),
|
|
135
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_skia.Path, { path: litPath, style: "stroke", strokeWidth: LIT_THICKNESS, strokeCap: "round", color: accentColor, opacity: 1 })
|
|
136
136
|
] }) });
|
|
137
137
|
}
|
|
138
|
-
var import_react_native_skia,
|
|
138
|
+
var import_react_native_skia, import_core8, import_react8, import_react_native17, import_react_native_reanimated, import_jsx_runtime15, UNLIT_THICKNESS, LIT_THICKNESS, DASH_GAP_PX, ARC_GAP, DEFAULT_START_DEG, MIN_DASH_ANGLE_DEG, MOUNT_DURATION_MS, MOUNT_STAGGER_MS, SELECTION_TRANSITION_DURATION_MS, styles14;
|
|
139
139
|
var init_TriggerGauge = __esm({
|
|
140
140
|
"src/TriggerGauge.tsx"() {
|
|
141
141
|
"use strict";
|
|
142
142
|
import_react_native_skia = require("@shopify/react-native-skia");
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
import_core8 = require("@tastic/core");
|
|
144
|
+
import_react8 = require("react");
|
|
145
145
|
import_react_native17 = require("react-native");
|
|
146
146
|
import_react_native_reanimated = require("react-native-reanimated");
|
|
147
|
-
|
|
147
|
+
import_jsx_runtime15 = require("react/jsx-runtime");
|
|
148
148
|
UNLIT_THICKNESS = 3;
|
|
149
149
|
LIT_THICKNESS = 7;
|
|
150
150
|
DASH_GAP_PX = 9;
|
|
@@ -194,7 +194,6 @@ __export(index_exports, {
|
|
|
194
194
|
RotatedFrame: () => RotatedFrame,
|
|
195
195
|
SectionedDropdown: () => SectionedDropdown,
|
|
196
196
|
SharedActionBand: () => SharedActionBand,
|
|
197
|
-
SkiaGate: () => SkiaGate,
|
|
198
197
|
StaggeredWord: () => StaggeredWord,
|
|
199
198
|
StatRow: () => StatRow,
|
|
200
199
|
StatSection: () => StatSection,
|
|
@@ -209,6 +208,7 @@ __export(index_exports, {
|
|
|
209
208
|
getStaggeredWordDuration: () => getStaggeredWordDuration,
|
|
210
209
|
isCompactDialogHeight: () => isCompactDialogHeight,
|
|
211
210
|
loadSkiaWeb: () => loadSkiaWeb,
|
|
211
|
+
locateSkiaWebFile: () => locateSkiaWebFile,
|
|
212
212
|
overlayActionStyles: () => overlayActionStyles,
|
|
213
213
|
overlayStyles: () => overlayStyles,
|
|
214
214
|
useAutoAlign: () => useAutoAlign,
|
|
@@ -437,9 +437,10 @@ function ActivityStatSection({ stats, fg, fgMuted, sectionBg }) {
|
|
|
437
437
|
|
|
438
438
|
// src/BaseSettingsDialog.tsx
|
|
439
439
|
var import_auto_paper7 = require("@rific/auto-paper");
|
|
440
|
+
var import_core4 = require("@rific/core");
|
|
440
441
|
var import_feedback_press2 = require("@rific/feedback-press");
|
|
441
442
|
var import_updater = require("@rific/updater");
|
|
442
|
-
var
|
|
443
|
+
var import_core5 = require("@tastic/core");
|
|
443
444
|
var import_react6 = require("react");
|
|
444
445
|
var import_react_native13 = require("react-native");
|
|
445
446
|
var import_react_native_paper9 = require("react-native-paper");
|
|
@@ -704,18 +705,20 @@ var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
|
704
705
|
function SettingIcon({ source, color, containerColor }) {
|
|
705
706
|
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native13.View, { style: [styles10.iconBadge, { backgroundColor: containerColor }], children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Icon, { source, size: 18, color }) });
|
|
706
707
|
}
|
|
707
|
-
function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures,
|
|
708
|
+
function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, hideSound = false, hideHaptics = false, hideAppearance = false, hideUpdateCheck = false, onUpdateError, onShowHowToPlay, children }) {
|
|
708
709
|
const { colors } = (0, import_auto_paper7.useAutoPaperTheme)();
|
|
709
|
-
const ambientRotation = (0,
|
|
710
|
+
const ambientRotation = (0, import_core5.useRotation)();
|
|
710
711
|
const rotation = rotationOverride ?? ambientRotation;
|
|
711
712
|
const window = (0, import_react_native13.useWindowDimensions)();
|
|
712
713
|
const turned = rotation === 90 || rotation === -90;
|
|
713
714
|
const compactHeader = isCompactDialogHeight(turned ? window.width : window.height);
|
|
714
|
-
const insets = (0,
|
|
715
|
+
const insets = (0, import_core5.rotateInsets)((0, import_react_native_safe_area_context2.useSafeAreaInsets)(), rotation);
|
|
715
716
|
const sheetWidth = Math.min(overlayStyles.card.maxWidth, (turned ? window.height : window.width) - 2 * Math.max(insets.left, insets.right, SHEET_GUTTER));
|
|
716
|
-
const isTouchPrimary = (0,
|
|
717
|
+
const isTouchPrimary = (0, import_core5.useIsTouchPrimaryDevice)();
|
|
717
718
|
const { settings: hapticSettings, set: setHapticSettings } = (0, import_feedback_press2.useHapticSettings)();
|
|
718
719
|
const { settings: soundSettings, set: setSoundSettings } = (0, import_feedback_press2.useSoundSettings)();
|
|
720
|
+
const { settings: keepAwakeSettings, set: setKeepAwakeSettings } = (0, import_core4.useKeepAwakeSettings)();
|
|
721
|
+
const expoKeepAwake = (0, import_core4.useExpoKeepAwake)();
|
|
719
722
|
const sound = (0, import_react6.useContext)(import_feedback_press2.SoundContext);
|
|
720
723
|
const { forceShort: forceHapticFeedback } = (0, import_feedback_press2.useVibration)();
|
|
721
724
|
const { settings: themeSettings, set: setThemeSettings } = (0, import_auto_paper7.useThemeSettings)();
|
|
@@ -734,7 +737,7 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
|
|
|
734
737
|
if (visible && !opened) setOpened(true);
|
|
735
738
|
const showLockOrientation = isTouchPrimary && lockOrientation !== void 0 && onLockOrientationChange !== void 0;
|
|
736
739
|
const showEdgeGuard = import_react_native13.Platform.OS === "ios" && deferBottomEdgeGestures !== void 0 && onDeferBottomEdgeGestures !== void 0;
|
|
737
|
-
const showKeepAwake = isTouchPrimary &&
|
|
740
|
+
const showKeepAwake = isTouchPrimary && expoKeepAwake !== void 0;
|
|
738
741
|
const showHaptics = import_react_native13.Platform.OS !== "web" && !hideHaptics;
|
|
739
742
|
const showSound = !hideSound;
|
|
740
743
|
const showAppearance = !hideAppearance;
|
|
@@ -761,8 +764,8 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
|
|
|
761
764
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Require second swipe" })
|
|
762
765
|
] })
|
|
763
766
|
] }) }),
|
|
764
|
-
showKeepAwake && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press2.TouchableRipple, { onPress: () =>
|
|
765
|
-
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source:
|
|
767
|
+
showKeepAwake && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => setKeepAwakeSettings({ enabled: !keepAwakeSettings.enabled }), style: styles10.toggleButton, accessibilityLabel: `Keep awake ${keepAwakeSettings.enabled ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: styles10.toggleContent, children: [
|
|
768
|
+
/* @__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 }),
|
|
766
769
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: styles10.flexShrink, children: [
|
|
767
770
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Text, { variant: "bodyLarge", style: { color: colors.onSurface }, children: "Keep Awake" }),
|
|
768
771
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Text, { variant: "bodySmall", numberOfLines: 1, style: { color: colors.onSurfaceVariant }, children: "Stop auto-lock mid-match" })
|
|
@@ -938,14 +941,14 @@ var styles10 = import_react_native13.StyleSheet.create({
|
|
|
938
941
|
// src/BaseStatsScreen.tsx
|
|
939
942
|
var import_auto_paper8 = require("@rific/auto-paper");
|
|
940
943
|
var import_feedback_press3 = require("@rific/feedback-press");
|
|
941
|
-
var
|
|
944
|
+
var import_core6 = require("@tastic/core");
|
|
942
945
|
var import_react7 = require("react");
|
|
943
946
|
var import_react_native14 = require("react-native");
|
|
944
947
|
var import_react_native_paper10 = require("react-native-paper");
|
|
945
948
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
946
949
|
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 }) {
|
|
947
950
|
const { dark, colors } = (0, import_auto_paper8.useAutoPaperTheme)();
|
|
948
|
-
const ambientRotation = (0,
|
|
951
|
+
const ambientRotation = (0, import_core6.useRotation)();
|
|
949
952
|
const rotation = rotationOverride ?? ambientRotation;
|
|
950
953
|
const [confirmResetVisible, setConfirmResetVisible] = (0, import_react7.useState)(false);
|
|
951
954
|
const showReset = !!onReset;
|
|
@@ -1011,12 +1014,12 @@ var styles11 = import_react_native14.StyleSheet.create({
|
|
|
1011
1014
|
});
|
|
1012
1015
|
|
|
1013
1016
|
// src/ContentGutter.tsx
|
|
1014
|
-
var
|
|
1017
|
+
var import_core7 = require("@tastic/core");
|
|
1015
1018
|
var import_react_native15 = require("react-native");
|
|
1016
1019
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
1017
1020
|
function ContentGutter({ maxContentWidth, leftGutter, rightGutter, style, children }) {
|
|
1018
|
-
const { width: windowWidth } = (0,
|
|
1019
|
-
const { contentWidth, gutterWidth } = (0,
|
|
1021
|
+
const { width: windowWidth } = (0, import_core7.useRotatedWindowDimensions)();
|
|
1022
|
+
const { contentWidth, gutterWidth } = (0, import_core7.computeContentBounds)(windowWidth, maxContentWidth ?? Infinity);
|
|
1020
1023
|
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_react_native15.View, { style: [styles12.row, style], children: [
|
|
1021
1024
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native15.View, { style: [styles12.gutter, { width: gutterWidth }], children: leftGutter }),
|
|
1022
1025
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native15.View, { style: { width: contentWidth }, children }),
|
|
@@ -1035,13 +1038,13 @@ var styles12 = import_react_native15.StyleSheet.create({
|
|
|
1035
1038
|
});
|
|
1036
1039
|
|
|
1037
1040
|
// src/ControlSchemePicker.tsx
|
|
1038
|
-
var
|
|
1041
|
+
var import_core10 = require("@tastic/core");
|
|
1039
1042
|
var import_react_native20 = require("react-native");
|
|
1040
1043
|
|
|
1041
1044
|
// src/SectionedDropdown.tsx
|
|
1042
1045
|
var import_auto_paper9 = require("@rific/auto-paper");
|
|
1043
1046
|
var import_feedback_press4 = require("@rific/feedback-press");
|
|
1044
|
-
var
|
|
1047
|
+
var import_core9 = require("@tastic/core");
|
|
1045
1048
|
var import_react_native19 = require("react-native");
|
|
1046
1049
|
var import_react_native_paper11 = require("react-native-paper");
|
|
1047
1050
|
|
|
@@ -1111,29 +1114,19 @@ var styles13 = import_react_native16.StyleSheet.create({
|
|
|
1111
1114
|
}
|
|
1112
1115
|
});
|
|
1113
1116
|
|
|
1114
|
-
// src/
|
|
1115
|
-
var
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
let cancelled = false;
|
|
1121
|
-
getComponent().then((mod) => {
|
|
1122
|
-
if (!cancelled) setComponent(() => mod.default);
|
|
1123
|
-
});
|
|
1124
|
-
return () => {
|
|
1125
|
-
cancelled = true;
|
|
1126
|
-
};
|
|
1127
|
-
}, [getComponent]);
|
|
1128
|
-
if (!Component) return fallback;
|
|
1129
|
-
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Component, { ...componentProps });
|
|
1117
|
+
// src/TriggerGaugeHost.tsx
|
|
1118
|
+
var import_react9 = require("react");
|
|
1119
|
+
|
|
1120
|
+
// src/loadSkiaWeb.ts
|
|
1121
|
+
function loadSkiaWeb() {
|
|
1122
|
+
return Promise.resolve();
|
|
1130
1123
|
}
|
|
1131
1124
|
|
|
1132
1125
|
// src/TriggerGaugeHost.tsx
|
|
1133
|
-
var
|
|
1134
|
-
var
|
|
1126
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1127
|
+
var LazyTriggerGauge = (0, import_react9.lazy)(() => loadSkiaWeb().then(() => Promise.resolve().then(() => (init_TriggerGauge(), TriggerGauge_exports)).then((mod) => ({ default: mod.TriggerGauge }))));
|
|
1135
1128
|
function TriggerGaugeHost(props) {
|
|
1136
|
-
return /* @__PURE__ */ (0,
|
|
1129
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react9.Suspense, { fallback: null, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(LazyTriggerGauge, { ...props }) });
|
|
1137
1130
|
}
|
|
1138
1131
|
|
|
1139
1132
|
// src/useAutoAlign.ts
|
|
@@ -1185,7 +1178,7 @@ function useAutoAlign(open, contentWidth, contentHeight, rotation = 0) {
|
|
|
1185
1178
|
}
|
|
1186
1179
|
|
|
1187
1180
|
// src/SectionedDropdown.tsx
|
|
1188
|
-
var
|
|
1181
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1189
1182
|
var MENU_BORDER_WIDTH = 1;
|
|
1190
1183
|
var TRIGGER_SIZE = 44;
|
|
1191
1184
|
var MENU_MIN_WIDTH = 200;
|
|
@@ -1197,7 +1190,7 @@ var MENU_ITEM_HEIGHT_WITH_DESCRIPTION = 58;
|
|
|
1197
1190
|
var MENU_DIVIDER_HEIGHT = 9;
|
|
1198
1191
|
var MENU_VERTICAL_PADDING = 12;
|
|
1199
1192
|
function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accentColor, mutedColor, onAccentColor, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, autoDismiss = true, labelFontFamily = MONO_FONT, allClearLabels = { all: "All", clear: "Clear" } }) {
|
|
1200
|
-
const ambientRotation = (0,
|
|
1193
|
+
const ambientRotation = (0, import_core9.useRotation)();
|
|
1201
1194
|
const rotation = rotationOverride ?? ambientRotation;
|
|
1202
1195
|
const menuBg = dark ? "#000000" : "#FFFFFF";
|
|
1203
1196
|
const menuBorderColor = (0, import_auto_paper9.getBlendedColor)(mutedColor, menuBg, 0.5);
|
|
@@ -1238,14 +1231,14 @@ function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accen
|
|
|
1238
1231
|
const anchorStyle = [styles15.anchor, open && styles15.anchorOpen];
|
|
1239
1232
|
const menuStyle = { backgroundColor: menuBg, borderColor: menuBorderColor, maxHeight };
|
|
1240
1233
|
const dividerStyle = { backgroundColor: menuBorderColor };
|
|
1241
|
-
return /* @__PURE__ */ (0,
|
|
1242
|
-
/* @__PURE__ */ (0,
|
|
1243
|
-
/* @__PURE__ */ (0,
|
|
1244
|
-
/* @__PURE__ */ (0,
|
|
1234
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { style: anchorStyle, children: [
|
|
1235
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { ref: triggerRef, collapsable: false, style: styles15.triggerBox, children: [
|
|
1236
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TriggerGaugeHost, { segments: gaugeSegments, litIndices: gaugeLitIndices, size: TRIGGER_SIZE, accentColor, mutedColor }),
|
|
1237
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_feedback_press4.IconButton, { icon: triggerIcon, iconColor: triggerIconColor, size: triggerIconSize, accessibilityLabel, onPress: () => host.toggle(id) })
|
|
1245
1238
|
] }),
|
|
1246
|
-
/* @__PURE__ */ (0,
|
|
1247
|
-
sectionIndex > 0 && /* @__PURE__ */ (0,
|
|
1248
|
-
section.kind === "single" ? /* @__PURE__ */ (0,
|
|
1239
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: menuBorderColor, caretBorderWidth: MENU_BORDER_WIDTH, triggerSize: TRIGGER_SIZE, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native19.ScrollView, { style: [styles15.menu, menuStyle], contentContainerStyle: styles15.menuContent, showsVerticalScrollIndicator: false, children: sections.map((section, sectionIndex) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { children: [
|
|
1240
|
+
sectionIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native19.View, { style: [styles15.divider, dividerStyle] }),
|
|
1241
|
+
section.kind === "single" ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1249
1242
|
SingleSection,
|
|
1250
1243
|
{
|
|
1251
1244
|
section,
|
|
@@ -1258,7 +1251,7 @@ function SectionedDropdown({ id, host, icon, accessibilityLabel, sections, accen
|
|
|
1258
1251
|
if (autoDismiss) host.close();
|
|
1259
1252
|
}
|
|
1260
1253
|
}
|
|
1261
|
-
) : /* @__PURE__ */ (0,
|
|
1254
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(MultiSection, { section, accentColor, onAccentColor: resolvedOnAccentColor, mutedColor, labelFontFamily, allClearLabels })
|
|
1262
1255
|
] }, section.id)) }) })
|
|
1263
1256
|
] });
|
|
1264
1257
|
}
|
|
@@ -1270,18 +1263,18 @@ function SingleSection({
|
|
|
1270
1263
|
labelFontFamily,
|
|
1271
1264
|
onSelect
|
|
1272
1265
|
}) {
|
|
1273
|
-
return /* @__PURE__ */ (0,
|
|
1266
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: section.options.map((option) => {
|
|
1274
1267
|
const selected = option.value === section.value;
|
|
1275
1268
|
const taken = !selected && option.value === section.takenValue;
|
|
1276
1269
|
const rowColor = selected ? onAccentColor : mutedColor;
|
|
1277
1270
|
const itemStyle = [styles15.item, selected && { backgroundColor: accentColor }, taken && styles15.itemTaken];
|
|
1278
1271
|
const labelStyle = { fontFamily: labelFontFamily, color: rowColor, fontWeight: selected ? "bold" : "normal" };
|
|
1279
1272
|
const descriptionStyle = { fontFamily: labelFontFamily, color: rowColor };
|
|
1280
|
-
return /* @__PURE__ */ (0,
|
|
1281
|
-
option.icon && /* @__PURE__ */ (0,
|
|
1282
|
-
/* @__PURE__ */ (0,
|
|
1283
|
-
/* @__PURE__ */ (0,
|
|
1284
|
-
option.description && /* @__PURE__ */ (0,
|
|
1273
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_feedback_press4.TouchableRipple, { disabled: taken, onPress: () => onSelect(option.value), style: itemStyle, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { style: styles15.itemRow, children: [
|
|
1274
|
+
option.icon && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Icon, { source: option.icon, size: MENU_ITEM_ICON_SIZE, color: rowColor }),
|
|
1275
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { style: styles15.itemLabelColumn, children: [
|
|
1276
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: labelStyle, children: option.label }),
|
|
1277
|
+
option.description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Text, { variant: "labelSmall", style: descriptionStyle, children: option.description })
|
|
1285
1278
|
] })
|
|
1286
1279
|
] }) }, option.value);
|
|
1287
1280
|
}) });
|
|
@@ -1295,7 +1288,7 @@ function MultiSection({
|
|
|
1295
1288
|
allClearLabels
|
|
1296
1289
|
}) {
|
|
1297
1290
|
const allSelected = section.value.length === section.options.length;
|
|
1298
|
-
return /* @__PURE__ */ (0,
|
|
1291
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
|
|
1299
1292
|
section.options.map((option, i) => {
|
|
1300
1293
|
const selected = section.value.includes(option.value);
|
|
1301
1294
|
const rowColor = selected ? onAccentColor : mutedColor;
|
|
@@ -1303,12 +1296,12 @@ function MultiSection({
|
|
|
1303
1296
|
const nextSelected = selected && i < section.options.length - 1 && section.value.includes(section.options[i + 1].value);
|
|
1304
1297
|
const itemStyle = [styles15.item, selected && { backgroundColor: accentColor }, prevSelected && { borderTopLeftRadius: 0, borderTopRightRadius: 0 }, nextSelected && { borderBottomLeftRadius: 0, borderBottomRightRadius: 0 }];
|
|
1305
1298
|
const labelStyle = { fontFamily: labelFontFamily, color: rowColor, fontWeight: selected ? "bold" : "normal" };
|
|
1306
|
-
return /* @__PURE__ */ (0,
|
|
1307
|
-
option.icon && /* @__PURE__ */ (0,
|
|
1308
|
-
/* @__PURE__ */ (0,
|
|
1299
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_feedback_press4.TouchableRipple, { onPress: () => section.onChange(selected ? section.value.filter((v) => v !== option.value) : [...section.value, option.value]), style: itemStyle, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_native19.View, { style: styles15.itemRow, children: [
|
|
1300
|
+
option.icon && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Icon, { source: option.icon, size: MENU_ITEM_ICON_SIZE, color: rowColor }),
|
|
1301
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: [styles15.itemLabelFlex, labelStyle], children: option.label })
|
|
1309
1302
|
] }) }, option.value);
|
|
1310
1303
|
}),
|
|
1311
|
-
section.allClear && /* @__PURE__ */ (0,
|
|
1304
|
+
section.allClear && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_feedback_press4.TouchableRipple, { onPress: () => section.onChange(allSelected ? [] : section.options.map((o) => o.value)), style: styles15.item, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: [styles15.allClearLabel, { fontFamily: labelFontFamily, color: accentColor }], children: allSelected ? allClearLabels.clear : allClearLabels.all }) })
|
|
1312
1305
|
] });
|
|
1313
1306
|
}
|
|
1314
1307
|
var styles15 = import_react_native19.StyleSheet.create({
|
|
@@ -1381,21 +1374,21 @@ var styles15 = import_react_native19.StyleSheet.create({
|
|
|
1381
1374
|
});
|
|
1382
1375
|
|
|
1383
1376
|
// src/ControlSchemePicker.tsx
|
|
1384
|
-
var
|
|
1377
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
1385
1378
|
function ControlSchemePicker({ id, host, value, onChange, options, takenValue, accentColor, mutedColor, onAccentColor, dark, align, alignOverride, rotation, labelFontFamily }) {
|
|
1386
|
-
const isTouchPrimary = (0,
|
|
1379
|
+
const isTouchPrimary = (0, import_core10.useIsTouchPrimaryDevice)();
|
|
1387
1380
|
if (import_react_native20.Platform.OS !== "web" || isTouchPrimary) return null;
|
|
1388
|
-
return /* @__PURE__ */ (0,
|
|
1381
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SectionedDropdown, { id, host, icon: "keyboard-outline", accessibilityLabel: "Control scheme", sections: [{ kind: "single", id: "controls", options, value, onChange, takenValue }], accentColor, mutedColor, onAccentColor, dark, align, alignOverride, rotation, labelFontFamily });
|
|
1389
1382
|
}
|
|
1390
1383
|
|
|
1391
1384
|
// src/CornerActionButtons.tsx
|
|
1392
1385
|
var import_feedback_press5 = require("@rific/feedback-press");
|
|
1393
1386
|
var import_react_native21 = require("react-native");
|
|
1394
|
-
var
|
|
1387
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
1395
1388
|
function CornerActionButtons({ onBack, onSettings, fg, insets, backIcon = "arrow-left", backLabel = "Back", hitSlop }) {
|
|
1396
|
-
return /* @__PURE__ */ (0,
|
|
1397
|
-
/* @__PURE__ */ (0,
|
|
1398
|
-
/* @__PURE__ */ (0,
|
|
1389
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
|
|
1390
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_feedback_press5.IconButton, { icon: backIcon, iconColor: fg, size: 24, style: [styles16.back, { top: 8 + insets.top, left: 8 + insets.left }], hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
|
|
1391
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_feedback_press5.IconButton, { icon: "cog", iconColor: fg, size: 24, style: [styles16.topRight, { top: 8 + insets.top, right: 8 + insets.right }], hitSlop, onPress: onSettings, accessibilityLabel: "Settings" })
|
|
1399
1392
|
] });
|
|
1400
1393
|
}
|
|
1401
1394
|
var styles16 = import_react_native21.StyleSheet.create({
|
|
@@ -1410,17 +1403,17 @@ var styles16 = import_react_native21.StyleSheet.create({
|
|
|
1410
1403
|
// src/CornerStatusBadges.tsx
|
|
1411
1404
|
var import_react_native22 = require("react-native");
|
|
1412
1405
|
var import_react_native_paper12 = require("react-native-paper");
|
|
1413
|
-
var
|
|
1406
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
1414
1407
|
var BADGE_SIZE = 30;
|
|
1415
1408
|
function StatusBadge({ icon }) {
|
|
1416
|
-
return /* @__PURE__ */ (0,
|
|
1409
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_native22.View, { style: styles17.badge, children: icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_native_paper12.Icon, { source: icon, size: 16, color: "rgba(255,255,255,0.85)" }) });
|
|
1417
1410
|
}
|
|
1418
1411
|
function CornerStatusBadges({ orientationMode, p1OnRight, p1, p2 }) {
|
|
1419
1412
|
const p1OnRightSide = orientationMode === "sideBySide" && p1OnRight;
|
|
1420
1413
|
const p2OnLeftSide = orientationMode === "sideBySide" && !p1OnRight;
|
|
1421
|
-
return /* @__PURE__ */ (0,
|
|
1422
|
-
p1 && /* @__PURE__ */ (0,
|
|
1423
|
-
p2 && /* @__PURE__ */ (0,
|
|
1414
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
|
|
1415
|
+
p1 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_native22.View, { pointerEvents: "none", style: p1OnRightSide ? styles17.bottomRight : styles17.bottomLeft, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StatusBadge, { icon: p1.icon }) }),
|
|
1416
|
+
p2 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_native22.View, { pointerEvents: "none", style: p2OnLeftSide ? styles17.topLeft : styles17.topRight, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(StatusBadge, { icon: p2.icon }) })
|
|
1424
1417
|
] });
|
|
1425
1418
|
}
|
|
1426
1419
|
var styles17 = import_react_native22.StyleSheet.create({
|
|
@@ -1444,10 +1437,10 @@ var styles17 = import_react_native22.StyleSheet.create({
|
|
|
1444
1437
|
// src/InlineColorPicker.tsx
|
|
1445
1438
|
var import_auto_paper10 = require("@rific/auto-paper");
|
|
1446
1439
|
var import_feedback_press6 = require("@rific/feedback-press");
|
|
1447
|
-
var
|
|
1440
|
+
var import_core11 = require("@tastic/core");
|
|
1448
1441
|
var import_react_native23 = require("react-native");
|
|
1449
1442
|
var import_react_native_paper13 = require("react-native-paper");
|
|
1450
|
-
var
|
|
1443
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
1451
1444
|
var EMOJI_PATTERN = /\p{Extended_Pictographic}/u;
|
|
1452
1445
|
var DEFAULT_SIZE = 48;
|
|
1453
1446
|
var SWATCH_SIZE = 28;
|
|
@@ -1461,7 +1454,7 @@ function widthForColumns(columns) {
|
|
|
1461
1454
|
return SWATCHES_BORDER_WIDTH * 2 + SWATCHES_PADDING * 2 + SWATCH_SIZE * columns + SWATCHES_GAP * (columns - 1);
|
|
1462
1455
|
}
|
|
1463
1456
|
function getInlineColorPickerContentSize(swatchCount, windowWidth, columns) {
|
|
1464
|
-
const autoColumns = (0,
|
|
1457
|
+
const autoColumns = (0, import_core11.clamp)(Math.floor((windowWidth - 2 * SCREEN_MARGIN + SWATCHES_GAP) / (SWATCH_SIZE + SWATCHES_GAP)), MIN_COLUMNS, MAX_COLUMNS);
|
|
1465
1458
|
const resolvedColumns = columns ?? autoColumns;
|
|
1466
1459
|
const width = widthForColumns(resolvedColumns);
|
|
1467
1460
|
const rows = Math.ceil(swatchCount / resolvedColumns);
|
|
@@ -1469,7 +1462,7 @@ function getInlineColorPickerContentSize(swatchCount, windowWidth, columns) {
|
|
|
1469
1462
|
return { width, height };
|
|
1470
1463
|
}
|
|
1471
1464
|
function InlineColorPicker({ id, host, value, onChange, previewValue, swatches = import_auto_paper10.defaultColors, takenValue, allowSwapTaken, dark, align: forcedAlign, alignOverride, rotation: rotationOverride, icon = "palette", tag, labelFontFamily = MONO_FONT, autoDismiss = true, columns, size = DEFAULT_SIZE }) {
|
|
1472
|
-
const ambientRotation = (0,
|
|
1465
|
+
const ambientRotation = (0, import_core11.useRotation)();
|
|
1473
1466
|
const rotation = rotationOverride ?? ambientRotation;
|
|
1474
1467
|
const menuBg = dark ? "#000000" : "#FFFFFF";
|
|
1475
1468
|
const { width: windowWidth } = (0, import_react_native23.useWindowDimensions)();
|
|
@@ -1483,14 +1476,14 @@ function InlineColorPicker({ id, host, value, onChange, previewValue, swatches =
|
|
|
1483
1476
|
const displayValue = displayFor(value);
|
|
1484
1477
|
const contrastColor = (0, import_auto_paper10.getContrastColor)(displayValue);
|
|
1485
1478
|
const tagFontSize = size * (tag && EMOJI_PATTERN.test(tag) ? 0.6 : 0.4);
|
|
1486
|
-
return /* @__PURE__ */ (0,
|
|
1487
|
-
/* @__PURE__ */ (0,
|
|
1488
|
-
/* @__PURE__ */ (0,
|
|
1479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_react_native23.View, { style: [styles18.anchor, open && styles18.anchorOpen], children: [
|
|
1480
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_feedback_press6.TouchableRipple, { onPress: () => host.toggle(id), borderless: true, style: [styles18.trigger, { backgroundColor: displayValue, borderRadius: size / 2, height: size, width: size }], children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native23.View, { ref: triggerRef, collapsable: false, style: styles18.triggerMeasure, children: tag ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper13.Text, { style: [styles18.tagLabel, { color: contrastColor, fontFamily: labelFontFamily, fontSize: tagFontSize }], numberOfLines: 1, adjustsFontSizeToFit: true, children: tag }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper13.Icon, { source: icon, size: size * 0.6, color: contrastColor }) }) }),
|
|
1481
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: displayValue, caretBorderWidth: SWATCHES_BORDER_WIDTH, triggerSize: size, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native23.ScrollView, { style: [styles18.swatches, { backgroundColor: menuBg, borderColor: displayValue, width: swatchesWidth, maxHeight }], contentContainerStyle: styles18.swatchesContent, showsVerticalScrollIndicator: false, children: swatches.map((swatch) => {
|
|
1489
1482
|
const selected = swatch.value.toLowerCase() === value.toLowerCase();
|
|
1490
1483
|
const taken = !selected && !!takenValue && swatch.value.toLowerCase() === takenValue.toLowerCase();
|
|
1491
1484
|
const swappable = taken && allowSwapTaken;
|
|
1492
1485
|
const swatchDisplay = displayFor(swatch.value);
|
|
1493
|
-
return /* @__PURE__ */ (0,
|
|
1486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
1494
1487
|
import_feedback_press6.TouchableRipple,
|
|
1495
1488
|
{
|
|
1496
1489
|
disabled: taken && !swappable,
|
|
@@ -1500,7 +1493,7 @@ function InlineColorPicker({ id, host, value, onChange, previewValue, swatches =
|
|
|
1500
1493
|
},
|
|
1501
1494
|
borderless: true,
|
|
1502
1495
|
style: [styles18.swatch, { backgroundColor: swatchDisplay }, selected && styles18.swatchSelected, taken && !swappable && styles18.swatchTaken],
|
|
1503
|
-
children: selected ? /* @__PURE__ */ (0,
|
|
1496
|
+
children: selected ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper13.Icon, { source: "check", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : swappable ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper13.Icon, { source: "swap-horizontal", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : taken ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper13.Icon, { source: "close", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native23.View, {})
|
|
1504
1497
|
},
|
|
1505
1498
|
swatch.value
|
|
1506
1499
|
);
|
|
@@ -1583,7 +1576,7 @@ var import_auto_paper11 = require("@rific/auto-paper");
|
|
|
1583
1576
|
var import_feedback_press7 = require("@rific/feedback-press");
|
|
1584
1577
|
var import_react_native24 = require("react-native");
|
|
1585
1578
|
var import_react_native_paper14 = require("react-native-paper");
|
|
1586
|
-
var
|
|
1579
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
1587
1580
|
var TRIGGER_HEIGHT = 28;
|
|
1588
1581
|
var POPOVER_WIDTH = 180;
|
|
1589
1582
|
var ROW_HEIGHT = 36;
|
|
@@ -1606,17 +1599,17 @@ function LabeledDropdown({ id, host, options, value, onChange, color, dark, alig
|
|
|
1606
1599
|
onChange(option.value);
|
|
1607
1600
|
host.close();
|
|
1608
1601
|
};
|
|
1609
|
-
return /* @__PURE__ */ (0,
|
|
1610
|
-
/* @__PURE__ */ (0,
|
|
1611
|
-
/* @__PURE__ */ (0,
|
|
1612
|
-
/* @__PURE__ */ (0,
|
|
1602
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_native24.View, { style: [styles19.anchor, open && styles19.anchorOpen], children: [
|
|
1603
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_feedback_press7.TouchableRipple, { onPress: () => host.toggle(id), style: styles19.trigger, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_native24.View, { ref: triggerRef, collapsable: false, style: styles19.triggerInner, children: [
|
|
1604
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper14.Text, { style: [styles19.triggerLabel, { color }], numberOfLines: 1, children: (selected?.label ?? "").toUpperCase() }),
|
|
1605
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper14.Icon, { source: "menu-down", size: 16, color })
|
|
1613
1606
|
] }) }),
|
|
1614
|
-
/* @__PURE__ */ (0,
|
|
1607
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: color, caretBorderWidth: 2, triggerSize: TRIGGER_HEIGHT, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native24.ScrollView, { style: [styles19.menu, { backgroundColor: menuBg, borderColor: color, width: POPOVER_WIDTH, maxHeight }], contentContainerStyle: styles19.menuContent, showsVerticalScrollIndicator: false, children: options.map((option) => {
|
|
1615
1608
|
const isSelected = option.value === value;
|
|
1616
1609
|
const onColor = (0, import_auto_paper11.getContrastColor)(color);
|
|
1617
|
-
return /* @__PURE__ */ (0,
|
|
1618
|
-
option.icon && /* @__PURE__ */ (0,
|
|
1619
|
-
/* @__PURE__ */ (0,
|
|
1610
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_feedback_press7.TouchableRipple, { onPress: () => handleSelect(option), style: [styles19.row, isSelected && { backgroundColor: color }], children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_native24.View, { style: styles19.rowInner, children: [
|
|
1611
|
+
option.icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper14.Icon, { source: option.icon, size: 18, color: isSelected ? onColor : fg }),
|
|
1612
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper14.Text, { style: [styles19.rowLabel, { color: isSelected ? onColor : fg }], numberOfLines: 1, children: option.label })
|
|
1620
1613
|
] }) }, option.value);
|
|
1621
1614
|
}) }) })
|
|
1622
1615
|
] });
|
|
@@ -1673,9 +1666,9 @@ var styles19 = import_react_native24.StyleSheet.create({
|
|
|
1673
1666
|
}
|
|
1674
1667
|
});
|
|
1675
1668
|
|
|
1676
|
-
// src/
|
|
1677
|
-
function
|
|
1678
|
-
return
|
|
1669
|
+
// src/locateSkiaWebFile.ts
|
|
1670
|
+
function locateSkiaWebFile(file) {
|
|
1671
|
+
return `${process.env.EXPO_BASE_URL ?? ""}/${file}`;
|
|
1679
1672
|
}
|
|
1680
1673
|
|
|
1681
1674
|
// src/PlayerSetupPanel.tsx
|
|
@@ -1687,12 +1680,12 @@ var import_react_native_paper16 = require("react-native-paper");
|
|
|
1687
1680
|
var import_feedback_press8 = require("@rific/feedback-press");
|
|
1688
1681
|
var import_react_native25 = require("react-native");
|
|
1689
1682
|
var import_react_native_paper15 = require("react-native-paper");
|
|
1690
|
-
var
|
|
1683
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
1691
1684
|
function ReadyButton({ color, ready, onToggleReady, style, labelFontFamily = MONO_FONT }) {
|
|
1692
1685
|
const readyButtonStyle = [styles20.readyButton, { borderColor: color }, ready && { backgroundColor: color }, style];
|
|
1693
1686
|
const labelTextStyle = { fontFamily: labelFontFamily, fontWeight: "bold" };
|
|
1694
1687
|
const labelColorStyle = { color: ready ? "#000000" : color };
|
|
1695
|
-
return /* @__PURE__ */ (0,
|
|
1688
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_feedback_press8.TouchableRipple, { onPress: onToggleReady, borderless: true, style: readyButtonStyle, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_native_paper15.Text, { variant: "labelLarge", style: [labelTextStyle, labelColorStyle], children: ready ? "READY \u2713" : "READY?" }) });
|
|
1696
1689
|
}
|
|
1697
1690
|
var styles20 = import_react_native25.StyleSheet.create({
|
|
1698
1691
|
readyButton: {
|
|
@@ -1757,7 +1750,7 @@ function useZoneClampedAlign(open, contentWidth, contentHeight, rotation = 0) {
|
|
|
1757
1750
|
}
|
|
1758
1751
|
|
|
1759
1752
|
// src/PlayerSetupPanel.tsx
|
|
1760
|
-
var
|
|
1753
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
1761
1754
|
function getColorPopoverId(idPrefix) {
|
|
1762
1755
|
return `${idPrefix}-color`;
|
|
1763
1756
|
}
|
|
@@ -1780,13 +1773,13 @@ function PlayerSetupPanel({ idPrefix, host, label, labelFontFamily, color, onCol
|
|
|
1780
1773
|
const seatPickerId = showProfilePicker ? getProfilePopoverId(idPrefix) : getCpuDifficultyPopoverId(idPrefix);
|
|
1781
1774
|
const seatPickerSize = showProfilePicker ? (0, import_profile2.getProfilePickerContentSize)(profiles.length, !!onManageProfiles, colorSection) : (0, import_profile2.getOptionPickerContentSize)(cpuDifficultyOptions?.length ?? 0, colorSection);
|
|
1782
1775
|
const seatPickerAlign = useZoneClampedAlign(seatButton && popover.openId === seatPickerId, seatPickerSize.width, seatPickerSize.height);
|
|
1783
|
-
return /* @__PURE__ */ (0,
|
|
1784
|
-
showProfilePicker ? /* @__PURE__ */ (0,
|
|
1785
|
-
(!seatButton || secondPicker) && /* @__PURE__ */ (0,
|
|
1786
|
-
!seatButton && /* @__PURE__ */ (0,
|
|
1776
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_react_native27.View, { style: [styles21.panel, ownPopoverOpen && styles21.panelOpen], children: [
|
|
1777
|
+
showProfilePicker ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_profile2.ProfilePicker, { idPrefix, host: popover, profiles, selectedId: selectedProfileId ?? null, takenId: takenProfileId, color, dark, guestLabel: guestLabel ?? "GUEST", onSelect: (profile) => onProfileSelect?.(profile), onManage: onManageProfiles, colorSection, alignOverride: seatPickerAlign }) : showCpuDifficulty ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_profile2.OptionPicker, { id: getCpuDifficultyPopoverId(idPrefix), host: popover, options: cpuDifficultyOptions, value: cpuDifficulty, onChange: onCpuDifficultyChange, color, dark, icon: cpuIcon, colorSection, alignOverride: seatPickerAlign }) : label && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_native_paper16.Text, { variant: "labelSmall", style: { color, fontFamily: labelFontFamily }, children: label }),
|
|
1778
|
+
(!seatButton || secondPicker) && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_react_native27.View, { style: [styles21.pickerRow, pickerRowPopoverOpen && styles21.pickerRowOpen], children: [
|
|
1779
|
+
!seatButton && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(InlineColorPicker, { id: getColorPopoverId(idPrefix), host: popover, value: color, onChange: onColorChange, swatches, takenValue: takenColor, allowSwapTaken, alignOverride: colorAlignOverride, rotation: colorRotation, dark, tag: isHuman ? selectedProfile?.tag : void 0, icon: isHuman ? humanIcon : cpuIcon }),
|
|
1787
1780
|
secondPicker
|
|
1788
1781
|
] }),
|
|
1789
|
-
isHuman && showReadyButton && onToggleReady && /* @__PURE__ */ (0,
|
|
1782
|
+
isHuman && showReadyButton && onToggleReady && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ReadyButton, { color, ready: ready ?? false, onToggleReady })
|
|
1790
1783
|
] });
|
|
1791
1784
|
}
|
|
1792
1785
|
var styles21 = import_react_native27.StyleSheet.create({
|
|
@@ -1822,23 +1815,23 @@ var styles21 = import_react_native27.StyleSheet.create({
|
|
|
1822
1815
|
|
|
1823
1816
|
// src/PressAwayOverlay.tsx
|
|
1824
1817
|
var import_react_native28 = require("react-native");
|
|
1825
|
-
var
|
|
1818
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
1826
1819
|
function PressAwayOverlay({ active, onPress, style }) {
|
|
1827
1820
|
if (!active) return null;
|
|
1828
|
-
return /* @__PURE__ */ (0,
|
|
1821
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_native28.Pressable, { accessibilityLabel: "Dismiss", accessibilityRole: "button", onPress, style: [import_react_native28.StyleSheet.absoluteFill, style] });
|
|
1829
1822
|
}
|
|
1830
1823
|
|
|
1831
1824
|
// src/SharedActionBand.tsx
|
|
1832
1825
|
var import_feedback_press9 = require("@rific/feedback-press");
|
|
1833
1826
|
var import_react_native29 = require("react-native");
|
|
1834
|
-
var
|
|
1827
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1835
1828
|
function SharedActionBand({ onBack, onSettings, onRandomize, onReset, fg, popoverOpen, children }) {
|
|
1836
|
-
return /* @__PURE__ */ (0,
|
|
1837
|
-
/* @__PURE__ */ (0,
|
|
1838
|
-
/* @__PURE__ */ (0,
|
|
1839
|
-
onRandomize && /* @__PURE__ */ (0,
|
|
1840
|
-
onReset && /* @__PURE__ */ (0,
|
|
1841
|
-
/* @__PURE__ */ (0,
|
|
1829
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_native29.View, { style: [styles22.column, popoverOpen && styles22.columnOpen], children: [
|
|
1830
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_native29.View, { style: styles22.actionsRow, children: [
|
|
1831
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_feedback_press9.IconButton, { icon: "arrow-left", iconColor: fg, size: 20, onPress: onBack, accessibilityLabel: "Back" }),
|
|
1832
|
+
onRandomize && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_feedback_press9.IconButton, { icon: "dice-multiple", iconColor: fg, size: 18, onPress: onRandomize, accessibilityLabel: "Randomize match settings" }),
|
|
1833
|
+
onReset && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_feedback_press9.IconButton, { icon: "restore", iconColor: fg, size: 18, onPress: onReset, accessibilityLabel: "Reset match settings to defaults" }),
|
|
1834
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_feedback_press9.IconButton, { icon: "cog", iconColor: fg, size: 20, onPress: onSettings, accessibilityLabel: "Settings" })
|
|
1842
1835
|
] }),
|
|
1843
1836
|
children
|
|
1844
1837
|
] });
|
|
@@ -1862,7 +1855,7 @@ var styles22 = import_react_native29.StyleSheet.create({
|
|
|
1862
1855
|
var import_react13 = require("react");
|
|
1863
1856
|
var import_react_native30 = require("react-native");
|
|
1864
1857
|
var import_react_native_reanimated2 = __toESM(require("react-native-reanimated"));
|
|
1865
|
-
var
|
|
1858
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1866
1859
|
var STAGGER_MS = 45;
|
|
1867
1860
|
var LETTER_DURATION_MS = 320;
|
|
1868
1861
|
function getStaggeredWordDuration(letterCount) {
|
|
@@ -1878,10 +1871,10 @@ function AnimatedLetter({ char, index, color, reducedMotion, fontFamily, fontSiz
|
|
|
1878
1871
|
opacity: progress.value,
|
|
1879
1872
|
transform: [{ translateY: (1 - progress.value) * 12 }, { scale: 0.85 + progress.value * 0.15 }]
|
|
1880
1873
|
}));
|
|
1881
|
-
return /* @__PURE__ */ (0,
|
|
1874
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_native_reanimated2.default.Text, { allowFontScaling: false, style: [{ color, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, style], children: char });
|
|
1882
1875
|
}
|
|
1883
1876
|
function StaggeredWord({ word, color, fontFamily, fontSize, lineHeight, reducedMotion, startIndex = 0, fontWeight = "bold", letterSpacing, style, onLayout }) {
|
|
1884
|
-
return /* @__PURE__ */ (0,
|
|
1877
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_native30.View, { style: [styles23.row, style], onLayout, children: word.split("").map((char, i) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(AnimatedLetter, { char, index: startIndex + i, color, reducedMotion, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, i)) });
|
|
1885
1878
|
}
|
|
1886
1879
|
var styles23 = import_react_native30.StyleSheet.create({
|
|
1887
1880
|
row: {
|
|
@@ -1891,12 +1884,12 @@ var styles23 = import_react_native30.StyleSheet.create({
|
|
|
1891
1884
|
|
|
1892
1885
|
// src/UpdateDialog.tsx
|
|
1893
1886
|
var import_updater2 = require("@rific/updater");
|
|
1894
|
-
var
|
|
1887
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1895
1888
|
function UpdateDialog({ rotation = 0, autoCheck = true, autoPrompt = true, onError }) {
|
|
1896
1889
|
const { manifest, onConfirm, respond } = useUpdateConfirmBridge();
|
|
1897
1890
|
(0, import_updater2.useUpdater)({ autoCheck, autoPrompt, onConfirm, onError });
|
|
1898
1891
|
const date = manifest ? new Date(manifest.createdAt) : null;
|
|
1899
|
-
return /* @__PURE__ */ (0,
|
|
1892
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.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) });
|
|
1900
1893
|
}
|
|
1901
1894
|
|
|
1902
1895
|
// src/useQuitConfirmation.ts
|
|
@@ -1947,7 +1940,6 @@ function useQuitConfirmation(hasProgress, onConfirmedBack) {
|
|
|
1947
1940
|
RotatedFrame,
|
|
1948
1941
|
SectionedDropdown,
|
|
1949
1942
|
SharedActionBand,
|
|
1950
|
-
SkiaGate,
|
|
1951
1943
|
StaggeredWord,
|
|
1952
1944
|
StatRow,
|
|
1953
1945
|
StatSection,
|
|
@@ -1962,6 +1954,7 @@ function useQuitConfirmation(hasProgress, onConfirmedBack) {
|
|
|
1962
1954
|
getStaggeredWordDuration,
|
|
1963
1955
|
isCompactDialogHeight,
|
|
1964
1956
|
loadSkiaWeb,
|
|
1957
|
+
locateSkiaWebFile,
|
|
1965
1958
|
overlayActionStyles,
|
|
1966
1959
|
overlayStyles,
|
|
1967
1960
|
useAutoAlign,
|