@buoy-gg/time-machine 7.0.21 → 7.0.23
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/lib/commonjs/components/TimeMachineBody.js +148 -583
- package/lib/commonjs/components/TimeMachineBody.js.map +1 -1
- package/lib/commonjs/components/TimeMachineModal.js +10 -11
- package/lib/commonjs/components/TimeMachineModal.js.map +1 -1
- package/lib/commonjs/components/confirm.js +39 -0
- package/lib/commonjs/components/confirm.js.map +1 -0
- package/lib/commonjs/components/format.js +24 -0
- package/lib/commonjs/components/format.js.map +1 -0
- package/lib/commonjs/components/list/CaptureBar.js +95 -0
- package/lib/commonjs/components/list/CaptureBar.js.map +1 -0
- package/lib/commonjs/components/list/RestoreOutcomeCard.js +162 -0
- package/lib/commonjs/components/list/RestoreOutcomeCard.js.map +1 -0
- package/lib/commonjs/components/list/SnapshotRow.js +141 -0
- package/lib/commonjs/components/list/SnapshotRow.js.map +1 -0
- package/lib/commonjs/components/list/SourcesStrip.js +126 -0
- package/lib/commonjs/components/list/SourcesStrip.js.map +1 -0
- package/lib/commonjs/components/list/UndoDeleteBar.js +81 -0
- package/lib/commonjs/components/list/UndoDeleteBar.js.map +1 -0
- package/lib/commonjs/components/list/WipeAllRow.js +46 -0
- package/lib/commonjs/components/list/WipeAllRow.js.map +1 -0
- package/lib/commonjs/components/preview/ItemDiffPanel.js +77 -0
- package/lib/commonjs/components/preview/ItemDiffPanel.js.map +1 -0
- package/lib/commonjs/components/preview/PreviewFlow.js +51 -0
- package/lib/commonjs/components/preview/PreviewFlow.js.map +1 -0
- package/lib/commonjs/components/preview/RestorePointNameRow.js +83 -0
- package/lib/commonjs/components/preview/RestorePointNameRow.js.map +1 -0
- package/lib/commonjs/components/preview/RestorePreviewScreen.js +549 -635
- package/lib/commonjs/components/preview/RestorePreviewScreen.js.map +1 -1
- package/lib/commonjs/components/preview/verdictMeta.js +8 -8
- package/lib/commonjs/components/preview/verdictMeta.js.map +1 -1
- package/lib/commonjs/components/sources.js +72 -0
- package/lib/commonjs/components/sources.js.map +1 -0
- package/lib/commonjs/index.js +55 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/store/routeRestore.js +188 -0
- package/lib/commonjs/store/routeRestore.js.map +1 -0
- package/lib/commonjs/store/snapshotVault.js +93 -9
- package/lib/commonjs/store/snapshotVault.js.map +1 -1
- package/lib/commonjs/store/timeMachineStore.js +164 -7
- package/lib/commonjs/store/timeMachineStore.js.map +1 -1
- package/lib/commonjs/sync/timeMachineSyncAdapter.js +59 -4
- package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +1 -1
- package/lib/commonjs/ui/SwipeActionsRow.js +167 -0
- package/lib/commonjs/ui/SwipeActionsRow.js.map +1 -0
- package/lib/commonjs/ui/primitives.js +164 -0
- package/lib/commonjs/ui/primitives.js.map +1 -0
- package/lib/commonjs/ui/tmTheme.js +103 -0
- package/lib/commonjs/ui/tmTheme.js.map +1 -0
- package/lib/module/components/TimeMachineBody.js +151 -586
- package/lib/module/components/TimeMachineBody.js.map +1 -1
- package/lib/module/components/TimeMachineModal.js +11 -12
- package/lib/module/components/TimeMachineModal.js.map +1 -1
- package/lib/module/components/confirm.js +34 -0
- package/lib/module/components/confirm.js.map +1 -0
- package/lib/module/components/format.js +19 -0
- package/lib/module/components/format.js.map +1 -0
- package/lib/module/components/list/CaptureBar.js +90 -0
- package/lib/module/components/list/CaptureBar.js.map +1 -0
- package/lib/module/components/list/RestoreOutcomeCard.js +156 -0
- package/lib/module/components/list/RestoreOutcomeCard.js.map +1 -0
- package/lib/module/components/list/SnapshotRow.js +138 -0
- package/lib/module/components/list/SnapshotRow.js.map +1 -0
- package/lib/module/components/list/SourcesStrip.js +121 -0
- package/lib/module/components/list/SourcesStrip.js.map +1 -0
- package/lib/module/components/list/UndoDeleteBar.js +78 -0
- package/lib/module/components/list/UndoDeleteBar.js.map +1 -0
- package/lib/module/components/list/WipeAllRow.js +41 -0
- package/lib/module/components/list/WipeAllRow.js.map +1 -0
- package/lib/module/components/preview/ItemDiffPanel.js +72 -0
- package/lib/module/components/preview/ItemDiffPanel.js.map +1 -0
- package/lib/module/components/preview/PreviewFlow.js +46 -0
- package/lib/module/components/preview/PreviewFlow.js.map +1 -0
- package/lib/module/components/preview/RestorePointNameRow.js +78 -0
- package/lib/module/components/preview/RestorePointNameRow.js.map +1 -0
- package/lib/module/components/preview/RestorePreviewScreen.js +552 -638
- package/lib/module/components/preview/RestorePreviewScreen.js.map +1 -1
- package/lib/module/components/preview/verdictMeta.js +9 -8
- package/lib/module/components/preview/verdictMeta.js.map +1 -1
- package/lib/module/components/sources.js +66 -0
- package/lib/module/components/sources.js.map +1 -0
- package/lib/module/index.js +11 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/store/routeRestore.js +176 -0
- package/lib/module/store/routeRestore.js.map +1 -0
- package/lib/module/store/snapshotVault.js +87 -9
- package/lib/module/store/snapshotVault.js.map +1 -1
- package/lib/module/store/timeMachineStore.js +164 -8
- package/lib/module/store/timeMachineStore.js.map +1 -1
- package/lib/module/sync/timeMachineSyncAdapter.js +59 -4
- package/lib/module/sync/timeMachineSyncAdapter.js.map +1 -1
- package/lib/module/ui/SwipeActionsRow.js +162 -0
- package/lib/module/ui/SwipeActionsRow.js.map +1 -0
- package/lib/module/ui/primitives.js +156 -0
- package/lib/module/ui/primitives.js.map +1 -0
- package/lib/module/ui/tmTheme.js +99 -0
- package/lib/module/ui/tmTheme.js.map +1 -0
- package/lib/typescript/components/TimeMachineBody.d.ts.map +1 -1
- package/lib/typescript/components/TimeMachineModal.d.ts.map +1 -1
- package/lib/typescript/components/confirm.d.ts +2 -0
- package/lib/typescript/components/confirm.d.ts.map +1 -0
- package/lib/typescript/components/format.d.ts +4 -0
- package/lib/typescript/components/format.d.ts.map +1 -0
- package/lib/typescript/components/list/CaptureBar.d.ts +6 -0
- package/lib/typescript/components/list/CaptureBar.d.ts.map +1 -0
- package/lib/typescript/components/list/RestoreOutcomeCard.d.ts +11 -0
- package/lib/typescript/components/list/RestoreOutcomeCard.d.ts.map +1 -0
- package/lib/typescript/components/list/SnapshotRow.d.ts +12 -0
- package/lib/typescript/components/list/SnapshotRow.d.ts.map +1 -0
- package/lib/typescript/components/list/SourcesStrip.d.ts +5 -0
- package/lib/typescript/components/list/SourcesStrip.d.ts.map +1 -0
- package/lib/typescript/components/list/UndoDeleteBar.d.ts +8 -0
- package/lib/typescript/components/list/UndoDeleteBar.d.ts.map +1 -0
- package/lib/typescript/components/list/WipeAllRow.d.ts +5 -0
- package/lib/typescript/components/list/WipeAllRow.d.ts.map +1 -0
- package/lib/typescript/components/preview/ItemDiffPanel.d.ts +5 -0
- package/lib/typescript/components/preview/ItemDiffPanel.d.ts.map +1 -0
- package/lib/typescript/components/preview/PreviewFlow.d.ts +9 -0
- package/lib/typescript/components/preview/PreviewFlow.d.ts.map +1 -0
- package/lib/typescript/components/preview/RestorePointNameRow.d.ts +5 -0
- package/lib/typescript/components/preview/RestorePointNameRow.d.ts.map +1 -0
- package/lib/typescript/components/preview/RestorePreviewScreen.d.ts +1 -5
- package/lib/typescript/components/preview/RestorePreviewScreen.d.ts.map +1 -1
- package/lib/typescript/components/preview/verdictMeta.d.ts +5 -0
- package/lib/typescript/components/preview/verdictMeta.d.ts.map +1 -1
- package/lib/typescript/components/sources.d.ts +36 -0
- package/lib/typescript/components/sources.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/store/routeRestore.d.ts +51 -0
- package/lib/typescript/store/routeRestore.d.ts.map +1 -0
- package/lib/typescript/store/snapshotVault.d.ts +55 -0
- package/lib/typescript/store/snapshotVault.d.ts.map +1 -1
- package/lib/typescript/store/timeMachineStore.d.ts +64 -2
- package/lib/typescript/store/timeMachineStore.d.ts.map +1 -1
- package/lib/typescript/sync/timeMachineSyncAdapter.d.ts +25 -0
- package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +1 -1
- package/lib/typescript/ui/SwipeActionsRow.d.ts +32 -0
- package/lib/typescript/ui/SwipeActionsRow.d.ts.map +1 -0
- package/lib/typescript/ui/primitives.d.ts +57 -0
- package/lib/typescript/ui/primitives.d.ts.map +1 -0
- package/lib/typescript/ui/tmTheme.d.ts +67 -0
- package/lib/typescript/ui/tmTheme.d.ts.map +1 -0
- package/package.json +12 -8
- package/src/components/TimeMachineBody.tsx +184 -682
- package/src/components/TimeMachineModal.tsx +10 -11
- package/src/components/confirm.ts +35 -0
- package/src/components/format.ts +17 -0
- package/src/components/list/CaptureBar.tsx +100 -0
- package/src/components/list/RestoreOutcomeCard.tsx +159 -0
- package/src/components/list/SnapshotRow.tsx +155 -0
- package/src/components/list/SourcesStrip.tsx +124 -0
- package/src/components/list/UndoDeleteBar.tsx +76 -0
- package/src/components/list/WipeAllRow.tsx +42 -0
- package/src/components/preview/ItemDiffPanel.tsx +77 -0
- package/src/components/preview/PreviewFlow.tsx +70 -0
- package/src/components/preview/RestorePointNameRow.tsx +80 -0
- package/src/components/preview/RestorePreviewScreen.tsx +535 -535
- package/src/components/preview/verdictMeta.ts +8 -8
- package/src/components/sources.ts +92 -0
- package/src/index.tsx +22 -0
- package/src/store/routeRestore.ts +194 -0
- package/src/store/snapshotVault.ts +138 -9
- package/src/store/timeMachineStore.ts +195 -5
- package/src/sync/timeMachineSyncAdapter.ts +57 -4
- package/src/ui/SwipeActionsRow.tsx +199 -0
- package/src/ui/primitives.tsx +157 -0
- package/src/ui/tmTheme.ts +107 -0
- package/lib/commonjs/components/preview/ItemDetailScreen.js +0 -189
- package/lib/commonjs/components/preview/ItemDetailScreen.js.map +0 -1
- package/lib/module/components/preview/ItemDetailScreen.js +0 -184
- package/lib/module/components/preview/ItemDetailScreen.js.map +0 -1
- package/lib/typescript/components/preview/ItemDetailScreen.d.ts +0 -11
- package/lib/typescript/components/preview/ItemDetailScreen.d.ts.map +0 -1
- package/src/components/preview/ItemDetailScreen.tsx +0 -172
|
@@ -7,630 +7,195 @@ exports.TimeMachineBody = TimeMachineBody;
|
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
10
|
-
var _floatingToolsCore = require("@buoy-gg/floating-tools-core");
|
|
11
10
|
var _core = require("@buoy-gg/core");
|
|
12
11
|
var _license = require("@buoy-gg/license");
|
|
13
12
|
var _useTimeMachine = require("../hooks/useTimeMachine");
|
|
14
13
|
var _timeMachineStore = require("../store/timeMachineStore");
|
|
15
|
-
var
|
|
16
|
-
var
|
|
14
|
+
var _primitives = require("../ui/primitives");
|
|
15
|
+
var _tmTheme = require("../ui/tmTheme");
|
|
16
|
+
var _sources = require("./sources");
|
|
17
|
+
var _confirm = require("./confirm");
|
|
18
|
+
var _CaptureBar = require("./list/CaptureBar");
|
|
19
|
+
var _RestoreOutcomeCard = require("./list/RestoreOutcomeCard");
|
|
20
|
+
var _SnapshotRow = require("./list/SnapshotRow");
|
|
21
|
+
var _UndoDeleteBar = require("./list/UndoDeleteBar");
|
|
22
|
+
var _SourcesStrip = require("./list/SourcesStrip");
|
|
23
|
+
var _WipeAllRow = require("./list/WipeAllRow");
|
|
24
|
+
var _PreviewFlow = require("./preview/PreviewFlow");
|
|
17
25
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
26
|
/**
|
|
19
|
-
* Time Machine body —
|
|
20
|
-
* the Restore Preview flow (tap a snapshot row → item-level diff of what a
|
|
21
|
-
* restore would change; tap an item → tree/split detail).
|
|
27
|
+
* Time Machine body — the screen router plus the restore-point list.
|
|
22
28
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
29
|
+
* Screens: list → preview. Each is its own component that mounts and
|
|
30
|
+
* unmounts whole (no branching inside a single tree), and each owns its own
|
|
31
|
+
* scrolling — the host must NOT wrap this in a scroll view, or the preview's
|
|
32
|
+
* virtualized FlatList is defeated. Item diffs expand inline in that list
|
|
33
|
+
* rather than being a third screen.
|
|
34
|
+
*
|
|
35
|
+
* The list follows the grouped-inset surface in ../ui: capture bar, the
|
|
36
|
+
* Sources strip, one card of restore points with swipe-to-delete, and the
|
|
37
|
+
* app-wide wipe kept last and understated.
|
|
26
38
|
*/
|
|
27
39
|
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
function formatBytes(bytes) {
|
|
46
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
47
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
48
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
49
|
-
}
|
|
50
|
-
function warningCount(meta) {
|
|
51
|
-
return Object.values(meta.sources).reduce((sum, s) => sum + s.warnings.length, 0);
|
|
52
|
-
}
|
|
40
|
+
function TimeMachineBody() {
|
|
41
|
+
const [screen, setScreen] = (0, _react.useState)({
|
|
42
|
+
kind: "list"
|
|
43
|
+
});
|
|
44
|
+
const {
|
|
45
|
+
snapshots,
|
|
46
|
+
busy,
|
|
47
|
+
preview
|
|
48
|
+
} = (0, _useTimeMachine.useTimeMachineState)();
|
|
49
|
+
const sources = (0, _sources.useSourceStatuses)();
|
|
50
|
+
const backToList = () => {
|
|
51
|
+
_timeMachineStore.timeMachineStore.clearPreview();
|
|
52
|
+
setScreen({
|
|
53
|
+
kind: "list"
|
|
54
|
+
});
|
|
55
|
+
};
|
|
53
56
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}) {
|
|
73
|
-
const entries = Object.entries(outcome.results);
|
|
74
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
75
|
-
style: styles.outcomePanel,
|
|
76
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
77
|
-
style: styles.outcomeHeaderRow,
|
|
78
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
79
|
-
style: styles.outcomeTitle,
|
|
80
|
-
children: ["Restored \u201C", outcome.snapshotName, "\u201D", outcome.mode === "reload" || outcome.willReload ? " · reloading" : ""]
|
|
81
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
82
|
-
onPress: () => _timeMachineStore.timeMachineStore.clearLastOutcome(),
|
|
83
|
-
hitSlop: {
|
|
84
|
-
top: 8,
|
|
85
|
-
bottom: 8,
|
|
86
|
-
left: 8,
|
|
87
|
-
right: 8
|
|
88
|
-
},
|
|
89
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
90
|
-
style: styles.outcomeDismiss,
|
|
91
|
-
children: "\u2715"
|
|
92
|
-
})
|
|
93
|
-
})]
|
|
94
|
-
}), entries.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
95
|
-
style: styles.outcomeLine,
|
|
96
|
-
children: "no sources restored"
|
|
97
|
-
}), entries.map(([sourceId, r]) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
98
|
-
style: styles.outcomeSource,
|
|
99
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
100
|
-
style: [styles.outcomeLine, !r.ok && styles.outcomeLineBad],
|
|
101
|
-
children: [r.ok ? "✓" : "✕", " ", sourceId, " \u2014 applied ", r.applied, r.skipped.length > 0 ? `, skipped ${r.skipped.length}` : ""]
|
|
102
|
-
}), r.skipped.slice(0, 3).map(skip => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
103
|
-
style: styles.outcomeDetail,
|
|
104
|
-
children: ["\xB7 ", skip.id, ": ", skip.reason]
|
|
105
|
-
}, skip.id)), r.warnings.slice(0, 3).map(warning => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
106
|
-
style: styles.outcomeDetail,
|
|
107
|
-
children: ["\u26A0 ", warning]
|
|
108
|
-
}, warning))]
|
|
109
|
-
}, sourceId))]
|
|
57
|
+
// The preview can't render without a built diff (clearPreview races a
|
|
58
|
+
// back-navigation) — fall through to the list rather than an empty shell.
|
|
59
|
+
if (screen.kind === "preview" && preview) return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PreviewFlow.PreviewScreen, {
|
|
60
|
+
preview: preview,
|
|
61
|
+
snapshots: snapshots,
|
|
62
|
+
busy: busy !== null,
|
|
63
|
+
onClose: backToList
|
|
64
|
+
});
|
|
65
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(RestorePointList, {
|
|
66
|
+
sources: sources,
|
|
67
|
+
onOpenPreview: meta => {
|
|
68
|
+
void _timeMachineStore.timeMachineStore.buildPreview({
|
|
69
|
+
snapshotId: meta.id
|
|
70
|
+
});
|
|
71
|
+
setScreen({
|
|
72
|
+
kind: "preview"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
110
75
|
});
|
|
111
76
|
}
|
|
112
|
-
function
|
|
77
|
+
function RestorePointList({
|
|
78
|
+
sources,
|
|
79
|
+
onOpenPreview
|
|
80
|
+
}) {
|
|
113
81
|
const {
|
|
114
82
|
snapshots,
|
|
115
83
|
hasLoaded,
|
|
116
84
|
busy,
|
|
117
85
|
lastOutcome,
|
|
118
|
-
|
|
119
|
-
remoteProviders
|
|
86
|
+
recentlyDeleted
|
|
120
87
|
} = (0, _useTimeMachine.useTimeMachineState)();
|
|
121
|
-
const localProviders = (0, _useTimeMachine.useSnapshotProviders)();
|
|
122
88
|
const isPro = (0, _license.useIsPro)();
|
|
89
|
+
const snapshotLimit = (0, _sharedUi.useLimit)("timeMachine.snapshots");
|
|
123
90
|
const host = (0, _core.useToolHost)();
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
kind: "list"
|
|
91
|
+
const insets = (0, _sharedUi.useSafeAreaInsets)({
|
|
92
|
+
minBottom: 16
|
|
127
93
|
});
|
|
128
|
-
const [picker, setPicker] = (0, _react.useState)(null);
|
|
129
94
|
|
|
130
|
-
// Header search (when hosted by the core shell) filters the
|
|
131
|
-
const
|
|
132
|
-
const
|
|
95
|
+
// Header search (when hosted by the core shell) filters the list.
|
|
96
|
+
const query = host.search.trim().toLowerCase();
|
|
97
|
+
const visible = query ? snapshots.filter(s => s.name.toLowerCase().includes(query)) : snapshots;
|
|
133
98
|
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
99
|
+
// Infinity for Pro, so this is simply false for them.
|
|
100
|
+
const atCaptureLimit = snapshots.length >= snapshotLimit;
|
|
101
|
+
const captureDisabled = busy !== null || atCaptureLimit;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Restoring is the last thing anyone wants from this screen, so the tool
|
|
105
|
+
* gets out of the way the moment it worked — with no toast and no banner.
|
|
106
|
+
* The restored app IS the confirmation, and anything announcing it is one
|
|
107
|
+
* more thing to dismiss on a flow people run dozens of times an hour.
|
|
108
|
+
*
|
|
109
|
+
* It MINIMIZES rather than closes: the list, the search and the screen you
|
|
110
|
+
* were on all survive, and coming back is one tap on the dock. A partial
|
|
111
|
+
* restore stays open instead, because the outcome card is the only place
|
|
112
|
+
* the per-source failures are reported.
|
|
113
|
+
*/
|
|
114
|
+
const restore = meta => {
|
|
149
115
|
if (busy) return;
|
|
150
116
|
if (meta.baseline) {
|
|
151
|
-
confirmDestructive("Restore fresh install?", "This wipes all app storage and reloads the app.", "Wipe & reload", () => void _timeMachineStore.timeMachineStore.restore(meta.id, "reload"));
|
|
117
|
+
(0, _confirm.confirmDestructive)("Restore fresh install?", "This wipes all app storage and reloads the app.", "Wipe & reload", () => void _timeMachineStore.timeMachineStore.restore(meta.id, "reload"));
|
|
152
118
|
return;
|
|
153
119
|
}
|
|
154
|
-
void _timeMachineStore.timeMachineStore.restore(meta.id,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
};
|
|
159
|
-
const wipeAll = () => {
|
|
160
|
-
if (busy) return;
|
|
161
|
-
confirmDestructive("Wipe all app state?", "This deletes all app storage and reloads the app — like a fresh install.", "Wipe & reload", () => void _timeMachineStore.timeMachineStore.wipeAll());
|
|
162
|
-
};
|
|
163
|
-
const openPreview = meta => {
|
|
164
|
-
void _timeMachineStore.timeMachineStore.buildPreview({
|
|
165
|
-
snapshotId: meta.id
|
|
166
|
-
});
|
|
167
|
-
setScreen({
|
|
168
|
-
kind: "preview"
|
|
120
|
+
void _timeMachineStore.timeMachineStore.restore(meta.id, "live").then(outcome => {
|
|
121
|
+
const clean = Object.values(outcome.results).every(r => r.ok);
|
|
122
|
+
if (!clean || outcome.willReload) return;
|
|
123
|
+
host.minimize();
|
|
169
124
|
});
|
|
170
125
|
};
|
|
171
|
-
const closePreview = () => {
|
|
172
|
-
_timeMachineStore.timeMachineStore.clearPreview();
|
|
173
|
-
setScreen({
|
|
174
|
-
kind: "list"
|
|
175
|
-
});
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
// ── Preview / item screens ──
|
|
179
|
-
if (screen.kind === "item" && preview) {
|
|
180
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ItemDetailScreen.ItemDetailScreen, {
|
|
181
|
-
sourceLabel: screen.sourceLabel,
|
|
182
|
-
item: screen.item,
|
|
183
|
-
leftLabel: preview.left === "current" ? "CURRENT" : snapshots.find(s => s.id === preview.left.snapshotId)?.name ?? "snapshot",
|
|
184
|
-
rightLabel: preview.right === "current" ? "CURRENT" : snapshots.find(s => s.id === preview.right.snapshotId)?.name ?? "snapshot",
|
|
185
|
-
onBack: () => setScreen({
|
|
186
|
-
kind: "preview"
|
|
187
|
-
})
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
if (screen.kind === "preview" && preview) {
|
|
191
|
-
const rightMeta = preview.right === "current" ? undefined : snapshots.find(s => s.id === preview.right.snapshotId);
|
|
192
|
-
const pickerItems = [];
|
|
193
|
-
if (picker) {
|
|
194
|
-
const otherRef = picker === "left" ? preview.right : preview.left;
|
|
195
|
-
const otherId = otherRef === "current" ? null : otherRef.snapshotId;
|
|
196
|
-
if (picker === "left") {
|
|
197
|
-
pickerItems.push({
|
|
198
|
-
index: 0,
|
|
199
|
-
label: "Current state",
|
|
200
|
-
timestamp: "live",
|
|
201
|
-
relativeTime: "now",
|
|
202
|
-
selected: preview.left === "current"
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
snapshots.forEach((s, i) => {
|
|
206
|
-
const ref = {
|
|
207
|
-
snapshotId: s.id
|
|
208
|
-
};
|
|
209
|
-
const current = picker === "left" ? preview.left : preview.right;
|
|
210
|
-
pickerItems.push({
|
|
211
|
-
index: picker === "left" ? i + 1 : i,
|
|
212
|
-
label: s.baseline ? `⌂ ${s.name}` : s.name,
|
|
213
|
-
timestamp: new Date(s.createdAt).toLocaleTimeString(),
|
|
214
|
-
relativeTime: timeAgo(s.createdAt),
|
|
215
|
-
disabled: s.id === otherId || picker === "right" && s.baseline,
|
|
216
|
-
selected: current !== "current" && current.snapshotId === s.id
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
const onPickerSelect = index => {
|
|
221
|
-
const side = picker;
|
|
222
|
-
setPicker(null);
|
|
223
|
-
if (!side) return;
|
|
224
|
-
let ref;
|
|
225
|
-
if (side === "left") {
|
|
226
|
-
ref = index === 0 ? "current" : {
|
|
227
|
-
snapshotId: snapshots[index - 1].id
|
|
228
|
-
};
|
|
229
|
-
void _timeMachineStore.timeMachineStore.buildPreview(preview.right, ref);
|
|
230
|
-
} else {
|
|
231
|
-
ref = {
|
|
232
|
-
snapshotId: snapshots[index].id
|
|
233
|
-
};
|
|
234
|
-
void _timeMachineStore.timeMachineStore.buildPreview(ref, preview.left);
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
238
|
-
style: styles.screenFill,
|
|
239
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_RestorePreviewScreen.RestorePreviewScreen, {
|
|
240
|
-
preview: preview,
|
|
241
|
-
snapshots: snapshots,
|
|
242
|
-
busy: busy !== null,
|
|
243
|
-
onBack: closePreview,
|
|
244
|
-
onOpenItem: (sourceId, item) => {
|
|
245
|
-
const source = preview.sources.find(s => s.id === sourceId);
|
|
246
|
-
setScreen({
|
|
247
|
-
kind: "item",
|
|
248
|
-
sourceId,
|
|
249
|
-
sourceLabel: source?.label ?? sourceId,
|
|
250
|
-
item
|
|
251
|
-
});
|
|
252
|
-
},
|
|
253
|
-
onRestore: (mode, excludeKeys) => {
|
|
254
|
-
if (!rightMeta || busy) return;
|
|
255
|
-
if (rightMeta.baseline) {
|
|
256
|
-
confirmDestructive("Restore fresh install?", "This wipes all app storage and reloads the app.", "Wipe & reload", () => void _timeMachineStore.timeMachineStore.restore(rightMeta.id, "reload"));
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
// Land back on the list, where the outcome panel reports the
|
|
260
|
-
// results — the preview's diff is stale the moment restore runs.
|
|
261
|
-
void _timeMachineStore.timeMachineStore.restore(rightMeta.id, mode, excludeKeys).then(() => closePreview());
|
|
262
|
-
},
|
|
263
|
-
onPickSide: setPicker,
|
|
264
|
-
onRefresh: () => void _timeMachineStore.timeMachineStore.buildPreview(preview.right, preview.left)
|
|
265
|
-
}), picker && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.EventPickerModal, {
|
|
266
|
-
isOpen: true,
|
|
267
|
-
onClose: () => setPicker(null),
|
|
268
|
-
title: picker === "left" ? "Compare from" : "Compare to",
|
|
269
|
-
position: picker,
|
|
270
|
-
items: pickerItems,
|
|
271
|
-
onSelect: onPickerSelect
|
|
272
|
-
})]
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// ── List screen ──
|
|
277
|
-
const unavailable = providers.filter(p => p.detail && (!p.canCapture || !p.canRestore));
|
|
278
126
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
|
|
279
|
-
style: styles.
|
|
280
|
-
contentContainerStyle: styles.
|
|
281
|
-
|
|
127
|
+
style: styles.fill,
|
|
128
|
+
contentContainerStyle: [styles.content, {
|
|
129
|
+
paddingBottom: insets.bottom
|
|
130
|
+
}],
|
|
131
|
+
children: [lastOutcome && (0, _RestoreOutcomeCard.restoreNeedsAttention)(lastOutcome) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_RestoreOutcomeCard.RestoreOutcomeCard, {
|
|
282
132
|
outcome: lastOutcome
|
|
283
|
-
}), /*#__PURE__*/(0, _jsxRuntime.
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
291
|
-
style: styles.captureInput,
|
|
292
|
-
value: name,
|
|
293
|
-
onChangeText: setName,
|
|
294
|
-
placeholder: "Name this restore point\u2026",
|
|
295
|
-
placeholderTextColor: _sharedUi.buoyColors.textMuted,
|
|
296
|
-
editable: !captureDisabled,
|
|
297
|
-
onSubmitEditing: capture,
|
|
298
|
-
returnKeyType: "done",
|
|
299
|
-
testID: "time-machine-name-input"
|
|
300
|
-
})]
|
|
301
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
302
|
-
style: [styles.captureButton, captureDisabled && styles.buttonDisabled],
|
|
303
|
-
onPress: capture,
|
|
133
|
+
}) : null, recentlyDeleted ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_UndoDeleteBar.UndoDeleteBar, {
|
|
134
|
+
name: recentlyDeleted.stored.meta.name,
|
|
135
|
+
at: recentlyDeleted.at,
|
|
136
|
+
onUndo: () => void _timeMachineStore.timeMachineStore.undoDelete(),
|
|
137
|
+
onExpire: () => _timeMachineStore.timeMachineStore.clearRecentlyDeleted()
|
|
138
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
139
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CaptureBar.CaptureBar, {
|
|
304
140
|
disabled: captureDisabled,
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
})
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
children: [
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
}, p.id)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
343
|
-
style: [styles.sectionTitle, styles.sectionSpacing],
|
|
344
|
-
children: "Restore points"
|
|
345
|
-
}), hasLoaded && snapshots.length === 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
346
|
-
style: styles.emptyText,
|
|
347
|
-
children: "No restore points yet. Set up the state you want to return to, then capture it."
|
|
348
|
-
}), visibleSnapshots.map(meta => {
|
|
349
|
-
const warnings = warningCount(meta);
|
|
350
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
|
|
351
|
-
style: styles.snapshotCard,
|
|
352
|
-
onPress: () => openPreview(meta),
|
|
353
|
-
testID: `time-machine-snap-${meta.id}`,
|
|
354
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
355
|
-
style: styles.snapshotIconTile,
|
|
356
|
-
children: meta.baseline ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Home, {
|
|
357
|
-
size: 17,
|
|
358
|
-
color: _sharedUi.buoyColors.textSecondary
|
|
359
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_floatingToolsCore.TimeMachineIcon, {
|
|
360
|
-
size: 18
|
|
361
|
-
})
|
|
362
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
363
|
-
style: styles.snapshotInfo,
|
|
364
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
365
|
-
style: styles.snapshotName,
|
|
366
|
-
numberOfLines: 1,
|
|
367
|
-
children: meta.name
|
|
368
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
369
|
-
style: styles.snapshotMeta,
|
|
370
|
-
numberOfLines: 1,
|
|
371
|
-
children: [meta.baseline ? "wipes to fresh install" : `${timeAgo(meta.createdAt)} · ${formatBytes(meta.sizeBytes)} · ${Object.keys(meta.sources).length} sources`, meta.scope?.length ? ` · scoped (${meta.scope.length})` : "", warnings > 0 ? ` · ⚠ ${warnings}` : ""]
|
|
372
|
-
})]
|
|
373
|
-
}), !meta.baseline ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
374
|
-
style: [styles.rowAction, busy && styles.buttonDisabled],
|
|
375
|
-
onPress: () => restore(meta, "live"),
|
|
376
|
-
disabled: busy !== null,
|
|
377
|
-
accessibilityLabel: "Restore",
|
|
378
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
379
|
-
style: styles.rowActionLabel,
|
|
380
|
-
children: "RESTORE"
|
|
381
|
-
})
|
|
382
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
383
|
-
style: [styles.rowAction, busy && styles.buttonDisabled],
|
|
384
|
-
onPress: () => restore(meta, "reload"),
|
|
385
|
-
disabled: busy !== null,
|
|
386
|
-
accessibilityLabel: "Wipe and reload",
|
|
387
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
388
|
-
style: styles.rowActionLabelDanger,
|
|
389
|
-
children: "WIPE"
|
|
390
|
-
})
|
|
391
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
392
|
-
style: styles.rowAction,
|
|
393
|
-
onPress: () => remove(meta),
|
|
394
|
-
hitSlop: {
|
|
395
|
-
top: 8,
|
|
396
|
-
bottom: 8,
|
|
397
|
-
left: 4,
|
|
398
|
-
right: 8
|
|
399
|
-
},
|
|
400
|
-
accessibilityLabel: "Delete",
|
|
401
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
|
|
402
|
-
size: 14,
|
|
403
|
-
color: _sharedUi.buoyColors.error
|
|
404
|
-
})
|
|
405
|
-
})]
|
|
406
|
-
}, meta.id);
|
|
407
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
|
|
408
|
-
style: [styles.wipeAllButton, busy && styles.buttonDisabled],
|
|
409
|
-
onPress: wipeAll,
|
|
410
|
-
disabled: busy !== null,
|
|
411
|
-
testID: "time-machine-wipe-all",
|
|
412
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
|
|
413
|
-
size: 13,
|
|
414
|
-
color: _sharedUi.buoyColors.error
|
|
415
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
416
|
-
style: styles.wipeAllText,
|
|
417
|
-
children: "Wipe all app state\u2026"
|
|
418
|
-
})]
|
|
419
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
420
|
-
style: styles.wipeAllCaption,
|
|
141
|
+
busy: busy === "capture",
|
|
142
|
+
onCapture: name => void _timeMachineStore.timeMachineStore.capture(name)
|
|
143
|
+
})
|
|
144
|
+
}), atCaptureLimit ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_primitives.Footnote, {
|
|
145
|
+
tone: "warning",
|
|
146
|
+
children: ["Free plan keeps ", snapshotLimit, " restore points. Upgrade to Pro for unlimited snapshots."]
|
|
147
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_primitives.SectionLabel, {
|
|
148
|
+
children: "Sources"
|
|
149
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SourcesStrip.SourcesStrip, {
|
|
150
|
+
sources: sources
|
|
151
|
+
}), sources.filter(s => s.detail && !(s.canCapture && s.canRestore)).map(s => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_primitives.Footnote, {
|
|
152
|
+
children: [s.label, ": ", s.detail]
|
|
153
|
+
}, s.id)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_primitives.SectionLabel, {
|
|
154
|
+
children: "Restore Points"
|
|
155
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_primitives.Group, {
|
|
156
|
+
children: [visible.map(meta => /*#__PURE__*/(0, _jsxRuntime.jsx)(_SnapshotRow.SnapshotRow, {
|
|
157
|
+
meta: meta,
|
|
158
|
+
busy: busy !== null,
|
|
159
|
+
onOpen: () => onOpenPreview(meta),
|
|
160
|
+
onRestore: () => restore(meta),
|
|
161
|
+
onDelete: () => void _timeMachineStore.timeMachineStore.delete(meta.id),
|
|
162
|
+
onDuplicate: () => void _timeMachineStore.timeMachineStore.duplicate(meta.id)
|
|
163
|
+
}, meta.id)), visible.length === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
164
|
+
style: styles.empty,
|
|
165
|
+
children: !hasLoaded ? "Loading restore points…" : snapshots.length > 0 ? "No restore point matches that name." : "Set up the state you want to come back to, then capture it."
|
|
166
|
+
}) : null]
|
|
167
|
+
}), visible.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_primitives.Footnote, {
|
|
168
|
+
children: "Swipe a restore point to rename, copy or delete it."
|
|
169
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
170
|
+
style: styles.spacer
|
|
171
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_primitives.Group, {
|
|
172
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_WipeAllRow.WipeAllRow, {
|
|
173
|
+
disabled: busy !== null,
|
|
174
|
+
onWipe: () => (0, _confirm.confirmDestructive)("Wipe all app state?", "This deletes all app storage and reloads the app — like a fresh install.", "Wipe & reload", () => void _timeMachineStore.timeMachineStore.wipeAll())
|
|
175
|
+
})
|
|
176
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_primitives.Footnote, {
|
|
177
|
+
centered: true,
|
|
421
178
|
children: "Deletes all app storage and reloads \u2014 like a fresh install."
|
|
422
179
|
})]
|
|
423
180
|
});
|
|
424
181
|
}
|
|
425
182
|
const styles = _reactNative.StyleSheet.create({
|
|
426
|
-
|
|
427
|
-
flex: 1
|
|
428
|
-
},
|
|
429
|
-
container: {
|
|
430
|
-
padding: 12,
|
|
431
|
-
gap: 8
|
|
432
|
-
},
|
|
433
|
-
captureCard: {
|
|
434
|
-
flexDirection: "row",
|
|
435
|
-
alignItems: "center",
|
|
436
|
-
gap: 8
|
|
437
|
-
},
|
|
438
|
-
captureField: {
|
|
439
|
-
flex: 1,
|
|
440
|
-
flexDirection: "row",
|
|
441
|
-
alignItems: "center",
|
|
442
|
-
gap: 8,
|
|
443
|
-
backgroundColor: _sharedUi.buoyColors.card,
|
|
444
|
-
borderColor: _sharedUi.buoyColors.border,
|
|
445
|
-
borderWidth: 1,
|
|
446
|
-
borderRadius: 10,
|
|
447
|
-
paddingHorizontal: 10
|
|
448
|
-
},
|
|
449
|
-
captureInput: {
|
|
183
|
+
fill: {
|
|
450
184
|
flex: 1,
|
|
451
|
-
|
|
452
|
-
fontSize: 13,
|
|
453
|
-
paddingVertical: 9
|
|
454
|
-
},
|
|
455
|
-
captureButton: {
|
|
456
|
-
backgroundColor: _sharedUi.buoyColors.primary,
|
|
457
|
-
borderRadius: 10,
|
|
458
|
-
paddingHorizontal: 16,
|
|
459
|
-
paddingVertical: 10,
|
|
460
|
-
justifyContent: "center"
|
|
461
|
-
},
|
|
462
|
-
captureButtonText: {
|
|
463
|
-
color: "#0A0A0A",
|
|
464
|
-
fontSize: 12,
|
|
465
|
-
fontWeight: "700",
|
|
466
|
-
letterSpacing: 0.5
|
|
467
|
-
},
|
|
468
|
-
buttonDisabled: {
|
|
469
|
-
opacity: 0.4
|
|
470
|
-
},
|
|
471
|
-
freeLimitNote: {
|
|
472
|
-
color: _sharedUi.buoyColors.warning,
|
|
473
|
-
fontSize: 11
|
|
474
|
-
},
|
|
475
|
-
sectionRow: {
|
|
476
|
-
flexDirection: "row",
|
|
477
|
-
alignItems: "center",
|
|
478
|
-
justifyContent: "space-between",
|
|
479
|
-
marginTop: 12,
|
|
480
|
-
gap: 10
|
|
481
|
-
},
|
|
482
|
-
sectionTitle: {
|
|
483
|
-
color: _sharedUi.buoyColors.text,
|
|
484
|
-
fontSize: 14,
|
|
485
|
-
fontWeight: "700"
|
|
486
|
-
},
|
|
487
|
-
sectionSpacing: {
|
|
488
|
-
marginTop: 14
|
|
489
|
-
},
|
|
490
|
-
sourceTiles: {
|
|
491
|
-
flexDirection: "row",
|
|
492
|
-
gap: 6,
|
|
493
|
-
flexWrap: "wrap",
|
|
494
|
-
justifyContent: "flex-end",
|
|
495
|
-
flex: 1
|
|
496
|
-
},
|
|
497
|
-
sourceTile: {
|
|
498
|
-
width: 32,
|
|
499
|
-
height: 32,
|
|
500
|
-
borderRadius: 9,
|
|
501
|
-
backgroundColor: _sharedUi.buoyColors.card,
|
|
502
|
-
borderColor: _sharedUi.buoyColors.border,
|
|
503
|
-
borderWidth: 1,
|
|
504
|
-
alignItems: "center",
|
|
505
|
-
justifyContent: "center"
|
|
506
|
-
},
|
|
507
|
-
sourceTileDot: {
|
|
508
|
-
position: "absolute",
|
|
509
|
-
top: 3,
|
|
510
|
-
right: 3,
|
|
511
|
-
width: 6,
|
|
512
|
-
height: 6,
|
|
513
|
-
borderRadius: 3
|
|
514
|
-
},
|
|
515
|
-
providerDetail: {
|
|
516
|
-
color: _sharedUi.buoyColors.textMuted,
|
|
517
|
-
fontSize: 10,
|
|
518
|
-
marginTop: 4
|
|
519
|
-
},
|
|
520
|
-
emptyText: {
|
|
521
|
-
color: _sharedUi.buoyColors.textMuted,
|
|
522
|
-
fontSize: 12,
|
|
523
|
-
marginTop: 8
|
|
524
|
-
},
|
|
525
|
-
snapshotCard: {
|
|
526
|
-
flexDirection: "row",
|
|
527
|
-
alignItems: "center",
|
|
528
|
-
backgroundColor: _sharedUi.buoyColors.card,
|
|
529
|
-
borderColor: _sharedUi.buoyColors.border,
|
|
530
|
-
borderWidth: 1,
|
|
531
|
-
borderRadius: 12,
|
|
532
|
-
paddingHorizontal: 12,
|
|
533
|
-
paddingVertical: 10,
|
|
534
|
-
marginTop: 8,
|
|
535
|
-
gap: 10
|
|
536
|
-
},
|
|
537
|
-
snapshotIconTile: {
|
|
538
|
-
width: 36,
|
|
539
|
-
height: 36,
|
|
540
|
-
borderRadius: 10,
|
|
541
|
-
backgroundColor: _sharedUi.buoyColors.hover,
|
|
542
|
-
alignItems: "center",
|
|
543
|
-
justifyContent: "center"
|
|
544
|
-
},
|
|
545
|
-
snapshotInfo: {
|
|
546
|
-
flex: 1,
|
|
547
|
-
minWidth: 0,
|
|
548
|
-
gap: 2
|
|
549
|
-
},
|
|
550
|
-
snapshotName: {
|
|
551
|
-
color: _sharedUi.buoyColors.text,
|
|
552
|
-
fontSize: 14,
|
|
553
|
-
fontWeight: "700"
|
|
554
|
-
},
|
|
555
|
-
snapshotMeta: {
|
|
556
|
-
color: _sharedUi.buoyColors.textMuted,
|
|
557
|
-
fontSize: 10,
|
|
558
|
-
fontVariant: ["tabular-nums"]
|
|
559
|
-
},
|
|
560
|
-
rowAction: {
|
|
561
|
-
padding: 4,
|
|
562
|
-
justifyContent: "center",
|
|
563
|
-
alignItems: "center"
|
|
564
|
-
},
|
|
565
|
-
rowActionLabel: {
|
|
566
|
-
color: _sharedUi.buoyColors.primary,
|
|
567
|
-
fontSize: 12,
|
|
568
|
-
fontWeight: "600"
|
|
569
|
-
},
|
|
570
|
-
rowActionLabelDanger: {
|
|
571
|
-
color: _sharedUi.buoyColors.error,
|
|
572
|
-
fontSize: 12,
|
|
573
|
-
fontWeight: "600"
|
|
574
|
-
},
|
|
575
|
-
wipeAllButton: {
|
|
576
|
-
flexDirection: "row",
|
|
577
|
-
alignItems: "center",
|
|
578
|
-
justifyContent: "center",
|
|
579
|
-
gap: 7,
|
|
580
|
-
borderColor: `${_sharedUi.buoyColors.error}55`,
|
|
581
|
-
borderWidth: 1,
|
|
582
|
-
borderRadius: 10,
|
|
583
|
-
paddingVertical: 10,
|
|
584
|
-
marginTop: 18
|
|
585
|
-
},
|
|
586
|
-
wipeAllText: {
|
|
587
|
-
color: _sharedUi.buoyColors.error,
|
|
588
|
-
fontSize: 12.5,
|
|
589
|
-
fontWeight: "600"
|
|
590
|
-
},
|
|
591
|
-
wipeAllCaption: {
|
|
592
|
-
color: _sharedUi.buoyColors.textMuted,
|
|
593
|
-
fontSize: 10,
|
|
594
|
-
textAlign: "center",
|
|
595
|
-
marginTop: 6
|
|
596
|
-
},
|
|
597
|
-
outcomePanel: {
|
|
598
|
-
backgroundColor: _sharedUi.buoyColors.card,
|
|
599
|
-
borderColor: _sharedUi.buoyColors.borderStrong,
|
|
600
|
-
borderWidth: 1,
|
|
601
|
-
borderRadius: 8,
|
|
602
|
-
padding: 10,
|
|
603
|
-
gap: 4
|
|
604
|
-
},
|
|
605
|
-
outcomeHeaderRow: {
|
|
606
|
-
flexDirection: "row",
|
|
607
|
-
justifyContent: "space-between",
|
|
608
|
-
alignItems: "center"
|
|
609
|
-
},
|
|
610
|
-
outcomeTitle: {
|
|
611
|
-
color: _sharedUi.buoyColors.text,
|
|
612
|
-
fontSize: 12,
|
|
613
|
-
fontWeight: "700",
|
|
614
|
-
flex: 1
|
|
615
|
-
},
|
|
616
|
-
outcomeDismiss: {
|
|
617
|
-
color: _sharedUi.buoyColors.textMuted,
|
|
618
|
-
fontSize: 13
|
|
619
|
-
},
|
|
620
|
-
outcomeSource: {
|
|
621
|
-
gap: 2
|
|
185
|
+
backgroundColor: _tmTheme.tm.color.sheet
|
|
622
186
|
},
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
fontSize: 11
|
|
187
|
+
content: {
|
|
188
|
+
paddingTop: 14
|
|
626
189
|
},
|
|
627
|
-
|
|
628
|
-
color:
|
|
190
|
+
empty: {
|
|
191
|
+
color: _tmTheme.tm.color.labelSecondary,
|
|
192
|
+
fontSize: _tmTheme.tm.font.footnote,
|
|
193
|
+
lineHeight: _tmTheme.tm.font.footnote * 1.4,
|
|
194
|
+
paddingHorizontal: _tmTheme.tm.textInset,
|
|
195
|
+
paddingVertical: 16
|
|
629
196
|
},
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
fontSize: 10,
|
|
633
|
-
paddingLeft: 12
|
|
197
|
+
spacer: {
|
|
198
|
+
height: 24
|
|
634
199
|
}
|
|
635
200
|
});
|
|
636
201
|
//# sourceMappingURL=TimeMachineBody.js.map
|