@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.
Files changed (195) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +58 -0
  3. package/lib/commonjs/capture/actions.js +227 -0
  4. package/lib/commonjs/capture/actions.js.map +1 -0
  5. package/lib/commonjs/capture/install.js +41 -0
  6. package/lib/commonjs/capture/install.js.map +1 -0
  7. package/lib/commonjs/capture/installExpoImage.js +99 -0
  8. package/lib/commonjs/capture/installExpoImage.js.map +1 -0
  9. package/lib/commonjs/capture/installRnImage.js +128 -0
  10. package/lib/commonjs/capture/installRnImage.js.map +1 -0
  11. package/lib/commonjs/capture/overrides.js +286 -0
  12. package/lib/commonjs/capture/overrides.js.map +1 -0
  13. package/lib/commonjs/capture/savings.js +193 -0
  14. package/lib/commonjs/capture/savings.js.map +1 -0
  15. package/lib/commonjs/capture/shared.js +367 -0
  16. package/lib/commonjs/capture/shared.js.map +1 -0
  17. package/lib/commonjs/components/ImageDetail.js +444 -0
  18. package/lib/commonjs/components/ImageDetail.js.map +1 -0
  19. package/lib/commonjs/components/ImageDetailFooter.js +232 -0
  20. package/lib/commonjs/components/ImageDetailFooter.js.map +1 -0
  21. package/lib/commonjs/components/ImageRow.js +164 -0
  22. package/lib/commonjs/components/ImageRow.js.map +1 -0
  23. package/lib/commonjs/components/ImagesHeader.js +63 -0
  24. package/lib/commonjs/components/ImagesHeader.js.map +1 -0
  25. package/lib/commonjs/components/ImagesIcon.js +59 -0
  26. package/lib/commonjs/components/ImagesIcon.js.map +1 -0
  27. package/lib/commonjs/components/ImagesListFooter.js +194 -0
  28. package/lib/commonjs/components/ImagesListFooter.js.map +1 -0
  29. package/lib/commonjs/components/ImagesModal.js +173 -0
  30. package/lib/commonjs/components/ImagesModal.js.map +1 -0
  31. package/lib/commonjs/components/ImagesRoot.js +24 -0
  32. package/lib/commonjs/components/ImagesRoot.js.map +1 -0
  33. package/lib/commonjs/components/InsightsBar.js +59 -0
  34. package/lib/commonjs/components/InsightsBar.js.map +1 -0
  35. package/lib/commonjs/export.js +81 -0
  36. package/lib/commonjs/export.js.map +1 -0
  37. package/lib/commonjs/format.js +117 -0
  38. package/lib/commonjs/format.js.map +1 -0
  39. package/lib/commonjs/hooks/useImageRecords.js +20 -0
  40. package/lib/commonjs/hooks/useImageRecords.js.map +1 -0
  41. package/lib/commonjs/index.js +236 -0
  42. package/lib/commonjs/index.js.map +1 -0
  43. package/lib/commonjs/package.json +1 -0
  44. package/lib/commonjs/preset.js +45 -0
  45. package/lib/commonjs/preset.js.map +1 -0
  46. package/lib/commonjs/register.js +19 -0
  47. package/lib/commonjs/register.js.map +1 -0
  48. package/lib/commonjs/state.js +54 -0
  49. package/lib/commonjs/state.js.map +1 -0
  50. package/lib/commonjs/store/imageEventStore.js +160 -0
  51. package/lib/commonjs/store/imageEventStore.js.map +1 -0
  52. package/lib/commonjs/store/insights.js +76 -0
  53. package/lib/commonjs/store/insights.js.map +1 -0
  54. package/lib/commonjs/sync/imagesSyncAdapter.js +315 -0
  55. package/lib/commonjs/sync/imagesSyncAdapter.js.map +1 -0
  56. package/lib/commonjs/types.js +2 -0
  57. package/lib/commonjs/types.js.map +1 -0
  58. package/lib/module/capture/actions.js +214 -0
  59. package/lib/module/capture/actions.js.map +1 -0
  60. package/lib/module/capture/install.js +36 -0
  61. package/lib/module/capture/install.js.map +1 -0
  62. package/lib/module/capture/installExpoImage.js +94 -0
  63. package/lib/module/capture/installExpoImage.js.map +1 -0
  64. package/lib/module/capture/installRnImage.js +122 -0
  65. package/lib/module/capture/installRnImage.js.map +1 -0
  66. package/lib/module/capture/overrides.js +269 -0
  67. package/lib/module/capture/overrides.js.map +1 -0
  68. package/lib/module/capture/savings.js +189 -0
  69. package/lib/module/capture/savings.js.map +1 -0
  70. package/lib/module/capture/shared.js +359 -0
  71. package/lib/module/capture/shared.js.map +1 -0
  72. package/lib/module/components/ImageDetail.js +440 -0
  73. package/lib/module/components/ImageDetail.js.map +1 -0
  74. package/lib/module/components/ImageDetailFooter.js +228 -0
  75. package/lib/module/components/ImageDetailFooter.js.map +1 -0
  76. package/lib/module/components/ImageRow.js +160 -0
  77. package/lib/module/components/ImageRow.js.map +1 -0
  78. package/lib/module/components/ImagesHeader.js +59 -0
  79. package/lib/module/components/ImagesHeader.js.map +1 -0
  80. package/lib/module/components/ImagesIcon.js +55 -0
  81. package/lib/module/components/ImagesIcon.js.map +1 -0
  82. package/lib/module/components/ImagesListFooter.js +190 -0
  83. package/lib/module/components/ImagesListFooter.js.map +1 -0
  84. package/lib/module/components/ImagesModal.js +169 -0
  85. package/lib/module/components/ImagesModal.js.map +1 -0
  86. package/lib/module/components/ImagesRoot.js +20 -0
  87. package/lib/module/components/ImagesRoot.js.map +1 -0
  88. package/lib/module/components/InsightsBar.js +55 -0
  89. package/lib/module/components/InsightsBar.js.map +1 -0
  90. package/lib/module/export.js +76 -0
  91. package/lib/module/export.js.map +1 -0
  92. package/lib/module/format.js +108 -0
  93. package/lib/module/format.js.map +1 -0
  94. package/lib/module/hooks/useImageRecords.js +16 -0
  95. package/lib/module/hooks/useImageRecords.js.map +1 -0
  96. package/lib/module/index.js +73 -0
  97. package/lib/module/index.js.map +1 -0
  98. package/lib/module/preset.js +40 -0
  99. package/lib/module/preset.js.map +1 -0
  100. package/lib/module/register.js +19 -0
  101. package/lib/module/register.js.map +1 -0
  102. package/lib/module/state.js +50 -0
  103. package/lib/module/state.js.map +1 -0
  104. package/lib/module/store/imageEventStore.js +146 -0
  105. package/lib/module/store/imageEventStore.js.map +1 -0
  106. package/lib/module/store/insights.js +71 -0
  107. package/lib/module/store/insights.js.map +1 -0
  108. package/lib/module/sync/imagesSyncAdapter.js +311 -0
  109. package/lib/module/sync/imagesSyncAdapter.js.map +1 -0
  110. package/lib/module/types.js +2 -0
  111. package/lib/module/types.js.map +1 -0
  112. package/lib/typescript/capture/actions.d.ts +49 -0
  113. package/lib/typescript/capture/actions.d.ts.map +1 -0
  114. package/lib/typescript/capture/install.d.ts +15 -0
  115. package/lib/typescript/capture/install.d.ts.map +1 -0
  116. package/lib/typescript/capture/installExpoImage.d.ts +23 -0
  117. package/lib/typescript/capture/installExpoImage.d.ts.map +1 -0
  118. package/lib/typescript/capture/installRnImage.d.ts +24 -0
  119. package/lib/typescript/capture/installRnImage.d.ts.map +1 -0
  120. package/lib/typescript/capture/overrides.d.ts +83 -0
  121. package/lib/typescript/capture/overrides.d.ts.map +1 -0
  122. package/lib/typescript/capture/savings.d.ts +37 -0
  123. package/lib/typescript/capture/savings.d.ts.map +1 -0
  124. package/lib/typescript/capture/shared.d.ts +61 -0
  125. package/lib/typescript/capture/shared.d.ts.map +1 -0
  126. package/lib/typescript/components/ImageDetail.d.ts +13 -0
  127. package/lib/typescript/components/ImageDetail.d.ts.map +1 -0
  128. package/lib/typescript/components/ImageDetailFooter.d.ts +19 -0
  129. package/lib/typescript/components/ImageDetailFooter.d.ts.map +1 -0
  130. package/lib/typescript/components/ImageRow.d.ts +15 -0
  131. package/lib/typescript/components/ImageRow.d.ts.map +1 -0
  132. package/lib/typescript/components/ImagesHeader.d.ts +25 -0
  133. package/lib/typescript/components/ImagesHeader.d.ts.map +1 -0
  134. package/lib/typescript/components/ImagesIcon.d.ts +13 -0
  135. package/lib/typescript/components/ImagesIcon.d.ts.map +1 -0
  136. package/lib/typescript/components/ImagesListFooter.d.ts +8 -0
  137. package/lib/typescript/components/ImagesListFooter.d.ts.map +1 -0
  138. package/lib/typescript/components/ImagesModal.d.ts +17 -0
  139. package/lib/typescript/components/ImagesModal.d.ts.map +1 -0
  140. package/lib/typescript/components/ImagesRoot.d.ts +11 -0
  141. package/lib/typescript/components/ImagesRoot.d.ts.map +1 -0
  142. package/lib/typescript/components/InsightsBar.d.ts +13 -0
  143. package/lib/typescript/components/InsightsBar.d.ts.map +1 -0
  144. package/lib/typescript/export.d.ts +12 -0
  145. package/lib/typescript/export.d.ts.map +1 -0
  146. package/lib/typescript/format.d.ts +26 -0
  147. package/lib/typescript/format.d.ts.map +1 -0
  148. package/lib/typescript/hooks/useImageRecords.d.ts +11 -0
  149. package/lib/typescript/hooks/useImageRecords.d.ts.map +1 -0
  150. package/lib/typescript/index.d.ts +33 -0
  151. package/lib/typescript/index.d.ts.map +1 -0
  152. package/lib/typescript/preset.d.ts +38 -0
  153. package/lib/typescript/preset.d.ts.map +1 -0
  154. package/lib/typescript/register.d.ts +15 -0
  155. package/lib/typescript/register.d.ts.map +1 -0
  156. package/lib/typescript/state.d.ts +54 -0
  157. package/lib/typescript/state.d.ts.map +1 -0
  158. package/lib/typescript/store/imageEventStore.d.ts +34 -0
  159. package/lib/typescript/store/imageEventStore.d.ts.map +1 -0
  160. package/lib/typescript/store/insights.d.ts +11 -0
  161. package/lib/typescript/store/insights.d.ts.map +1 -0
  162. package/lib/typescript/sync/imagesSyncAdapter.d.ts +205 -0
  163. package/lib/typescript/sync/imagesSyncAdapter.d.ts.map +1 -0
  164. package/lib/typescript/types.d.ts +121 -0
  165. package/lib/typescript/types.d.ts.map +1 -0
  166. package/package.json +67 -0
  167. package/register.d.ts +1 -0
  168. package/register.js +15 -0
  169. package/src/capture/actions.ts +206 -0
  170. package/src/capture/install.ts +36 -0
  171. package/src/capture/installExpoImage.ts +115 -0
  172. package/src/capture/installRnImage.tsx +133 -0
  173. package/src/capture/overrides.ts +282 -0
  174. package/src/capture/savings.ts +193 -0
  175. package/src/capture/shared.ts +387 -0
  176. package/src/components/ImageDetail.tsx +456 -0
  177. package/src/components/ImageDetailFooter.tsx +270 -0
  178. package/src/components/ImageRow.tsx +148 -0
  179. package/src/components/ImagesHeader.tsx +77 -0
  180. package/src/components/ImagesIcon.tsx +66 -0
  181. package/src/components/ImagesListFooter.tsx +193 -0
  182. package/src/components/ImagesModal.tsx +195 -0
  183. package/src/components/ImagesRoot.tsx +18 -0
  184. package/src/components/InsightsBar.tsx +51 -0
  185. package/src/export.ts +100 -0
  186. package/src/format.ts +85 -0
  187. package/src/hooks/useImageRecords.ts +24 -0
  188. package/src/index.tsx +108 -0
  189. package/src/preset.tsx +35 -0
  190. package/src/register.ts +17 -0
  191. package/src/state.ts +88 -0
  192. package/src/store/imageEventStore.ts +162 -0
  193. package/src/store/insights.ts +66 -0
  194. package/src/sync/imagesSyncAdapter.ts +261 -0
  195. package/src/types.ts +111 -0
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * ImagesListFooter — the list screen's action bar: mass simulations applied
5
+ * to EVERY mounted image at once (error / loading / blank), mass hard-reload,
6
+ * flash everything, restore all — plus the global network simulation modes
7
+ * (Normal / Offline / Cold). Styled to match the detail footer.
8
+ */
9
+
10
+ import { useState, useSyncExternalStore } from "react";
11
+ import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
12
+ import { macOSColors, useSafeAreaInsets } from "@buoy-gg/shared-ui";
13
+ import { hardReloadAllMounted, subscribeActions } from "../capture/actions";
14
+ import { clearAllOverrides, flashAllMounted, getGlobalModes, setNetworkMode, setOverrideForAllMounted } from "../capture/overrides";
15
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
16
+ const NETWORK_MODES = [{
17
+ key: "normal",
18
+ label: "Normal"
19
+ }, {
20
+ key: "offline",
21
+ label: "Offline"
22
+ }, {
23
+ key: "cold",
24
+ label: "Cold"
25
+ }];
26
+ export function ImagesListFooter() {
27
+ const insets = useSafeAreaInsets();
28
+ const [message, setMessage] = useState(null);
29
+ const network = useSyncExternalStore(subscribeActions, () => getGlobalModes().network);
30
+ const massOverride = (source, label) => {
31
+ const count = setOverrideForAllMounted(source, label);
32
+ setMessage(count > 0 ? `${label} on ${count} image${count === 1 ? "" : "s"} — Restore all to undo` : "No mounted images");
33
+ };
34
+ return /*#__PURE__*/_jsxs(View, {
35
+ style: [styles.footer, {
36
+ paddingBottom: 10 + insets.bottom
37
+ }],
38
+ children: [message ? /*#__PURE__*/_jsx(Text, {
39
+ style: styles.message,
40
+ numberOfLines: 1,
41
+ children: message
42
+ }) : /*#__PURE__*/_jsx(Text, {
43
+ style: styles.caption,
44
+ children: "MASS ACTIONS \u2014 every image on screen"
45
+ }), /*#__PURE__*/_jsxs(View, {
46
+ style: styles.row,
47
+ children: [/*#__PURE__*/_jsx(MassButton, {
48
+ label: "Error",
49
+ onPress: () => massOverride({
50
+ type: "error"
51
+ }, "Forced error")
52
+ }), /*#__PURE__*/_jsx(MassButton, {
53
+ label: "Loading",
54
+ onPress: () => massOverride({
55
+ type: "hang"
56
+ }, "Forced loading")
57
+ }), /*#__PURE__*/_jsx(MassButton, {
58
+ label: "Blank",
59
+ onPress: () => massOverride({
60
+ type: "blank"
61
+ }, "Blanked")
62
+ }), /*#__PURE__*/_jsx(MassButton, {
63
+ label: "Reload",
64
+ onPress: () => {
65
+ setMessage("…");
66
+ hardReloadAllMounted().then(r => setMessage(r.message));
67
+ }
68
+ }), /*#__PURE__*/_jsx(MassButton, {
69
+ label: "Find",
70
+ onPress: () => {
71
+ const count = flashAllMounted();
72
+ setMessage(`Flashing ${count} image${count === 1 ? "" : "s"} (2.5s)`);
73
+ }
74
+ }), /*#__PURE__*/_jsx(MassButton, {
75
+ label: "Restore",
76
+ accent: true,
77
+ onPress: () => {
78
+ const count = clearAllOverrides();
79
+ setMessage(count > 0 ? `Restored ${count} image${count === 1 ? "" : "s"}` : "No overrides active");
80
+ }
81
+ })]
82
+ }), /*#__PURE__*/_jsxs(View, {
83
+ style: styles.row,
84
+ children: [/*#__PURE__*/_jsx(Text, {
85
+ style: styles.netLabel,
86
+ children: "NET"
87
+ }), NETWORK_MODES.map(mode => {
88
+ const active = network === mode.key;
89
+ return /*#__PURE__*/_jsx(TouchableOpacity, {
90
+ onPress: () => {
91
+ setNetworkMode(mode.key);
92
+ // Modes only affect loads that happen AFTER they're set — an
93
+ // on-screen image keeps its bitmap until something reloads it.
94
+ 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");
95
+ },
96
+ style: [styles.netButton, active && styles.netButtonActive],
97
+ activeOpacity: 0.7,
98
+ children: /*#__PURE__*/_jsx(Text, {
99
+ style: [styles.buttonText, active && styles.netTextActive],
100
+ children: mode.label
101
+ })
102
+ }, mode.key);
103
+ })]
104
+ })]
105
+ });
106
+ }
107
+ function MassButton({
108
+ label,
109
+ onPress,
110
+ accent
111
+ }) {
112
+ return /*#__PURE__*/_jsx(TouchableOpacity, {
113
+ onPress: onPress,
114
+ style: styles.button,
115
+ activeOpacity: 0.7,
116
+ children: /*#__PURE__*/_jsx(Text, {
117
+ style: [styles.buttonText, accent && styles.buttonTextAccent],
118
+ children: label
119
+ })
120
+ });
121
+ }
122
+ const styles = StyleSheet.create({
123
+ footer: {
124
+ paddingHorizontal: 12,
125
+ paddingTop: 8,
126
+ backgroundColor: macOSColors.background.base,
127
+ borderTopWidth: 1,
128
+ borderTopColor: macOSColors.border.default,
129
+ gap: 8
130
+ },
131
+ caption: {
132
+ color: macOSColors.text.muted,
133
+ fontSize: 9,
134
+ fontWeight: "700",
135
+ letterSpacing: 0.8
136
+ },
137
+ message: {
138
+ color: macOSColors.semantic.info,
139
+ fontSize: 10,
140
+ fontFamily: "monospace"
141
+ },
142
+ row: {
143
+ flexDirection: "row",
144
+ gap: 6
145
+ },
146
+ button: {
147
+ flex: 1,
148
+ alignItems: "center",
149
+ paddingVertical: 8,
150
+ borderRadius: 6,
151
+ backgroundColor: macOSColors.background.card,
152
+ borderWidth: StyleSheet.hairlineWidth,
153
+ borderColor: macOSColors.border.default
154
+ },
155
+ buttonText: {
156
+ fontSize: 10,
157
+ fontWeight: "600",
158
+ color: macOSColors.text.secondary,
159
+ fontFamily: "monospace",
160
+ textTransform: "uppercase"
161
+ },
162
+ buttonTextAccent: {
163
+ color: macOSColors.semantic.warning
164
+ },
165
+ netLabel: {
166
+ color: macOSColors.text.muted,
167
+ fontSize: 9,
168
+ fontWeight: "700",
169
+ letterSpacing: 0.8,
170
+ alignSelf: "center",
171
+ marginRight: 2
172
+ },
173
+ netButton: {
174
+ flex: 1,
175
+ alignItems: "center",
176
+ paddingVertical: 6,
177
+ borderRadius: 6,
178
+ backgroundColor: macOSColors.background.card,
179
+ borderWidth: StyleSheet.hairlineWidth,
180
+ borderColor: macOSColors.border.default
181
+ },
182
+ netButtonActive: {
183
+ backgroundColor: macOSColors.semantic.infoBackground,
184
+ borderColor: macOSColors.semantic.info
185
+ },
186
+ netTextActive: {
187
+ color: macOSColors.semantic.info
188
+ }
189
+ });
190
+ //# sourceMappingURL=ImagesListFooter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","useSyncExternalStore","StyleSheet","Text","TouchableOpacity","View","macOSColors","useSafeAreaInsets","hardReloadAllMounted","subscribeActions","clearAllOverrides","flashAllMounted","getGlobalModes","setNetworkMode","setOverrideForAllMounted","jsx","_jsx","jsxs","_jsxs","NETWORK_MODES","key","label","ImagesListFooter","insets","message","setMessage","network","massOverride","source","count","style","styles","footer","paddingBottom","bottom","children","numberOfLines","caption","row","MassButton","onPress","type","then","r","accent","netLabel","map","mode","active","netButton","netButtonActive","activeOpacity","buttonText","netTextActive","button","buttonTextAccent","create","paddingHorizontal","paddingTop","backgroundColor","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":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,oBAAoB,QAAQ,OAAO;AACtD,SAASC,UAAU,EAAEC,IAAI,EAAEC,gBAAgB,EAAEC,IAAI,QAAQ,cAAc;AACvE,SAASC,WAAW,EAAEC,iBAAiB,QAAQ,oBAAoB;AACnE,SAASC,oBAAoB,EAAEC,gBAAgB,QAAQ,oBAAoB;AAC3E,SACEC,iBAAiB,EACjBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,wBAAwB,QACnB,sBAAsB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAG9B,MAAMC,aAAoD,GAAG,CAC3D;EAAEC,GAAG,EAAE,QAAQ;EAAEC,KAAK,EAAE;AAAS,CAAC,EAClC;EAAED,GAAG,EAAE,SAAS;EAAEC,KAAK,EAAE;AAAU,CAAC,EACpC;EAAED,GAAG,EAAE,MAAM;EAAEC,KAAK,EAAE;AAAO,CAAC,CAC/B;AAED,OAAO,SAASC,gBAAgBA,CAAA,EAAG;EACjC,MAAMC,MAAM,GAAGhB,iBAAiB,CAAC,CAAC;EAClC,MAAM,CAACiB,OAAO,EAAEC,UAAU,CAAC,GAAGzB,QAAQ,CAAgB,IAAI,CAAC;EAC3D,MAAM0B,OAAO,GAAGzB,oBAAoB,CAClCQ,gBAAgB,EAChB,MAAMG,cAAc,CAAC,CAAC,CAACc,OACzB,CAAC;EAED,MAAMC,YAAY,GAAGA,CAACC,MAAsB,EAAEP,KAAa,KAAK;IAC9D,MAAMQ,KAAK,GAAGf,wBAAwB,CAACc,MAAM,EAAEP,KAAK,CAAC;IACrDI,UAAU,CAACI,KAAK,GAAG,CAAC,GAAG,GAAGR,KAAK,OAAOQ,KAAK,SAASA,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,wBAAwB,GAAG,mBAAmB,CAAC;EAC3H,CAAC;EAED,oBACEX,KAAA,CAACb,IAAI;IAACyB,KAAK,EAAE,CAACC,MAAM,CAACC,MAAM,EAAE;MAAEC,aAAa,EAAE,EAAE,GAAGV,MAAM,CAACW;IAAO,CAAC,CAAE;IAAAC,QAAA,GACjEX,OAAO,gBACNR,IAAA,CAACb,IAAI;MAAC2B,KAAK,EAAEC,MAAM,CAACP,OAAQ;MAACY,aAAa,EAAE,CAAE;MAAAD,QAAA,EAC3CX;IAAO,CACJ,CAAC,gBAEPR,IAAA,CAACb,IAAI;MAAC2B,KAAK,EAAEC,MAAM,CAACM,OAAQ;MAAAF,QAAA,EAAC;IAAoC,CAAM,CACxE,eACDjB,KAAA,CAACb,IAAI;MAACyB,KAAK,EAAEC,MAAM,CAACO,GAAI;MAAAH,QAAA,gBACtBnB,IAAA,CAACuB,UAAU;QAAClB,KAAK,EAAC,OAAO;QAACmB,OAAO,EAAEA,CAAA,KAAMb,YAAY,CAAC;UAAEc,IAAI,EAAE;QAAQ,CAAC,EAAE,cAAc;MAAE,CAAE,CAAC,eAC5FzB,IAAA,CAACuB,UAAU;QAAClB,KAAK,EAAC,SAAS;QAACmB,OAAO,EAAEA,CAAA,KAAMb,YAAY,CAAC;UAAEc,IAAI,EAAE;QAAO,CAAC,EAAE,gBAAgB;MAAE,CAAE,CAAC,eAC/FzB,IAAA,CAACuB,UAAU;QAAClB,KAAK,EAAC,OAAO;QAACmB,OAAO,EAAEA,CAAA,KAAMb,YAAY,CAAC;UAAEc,IAAI,EAAE;QAAQ,CAAC,EAAE,SAAS;MAAE,CAAE,CAAC,eACvFzB,IAAA,CAACuB,UAAU;QACTlB,KAAK,EAAC,QAAQ;QACdmB,OAAO,EAAEA,CAAA,KAAM;UACbf,UAAU,CAAC,GAAG,CAAC;UACfjB,oBAAoB,CAAC,CAAC,CAACkC,IAAI,CAAEC,CAAC,IAAKlB,UAAU,CAACkB,CAAC,CAACnB,OAAO,CAAC,CAAC;QAC3D;MAAE,CACH,CAAC,eACFR,IAAA,CAACuB,UAAU;QACTlB,KAAK,EAAC,MAAM;QACZmB,OAAO,EAAEA,CAAA,KAAM;UACb,MAAMX,KAAK,GAAGlB,eAAe,CAAC,CAAC;UAC/Bc,UAAU,CAAC,YAAYI,KAAK,SAASA,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC;QACvE;MAAE,CACH,CAAC,eACFb,IAAA,CAACuB,UAAU;QACTlB,KAAK,EAAC,SAAS;QACfuB,MAAM;QACNJ,OAAO,EAAEA,CAAA,KAAM;UACb,MAAMX,KAAK,GAAGnB,iBAAiB,CAAC,CAAC;UACjCe,UAAU,CAACI,KAAK,GAAG,CAAC,GAAG,YAAYA,KAAK,SAASA,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,qBAAqB,CAAC;QACpG;MAAE,CACH,CAAC;IAAA,CACE,CAAC,eAEPX,KAAA,CAACb,IAAI;MAACyB,KAAK,EAAEC,MAAM,CAACO,GAAI;MAAAH,QAAA,gBACtBnB,IAAA,CAACb,IAAI;QAAC2B,KAAK,EAAEC,MAAM,CAACc,QAAS;QAAAV,QAAA,EAAC;MAAG,CAAM,CAAC,EACvChB,aAAa,CAAC2B,GAAG,CAAEC,IAAI,IAAK;QAC3B,MAAMC,MAAM,GAAGtB,OAAO,KAAKqB,IAAI,CAAC3B,GAAG;QACnC,oBACEJ,IAAA,CAACZ,gBAAgB;UAEfoC,OAAO,EAAEA,CAAA,KAAM;YACb3B,cAAc,CAACkC,IAAI,CAAC3B,GAAG,CAAC;YACxB;YACA;YACAK,UAAU,CACRsB,IAAI,CAAC3B,GAAG,KAAK,QAAQ,GACjB,4DAA4D,GAC5D2B,IAAI,CAAC3B,GAAG,KAAK,SAAS,GACpB,oGAAoG,GACpG,2EACR,CAAC;UACH,CAAE;UACFU,KAAK,EAAE,CAACC,MAAM,CAACkB,SAAS,EAAED,MAAM,IAAIjB,MAAM,CAACmB,eAAe,CAAE;UAC5DC,aAAa,EAAE,GAAI;UAAAhB,QAAA,eAEnBnB,IAAA,CAACb,IAAI;YAAC2B,KAAK,EAAE,CAACC,MAAM,CAACqB,UAAU,EAAEJ,MAAM,IAAIjB,MAAM,CAACsB,aAAa,CAAE;YAAAlB,QAAA,EAC9DY,IAAI,CAAC1B;UAAK,CACP;QAAC,GAlBF0B,IAAI,CAAC3B,GAmBM,CAAC;MAEvB,CAAC,CAAC;IAAA,CACE,CAAC;EAAA,CACH,CAAC;AAEX;AAEA,SAASmB,UAAUA,CAAC;EAClBlB,KAAK;EACLmB,OAAO;EACPI;AAKF,CAAC,EAAE;EACD,oBACE5B,IAAA,CAACZ,gBAAgB;IAACoC,OAAO,EAAEA,OAAQ;IAACV,KAAK,EAAEC,MAAM,CAACuB,MAAO;IAACH,aAAa,EAAE,GAAI;IAAAhB,QAAA,eAC3EnB,IAAA,CAACb,IAAI;MAAC2B,KAAK,EAAE,CAACC,MAAM,CAACqB,UAAU,EAAER,MAAM,IAAIb,MAAM,CAACwB,gBAAgB,CAAE;MAAApB,QAAA,EAAEd;IAAK,CAAO;EAAC,CACnE,CAAC;AAEvB;AAEA,MAAMU,MAAM,GAAG7B,UAAU,CAACsD,MAAM,CAAC;EAC/BxB,MAAM,EAAE;IACNyB,iBAAiB,EAAE,EAAE;IACrBC,UAAU,EAAE,CAAC;IACbC,eAAe,EAAErD,WAAW,CAACsD,UAAU,CAACC,IAAI;IAC5CC,cAAc,EAAE,CAAC;IACjBC,cAAc,EAAEzD,WAAW,CAAC0D,MAAM,CAACC,OAAO;IAC1CC,GAAG,EAAE;EACP,CAAC;EACD7B,OAAO,EAAE;IACP8B,KAAK,EAAE7D,WAAW,CAAC8D,IAAI,CAACC,KAAK;IAC7BC,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE,KAAK;IACjBC,aAAa,EAAE;EACjB,CAAC;EACDhD,OAAO,EAAE;IACP2C,KAAK,EAAE7D,WAAW,CAACmE,QAAQ,CAACC,IAAI;IAChCJ,QAAQ,EAAE,EAAE;IACZK,UAAU,EAAE;EACd,CAAC;EACDrC,GAAG,EAAE;IACHsC,aAAa,EAAE,KAAK;IACpBV,GAAG,EAAE;EACP,CAAC;EACDZ,MAAM,EAAE;IACNuB,IAAI,EAAE,CAAC;IACPC,UAAU,EAAE,QAAQ;IACpBC,eAAe,EAAE,CAAC;IAClBC,YAAY,EAAE,CAAC;IACfrB,eAAe,EAAErD,WAAW,CAACsD,UAAU,CAACqB,IAAI;IAC5CC,WAAW,EAAEhF,UAAU,CAACiF,aAAa;IACrCC,WAAW,EAAE9E,WAAW,CAAC0D,MAAM,CAACC;EAClC,CAAC;EACDb,UAAU,EAAE;IACVkB,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBJ,KAAK,EAAE7D,WAAW,CAAC8D,IAAI,CAACiB,SAAS;IACjCV,UAAU,EAAE,WAAW;IACvBW,aAAa,EAAE;EACjB,CAAC;EACD/B,gBAAgB,EAAE;IAChBY,KAAK,EAAE7D,WAAW,CAACmE,QAAQ,CAACc;EAC9B,CAAC;EACD1C,QAAQ,EAAE;IACRsB,KAAK,EAAE7D,WAAW,CAAC8D,IAAI,CAACC,KAAK;IAC7BC,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE,KAAK;IACjBC,aAAa,EAAE,GAAG;IAClBgB,SAAS,EAAE,QAAQ;IACnBC,WAAW,EAAE;EACf,CAAC;EACDxC,SAAS,EAAE;IACT4B,IAAI,EAAE,CAAC;IACPC,UAAU,EAAE,QAAQ;IACpBC,eAAe,EAAE,CAAC;IAClBC,YAAY,EAAE,CAAC;IACfrB,eAAe,EAAErD,WAAW,CAACsD,UAAU,CAACqB,IAAI;IAC5CC,WAAW,EAAEhF,UAAU,CAACiF,aAAa;IACrCC,WAAW,EAAE9E,WAAW,CAAC0D,MAAM,CAACC;EAClC,CAAC;EACDf,eAAe,EAAE;IACfS,eAAe,EAAErD,WAAW,CAACmE,QAAQ,CAACiB,cAAc;IACpDN,WAAW,EAAE9E,WAAW,CAACmE,QAAQ,CAACC;EACpC,CAAC;EACDrB,aAAa,EAAE;IACbc,KAAK,EAAE7D,WAAW,CAACmE,QAAQ,CAACC;EAC9B;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * ImagesModal — bottom-sheet wrapper rendered by FloatingDevTools when the
5
+ * Images tool is opened. List of captured images → tap for detail. Also
6
+ * surfaces the capture status so a mis-ordered install is self-diagnosing
7
+ * instead of silently empty.
8
+ */
9
+
10
+ import { useState } from "react";
11
+ import { FlatList, StyleSheet, Text, View } from "react-native";
12
+ import { JsModal, macOSColors } from "@buoy-gg/shared-ui";
13
+ import { getCaptureStatus, installImageCapture } from "../capture/install";
14
+ import { getGlobalModes } from "../capture/overrides";
15
+ import { formatRecordMarkdown, formatRegistryMarkdown } from "../export";
16
+ import { useImageRecords } from "../hooks/useImageRecords";
17
+ import { clearRecords, getRecord } from "../store/imageEventStore";
18
+ import { ImageDetail } from "./ImageDetail";
19
+ import { ImageDetailFooter } from "./ImageDetailFooter";
20
+ import { ImageRow } from "./ImageRow";
21
+ import { ImagesHeader } from "./ImagesHeader";
22
+ import { ImagesListFooter } from "./ImagesListFooter";
23
+ import { InsightsBar } from "./InsightsBar";
24
+ import { computeInsights } from "../store/insights";
25
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
26
+ function CaptureNotice() {
27
+ const status = getCaptureStatus();
28
+ const notices = [];
29
+ if (status.rnDecoratorTooLate) {
30
+ notices.push('RN <Image> instrumentation missed the module-load race — add `import "@buoy-gg/images/register"` as the FIRST import of your entry file.');
31
+ }
32
+ if (!status.expoAvailable && !status.rnDecoratorActive && !status.rnDecoratorTooLate) {
33
+ notices.push("Waiting for images… render some <Image> components to populate the list.");
34
+ }
35
+ if (notices.length === 0) return null;
36
+ return /*#__PURE__*/_jsx(View, {
37
+ style: styles.notice,
38
+ children: notices.map(n => /*#__PURE__*/_jsx(Text, {
39
+ style: styles.noticeText,
40
+ children: n
41
+ }, n))
42
+ });
43
+ }
44
+ function EmptyState() {
45
+ return /*#__PURE__*/_jsxs(View, {
46
+ style: styles.empty,
47
+ children: [/*#__PURE__*/_jsx(Text, {
48
+ style: styles.emptyTitle,
49
+ children: "No images captured yet"
50
+ }), /*#__PURE__*/_jsxs(Text, {
51
+ style: styles.emptyText,
52
+ children: ["Every RN ", "<Image>", " and expo-image load is recorded here with cache verdicts, timings, and oversize checks."]
53
+ })]
54
+ });
55
+ }
56
+ export function ImagesModal({
57
+ visible,
58
+ onClose,
59
+ onBack,
60
+ onMinimize,
61
+ persistenceKey
62
+ }) {
63
+ // Safety net: ensures capture is live even without the early register
64
+ // import (expo-image capture is timing-immune, so this still gets most data).
65
+ installImageCapture();
66
+ const {
67
+ records,
68
+ stats
69
+ } = useImageRecords();
70
+ const [selectedId, setSelectedId] = useState(null);
71
+ const selected = selectedId != null ? getRecord(selectedId) : undefined;
72
+
73
+ // Stepping is relative to the live list (newest first): previous = newer.
74
+ const selectedIndex = selected ? records.findIndex(r => r.id === selected.id) : -1;
75
+ const stepTo = index => {
76
+ const target = records[index];
77
+ if (target) setSelectedId(target.id);
78
+ };
79
+
80
+ // Mode-appropriate report: single record in detail, full registry (stats +
81
+ // insights + table) in the list. The shared ToolbarCopyButton resolves this
82
+ // lazily on press and handles clipboard + feedback + gating.
83
+ const getReport = () => selected ? formatRecordMarkdown(selected) : formatRegistryMarkdown(records, stats, computeInsights(records), getCaptureStatus(), getGlobalModes());
84
+ return /*#__PURE__*/_jsx(JsModal, {
85
+ visible: visible,
86
+ onClose: onClose,
87
+ onMinimize: onMinimize,
88
+ persistenceKey: persistenceKey,
89
+ header: {
90
+ showToggleButton: true,
91
+ customContent: /*#__PURE__*/_jsx(ImagesHeader, {
92
+ stats: stats,
93
+ detailOpen: selected != null,
94
+ detailIndex: selectedIndex,
95
+ detailTotal: records.length,
96
+ onCloseDetail: () => setSelectedId(null),
97
+ onClear: clearRecords,
98
+ getReport: getReport,
99
+ onBack: onBack
100
+ })
101
+ },
102
+ enablePersistence: true,
103
+ initialMode: "bottomSheet",
104
+ disableScrollWrapper: true,
105
+ children: selected ? /*#__PURE__*/_jsxs(View, {
106
+ style: styles.detailContainer,
107
+ children: [/*#__PURE__*/_jsx(ImageDetail, {
108
+ record: selected
109
+ }), /*#__PURE__*/_jsx(ImageDetailFooter, {
110
+ record: selected,
111
+ hasPrevious: selectedIndex > 0,
112
+ hasNext: selectedIndex >= 0 && selectedIndex < records.length - 1,
113
+ onPrevious: () => stepTo(selectedIndex - 1),
114
+ onNext: () => stepTo(selectedIndex + 1)
115
+ }, selected.id)]
116
+ }) : /*#__PURE__*/_jsxs(View, {
117
+ style: styles.listContainer,
118
+ children: [/*#__PURE__*/_jsx(InsightsBar, {
119
+ insights: computeInsights(records)
120
+ }), /*#__PURE__*/_jsx(CaptureNotice, {}), /*#__PURE__*/_jsx(FlatList, {
121
+ data: records,
122
+ keyExtractor: item => String(item.id),
123
+ renderItem: ({
124
+ item
125
+ }) => /*#__PURE__*/_jsx(ImageRow, {
126
+ record: item,
127
+ onPress: setSelectedId
128
+ }),
129
+ ListEmptyComponent: /*#__PURE__*/_jsx(EmptyState, {})
130
+ }), /*#__PURE__*/_jsx(ImagesListFooter, {})]
131
+ })
132
+ });
133
+ }
134
+ const styles = StyleSheet.create({
135
+ listContainer: {
136
+ flex: 1
137
+ },
138
+ detailContainer: {
139
+ flex: 1
140
+ },
141
+ notice: {
142
+ margin: 10,
143
+ padding: 10,
144
+ borderRadius: 8,
145
+ backgroundColor: macOSColors.semantic.warningBackground,
146
+ gap: 4
147
+ },
148
+ noticeText: {
149
+ color: macOSColors.semantic.warning,
150
+ fontSize: 11
151
+ },
152
+ empty: {
153
+ alignItems: "center",
154
+ padding: 32,
155
+ gap: 8
156
+ },
157
+ emptyTitle: {
158
+ color: macOSColors.text.primary,
159
+ fontSize: 13,
160
+ fontWeight: "600"
161
+ },
162
+ emptyText: {
163
+ color: macOSColors.text.secondary,
164
+ fontSize: 11,
165
+ textAlign: "center",
166
+ lineHeight: 16
167
+ }
168
+ });
169
+ //# sourceMappingURL=ImagesModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","FlatList","StyleSheet","Text","View","JsModal","macOSColors","getCaptureStatus","installImageCapture","getGlobalModes","formatRecordMarkdown","formatRegistryMarkdown","useImageRecords","clearRecords","getRecord","ImageDetail","ImageDetailFooter","ImageRow","ImagesHeader","ImagesListFooter","InsightsBar","computeInsights","jsx","_jsx","jsxs","_jsxs","CaptureNotice","status","notices","rnDecoratorTooLate","push","expoAvailable","rnDecoratorActive","length","style","styles","notice","children","map","n","noticeText","EmptyState","empty","emptyTitle","emptyText","ImagesModal","visible","onClose","onBack","onMinimize","persistenceKey","records","stats","selectedId","setSelectedId","selected","undefined","selectedIndex","findIndex","r","id","stepTo","index","target","getReport","header","showToggleButton","customContent","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","enablePersistence","initialMode","disableScrollWrapper","detailContainer","record","hasPrevious","hasNext","onPrevious","onNext","listContainer","insights","data","keyExtractor","item","String","renderItem","onPress","ListEmptyComponent","create","flex","margin","padding","borderRadius","backgroundColor","semantic","warningBackground","gap","color","warning","fontSize","alignItems","text","primary","fontWeight","secondary","textAlign","lineHeight"],"sourceRoot":"../../../src","sources":["components/ImagesModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Mount once near the app root to start image capture immediately.
5
+ *
6
+ * NOTE: for full RN-core <Image> coverage prefer the side-effect import
7
+ * `import "@buoy-gg/images/register"` as the first import of your entry file —
8
+ * the RN decorator must be installed before React Native's Image module first
9
+ * evaluates. ImagesRoot alone still captures every expo-image instance
10
+ * (timing-immune) and reports whether the RN hook landed.
11
+ */
12
+
13
+ import { installImageCapture } from "../capture/install";
14
+ export function ImagesRoot() {
15
+ // Synchronous on first render — earlier than an effect, though still later
16
+ // than the register import. Idempotent.
17
+ installImageCapture();
18
+ return null;
19
+ }
20
+ //# sourceMappingURL=ImagesRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["installImageCapture","ImagesRoot"],"sourceRoot":"../../../src","sources":["components/ImagesRoot.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,mBAAmB,QAAQ,oBAAoB;AAExD,OAAO,SAASC,UAAUA,CAAA,EAAS;EACjC;EACA;EACAD,mBAAmB,CAAC,CAAC;EACrB,OAAO,IAAI;AACb","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * InsightsBar — compact warning chips above the list when cross-record
5
+ * findings exist (duplicates, retry storms, queue saturation, missing alt,
6
+ * layout shifts). Renders nothing when all clear.
7
+ *
8
+ * A wrapping row (not a horizontal ScrollView — that under-measures its
9
+ * height inside the modal's flex column and clips the chips).
10
+ */
11
+
12
+ import { StyleSheet, Text, View } from "react-native";
13
+ import { macOSColors } from "@buoy-gg/shared-ui";
14
+ import { insightChips } from "../store/insights";
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ export function InsightsBar({
17
+ insights
18
+ }) {
19
+ const chips = insightChips(insights);
20
+ if (chips.length === 0) return null;
21
+ return /*#__PURE__*/_jsx(View, {
22
+ style: styles.bar,
23
+ children: chips.map(chip => /*#__PURE__*/_jsx(View, {
24
+ style: styles.chip,
25
+ children: /*#__PURE__*/_jsx(Text, {
26
+ style: styles.chipText,
27
+ children: chip
28
+ })
29
+ }, chip))
30
+ });
31
+ }
32
+ const styles = StyleSheet.create({
33
+ bar: {
34
+ flexDirection: "row",
35
+ flexWrap: "wrap",
36
+ gap: 6,
37
+ paddingHorizontal: 10,
38
+ paddingVertical: 8,
39
+ borderBottomWidth: StyleSheet.hairlineWidth,
40
+ borderBottomColor: macOSColors.border.default
41
+ },
42
+ chip: {
43
+ backgroundColor: macOSColors.semantic.warningBackground,
44
+ borderRadius: 999,
45
+ paddingHorizontal: 10,
46
+ paddingVertical: 5
47
+ },
48
+ chipText: {
49
+ color: macOSColors.semantic.warning,
50
+ fontSize: 10,
51
+ fontWeight: "600",
52
+ lineHeight: 13
53
+ }
54
+ });
55
+ //# sourceMappingURL=InsightsBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","View","macOSColors","insightChips","jsx","_jsx","InsightsBar","insights","chips","length","style","styles","bar","children","map","chip","chipText","create","flexDirection","flexWrap","gap","paddingHorizontal","paddingVertical","borderBottomWidth","hairlineWidth","borderBottomColor","border","default","backgroundColor","semantic","warningBackground","borderRadius","color","warning","fontSize","fontWeight","lineHeight"],"sourceRoot":"../../../src","sources":["components/InsightsBar.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACrD,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,YAAY,QAAQ,mBAAmB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGjD,OAAO,SAASC,WAAWA,CAAC;EAAEC;AAAsC,CAAC,EAAE;EACrE,MAAMC,KAAK,GAAGL,YAAY,CAACI,QAAQ,CAAC;EACpC,IAAIC,KAAK,CAACC,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EACnC,oBACEJ,IAAA,CAACJ,IAAI;IAACS,KAAK,EAAEC,MAAM,CAACC,GAAI;IAAAC,QAAA,EACrBL,KAAK,CAACM,GAAG,CAAEC,IAAI,iBACdV,IAAA,CAACJ,IAAI;MAAYS,KAAK,EAAEC,MAAM,CAACI,IAAK;MAAAF,QAAA,eAClCR,IAAA,CAACL,IAAI;QAACU,KAAK,EAAEC,MAAM,CAACK,QAAS;QAAAH,QAAA,EAAEE;MAAI,CAAO;IAAC,GADlCA,IAEL,CACP;EAAC,CACE,CAAC;AAEX;AAEA,MAAMJ,MAAM,GAAGZ,UAAU,CAACkB,MAAM,CAAC;EAC/BL,GAAG,EAAE;IACHM,aAAa,EAAE,KAAK;IACpBC,QAAQ,EAAE,MAAM;IAChBC,GAAG,EAAE,CAAC;IACNC,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAExB,UAAU,CAACyB,aAAa;IAC3CC,iBAAiB,EAAEvB,WAAW,CAACwB,MAAM,CAACC;EACxC,CAAC;EACDZ,IAAI,EAAE;IACJa,eAAe,EAAE1B,WAAW,CAAC2B,QAAQ,CAACC,iBAAiB;IACvDC,YAAY,EAAE,GAAG;IACjBV,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE;EACnB,CAAC;EACDN,QAAQ,EAAE;IACRgB,KAAK,EAAE9B,WAAW,CAAC2B,QAAQ,CAACI,OAAO;IACnCC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Copy-friendly markdown reports — paste-ready context for an issue, PR, or
5
+ * an AI chat. One for the whole registry (list header copy) and one for a
6
+ * single record (detail header copy).
7
+ */
8
+
9
+ import { PixelRatio } from "react-native";
10
+ import { estDecodedBytes, estWastedBytes, neededPixels } from "./store/imageEventStore";
11
+ import { insightChips } from "./store/insights";
12
+ import { cacheBadge, formatBytes, formatMs, sizeVerdict, uriTail } from "./format";
13
+ export function formatRecordMarkdown(record) {
14
+ const verdict = sizeVerdict(record);
15
+ const cache = cacheBadge(record);
16
+ const needed = neededPixels(record);
17
+ const decoded = estDecodedBytes(record);
18
+ const wasted = estWastedBytes(record);
19
+ const lines = [];
20
+ lines.push(`## Image report — ${uriTail(record.uri)}`);
21
+ lines.push("");
22
+ lines.push(`- URI: ${record.uri || "(none)"}`);
23
+ lines.push(`- Library: ${record.lib === "expo" ? "expo-image" : "RN <Image>"} · kind: ${record.sourceKind} · mounted: ${record.mounted ? "yes" : "no"}`);
24
+ lines.push(`- Status: ${record.status}${record.errorCode ? ` (HTTP ${record.errorCode})` : ""} · load cycles: ${record.loadCount}`);
25
+ lines.push(`- Cache: ${cache.label}${record.cacheVerdictSource ? ` (via ${record.cacheVerdictSource === "event" ? "expo onLoad" : "Image.queryCache"})` : ""}`);
26
+ lines.push(`- Load time: ${formatMs(record.durationMs)}${record.displayedAt && record.loadedAt ? ` · decode→display ${formatMs(Math.max(0, record.displayedAt - record.loadedAt))}` : ""}`);
27
+ if (record.intrinsic) {
28
+ lines.push(`- Decoded: ${record.intrinsic.width}×${record.intrinsic.height}px${record.mediaType ? ` (${record.mediaType})` : ""}${record.isAnimated ? " animated" : ""} ≈ ${formatBytes(decoded)} decoded memory`);
29
+ }
30
+ if (record.layout) {
31
+ lines.push(`- Displayed: ${Math.round(record.layout.width)}×${Math.round(record.layout.height)}dp @${PixelRatio.get()}x (needs ${needed ? `${needed.width}×${needed.height}px` : "?"})`);
32
+ }
33
+ if (verdict.label) {
34
+ lines.push(`- Size verdict: ${verdict.label}${wasted > 0 && needed ? ` — wasting ≈${formatBytes(wasted)}; serve ${needed.width}×${needed.height}` : ""}`);
35
+ }
36
+ if (record.progressSeen) {
37
+ lines.push(`- Network transfer: ${record.bytesTotal ? formatBytes(record.bytesTotal) : "observed"}`);
38
+ }
39
+ if (record.hasAltText === false) lines.push(`- Accessibility: MISSING alt/accessibilityLabel`);
40
+ if ((record.layoutShifts ?? 0) > 0) lines.push(`- Layout shifts after load: ${record.layoutShifts} (reserve explicit dimensions)`);
41
+ if (record.error) {
42
+ lines.push(`- Error: ${record.error}`);
43
+ if (record.errorHeaders) {
44
+ lines.push(`- Response headers: ${JSON.stringify(record.errorHeaders)}`);
45
+ }
46
+ }
47
+ if (record.overrideLabel) lines.push(`- Simulation active: ${record.overrideLabel}`);
48
+ return lines.join("\n");
49
+ }
50
+ export function formatRegistryMarkdown(records, stats, insights, captureStatus, modes) {
51
+ const lines = [];
52
+ lines.push(`## Buoy Images registry (${stats.total} records)`);
53
+ lines.push("");
54
+ lines.push(`${stats.loaded} loaded · ${stats.errors} failed · ${stats.loading} in flight · ≈${formatBytes(stats.estDecodedBytes)} decoded` + (stats.estWastedBytes > 0 ? ` · ${formatBytes(stats.estWastedBytes)} wasted on oversized sources` : ""));
55
+ const chips = insightChips(insights);
56
+ if (chips.length > 0) lines.push(`Insights: ${chips.join(" · ")}`);
57
+ if (modes.network !== "normal" || modes.blank) {
58
+ lines.push(`Simulation active: network=${modes.network}${modes.blank ? ", blank images" : ""}`);
59
+ }
60
+ if (captureStatus.rnDecoratorTooLate) {
61
+ lines.push(`⚠ RN <Image> capture inactive (register import too late)`);
62
+ }
63
+ lines.push("");
64
+ lines.push("| image | lib | status | cache | ms | decoded px | shown dp | verdict | notes |");
65
+ lines.push("|---|---|---|---|---|---|---|---|---|");
66
+ for (const r of records) {
67
+ const verdict = sizeVerdict(r);
68
+ const cache = cacheBadge(r);
69
+ const dims = r.intrinsic ? `${r.intrinsic.width}×${r.intrinsic.height}` : "–";
70
+ const layout = r.layout ? `${Math.round(r.layout.width)}×${Math.round(r.layout.height)}` : "–";
71
+ 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("; ");
72
+ lines.push(`| ${uriTail(r.uri)} | ${r.lib} | ${r.status} | ${cache.label} | ${r.durationMs != null ? Math.round(r.durationMs) : "–"} | ${dims} | ${layout} | ${verdict.label || "–"} | ${notes || "–"} |`);
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PixelRatio","estDecodedBytes","estWastedBytes","neededPixels","insightChips","cacheBadge","formatBytes","formatMs","sizeVerdict","uriTail","formatRecordMarkdown","record","verdict","cache","needed","decoded","wasted","lines","push","uri","lib","sourceKind","mounted","status","errorCode","loadCount","label","cacheVerdictSource","durationMs","displayedAt","loadedAt","Math","max","intrinsic","width","height","mediaType","isAnimated","layout","round","get","progressSeen","bytesTotal","hasAltText","layoutShifts","error","errorHeaders","JSON","stringify","overrideLabel","join","formatRegistryMarkdown","records","stats","insights","captureStatus","modes","total","loaded","errors","loading","chips","length","network","blank","rnDecoratorTooLate","r","dims","notes","filter","Boolean"],"sourceRoot":"../../src","sources":["export.ts"],"mappings":"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","ignoreList":[]}