@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 +10 -1
- package/dist/chrome/index.d.mts +15 -3
- package/dist/chrome/index.d.ts +15 -3
- package/dist/chrome/index.js +55 -42
- package/dist/chrome/index.mjs +7 -3
- package/dist/{chunk-DK3HOZC5.mjs → chunk-N7A7W72S.mjs} +38 -29
- package/dist/index.d.mts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +140 -117
- package/dist/index.mjs +66 -53
- package/package.json +10 -10
- package/src/AchievementCatalogSection.tsx +7 -6
- package/src/AchievementRow.tsx +13 -13
- package/src/ActivityStatSection.tsx +10 -5
- package/src/BaseStatsScreen.tsx +7 -5
- package/src/PlayerSetupPanel.tsx +77 -56
- package/src/StatRow.tsx +10 -11
- package/src/StatSection.tsx +14 -14
- package/src/chrome/index.ts +1 -0
- package/src/index.ts +2 -1
- package/src/wellSurface.ts +30 -0
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`
|
package/dist/chrome/index.d.mts
CHANGED
|
@@ -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
|
-
|
|
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 };
|
package/dist/chrome/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
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 };
|
package/dist/chrome/index.js
CHANGED
|
@@ -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
|
|
75
|
-
const fg = fgOverride ??
|
|
76
|
-
const fgMuted = fgMutedOverride ??
|
|
77
|
-
const sectionBg = sectionBgOverride ??
|
|
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
|
|
164
|
-
const fg = fgOverride ??
|
|
165
|
-
const fgMuted = fgMutedOverride ??
|
|
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
|
|
189
|
-
const fg = fgOverride ??
|
|
190
|
-
const sectionBg = sectionBgOverride ??
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
360
|
-
const blur = (0,
|
|
361
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
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,
|
|
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,
|
|
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,
|
|
506
|
-
const expoBlur = (0,
|
|
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)(
|
|
530
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
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)(
|
|
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
|
|
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,
|
|
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)(
|
|
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
|
|
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
|
});
|
package/dist/chrome/index.mjs
CHANGED
|
@@ -14,9 +14,11 @@ import {
|
|
|
14
14
|
StatRow,
|
|
15
15
|
StatSection,
|
|
16
16
|
UpdateDialog,
|
|
17
|
+
WELL_SHADOW,
|
|
17
18
|
getStaggeredWordDuration,
|
|
18
|
-
useCompactDialog
|
|
19
|
-
|
|
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/
|
|
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
|
|
19
|
-
const fg = fgOverride ??
|
|
20
|
-
const fgMuted = fgMutedOverride ??
|
|
21
|
-
const sectionBg = sectionBgOverride ??
|
|
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
|
|
112
|
-
const fg = fgOverride ??
|
|
113
|
-
const fgMuted = fgMutedOverride ??
|
|
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
|
|
137
|
-
const fg = fgOverride ??
|
|
138
|
-
const sectionBg = sectionBgOverride ??
|
|
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
|
|
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 } =
|
|
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
|
|
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 } =
|
|
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
|
|
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 {
|
|
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 } =
|
|
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(
|
|
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
|
|
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,
|