@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/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, import_react9.useLayoutEffect)(() => {
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, import_react9.useCallback)((i) => startDeg + (i + 0.5) * step, [startDeg, step]);
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, import_react9.useState)(litIndices);
51
+ const [transitionFrom, setTransitionFrom] = (0, import_react8.useState)(litIndices);
52
52
  const transitionFromKey = [...transitionFrom].sort((a, b) => a - b).join(",");
53
- const lastKeyRef = (0, import_react9.useRef)(litIndicesKey);
54
- const lastIndicesRef = (0, import_react9.useRef)(litIndices);
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, import_react9.useLayoutEffect)(() => {
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, import_core7.clamp)((mountProgress.value - startFrac) / (endFrac - startFrac), 0, 1);
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, import_core7.clamp)((mountProgress.value - startFrac) / (endFrac - startFrac), 0, 1);
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, import_jsx_runtime16.jsx)(import_react_native17.View, { style: [styles14.container, gaugeSizeStyle], pointerEvents: "none", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native_skia.Canvas, { style: canvasSizeStyle, children: [
134
- /* @__PURE__ */ (0, import_jsx_runtime16.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_runtime16.jsx)(import_react_native_skia.Path, { path: litPath, style: "stroke", strokeWidth: LIT_THICKNESS, strokeCap: "round", color: accentColor, opacity: 1 })
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, import_core7, import_react9, import_react_native17, import_react_native_reanimated, import_jsx_runtime16, 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;
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
- import_core7 = require("@tastic/core");
144
- import_react9 = require("react");
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
- import_jsx_runtime16 = require("react/jsx-runtime");
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 import_core4 = require("@tastic/core");
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, keepAwake, onKeepAwakeChange, hideSound = false, hideHaptics = false, hideAppearance = false, hideUpdateCheck = false, onUpdateError, onShowHowToPlay, children }) {
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, import_core4.useRotation)();
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, import_core4.rotateInsets)((0, import_react_native_safe_area_context2.useSafeAreaInsets)(), rotation);
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, import_core4.useIsTouchPrimaryDevice)();
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 && keepAwake !== void 0 && onKeepAwakeChange !== void 0;
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: () => onKeepAwakeChange(!keepAwake), style: styles10.toggleButton, accessibilityLabel: `Keep awake ${keepAwake ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.View, { style: styles10.toggleContent, children: [
765
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SettingIcon, { source: keepAwake ? "eye" : "eye-closed", color: keepAwake ? colors.tertiary : colors.onSurfaceVariant, containerColor: keepAwake ? colors.tertiaryContainer : colors.surfaceVariant }),
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 import_core5 = require("@tastic/core");
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, import_core5.useRotation)();
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 import_core6 = require("@tastic/core");
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, import_core6.useRotatedWindowDimensions)();
1019
- const { contentWidth, gutterWidth } = (0, import_core6.computeContentBounds)(windowWidth, maxContentWidth ?? Infinity);
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 import_core9 = require("@tastic/core");
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 import_core8 = require("@tastic/core");
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/SkiaGate.tsx
1115
- var import_react8 = require("react");
1116
- var import_jsx_runtime15 = require("react/jsx-runtime");
1117
- function SkiaGate({ getComponent, componentProps, fallback = null }) {
1118
- const [Component, setComponent] = (0, import_react8.useState)(null);
1119
- (0, import_react8.useEffect)(() => {
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 import_jsx_runtime17 = require("react/jsx-runtime");
1134
- var getTriggerGauge = () => Promise.resolve().then(() => (init_TriggerGauge(), TriggerGauge_exports)).then((mod) => ({ default: mod.TriggerGauge }));
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, import_jsx_runtime17.jsx)(SkiaGate, { getComponent: getTriggerGauge, componentProps: props });
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 import_jsx_runtime18 = require("react/jsx-runtime");
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, import_core8.useRotation)();
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, import_jsx_runtime18.jsxs)(import_react_native19.View, { style: anchorStyle, children: [
1242
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_native19.View, { ref: triggerRef, collapsable: false, style: styles15.triggerBox, children: [
1243
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TriggerGaugeHost, { segments: gaugeSegments, litIndices: gaugeLitIndices, size: TRIGGER_SIZE, accentColor, mutedColor }),
1244
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_feedback_press4.IconButton, { icon: triggerIcon, iconColor: triggerIconColor, size: triggerIconSize, accessibilityLabel, onPress: () => host.toggle(id) })
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, import_jsx_runtime18.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: menuBorderColor, caretBorderWidth: MENU_BORDER_WIDTH, triggerSize: TRIGGER_SIZE, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native19.ScrollView, { style: [styles15.menu, menuStyle], contentContainerStyle: styles15.menuContent, showsVerticalScrollIndicator: false, children: sections.map((section, sectionIndex) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_native19.View, { children: [
1247
- sectionIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native19.View, { style: [styles15.divider, dividerStyle] }),
1248
- section.kind === "single" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
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, import_jsx_runtime18.jsx)(MultiSection, { section, accentColor, onAccentColor: resolvedOnAccentColor, mutedColor, labelFontFamily, allClearLabels })
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, import_jsx_runtime18.jsx)(import_jsx_runtime18.Fragment, { children: section.options.map((option) => {
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, import_jsx_runtime18.jsx)(import_feedback_press4.TouchableRipple, { disabled: taken, onPress: () => onSelect(option.value), style: itemStyle, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_native19.View, { style: styles15.itemRow, children: [
1281
- option.icon && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Icon, { source: option.icon, size: MENU_ITEM_ICON_SIZE, color: rowColor }),
1282
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_native19.View, { style: styles15.itemLabelColumn, children: [
1283
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: labelStyle, children: option.label }),
1284
- option.description && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Text, { variant: "labelSmall", style: descriptionStyle, children: option.description })
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, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
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, import_jsx_runtime18.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_runtime18.jsxs)(import_react_native19.View, { style: styles15.itemRow, children: [
1307
- option.icon && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Icon, { source: option.icon, size: MENU_ITEM_ICON_SIZE, color: rowColor }),
1308
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: [styles15.itemLabelFlex, labelStyle], children: option.label })
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, import_jsx_runtime18.jsx)(import_feedback_press4.TouchableRipple, { onPress: () => section.onChange(allSelected ? [] : section.options.map((o) => o.value)), style: styles15.item, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native_paper11.Text, { variant: "labelLarge", style: [styles15.allClearLabel, { fontFamily: labelFontFamily, color: accentColor }], children: allSelected ? allClearLabels.clear : allClearLabels.all }) })
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 import_jsx_runtime19 = require("react/jsx-runtime");
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, import_core9.useIsTouchPrimaryDevice)();
1379
+ const isTouchPrimary = (0, import_core10.useIsTouchPrimaryDevice)();
1387
1380
  if (import_react_native20.Platform.OS !== "web" || isTouchPrimary) return null;
1388
- return /* @__PURE__ */ (0, import_jsx_runtime19.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 });
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 import_jsx_runtime20 = require("react/jsx-runtime");
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, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
1397
- /* @__PURE__ */ (0, import_jsx_runtime20.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 }),
1398
- /* @__PURE__ */ (0, import_jsx_runtime20.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" })
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 import_jsx_runtime21 = require("react/jsx-runtime");
1406
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1414
1407
  var BADGE_SIZE = 30;
1415
1408
  function StatusBadge({ icon }) {
1416
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native22.View, { style: styles17.badge, children: icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native_paper12.Icon, { source: icon, size: 16, color: "rgba(255,255,255,0.85)" }) });
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, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
1422
- p1 && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native22.View, { pointerEvents: "none", style: p1OnRightSide ? styles17.bottomRight : styles17.bottomLeft, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StatusBadge, { icon: p1.icon }) }),
1423
- p2 && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native22.View, { pointerEvents: "none", style: p2OnLeftSide ? styles17.topLeft : styles17.topRight, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StatusBadge, { icon: p2.icon }) })
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 import_core10 = require("@tastic/core");
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 import_jsx_runtime22 = require("react/jsx-runtime");
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, import_core10.clamp)(Math.floor((windowWidth - 2 * SCREEN_MARGIN + SWATCHES_GAP) / (SWATCH_SIZE + SWATCHES_GAP)), MIN_COLUMNS, MAX_COLUMNS);
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, import_core10.useRotation)();
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, import_jsx_runtime22.jsxs)(import_react_native23.View, { style: [styles18.anchor, open && styles18.anchorOpen], children: [
1487
- /* @__PURE__ */ (0, import_jsx_runtime22.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_runtime22.jsx)(import_react_native23.View, { ref: triggerRef, collapsable: false, style: styles18.triggerMeasure, children: tag ? /* @__PURE__ */ (0, import_jsx_runtime22.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_runtime22.jsx)(import_react_native_paper13.Icon, { source: icon, size: size * 0.6, color: contrastColor }) }) }),
1488
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: displayValue, caretBorderWidth: SWATCHES_BORDER_WIDTH, triggerSize: size, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native23.ScrollView, { style: [styles18.swatches, { backgroundColor: menuBg, borderColor: displayValue, width: swatchesWidth, maxHeight }], contentContainerStyle: styles18.swatchesContent, showsVerticalScrollIndicator: false, children: swatches.map((swatch) => {
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, import_jsx_runtime22.jsx)(
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, import_jsx_runtime22.jsx)(import_react_native_paper13.Icon, { source: "check", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : swappable ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper13.Icon, { source: "swap-horizontal", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : taken ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native_paper13.Icon, { source: "close", size: 16, color: (0, import_auto_paper10.getContrastColor)(swatchDisplay) }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native23.View, {})
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 import_jsx_runtime23 = require("react/jsx-runtime");
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, import_jsx_runtime23.jsxs)(import_react_native24.View, { style: [styles19.anchor, open && styles19.anchorOpen], children: [
1610
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_feedback_press7.TouchableRipple, { onPress: () => host.toggle(id), style: styles19.trigger, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_react_native24.View, { ref: triggerRef, collapsable: false, style: styles19.triggerInner, children: [
1611
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_native_paper14.Text, { style: [styles19.triggerLabel, { color }], numberOfLines: 1, children: (selected?.label ?? "").toUpperCase() }),
1612
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_native_paper14.Icon, { source: "menu-down", size: 16, color })
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, import_jsx_runtime23.jsx)(PopoverBody, { visible: open && measured, align, verticalAlign, caretColor: menuBg, caretBorderColor: color, caretBorderWidth: 2, triggerSize: TRIGGER_HEIGHT, children: /* @__PURE__ */ (0, import_jsx_runtime23.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) => {
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, import_jsx_runtime23.jsx)(import_feedback_press7.TouchableRipple, { onPress: () => handleSelect(option), style: [styles19.row, isSelected && { backgroundColor: color }], children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_react_native24.View, { style: styles19.rowInner, children: [
1618
- option.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_native_paper14.Icon, { source: option.icon, size: 18, color: isSelected ? onColor : fg }),
1619
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_native_paper14.Text, { style: [styles19.rowLabel, { color: isSelected ? onColor : fg }], numberOfLines: 1, children: option.label })
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/loadSkiaWeb.ts
1677
- function loadSkiaWeb() {
1678
- return Promise.resolve();
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 import_jsx_runtime24 = require("react/jsx-runtime");
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, import_jsx_runtime24.jsx)(import_feedback_press8.TouchableRipple, { onPress: onToggleReady, borderless: true, style: readyButtonStyle, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_native_paper15.Text, { variant: "labelLarge", style: [labelTextStyle, labelColorStyle], children: ready ? "READY \u2713" : "READY?" }) });
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 import_jsx_runtime25 = require("react/jsx-runtime");
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, import_jsx_runtime25.jsxs)(import_react_native27.View, { style: [styles21.panel, ownPopoverOpen && styles21.panelOpen], children: [
1784
- showProfilePicker ? /* @__PURE__ */ (0, import_jsx_runtime25.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_runtime25.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_runtime25.jsx)(import_react_native_paper16.Text, { variant: "labelSmall", style: { color, fontFamily: labelFontFamily }, children: label }),
1785
- (!seatButton || secondPicker) && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react_native27.View, { style: [styles21.pickerRow, pickerRowPopoverOpen && styles21.pickerRowOpen], children: [
1786
- !seatButton && /* @__PURE__ */ (0, import_jsx_runtime25.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 }),
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, import_jsx_runtime25.jsx)(ReadyButton, { color, ready: ready ?? false, onToggleReady })
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 import_jsx_runtime26 = require("react/jsx-runtime");
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, import_jsx_runtime26.jsx)(import_react_native28.Pressable, { accessibilityLabel: "Dismiss", accessibilityRole: "button", onPress, style: [import_react_native28.StyleSheet.absoluteFill, style] });
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 import_jsx_runtime27 = require("react/jsx-runtime");
1827
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1835
1828
  function SharedActionBand({ onBack, onSettings, onRandomize, onReset, fg, popoverOpen, children }) {
1836
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_native29.View, { style: [styles22.column, popoverOpen && styles22.columnOpen], children: [
1837
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_native29.View, { style: styles22.actionsRow, children: [
1838
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_feedback_press9.IconButton, { icon: "arrow-left", iconColor: fg, size: 20, onPress: onBack, accessibilityLabel: "Back" }),
1839
- onRandomize && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_feedback_press9.IconButton, { icon: "dice-multiple", iconColor: fg, size: 18, onPress: onRandomize, accessibilityLabel: "Randomize match settings" }),
1840
- onReset && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_feedback_press9.IconButton, { icon: "restore", iconColor: fg, size: 18, onPress: onReset, accessibilityLabel: "Reset match settings to defaults" }),
1841
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_feedback_press9.IconButton, { icon: "cog", iconColor: fg, size: 20, onPress: onSettings, accessibilityLabel: "Settings" })
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 import_jsx_runtime28 = require("react/jsx-runtime");
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, import_jsx_runtime28.jsx)(import_react_native_reanimated2.default.Text, { allowFontScaling: false, style: [{ color, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, style], children: char });
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, import_jsx_runtime28.jsx)(import_react_native30.View, { style: [styles23.row, style], onLayout, children: word.split("").map((char, i) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(AnimatedLetter, { char, index: startIndex + i, color, reducedMotion, fontFamily, fontSize, lineHeight, fontWeight, letterSpacing }, i)) });
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 import_jsx_runtime29 = require("react/jsx-runtime");
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, import_jsx_runtime29.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) });
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,