@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.
Files changed (174) hide show
  1. package/lib/commonjs/components/TimeMachineBody.js +148 -583
  2. package/lib/commonjs/components/TimeMachineBody.js.map +1 -1
  3. package/lib/commonjs/components/TimeMachineModal.js +10 -11
  4. package/lib/commonjs/components/TimeMachineModal.js.map +1 -1
  5. package/lib/commonjs/components/confirm.js +39 -0
  6. package/lib/commonjs/components/confirm.js.map +1 -0
  7. package/lib/commonjs/components/format.js +24 -0
  8. package/lib/commonjs/components/format.js.map +1 -0
  9. package/lib/commonjs/components/list/CaptureBar.js +95 -0
  10. package/lib/commonjs/components/list/CaptureBar.js.map +1 -0
  11. package/lib/commonjs/components/list/RestoreOutcomeCard.js +162 -0
  12. package/lib/commonjs/components/list/RestoreOutcomeCard.js.map +1 -0
  13. package/lib/commonjs/components/list/SnapshotRow.js +141 -0
  14. package/lib/commonjs/components/list/SnapshotRow.js.map +1 -0
  15. package/lib/commonjs/components/list/SourcesStrip.js +126 -0
  16. package/lib/commonjs/components/list/SourcesStrip.js.map +1 -0
  17. package/lib/commonjs/components/list/UndoDeleteBar.js +81 -0
  18. package/lib/commonjs/components/list/UndoDeleteBar.js.map +1 -0
  19. package/lib/commonjs/components/list/WipeAllRow.js +46 -0
  20. package/lib/commonjs/components/list/WipeAllRow.js.map +1 -0
  21. package/lib/commonjs/components/preview/ItemDiffPanel.js +77 -0
  22. package/lib/commonjs/components/preview/ItemDiffPanel.js.map +1 -0
  23. package/lib/commonjs/components/preview/PreviewFlow.js +51 -0
  24. package/lib/commonjs/components/preview/PreviewFlow.js.map +1 -0
  25. package/lib/commonjs/components/preview/RestorePointNameRow.js +83 -0
  26. package/lib/commonjs/components/preview/RestorePointNameRow.js.map +1 -0
  27. package/lib/commonjs/components/preview/RestorePreviewScreen.js +549 -635
  28. package/lib/commonjs/components/preview/RestorePreviewScreen.js.map +1 -1
  29. package/lib/commonjs/components/preview/verdictMeta.js +8 -8
  30. package/lib/commonjs/components/preview/verdictMeta.js.map +1 -1
  31. package/lib/commonjs/components/sources.js +72 -0
  32. package/lib/commonjs/components/sources.js.map +1 -0
  33. package/lib/commonjs/index.js +55 -0
  34. package/lib/commonjs/index.js.map +1 -1
  35. package/lib/commonjs/store/routeRestore.js +188 -0
  36. package/lib/commonjs/store/routeRestore.js.map +1 -0
  37. package/lib/commonjs/store/snapshotVault.js +93 -9
  38. package/lib/commonjs/store/snapshotVault.js.map +1 -1
  39. package/lib/commonjs/store/timeMachineStore.js +164 -7
  40. package/lib/commonjs/store/timeMachineStore.js.map +1 -1
  41. package/lib/commonjs/sync/timeMachineSyncAdapter.js +59 -4
  42. package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +1 -1
  43. package/lib/commonjs/ui/SwipeActionsRow.js +167 -0
  44. package/lib/commonjs/ui/SwipeActionsRow.js.map +1 -0
  45. package/lib/commonjs/ui/primitives.js +164 -0
  46. package/lib/commonjs/ui/primitives.js.map +1 -0
  47. package/lib/commonjs/ui/tmTheme.js +103 -0
  48. package/lib/commonjs/ui/tmTheme.js.map +1 -0
  49. package/lib/module/components/TimeMachineBody.js +151 -586
  50. package/lib/module/components/TimeMachineBody.js.map +1 -1
  51. package/lib/module/components/TimeMachineModal.js +11 -12
  52. package/lib/module/components/TimeMachineModal.js.map +1 -1
  53. package/lib/module/components/confirm.js +34 -0
  54. package/lib/module/components/confirm.js.map +1 -0
  55. package/lib/module/components/format.js +19 -0
  56. package/lib/module/components/format.js.map +1 -0
  57. package/lib/module/components/list/CaptureBar.js +90 -0
  58. package/lib/module/components/list/CaptureBar.js.map +1 -0
  59. package/lib/module/components/list/RestoreOutcomeCard.js +156 -0
  60. package/lib/module/components/list/RestoreOutcomeCard.js.map +1 -0
  61. package/lib/module/components/list/SnapshotRow.js +138 -0
  62. package/lib/module/components/list/SnapshotRow.js.map +1 -0
  63. package/lib/module/components/list/SourcesStrip.js +121 -0
  64. package/lib/module/components/list/SourcesStrip.js.map +1 -0
  65. package/lib/module/components/list/UndoDeleteBar.js +78 -0
  66. package/lib/module/components/list/UndoDeleteBar.js.map +1 -0
  67. package/lib/module/components/list/WipeAllRow.js +41 -0
  68. package/lib/module/components/list/WipeAllRow.js.map +1 -0
  69. package/lib/module/components/preview/ItemDiffPanel.js +72 -0
  70. package/lib/module/components/preview/ItemDiffPanel.js.map +1 -0
  71. package/lib/module/components/preview/PreviewFlow.js +46 -0
  72. package/lib/module/components/preview/PreviewFlow.js.map +1 -0
  73. package/lib/module/components/preview/RestorePointNameRow.js +78 -0
  74. package/lib/module/components/preview/RestorePointNameRow.js.map +1 -0
  75. package/lib/module/components/preview/RestorePreviewScreen.js +552 -638
  76. package/lib/module/components/preview/RestorePreviewScreen.js.map +1 -1
  77. package/lib/module/components/preview/verdictMeta.js +9 -8
  78. package/lib/module/components/preview/verdictMeta.js.map +1 -1
  79. package/lib/module/components/sources.js +66 -0
  80. package/lib/module/components/sources.js.map +1 -0
  81. package/lib/module/index.js +11 -0
  82. package/lib/module/index.js.map +1 -1
  83. package/lib/module/store/routeRestore.js +176 -0
  84. package/lib/module/store/routeRestore.js.map +1 -0
  85. package/lib/module/store/snapshotVault.js +87 -9
  86. package/lib/module/store/snapshotVault.js.map +1 -1
  87. package/lib/module/store/timeMachineStore.js +164 -8
  88. package/lib/module/store/timeMachineStore.js.map +1 -1
  89. package/lib/module/sync/timeMachineSyncAdapter.js +59 -4
  90. package/lib/module/sync/timeMachineSyncAdapter.js.map +1 -1
  91. package/lib/module/ui/SwipeActionsRow.js +162 -0
  92. package/lib/module/ui/SwipeActionsRow.js.map +1 -0
  93. package/lib/module/ui/primitives.js +156 -0
  94. package/lib/module/ui/primitives.js.map +1 -0
  95. package/lib/module/ui/tmTheme.js +99 -0
  96. package/lib/module/ui/tmTheme.js.map +1 -0
  97. package/lib/typescript/components/TimeMachineBody.d.ts.map +1 -1
  98. package/lib/typescript/components/TimeMachineModal.d.ts.map +1 -1
  99. package/lib/typescript/components/confirm.d.ts +2 -0
  100. package/lib/typescript/components/confirm.d.ts.map +1 -0
  101. package/lib/typescript/components/format.d.ts +4 -0
  102. package/lib/typescript/components/format.d.ts.map +1 -0
  103. package/lib/typescript/components/list/CaptureBar.d.ts +6 -0
  104. package/lib/typescript/components/list/CaptureBar.d.ts.map +1 -0
  105. package/lib/typescript/components/list/RestoreOutcomeCard.d.ts +11 -0
  106. package/lib/typescript/components/list/RestoreOutcomeCard.d.ts.map +1 -0
  107. package/lib/typescript/components/list/SnapshotRow.d.ts +12 -0
  108. package/lib/typescript/components/list/SnapshotRow.d.ts.map +1 -0
  109. package/lib/typescript/components/list/SourcesStrip.d.ts +5 -0
  110. package/lib/typescript/components/list/SourcesStrip.d.ts.map +1 -0
  111. package/lib/typescript/components/list/UndoDeleteBar.d.ts +8 -0
  112. package/lib/typescript/components/list/UndoDeleteBar.d.ts.map +1 -0
  113. package/lib/typescript/components/list/WipeAllRow.d.ts +5 -0
  114. package/lib/typescript/components/list/WipeAllRow.d.ts.map +1 -0
  115. package/lib/typescript/components/preview/ItemDiffPanel.d.ts +5 -0
  116. package/lib/typescript/components/preview/ItemDiffPanel.d.ts.map +1 -0
  117. package/lib/typescript/components/preview/PreviewFlow.d.ts +9 -0
  118. package/lib/typescript/components/preview/PreviewFlow.d.ts.map +1 -0
  119. package/lib/typescript/components/preview/RestorePointNameRow.d.ts +5 -0
  120. package/lib/typescript/components/preview/RestorePointNameRow.d.ts.map +1 -0
  121. package/lib/typescript/components/preview/RestorePreviewScreen.d.ts +1 -5
  122. package/lib/typescript/components/preview/RestorePreviewScreen.d.ts.map +1 -1
  123. package/lib/typescript/components/preview/verdictMeta.d.ts +5 -0
  124. package/lib/typescript/components/preview/verdictMeta.d.ts.map +1 -1
  125. package/lib/typescript/components/sources.d.ts +36 -0
  126. package/lib/typescript/components/sources.d.ts.map +1 -0
  127. package/lib/typescript/index.d.ts +2 -1
  128. package/lib/typescript/index.d.ts.map +1 -1
  129. package/lib/typescript/store/routeRestore.d.ts +51 -0
  130. package/lib/typescript/store/routeRestore.d.ts.map +1 -0
  131. package/lib/typescript/store/snapshotVault.d.ts +55 -0
  132. package/lib/typescript/store/snapshotVault.d.ts.map +1 -1
  133. package/lib/typescript/store/timeMachineStore.d.ts +64 -2
  134. package/lib/typescript/store/timeMachineStore.d.ts.map +1 -1
  135. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts +25 -0
  136. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +1 -1
  137. package/lib/typescript/ui/SwipeActionsRow.d.ts +32 -0
  138. package/lib/typescript/ui/SwipeActionsRow.d.ts.map +1 -0
  139. package/lib/typescript/ui/primitives.d.ts +57 -0
  140. package/lib/typescript/ui/primitives.d.ts.map +1 -0
  141. package/lib/typescript/ui/tmTheme.d.ts +67 -0
  142. package/lib/typescript/ui/tmTheme.d.ts.map +1 -0
  143. package/package.json +12 -8
  144. package/src/components/TimeMachineBody.tsx +184 -682
  145. package/src/components/TimeMachineModal.tsx +10 -11
  146. package/src/components/confirm.ts +35 -0
  147. package/src/components/format.ts +17 -0
  148. package/src/components/list/CaptureBar.tsx +100 -0
  149. package/src/components/list/RestoreOutcomeCard.tsx +159 -0
  150. package/src/components/list/SnapshotRow.tsx +155 -0
  151. package/src/components/list/SourcesStrip.tsx +124 -0
  152. package/src/components/list/UndoDeleteBar.tsx +76 -0
  153. package/src/components/list/WipeAllRow.tsx +42 -0
  154. package/src/components/preview/ItemDiffPanel.tsx +77 -0
  155. package/src/components/preview/PreviewFlow.tsx +70 -0
  156. package/src/components/preview/RestorePointNameRow.tsx +80 -0
  157. package/src/components/preview/RestorePreviewScreen.tsx +535 -535
  158. package/src/components/preview/verdictMeta.ts +8 -8
  159. package/src/components/sources.ts +92 -0
  160. package/src/index.tsx +22 -0
  161. package/src/store/routeRestore.ts +194 -0
  162. package/src/store/snapshotVault.ts +138 -9
  163. package/src/store/timeMachineStore.ts +195 -5
  164. package/src/sync/timeMachineSyncAdapter.ts +57 -4
  165. package/src/ui/SwipeActionsRow.tsx +199 -0
  166. package/src/ui/primitives.tsx +157 -0
  167. package/src/ui/tmTheme.ts +107 -0
  168. package/lib/commonjs/components/preview/ItemDetailScreen.js +0 -189
  169. package/lib/commonjs/components/preview/ItemDetailScreen.js.map +0 -1
  170. package/lib/module/components/preview/ItemDetailScreen.js +0 -184
  171. package/lib/module/components/preview/ItemDetailScreen.js.map +0 -1
  172. package/lib/typescript/components/preview/ItemDetailScreen.d.ts +0 -11
  173. package/lib/typescript/components/preview/ItemDetailScreen.d.ts.map +0 -1
  174. package/src/components/preview/ItemDetailScreen.tsx +0 -172
@@ -1,172 +0,0 @@
1
- /**
2
- * Item detail — one preview item's before/after, rendered with the two
3
- * familiar views (TREE / SPLIT, same as storage events).
4
- *
5
- * The render-layer viewers only handle plain JSON faithfully, so both sides
6
- * pass through toDiffable (Dates→ISO, Maps→objects, BigInt→"1n", cycles→
7
- * "[Circular]") and the pair is memoized ONCE per item — the storage tool's
8
- * fix for the fresh-identity-every-render trap that redux/zustand still have.
9
- */
10
- import { useEffect, useMemo, useRef, useState } from "react";
11
- import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
12
- import {
13
- DiffModeTabs,
14
- buoyColors,
15
- devToolsStorageKeys,
16
- persistentStorage,
17
- } from "@buoy-gg/shared-ui";
18
- import { useToolHeader, useToolHost } from "@buoy-gg/core";
19
- import type { StateSnapshotPreviewItem } from "@buoy-gg/shared-ui";
20
- import {
21
- ABSENT_VALUE,
22
- ThemedSplitView,
23
- TreeDiffViewer,
24
- devToolsDefaultTheme,
25
- toDiffable,
26
- } from "@buoy-gg/shared-ui/dataViewer";
27
- import { VERDICT_META } from "./verdictMeta";
28
-
29
- const DIFF_MODE_KEY = devToolsStorageKeys.timeMachine.diffViewerMode();
30
- const TABS = [
31
- { key: "tree", label: "TREE VIEW" },
32
- { key: "split", label: "SPLIT VIEW" },
33
- ];
34
-
35
- export interface ItemDetailScreenProps {
36
- sourceLabel: string;
37
- item: StateSnapshotPreviewItem;
38
- /** "old → new" side labels, e.g. "CURRENT STATE" / snapshot name. */
39
- leftLabel: string;
40
- rightLabel: string;
41
- onBack: () => void;
42
- }
43
-
44
- export function ItemDetailScreen({
45
- sourceLabel,
46
- item,
47
- leftLabel,
48
- rightLabel,
49
- onBack,
50
- }: ItemDetailScreenProps) {
51
- // Persisted view preference — storage's load-guard/validate/optimistic
52
- // pattern, default TREE (structured state reads better as a tree).
53
- const [diffMode, setDiffMode] = useState<string>("tree");
54
- const hasLoadedMode = useRef(false);
55
- useEffect(() => {
56
- if (hasLoadedMode.current) return;
57
- hasLoadedMode.current = true;
58
- void persistentStorage.getItem(DIFF_MODE_KEY).then((saved) => {
59
- if (saved === "tree" || saved === "split") setDiffMode(saved);
60
- });
61
- }, []);
62
- const changeMode = (mode: string) => {
63
- setDiffMode(mode);
64
- void persistentStorage.setItem(DIFF_MODE_KEY, mode).catch(() => {});
65
- };
66
-
67
- const meta = VERDICT_META[item.verdict];
68
- const host = useToolHost();
69
- const hosted = host.instanceId !== undefined;
70
-
71
- // Hosted: the shared modal header shows this item's identity + back.
72
- useToolHeader(
73
- hosted
74
- ? {
75
- title: item.label,
76
- subtitle: `${sourceLabel} · ${meta.label} · ${leftLabel} → ${rightLabel}`,
77
- onBack,
78
- searchable: false, // nothing searchable on a single item's diff
79
- }
80
- : null,
81
- // eslint-disable-next-line react-hooks/exhaustive-deps
82
- [hosted, item.key, sourceLabel, leftLabel, rightLabel]
83
- );
84
-
85
- // Normalize ONCE per item; ABSENT_VALUE keeps added/removed reading as
86
- // pure additions/removals instead of diffs against the literal "null".
87
- const { oldValue, newValue } = useMemo(
88
- () => ({
89
- oldValue:
90
- item.verdict === "added" ? ABSENT_VALUE : toDiffable(item.oldValue),
91
- newValue:
92
- item.verdict === "removed" ? ABSENT_VALUE : toDiffable(item.newValue),
93
- }),
94
- [item]
95
- );
96
-
97
- return (
98
- <View style={styles.container}>
99
- {!hosted && (
100
- <View style={styles.screenHeader}>
101
- <TouchableOpacity onPress={onBack} hitSlop={HIT} testID="tm-item-back">
102
- <Text style={styles.backText}>‹ Preview</Text>
103
- </TouchableOpacity>
104
- <View style={styles.titleBlock}>
105
- <Text style={styles.title} numberOfLines={1}>
106
- <Text style={{ color: meta.color }}>{meta.glyph} </Text>
107
- {item.label}
108
- </Text>
109
- <Text style={styles.subtitle} numberOfLines={1}>
110
- {sourceLabel} · {meta.label} · {leftLabel} → {rightLabel}
111
- </Text>
112
- </View>
113
- </View>
114
- )}
115
-
116
- {item.reason && <Text style={styles.reason}>⚠ {item.reason}</Text>}
117
-
118
- <View style={styles.tabs}>
119
- <DiffModeTabs tabs={TABS} activeTab={diffMode} onTabChange={changeMode} />
120
- </View>
121
-
122
- {/* One page-level scroller; both viewers render inline at natural
123
- height (scrollEnabled=false) — the storage matched-pair contract. */}
124
- <ScrollView style={styles.scroll} contentContainerStyle={styles.scrollContent}>
125
- {diffMode === "tree" ? (
126
- <TreeDiffViewer
127
- oldValue={oldValue}
128
- newValue={newValue}
129
- theme="dark"
130
- showUnchanged={false}
131
- scrollEnabled={false}
132
- />
133
- ) : (
134
- <ThemedSplitView
135
- oldValue={oldValue}
136
- newValue={newValue}
137
- differences={EMPTY}
138
- theme={devToolsDefaultTheme}
139
- scrollEnabled={false}
140
- />
141
- )}
142
- </ScrollView>
143
- </View>
144
- );
145
- }
146
-
147
- const EMPTY: unknown[] = [];
148
- const HIT = { top: 10, bottom: 10, left: 10, right: 10 };
149
-
150
- const styles = StyleSheet.create({
151
- container: { flex: 1 },
152
- screenHeader: {
153
- flexDirection: "row",
154
- alignItems: "center",
155
- paddingHorizontal: 12,
156
- paddingVertical: 8,
157
- gap: 10,
158
- },
159
- backText: { color: buoyColors.primary, fontSize: 14 },
160
- titleBlock: { flex: 1, minWidth: 0 },
161
- title: { color: buoyColors.text, fontSize: 13, fontWeight: "700" },
162
- subtitle: { color: buoyColors.textMuted, fontSize: 10, marginTop: 2 },
163
- reason: {
164
- color: buoyColors.warning,
165
- fontSize: 11,
166
- paddingHorizontal: 12,
167
- paddingBottom: 6,
168
- },
169
- tabs: { paddingHorizontal: 12, paddingBottom: 8 },
170
- scroll: { flex: 1 },
171
- scrollContent: { paddingHorizontal: 12, paddingBottom: 24 },
172
- });