@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.
- package/LICENSE +58 -0
- package/README.md +55 -0
- package/lib/commonjs/capture/expo.js +46 -0
- package/lib/commonjs/capture/expo.js.map +1 -0
- package/lib/commonjs/capture/install.js +78 -0
- package/lib/commonjs/capture/install.js.map +1 -0
- package/lib/commonjs/capture/measure.js +186 -0
- package/lib/commonjs/capture/measure.js.map +1 -0
- package/lib/commonjs/capture/metroGraph.js +148 -0
- package/lib/commonjs/capture/metroGraph.js.map +1 -0
- package/lib/commonjs/capture/registry.js +124 -0
- package/lib/commonjs/capture/registry.js.map +1 -0
- package/lib/commonjs/components/AssetDetail.js +205 -0
- package/lib/commonjs/components/AssetDetail.js.map +1 -0
- package/lib/commonjs/components/AssetRow.js +246 -0
- package/lib/commonjs/components/AssetRow.js.map +1 -0
- package/lib/commonjs/components/AssetsFilterBar.js +92 -0
- package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
- package/lib/commonjs/components/AssetsHeader.js +66 -0
- package/lib/commonjs/components/AssetsHeader.js.map +1 -0
- package/lib/commonjs/components/AssetsIcon.js +19 -0
- package/lib/commonjs/components/AssetsIcon.js.map +1 -0
- package/lib/commonjs/components/AssetsListControls.js +94 -0
- package/lib/commonjs/components/AssetsListControls.js.map +1 -0
- package/lib/commonjs/components/AssetsModal.js +338 -0
- package/lib/commonjs/components/AssetsModal.js.map +1 -0
- package/lib/commonjs/components/BaselineBar.js +110 -0
- package/lib/commonjs/components/BaselineBar.js.map +1 -0
- package/lib/commonjs/export.js +62 -0
- package/lib/commonjs/export.js.map +1 -0
- package/lib/commonjs/format.js +59 -0
- package/lib/commonjs/format.js.map +1 -0
- package/lib/commonjs/hooks/useAssetRecords.js +22 -0
- package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
- package/lib/commonjs/index.js +260 -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/remote.js +65 -0
- package/lib/commonjs/remote.js.map +1 -0
- package/lib/commonjs/state.js +51 -0
- package/lib/commonjs/state.js.map +1 -0
- package/lib/commonjs/store/assetStore.js +234 -0
- package/lib/commonjs/store/assetStore.js.map +1 -0
- package/lib/commonjs/store/baseline.js +165 -0
- package/lib/commonjs/store/baseline.js.map +1 -0
- package/lib/commonjs/store/insights.js +129 -0
- package/lib/commonjs/store/insights.js.map +1 -0
- package/lib/commonjs/sync/assetsSyncAdapter.js +157 -0
- package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/capture/expo.js +41 -0
- package/lib/module/capture/expo.js.map +1 -0
- package/lib/module/capture/install.js +72 -0
- package/lib/module/capture/install.js.map +1 -0
- package/lib/module/capture/measure.js +179 -0
- package/lib/module/capture/measure.js.map +1 -0
- package/lib/module/capture/metroGraph.js +141 -0
- package/lib/module/capture/metroGraph.js.map +1 -0
- package/lib/module/capture/registry.js +117 -0
- package/lib/module/capture/registry.js.map +1 -0
- package/lib/module/components/AssetDetail.js +201 -0
- package/lib/module/components/AssetDetail.js.map +1 -0
- package/lib/module/components/AssetRow.js +242 -0
- package/lib/module/components/AssetRow.js.map +1 -0
- package/lib/module/components/AssetsFilterBar.js +88 -0
- package/lib/module/components/AssetsFilterBar.js.map +1 -0
- package/lib/module/components/AssetsHeader.js +62 -0
- package/lib/module/components/AssetsHeader.js.map +1 -0
- package/lib/module/components/AssetsIcon.js +12 -0
- package/lib/module/components/AssetsIcon.js.map +1 -0
- package/lib/module/components/AssetsListControls.js +90 -0
- package/lib/module/components/AssetsListControls.js.map +1 -0
- package/lib/module/components/AssetsModal.js +333 -0
- package/lib/module/components/AssetsModal.js.map +1 -0
- package/lib/module/components/BaselineBar.js +106 -0
- package/lib/module/components/BaselineBar.js.map +1 -0
- package/lib/module/export.js +57 -0
- package/lib/module/export.js.map +1 -0
- package/lib/module/format.js +51 -0
- package/lib/module/format.js.map +1 -0
- package/lib/module/hooks/useAssetRecords.js +18 -0
- package/lib/module/hooks/useAssetRecords.js.map +1 -0
- package/lib/module/index.js +59 -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/remote.js +58 -0
- package/lib/module/remote.js.map +1 -0
- package/lib/module/state.js +47 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/store/assetStore.js +219 -0
- package/lib/module/store/assetStore.js.map +1 -0
- package/lib/module/store/baseline.js +157 -0
- package/lib/module/store/baseline.js.map +1 -0
- package/lib/module/store/insights.js +125 -0
- package/lib/module/store/insights.js.map +1 -0
- package/lib/module/sync/assetsSyncAdapter.js +153 -0
- package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/capture/expo.d.ts +18 -0
- package/lib/typescript/capture/expo.d.ts.map +1 -0
- package/lib/typescript/capture/install.d.ts +17 -0
- package/lib/typescript/capture/install.d.ts.map +1 -0
- package/lib/typescript/capture/measure.d.ts +38 -0
- package/lib/typescript/capture/measure.d.ts.map +1 -0
- package/lib/typescript/capture/metroGraph.d.ts +33 -0
- package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
- package/lib/typescript/capture/registry.d.ts +45 -0
- package/lib/typescript/capture/registry.d.ts.map +1 -0
- package/lib/typescript/components/AssetDetail.d.ts +17 -0
- package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
- package/lib/typescript/components/AssetRow.d.ts +32 -0
- package/lib/typescript/components/AssetRow.d.ts.map +1 -0
- package/lib/typescript/components/AssetsFilterBar.d.ts +16 -0
- package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
- package/lib/typescript/components/AssetsHeader.d.ts +22 -0
- package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
- package/lib/typescript/components/AssetsIcon.d.ts +9 -0
- package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
- package/lib/typescript/components/AssetsListControls.d.ts +18 -0
- package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
- package/lib/typescript/components/AssetsModal.d.ts +24 -0
- package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
- package/lib/typescript/components/BaselineBar.d.ts +13 -0
- package/lib/typescript/components/BaselineBar.d.ts.map +1 -0
- package/lib/typescript/export.d.ts +8 -0
- package/lib/typescript/export.d.ts.map +1 -0
- package/lib/typescript/format.d.ts +13 -0
- package/lib/typescript/format.d.ts.map +1 -0
- package/lib/typescript/hooks/useAssetRecords.d.ts +11 -0
- package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +26 -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/remote.d.ts +17 -0
- package/lib/typescript/remote.d.ts.map +1 -0
- package/lib/typescript/state.d.ts +41 -0
- package/lib/typescript/state.d.ts.map +1 -0
- package/lib/typescript/store/assetStore.d.ts +51 -0
- package/lib/typescript/store/assetStore.d.ts.map +1 -0
- package/lib/typescript/store/baseline.d.ts +22 -0
- package/lib/typescript/store/baseline.d.ts.map +1 -0
- package/lib/typescript/store/insights.d.ts +7 -0
- package/lib/typescript/store/insights.d.ts.map +1 -0
- package/lib/typescript/sync/assetsSyncAdapter.d.ts +83 -0
- package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +162 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +77 -0
- package/src/capture/expo.ts +45 -0
- package/src/capture/install.ts +73 -0
- package/src/capture/measure.ts +167 -0
- package/src/capture/metroGraph.ts +146 -0
- package/src/capture/registry.ts +134 -0
- package/src/components/AssetDetail.tsx +207 -0
- package/src/components/AssetRow.tsx +243 -0
- package/src/components/AssetsFilterBar.tsx +99 -0
- package/src/components/AssetsHeader.tsx +75 -0
- package/src/components/AssetsIcon.tsx +9 -0
- package/src/components/AssetsListControls.tsx +101 -0
- package/src/components/AssetsModal.tsx +368 -0
- package/src/components/BaselineBar.tsx +98 -0
- package/src/export.ts +108 -0
- package/src/format.ts +53 -0
- package/src/hooks/useAssetRecords.ts +26 -0
- package/src/index.tsx +87 -0
- package/src/preset.tsx +35 -0
- package/src/remote.ts +65 -0
- package/src/state.ts +84 -0
- package/src/store/assetStore.ts +209 -0
- package/src/store/baseline.ts +152 -0
- package/src/store/insights.ts +145 -0
- package/src/sync/assetsSyncAdapter.ts +151 -0
- 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":"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","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":[]}
|