@tastic/hud 0.20.0 → 0.22.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 CHANGED
@@ -483,6 +483,7 @@ interface AchievementCatalogSectionProps {
483
483
  label?: string // default 'ALL ACHIEVEMENTS'
484
484
  fg?: string
485
485
  fgMuted?: string
486
+ sectionBg?: string // passed to every row
486
487
  }
487
488
  ```
488
489
 
@@ -495,9 +496,17 @@ stats object with these three fields satisfies it:
495
496
  ```ts
496
497
  interface ActivityStatSectionProps {
497
498
  stats: { distinctDaysPlayed: number; currentDayStreak: number; bestDayStreak: number }
499
+ fg?: string
500
+ fgMuted?: string
501
+ sectionBg?: string
498
502
  }
499
503
  ```
500
504
 
505
+ **Wells.** Every `StatSection` and `AchievementRow` is a well: the theme's `surface` (the same surface as the dialogs)
506
+ on MD3's level-1 shadow, with `onSurface`/`onSurfaceVariant` text. `useWellColors()` returns those colors and
507
+ `WELL_SHADOW` the shadow, for an app's own cards (a menu tile) to match. Each component's `fg`/`fgMuted`/`sectionBg`
508
+ props still override them.
509
+
501
510
  Composing both with `@tastic/achievements`' own row computation:
502
511
 
503
512
  ```tsx
@@ -625,7 +634,7 @@ touches the main barrel. It's for an app that has `@tastic/core` and `@rific/upd
625
634
 
626
635
  - Dialogs: `BaseSettingsDialog`, `ConfirmDialog`, `UpdateDialog`, `RotatedFrame`
627
636
  - Stats: `BaseStatsScreen`, `StatSection`, `StatRow`, `AchievementRow`, `LOCKED_BADGE_COLOR`,
628
- `AchievementCatalogSection`, `ActivityStatSection`
637
+ `AchievementCatalogSection`, `ActivityStatSection`, `useWellColors`, `WELL_SHADOW`
629
638
  - Chrome: `CornerActionButtons`, `ContentGutter`, `StaggeredWord`, `getStaggeredWordDuration`
630
639
  - Overlay cards: `OverlayCard`, `OverlayBackdrop`, `useOverlayCardColors`, `DialogHeader`, `useCompactDialog`, `isCompactDialogHeight`, `COMPACT_DIALOG_HEIGHT`
631
640
  - Style tokens: `overlayStyles`, `overlayActionStyles`, `MONO_FONT`
@@ -9,8 +9,9 @@ interface Props$7 {
9
9
  label?: string;
10
10
  fg?: string;
11
11
  fgMuted?: string;
12
+ sectionBg?: string;
12
13
  }
13
- declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride }: Props$7): react.JSX.Element;
14
+ declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride, sectionBg }: Props$7): react.JSX.Element;
14
15
 
15
16
  declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
16
17
  interface Props$6 {
@@ -35,8 +36,11 @@ interface ActivityStats {
35
36
  }
36
37
  interface Props$5 {
37
38
  stats: ActivityStats;
39
+ fg?: string;
40
+ fgMuted?: string;
41
+ sectionBg?: string;
38
42
  }
39
- declare function ActivityStatSection({ stats }: Props$5): react.JSX.Element;
43
+ declare function ActivityStatSection({ stats, fg, fgMuted, sectionBg }: Props$5): react.JSX.Element;
40
44
 
41
45
  interface BaseSettingsDialogProps {
42
46
  visible: boolean;
@@ -270,4 +274,12 @@ declare function useCompactDialog(rotation?: ViewRotation): {
270
274
  onLayout: (e: LayoutChangeEvent) => void;
271
275
  };
272
276
 
273
- export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, COMPACT_DIALOG_HEIGHT, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, DialogHeader, type DialogHeaderProps, LOCKED_BADGE_COLOR, MONO_FONT, OverlayBackdrop, type OverlayBackdropProps, OverlayCard, type OverlayCardProps, type OverlayCardThemeColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, getStaggeredWordDuration, isCompactDialogHeight, overlayActionStyles, overlayStyles, useCompactDialog, useOverlayCardColors };
277
+ declare const WELL_SHADOW = "0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15)";
278
+ interface WellColors {
279
+ bg: string;
280
+ fg: string;
281
+ fgMuted: string;
282
+ }
283
+ declare function useWellColors(): WellColors;
284
+
285
+ export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, COMPACT_DIALOG_HEIGHT, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, DialogHeader, type DialogHeaderProps, LOCKED_BADGE_COLOR, MONO_FONT, OverlayBackdrop, type OverlayBackdropProps, OverlayCard, type OverlayCardProps, type OverlayCardThemeColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, WELL_SHADOW, type WellColors, getStaggeredWordDuration, isCompactDialogHeight, overlayActionStyles, overlayStyles, useCompactDialog, useOverlayCardColors, useWellColors };
@@ -9,8 +9,9 @@ interface Props$7 {
9
9
  label?: string;
10
10
  fg?: string;
11
11
  fgMuted?: string;
12
+ sectionBg?: string;
12
13
  }
13
- declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride }: Props$7): react.JSX.Element;
14
+ declare function AchievementCatalogSection({ rows, label, fg, fgMuted: fgMutedOverride, sectionBg }: Props$7): react.JSX.Element;
14
15
 
15
16
  declare const LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
16
17
  interface Props$6 {
@@ -35,8 +36,11 @@ interface ActivityStats {
35
36
  }
36
37
  interface Props$5 {
37
38
  stats: ActivityStats;
39
+ fg?: string;
40
+ fgMuted?: string;
41
+ sectionBg?: string;
38
42
  }
39
- declare function ActivityStatSection({ stats }: Props$5): react.JSX.Element;
43
+ declare function ActivityStatSection({ stats, fg, fgMuted, sectionBg }: Props$5): react.JSX.Element;
40
44
 
41
45
  interface BaseSettingsDialogProps {
42
46
  visible: boolean;
@@ -270,4 +274,12 @@ declare function useCompactDialog(rotation?: ViewRotation): {
270
274
  onLayout: (e: LayoutChangeEvent) => void;
271
275
  };
272
276
 
273
- export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, COMPACT_DIALOG_HEIGHT, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, DialogHeader, type DialogHeaderProps, LOCKED_BADGE_COLOR, MONO_FONT, OverlayBackdrop, type OverlayBackdropProps, OverlayCard, type OverlayCardProps, type OverlayCardThemeColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, getStaggeredWordDuration, isCompactDialogHeight, overlayActionStyles, overlayStyles, useCompactDialog, useOverlayCardColors };
277
+ declare const WELL_SHADOW = "0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15)";
278
+ interface WellColors {
279
+ bg: string;
280
+ fg: string;
281
+ fgMuted: string;
282
+ }
283
+ declare function useWellColors(): WellColors;
284
+
285
+ export { AchievementCatalogSection, AchievementRow, ActivityStatSection, BaseSettingsDialog, type BaseSettingsDialogProps, BaseStatsScreen, COMPACT_DIALOG_HEIGHT, ConfirmDialog, type ConfirmDialogProps, ContentGutter, CornerActionButtons, DialogHeader, type DialogHeaderProps, LOCKED_BADGE_COLOR, MONO_FONT, OverlayBackdrop, type OverlayBackdropProps, OverlayCard, type OverlayCardProps, type OverlayCardThemeColors, RotatedFrame, type RotatedFrameProps, StaggeredWord, type StaggeredWordProps, StatRow, StatSection, UpdateDialog, type UpdateDialogProps, WELL_SHADOW, type WellColors, getStaggeredWordDuration, isCompactDialogHeight, overlayActionStyles, overlayStyles, useCompactDialog, useOverlayCardColors, useWellColors };
@@ -49,12 +49,14 @@ __export(chrome_exports, {
49
49
  StatRow: () => StatRow,
50
50
  StatSection: () => StatSection,
51
51
  UpdateDialog: () => UpdateDialog,
52
+ WELL_SHADOW: () => WELL_SHADOW,
52
53
  getStaggeredWordDuration: () => getStaggeredWordDuration,
53
54
  isCompactDialogHeight: () => isCompactDialogHeight,
54
55
  overlayActionStyles: () => overlayActionStyles,
55
56
  overlayStyles: () => overlayStyles,
56
57
  useCompactDialog: () => useCompactDialog,
57
- useOverlayCardColors: () => useOverlayCardColors
58
+ useOverlayCardColors: () => useOverlayCardColors,
59
+ useWellColors: () => useWellColors
58
60
  });
59
61
  module.exports = __toCommonJS(chrome_exports);
60
62
 
@@ -65,16 +67,25 @@ var import_react_native3 = require("react-native");
65
67
  var import_react_native_paper2 = require("react-native-paper");
66
68
 
67
69
  // src/AchievementRow.tsx
68
- var import_auto_paper = require("@rific/auto-paper");
69
70
  var import_react_native = require("react-native");
70
71
  var import_react_native_paper = require("react-native-paper");
72
+
73
+ // src/wellSurface.ts
74
+ var import_auto_paper = require("@rific/auto-paper");
75
+ var WELL_SHADOW = "0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15)";
76
+ function useWellColors() {
77
+ const { colors } = (0, import_auto_paper.useAutoPaperTheme)();
78
+ return { bg: colors.surface, fg: colors.onSurface, fgMuted: colors.onSurfaceVariant };
79
+ }
80
+
81
+ // src/AchievementRow.tsx
71
82
  var import_jsx_runtime = require("react/jsx-runtime");
72
83
  var LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
73
84
  function AchievementRow({ icon, title, description, badgeColor, unlockedLabel, checkColor, progress, deviceMarker, fg: fgOverride, fgMuted: fgMutedOverride, sectionBg: sectionBgOverride }) {
74
- const { dark } = (0, import_auto_paper.useAutoPaperTheme)();
75
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
76
- const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
77
- const sectionBg = sectionBgOverride ?? (dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.04)");
85
+ const well = useWellColors();
86
+ const fg = fgOverride ?? well.fg;
87
+ const fgMuted = fgMutedOverride ?? well.fgMuted;
88
+ const sectionBg = sectionBgOverride ?? well.bg;
78
89
  const unlocked = unlockedLabel !== void 0;
79
90
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react_native.View, { style: [styles.row, { backgroundColor: sectionBg }], children: [
80
91
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_native.View, { style: [styles.badge, { backgroundColor: badgeColor }], children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_native_paper.Icon, { source: icon, size: 20, color: unlocked ? "#000000" : fgMuted }) }),
@@ -117,6 +128,7 @@ var styles = import_react_native.StyleSheet.create({
117
128
  row: {
118
129
  alignItems: "center",
119
130
  borderRadius: 12,
131
+ boxShadow: WELL_SHADOW,
120
132
  flexDirection: "row",
121
133
  gap: 12,
122
134
  padding: 12
@@ -138,13 +150,13 @@ var MONO_FONT = import_react_native2.Platform.select({ ios: "Menlo", android: "m
138
150
 
139
151
  // src/AchievementCatalogSection.tsx
140
152
  var import_jsx_runtime2 = require("react/jsx-runtime");
141
- function AchievementCatalogSection({ rows, label = "ALL ACHIEVEMENTS", fg, fgMuted: fgMutedOverride }) {
153
+ function AchievementCatalogSection({ rows, label = "ALL ACHIEVEMENTS", fg, fgMuted: fgMutedOverride, sectionBg }) {
142
154
  const { dark } = (0, import_auto_paper2.useAutoPaperTheme)();
143
155
  const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
144
156
  const tierAccent = (tierColor) => dark ? tierColor : (0, import_auto_paper2.getBlendedColor)("#000000", tierColor, 0.5);
145
157
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react.Fragment, { children: [
146
158
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native_paper2.Text, { variant: "labelMedium", style: [styles2.label, { color: fgMuted, fontFamily: MONO_FONT }], children: label }),
147
- rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AchievementRow, { icon: row.icon, title: row.title, description: row.description, badgeColor: row.unlockedAt !== void 0 ? row.tierColor : LOCKED_BADGE_COLOR, checkColor: tierAccent(row.tierColor), unlockedLabel: row.unlockedLabel, progress: row.progress, deviceMarker: row.deviceMarker, fg, fgMuted: fgMutedOverride }, row.id))
159
+ rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AchievementRow, { icon: row.icon, title: row.title, description: row.description, badgeColor: row.unlockedAt !== void 0 ? row.tierColor : LOCKED_BADGE_COLOR, checkColor: tierAccent(row.tierColor), unlockedLabel: row.unlockedLabel, progress: row.progress, deviceMarker: row.deviceMarker, fg, fgMuted: fgMutedOverride, sectionBg }, row.id))
148
160
  ] });
149
161
  }
150
162
  var styles2 = import_react_native3.StyleSheet.create({
@@ -155,14 +167,13 @@ var styles2 = import_react_native3.StyleSheet.create({
155
167
  });
156
168
 
157
169
  // src/StatRow.tsx
158
- var import_auto_paper3 = require("@rific/auto-paper");
159
170
  var import_react_native4 = require("react-native");
160
171
  var import_react_native_paper3 = require("react-native-paper");
161
172
  var import_jsx_runtime3 = require("react/jsx-runtime");
162
173
  function StatRow({ label, value, fg: fgOverride, fgMuted: fgMutedOverride }) {
163
- const { dark } = (0, import_auto_paper3.useAutoPaperTheme)();
164
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
165
- const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
174
+ const well = useWellColors();
175
+ const fg = fgOverride ?? well.fg;
176
+ const fgMuted = fgMutedOverride ?? well.fgMuted;
166
177
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native4.View, { style: styles3.row, children: [
167
178
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native_paper3.Text, { variant: "bodyMedium", style: { color: fgMuted }, children: label }),
168
179
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native_paper3.Text, { variant: "bodyMedium", style: [styles3.value, { color: fg }], children: value })
@@ -180,14 +191,13 @@ var styles3 = import_react_native4.StyleSheet.create({
180
191
  });
181
192
 
182
193
  // src/StatSection.tsx
183
- var import_auto_paper4 = require("@rific/auto-paper");
184
194
  var import_react_native5 = require("react-native");
185
195
  var import_react_native_paper4 = require("react-native-paper");
186
196
  var import_jsx_runtime4 = require("react/jsx-runtime");
187
197
  function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, children }) {
188
- const { dark } = (0, import_auto_paper4.useAutoPaperTheme)();
189
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
190
- const sectionBg = sectionBgOverride ?? (dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.04)");
198
+ const well = useWellColors();
199
+ const fg = fgOverride ?? well.fg;
200
+ const sectionBg = sectionBgOverride ?? well.bg;
191
201
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native5.View, { style: [styles4.section, { backgroundColor: sectionBg }], children: [
192
202
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native_paper4.Text, { variant: "labelMedium", style: [styles4.label, { color: fg }], children: label }),
193
203
  children
@@ -204,6 +214,7 @@ var styles4 = import_react_native5.StyleSheet.create({
204
214
  },
205
215
  section: {
206
216
  borderRadius: 12,
217
+ boxShadow: WELL_SHADOW,
207
218
  gap: 8,
208
219
  padding: 16
209
220
  }
@@ -211,16 +222,16 @@ var styles4 = import_react_native5.StyleSheet.create({
211
222
 
212
223
  // src/ActivityStatSection.tsx
213
224
  var import_jsx_runtime5 = require("react/jsx-runtime");
214
- function ActivityStatSection({ stats }) {
215
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(StatSection, { label: "ACTIVITY", children: [
216
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Days Played", value: String(stats.distinctDaysPlayed) }),
217
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Day Streak", value: String(stats.currentDayStreak) }),
218
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Best Day Streak", value: String(stats.bestDayStreak) })
225
+ function ActivityStatSection({ stats, fg, fgMuted, sectionBg }) {
226
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(StatSection, { label: "ACTIVITY", fg, sectionBg, children: [
227
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Days Played", value: String(stats.distinctDaysPlayed), fg, fgMuted }),
228
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Day Streak", value: String(stats.currentDayStreak), fg, fgMuted }),
229
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatRow, { label: "Best Day Streak", value: String(stats.bestDayStreak), fg, fgMuted })
219
230
  ] });
220
231
  }
221
232
 
222
233
  // src/BaseSettingsDialog.tsx
223
- var import_auto_paper8 = require("@rific/auto-paper");
234
+ var import_auto_paper6 = require("@rific/auto-paper");
224
235
  var import_feedback_press2 = require("@rific/feedback-press");
225
236
  var import_updater = require("@rific/updater");
226
237
  var import_core4 = require("@tastic/core");
@@ -230,7 +241,7 @@ var import_react_native_paper8 = require("react-native-paper");
230
241
  var import_react_native_safe_area_context2 = require("react-native-safe-area-context");
231
242
 
232
243
  // src/ConfirmDialog.tsx
233
- var import_auto_paper7 = require("@rific/auto-paper");
244
+ var import_auto_paper5 = require("@rific/auto-paper");
234
245
  var import_feedback_press = require("@rific/feedback-press");
235
246
  var import_core2 = require("@tastic/core");
236
247
  var import_react3 = require("react");
@@ -238,7 +249,7 @@ var import_react_native10 = require("react-native");
238
249
  var import_react_native_paper6 = require("react-native-paper");
239
250
 
240
251
  // src/DialogHeader.tsx
241
- var import_auto_paper5 = require("@rific/auto-paper");
252
+ var import_auto_paper3 = require("@rific/auto-paper");
242
253
  var import_react_native6 = require("react-native");
243
254
  var import_react_native_paper5 = require("react-native-paper");
244
255
  var import_jsx_runtime6 = require("react/jsx-runtime");
@@ -247,7 +258,7 @@ function isCompactDialogHeight(height) {
247
258
  return height < COMPACT_DIALOG_HEIGHT;
248
259
  }
249
260
  function DialogHeader({ icon, title, color, compact = false, style }) {
250
- const { colors } = (0, import_auto_paper5.useAutoPaperTheme)();
261
+ const { colors } = (0, import_auto_paper3.useAutoPaperTheme)();
251
262
  const accent = color ?? colors.primary;
252
263
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native6.View, { style: [compact ? styles5.compact : styles5.full, style], children: [
253
264
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native_paper5.Icon, { source: icon, size: compact ? COMPACT_ICON_SIZE : ICON_SIZE, color: accent }),
@@ -344,11 +355,11 @@ var overlayActionStyles = import_react_native7.StyleSheet.create({
344
355
  });
345
356
 
346
357
  // src/OverlaySurface.tsx
347
- var import_auto_paper6 = require("@rific/auto-paper");
358
+ var import_auto_paper4 = require("@rific/auto-paper");
348
359
  var import_react_native8 = require("react-native");
349
360
  var import_jsx_runtime7 = require("react/jsx-runtime");
350
361
  function useOverlayCardColors() {
351
- const { colors } = (0, import_auto_paper6.useAutoPaperTheme)();
362
+ const { colors } = (0, import_auto_paper4.useAutoPaperTheme)();
352
363
  return { fg: colors.onSurface, fgMuted: colors.onSurfaceVariant, cardBorder: colors.outlineVariant, backdrop: colors.backdrop };
353
364
  }
354
365
  function OverlayBackdrop({ children, style, onLayout }) {
@@ -356,9 +367,9 @@ function OverlayBackdrop({ children, style, onLayout }) {
356
367
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native8.View, { onLayout, style: [overlayStyles.overlay, { backgroundColor: backdrop }, style], children });
357
368
  }
358
369
  function OverlayCard({ children, style, ...rest }) {
359
- const { isV3, roundness } = (0, import_auto_paper6.useAutoPaperTheme)();
360
- const blur = (0, import_auto_paper6.useBlur)();
361
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_auto_paper6.BlurView, { blur, style: [overlayStyles.card, styles6.card, { borderRadius: (isV3 ? 7 : 1) * roundness }, style], ...rest, children });
370
+ const { isV3, roundness } = (0, import_auto_paper4.useAutoPaperTheme)();
371
+ const blur = (0, import_auto_paper4.useBlur)();
372
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_auto_paper4.BlurView, { blur, style: [overlayStyles.card, styles6.card, { borderRadius: (isV3 ? 7 : 1) * roundness }, style], ...rest, children });
362
373
  }
363
374
  var styles6 = import_react_native8.StyleSheet.create({
364
375
  card: { overflow: "hidden" }
@@ -384,7 +395,7 @@ function useCompactDialog(rotation = 0) {
384
395
  // src/ConfirmDialog.tsx
385
396
  var import_jsx_runtime8 = require("react/jsx-runtime");
386
397
  function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation = 0, icon = "help-circle-outline", destructive = false }) {
387
- const { colors } = (0, import_auto_paper7.useAutoPaperTheme)();
398
+ const { colors } = (0, import_auto_paper5.useAutoPaperTheme)();
388
399
  const { fg } = useOverlayCardColors();
389
400
  const { compact, onLayout } = useCompactDialog(rotation);
390
401
  const onCancelRef = (0, import_react3.useRef)(onCancel);
@@ -489,7 +500,7 @@ function SettingIcon({ source, color, containerColor }) {
489
500
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native12.View, { style: [styles9.iconBadge, { backgroundColor: containerColor }], children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Icon, { source, size: 18, color }) });
490
501
  }
491
502
  function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, keepAwake, onKeepAwakeChange, hideSound = false, hideHaptics = false, hideAppearance = false, hideUpdateCheck = false, onUpdateError, onShowHowToPlay, children }) {
492
- const { colors } = (0, import_auto_paper8.useAutoPaperTheme)();
503
+ const { colors } = (0, import_auto_paper6.useAutoPaperTheme)();
493
504
  const ambientRotation = (0, import_core4.useRotation)();
494
505
  const rotation = rotationOverride ?? ambientRotation;
495
506
  const window = (0, import_react_native12.useWindowDimensions)();
@@ -502,8 +513,8 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
502
513
  const { settings: soundSettings, set: setSoundSettings } = (0, import_feedback_press2.useSoundSettings)();
503
514
  const sound = (0, import_react6.useContext)(import_feedback_press2.SoundContext);
504
515
  const { forceShort: forceHapticFeedback } = (0, import_feedback_press2.useVibration)();
505
- const { settings: themeSettings, set: setThemeSettings } = (0, import_auto_paper8.useThemeSettings)();
506
- const expoBlur = (0, import_auto_paper8.useBlurModule)();
516
+ const { settings: themeSettings, set: setThemeSettings } = (0, import_auto_paper6.useThemeSettings)();
517
+ const expoBlur = (0, import_auto_paper6.useBlurModule)();
507
518
  const [infoMessage, setInfoMessage] = (0, import_react6.useState)(null);
508
519
  const { manifest: updateManifest, onConfirm: onUpdateConfirm, respond: respondToUpdateConfirm } = useUpdateConfirmBridge();
509
520
  const { check, checking, updateReady } = (0, import_updater.useUpdater)({
@@ -526,8 +537,8 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
526
537
  const showUpdateCheck = import_react_native12.Platform.OS !== "web" && !hideUpdateCheck;
527
538
  if (!opened) return null;
528
539
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(RotatedFrame, { rotation, rotatedSafeArea: true, portalHost: true, passThrough: true, children: [
529
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper8.Dialog, { visible, onDismiss, style: [styles9.dialog, { width: sheetWidth }], children: [
530
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper8.Dialog.ScrollArea, { style: styles9.scrollArea, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper8.FadingScrollView, { contentContainerStyle: styles9.scrollContent, showsVerticalScrollIndicator: false, children: [
540
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper6.Dialog, { visible, onDismiss, style: [styles9.dialog, { width: sheetWidth }], children: [
541
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper6.Dialog.ScrollArea, { style: styles9.scrollArea, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_auto_paper6.FadingScrollView, { contentContainerStyle: styles9.scrollContent, showsVerticalScrollIndicator: false, children: [
531
542
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DialogHeader, { icon: "cog", title: "Settings", compact: compactHeader }),
532
543
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.content, children: [
533
544
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleGroup, children: [
@@ -609,7 +620,7 @@ function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, ve
609
620
  ] }),
610
621
  showAppearance && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.section, children: [
611
622
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native_paper8.Text, { variant: "labelMedium", style: [styles9.sectionLabel, { color: colors.onSurfaceVariant }], children: "APPEARANCE" }),
612
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper8.AutoAppearancePicker, { showLabels: false }),
623
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_auto_paper6.AutoAppearancePicker, { showLabels: false }),
613
624
  showBlur && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_feedback_press2.TouchableRipple, { onPress: () => setThemeSettings({ blur: !themeSettings.blur }), style: styles9.toggleButton, accessibilityLabel: `Blur ${themeSettings.blur ? "on" : "off"}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.toggleContent, children: [
614
625
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SettingIcon, { source: themeSettings.blur ? "blur" : "blur-off", color: themeSettings.blur ? colors.tertiary : colors.onSurfaceVariant, containerColor: themeSettings.blur ? colors.tertiaryContainer : colors.surfaceVariant }),
615
626
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native12.View, { style: styles9.flexShrink, children: [
@@ -720,7 +731,7 @@ var styles9 = import_react_native12.StyleSheet.create({
720
731
  });
721
732
 
722
733
  // src/BaseStatsScreen.tsx
723
- var import_auto_paper9 = require("@rific/auto-paper");
734
+ var import_auto_paper7 = require("@rific/auto-paper");
724
735
  var import_feedback_press3 = require("@rific/feedback-press");
725
736
  var import_core5 = require("@tastic/core");
726
737
  var import_react7 = require("react");
@@ -728,7 +739,7 @@ var import_react_native13 = require("react-native");
728
739
  var import_react_native_paper9 = require("react-native-paper");
729
740
  var import_jsx_runtime11 = require("react/jsx-runtime");
730
741
  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 }) {
731
- const { dark, colors } = (0, import_auto_paper9.useAutoPaperTheme)();
742
+ const { dark, colors } = (0, import_auto_paper7.useAutoPaperTheme)();
732
743
  const ambientRotation = (0, import_core5.useRotation)();
733
744
  const rotation = rotationOverride ?? ambientRotation;
734
745
  const [confirmResetVisible, setConfirmResetVisible] = (0, import_react7.useState)(false);
@@ -740,7 +751,7 @@ function BaseStatsScreen({ rotation: rotationOverride, title = "Achievements", t
740
751
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.IconButton, { icon: "arrow-left", iconColor: fg, size: 24, hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
741
752
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native_paper9.Text, { variant: titleVariant, style: [styles10.title, { color: fg }], children: title })
742
753
  ] }),
743
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native13.ScrollView, { style: styles10.scrollView, contentContainerStyle: [styles10.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
754
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_auto_paper7.FadingScrollView, { style: styles10.scrollView, contentContainerStyle: [styles10.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
744
755
  children,
745
756
  showReset && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_feedback_press3.Button, { mode: "contained", onPress: () => setConfirmResetVisible(true), buttonColor: colors.danger, textColor: colors.onDanger, style: styles10.resetButton, children: resetLabel })
746
757
  ] }),
@@ -781,7 +792,7 @@ var styles10 = import_react_native13.StyleSheet.create({
781
792
  resetButton: {
782
793
  marginTop: 16
783
794
  },
784
- // Bounds the ScrollView to the space `container`'s flex:1 actually gives it - without this, a
795
+ // Bounds the scroller (FadingScrollView puts it on its outer box) to the space `container`'s flex:1 actually gives it - without this, a
785
796
  // ScrollView with only a contentContainerStyle isn't reliably height-constrained on native (it
786
797
  // can render at its full unclipped content height instead of the screen's), which leaves the
787
798
  // header's back button touch target unreliable underneath it.
@@ -898,10 +909,12 @@ function UpdateDialog({ rotation = 0, autoCheck = true, autoPrompt = true, onErr
898
909
  StatRow,
899
910
  StatSection,
900
911
  UpdateDialog,
912
+ WELL_SHADOW,
901
913
  getStaggeredWordDuration,
902
914
  isCompactDialogHeight,
903
915
  overlayActionStyles,
904
916
  overlayStyles,
905
917
  useCompactDialog,
906
- useOverlayCardColors
918
+ useOverlayCardColors,
919
+ useWellColors
907
920
  });
@@ -14,9 +14,11 @@ import {
14
14
  StatRow,
15
15
  StatSection,
16
16
  UpdateDialog,
17
+ WELL_SHADOW,
17
18
  getStaggeredWordDuration,
18
- useCompactDialog
19
- } from "../chunk-DK3HOZC5.mjs";
19
+ useCompactDialog,
20
+ useWellColors
21
+ } from "../chunk-N7A7W72S.mjs";
20
22
  import {
21
23
  COMPACT_DIALOG_HEIGHT,
22
24
  DialogHeader,
@@ -47,10 +49,12 @@ export {
47
49
  StatRow,
48
50
  StatSection,
49
51
  UpdateDialog,
52
+ WELL_SHADOW,
50
53
  getStaggeredWordDuration,
51
54
  isCompactDialogHeight,
52
55
  overlayActionStyles,
53
56
  overlayStyles,
54
57
  useCompactDialog,
55
- useOverlayCardColors
58
+ useOverlayCardColors,
59
+ useWellColors
56
60
  };
@@ -8,17 +8,24 @@ import {
8
8
  useOverlayCardColors
9
9
  } from "./chunk-PUF6TABL.mjs";
10
10
 
11
- // src/AchievementRow.tsx
11
+ // src/wellSurface.ts
12
12
  import { useAutoPaperTheme } from "@rific/auto-paper";
13
+ var WELL_SHADOW = "0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15)";
14
+ function useWellColors() {
15
+ const { colors } = useAutoPaperTheme();
16
+ return { bg: colors.surface, fg: colors.onSurface, fgMuted: colors.onSurfaceVariant };
17
+ }
18
+
19
+ // src/AchievementRow.tsx
13
20
  import { StyleSheet, View } from "react-native";
14
21
  import { Icon, ProgressBar, Text } from "react-native-paper";
15
22
  import { jsx, jsxs } from "react/jsx-runtime";
16
23
  var LOCKED_BADGE_COLOR = "rgba(128,128,128,0.3)";
17
24
  function AchievementRow({ icon, title, description, badgeColor, unlockedLabel, checkColor, progress, deviceMarker, fg: fgOverride, fgMuted: fgMutedOverride, sectionBg: sectionBgOverride }) {
18
- const { dark } = useAutoPaperTheme();
19
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
20
- const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
21
- const sectionBg = sectionBgOverride ?? (dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.04)");
25
+ const well = useWellColors();
26
+ const fg = fgOverride ?? well.fg;
27
+ const fgMuted = fgMutedOverride ?? well.fgMuted;
28
+ const sectionBg = sectionBgOverride ?? well.bg;
22
29
  const unlocked = unlockedLabel !== void 0;
23
30
  return /* @__PURE__ */ jsxs(View, { style: [styles.row, { backgroundColor: sectionBg }], children: [
24
31
  /* @__PURE__ */ jsx(View, { style: [styles.badge, { backgroundColor: badgeColor }], children: /* @__PURE__ */ jsx(Icon, { source: icon, size: 20, color: unlocked ? "#000000" : fgMuted }) }),
@@ -61,6 +68,7 @@ var styles = StyleSheet.create({
61
68
  row: {
62
69
  alignItems: "center",
63
70
  borderRadius: 12,
71
+ boxShadow: WELL_SHADOW,
64
72
  flexDirection: "row",
65
73
  gap: 12,
66
74
  padding: 12
@@ -86,13 +94,13 @@ import { Fragment } from "react";
86
94
  import { StyleSheet as StyleSheet2 } from "react-native";
87
95
  import { Text as Text2 } from "react-native-paper";
88
96
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
89
- function AchievementCatalogSection({ rows, label = "ALL ACHIEVEMENTS", fg, fgMuted: fgMutedOverride }) {
97
+ function AchievementCatalogSection({ rows, label = "ALL ACHIEVEMENTS", fg, fgMuted: fgMutedOverride, sectionBg }) {
90
98
  const { dark } = useAutoPaperTheme2();
91
99
  const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
92
100
  const tierAccent = (tierColor) => dark ? tierColor : getBlendedColor("#000000", tierColor, 0.5);
93
101
  return /* @__PURE__ */ jsxs2(Fragment, { children: [
94
102
  /* @__PURE__ */ jsx2(Text2, { variant: "labelMedium", style: [styles2.label, { color: fgMuted, fontFamily: MONO_FONT }], children: label }),
95
- rows.map((row) => /* @__PURE__ */ jsx2(AchievementRow, { icon: row.icon, title: row.title, description: row.description, badgeColor: row.unlockedAt !== void 0 ? row.tierColor : LOCKED_BADGE_COLOR, checkColor: tierAccent(row.tierColor), unlockedLabel: row.unlockedLabel, progress: row.progress, deviceMarker: row.deviceMarker, fg, fgMuted: fgMutedOverride }, row.id))
103
+ rows.map((row) => /* @__PURE__ */ jsx2(AchievementRow, { icon: row.icon, title: row.title, description: row.description, badgeColor: row.unlockedAt !== void 0 ? row.tierColor : LOCKED_BADGE_COLOR, checkColor: tierAccent(row.tierColor), unlockedLabel: row.unlockedLabel, progress: row.progress, deviceMarker: row.deviceMarker, fg, fgMuted: fgMutedOverride, sectionBg }, row.id))
96
104
  ] });
97
105
  }
98
106
  var styles2 = StyleSheet2.create({
@@ -103,14 +111,13 @@ var styles2 = StyleSheet2.create({
103
111
  });
104
112
 
105
113
  // src/StatRow.tsx
106
- import { useAutoPaperTheme as useAutoPaperTheme3 } from "@rific/auto-paper";
107
114
  import { StyleSheet as StyleSheet3, View as View2 } from "react-native";
108
115
  import { Text as Text3 } from "react-native-paper";
109
116
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
110
117
  function StatRow({ label, value, fg: fgOverride, fgMuted: fgMutedOverride }) {
111
- const { dark } = useAutoPaperTheme3();
112
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
113
- const fgMuted = fgMutedOverride ?? (dark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)");
118
+ const well = useWellColors();
119
+ const fg = fgOverride ?? well.fg;
120
+ const fgMuted = fgMutedOverride ?? well.fgMuted;
114
121
  return /* @__PURE__ */ jsxs3(View2, { style: styles3.row, children: [
115
122
  /* @__PURE__ */ jsx3(Text3, { variant: "bodyMedium", style: { color: fgMuted }, children: label }),
116
123
  /* @__PURE__ */ jsx3(Text3, { variant: "bodyMedium", style: [styles3.value, { color: fg }], children: value })
@@ -128,14 +135,13 @@ var styles3 = StyleSheet3.create({
128
135
  });
129
136
 
130
137
  // src/StatSection.tsx
131
- import { useAutoPaperTheme as useAutoPaperTheme4 } from "@rific/auto-paper";
132
138
  import { StyleSheet as StyleSheet4, View as View3 } from "react-native";
133
139
  import { Text as Text4 } from "react-native-paper";
134
140
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
135
141
  function StatSection({ label, fg: fgOverride, sectionBg: sectionBgOverride, children }) {
136
- const { dark } = useAutoPaperTheme4();
137
- const fg = fgOverride ?? (dark ? "#FFFFFF" : "#000000");
138
- const sectionBg = sectionBgOverride ?? (dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.04)");
142
+ const well = useWellColors();
143
+ const fg = fgOverride ?? well.fg;
144
+ const sectionBg = sectionBgOverride ?? well.bg;
139
145
  return /* @__PURE__ */ jsxs4(View3, { style: [styles4.section, { backgroundColor: sectionBg }], children: [
140
146
  /* @__PURE__ */ jsx4(Text4, { variant: "labelMedium", style: [styles4.label, { color: fg }], children: label }),
141
147
  children
@@ -152,6 +158,7 @@ var styles4 = StyleSheet4.create({
152
158
  },
153
159
  section: {
154
160
  borderRadius: 12,
161
+ boxShadow: WELL_SHADOW,
155
162
  gap: 8,
156
163
  padding: 16
157
164
  }
@@ -159,11 +166,11 @@ var styles4 = StyleSheet4.create({
159
166
 
160
167
  // src/ActivityStatSection.tsx
161
168
  import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
162
- function ActivityStatSection({ stats }) {
163
- return /* @__PURE__ */ jsxs5(StatSection, { label: "ACTIVITY", children: [
164
- /* @__PURE__ */ jsx5(StatRow, { label: "Days Played", value: String(stats.distinctDaysPlayed) }),
165
- /* @__PURE__ */ jsx5(StatRow, { label: "Day Streak", value: String(stats.currentDayStreak) }),
166
- /* @__PURE__ */ jsx5(StatRow, { label: "Best Day Streak", value: String(stats.bestDayStreak) })
169
+ function ActivityStatSection({ stats, fg, fgMuted, sectionBg }) {
170
+ return /* @__PURE__ */ jsxs5(StatSection, { label: "ACTIVITY", fg, sectionBg, children: [
171
+ /* @__PURE__ */ jsx5(StatRow, { label: "Days Played", value: String(stats.distinctDaysPlayed), fg, fgMuted }),
172
+ /* @__PURE__ */ jsx5(StatRow, { label: "Day Streak", value: String(stats.currentDayStreak), fg, fgMuted }),
173
+ /* @__PURE__ */ jsx5(StatRow, { label: "Best Day Streak", value: String(stats.bestDayStreak), fg, fgMuted })
167
174
  ] });
168
175
  }
169
176
 
@@ -185,7 +192,7 @@ function useCompactDialog(rotation = 0) {
185
192
  }
186
193
 
187
194
  // src/ConfirmDialog.tsx
188
- import { useAutoPaperTheme as useAutoPaperTheme5 } from "@rific/auto-paper";
195
+ import { useAutoPaperTheme as useAutoPaperTheme3 } from "@rific/auto-paper";
189
196
  import { Button } from "@rific/feedback-press";
190
197
  import { toRotationStyle } from "@tastic/core";
191
198
  import { useEffect, useRef } from "react";
@@ -193,7 +200,7 @@ import { BackHandler, StyleSheet as StyleSheet5, View as View4 } from "react-nat
193
200
  import { Portal, Text as Text5 } from "react-native-paper";
194
201
  import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
195
202
  function ConfirmDialog({ visible, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, rotation = 0, icon = "help-circle-outline", destructive = false }) {
196
- const { colors } = useAutoPaperTheme5();
203
+ const { colors } = useAutoPaperTheme3();
197
204
  const { fg } = useOverlayCardColors();
198
205
  const { compact, onLayout } = useCompactDialog(rotation);
199
206
  const onCancelRef = useRef(onCancel);
@@ -273,7 +280,7 @@ var styles6 = StyleSheet6.create({
273
280
  });
274
281
 
275
282
  // src/BaseSettingsDialog.tsx
276
- import { AutoAppearancePicker, Dialog, FadingScrollView, useAutoPaperTheme as useAutoPaperTheme6, useBlurModule, useThemeSettings } from "@rific/auto-paper";
283
+ import { AutoAppearancePicker, Dialog, FadingScrollView, useAutoPaperTheme as useAutoPaperTheme4, useBlurModule, useThemeSettings } from "@rific/auto-paper";
277
284
  import { Button as Button2, SoundContext, TouchableRipple, useHapticSettings, useSoundSettings, useVibration } from "@rific/feedback-press";
278
285
  import { useUpdater } from "@rific/updater";
279
286
  import { rotateInsets as rotateInsets2, useIsTouchPrimaryDevice, useRotation as useRotation2 } from "@tastic/core";
@@ -308,7 +315,7 @@ function SettingIcon({ source, color, containerColor }) {
308
315
  return /* @__PURE__ */ jsx8(View6, { style: [styles7.iconBadge, { backgroundColor: containerColor }], children: /* @__PURE__ */ jsx8(Icon2, { source, size: 18, color }) });
309
316
  }
310
317
  function BaseSettingsDialog({ visible, onDismiss, rotation: rotationOverride, version, lockOrientation, onLockOrientationChange, deferBottomEdgeGestures, onDeferBottomEdgeGestures, keepAwake, onKeepAwakeChange, hideSound = false, hideHaptics = false, hideAppearance = false, hideUpdateCheck = false, onUpdateError, onShowHowToPlay, children }) {
311
- const { colors } = useAutoPaperTheme6();
318
+ const { colors } = useAutoPaperTheme4();
312
319
  const ambientRotation = useRotation2();
313
320
  const rotation = rotationOverride ?? ambientRotation;
314
321
  const window = useWindowDimensions3();
@@ -539,15 +546,15 @@ var styles7 = StyleSheet7.create({
539
546
  });
540
547
 
541
548
  // src/BaseStatsScreen.tsx
542
- import { useAutoPaperTheme as useAutoPaperTheme7 } from "@rific/auto-paper";
549
+ import { FadingScrollView as FadingScrollView2, useAutoPaperTheme as useAutoPaperTheme5 } from "@rific/auto-paper";
543
550
  import { Button as Button3, IconButton } from "@rific/feedback-press";
544
551
  import { useRotation as useRotation3 } from "@tastic/core";
545
552
  import { useState as useState4 } from "react";
546
- import { ScrollView, StyleSheet as StyleSheet8, View as View7 } from "react-native";
553
+ import { StyleSheet as StyleSheet8, View as View7 } from "react-native";
547
554
  import { Text as Text7 } from "react-native-paper";
548
555
  import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
549
556
  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 }) {
550
- const { dark, colors } = useAutoPaperTheme7();
557
+ const { dark, colors } = useAutoPaperTheme5();
551
558
  const ambientRotation = useRotation3();
552
559
  const rotation = rotationOverride ?? ambientRotation;
553
560
  const [confirmResetVisible, setConfirmResetVisible] = useState4(false);
@@ -559,7 +566,7 @@ function BaseStatsScreen({ rotation: rotationOverride, title = "Achievements", t
559
566
  /* @__PURE__ */ jsx9(IconButton, { icon: "arrow-left", iconColor: fg, size: 24, hitSlop, onPress: onBack, accessibilityLabel: backLabel }),
560
567
  /* @__PURE__ */ jsx9(Text7, { variant: titleVariant, style: [styles8.title, { color: fg }], children: title })
561
568
  ] }),
562
- /* @__PURE__ */ jsxs8(ScrollView, { style: styles8.scrollView, contentContainerStyle: [styles8.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
569
+ /* @__PURE__ */ jsxs8(FadingScrollView2, { style: styles8.scrollView, contentContainerStyle: [styles8.content, { paddingBottom: 32 + insets.bottom }], showsVerticalScrollIndicator: false, children: [
563
570
  children,
564
571
  showReset && /* @__PURE__ */ jsx9(Button3, { mode: "contained", onPress: () => setConfirmResetVisible(true), buttonColor: colors.danger, textColor: colors.onDanger, style: styles8.resetButton, children: resetLabel })
565
572
  ] }),
@@ -600,7 +607,7 @@ var styles8 = StyleSheet8.create({
600
607
  resetButton: {
601
608
  marginTop: 16
602
609
  },
603
- // Bounds the ScrollView to the space `container`'s flex:1 actually gives it - without this, a
610
+ // Bounds the scroller (FadingScrollView puts it on its outer box) to the space `container`'s flex:1 actually gives it - without this, a
604
611
  // ScrollView with only a contentContainerStyle isn't reliably height-constrained on native (it
605
612
  // can render at its full unclipped content height instead of the screen's), which leaves the
606
613
  // header's back button touch target unreliable underneath it.
@@ -698,6 +705,8 @@ function UpdateDialog({ rotation = 0, autoCheck = true, autoPrompt = true, onErr
698
705
  }
699
706
 
700
707
  export {
708
+ WELL_SHADOW,
709
+ useWellColors,
701
710
  LOCKED_BADGE_COLOR,
702
711
  AchievementRow,
703
712
  MONO_FONT,