@buoy-gg/assets 7.0.16

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 (179) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +55 -0
  3. package/lib/commonjs/capture/expo.js +46 -0
  4. package/lib/commonjs/capture/expo.js.map +1 -0
  5. package/lib/commonjs/capture/install.js +78 -0
  6. package/lib/commonjs/capture/install.js.map +1 -0
  7. package/lib/commonjs/capture/measure.js +186 -0
  8. package/lib/commonjs/capture/measure.js.map +1 -0
  9. package/lib/commonjs/capture/metroGraph.js +148 -0
  10. package/lib/commonjs/capture/metroGraph.js.map +1 -0
  11. package/lib/commonjs/capture/registry.js +124 -0
  12. package/lib/commonjs/capture/registry.js.map +1 -0
  13. package/lib/commonjs/components/AssetDetail.js +205 -0
  14. package/lib/commonjs/components/AssetDetail.js.map +1 -0
  15. package/lib/commonjs/components/AssetRow.js +246 -0
  16. package/lib/commonjs/components/AssetRow.js.map +1 -0
  17. package/lib/commonjs/components/AssetsFilterBar.js +92 -0
  18. package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
  19. package/lib/commonjs/components/AssetsHeader.js +66 -0
  20. package/lib/commonjs/components/AssetsHeader.js.map +1 -0
  21. package/lib/commonjs/components/AssetsIcon.js +19 -0
  22. package/lib/commonjs/components/AssetsIcon.js.map +1 -0
  23. package/lib/commonjs/components/AssetsListControls.js +94 -0
  24. package/lib/commonjs/components/AssetsListControls.js.map +1 -0
  25. package/lib/commonjs/components/AssetsModal.js +338 -0
  26. package/lib/commonjs/components/AssetsModal.js.map +1 -0
  27. package/lib/commonjs/components/BaselineBar.js +110 -0
  28. package/lib/commonjs/components/BaselineBar.js.map +1 -0
  29. package/lib/commonjs/export.js +62 -0
  30. package/lib/commonjs/export.js.map +1 -0
  31. package/lib/commonjs/format.js +59 -0
  32. package/lib/commonjs/format.js.map +1 -0
  33. package/lib/commonjs/hooks/useAssetRecords.js +22 -0
  34. package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
  35. package/lib/commonjs/index.js +260 -0
  36. package/lib/commonjs/index.js.map +1 -0
  37. package/lib/commonjs/package.json +1 -0
  38. package/lib/commonjs/preset.js +45 -0
  39. package/lib/commonjs/preset.js.map +1 -0
  40. package/lib/commonjs/remote.js +65 -0
  41. package/lib/commonjs/remote.js.map +1 -0
  42. package/lib/commonjs/state.js +51 -0
  43. package/lib/commonjs/state.js.map +1 -0
  44. package/lib/commonjs/store/assetStore.js +234 -0
  45. package/lib/commonjs/store/assetStore.js.map +1 -0
  46. package/lib/commonjs/store/baseline.js +165 -0
  47. package/lib/commonjs/store/baseline.js.map +1 -0
  48. package/lib/commonjs/store/insights.js +129 -0
  49. package/lib/commonjs/store/insights.js.map +1 -0
  50. package/lib/commonjs/sync/assetsSyncAdapter.js +157 -0
  51. package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
  52. package/lib/commonjs/types.js +2 -0
  53. package/lib/commonjs/types.js.map +1 -0
  54. package/lib/module/capture/expo.js +41 -0
  55. package/lib/module/capture/expo.js.map +1 -0
  56. package/lib/module/capture/install.js +72 -0
  57. package/lib/module/capture/install.js.map +1 -0
  58. package/lib/module/capture/measure.js +179 -0
  59. package/lib/module/capture/measure.js.map +1 -0
  60. package/lib/module/capture/metroGraph.js +141 -0
  61. package/lib/module/capture/metroGraph.js.map +1 -0
  62. package/lib/module/capture/registry.js +117 -0
  63. package/lib/module/capture/registry.js.map +1 -0
  64. package/lib/module/components/AssetDetail.js +201 -0
  65. package/lib/module/components/AssetDetail.js.map +1 -0
  66. package/lib/module/components/AssetRow.js +242 -0
  67. package/lib/module/components/AssetRow.js.map +1 -0
  68. package/lib/module/components/AssetsFilterBar.js +88 -0
  69. package/lib/module/components/AssetsFilterBar.js.map +1 -0
  70. package/lib/module/components/AssetsHeader.js +62 -0
  71. package/lib/module/components/AssetsHeader.js.map +1 -0
  72. package/lib/module/components/AssetsIcon.js +12 -0
  73. package/lib/module/components/AssetsIcon.js.map +1 -0
  74. package/lib/module/components/AssetsListControls.js +90 -0
  75. package/lib/module/components/AssetsListControls.js.map +1 -0
  76. package/lib/module/components/AssetsModal.js +333 -0
  77. package/lib/module/components/AssetsModal.js.map +1 -0
  78. package/lib/module/components/BaselineBar.js +106 -0
  79. package/lib/module/components/BaselineBar.js.map +1 -0
  80. package/lib/module/export.js +57 -0
  81. package/lib/module/export.js.map +1 -0
  82. package/lib/module/format.js +51 -0
  83. package/lib/module/format.js.map +1 -0
  84. package/lib/module/hooks/useAssetRecords.js +18 -0
  85. package/lib/module/hooks/useAssetRecords.js.map +1 -0
  86. package/lib/module/index.js +59 -0
  87. package/lib/module/index.js.map +1 -0
  88. package/lib/module/preset.js +40 -0
  89. package/lib/module/preset.js.map +1 -0
  90. package/lib/module/remote.js +58 -0
  91. package/lib/module/remote.js.map +1 -0
  92. package/lib/module/state.js +47 -0
  93. package/lib/module/state.js.map +1 -0
  94. package/lib/module/store/assetStore.js +219 -0
  95. package/lib/module/store/assetStore.js.map +1 -0
  96. package/lib/module/store/baseline.js +157 -0
  97. package/lib/module/store/baseline.js.map +1 -0
  98. package/lib/module/store/insights.js +125 -0
  99. package/lib/module/store/insights.js.map +1 -0
  100. package/lib/module/sync/assetsSyncAdapter.js +153 -0
  101. package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
  102. package/lib/module/types.js +2 -0
  103. package/lib/module/types.js.map +1 -0
  104. package/lib/typescript/capture/expo.d.ts +18 -0
  105. package/lib/typescript/capture/expo.d.ts.map +1 -0
  106. package/lib/typescript/capture/install.d.ts +17 -0
  107. package/lib/typescript/capture/install.d.ts.map +1 -0
  108. package/lib/typescript/capture/measure.d.ts +38 -0
  109. package/lib/typescript/capture/measure.d.ts.map +1 -0
  110. package/lib/typescript/capture/metroGraph.d.ts +33 -0
  111. package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
  112. package/lib/typescript/capture/registry.d.ts +45 -0
  113. package/lib/typescript/capture/registry.d.ts.map +1 -0
  114. package/lib/typescript/components/AssetDetail.d.ts +17 -0
  115. package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
  116. package/lib/typescript/components/AssetRow.d.ts +32 -0
  117. package/lib/typescript/components/AssetRow.d.ts.map +1 -0
  118. package/lib/typescript/components/AssetsFilterBar.d.ts +16 -0
  119. package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
  120. package/lib/typescript/components/AssetsHeader.d.ts +22 -0
  121. package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
  122. package/lib/typescript/components/AssetsIcon.d.ts +9 -0
  123. package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
  124. package/lib/typescript/components/AssetsListControls.d.ts +18 -0
  125. package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
  126. package/lib/typescript/components/AssetsModal.d.ts +24 -0
  127. package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
  128. package/lib/typescript/components/BaselineBar.d.ts +13 -0
  129. package/lib/typescript/components/BaselineBar.d.ts.map +1 -0
  130. package/lib/typescript/export.d.ts +8 -0
  131. package/lib/typescript/export.d.ts.map +1 -0
  132. package/lib/typescript/format.d.ts +13 -0
  133. package/lib/typescript/format.d.ts.map +1 -0
  134. package/lib/typescript/hooks/useAssetRecords.d.ts +11 -0
  135. package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
  136. package/lib/typescript/index.d.ts +26 -0
  137. package/lib/typescript/index.d.ts.map +1 -0
  138. package/lib/typescript/preset.d.ts +38 -0
  139. package/lib/typescript/preset.d.ts.map +1 -0
  140. package/lib/typescript/remote.d.ts +17 -0
  141. package/lib/typescript/remote.d.ts.map +1 -0
  142. package/lib/typescript/state.d.ts +41 -0
  143. package/lib/typescript/state.d.ts.map +1 -0
  144. package/lib/typescript/store/assetStore.d.ts +51 -0
  145. package/lib/typescript/store/assetStore.d.ts.map +1 -0
  146. package/lib/typescript/store/baseline.d.ts +22 -0
  147. package/lib/typescript/store/baseline.d.ts.map +1 -0
  148. package/lib/typescript/store/insights.d.ts +7 -0
  149. package/lib/typescript/store/insights.d.ts.map +1 -0
  150. package/lib/typescript/sync/assetsSyncAdapter.d.ts +83 -0
  151. package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
  152. package/lib/typescript/types.d.ts +162 -0
  153. package/lib/typescript/types.d.ts.map +1 -0
  154. package/package.json +77 -0
  155. package/src/capture/expo.ts +45 -0
  156. package/src/capture/install.ts +73 -0
  157. package/src/capture/measure.ts +167 -0
  158. package/src/capture/metroGraph.ts +146 -0
  159. package/src/capture/registry.ts +134 -0
  160. package/src/components/AssetDetail.tsx +207 -0
  161. package/src/components/AssetRow.tsx +243 -0
  162. package/src/components/AssetsFilterBar.tsx +99 -0
  163. package/src/components/AssetsHeader.tsx +75 -0
  164. package/src/components/AssetsIcon.tsx +9 -0
  165. package/src/components/AssetsListControls.tsx +101 -0
  166. package/src/components/AssetsModal.tsx +368 -0
  167. package/src/components/BaselineBar.tsx +98 -0
  168. package/src/export.ts +108 -0
  169. package/src/format.ts +53 -0
  170. package/src/hooks/useAssetRecords.ts +26 -0
  171. package/src/index.tsx +87 -0
  172. package/src/preset.tsx +35 -0
  173. package/src/remote.ts +65 -0
  174. package/src/state.ts +84 -0
  175. package/src/store/assetStore.ts +209 -0
  176. package/src/store/baseline.ts +152 -0
  177. package/src/store/insights.ts +145 -0
  178. package/src/sync/assetsSyncAdapter.ts +151 -0
  179. package/src/types.ts +160 -0
@@ -0,0 +1,333 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * AssetsModal — bottom-sheet wrapper rendered by FloatingDevTools when the
5
+ * Assets tool is opened. Inventory list (largest first) → tap for detail.
6
+ * Opening triggers a full rescan (registry walk + Metro graph + size
7
+ * measurement); merely installing the package never hits the network.
8
+ */
9
+
10
+ import { useEffect, useState } from "react";
11
+ import { FlatList, StyleSheet, Text, View } from "react-native";
12
+ import { EventStepperFooter, JsModal, macOSColors } from "@buoy-gg/shared-ui";
13
+ import { getScanStatus, installAssetCapture, rescan } from "../capture/install";
14
+ import { formatAssetMarkdown, formatInventoryMarkdown } from "../export";
15
+ import { useAssetRecords } from "../hooks/useAssetRecords";
16
+ import { remoteAssetsDispatch } from "../remote";
17
+ import { clearRecords, estDecodedBytes, getRecord } from "../store/assetStore";
18
+ import { getDiff, loadBaseline } from "../store/baseline";
19
+ import { AssetDetail } from "./AssetDetail";
20
+ import { AssetRow } from "./AssetRow";
21
+ import { AssetsFilterBar } from "./AssetsFilterBar";
22
+ import { AssetsHeader } from "./AssetsHeader";
23
+ import { AssetsListControls } from "./AssetsListControls";
24
+ import { BaselineBar } from "./BaselineBar";
25
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
26
+ function ScanNotice() {
27
+ const status = getScanStatus();
28
+ const notices = [];
29
+ if (!status.registryAvailable) {
30
+ notices.push("Asset registry unavailable — this environment doesn't expose @react-native/assets-registry.");
31
+ } else if (!status.graphSupported && status.graphError) {
32
+ notices.push("No Metro dev server — showing runtime-registered assets only. The full bundle inventory and byte sizes need a dev build.");
33
+ }
34
+ if (status.measuring) notices.push("Measuring sizes from the dev server…");
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 FontFamilies() {
45
+ const families = getScanStatus().fontFamilies;
46
+ if (!families.length) return null;
47
+ return /*#__PURE__*/_jsxs(View, {
48
+ style: styles.fontsBox,
49
+ children: [/*#__PURE__*/_jsxs(Text, {
50
+ style: styles.fontsTitle,
51
+ children: ["LOADED FONT FAMILIES (", families.length, ")"]
52
+ }), /*#__PURE__*/_jsx(View, {
53
+ style: styles.fontsWrap,
54
+ children: families.map(family => /*#__PURE__*/_jsx(Text, {
55
+ style: styles.fontChip,
56
+ children: family
57
+ }, family))
58
+ })]
59
+ });
60
+ }
61
+ function EmptyState() {
62
+ return /*#__PURE__*/_jsxs(View, {
63
+ style: styles.empty,
64
+ children: [/*#__PURE__*/_jsx(Text, {
65
+ style: styles.emptyTitle,
66
+ children: "No assets found yet"
67
+ }), /*#__PURE__*/_jsx(Text, {
68
+ style: styles.emptyText,
69
+ children: "Every bundled asset \u2014 images, fonts, video, audio \u2014 appears here with sizes, scale coverage, and never-loaded detection. Try Rescan after navigating around the app."
70
+ })]
71
+ });
72
+ }
73
+
74
+ /** Largest first — measured bytes, falling back to decoded estimate. */
75
+ function bySizeDesc(a, b) {
76
+ return (b.sizeBytes ?? estDecodedBytes(b)) - (a.sizeBytes ?? estDecodedBytes(a));
77
+ }
78
+ const COMPARATORS = {
79
+ size: bySizeDesc,
80
+ name: (a, b) => a.name.localeCompare(b.name) || a.type.localeCompare(b.type),
81
+ type: (a, b) => a.type.localeCompare(b.type) || bySizeDesc(a, b)
82
+ };
83
+ export function AssetsModal({
84
+ visible,
85
+ onClose,
86
+ onBack,
87
+ onMinimize,
88
+ persistenceKey,
89
+ inline = false
90
+ }) {
91
+ // Safety net: the index import normally installed this already.
92
+ installAssetCapture();
93
+ const {
94
+ records,
95
+ stats,
96
+ insights
97
+ } = useAssetRecords();
98
+ const [selectedId, setSelectedId] = useState(null);
99
+ const [filter, setFilter] = useState("all");
100
+ const [query, setQuery] = useState("");
101
+ const [sort, setSort] = useState("size");
102
+ const selected = selectedId != null ? getRecord(selectedId) : undefined;
103
+
104
+ // Full scan on open — locally on device, forwarded on dashboard mirrors.
105
+ // The baseline load is async and re-renders through the store emit.
106
+ useEffect(() => {
107
+ if (!visible) return;
108
+ void loadBaseline();
109
+ const remote = remoteAssetsDispatch();
110
+ if (remote) {
111
+ remote("rescan").catch(() => {});
112
+ } else {
113
+ void rescan();
114
+ }
115
+ }, [visible]);
116
+ const sorted = [...records].sort(COMPARATORS[sort]);
117
+ const trimmedQuery = query.trim().toLowerCase();
118
+ const filtered = sorted.filter(r => {
119
+ if (filter === "unused" && r.loaded) return false;
120
+ if (filter !== "all" && filter !== "unused" && r.kind !== filter) return false;
121
+ if (trimmedQuery && !`${r.name}.${r.type}`.toLowerCase().includes(trimmedQuery)) {
122
+ return false;
123
+ }
124
+ return true;
125
+ });
126
+ const selectedIndex = selected ? filtered.findIndex(r => r.id === selected.id) : -1;
127
+ const stepTo = index => {
128
+ const target = filtered[index];
129
+ if (target) setSelectedId(target.id);
130
+ };
131
+
132
+ // Set lookups so each row's badge checks are O(1).
133
+ const flagSets = {
134
+ scaleGaps: new Set(insights.scaleGaps),
135
+ scaleAnomalies: new Set(insights.scaleAnomalies),
136
+ duplicates: new Set(insights.duplicates.flatMap(d => d.ids)),
137
+ webpCandidates: new Set(insights.webpCandidates),
138
+ overDecode: new Set(insights.overDecode),
139
+ heavy: new Set([...insights.heavyGifs, ...insights.heavyFonts])
140
+ };
141
+ const diff = getDiff();
142
+
143
+ // The proportional size bar is relative to the largest asset in view.
144
+ let maxBytes = 0;
145
+ for (const r of filtered) {
146
+ const bytes = r.sizeBytes ?? estDecodedBytes(r);
147
+ if (bytes > maxBytes) maxBytes = bytes;
148
+ }
149
+ const getReport = () => selected ? formatAssetMarkdown(selected) : formatInventoryMarkdown(sorted, stats, insights, getScanStatus(), getDiff());
150
+ const headerContent = /*#__PURE__*/_jsx(AssetsHeader, {
151
+ stats: stats,
152
+ measuring: getScanStatus().measuring,
153
+ detailOpen: selected != null,
154
+ detailIndex: selectedIndex,
155
+ detailTotal: filtered.length,
156
+ onCloseDetail: () => setSelectedId(null),
157
+ onClear: clearRecords,
158
+ getReport: getReport,
159
+ onBack: onBack
160
+ });
161
+ const body = selected ? /*#__PURE__*/_jsxs(View, {
162
+ style: styles.detailContainer,
163
+ children: [/*#__PURE__*/_jsx(AssetDetail, {
164
+ record: selected,
165
+ insights: insights
166
+ }), selectedIndex >= 0 ? /*#__PURE__*/_jsx(EventStepperFooter, {
167
+ currentIndex: selectedIndex,
168
+ totalItems: filtered.length,
169
+ itemLabel: "Asset",
170
+ onPrevious: () => stepTo(selectedIndex - 1),
171
+ onNext: () => stepTo(selectedIndex + 1)
172
+ }) : null]
173
+ }) : /*#__PURE__*/_jsxs(View, {
174
+ style: styles.listContainer,
175
+ children: [/*#__PURE__*/_jsx(AssetsFilterBar, {
176
+ stats: stats,
177
+ filter: filter,
178
+ onChange: setFilter
179
+ }), /*#__PURE__*/_jsx(AssetsListControls, {
180
+ query: query,
181
+ onQueryChange: setQuery,
182
+ sort: sort,
183
+ onSortChange: setSort,
184
+ showBaselineButton: diff == null
185
+ }), /*#__PURE__*/_jsx(BaselineBar, {
186
+ diff: diff
187
+ }), /*#__PURE__*/_jsx(ScanNotice, {}), filter === "font" ? /*#__PURE__*/_jsx(FontFamilies, {}) : null, /*#__PURE__*/_jsx(FlatList, {
188
+ data: filtered,
189
+ keyExtractor: item => String(item.id),
190
+ contentContainerStyle: styles.listContent,
191
+ renderItem: ({
192
+ item
193
+ }) => /*#__PURE__*/_jsx(AssetRow, {
194
+ record: item,
195
+ flags: {
196
+ scaleGap: flagSets.scaleGaps.has(item.id),
197
+ scaleAnomaly: flagSets.scaleAnomalies.has(item.id),
198
+ duplicate: flagSets.duplicates.has(item.id),
199
+ webp: flagSets.webpCandidates.has(item.id),
200
+ oversize: flagSets.overDecode.has(item.id),
201
+ heavy: flagSets.heavy.has(item.id)
202
+ },
203
+ sizeFraction: maxBytes > 0 ? (item.sizeBytes ?? estDecodedBytes(item)) / maxBytes : 0
204
+ // Guarded: programmatic invocations (automation) can call this
205
+ // with an event object instead of an id.
206
+ ,
207
+ onPress: id => setSelectedId(typeof id === "number" ? id : null)
208
+ }),
209
+ ListEmptyComponent: /*#__PURE__*/_jsx(EmptyState, {})
210
+ })]
211
+ });
212
+
213
+ // The ONLY difference between phone and desktop is which shell the header
214
+ // and body go in (same pattern as ImagesModal).
215
+ if (inline) {
216
+ return /*#__PURE__*/_jsxs(View, {
217
+ style: styles.inlineRoot,
218
+ children: [/*#__PURE__*/_jsx(View, {
219
+ style: styles.inlineHeader,
220
+ children: headerContent
221
+ }), body]
222
+ });
223
+ }
224
+ return /*#__PURE__*/_jsx(JsModal, {
225
+ visible: visible,
226
+ onClose: onClose,
227
+ onMinimize: onMinimize,
228
+ persistenceKey: persistenceKey,
229
+ header: {
230
+ showToggleButton: true,
231
+ customContent: headerContent
232
+ },
233
+ enablePersistence: true,
234
+ initialMode: "bottomSheet",
235
+ disableScrollWrapper: true,
236
+ children: body
237
+ });
238
+ }
239
+
240
+ /**
241
+ * The same Assets tool rendered INLINE for hosts that place tools in a panel
242
+ * rather than a modal (the desktop dashboard). One implementation only.
243
+ */
244
+ export function AssetsToolView(props = {}) {
245
+ return /*#__PURE__*/_jsx(AssetsModal, {
246
+ ...props,
247
+ inline: true,
248
+ visible: true,
249
+ onClose: () => {}
250
+ });
251
+ }
252
+ const styles = StyleSheet.create({
253
+ inlineRoot: {
254
+ flex: 1,
255
+ minHeight: 0,
256
+ backgroundColor: macOSColors.background.base
257
+ },
258
+ inlineHeader: {
259
+ paddingHorizontal: 12,
260
+ paddingVertical: 8,
261
+ borderBottomWidth: 1,
262
+ borderBottomColor: macOSColors.border.default,
263
+ backgroundColor: macOSColors.background.card
264
+ },
265
+ listContainer: {
266
+ flex: 1
267
+ },
268
+ listContent: {
269
+ paddingBottom: 16
270
+ },
271
+ detailContainer: {
272
+ flex: 1
273
+ },
274
+ notice: {
275
+ marginHorizontal: 10,
276
+ marginBottom: 8,
277
+ padding: 10,
278
+ borderRadius: 8,
279
+ borderWidth: 1,
280
+ borderColor: macOSColors.border.default,
281
+ backgroundColor: macOSColors.background.card,
282
+ gap: 4
283
+ },
284
+ noticeText: {
285
+ color: macOSColors.text.secondary,
286
+ fontSize: 11
287
+ },
288
+ fontsBox: {
289
+ marginHorizontal: 10,
290
+ marginTop: 8,
291
+ padding: 10,
292
+ borderRadius: 8,
293
+ backgroundColor: macOSColors.background.card,
294
+ gap: 6
295
+ },
296
+ fontsTitle: {
297
+ color: macOSColors.text.muted,
298
+ fontSize: 9,
299
+ fontWeight: "700",
300
+ letterSpacing: 0.5
301
+ },
302
+ fontsWrap: {
303
+ flexDirection: "row",
304
+ flexWrap: "wrap",
305
+ gap: 6
306
+ },
307
+ fontChip: {
308
+ color: macOSColors.text.secondary,
309
+ fontSize: 10,
310
+ backgroundColor: macOSColors.background.input,
311
+ borderRadius: 999,
312
+ paddingHorizontal: 8,
313
+ paddingVertical: 3,
314
+ overflow: "hidden"
315
+ },
316
+ empty: {
317
+ alignItems: "center",
318
+ padding: 32,
319
+ gap: 8
320
+ },
321
+ emptyTitle: {
322
+ color: macOSColors.text.primary,
323
+ fontSize: 13,
324
+ fontWeight: "600"
325
+ },
326
+ emptyText: {
327
+ color: macOSColors.text.secondary,
328
+ fontSize: 11,
329
+ textAlign: "center",
330
+ lineHeight: 16
331
+ }
332
+ });
333
+ //# sourceMappingURL=AssetsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useState","FlatList","StyleSheet","Text","View","EventStepperFooter","JsModal","macOSColors","getScanStatus","installAssetCapture","rescan","formatAssetMarkdown","formatInventoryMarkdown","useAssetRecords","remoteAssetsDispatch","clearRecords","estDecodedBytes","getRecord","getDiff","loadBaseline","AssetDetail","AssetRow","AssetsFilterBar","AssetsHeader","AssetsListControls","BaselineBar","jsx","_jsx","jsxs","_jsxs","ScanNotice","status","notices","registryAvailable","push","graphSupported","graphError","measuring","length","style","styles","notice","children","map","n","noticeText","FontFamilies","families","fontFamilies","fontsBox","fontsTitle","fontsWrap","family","fontChip","EmptyState","empty","emptyTitle","emptyText","bySizeDesc","a","b","sizeBytes","COMPARATORS","size","name","localeCompare","type","AssetsModal","visible","onClose","onBack","onMinimize","persistenceKey","inline","records","stats","insights","selectedId","setSelectedId","filter","setFilter","query","setQuery","sort","setSort","selected","undefined","remote","catch","sorted","trimmedQuery","trim","toLowerCase","filtered","r","loaded","kind","includes","selectedIndex","findIndex","id","stepTo","index","target","flagSets","scaleGaps","Set","scaleAnomalies","duplicates","flatMap","d","ids","webpCandidates","overDecode","heavy","heavyGifs","heavyFonts","diff","maxBytes","bytes","getReport","headerContent","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","body","detailContainer","record","currentIndex","totalItems","itemLabel","onPrevious","onNext","listContainer","onChange","onQueryChange","onSortChange","showBaselineButton","data","keyExtractor","item","String","contentContainerStyle","listContent","renderItem","flags","scaleGap","has","scaleAnomaly","duplicate","webp","oversize","sizeFraction","onPress","ListEmptyComponent","inlineRoot","inlineHeader","header","showToggleButton","customContent","enablePersistence","initialMode","disableScrollWrapper","AssetsToolView","props","create","flex","minHeight","backgroundColor","background","base","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","border","default","card","paddingBottom","marginHorizontal","marginBottom","padding","borderRadius","borderWidth","borderColor","gap","color","text","secondary","fontSize","marginTop","muted","fontWeight","letterSpacing","flexDirection","flexWrap","input","overflow","alignItems","primary","textAlign","lineHeight"],"sourceRoot":"../../../src","sources":["components/AssetsModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * BaselineBar — save/compare-against-baseline controls.
5
+ *
6
+ * No baseline: one "SAVE BASELINE" button. With a baseline: the diff summary
7
+ * ("+3 new · 1 removed · +1.2 MB since 2h ago") plus UPDATE and ✕ (clear).
8
+ * Growth renders in warning color, shrinkage in success — that's the whole
9
+ * point of the feature.
10
+ */
11
+
12
+ import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
13
+ import { macOSColors } from "@buoy-gg/shared-ui";
14
+ import { formatBytes } from "../format";
15
+ import { clearBaseline, saveBaseline } from "../store/baseline";
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ function formatAge(savedAt) {
18
+ const minutes = Math.max(1, Math.round((Date.now() - savedAt) / 60000));
19
+ if (minutes < 60) return `${minutes}m ago`;
20
+ const hours = Math.round(minutes / 60);
21
+ if (hours < 48) return `${hours}h ago`;
22
+ return `${Math.round(hours / 24)}d ago`;
23
+ }
24
+ export function BaselineBar({
25
+ diff
26
+ }) {
27
+ // No baseline → no bar; the BASE button in AssetsListControls creates one.
28
+ if (!diff) return null;
29
+ const parts = [];
30
+ if (diff.added.length) parts.push(`+${diff.added.length} new`);
31
+ if (diff.removed.length) parts.push(`${diff.removed.length} removed`);
32
+ if (diff.grown.length) parts.push(`${diff.grown.length} grew`);
33
+ const net = diff.netBytes != null && Math.abs(diff.netBytes) >= 1024 ? `${diff.netBytes > 0 ? "+" : "−"}${formatBytes(Math.abs(diff.netBytes))}` : null;
34
+ const changed = parts.length > 0 || net != null;
35
+ const netColor = diff.netBytes != null && diff.netBytes > 0 ? macOSColors.semantic.warning : macOSColors.semantic.success;
36
+ return /*#__PURE__*/_jsxs(View, {
37
+ style: styles.bar,
38
+ children: [/*#__PURE__*/_jsxs(Text, {
39
+ style: styles.summary,
40
+ numberOfLines: 1,
41
+ children: [changed ? parts.join(" · ") : "No changes", net ? " · " : "", net ? /*#__PURE__*/_jsx(Text, {
42
+ style: {
43
+ color: netColor
44
+ },
45
+ children: net
46
+ }) : null, /*#__PURE__*/_jsxs(Text, {
47
+ style: styles.age,
48
+ children: [" vs ", formatAge(diff.baselineSavedAt)]
49
+ })]
50
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
51
+ style: styles.button,
52
+ onPress: () => void saveBaseline(),
53
+ children: /*#__PURE__*/_jsx(Text, {
54
+ style: styles.buttonText,
55
+ children: "UPDATE"
56
+ })
57
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
58
+ style: styles.button,
59
+ onPress: () => void clearBaseline(),
60
+ children: /*#__PURE__*/_jsx(Text, {
61
+ style: styles.buttonText,
62
+ children: "\u2715"
63
+ })
64
+ })]
65
+ });
66
+ }
67
+ const styles = StyleSheet.create({
68
+ bar: {
69
+ flexDirection: "row",
70
+ alignItems: "center",
71
+ gap: 8,
72
+ marginHorizontal: 10,
73
+ marginBottom: 8,
74
+ paddingHorizontal: 10,
75
+ paddingVertical: 6,
76
+ borderWidth: 1,
77
+ borderColor: macOSColors.border.default,
78
+ borderRadius: 8,
79
+ backgroundColor: macOSColors.background.card
80
+ },
81
+ summary: {
82
+ flex: 1,
83
+ color: macOSColors.text.secondary,
84
+ fontSize: 10,
85
+ fontWeight: "600"
86
+ },
87
+ age: {
88
+ color: macOSColors.text.muted,
89
+ fontWeight: "400"
90
+ },
91
+ button: {
92
+ backgroundColor: macOSColors.background.input,
93
+ borderWidth: 1,
94
+ borderColor: macOSColors.border.default,
95
+ borderRadius: 6,
96
+ paddingHorizontal: 8,
97
+ paddingVertical: 5
98
+ },
99
+ buttonText: {
100
+ color: macOSColors.text.secondary,
101
+ fontSize: 9,
102
+ fontWeight: "700",
103
+ letterSpacing: 0.5
104
+ }
105
+ });
106
+ //# sourceMappingURL=BaselineBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","TouchableOpacity","View","macOSColors","formatBytes","clearBaseline","saveBaseline","jsx","_jsx","jsxs","_jsxs","formatAge","savedAt","minutes","Math","max","round","Date","now","hours","BaselineBar","diff","parts","added","length","push","removed","grown","net","netBytes","abs","changed","netColor","semantic","warning","success","style","styles","bar","children","summary","numberOfLines","join","color","age","baselineSavedAt","button","onPress","buttonText","create","flexDirection","alignItems","gap","marginHorizontal","marginBottom","paddingHorizontal","paddingVertical","borderWidth","borderColor","border","default","borderRadius","backgroundColor","background","card","flex","text","secondary","fontSize","fontWeight","muted","input","letterSpacing"],"sourceRoot":"../../../src","sources":["components/BaselineBar.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Markdown reports for the shared ToolbarCopyButton — the paste-into-your-
5
+ * issue-tracker view of the inventory.
6
+ */
7
+
8
+ import { formatBytes, formatDimensions, formatScales } from "./format";
9
+ import { estDecodedBytes } from "./store/assetStore";
10
+ export function formatAssetMarkdown(record) {
11
+ const lines = [`# Asset: ${record.name}.${record.type}`, "", `- Kind: ${record.kind}`, `- Status: ${record.loaded ? "loaded at runtime" : "in bundle, never loaded"}`];
12
+ if (record.kind === "image") lines.push(`- Dimensions: ${formatDimensions(record)} (logical)`);
13
+ if (record.scales.length) lines.push(`- Scales: ${formatScales(record.scales)}`);
14
+ if (record.sizeBytes != null && record.sizeSource === "measured") {
15
+ lines.push(`- Size (all variants): ${formatBytes(record.sizeBytes)}`);
16
+ }
17
+ const estimate = estDecodedBytes(record);
18
+ if (estimate > 0) lines.push(`- Decoded memory: ~${formatBytes(estimate)}`);
19
+ if (record.hash) lines.push(`- Hash: ${record.hash}`);
20
+ if (record.httpServerLocation) lines.push(`- Location: ${record.httpServerLocation}`);
21
+ if (record.fileSystemLocation) lines.push(`- Source dir: ${record.fileSystemLocation}`);
22
+ if (record.resolvedUri) lines.push(`- Resolved URI: ${record.resolvedUri}`);
23
+ return lines.join("\n");
24
+ }
25
+ export function formatInventoryMarkdown(records, stats, insights, scanStatus, diff) {
26
+ const lines = ["# Asset inventory", "", `${stats.total} assets · ${stats.loaded} loaded · ${stats.neverLoaded} never loaded` + (stats.totalBytes > 0 ? ` · ${formatBytes(stats.totalBytes)} measured (${stats.measuredCount}/${stats.total})` : "")];
27
+ if (scanStatus.fontFamilies.length) {
28
+ lines.push(`Fonts loaded: ${scanStatus.fontFamilies.join(", ")}`);
29
+ }
30
+ if (!scanStatus.graphSupported) {
31
+ lines.push("_No Metro dev server — runtime-registered assets only (release build)._");
32
+ }
33
+ if (diff) {
34
+ const net = diff.netBytes != null ? `${diff.netBytes >= 0 ? "+" : "−"}${formatBytes(Math.abs(diff.netBytes))} net` : "net size unknown";
35
+ lines.push("", `## Since baseline (${new Date(diff.baselineSavedAt).toISOString()})`, `- ${diff.added.length} added · ${diff.removed.length} removed · ${diff.grown.length} grew · ${net}`);
36
+ for (const gone of diff.removed.slice(0, 20)) {
37
+ lines.push(`- removed: ${gone.name}.${gone.type}`);
38
+ }
39
+ }
40
+ const findings = [];
41
+ if (insights.neverLoaded.length) findings.push(`- ${insights.neverLoaded.length} shipped but never loaded`);
42
+ if (insights.duplicates.length) findings.push(`- ${insights.duplicates.length} duplicate content groups`);
43
+ if (insights.webpCandidates.length) findings.push(`- ${insights.webpCandidates.length} WebP conversion candidates`);
44
+ if (insights.scaleGaps.length) findings.push(`- ${insights.scaleGaps.length} scale-coverage gaps`);
45
+ if (insights.overDecode.length) findings.push(`- ${insights.overDecode.length} images decoding larger than 2× the screen`);
46
+ if (insights.heavyGifs.length) findings.push(`- ${insights.heavyGifs.length} heavy GIFs (convert to video/Lottie)`);
47
+ if (insights.heavyFonts.length) findings.push(`- ${insights.heavyFonts.length} heavy fonts (subset candidates)`);
48
+ if (insights.scaleAnomalies.length) findings.push(`- ${insights.scaleAnomalies.length} scale-variant anomalies (check exports)`);
49
+ if (findings.length) lines.push("", "## Findings", ...findings);
50
+ lines.push("", "## Assets (largest first)", "", "| Asset | Kind | Dimensions | Scales | Size | Loaded |", "| --- | --- | --- | --- | --- | --- |");
51
+ for (const r of records) {
52
+ const size = r.sizeBytes != null && r.sizeSource === "measured" ? formatBytes(r.sizeBytes) : estDecodedBytes(r) > 0 ? `~${formatBytes(estDecodedBytes(r))}` : "—";
53
+ lines.push(`| ${r.name}.${r.type} | ${r.kind} | ${r.kind === "image" ? formatDimensions(r) : "—"} | ${formatScales(r.scales)} | ${size} | ${r.loaded ? "yes" : "NO"} |`);
54
+ }
55
+ return lines.join("\n");
56
+ }
57
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatBytes","formatDimensions","formatScales","estDecodedBytes","formatAssetMarkdown","record","lines","name","type","kind","loaded","push","scales","length","sizeBytes","sizeSource","estimate","hash","httpServerLocation","fileSystemLocation","resolvedUri","join","formatInventoryMarkdown","records","stats","insights","scanStatus","diff","total","neverLoaded","totalBytes","measuredCount","fontFamilies","graphSupported","net","netBytes","Math","abs","Date","baselineSavedAt","toISOString","added","removed","grown","gone","slice","findings","duplicates","webpCandidates","scaleGaps","overDecode","heavyGifs","heavyFonts","scaleAnomalies","r","size"],"sourceRoot":"../../src","sources":["export.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,gBAAgB,EAAEC,YAAY,QAAQ,UAAU;AACtE,SAASC,eAAe,QAAQ,oBAAoB;AASpD,OAAO,SAASC,mBAAmBA,CAACC,MAAmB,EAAU;EAC/D,MAAMC,KAAK,GAAG,CACZ,YAAYD,MAAM,CAACE,IAAI,IAAIF,MAAM,CAACG,IAAI,EAAE,EACxC,EAAE,EACF,WAAWH,MAAM,CAACI,IAAI,EAAE,EACxB,aAAaJ,MAAM,CAACK,MAAM,GAAG,mBAAmB,GAAG,yBAAyB,EAAE,CAC/E;EACD,IAAIL,MAAM,CAACI,IAAI,KAAK,OAAO,EAAEH,KAAK,CAACK,IAAI,CAAC,iBAAiBV,gBAAgB,CAACI,MAAM,CAAC,YAAY,CAAC;EAC9F,IAAIA,MAAM,CAACO,MAAM,CAACC,MAAM,EAAEP,KAAK,CAACK,IAAI,CAAC,aAAaT,YAAY,CAACG,MAAM,CAACO,MAAM,CAAC,EAAE,CAAC;EAChF,IAAIP,MAAM,CAACS,SAAS,IAAI,IAAI,IAAIT,MAAM,CAACU,UAAU,KAAK,UAAU,EAAE;IAChET,KAAK,CAACK,IAAI,CAAC,0BAA0BX,WAAW,CAACK,MAAM,CAACS,SAAS,CAAC,EAAE,CAAC;EACvE;EACA,MAAME,QAAQ,GAAGb,eAAe,CAACE,MAAM,CAAC;EACxC,IAAIW,QAAQ,GAAG,CAAC,EAAEV,KAAK,CAACK,IAAI,CAAC,sBAAsBX,WAAW,CAACgB,QAAQ,CAAC,EAAE,CAAC;EAC3E,IAAIX,MAAM,CAACY,IAAI,EAAEX,KAAK,CAACK,IAAI,CAAC,WAAWN,MAAM,CAACY,IAAI,EAAE,CAAC;EACrD,IAAIZ,MAAM,CAACa,kBAAkB,EAAEZ,KAAK,CAACK,IAAI,CAAC,eAAeN,MAAM,CAACa,kBAAkB,EAAE,CAAC;EACrF,IAAIb,MAAM,CAACc,kBAAkB,EAAEb,KAAK,CAACK,IAAI,CAAC,iBAAiBN,MAAM,CAACc,kBAAkB,EAAE,CAAC;EACvF,IAAId,MAAM,CAACe,WAAW,EAAEd,KAAK,CAACK,IAAI,CAAC,mBAAmBN,MAAM,CAACe,WAAW,EAAE,CAAC;EAC3E,OAAOd,KAAK,CAACe,IAAI,CAAC,IAAI,CAAC;AACzB;AAEA,OAAO,SAASC,uBAAuBA,CACrCC,OAAsB,EACtBC,KAAkB,EAClBC,QAAwB,EACxBC,UAA4B,EAC5BC,IAAwB,EAChB;EACR,MAAMrB,KAAK,GAAG,CACZ,mBAAmB,EACnB,EAAE,EACF,GAAGkB,KAAK,CAACI,KAAK,aAAaJ,KAAK,CAACd,MAAM,aAAac,KAAK,CAACK,WAAW,eAAe,IACjFL,KAAK,CAACM,UAAU,GAAG,CAAC,GACjB,MAAM9B,WAAW,CAACwB,KAAK,CAACM,UAAU,CAAC,cAAcN,KAAK,CAACO,aAAa,IAAIP,KAAK,CAACI,KAAK,GAAG,GACtF,EAAE,CAAC,CACV;EACD,IAAIF,UAAU,CAACM,YAAY,CAACnB,MAAM,EAAE;IAClCP,KAAK,CAACK,IAAI,CAAC,iBAAiBe,UAAU,CAACM,YAAY,CAACX,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;EACnE;EACA,IAAI,CAACK,UAAU,CAACO,cAAc,EAAE;IAC9B3B,KAAK,CAACK,IAAI,CACR,yEACF,CAAC;EACH;EAEA,IAAIgB,IAAI,EAAE;IACR,MAAMO,GAAG,GACPP,IAAI,CAACQ,QAAQ,IAAI,IAAI,GACjB,GAAGR,IAAI,CAACQ,QAAQ,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGnC,WAAW,CAACoC,IAAI,CAACC,GAAG,CAACV,IAAI,CAACQ,QAAQ,CAAC,CAAC,MAAM,GAC9E,kBAAkB;IACxB7B,KAAK,CAACK,IAAI,CACR,EAAE,EACF,sBAAsB,IAAI2B,IAAI,CAACX,IAAI,CAACY,eAAe,CAAC,CAACC,WAAW,CAAC,CAAC,GAAG,EACrE,KAAKb,IAAI,CAACc,KAAK,CAAC5B,MAAM,YAAYc,IAAI,CAACe,OAAO,CAAC7B,MAAM,cAAcc,IAAI,CAACgB,KAAK,CAAC9B,MAAM,WAAWqB,GAAG,EACpG,CAAC;IACD,KAAK,MAAMU,IAAI,IAAIjB,IAAI,CAACe,OAAO,CAACG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;MAC5CvC,KAAK,CAACK,IAAI,CAAC,cAAciC,IAAI,CAACrC,IAAI,IAAIqC,IAAI,CAACpC,IAAI,EAAE,CAAC;IACpD;EACF;EAEA,MAAMsC,QAAkB,GAAG,EAAE;EAC7B,IAAIrB,QAAQ,CAACI,WAAW,CAAChB,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAACI,WAAW,CAAChB,MAAM,2BAA2B,CAAC;EAC3G,IAAIY,QAAQ,CAACsB,UAAU,CAAClC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAACsB,UAAU,CAAClC,MAAM,2BAA2B,CAAC;EACzG,IAAIY,QAAQ,CAACuB,cAAc,CAACnC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAACuB,cAAc,CAACnC,MAAM,6BAA6B,CAAC;EACnH,IAAIY,QAAQ,CAACwB,SAAS,CAACpC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAACwB,SAAS,CAACpC,MAAM,sBAAsB,CAAC;EAClG,IAAIY,QAAQ,CAACyB,UAAU,CAACrC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAACyB,UAAU,CAACrC,MAAM,4CAA4C,CAAC;EAC1H,IAAIY,QAAQ,CAAC0B,SAAS,CAACtC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAAC0B,SAAS,CAACtC,MAAM,uCAAuC,CAAC;EACnH,IAAIY,QAAQ,CAAC2B,UAAU,CAACvC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAAC2B,UAAU,CAACvC,MAAM,kCAAkC,CAAC;EAChH,IAAIY,QAAQ,CAAC4B,cAAc,CAACxC,MAAM,EAAEiC,QAAQ,CAACnC,IAAI,CAAC,KAAKc,QAAQ,CAAC4B,cAAc,CAACxC,MAAM,0CAA0C,CAAC;EAChI,IAAIiC,QAAQ,CAACjC,MAAM,EAAEP,KAAK,CAACK,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,GAAGmC,QAAQ,CAAC;EAE/DxC,KAAK,CAACK,IAAI,CACR,EAAE,EACF,2BAA2B,EAC3B,EAAE,EACF,wDAAwD,EACxD,uCACF,CAAC;EACD,KAAK,MAAM2C,CAAC,IAAI/B,OAAO,EAAE;IACvB,MAAMgC,IAAI,GACRD,CAAC,CAACxC,SAAS,IAAI,IAAI,IAAIwC,CAAC,CAACvC,UAAU,KAAK,UAAU,GAC9Cf,WAAW,CAACsD,CAAC,CAACxC,SAAS,CAAC,GACxBX,eAAe,CAACmD,CAAC,CAAC,GAAG,CAAC,GACpB,IAAItD,WAAW,CAACG,eAAe,CAACmD,CAAC,CAAC,CAAC,EAAE,GACrC,GAAG;IACXhD,KAAK,CAACK,IAAI,CACR,KAAK2C,CAAC,CAAC/C,IAAI,IAAI+C,CAAC,CAAC9C,IAAI,MAAM8C,CAAC,CAAC7C,IAAI,MAC/B6C,CAAC,CAAC7C,IAAI,KAAK,OAAO,GAAGR,gBAAgB,CAACqD,CAAC,CAAC,GAAG,GAAG,MAC1CpD,YAAY,CAACoD,CAAC,CAAC1C,MAAM,CAAC,MAAM2C,IAAI,MAAMD,CAAC,CAAC5C,MAAM,GAAG,KAAK,GAAG,IAAI,IACrE,CAAC;EACH;EACA,OAAOJ,KAAK,CAACe,IAAI,CAAC,IAAI,CAAC;AACzB","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Shared formatting helpers for rows, detail view, and markdown export.
5
+ */
6
+
7
+ export function formatBytes(bytes) {
8
+ if (bytes == null || bytes <= 0) return "—";
9
+ if (bytes < 1024) return `${bytes} B`;
10
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
11
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
12
+ }
13
+ export function formatScales(scales) {
14
+ const unique = [...new Set(scales)].sort((a, b) => a - b);
15
+ if (!unique.length) return "—";
16
+ if (unique.length === 1) return `@${unique[0]}x`;
17
+ if (unique.length <= 3) return unique.map(s => `@${s}x`).join(" ");
18
+ return `@${unique[0]}x–@${unique[unique.length - 1]}x`;
19
+ }
20
+ export function formatDimensions(record) {
21
+ if (record.width == null || record.height == null) return "—";
22
+ return `${Math.round(record.width)}×${Math.round(record.height)}`;
23
+ }
24
+
25
+ /** Display size: measured bytes, or "~" decoded estimate for unmeasured images. */
26
+ export function formatSize(record, estDecoded) {
27
+ if (record.sizeBytes != null && record.sizeSource === "measured") {
28
+ return formatBytes(record.sizeBytes);
29
+ }
30
+ if (estDecoded > 0) return `~${formatBytes(estDecoded)}`;
31
+ return "—";
32
+ }
33
+ export const KIND_LABELS = {
34
+ image: "IMG",
35
+ font: "FONT",
36
+ video: "VID",
37
+ audio: "AUD",
38
+ data: "DATA",
39
+ other: "MISC"
40
+ };
41
+
42
+ /** Family accent per kind — the card's left edge, like network's method bar. */
43
+ export const KIND_COLORS = {
44
+ image: "#2DD4BF",
45
+ font: "#C084FC",
46
+ video: "#FF9F1C",
47
+ audio: "#FF3366",
48
+ data: "#00D4FF",
49
+ other: "#8E8E93"
50
+ };
51
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatBytes","bytes","toFixed","formatScales","scales","unique","Set","sort","a","b","length","map","s","join","formatDimensions","record","width","height","Math","round","formatSize","estDecoded","sizeBytes","sizeSource","KIND_LABELS","image","font","video","audio","data","other","KIND_COLORS"],"sourceRoot":"../../src","sources":["format.ts"],"mappings":";;AAAA;AACA;AACA;;AAIA,OAAO,SAASA,WAAWA,CAACC,KAAgC,EAAU;EACpE,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,IAAI,CAAC,EAAE,OAAO,GAAG;EAC3C,IAAIA,KAAK,GAAG,IAAI,EAAE,OAAO,GAAGA,KAAK,IAAI;EACrC,IAAIA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,EAAEC,OAAO,CAAC,CAAC,CAAC,KAAK;EACjE,OAAO,GAAG,CAACD,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAEC,OAAO,CAAC,CAAC,CAAC,KAAK;AACnD;AAEA,OAAO,SAASC,YAAYA,CAACC,MAAgB,EAAU;EACrD,MAAMC,MAAM,GAAG,CAAC,GAAG,IAAIC,GAAG,CAACF,MAAM,CAAC,CAAC,CAACG,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;EACzD,IAAI,CAACJ,MAAM,CAACK,MAAM,EAAE,OAAO,GAAG;EAC9B,IAAIL,MAAM,CAACK,MAAM,KAAK,CAAC,EAAE,OAAO,IAAIL,MAAM,CAAC,CAAC,CAAC,GAAG;EAChD,IAAIA,MAAM,CAACK,MAAM,IAAI,CAAC,EAAE,OAAOL,MAAM,CAACM,GAAG,CAAEC,CAAC,IAAK,IAAIA,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EACpE,OAAO,IAAIR,MAAM,CAAC,CAAC,CAAC,MAAMA,MAAM,CAACA,MAAM,CAACK,MAAM,GAAG,CAAC,CAAC,GAAG;AACxD;AAEA,OAAO,SAASI,gBAAgBA,CAACC,MAAmB,EAAU;EAC5D,IAAIA,MAAM,CAACC,KAAK,IAAI,IAAI,IAAID,MAAM,CAACE,MAAM,IAAI,IAAI,EAAE,OAAO,GAAG;EAC7D,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACJ,MAAM,CAACC,KAAK,CAAC,IAAIE,IAAI,CAACC,KAAK,CAACJ,MAAM,CAACE,MAAM,CAAC,EAAE;AACnE;;AAEA;AACA,OAAO,SAASG,UAAUA,CAACL,MAAmB,EAAEM,UAAkB,EAAU;EAC1E,IAAIN,MAAM,CAACO,SAAS,IAAI,IAAI,IAAIP,MAAM,CAACQ,UAAU,KAAK,UAAU,EAAE;IAChE,OAAOvB,WAAW,CAACe,MAAM,CAACO,SAAS,CAAC;EACtC;EACA,IAAID,UAAU,GAAG,CAAC,EAAE,OAAO,IAAIrB,WAAW,CAACqB,UAAU,CAAC,EAAE;EACxD,OAAO,GAAG;AACZ;AAEA,OAAO,MAAMG,WAAsC,GAAG;EACpDC,KAAK,EAAE,KAAK;EACZC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,KAAK;EACZC,KAAK,EAAE,KAAK;EACZC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE;AACT,CAAC;;AAED;AACA,OAAO,MAAMC,WAAsC,GAAG;EACpDN,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE,SAAS;EACfC,KAAK,EAAE,SAAS;EAChBC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE,SAAS;EACfC,KAAK,EAAE;AACT,CAAC","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * React bindings for the asset store.
5
+ */
6
+
7
+ import { useMemo, useSyncExternalStore } from "react";
8
+ import { computeStats, getSnapshot, subscribe } from "../store/assetStore";
9
+ import { computeInsights } from "../store/insights";
10
+ export function useAssetRecords() {
11
+ const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
12
+ return useMemo(() => ({
13
+ records: snapshot,
14
+ stats: computeStats(snapshot),
15
+ insights: computeInsights(snapshot)
16
+ }), [snapshot]);
17
+ }
18
+ //# sourceMappingURL=useAssetRecords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useSyncExternalStore","computeStats","getSnapshot","subscribe","computeInsights","useAssetRecords","snapshot","records","stats","insights"],"sourceRoot":"../../../src","sources":["hooks/useAssetRecords.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA,SAASA,OAAO,EAAEC,oBAAoB,QAAQ,OAAO;AACrD,SAASC,YAAY,EAAEC,WAAW,EAAEC,SAAS,QAAQ,qBAAqB;AAC1E,SAASC,eAAe,QAAQ,mBAAmB;AASnD,OAAO,SAASC,eAAeA,CAAA,EAA0B;EACvD,MAAMC,QAAQ,GAAGN,oBAAoB,CAACG,SAAS,EAAED,WAAW,EAAEA,WAAW,CAAC;EAC1E,OAAOH,OAAO,CACZ,OAAO;IACLQ,OAAO,EAAED,QAAQ;IACjBE,KAAK,EAAEP,YAAY,CAACK,QAAQ,CAAC;IAC7BG,QAAQ,EAAEL,eAAe,CAACE,QAAQ;EACpC,CAAC,CAAC,EACF,CAACA,QAAQ,CACX,CAAC;AACH","ignoreList":[]}