@buoy-gg/images 7.0.3
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/LICENSE +58 -0
- package/README.md +58 -0
- package/lib/commonjs/capture/actions.js +227 -0
- package/lib/commonjs/capture/actions.js.map +1 -0
- package/lib/commonjs/capture/install.js +41 -0
- package/lib/commonjs/capture/install.js.map +1 -0
- package/lib/commonjs/capture/installExpoImage.js +99 -0
- package/lib/commonjs/capture/installExpoImage.js.map +1 -0
- package/lib/commonjs/capture/installRnImage.js +128 -0
- package/lib/commonjs/capture/installRnImage.js.map +1 -0
- package/lib/commonjs/capture/overrides.js +286 -0
- package/lib/commonjs/capture/overrides.js.map +1 -0
- package/lib/commonjs/capture/savings.js +193 -0
- package/lib/commonjs/capture/savings.js.map +1 -0
- package/lib/commonjs/capture/shared.js +367 -0
- package/lib/commonjs/capture/shared.js.map +1 -0
- package/lib/commonjs/components/ImageDetail.js +444 -0
- package/lib/commonjs/components/ImageDetail.js.map +1 -0
- package/lib/commonjs/components/ImageDetailFooter.js +232 -0
- package/lib/commonjs/components/ImageDetailFooter.js.map +1 -0
- package/lib/commonjs/components/ImageRow.js +164 -0
- package/lib/commonjs/components/ImageRow.js.map +1 -0
- package/lib/commonjs/components/ImagesHeader.js +63 -0
- package/lib/commonjs/components/ImagesHeader.js.map +1 -0
- package/lib/commonjs/components/ImagesIcon.js +59 -0
- package/lib/commonjs/components/ImagesIcon.js.map +1 -0
- package/lib/commonjs/components/ImagesListFooter.js +194 -0
- package/lib/commonjs/components/ImagesListFooter.js.map +1 -0
- package/lib/commonjs/components/ImagesModal.js +173 -0
- package/lib/commonjs/components/ImagesModal.js.map +1 -0
- package/lib/commonjs/components/ImagesRoot.js +24 -0
- package/lib/commonjs/components/ImagesRoot.js.map +1 -0
- package/lib/commonjs/components/InsightsBar.js +59 -0
- package/lib/commonjs/components/InsightsBar.js.map +1 -0
- package/lib/commonjs/export.js +81 -0
- package/lib/commonjs/export.js.map +1 -0
- package/lib/commonjs/format.js +117 -0
- package/lib/commonjs/format.js.map +1 -0
- package/lib/commonjs/hooks/useImageRecords.js +20 -0
- package/lib/commonjs/hooks/useImageRecords.js.map +1 -0
- package/lib/commonjs/index.js +236 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +45 -0
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/commonjs/register.js +19 -0
- package/lib/commonjs/register.js.map +1 -0
- package/lib/commonjs/state.js +54 -0
- package/lib/commonjs/state.js.map +1 -0
- package/lib/commonjs/store/imageEventStore.js +160 -0
- package/lib/commonjs/store/imageEventStore.js.map +1 -0
- package/lib/commonjs/store/insights.js +76 -0
- package/lib/commonjs/store/insights.js.map +1 -0
- package/lib/commonjs/sync/imagesSyncAdapter.js +315 -0
- package/lib/commonjs/sync/imagesSyncAdapter.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/capture/actions.js +214 -0
- package/lib/module/capture/actions.js.map +1 -0
- package/lib/module/capture/install.js +36 -0
- package/lib/module/capture/install.js.map +1 -0
- package/lib/module/capture/installExpoImage.js +94 -0
- package/lib/module/capture/installExpoImage.js.map +1 -0
- package/lib/module/capture/installRnImage.js +122 -0
- package/lib/module/capture/installRnImage.js.map +1 -0
- package/lib/module/capture/overrides.js +269 -0
- package/lib/module/capture/overrides.js.map +1 -0
- package/lib/module/capture/savings.js +189 -0
- package/lib/module/capture/savings.js.map +1 -0
- package/lib/module/capture/shared.js +359 -0
- package/lib/module/capture/shared.js.map +1 -0
- package/lib/module/components/ImageDetail.js +440 -0
- package/lib/module/components/ImageDetail.js.map +1 -0
- package/lib/module/components/ImageDetailFooter.js +228 -0
- package/lib/module/components/ImageDetailFooter.js.map +1 -0
- package/lib/module/components/ImageRow.js +160 -0
- package/lib/module/components/ImageRow.js.map +1 -0
- package/lib/module/components/ImagesHeader.js +59 -0
- package/lib/module/components/ImagesHeader.js.map +1 -0
- package/lib/module/components/ImagesIcon.js +55 -0
- package/lib/module/components/ImagesIcon.js.map +1 -0
- package/lib/module/components/ImagesListFooter.js +190 -0
- package/lib/module/components/ImagesListFooter.js.map +1 -0
- package/lib/module/components/ImagesModal.js +169 -0
- package/lib/module/components/ImagesModal.js.map +1 -0
- package/lib/module/components/ImagesRoot.js +20 -0
- package/lib/module/components/ImagesRoot.js.map +1 -0
- package/lib/module/components/InsightsBar.js +55 -0
- package/lib/module/components/InsightsBar.js.map +1 -0
- package/lib/module/export.js +76 -0
- package/lib/module/export.js.map +1 -0
- package/lib/module/format.js +108 -0
- package/lib/module/format.js.map +1 -0
- package/lib/module/hooks/useImageRecords.js +16 -0
- package/lib/module/hooks/useImageRecords.js.map +1 -0
- package/lib/module/index.js +73 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/preset.js +40 -0
- package/lib/module/preset.js.map +1 -0
- package/lib/module/register.js +19 -0
- package/lib/module/register.js.map +1 -0
- package/lib/module/state.js +50 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/store/imageEventStore.js +146 -0
- package/lib/module/store/imageEventStore.js.map +1 -0
- package/lib/module/store/insights.js +71 -0
- package/lib/module/store/insights.js.map +1 -0
- package/lib/module/sync/imagesSyncAdapter.js +311 -0
- package/lib/module/sync/imagesSyncAdapter.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/capture/actions.d.ts +49 -0
- package/lib/typescript/capture/actions.d.ts.map +1 -0
- package/lib/typescript/capture/install.d.ts +15 -0
- package/lib/typescript/capture/install.d.ts.map +1 -0
- package/lib/typescript/capture/installExpoImage.d.ts +23 -0
- package/lib/typescript/capture/installExpoImage.d.ts.map +1 -0
- package/lib/typescript/capture/installRnImage.d.ts +24 -0
- package/lib/typescript/capture/installRnImage.d.ts.map +1 -0
- package/lib/typescript/capture/overrides.d.ts +83 -0
- package/lib/typescript/capture/overrides.d.ts.map +1 -0
- package/lib/typescript/capture/savings.d.ts +37 -0
- package/lib/typescript/capture/savings.d.ts.map +1 -0
- package/lib/typescript/capture/shared.d.ts +61 -0
- package/lib/typescript/capture/shared.d.ts.map +1 -0
- package/lib/typescript/components/ImageDetail.d.ts +13 -0
- package/lib/typescript/components/ImageDetail.d.ts.map +1 -0
- package/lib/typescript/components/ImageDetailFooter.d.ts +19 -0
- package/lib/typescript/components/ImageDetailFooter.d.ts.map +1 -0
- package/lib/typescript/components/ImageRow.d.ts +15 -0
- package/lib/typescript/components/ImageRow.d.ts.map +1 -0
- package/lib/typescript/components/ImagesHeader.d.ts +25 -0
- package/lib/typescript/components/ImagesHeader.d.ts.map +1 -0
- package/lib/typescript/components/ImagesIcon.d.ts +13 -0
- package/lib/typescript/components/ImagesIcon.d.ts.map +1 -0
- package/lib/typescript/components/ImagesListFooter.d.ts +8 -0
- package/lib/typescript/components/ImagesListFooter.d.ts.map +1 -0
- package/lib/typescript/components/ImagesModal.d.ts +17 -0
- package/lib/typescript/components/ImagesModal.d.ts.map +1 -0
- package/lib/typescript/components/ImagesRoot.d.ts +11 -0
- package/lib/typescript/components/ImagesRoot.d.ts.map +1 -0
- package/lib/typescript/components/InsightsBar.d.ts +13 -0
- package/lib/typescript/components/InsightsBar.d.ts.map +1 -0
- package/lib/typescript/export.d.ts +12 -0
- package/lib/typescript/export.d.ts.map +1 -0
- package/lib/typescript/format.d.ts +26 -0
- package/lib/typescript/format.d.ts.map +1 -0
- package/lib/typescript/hooks/useImageRecords.d.ts +11 -0
- package/lib/typescript/hooks/useImageRecords.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +33 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +38 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/lib/typescript/register.d.ts +15 -0
- package/lib/typescript/register.d.ts.map +1 -0
- package/lib/typescript/state.d.ts +54 -0
- package/lib/typescript/state.d.ts.map +1 -0
- package/lib/typescript/store/imageEventStore.d.ts +34 -0
- package/lib/typescript/store/imageEventStore.d.ts.map +1 -0
- package/lib/typescript/store/insights.d.ts +11 -0
- package/lib/typescript/store/insights.d.ts.map +1 -0
- package/lib/typescript/sync/imagesSyncAdapter.d.ts +205 -0
- package/lib/typescript/sync/imagesSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +121 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +67 -0
- package/register.d.ts +1 -0
- package/register.js +15 -0
- package/src/capture/actions.ts +206 -0
- package/src/capture/install.ts +36 -0
- package/src/capture/installExpoImage.ts +115 -0
- package/src/capture/installRnImage.tsx +133 -0
- package/src/capture/overrides.ts +282 -0
- package/src/capture/savings.ts +193 -0
- package/src/capture/shared.ts +387 -0
- package/src/components/ImageDetail.tsx +456 -0
- package/src/components/ImageDetailFooter.tsx +270 -0
- package/src/components/ImageRow.tsx +148 -0
- package/src/components/ImagesHeader.tsx +77 -0
- package/src/components/ImagesIcon.tsx +66 -0
- package/src/components/ImagesListFooter.tsx +193 -0
- package/src/components/ImagesModal.tsx +195 -0
- package/src/components/ImagesRoot.tsx +18 -0
- package/src/components/InsightsBar.tsx +51 -0
- package/src/export.ts +100 -0
- package/src/format.ts +85 -0
- package/src/hooks/useImageRecords.ts +24 -0
- package/src/index.tsx +108 -0
- package/src/preset.tsx +35 -0
- package/src/register.ts +17 -0
- package/src/state.ts +88 -0
- package/src/store/imageEventStore.ts +162 -0
- package/src/store/insights.ts +66 -0
- package/src/sync/imagesSyncAdapter.ts +261 -0
- package/src/types.ts +111 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImagesListFooter = ImagesListFooter;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
10
|
+
var _actions = require("../capture/actions");
|
|
11
|
+
var _overrides = require("../capture/overrides");
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
/**
|
|
14
|
+
* ImagesListFooter — the list screen's action bar: mass simulations applied
|
|
15
|
+
* to EVERY mounted image at once (error / loading / blank), mass hard-reload,
|
|
16
|
+
* flash everything, restore all — plus the global network simulation modes
|
|
17
|
+
* (Normal / Offline / Cold). Styled to match the detail footer.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const NETWORK_MODES = [{
|
|
21
|
+
key: "normal",
|
|
22
|
+
label: "Normal"
|
|
23
|
+
}, {
|
|
24
|
+
key: "offline",
|
|
25
|
+
label: "Offline"
|
|
26
|
+
}, {
|
|
27
|
+
key: "cold",
|
|
28
|
+
label: "Cold"
|
|
29
|
+
}];
|
|
30
|
+
function ImagesListFooter() {
|
|
31
|
+
const insets = (0, _sharedUi.useSafeAreaInsets)();
|
|
32
|
+
const [message, setMessage] = (0, _react.useState)(null);
|
|
33
|
+
const network = (0, _react.useSyncExternalStore)(_actions.subscribeActions, () => (0, _overrides.getGlobalModes)().network);
|
|
34
|
+
const massOverride = (source, label) => {
|
|
35
|
+
const count = (0, _overrides.setOverrideForAllMounted)(source, label);
|
|
36
|
+
setMessage(count > 0 ? `${label} on ${count} image${count === 1 ? "" : "s"} — Restore all to undo` : "No mounted images");
|
|
37
|
+
};
|
|
38
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
39
|
+
style: [styles.footer, {
|
|
40
|
+
paddingBottom: 10 + insets.bottom
|
|
41
|
+
}],
|
|
42
|
+
children: [message ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
43
|
+
style: styles.message,
|
|
44
|
+
numberOfLines: 1,
|
|
45
|
+
children: message
|
|
46
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
47
|
+
style: styles.caption,
|
|
48
|
+
children: "MASS ACTIONS \u2014 every image on screen"
|
|
49
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
50
|
+
style: styles.row,
|
|
51
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
52
|
+
label: "Error",
|
|
53
|
+
onPress: () => massOverride({
|
|
54
|
+
type: "error"
|
|
55
|
+
}, "Forced error")
|
|
56
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
57
|
+
label: "Loading",
|
|
58
|
+
onPress: () => massOverride({
|
|
59
|
+
type: "hang"
|
|
60
|
+
}, "Forced loading")
|
|
61
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
62
|
+
label: "Blank",
|
|
63
|
+
onPress: () => massOverride({
|
|
64
|
+
type: "blank"
|
|
65
|
+
}, "Blanked")
|
|
66
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
67
|
+
label: "Reload",
|
|
68
|
+
onPress: () => {
|
|
69
|
+
setMessage("…");
|
|
70
|
+
(0, _actions.hardReloadAllMounted)().then(r => setMessage(r.message));
|
|
71
|
+
}
|
|
72
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
73
|
+
label: "Find",
|
|
74
|
+
onPress: () => {
|
|
75
|
+
const count = (0, _overrides.flashAllMounted)();
|
|
76
|
+
setMessage(`Flashing ${count} image${count === 1 ? "" : "s"} (2.5s)`);
|
|
77
|
+
}
|
|
78
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(MassButton, {
|
|
79
|
+
label: "Restore",
|
|
80
|
+
accent: true,
|
|
81
|
+
onPress: () => {
|
|
82
|
+
const count = (0, _overrides.clearAllOverrides)();
|
|
83
|
+
setMessage(count > 0 ? `Restored ${count} image${count === 1 ? "" : "s"}` : "No overrides active");
|
|
84
|
+
}
|
|
85
|
+
})]
|
|
86
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
87
|
+
style: styles.row,
|
|
88
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
89
|
+
style: styles.netLabel,
|
|
90
|
+
children: "NET"
|
|
91
|
+
}), NETWORK_MODES.map(mode => {
|
|
92
|
+
const active = network === mode.key;
|
|
93
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
94
|
+
onPress: () => {
|
|
95
|
+
(0, _overrides.setNetworkMode)(mode.key);
|
|
96
|
+
// Modes only affect loads that happen AFTER they're set — an
|
|
97
|
+
// on-screen image keeps its bitmap until something reloads it.
|
|
98
|
+
setMessage(mode.key === "normal" ? "Network simulation off — tap RELOAD to load normally again" : mode.key === "offline" ? "Offline: network images FAIL (bundled assets still load) — tap RELOAD to apply to on-screen images" : "Cold (bypass caches) — tap RELOAD: everything refetches like first launch");
|
|
99
|
+
},
|
|
100
|
+
style: [styles.netButton, active && styles.netButtonActive],
|
|
101
|
+
activeOpacity: 0.7,
|
|
102
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
103
|
+
style: [styles.buttonText, active && styles.netTextActive],
|
|
104
|
+
children: mode.label
|
|
105
|
+
})
|
|
106
|
+
}, mode.key);
|
|
107
|
+
})]
|
|
108
|
+
})]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function MassButton({
|
|
112
|
+
label,
|
|
113
|
+
onPress,
|
|
114
|
+
accent
|
|
115
|
+
}) {
|
|
116
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
117
|
+
onPress: onPress,
|
|
118
|
+
style: styles.button,
|
|
119
|
+
activeOpacity: 0.7,
|
|
120
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
121
|
+
style: [styles.buttonText, accent && styles.buttonTextAccent],
|
|
122
|
+
children: label
|
|
123
|
+
})
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const styles = _reactNative.StyleSheet.create({
|
|
127
|
+
footer: {
|
|
128
|
+
paddingHorizontal: 12,
|
|
129
|
+
paddingTop: 8,
|
|
130
|
+
backgroundColor: _sharedUi.macOSColors.background.base,
|
|
131
|
+
borderTopWidth: 1,
|
|
132
|
+
borderTopColor: _sharedUi.macOSColors.border.default,
|
|
133
|
+
gap: 8
|
|
134
|
+
},
|
|
135
|
+
caption: {
|
|
136
|
+
color: _sharedUi.macOSColors.text.muted,
|
|
137
|
+
fontSize: 9,
|
|
138
|
+
fontWeight: "700",
|
|
139
|
+
letterSpacing: 0.8
|
|
140
|
+
},
|
|
141
|
+
message: {
|
|
142
|
+
color: _sharedUi.macOSColors.semantic.info,
|
|
143
|
+
fontSize: 10,
|
|
144
|
+
fontFamily: "monospace"
|
|
145
|
+
},
|
|
146
|
+
row: {
|
|
147
|
+
flexDirection: "row",
|
|
148
|
+
gap: 6
|
|
149
|
+
},
|
|
150
|
+
button: {
|
|
151
|
+
flex: 1,
|
|
152
|
+
alignItems: "center",
|
|
153
|
+
paddingVertical: 8,
|
|
154
|
+
borderRadius: 6,
|
|
155
|
+
backgroundColor: _sharedUi.macOSColors.background.card,
|
|
156
|
+
borderWidth: _reactNative.StyleSheet.hairlineWidth,
|
|
157
|
+
borderColor: _sharedUi.macOSColors.border.default
|
|
158
|
+
},
|
|
159
|
+
buttonText: {
|
|
160
|
+
fontSize: 10,
|
|
161
|
+
fontWeight: "600",
|
|
162
|
+
color: _sharedUi.macOSColors.text.secondary,
|
|
163
|
+
fontFamily: "monospace",
|
|
164
|
+
textTransform: "uppercase"
|
|
165
|
+
},
|
|
166
|
+
buttonTextAccent: {
|
|
167
|
+
color: _sharedUi.macOSColors.semantic.warning
|
|
168
|
+
},
|
|
169
|
+
netLabel: {
|
|
170
|
+
color: _sharedUi.macOSColors.text.muted,
|
|
171
|
+
fontSize: 9,
|
|
172
|
+
fontWeight: "700",
|
|
173
|
+
letterSpacing: 0.8,
|
|
174
|
+
alignSelf: "center",
|
|
175
|
+
marginRight: 2
|
|
176
|
+
},
|
|
177
|
+
netButton: {
|
|
178
|
+
flex: 1,
|
|
179
|
+
alignItems: "center",
|
|
180
|
+
paddingVertical: 6,
|
|
181
|
+
borderRadius: 6,
|
|
182
|
+
backgroundColor: _sharedUi.macOSColors.background.card,
|
|
183
|
+
borderWidth: _reactNative.StyleSheet.hairlineWidth,
|
|
184
|
+
borderColor: _sharedUi.macOSColors.border.default
|
|
185
|
+
},
|
|
186
|
+
netButtonActive: {
|
|
187
|
+
backgroundColor: _sharedUi.macOSColors.semantic.infoBackground,
|
|
188
|
+
borderColor: _sharedUi.macOSColors.semantic.info
|
|
189
|
+
},
|
|
190
|
+
netTextActive: {
|
|
191
|
+
color: _sharedUi.macOSColors.semantic.info
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=ImagesListFooter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_sharedUi","_actions","_overrides","_jsxRuntime","NETWORK_MODES","key","label","ImagesListFooter","insets","useSafeAreaInsets","message","setMessage","useState","network","useSyncExternalStore","subscribeActions","getGlobalModes","massOverride","source","count","setOverrideForAllMounted","jsxs","View","style","styles","footer","paddingBottom","bottom","children","jsx","Text","numberOfLines","caption","row","MassButton","onPress","type","hardReloadAllMounted","then","r","flashAllMounted","accent","clearAllOverrides","netLabel","map","mode","active","TouchableOpacity","setNetworkMode","netButton","netButtonActive","activeOpacity","buttonText","netTextActive","button","buttonTextAccent","StyleSheet","create","paddingHorizontal","paddingTop","backgroundColor","macOSColors","background","base","borderTopWidth","borderTopColor","border","default","gap","color","text","muted","fontSize","fontWeight","letterSpacing","semantic","info","fontFamily","flexDirection","flex","alignItems","paddingVertical","borderRadius","card","borderWidth","hairlineWidth","borderColor","secondary","textTransform","warning","alignSelf","marginRight","infoBackground"],"sourceRoot":"../../../src","sources":["components/ImagesListFooter.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImagesModal = ImagesModal;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
10
|
+
var _install = require("../capture/install");
|
|
11
|
+
var _overrides = require("../capture/overrides");
|
|
12
|
+
var _export = require("../export");
|
|
13
|
+
var _useImageRecords = require("../hooks/useImageRecords");
|
|
14
|
+
var _imageEventStore = require("../store/imageEventStore");
|
|
15
|
+
var _ImageDetail = require("./ImageDetail");
|
|
16
|
+
var _ImageDetailFooter = require("./ImageDetailFooter");
|
|
17
|
+
var _ImageRow = require("./ImageRow");
|
|
18
|
+
var _ImagesHeader = require("./ImagesHeader");
|
|
19
|
+
var _ImagesListFooter = require("./ImagesListFooter");
|
|
20
|
+
var _InsightsBar = require("./InsightsBar");
|
|
21
|
+
var _insights = require("../store/insights");
|
|
22
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
23
|
+
/**
|
|
24
|
+
* ImagesModal — bottom-sheet wrapper rendered by FloatingDevTools when the
|
|
25
|
+
* Images tool is opened. List of captured images → tap for detail. Also
|
|
26
|
+
* surfaces the capture status so a mis-ordered install is self-diagnosing
|
|
27
|
+
* instead of silently empty.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
function CaptureNotice() {
|
|
31
|
+
const status = (0, _install.getCaptureStatus)();
|
|
32
|
+
const notices = [];
|
|
33
|
+
if (status.rnDecoratorTooLate) {
|
|
34
|
+
notices.push('RN <Image> instrumentation missed the module-load race — add `import "@buoy-gg/images/register"` as the FIRST import of your entry file.');
|
|
35
|
+
}
|
|
36
|
+
if (!status.expoAvailable && !status.rnDecoratorActive && !status.rnDecoratorTooLate) {
|
|
37
|
+
notices.push("Waiting for images… render some <Image> components to populate the list.");
|
|
38
|
+
}
|
|
39
|
+
if (notices.length === 0) return null;
|
|
40
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
41
|
+
style: styles.notice,
|
|
42
|
+
children: notices.map(n => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
43
|
+
style: styles.noticeText,
|
|
44
|
+
children: n
|
|
45
|
+
}, n))
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function EmptyState() {
|
|
49
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
50
|
+
style: styles.empty,
|
|
51
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
52
|
+
style: styles.emptyTitle,
|
|
53
|
+
children: "No images captured yet"
|
|
54
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
55
|
+
style: styles.emptyText,
|
|
56
|
+
children: ["Every RN ", "<Image>", " and expo-image load is recorded here with cache verdicts, timings, and oversize checks."]
|
|
57
|
+
})]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function ImagesModal({
|
|
61
|
+
visible,
|
|
62
|
+
onClose,
|
|
63
|
+
onBack,
|
|
64
|
+
onMinimize,
|
|
65
|
+
persistenceKey
|
|
66
|
+
}) {
|
|
67
|
+
// Safety net: ensures capture is live even without the early register
|
|
68
|
+
// import (expo-image capture is timing-immune, so this still gets most data).
|
|
69
|
+
(0, _install.installImageCapture)();
|
|
70
|
+
const {
|
|
71
|
+
records,
|
|
72
|
+
stats
|
|
73
|
+
} = (0, _useImageRecords.useImageRecords)();
|
|
74
|
+
const [selectedId, setSelectedId] = (0, _react.useState)(null);
|
|
75
|
+
const selected = selectedId != null ? (0, _imageEventStore.getRecord)(selectedId) : undefined;
|
|
76
|
+
|
|
77
|
+
// Stepping is relative to the live list (newest first): previous = newer.
|
|
78
|
+
const selectedIndex = selected ? records.findIndex(r => r.id === selected.id) : -1;
|
|
79
|
+
const stepTo = index => {
|
|
80
|
+
const target = records[index];
|
|
81
|
+
if (target) setSelectedId(target.id);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// Mode-appropriate report: single record in detail, full registry (stats +
|
|
85
|
+
// insights + table) in the list. The shared ToolbarCopyButton resolves this
|
|
86
|
+
// lazily on press and handles clipboard + feedback + gating.
|
|
87
|
+
const getReport = () => selected ? (0, _export.formatRecordMarkdown)(selected) : (0, _export.formatRegistryMarkdown)(records, stats, (0, _insights.computeInsights)(records), (0, _install.getCaptureStatus)(), (0, _overrides.getGlobalModes)());
|
|
88
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
|
|
89
|
+
visible: visible,
|
|
90
|
+
onClose: onClose,
|
|
91
|
+
onMinimize: onMinimize,
|
|
92
|
+
persistenceKey: persistenceKey,
|
|
93
|
+
header: {
|
|
94
|
+
showToggleButton: true,
|
|
95
|
+
customContent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImagesHeader.ImagesHeader, {
|
|
96
|
+
stats: stats,
|
|
97
|
+
detailOpen: selected != null,
|
|
98
|
+
detailIndex: selectedIndex,
|
|
99
|
+
detailTotal: records.length,
|
|
100
|
+
onCloseDetail: () => setSelectedId(null),
|
|
101
|
+
onClear: _imageEventStore.clearRecords,
|
|
102
|
+
getReport: getReport,
|
|
103
|
+
onBack: onBack
|
|
104
|
+
})
|
|
105
|
+
},
|
|
106
|
+
enablePersistence: true,
|
|
107
|
+
initialMode: "bottomSheet",
|
|
108
|
+
disableScrollWrapper: true,
|
|
109
|
+
children: selected ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
110
|
+
style: styles.detailContainer,
|
|
111
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageDetail.ImageDetail, {
|
|
112
|
+
record: selected
|
|
113
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageDetailFooter.ImageDetailFooter, {
|
|
114
|
+
record: selected,
|
|
115
|
+
hasPrevious: selectedIndex > 0,
|
|
116
|
+
hasNext: selectedIndex >= 0 && selectedIndex < records.length - 1,
|
|
117
|
+
onPrevious: () => stepTo(selectedIndex - 1),
|
|
118
|
+
onNext: () => stepTo(selectedIndex + 1)
|
|
119
|
+
}, selected.id)]
|
|
120
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
121
|
+
style: styles.listContainer,
|
|
122
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_InsightsBar.InsightsBar, {
|
|
123
|
+
insights: (0, _insights.computeInsights)(records)
|
|
124
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(CaptureNotice, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
|
|
125
|
+
data: records,
|
|
126
|
+
keyExtractor: item => String(item.id),
|
|
127
|
+
renderItem: ({
|
|
128
|
+
item
|
|
129
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageRow.ImageRow, {
|
|
130
|
+
record: item,
|
|
131
|
+
onPress: setSelectedId
|
|
132
|
+
}),
|
|
133
|
+
ListEmptyComponent: /*#__PURE__*/(0, _jsxRuntime.jsx)(EmptyState, {})
|
|
134
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImagesListFooter.ImagesListFooter, {})]
|
|
135
|
+
})
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const styles = _reactNative.StyleSheet.create({
|
|
139
|
+
listContainer: {
|
|
140
|
+
flex: 1
|
|
141
|
+
},
|
|
142
|
+
detailContainer: {
|
|
143
|
+
flex: 1
|
|
144
|
+
},
|
|
145
|
+
notice: {
|
|
146
|
+
margin: 10,
|
|
147
|
+
padding: 10,
|
|
148
|
+
borderRadius: 8,
|
|
149
|
+
backgroundColor: _sharedUi.macOSColors.semantic.warningBackground,
|
|
150
|
+
gap: 4
|
|
151
|
+
},
|
|
152
|
+
noticeText: {
|
|
153
|
+
color: _sharedUi.macOSColors.semantic.warning,
|
|
154
|
+
fontSize: 11
|
|
155
|
+
},
|
|
156
|
+
empty: {
|
|
157
|
+
alignItems: "center",
|
|
158
|
+
padding: 32,
|
|
159
|
+
gap: 8
|
|
160
|
+
},
|
|
161
|
+
emptyTitle: {
|
|
162
|
+
color: _sharedUi.macOSColors.text.primary,
|
|
163
|
+
fontSize: 13,
|
|
164
|
+
fontWeight: "600"
|
|
165
|
+
},
|
|
166
|
+
emptyText: {
|
|
167
|
+
color: _sharedUi.macOSColors.text.secondary,
|
|
168
|
+
fontSize: 11,
|
|
169
|
+
textAlign: "center",
|
|
170
|
+
lineHeight: 16
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=ImagesModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_sharedUi","_install","_overrides","_export","_useImageRecords","_imageEventStore","_ImageDetail","_ImageDetailFooter","_ImageRow","_ImagesHeader","_ImagesListFooter","_InsightsBar","_insights","_jsxRuntime","CaptureNotice","status","getCaptureStatus","notices","rnDecoratorTooLate","push","expoAvailable","rnDecoratorActive","length","jsx","View","style","styles","notice","children","map","n","Text","noticeText","EmptyState","jsxs","empty","emptyTitle","emptyText","ImagesModal","visible","onClose","onBack","onMinimize","persistenceKey","installImageCapture","records","stats","useImageRecords","selectedId","setSelectedId","useState","selected","getRecord","undefined","selectedIndex","findIndex","r","id","stepTo","index","target","getReport","formatRecordMarkdown","formatRegistryMarkdown","computeInsights","getGlobalModes","JsModal","header","showToggleButton","customContent","ImagesHeader","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","clearRecords","enablePersistence","initialMode","disableScrollWrapper","detailContainer","ImageDetail","record","ImageDetailFooter","hasPrevious","hasNext","onPrevious","onNext","listContainer","InsightsBar","insights","FlatList","data","keyExtractor","item","String","renderItem","ImageRow","onPress","ListEmptyComponent","ImagesListFooter","StyleSheet","create","flex","margin","padding","borderRadius","backgroundColor","macOSColors","semantic","warningBackground","gap","color","warning","fontSize","alignItems","text","primary","fontWeight","secondary","textAlign","lineHeight"],"sourceRoot":"../../../src","sources":["components/ImagesModal.tsx"],"mappings":";;;;;;AAOA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,gBAAA,GAAAN,OAAA;AACA,IAAAO,gBAAA,GAAAP,OAAA;AACA,IAAAQ,YAAA,GAAAR,OAAA;AACA,IAAAS,kBAAA,GAAAT,OAAA;AACA,IAAAU,SAAA,GAAAV,OAAA;AACA,IAAAW,aAAA,GAAAX,OAAA;AACA,IAAAY,iBAAA,GAAAZ,OAAA;AACA,IAAAa,YAAA,GAAAb,OAAA;AACA,IAAAc,SAAA,GAAAd,OAAA;AAAoD,IAAAe,WAAA,GAAAf,OAAA;AAtBpD;AACA;AACA;AACA;AACA;AACA;;AA4BA,SAASgB,aAAaA,CAAA,EAAG;EACvB,MAAMC,MAAM,GAAG,IAAAC,yBAAgB,EAAC,CAAC;EACjC,MAAMC,OAAiB,GAAG,EAAE;EAC5B,IAAIF,MAAM,CAACG,kBAAkB,EAAE;IAC7BD,OAAO,CAACE,IAAI,CACV,0IACF,CAAC;EACH;EACA,IAAI,CAACJ,MAAM,CAACK,aAAa,IAAI,CAACL,MAAM,CAACM,iBAAiB,IAAI,CAACN,MAAM,CAACG,kBAAkB,EAAE;IACpFD,OAAO,CAACE,IAAI,CAAC,0EAA0E,CAAC;EAC1F;EACA,IAAIF,OAAO,CAACK,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EACrC,oBACE,IAAAT,WAAA,CAAAU,GAAA,EAACxB,YAAA,CAAAyB,IAAI;IAACC,KAAK,EAAEC,MAAM,CAACC,MAAO;IAAAC,QAAA,EACxBX,OAAO,CAACY,GAAG,CAAEC,CAAC,iBACb,IAAAjB,WAAA,CAAAU,GAAA,EAACxB,YAAA,CAAAgC,IAAI;MAASN,KAAK,EAAEC,MAAM,CAACM,UAAW;MAAAJ,QAAA,EACpCE;IAAC,GADOA,CAEL,CACP;EAAC,CACE,CAAC;AAEX;AAEA,SAASG,UAAUA,CAAA,EAAG;EACpB,oBACE,IAAApB,WAAA,CAAAqB,IAAA,EAACnC,YAAA,CAAAyB,IAAI;IAACC,KAAK,EAAEC,MAAM,CAACS,KAAM;IAAAP,QAAA,gBACxB,IAAAf,WAAA,CAAAU,GAAA,EAACxB,YAAA,CAAAgC,IAAI;MAACN,KAAK,EAAEC,MAAM,CAACU,UAAW;MAAAR,QAAA,EAAC;IAAsB,CAAM,CAAC,eAC7D,IAAAf,WAAA,CAAAqB,IAAA,EAACnC,YAAA,CAAAgC,IAAI;MAACN,KAAK,EAAEC,MAAM,CAACW,SAAU;MAAAT,QAAA,GAAC,WACpB,EAAC,SAAS,EAAC,0FAEtB;IAAA,CAAM,CAAC;EAAA,CACH,CAAC;AAEX;AAEO,SAASU,WAAWA,CAAC;EAC1BC,OAAO;EACPC,OAAO;EACPC,MAAM;EACNC,UAAU;EACVC;AACgB,CAAC,EAAE;EACnB;EACA;EACA,IAAAC,4BAAmB,EAAC,CAAC;EAErB,MAAM;IAAEC,OAAO;IAAEC;EAAM,CAAC,GAAG,IAAAC,gCAAe,EAAC,CAAC;EAC5C,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAC,eAAQ,EAAgB,IAAI,CAAC;EACjE,MAAMC,QAAQ,GAAGH,UAAU,IAAI,IAAI,GAAG,IAAAI,0BAAS,EAACJ,UAAU,CAAC,GAAGK,SAAS;;EAEvE;EACA,MAAMC,aAAa,GAAGH,QAAQ,GAC1BN,OAAO,CAACU,SAAS,CAAEC,CAAC,IAAKA,CAAC,CAACC,EAAE,KAAKN,QAAQ,CAACM,EAAE,CAAC,GAC9C,CAAC,CAAC;EACN,MAAMC,MAAM,GAAIC,KAAa,IAAK;IAChC,MAAMC,MAAM,GAAGf,OAAO,CAACc,KAAK,CAAC;IAC7B,IAAIC,MAAM,EAAEX,aAAa,CAACW,MAAM,CAACH,EAAE,CAAC;EACtC,CAAC;;EAED;EACA;EACA;EACA,MAAMI,SAAS,GAAGA,CAAA,KAChBV,QAAQ,GACJ,IAAAW,4BAAoB,EAACX,QAAQ,CAAC,GAC9B,IAAAY,8BAAsB,EACpBlB,OAAO,EACPC,KAAK,EACL,IAAAkB,yBAAe,EAACnB,OAAO,CAAC,EACxB,IAAA7B,yBAAgB,EAAC,CAAC,EAClB,IAAAiD,yBAAc,EAAC,CACjB,CAAC;EAEP,oBACE,IAAApD,WAAA,CAAAU,GAAA,EAACvB,SAAA,CAAAkE,OAAO;IACN3B,OAAO,EAAEA,OAAQ;IACjBC,OAAO,EAAEA,OAAQ;IACjBE,UAAU,EAAEA,UAAW;IACvBC,cAAc,EAAEA,cAAe;IAC/BwB,MAAM,EAAE;MACNC,gBAAgB,EAAE,IAAI;MACtBC,aAAa,eACX,IAAAxD,WAAA,CAAAU,GAAA,EAACd,aAAA,CAAA6D,YAAY;QACXxB,KAAK,EAAEA,KAAM;QACbyB,UAAU,EAAEpB,QAAQ,IAAI,IAAK;QAC7BqB,WAAW,EAAElB,aAAc;QAC3BmB,WAAW,EAAE5B,OAAO,CAACvB,MAAO;QAC5BoD,aAAa,EAAEA,CAAA,KAAMzB,aAAa,CAAC,IAAI,CAAE;QACzC0B,OAAO,EAAEC,6BAAa;QACtBf,SAAS,EAAEA,SAAU;QACrBpB,MAAM,EAAEA;MAAO,CAChB;IAEL,CAAE;IACFoC,iBAAiB;IACjBC,WAAW,EAAC,aAAa;IACzBC,oBAAoB;IAAAnD,QAAA,EAEnBuB,QAAQ,gBACP,IAAAtC,WAAA,CAAAqB,IAAA,EAACnC,YAAA,CAAAyB,IAAI;MAACC,KAAK,EAAEC,MAAM,CAACsD,eAAgB;MAAApD,QAAA,gBAClC,IAAAf,WAAA,CAAAU,GAAA,EAACjB,YAAA,CAAA2E,WAAW;QAACC,MAAM,EAAE/B;MAAS,CAAE,CAAC,eACjC,IAAAtC,WAAA,CAAAU,GAAA,EAAChB,kBAAA,CAAA4E,iBAAiB;QAEhBD,MAAM,EAAE/B,QAAS;QACjBiC,WAAW,EAAE9B,aAAa,GAAG,CAAE;QAC/B+B,OAAO,EAAE/B,aAAa,IAAI,CAAC,IAAIA,aAAa,GAAGT,OAAO,CAACvB,MAAM,GAAG,CAAE;QAClEgE,UAAU,EAAEA,CAAA,KAAM5B,MAAM,CAACJ,aAAa,GAAG,CAAC,CAAE;QAC5CiC,MAAM,EAAEA,CAAA,KAAM7B,MAAM,CAACJ,aAAa,GAAG,CAAC;MAAE,GALnCH,QAAQ,CAACM,EAMf,CAAC;IAAA,CACE,CAAC,gBAEP,IAAA5C,WAAA,CAAAqB,IAAA,EAACnC,YAAA,CAAAyB,IAAI;MAACC,KAAK,EAAEC,MAAM,CAAC8D,aAAc;MAAA5D,QAAA,gBAChC,IAAAf,WAAA,CAAAU,GAAA,EAACZ,YAAA,CAAA8E,WAAW;QAACC,QAAQ,EAAE,IAAA1B,yBAAe,EAACnB,OAAO;MAAE,CAAE,CAAC,eACnD,IAAAhC,WAAA,CAAAU,GAAA,EAACT,aAAa,IAAE,CAAC,eACjB,IAAAD,WAAA,CAAAU,GAAA,EAACxB,YAAA,CAAA4F,QAAQ;QACPC,IAAI,EAAE/C,OAAQ;QACdgD,YAAY,EAAGC,IAAiB,IAAKC,MAAM,CAACD,IAAI,CAACrC,EAAE,CAAE;QACrDuC,UAAU,EAAEA,CAAC;UAAEF;QAAK,CAAC,kBAAK,IAAAjF,WAAA,CAAAU,GAAA,EAACf,SAAA,CAAAyF,QAAQ;UAACf,MAAM,EAAEY,IAAK;UAACI,OAAO,EAAEjD;QAAc,CAAE,CAAE;QAC7EkD,kBAAkB,eAAE,IAAAtF,WAAA,CAAAU,GAAA,EAACU,UAAU,IAAE;MAAE,CACpC,CAAC,eACF,IAAApB,WAAA,CAAAU,GAAA,EAACb,iBAAA,CAAA0F,gBAAgB,IAAE,CAAC;IAAA,CAChB;EACP,CACM,CAAC;AAEd;AAEA,MAAM1E,MAAM,GAAG2E,uBAAU,CAACC,MAAM,CAAC;EAC/Bd,aAAa,EAAE;IACbe,IAAI,EAAE;EACR,CAAC;EACDvB,eAAe,EAAE;IACfuB,IAAI,EAAE;EACR,CAAC;EACD5E,MAAM,EAAE;IACN6E,MAAM,EAAE,EAAE;IACVC,OAAO,EAAE,EAAE;IACXC,YAAY,EAAE,CAAC;IACfC,eAAe,EAAEC,qBAAW,CAACC,QAAQ,CAACC,iBAAiB;IACvDC,GAAG,EAAE;EACP,CAAC;EACD/E,UAAU,EAAE;IACVgF,KAAK,EAAEJ,qBAAW,CAACC,QAAQ,CAACI,OAAO;IACnCC,QAAQ,EAAE;EACZ,CAAC;EACD/E,KAAK,EAAE;IACLgF,UAAU,EAAE,QAAQ;IACpBV,OAAO,EAAE,EAAE;IACXM,GAAG,EAAE;EACP,CAAC;EACD3E,UAAU,EAAE;IACV4E,KAAK,EAAEJ,qBAAW,CAACQ,IAAI,CAACC,OAAO;IAC/BH,QAAQ,EAAE,EAAE;IACZI,UAAU,EAAE;EACd,CAAC;EACDjF,SAAS,EAAE;IACT2E,KAAK,EAAEJ,qBAAW,CAACQ,IAAI,CAACG,SAAS;IACjCL,QAAQ,EAAE,EAAE;IACZM,SAAS,EAAE,QAAQ;IACnBC,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImagesRoot = ImagesRoot;
|
|
7
|
+
var _install = require("../capture/install");
|
|
8
|
+
/**
|
|
9
|
+
* Mount once near the app root to start image capture immediately.
|
|
10
|
+
*
|
|
11
|
+
* NOTE: for full RN-core <Image> coverage prefer the side-effect import
|
|
12
|
+
* `import "@buoy-gg/images/register"` as the first import of your entry file —
|
|
13
|
+
* the RN decorator must be installed before React Native's Image module first
|
|
14
|
+
* evaluates. ImagesRoot alone still captures every expo-image instance
|
|
15
|
+
* (timing-immune) and reports whether the RN hook landed.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
function ImagesRoot() {
|
|
19
|
+
// Synchronous on first render — earlier than an effect, though still later
|
|
20
|
+
// than the register import. Idempotent.
|
|
21
|
+
(0, _install.installImageCapture)();
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ImagesRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_install","require","ImagesRoot","installImageCapture"],"sourceRoot":"../../../src","sources":["components/ImagesRoot.tsx"],"mappings":";;;;;;AAUA,IAAAA,QAAA,GAAAC,OAAA;AAVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIO,SAASC,UAAUA,CAAA,EAAS;EACjC;EACA;EACA,IAAAC,4BAAmB,EAAC,CAAC;EACrB,OAAO,IAAI;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.InsightsBar = InsightsBar;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
9
|
+
var _insights = require("../store/insights");
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
/**
|
|
12
|
+
* InsightsBar — compact warning chips above the list when cross-record
|
|
13
|
+
* findings exist (duplicates, retry storms, queue saturation, missing alt,
|
|
14
|
+
* layout shifts). Renders nothing when all clear.
|
|
15
|
+
*
|
|
16
|
+
* A wrapping row (not a horizontal ScrollView — that under-measures its
|
|
17
|
+
* height inside the modal's flex column and clips the chips).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
function InsightsBar({
|
|
21
|
+
insights
|
|
22
|
+
}) {
|
|
23
|
+
const chips = (0, _insights.insightChips)(insights);
|
|
24
|
+
if (chips.length === 0) return null;
|
|
25
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
26
|
+
style: styles.bar,
|
|
27
|
+
children: chips.map(chip => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
28
|
+
style: styles.chip,
|
|
29
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
30
|
+
style: styles.chipText,
|
|
31
|
+
children: chip
|
|
32
|
+
})
|
|
33
|
+
}, chip))
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const styles = _reactNative.StyleSheet.create({
|
|
37
|
+
bar: {
|
|
38
|
+
flexDirection: "row",
|
|
39
|
+
flexWrap: "wrap",
|
|
40
|
+
gap: 6,
|
|
41
|
+
paddingHorizontal: 10,
|
|
42
|
+
paddingVertical: 8,
|
|
43
|
+
borderBottomWidth: _reactNative.StyleSheet.hairlineWidth,
|
|
44
|
+
borderBottomColor: _sharedUi.macOSColors.border.default
|
|
45
|
+
},
|
|
46
|
+
chip: {
|
|
47
|
+
backgroundColor: _sharedUi.macOSColors.semantic.warningBackground,
|
|
48
|
+
borderRadius: 999,
|
|
49
|
+
paddingHorizontal: 10,
|
|
50
|
+
paddingVertical: 5
|
|
51
|
+
},
|
|
52
|
+
chipText: {
|
|
53
|
+
color: _sharedUi.macOSColors.semantic.warning,
|
|
54
|
+
fontSize: 10,
|
|
55
|
+
fontWeight: "600",
|
|
56
|
+
lineHeight: 13
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=InsightsBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_sharedUi","_insights","_jsxRuntime","InsightsBar","insights","chips","insightChips","length","jsx","View","style","styles","bar","children","map","chip","Text","chipText","StyleSheet","create","flexDirection","flexWrap","gap","paddingHorizontal","paddingVertical","borderBottomWidth","hairlineWidth","borderBottomColor","macOSColors","border","default","backgroundColor","semantic","warningBackground","borderRadius","color","warning","fontSize","fontWeight","lineHeight"],"sourceRoot":"../../../src","sources":["components/InsightsBar.tsx"],"mappings":";;;;;;AASA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAAiD,IAAAG,WAAA,GAAAH,OAAA;AAXjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOO,SAASI,WAAWA,CAAC;EAAEC;AAAsC,CAAC,EAAE;EACrE,MAAMC,KAAK,GAAG,IAAAC,sBAAY,EAACF,QAAQ,CAAC;EACpC,IAAIC,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EACnC,oBACE,IAAAL,WAAA,CAAAM,GAAA,EAACV,YAAA,CAAAW,IAAI;IAACC,KAAK,EAAEC,MAAM,CAACC,GAAI;IAAAC,QAAA,EACrBR,KAAK,CAACS,GAAG,CAAEC,IAAI,iBACd,IAAAb,WAAA,CAAAM,GAAA,EAACV,YAAA,CAAAW,IAAI;MAAYC,KAAK,EAAEC,MAAM,CAACI,IAAK;MAAAF,QAAA,eAClC,IAAAX,WAAA,CAAAM,GAAA,EAACV,YAAA,CAAAkB,IAAI;QAACN,KAAK,EAAEC,MAAM,CAACM,QAAS;QAAAJ,QAAA,EAAEE;MAAI,CAAO;IAAC,GADlCA,IAEL,CACP;EAAC,CACE,CAAC;AAEX;AAEA,MAAMJ,MAAM,GAAGO,uBAAU,CAACC,MAAM,CAAC;EAC/BP,GAAG,EAAE;IACHQ,aAAa,EAAE,KAAK;IACpBC,QAAQ,EAAE,MAAM;IAChBC,GAAG,EAAE,CAAC;IACNC,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAEP,uBAAU,CAACQ,aAAa;IAC3CC,iBAAiB,EAAEC,qBAAW,CAACC,MAAM,CAACC;EACxC,CAAC;EACDf,IAAI,EAAE;IACJgB,eAAe,EAAEH,qBAAW,CAACI,QAAQ,CAACC,iBAAiB;IACvDC,YAAY,EAAE,GAAG;IACjBX,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE;EACnB,CAAC;EACDP,QAAQ,EAAE;IACRkB,KAAK,EAAEP,qBAAW,CAACI,QAAQ,CAACI,OAAO;IACnCC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.formatRecordMarkdown = formatRecordMarkdown;
|
|
7
|
+
exports.formatRegistryMarkdown = formatRegistryMarkdown;
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _imageEventStore = require("./store/imageEventStore");
|
|
10
|
+
var _insights = require("./store/insights");
|
|
11
|
+
var _format = require("./format");
|
|
12
|
+
/**
|
|
13
|
+
* Copy-friendly markdown reports — paste-ready context for an issue, PR, or
|
|
14
|
+
* an AI chat. One for the whole registry (list header copy) and one for a
|
|
15
|
+
* single record (detail header copy).
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
function formatRecordMarkdown(record) {
|
|
19
|
+
const verdict = (0, _format.sizeVerdict)(record);
|
|
20
|
+
const cache = (0, _format.cacheBadge)(record);
|
|
21
|
+
const needed = (0, _imageEventStore.neededPixels)(record);
|
|
22
|
+
const decoded = (0, _imageEventStore.estDecodedBytes)(record);
|
|
23
|
+
const wasted = (0, _imageEventStore.estWastedBytes)(record);
|
|
24
|
+
const lines = [];
|
|
25
|
+
lines.push(`## Image report — ${(0, _format.uriTail)(record.uri)}`);
|
|
26
|
+
lines.push("");
|
|
27
|
+
lines.push(`- URI: ${record.uri || "(none)"}`);
|
|
28
|
+
lines.push(`- Library: ${record.lib === "expo" ? "expo-image" : "RN <Image>"} · kind: ${record.sourceKind} · mounted: ${record.mounted ? "yes" : "no"}`);
|
|
29
|
+
lines.push(`- Status: ${record.status}${record.errorCode ? ` (HTTP ${record.errorCode})` : ""} · load cycles: ${record.loadCount}`);
|
|
30
|
+
lines.push(`- Cache: ${cache.label}${record.cacheVerdictSource ? ` (via ${record.cacheVerdictSource === "event" ? "expo onLoad" : "Image.queryCache"})` : ""}`);
|
|
31
|
+
lines.push(`- Load time: ${(0, _format.formatMs)(record.durationMs)}${record.displayedAt && record.loadedAt ? ` · decode→display ${(0, _format.formatMs)(Math.max(0, record.displayedAt - record.loadedAt))}` : ""}`);
|
|
32
|
+
if (record.intrinsic) {
|
|
33
|
+
lines.push(`- Decoded: ${record.intrinsic.width}×${record.intrinsic.height}px${record.mediaType ? ` (${record.mediaType})` : ""}${record.isAnimated ? " animated" : ""} ≈ ${(0, _format.formatBytes)(decoded)} decoded memory`);
|
|
34
|
+
}
|
|
35
|
+
if (record.layout) {
|
|
36
|
+
lines.push(`- Displayed: ${Math.round(record.layout.width)}×${Math.round(record.layout.height)}dp @${_reactNative.PixelRatio.get()}x (needs ${needed ? `${needed.width}×${needed.height}px` : "?"})`);
|
|
37
|
+
}
|
|
38
|
+
if (verdict.label) {
|
|
39
|
+
lines.push(`- Size verdict: ${verdict.label}${wasted > 0 && needed ? ` — wasting ≈${(0, _format.formatBytes)(wasted)}; serve ${needed.width}×${needed.height}` : ""}`);
|
|
40
|
+
}
|
|
41
|
+
if (record.progressSeen) {
|
|
42
|
+
lines.push(`- Network transfer: ${record.bytesTotal ? (0, _format.formatBytes)(record.bytesTotal) : "observed"}`);
|
|
43
|
+
}
|
|
44
|
+
if (record.hasAltText === false) lines.push(`- Accessibility: MISSING alt/accessibilityLabel`);
|
|
45
|
+
if ((record.layoutShifts ?? 0) > 0) lines.push(`- Layout shifts after load: ${record.layoutShifts} (reserve explicit dimensions)`);
|
|
46
|
+
if (record.error) {
|
|
47
|
+
lines.push(`- Error: ${record.error}`);
|
|
48
|
+
if (record.errorHeaders) {
|
|
49
|
+
lines.push(`- Response headers: ${JSON.stringify(record.errorHeaders)}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (record.overrideLabel) lines.push(`- Simulation active: ${record.overrideLabel}`);
|
|
53
|
+
return lines.join("\n");
|
|
54
|
+
}
|
|
55
|
+
function formatRegistryMarkdown(records, stats, insights, captureStatus, modes) {
|
|
56
|
+
const lines = [];
|
|
57
|
+
lines.push(`## Buoy Images registry (${stats.total} records)`);
|
|
58
|
+
lines.push("");
|
|
59
|
+
lines.push(`${stats.loaded} loaded · ${stats.errors} failed · ${stats.loading} in flight · ≈${(0, _format.formatBytes)(stats.estDecodedBytes)} decoded` + (stats.estWastedBytes > 0 ? ` · ${(0, _format.formatBytes)(stats.estWastedBytes)} wasted on oversized sources` : ""));
|
|
60
|
+
const chips = (0, _insights.insightChips)(insights);
|
|
61
|
+
if (chips.length > 0) lines.push(`Insights: ${chips.join(" · ")}`);
|
|
62
|
+
if (modes.network !== "normal" || modes.blank) {
|
|
63
|
+
lines.push(`Simulation active: network=${modes.network}${modes.blank ? ", blank images" : ""}`);
|
|
64
|
+
}
|
|
65
|
+
if (captureStatus.rnDecoratorTooLate) {
|
|
66
|
+
lines.push(`⚠ RN <Image> capture inactive (register import too late)`);
|
|
67
|
+
}
|
|
68
|
+
lines.push("");
|
|
69
|
+
lines.push("| image | lib | status | cache | ms | decoded px | shown dp | verdict | notes |");
|
|
70
|
+
lines.push("|---|---|---|---|---|---|---|---|---|");
|
|
71
|
+
for (const r of records) {
|
|
72
|
+
const verdict = (0, _format.sizeVerdict)(r);
|
|
73
|
+
const cache = (0, _format.cacheBadge)(r);
|
|
74
|
+
const dims = r.intrinsic ? `${r.intrinsic.width}×${r.intrinsic.height}` : "–";
|
|
75
|
+
const layout = r.layout ? `${Math.round(r.layout.width)}×${Math.round(r.layout.height)}` : "–";
|
|
76
|
+
const notes = [r.error ? `error: ${r.error}` : null, r.overrideLabel ? `sim: ${r.overrideLabel}` : null, r.hasAltText === false ? "no alt" : null, (r.layoutShifts ?? 0) > 0 ? `${r.layoutShifts} layout shifts` : null, r.mounted ? null : "unmounted"].filter(Boolean).join("; ");
|
|
77
|
+
lines.push(`| ${(0, _format.uriTail)(r.uri)} | ${r.lib} | ${r.status} | ${cache.label} | ${r.durationMs != null ? Math.round(r.durationMs) : "–"} | ${dims} | ${layout} | ${verdict.label || "–"} | ${notes || "–"} |`);
|
|
78
|
+
}
|
|
79
|
+
return lines.join("\n");
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_imageEventStore","_insights","_format","formatRecordMarkdown","record","verdict","sizeVerdict","cache","cacheBadge","needed","neededPixels","decoded","estDecodedBytes","wasted","estWastedBytes","lines","push","uriTail","uri","lib","sourceKind","mounted","status","errorCode","loadCount","label","cacheVerdictSource","formatMs","durationMs","displayedAt","loadedAt","Math","max","intrinsic","width","height","mediaType","isAnimated","formatBytes","layout","round","PixelRatio","get","progressSeen","bytesTotal","hasAltText","layoutShifts","error","errorHeaders","JSON","stringify","overrideLabel","join","formatRegistryMarkdown","records","stats","insights","captureStatus","modes","total","loaded","errors","loading","chips","insightChips","length","network","blank","rnDecoratorTooLate","r","dims","notes","filter","Boolean"],"sourceRoot":"../../src","sources":["export.ts"],"mappings":"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","ignoreList":[]}
|