@buoy-gg/assets 7.0.38 → 7.0.40

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 (161) hide show
  1. package/lib/commonjs/capture/expo.js +46 -1
  2. package/lib/commonjs/capture/expo.js.map +1 -0
  3. package/lib/commonjs/capture/install.js +91 -1
  4. package/lib/commonjs/capture/install.js.map +1 -0
  5. package/lib/commonjs/capture/isBuoyAsset.js +23 -1
  6. package/lib/commonjs/capture/isBuoyAsset.js.map +1 -0
  7. package/lib/commonjs/capture/measure.js +186 -1
  8. package/lib/commonjs/capture/measure.js.map +1 -0
  9. package/lib/commonjs/capture/metroGraph.js +175 -1
  10. package/lib/commonjs/capture/metroGraph.js.map +1 -0
  11. package/lib/commonjs/capture/registry.js +127 -1
  12. package/lib/commonjs/capture/registry.js.map +1 -0
  13. package/lib/commonjs/components/AssetDetail.js +211 -1
  14. package/lib/commonjs/components/AssetDetail.js.map +1 -0
  15. package/lib/commonjs/components/AssetImage.js +66 -1
  16. package/lib/commonjs/components/AssetImage.js.map +1 -0
  17. package/lib/commonjs/components/AssetRow.js +232 -1
  18. package/lib/commonjs/components/AssetRow.js.map +1 -0
  19. package/lib/commonjs/components/AssetsFilterBar.js +105 -1
  20. package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
  21. package/lib/commonjs/components/AssetsHeader.js +73 -1
  22. package/lib/commonjs/components/AssetsHeader.js.map +1 -0
  23. package/lib/commonjs/components/AssetsIcon.js +19 -1
  24. package/lib/commonjs/components/AssetsIcon.js.map +1 -0
  25. package/lib/commonjs/components/AssetsListControls.js +81 -1
  26. package/lib/commonjs/components/AssetsListControls.js.map +1 -0
  27. package/lib/commonjs/components/AssetsModal.js +378 -1
  28. package/lib/commonjs/components/AssetsModal.js.map +1 -0
  29. package/lib/commonjs/components/ScanNotice.js +85 -1
  30. package/lib/commonjs/components/ScanNotice.js.map +1 -0
  31. package/lib/commonjs/components/optionalExpoImage.js +16 -1
  32. package/lib/commonjs/components/optionalExpoImage.js.map +1 -0
  33. package/lib/commonjs/components/optionalExpoImage.web.js +11 -1
  34. package/lib/commonjs/components/optionalExpoImage.web.js.map +1 -0
  35. package/lib/commonjs/export.js +62 -1
  36. package/lib/commonjs/export.js.map +1 -0
  37. package/lib/commonjs/format.js +59 -1
  38. package/lib/commonjs/format.js.map +1 -0
  39. package/lib/commonjs/hooks/useAssetRecords.js +22 -1
  40. package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
  41. package/lib/commonjs/hooks/useAssetScanStatus.js +28 -1
  42. package/lib/commonjs/hooks/useAssetScanStatus.js.map +1 -0
  43. package/lib/commonjs/index.js +313 -1
  44. package/lib/commonjs/index.js.map +1 -0
  45. package/lib/commonjs/preset.js +39 -1
  46. package/lib/commonjs/preset.js.map +1 -0
  47. package/lib/commonjs/remote.js +68 -1
  48. package/lib/commonjs/remote.js.map +1 -0
  49. package/lib/commonjs/state.js +51 -1
  50. package/lib/commonjs/state.js.map +1 -0
  51. package/lib/commonjs/store/assetStore.js +256 -1
  52. package/lib/commonjs/store/assetStore.js.map +1 -0
  53. package/lib/commonjs/store/baseline.js +175 -1
  54. package/lib/commonjs/store/baseline.js.map +1 -0
  55. package/lib/commonjs/store/insights.js +120 -1
  56. package/lib/commonjs/store/insights.js.map +1 -0
  57. package/lib/commonjs/sync/assetsSyncAdapter.js +157 -1
  58. package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
  59. package/lib/commonjs/types.js +2 -1
  60. package/lib/commonjs/types.js.map +1 -0
  61. package/lib/commonjs/utils/deviceScale.js +50 -1
  62. package/lib/commonjs/utils/deviceScale.js.map +1 -0
  63. package/lib/commonjs/utils/testIDs.js +110 -1
  64. package/lib/commonjs/utils/testIDs.js.map +1 -0
  65. package/lib/module/capture/expo.js +41 -1
  66. package/lib/module/capture/expo.js.map +1 -0
  67. package/lib/module/capture/install.js +85 -1
  68. package/lib/module/capture/install.js.map +1 -0
  69. package/lib/module/capture/isBuoyAsset.js +18 -1
  70. package/lib/module/capture/isBuoyAsset.js.map +1 -0
  71. package/lib/module/capture/measure.js +179 -1
  72. package/lib/module/capture/measure.js.map +1 -0
  73. package/lib/module/capture/metroGraph.js +168 -1
  74. package/lib/module/capture/metroGraph.js.map +1 -0
  75. package/lib/module/capture/registry.js +120 -1
  76. package/lib/module/capture/registry.js.map +1 -0
  77. package/lib/module/components/AssetDetail.js +207 -1
  78. package/lib/module/components/AssetDetail.js.map +1 -0
  79. package/lib/module/components/AssetImage.js +62 -1
  80. package/lib/module/components/AssetImage.js.map +1 -0
  81. package/lib/module/components/AssetRow.js +228 -1
  82. package/lib/module/components/AssetRow.js.map +1 -0
  83. package/lib/module/components/AssetsFilterBar.js +101 -1
  84. package/lib/module/components/AssetsFilterBar.js.map +1 -0
  85. package/lib/module/components/AssetsHeader.js +69 -1
  86. package/lib/module/components/AssetsHeader.js.map +1 -0
  87. package/lib/module/components/AssetsIcon.js +12 -1
  88. package/lib/module/components/AssetsIcon.js.map +1 -0
  89. package/lib/module/components/AssetsListControls.js +77 -1
  90. package/lib/module/components/AssetsListControls.js.map +1 -0
  91. package/lib/module/components/AssetsModal.js +373 -1
  92. package/lib/module/components/AssetsModal.js.map +1 -0
  93. package/lib/module/components/ScanNotice.js +81 -1
  94. package/lib/module/components/ScanNotice.js.map +1 -0
  95. package/lib/module/components/optionalExpoImage.js +12 -1
  96. package/lib/module/components/optionalExpoImage.js.map +1 -0
  97. package/lib/module/components/optionalExpoImage.web.js +7 -1
  98. package/lib/module/components/optionalExpoImage.web.js.map +1 -0
  99. package/lib/module/export.js +57 -1
  100. package/lib/module/export.js.map +1 -0
  101. package/lib/module/format.js +51 -1
  102. package/lib/module/format.js.map +1 -0
  103. package/lib/module/hooks/useAssetRecords.js +18 -1
  104. package/lib/module/hooks/useAssetRecords.js.map +1 -0
  105. package/lib/module/hooks/useAssetScanStatus.js +23 -1
  106. package/lib/module/hooks/useAssetScanStatus.js.map +1 -0
  107. package/lib/module/index.js +63 -1
  108. package/lib/module/index.js.map +1 -0
  109. package/lib/module/preset.js +35 -1
  110. package/lib/module/preset.js.map +1 -0
  111. package/lib/module/remote.js +61 -1
  112. package/lib/module/remote.js.map +1 -0
  113. package/lib/module/state.js +47 -1
  114. package/lib/module/state.js.map +1 -0
  115. package/lib/module/store/assetStore.js +240 -1
  116. package/lib/module/store/assetStore.js.map +1 -0
  117. package/lib/module/store/baseline.js +167 -1
  118. package/lib/module/store/baseline.js.map +1 -0
  119. package/lib/module/store/insights.js +116 -1
  120. package/lib/module/store/insights.js.map +1 -0
  121. package/lib/module/sync/assetsSyncAdapter.js +153 -1
  122. package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
  123. package/lib/module/types.js +2 -1
  124. package/lib/module/types.js.map +1 -0
  125. package/lib/module/utils/deviceScale.js +46 -1
  126. package/lib/module/utils/deviceScale.js.map +1 -0
  127. package/lib/module/utils/testIDs.js +99 -1
  128. package/lib/module/utils/testIDs.js.map +1 -0
  129. package/lib/typescript/capture/expo.d.ts.map +1 -0
  130. package/lib/typescript/capture/install.d.ts.map +1 -0
  131. package/lib/typescript/capture/isBuoyAsset.d.ts.map +1 -0
  132. package/lib/typescript/capture/measure.d.ts.map +1 -0
  133. package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
  134. package/lib/typescript/capture/registry.d.ts.map +1 -0
  135. package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
  136. package/lib/typescript/components/AssetImage.d.ts.map +1 -0
  137. package/lib/typescript/components/AssetRow.d.ts.map +1 -0
  138. package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
  139. package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
  140. package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
  141. package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
  142. package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
  143. package/lib/typescript/components/ScanNotice.d.ts.map +1 -0
  144. package/lib/typescript/components/optionalExpoImage.d.ts.map +1 -0
  145. package/lib/typescript/components/optionalExpoImage.web.d.ts.map +1 -0
  146. package/lib/typescript/export.d.ts.map +1 -0
  147. package/lib/typescript/format.d.ts.map +1 -0
  148. package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
  149. package/lib/typescript/hooks/useAssetScanStatus.d.ts.map +1 -0
  150. package/lib/typescript/index.d.ts.map +1 -0
  151. package/lib/typescript/preset.d.ts.map +1 -0
  152. package/lib/typescript/remote.d.ts.map +1 -0
  153. package/lib/typescript/state.d.ts.map +1 -0
  154. package/lib/typescript/store/assetStore.d.ts.map +1 -0
  155. package/lib/typescript/store/baseline.d.ts.map +1 -0
  156. package/lib/typescript/store/insights.d.ts.map +1 -0
  157. package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
  158. package/lib/typescript/types.d.ts.map +1 -0
  159. package/lib/typescript/utils/deviceScale.d.ts.map +1 -0
  160. package/lib/typescript/utils/testIDs.d.ts.map +1 -0
  161. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","TouchableOpacity","View","night","KIND_COLORS","KIND_LABELS","ASSETS_TEST_IDS","assetFilterTestID","jsx","_jsx","AssetsFilterBar","stats","duplicateCount","filter","onChange","chips","key","label","total","accent","color","textSecondary","kind","Object","keys","byKind","entry","count","push","neverLoaded","length","style","styles","bar","testID","filterBar","children","map","chip","active","accessibilityRole","accessibilityState","selected","borderColor","backgroundColor","onPress","chipText","create","flexDirection","flexWrap","gap","paddingHorizontal","paddingVertical","borderWidth","border","surface","borderRadius","fontSize","fontWeight","letterSpacing","lineHeight"],"sourceRoot":"../../../src","sources":["components/AssetsFilterBar.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1,69 @@
1
- "use strict";import{ModalHeader,ToolbarClearButton,ToolbarCopyButton}from"@buoy-gg/shared-ui";import{formatBytes}from"../format";import{ASSETS_TEST_IDS}from"../utils/testIDs";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export function AssetsHeader({stats:t,measuring:e,discovering:o=!1,detailOpen:s,detailIndex:a=-1,detailTotal:r=0,onCloseDetail:l,onClear:n,getReport:i,onBack:d}){if(s){const t=a>=0&&r>0?`${a+1} of ${r}`:void 0;return _jsxs(ModalHeader,{children:[_jsx(ModalHeader.Navigation,{onBack:l}),_jsx(ModalHeader.Content,{title:"Asset detail",subtitle:t,testID:ASSETS_TEST_IDS.title}),_jsx(ModalHeader.Actions,{children:_jsx(ToolbarCopyButton,{value:i,testID:ASSETS_TEST_IDS.copy})})]})}const S=[`${t.total} assets${o?" so far":""}`];if(t.totalBytes>0&&!e&&!o){const e=t.measuredCount<t.total?"+":"";S.push(`${formatBytes(t.totalBytes)}${e}`)}return t.neverLoaded>0&&S.push(`${t.neverLoaded} not observed`),t.fontFamilies>0&&S.push(`${t.fontFamilies} fonts`),_jsxs(ModalHeader,{children:[d?_jsx(ModalHeader.Navigation,{onBack:d}):null,_jsx(ModalHeader.Content,{title:"Assets",subtitle:S.join(" · "),testID:ASSETS_TEST_IDS.title}),_jsxs(ModalHeader.Actions,{children:[_jsx(ToolbarCopyButton,{value:i,testID:ASSETS_TEST_IDS.copy}),_jsx(ToolbarClearButton,{onPress:n,testID:ASSETS_TEST_IDS.clear})]})]})}
1
+ "use strict";
2
+
3
+ /**
4
+ * AssetsHeader — shared ModalHeader wiring, matching the Images/Console
5
+ * header pattern. List mode shows inventory totals plus the shared
6
+ * ToolbarCopyButton (full markdown report); detail mode shows back
7
+ * navigation and the single-asset report.
8
+ */
9
+
10
+ import { ModalHeader, ToolbarClearButton, ToolbarCopyButton } from "@buoy-gg/shared-ui";
11
+ import { formatBytes } from "../format";
12
+ import { ASSETS_TEST_IDS } from "../utils/testIDs";
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ export function AssetsHeader({
15
+ stats,
16
+ measuring,
17
+ discovering = false,
18
+ detailOpen,
19
+ detailIndex = -1,
20
+ detailTotal = 0,
21
+ onCloseDetail,
22
+ onClear,
23
+ getReport,
24
+ onBack
25
+ }) {
26
+ if (detailOpen) {
27
+ const counter = detailIndex >= 0 && detailTotal > 0 ? `${detailIndex + 1} of ${detailTotal}` : undefined;
28
+ return /*#__PURE__*/_jsxs(ModalHeader, {
29
+ children: [/*#__PURE__*/_jsx(ModalHeader.Navigation, {
30
+ onBack: onCloseDetail
31
+ }), /*#__PURE__*/_jsx(ModalHeader.Content, {
32
+ title: "Asset detail",
33
+ subtitle: counter,
34
+ testID: ASSETS_TEST_IDS.title
35
+ }), /*#__PURE__*/_jsx(ModalHeader.Actions, {
36
+ children: /*#__PURE__*/_jsx(ToolbarCopyButton, {
37
+ value: getReport,
38
+ testID: ASSETS_TEST_IDS.copy
39
+ })
40
+ })]
41
+ });
42
+ }
43
+ const subtitleParts = [`${stats.total} assets${discovering ? " so far" : ""}`];
44
+ // A mid-measure byte total reads as nonsense ("653 B+") — wait it out.
45
+ if (stats.totalBytes > 0 && !measuring && !discovering) {
46
+ const partial = stats.measuredCount < stats.total ? "+" : "";
47
+ subtitleParts.push(`${formatBytes(stats.totalBytes)}${partial}`);
48
+ }
49
+ if (stats.neverLoaded > 0) subtitleParts.push(`${stats.neverLoaded} not observed`);
50
+ if (stats.fontFamilies > 0) subtitleParts.push(`${stats.fontFamilies} fonts`);
51
+ return /*#__PURE__*/_jsxs(ModalHeader, {
52
+ children: [onBack ? /*#__PURE__*/_jsx(ModalHeader.Navigation, {
53
+ onBack: onBack
54
+ }) : null, /*#__PURE__*/_jsx(ModalHeader.Content, {
55
+ title: "Assets",
56
+ subtitle: subtitleParts.join(" · "),
57
+ testID: ASSETS_TEST_IDS.title
58
+ }), /*#__PURE__*/_jsxs(ModalHeader.Actions, {
59
+ children: [/*#__PURE__*/_jsx(ToolbarCopyButton, {
60
+ value: getReport,
61
+ testID: ASSETS_TEST_IDS.copy
62
+ }), /*#__PURE__*/_jsx(ToolbarClearButton, {
63
+ onPress: onClear,
64
+ testID: ASSETS_TEST_IDS.clear
65
+ })]
66
+ })]
67
+ });
68
+ }
69
+ //# sourceMappingURL=AssetsHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ModalHeader","ToolbarClearButton","ToolbarCopyButton","formatBytes","ASSETS_TEST_IDS","jsx","_jsx","jsxs","_jsxs","AssetsHeader","stats","measuring","discovering","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","getReport","onBack","counter","undefined","children","Navigation","Content","title","subtitle","testID","Actions","value","copy","subtitleParts","total","totalBytes","partial","measuredCount","push","neverLoaded","fontFamilies","join","onPress","clear"],"sourceRoot":"../../../src","sources":["components/AssetsHeader.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1,12 @@
1
- "use strict";export{AssetsIcon,ASSETS_ICON_COLOR}from"@buoy-gg/shared-ui";
1
+ "use strict";
2
+
3
+ /**
4
+ * AssetsIcon — re-exported from the Buoy Icon Format.
5
+ *
6
+ * The artwork lives in shared/icons/assets.json and is generated into
7
+ * @buoy-gg/floating-tools-core, so React Native, the desktop dashboard and
8
+ * Flutter all render the same drawing. Edit the JSON, then `pnpm icons`.
9
+ */
10
+
11
+ export { AssetsIcon, ASSETS_ICON_COLOR } from "@buoy-gg/shared-ui";
12
+ //# sourceMappingURL=AssetsIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AssetsIcon","ASSETS_ICON_COLOR"],"sourceRoot":"../../../src","sources":["components/AssetsIcon.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,UAAU,EAAEC,iBAAiB,QAAQ,oBAAoB","ignoreList":[]}
@@ -1 +1,77 @@
1
- "use strict";import{StyleSheet,Text,TextInput,TouchableOpacity,View}from"react-native";import{night}from"@buoy-gg/shared-ui";import{ASSETS_TEST_IDS}from"../utils/testIDs";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const NEXT_SORT={size:"name",name:"type",type:"size"};export function AssetsListControls({query:t,onQueryChange:e,sort:o,onSortChange:r}){return _jsxs(View,{style:styles.row,children:[_jsx(TextInput,{style:styles.input,value:t,onChangeText:e,placeholder:"Search assets…",placeholderTextColor:night.color.placeholder,autoCapitalize:"none",autoCorrect:!1,testID:ASSETS_TEST_IDS.search}),_jsx(TouchableOpacity,{style:styles.button,onPress:()=>r(NEXT_SORT[o]),testID:ASSETS_TEST_IDS.sort,children:_jsxs(Text,{style:styles.buttonText,testID:`${ASSETS_TEST_IDS.sort}-label`,children:["↓ ",o.toUpperCase()]})})]})}const styles=StyleSheet.create({row:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:10,paddingBottom:8},input:{flex:1,backgroundColor:night.color.surfaceElevated,borderWidth:1,borderColor:night.color.border,borderRadius:8,paddingHorizontal:10,paddingVertical:6,color:night.color.text,fontSize:12},button:{backgroundColor:night.color.surface,borderWidth:1,borderColor:night.color.border,borderRadius:8,paddingHorizontal:10,paddingVertical:7},buttonText:{color:night.color.textSecondary,fontSize:10,fontWeight:"700",letterSpacing:.5}});
1
+ "use strict";
2
+
3
+ /** Asset list search and sort controls. */
4
+
5
+ import { StyleSheet, Text, TextInput, TouchableOpacity, View } from "react-native";
6
+ import { night } from "@buoy-gg/shared-ui";
7
+ import { ASSETS_TEST_IDS } from "../utils/testIDs";
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ const NEXT_SORT = {
10
+ size: "name",
11
+ name: "type",
12
+ type: "size"
13
+ };
14
+ export function AssetsListControls({
15
+ query,
16
+ onQueryChange,
17
+ sort,
18
+ onSortChange
19
+ }) {
20
+ return /*#__PURE__*/_jsxs(View, {
21
+ style: styles.row,
22
+ children: [/*#__PURE__*/_jsx(TextInput, {
23
+ style: styles.input,
24
+ value: query,
25
+ onChangeText: onQueryChange,
26
+ placeholder: "Search assets\u2026",
27
+ placeholderTextColor: night.color.placeholder,
28
+ autoCapitalize: "none",
29
+ autoCorrect: false,
30
+ testID: ASSETS_TEST_IDS.search
31
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
32
+ style: styles.button,
33
+ onPress: () => onSortChange(NEXT_SORT[sort]),
34
+ testID: ASSETS_TEST_IDS.sort,
35
+ children: /*#__PURE__*/_jsxs(Text, {
36
+ style: styles.buttonText,
37
+ testID: `${ASSETS_TEST_IDS.sort}-label`,
38
+ children: ["\u2193 ", sort.toUpperCase()]
39
+ })
40
+ })]
41
+ });
42
+ }
43
+ const styles = StyleSheet.create({
44
+ row: {
45
+ flexDirection: "row",
46
+ alignItems: "center",
47
+ gap: 8,
48
+ paddingHorizontal: 10,
49
+ paddingBottom: 8
50
+ },
51
+ input: {
52
+ flex: 1,
53
+ backgroundColor: night.color.surfaceElevated,
54
+ borderWidth: 1,
55
+ borderColor: night.color.border,
56
+ borderRadius: 8,
57
+ paddingHorizontal: 10,
58
+ paddingVertical: 6,
59
+ color: night.color.text,
60
+ fontSize: 12
61
+ },
62
+ button: {
63
+ backgroundColor: night.color.surface,
64
+ borderWidth: 1,
65
+ borderColor: night.color.border,
66
+ borderRadius: 8,
67
+ paddingHorizontal: 10,
68
+ paddingVertical: 7
69
+ },
70
+ buttonText: {
71
+ color: night.color.textSecondary,
72
+ fontSize: 10,
73
+ fontWeight: "700",
74
+ letterSpacing: 0.5
75
+ }
76
+ });
77
+ //# sourceMappingURL=AssetsListControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","TextInput","TouchableOpacity","View","night","ASSETS_TEST_IDS","jsx","_jsx","jsxs","_jsxs","NEXT_SORT","size","name","type","AssetsListControls","query","onQueryChange","sort","onSortChange","style","styles","row","children","input","value","onChangeText","placeholder","placeholderTextColor","color","autoCapitalize","autoCorrect","testID","search","button","onPress","buttonText","toUpperCase","create","flexDirection","alignItems","gap","paddingHorizontal","paddingBottom","flex","backgroundColor","surfaceElevated","borderWidth","borderColor","border","borderRadius","paddingVertical","text","fontSize","surface","textSecondary","fontWeight","letterSpacing"],"sourceRoot":"../../../src","sources":["components/AssetsListControls.tsx"],"mappings":";;AAAA;;AAEA,SAASA,UAAU,EAAEC,IAAI,EAAEC,SAAS,EAAEC,gBAAgB,EAAEC,IAAI,QAAQ,cAAc;AAClF,SAASC,KAAK,QAAQ,oBAAoB;AAC1C,SAASC,eAAe,QAAQ,kBAAkB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAInD,MAAMC,SAAuC,GAAG;EAC9CC,IAAI,EAAE,MAAM;EACZC,IAAI,EAAE,MAAM;EACZC,IAAI,EAAE;AACR,CAAC;AASD,OAAO,SAASC,kBAAkBA,CAAC;EACjCC,KAAK;EACLC,aAAa;EACbC,IAAI;EACJC;AACuB,CAAC,EAAE;EAC1B,oBACET,KAAA,CAACN,IAAI;IAACgB,KAAK,EAAEC,MAAM,CAACC,GAAI;IAAAC,QAAA,gBACtBf,IAAA,CAACN,SAAS;MACRkB,KAAK,EAAEC,MAAM,CAACG,KAAM;MACpBC,KAAK,EAAET,KAAM;MACbU,YAAY,EAAET,aAAc;MAC5BU,WAAW,EAAC,qBAAgB;MAC5BC,oBAAoB,EAAEvB,KAAK,CAACwB,KAAK,CAACF,WAAY;MAC9CG,cAAc,EAAC,MAAM;MACrBC,WAAW,EAAE,KAAM;MACnBC,MAAM,EAAE1B,eAAe,CAAC2B;IAAO,CAChC,CAAC,eACFzB,IAAA,CAACL,gBAAgB;MACfiB,KAAK,EAAEC,MAAM,CAACa,MAAO;MACrBC,OAAO,EAAEA,CAAA,KAAMhB,YAAY,CAACR,SAAS,CAACO,IAAI,CAAC,CAAE;MAC7Cc,MAAM,EAAE1B,eAAe,CAACY,IAAK;MAAAK,QAAA,eAE7Bb,KAAA,CAACT,IAAI;QAACmB,KAAK,EAAEC,MAAM,CAACe,UAAW;QAACJ,MAAM,EAAE,GAAG1B,eAAe,CAACY,IAAI,QAAS;QAAAK,QAAA,GAAC,SACrE,EAACL,IAAI,CAACmB,WAAW,CAAC,CAAC;MAAA,CACjB;IAAC,CACS,CAAC;EAAA,CACf,CAAC;AAEX;AAEA,MAAMhB,MAAM,GAAGrB,UAAU,CAACsC,MAAM,CAAC;EAC/BhB,GAAG,EAAE;IACHiB,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE,CAAC;IACNC,iBAAiB,EAAE,EAAE;IACrBC,aAAa,EAAE;EACjB,CAAC;EACDnB,KAAK,EAAE;IACLoB,IAAI,EAAE,CAAC;IACPC,eAAe,EAAExC,KAAK,CAACwB,KAAK,CAACiB,eAAe;IAC5CC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE3C,KAAK,CAACwB,KAAK,CAACoB,MAAM;IAC/BC,YAAY,EAAE,CAAC;IACfR,iBAAiB,EAAE,EAAE;IACrBS,eAAe,EAAE,CAAC;IAClBtB,KAAK,EAAExB,KAAK,CAACwB,KAAK,CAACuB,IAAI;IACvBC,QAAQ,EAAE;EACZ,CAAC;EACDnB,MAAM,EAAE;IACNW,eAAe,EAAExC,KAAK,CAACwB,KAAK,CAACyB,OAAO;IACpCP,WAAW,EAAE,CAAC;IACdC,WAAW,EAAE3C,KAAK,CAACwB,KAAK,CAACoB,MAAM;IAC/BC,YAAY,EAAE,CAAC;IACfR,iBAAiB,EAAE,EAAE;IACrBS,eAAe,EAAE;EACnB,CAAC;EACDf,UAAU,EAAE;IACVP,KAAK,EAAExB,KAAK,CAACwB,KAAK,CAAC0B,aAAa;IAChCF,QAAQ,EAAE,EAAE;IACZG,UAAU,EAAE,KAAK;IACjBC,aAAa,EAAE;EACjB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -1 +1,373 @@
1
- "use strict";import{useEffect,useState}from"react";import{FlatList,StyleSheet,Text,TouchableOpacity,View}from"react-native";import{EventStepperFooter,JsModal,macOSColors,night,windowDragProps,ToolEmptyState}from"@buoy-gg/shared-ui";import{getScanStatus,installAssetCapture,rescan}from"../capture/install";import{formatAssetMarkdown,formatInventoryMarkdown}from"../export";import{useAssetRecords}from"../hooks/useAssetRecords";import{useAssetScanStatus}from"../hooks/useAssetScanStatus";import{remoteAssetsDispatch}from"../remote";import{clearRecords,estDecodedBytes,getRecord}from"../store/assetStore";import{getDiff,loadBaseline}from"../store/baseline";import{AssetDetail}from"./AssetDetail";import{AssetRow}from"./AssetRow";import{AssetsFilterBar}from"./AssetsFilterBar";import{AssetsHeader}from"./AssetsHeader";import{AssetsListControls}from"./AssetsListControls";import{ScanNotice}from"./ScanNotice";import{ASSETS_TEST_IDS,assetFontChipTestID}from"../utils/testIDs";import{jsxs as _jsxs,jsx as _jsx}from"react/jsx-runtime";function FontFamilies({names:e}){const t=[...new Set(e)];return t.length?_jsxs(View,{style:styles.fontsBox,testID:ASSETS_TEST_IDS.fonts,children:[_jsxs(Text,{style:styles.fontsTitle,testID:ASSETS_TEST_IDS.fontsTitle,children:["LOADED FONT FAMILIES (",t.length,")"]}),_jsx(View,{style:styles.fontsWrap,children:t.map(e=>_jsx(Text,{style:styles.fontChip,testID:assetFontChipTestID(e),children:e},e))})]}):null}function EmptyState({duplicates:e=!1}){return _jsx(ToolEmptyState,{testID:ASSETS_TEST_IDS.empty,otto:"scanning",title:e?"No duplicates found":"No assets found yet",message:e?"No assets in this view share a content hash.":"Every bundled asset — images, fonts, video, audio — appears here with sizes, scale coverage, and runtime registration status. Try Rescan after navigating around the app."})}function bySizeDesc(e,t){return(t.sizeBytes??estDecodedBytes(t))-(e.sizeBytes??estDecodedBytes(e))}const COMPARATORS={size:bySizeDesc,name:(e,t)=>e.name.localeCompare(t.name)||e.type.localeCompare(t.type),type:(e,t)=>e.type.localeCompare(t.type)||bySizeDesc(e,t)};export function AssetsModal({visible:e,onClose:t,onBack:s,onMinimize:o,persistenceKey:n,inline:i=!1}){installAssetCapture();const{records:r,stats:a,insights:l}=useAssetRecords(),c=useAssetScanStatus(),[d,p]=useState(!1);useEffect(()=>{p(!1)},[c.graphFetchInFlight,c.lastScanAt]);const u=()=>{p(!1);const e=remoteAssetsDispatch();e?e("rescan").catch(()=>p(!0)):rescan()},[h,m]=useState(null),[y,S]=useState("all"),[g,f]=useState(""),[x,A]=useState("size"),C=null!=h?getRecord(h):void 0;useEffect(()=>{if(!e)return;loadBaseline(),p(!1);const t=remoteAssetsDispatch();t?t("rescan").catch(()=>p(!0)):rescan()},[e]);const T=new Set(l.duplicates.flatMap(e=>e.ids)),w=[...r].sort(COMPARATORS[x]),D=g.trim().toLowerCase(),_=w.filter(e=>!("unused"===y&&e.loaded||"duplicates"===y&&!T.has(e.id)||"all"!==y&&"unused"!==y&&"duplicates"!==y&&e.kind!==y||D&&!`${e.name}.${e.type}`.toLowerCase().includes(D))),b=C?_.findIndex(e=>e.id===C.id):-1,j=e=>{const t=_[e];t&&m(t.id)},v={scaleGaps:new Set(l.scaleGaps),scaleAnomalies:new Set(l.scaleAnomalies),duplicates:T,webpCandidates:new Set(l.webpCandidates),overDecode:new Set(l.overDecode),heavy:new Set([...l.heavyGifs,...l.heavyFonts])};let I=0;for(const e of _){const t=e.sizeBytes??estDecodedBytes(e);t>I&&(I=t)}const F=_jsx(AssetsHeader,{stats:a,measuring:c.measuring,discovering:c.graphFetchInFlight,detailOpen:null!=C,detailIndex:b,detailTotal:_.length,onCloseDetail:()=>m(null),onClear:clearRecords,getReport:()=>C?formatAssetMarkdown(C):formatInventoryMarkdown(w,a,l,getScanStatus(),getDiff()),onBack:s}),z=_jsxs(View,C?{style:styles.detailContainer,children:[_jsx(AssetDetail,{record:C,insights:l}),b>=0?_jsx(EventStepperFooter,{currentIndex:b,totalItems:_.length,itemLabel:"Asset",onPrevious:()=>j(b-1),onNext:()=>j(b+1)}):null]}:{style:styles.listContainer,children:[_jsx(AssetsFilterBar,{stats:a,duplicateCount:T.size,filter:y,onChange:e=>{S(e),"duplicates"===e&&f("")}}),_jsx(AssetsListControls,{query:g,onQueryChange:f,sort:x,onSortChange:A}),_jsx(ScanNotice,{status:c,total:a.total,onRetry:u}),d&&!c.graphFetchInFlight?_jsxs(View,{style:styles.notice,children:[_jsx(Text,{style:styles.noticeText,children:"Couldn't request an asset scan from the device."}),_jsx(TouchableOpacity,{accessibilityRole:"button",onPress:u,children:_jsx(Text,{style:styles.retryText,children:"Retry"})})]}):null,"unused"===y?_jsx(View,{style:styles.notice,children:_jsx(Text,{style:styles.noticeText,children:"Not seen in React Native's asset registry this app run. Assets loaded through other paths may appear here; this does not prove they are unused."})}):null,"font"===y?_jsx(FontFamilies,{names:c.fontFamilies}):null,_jsx(FlatList,{testID:ASSETS_TEST_IDS.list,data:_,keyExtractor:e=>String(e.id),contentContainerStyle:styles.listContent,renderItem:({item:e})=>_jsx(AssetRow,{record:e,flags:{scaleGap:v.scaleGaps.has(e.id),scaleAnomaly:v.scaleAnomalies.has(e.id),duplicate:v.duplicates.has(e.id),webp:v.webpCandidates.has(e.id),oversize:v.overDecode.has(e.id),heavy:v.heavy.has(e.id)},sizeFraction:I>0?(e.sizeBytes??estDecodedBytes(e))/I:0,onPress:e=>m("number"==typeof e?e:null)}),ListEmptyComponent:c.graphFetchInFlight?null:_jsx(EmptyState,{duplicates:"duplicates"===y})})]});return i?_jsxs(View,{style:styles.inlineRoot,children:[_jsx(View,{style:styles.inlineHeader,...windowDragProps,children:F}),z]}):_jsx(JsModal,{visible:e,onClose:t,onMinimize:o,persistenceKey:n,header:{showToggleButton:!0,customContent:F},enablePersistence:!0,initialMode:"bottomSheet",disableScrollWrapper:!0,children:z})}export function AssetsToolView(e={}){return _jsx(AssetsModal,{...e,inline:!0,visible:!0,onClose:()=>{}})}const styles=StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:macOSColors.border.default,backgroundColor:"transparent"},listContainer:{flex:1},listContent:{paddingBottom:16},detailContainer:{flex:1},notice:{marginHorizontal:10,marginBottom:8,padding:10,borderRadius:8,borderWidth:1,borderColor:night.color.border,backgroundColor:night.color.surface,gap:4},noticeText:{color:night.color.textSecondary,fontSize:11},retryText:{color:night.color.text,fontSize:12,paddingVertical:6},fontsBox:{marginHorizontal:10,marginTop:8,padding:10,borderRadius:8,backgroundColor:night.color.surface,gap:6},fontsTitle:{color:night.color.textTertiary,fontSize:9,fontWeight:"700",letterSpacing:.5},fontsWrap:{flexDirection:"row",flexWrap:"wrap",gap:6},fontChip:{color:night.color.textSecondary,fontSize:10,backgroundColor:night.color.bg,borderRadius:999,paddingHorizontal:8,paddingVertical:3,overflow:"hidden"},empty:{alignItems:"center",padding:32,gap:8},emptyTitle:{color:night.color.text,fontSize:13,fontWeight:"600"},emptyText:{color:night.color.textSecondary,fontSize:11,textAlign:"center",lineHeight:16}});
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, TouchableOpacity, View } from "react-native";
12
+ import { EventStepperFooter, JsModal, macOSColors, night, windowDragProps, ToolEmptyState } 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 { useAssetScanStatus } from "../hooks/useAssetScanStatus";
17
+ import { remoteAssetsDispatch } from "../remote";
18
+ import { clearRecords, estDecodedBytes, getRecord } from "../store/assetStore";
19
+ import { getDiff, loadBaseline } from "../store/baseline";
20
+ import { AssetDetail } from "./AssetDetail";
21
+ import { AssetRow } from "./AssetRow";
22
+ import { AssetsFilterBar } from "./AssetsFilterBar";
23
+ import { AssetsHeader } from "./AssetsHeader";
24
+ import { AssetsListControls } from "./AssetsListControls";
25
+ import { ScanNotice } from "./ScanNotice";
26
+ import { ASSETS_TEST_IDS, assetFontChipTestID } from "../utils/testIDs";
27
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
28
+ function FontFamilies({
29
+ names
30
+ }) {
31
+ const families = [...new Set(names)];
32
+ if (!families.length) return null;
33
+ return /*#__PURE__*/_jsxs(View, {
34
+ style: styles.fontsBox,
35
+ testID: ASSETS_TEST_IDS.fonts,
36
+ children: [/*#__PURE__*/_jsxs(Text, {
37
+ style: styles.fontsTitle,
38
+ testID: ASSETS_TEST_IDS.fontsTitle,
39
+ children: ["LOADED FONT FAMILIES (", families.length, ")"]
40
+ }), /*#__PURE__*/_jsx(View, {
41
+ style: styles.fontsWrap,
42
+ children: families.map(family => /*#__PURE__*/_jsx(Text, {
43
+ style: styles.fontChip,
44
+ testID: assetFontChipTestID(family),
45
+ children: family
46
+ }, family))
47
+ })]
48
+ });
49
+ }
50
+ function EmptyState({
51
+ duplicates = false
52
+ }) {
53
+ return /*#__PURE__*/_jsx(ToolEmptyState, {
54
+ testID: ASSETS_TEST_IDS.empty
55
+ // scanning: a scan ran and found nothing — the copy says "try Rescan".
56
+ ,
57
+ otto: "scanning",
58
+ title: duplicates ? "No duplicates found" : "No assets found yet",
59
+ message: duplicates ? "No assets in this view share a content hash." : "Every bundled asset — images, fonts, video, audio — appears here with sizes, scale coverage, and runtime registration status. Try Rescan after navigating around the app."
60
+ });
61
+ }
62
+
63
+ /** Largest first — measured bytes, falling back to decoded estimate. */
64
+ function bySizeDesc(a, b) {
65
+ return (b.sizeBytes ?? estDecodedBytes(b)) - (a.sizeBytes ?? estDecodedBytes(a));
66
+ }
67
+ const COMPARATORS = {
68
+ size: bySizeDesc,
69
+ name: (a, b) => a.name.localeCompare(b.name) || a.type.localeCompare(b.type),
70
+ type: (a, b) => a.type.localeCompare(b.type) || bySizeDesc(a, b)
71
+ };
72
+ export function AssetsModal({
73
+ visible,
74
+ onClose,
75
+ onBack,
76
+ onMinimize,
77
+ persistenceKey,
78
+ inline = false
79
+ }) {
80
+ // Safety net: the index import normally installed this already.
81
+ installAssetCapture();
82
+ const {
83
+ records,
84
+ stats,
85
+ insights
86
+ } = useAssetRecords();
87
+ const status = useAssetScanStatus();
88
+ const [remoteError, setRemoteError] = useState(false);
89
+ useEffect(() => {
90
+ setRemoteError(false);
91
+ }, [status.graphFetchInFlight, status.lastScanAt]);
92
+ const retry = () => {
93
+ setRemoteError(false);
94
+ const remote = remoteAssetsDispatch();
95
+ if (remote) void remote("rescan").catch(() => setRemoteError(true));else void rescan();
96
+ };
97
+ const [selectedId, setSelectedId] = useState(null);
98
+ const [filter, setFilter] = useState("all");
99
+ const [query, setQuery] = useState("");
100
+ const [sort, setSort] = useState("size");
101
+ const selected = selectedId != null ? getRecord(selectedId) : undefined;
102
+
103
+ // Full scan on open — locally on device, forwarded on dashboard mirrors.
104
+ // The baseline load is async and re-renders through the store emit.
105
+ useEffect(() => {
106
+ if (!visible) return;
107
+ void loadBaseline();
108
+ setRemoteError(false);
109
+ const remote = remoteAssetsDispatch();
110
+ if (remote) {
111
+ remote("rescan").catch(() => setRemoteError(true));
112
+ } else {
113
+ void rescan();
114
+ }
115
+ }, [visible]);
116
+ const duplicateIds = new Set(insights.duplicates.flatMap(group => group.ids));
117
+ const sorted = [...records].sort(COMPARATORS[sort]);
118
+ const trimmedQuery = query.trim().toLowerCase();
119
+ const filtered = sorted.filter(r => {
120
+ if (filter === "unused" && r.loaded) return false;
121
+ if (filter === "duplicates" && !duplicateIds.has(r.id)) return false;
122
+ if (filter !== "all" && filter !== "unused" && filter !== "duplicates" && r.kind !== filter) return false;
123
+ if (trimmedQuery && !`${r.name}.${r.type}`.toLowerCase().includes(trimmedQuery)) {
124
+ return false;
125
+ }
126
+ return true;
127
+ });
128
+ const selectedIndex = selected ? filtered.findIndex(r => r.id === selected.id) : -1;
129
+ const stepTo = index => {
130
+ const target = filtered[index];
131
+ if (target) setSelectedId(target.id);
132
+ };
133
+
134
+ // Set lookups so each row's badge checks are O(1).
135
+ const flagSets = {
136
+ scaleGaps: new Set(insights.scaleGaps),
137
+ scaleAnomalies: new Set(insights.scaleAnomalies),
138
+ duplicates: duplicateIds,
139
+ webpCandidates: new Set(insights.webpCandidates),
140
+ overDecode: new Set(insights.overDecode),
141
+ heavy: new Set([...insights.heavyGifs, ...insights.heavyFonts])
142
+ };
143
+
144
+ // The proportional size bar is relative to the largest asset in view.
145
+ let maxBytes = 0;
146
+ for (const r of filtered) {
147
+ const bytes = r.sizeBytes ?? estDecodedBytes(r);
148
+ if (bytes > maxBytes) maxBytes = bytes;
149
+ }
150
+ const getReport = () => selected ? formatAssetMarkdown(selected) : formatInventoryMarkdown(sorted, stats, insights, getScanStatus(), getDiff());
151
+ const headerContent = /*#__PURE__*/_jsx(AssetsHeader, {
152
+ stats: stats,
153
+ measuring: status.measuring,
154
+ discovering: status.graphFetchInFlight,
155
+ detailOpen: selected != null,
156
+ detailIndex: selectedIndex,
157
+ detailTotal: filtered.length,
158
+ onCloseDetail: () => setSelectedId(null),
159
+ onClear: clearRecords,
160
+ getReport: getReport,
161
+ onBack: onBack
162
+ });
163
+ const body = selected ? /*#__PURE__*/_jsxs(View, {
164
+ style: styles.detailContainer,
165
+ children: [/*#__PURE__*/_jsx(AssetDetail, {
166
+ record: selected,
167
+ insights: insights
168
+ }), selectedIndex >= 0 ? /*#__PURE__*/_jsx(EventStepperFooter, {
169
+ currentIndex: selectedIndex,
170
+ totalItems: filtered.length,
171
+ itemLabel: "Asset",
172
+ onPrevious: () => stepTo(selectedIndex - 1),
173
+ onNext: () => stepTo(selectedIndex + 1)
174
+ }) : null]
175
+ }) : /*#__PURE__*/_jsxs(View, {
176
+ style: styles.listContainer,
177
+ children: [/*#__PURE__*/_jsx(AssetsFilterBar, {
178
+ stats: stats,
179
+ duplicateCount: duplicateIds.size,
180
+ filter: filter,
181
+ onChange: next => {
182
+ setFilter(next);
183
+ if (next === "duplicates") setQuery("");
184
+ }
185
+ }), /*#__PURE__*/_jsx(AssetsListControls, {
186
+ query: query,
187
+ onQueryChange: setQuery,
188
+ sort: sort,
189
+ onSortChange: setSort
190
+ }), /*#__PURE__*/_jsx(ScanNotice, {
191
+ status: status,
192
+ total: stats.total,
193
+ onRetry: retry
194
+ }), remoteError && !status.graphFetchInFlight ? /*#__PURE__*/_jsxs(View, {
195
+ style: styles.notice,
196
+ children: [/*#__PURE__*/_jsx(Text, {
197
+ style: styles.noticeText,
198
+ children: "Couldn't request an asset scan from the device."
199
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
200
+ accessibilityRole: "button",
201
+ onPress: retry,
202
+ children: /*#__PURE__*/_jsx(Text, {
203
+ style: styles.retryText,
204
+ children: "Retry"
205
+ })
206
+ })]
207
+ }) : null, filter === "unused" ? /*#__PURE__*/_jsx(View, {
208
+ style: styles.notice,
209
+ children: /*#__PURE__*/_jsx(Text, {
210
+ style: styles.noticeText,
211
+ children: "Not seen in React Native's asset registry this app run. Assets loaded through other paths may appear here; this does not prove they are unused."
212
+ })
213
+ }) : null, filter === "font" ? /*#__PURE__*/_jsx(FontFamilies, {
214
+ names: status.fontFamilies
215
+ }) : null, /*#__PURE__*/_jsx(FlatList, {
216
+ testID: ASSETS_TEST_IDS.list,
217
+ data: filtered,
218
+ keyExtractor: item => String(item.id),
219
+ contentContainerStyle: styles.listContent,
220
+ renderItem: ({
221
+ item
222
+ }) => /*#__PURE__*/_jsx(AssetRow, {
223
+ record: item,
224
+ flags: {
225
+ scaleGap: flagSets.scaleGaps.has(item.id),
226
+ scaleAnomaly: flagSets.scaleAnomalies.has(item.id),
227
+ duplicate: flagSets.duplicates.has(item.id),
228
+ webp: flagSets.webpCandidates.has(item.id),
229
+ oversize: flagSets.overDecode.has(item.id),
230
+ heavy: flagSets.heavy.has(item.id)
231
+ },
232
+ sizeFraction: maxBytes > 0 ? (item.sizeBytes ?? estDecodedBytes(item)) / maxBytes : 0
233
+ // Guarded: programmatic invocations (automation) can call this
234
+ // with an event object instead of an id.
235
+ ,
236
+ onPress: id => setSelectedId(typeof id === "number" ? id : null)
237
+ }),
238
+ ListEmptyComponent: status.graphFetchInFlight ? null : /*#__PURE__*/_jsx(EmptyState, {
239
+ duplicates: filter === "duplicates"
240
+ })
241
+ })]
242
+ });
243
+
244
+ // The ONLY difference between phone and desktop is which shell the header
245
+ // and body go in (same pattern as ImagesModal).
246
+ if (inline) {
247
+ return /*#__PURE__*/_jsxs(View, {
248
+ style: styles.inlineRoot,
249
+ children: [/*#__PURE__*/_jsx(View, {
250
+ style: styles.inlineHeader,
251
+ ...windowDragProps,
252
+ children: headerContent
253
+ }), body]
254
+ });
255
+ }
256
+ return /*#__PURE__*/_jsx(JsModal, {
257
+ visible: visible,
258
+ onClose: onClose,
259
+ onMinimize: onMinimize,
260
+ persistenceKey: persistenceKey,
261
+ header: {
262
+ showToggleButton: true,
263
+ customContent: headerContent
264
+ },
265
+ enablePersistence: true,
266
+ initialMode: "bottomSheet",
267
+ disableScrollWrapper: true,
268
+ children: body
269
+ });
270
+ }
271
+
272
+ /**
273
+ * The same Assets tool rendered INLINE for hosts that place tools in a panel
274
+ * rather than a modal (the desktop dashboard). One implementation only.
275
+ */
276
+ export function AssetsToolView(props = {}) {
277
+ return /*#__PURE__*/_jsx(AssetsModal, {
278
+ ...props,
279
+ inline: true,
280
+ visible: true,
281
+ onClose: () => {}
282
+ });
283
+ }
284
+ const styles = StyleSheet.create({
285
+ inlineRoot: {
286
+ flex: 1,
287
+ minHeight: 0,
288
+ // Transparent so the desktop workbench's hoisted sky (one field spanning
289
+ // sidebar + panel) shows through — the shell paints its base beneath it.
290
+ backgroundColor: "transparent"
291
+ },
292
+ inlineHeader: {
293
+ paddingHorizontal: 12,
294
+ paddingVertical: 8,
295
+ borderBottomWidth: 1,
296
+ borderBottomColor: macOSColors.border.default,
297
+ // Clear, like Bench — the host's hoisted sky shows through the header.
298
+ backgroundColor: "transparent"
299
+ },
300
+ listContainer: {
301
+ flex: 1
302
+ },
303
+ listContent: {
304
+ paddingBottom: 16
305
+ },
306
+ detailContainer: {
307
+ flex: 1
308
+ },
309
+ notice: {
310
+ marginHorizontal: 10,
311
+ marginBottom: 8,
312
+ padding: 10,
313
+ borderRadius: 8,
314
+ borderWidth: 1,
315
+ borderColor: night.color.border,
316
+ backgroundColor: night.color.surface,
317
+ gap: 4
318
+ },
319
+ noticeText: {
320
+ color: night.color.textSecondary,
321
+ fontSize: 11
322
+ },
323
+ retryText: {
324
+ color: night.color.text,
325
+ fontSize: 12,
326
+ paddingVertical: 6
327
+ },
328
+ fontsBox: {
329
+ marginHorizontal: 10,
330
+ marginTop: 8,
331
+ padding: 10,
332
+ borderRadius: 8,
333
+ backgroundColor: night.color.surface,
334
+ gap: 6
335
+ },
336
+ fontsTitle: {
337
+ color: night.color.textTertiary,
338
+ fontSize: 9,
339
+ fontWeight: "700",
340
+ letterSpacing: 0.5
341
+ },
342
+ fontsWrap: {
343
+ flexDirection: "row",
344
+ flexWrap: "wrap",
345
+ gap: 6
346
+ },
347
+ fontChip: {
348
+ color: night.color.textSecondary,
349
+ fontSize: 10,
350
+ backgroundColor: night.color.bg,
351
+ borderRadius: 999,
352
+ paddingHorizontal: 8,
353
+ paddingVertical: 3,
354
+ overflow: "hidden"
355
+ },
356
+ empty: {
357
+ alignItems: "center",
358
+ padding: 32,
359
+ gap: 8
360
+ },
361
+ emptyTitle: {
362
+ color: night.color.text,
363
+ fontSize: 13,
364
+ fontWeight: "600"
365
+ },
366
+ emptyText: {
367
+ color: night.color.textSecondary,
368
+ fontSize: 11,
369
+ textAlign: "center",
370
+ lineHeight: 16
371
+ }
372
+ });
373
+ //# sourceMappingURL=AssetsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useState","FlatList","StyleSheet","Text","TouchableOpacity","View","EventStepperFooter","JsModal","macOSColors","night","windowDragProps","ToolEmptyState","getScanStatus","installAssetCapture","rescan","formatAssetMarkdown","formatInventoryMarkdown","useAssetRecords","useAssetScanStatus","remoteAssetsDispatch","clearRecords","estDecodedBytes","getRecord","getDiff","loadBaseline","AssetDetail","AssetRow","AssetsFilterBar","AssetsHeader","AssetsListControls","ScanNotice","ASSETS_TEST_IDS","assetFontChipTestID","jsxs","_jsxs","jsx","_jsx","FontFamilies","names","families","Set","length","style","styles","fontsBox","testID","fonts","children","fontsTitle","fontsWrap","map","family","fontChip","EmptyState","duplicates","empty","otto","title","message","bySizeDesc","a","b","sizeBytes","COMPARATORS","size","name","localeCompare","type","AssetsModal","visible","onClose","onBack","onMinimize","persistenceKey","inline","records","stats","insights","status","remoteError","setRemoteError","graphFetchInFlight","lastScanAt","retry","remote","catch","selectedId","setSelectedId","filter","setFilter","query","setQuery","sort","setSort","selected","undefined","duplicateIds","flatMap","group","ids","sorted","trimmedQuery","trim","toLowerCase","filtered","r","loaded","has","id","kind","includes","selectedIndex","findIndex","stepTo","index","target","flagSets","scaleGaps","scaleAnomalies","webpCandidates","overDecode","heavy","heavyGifs","heavyFonts","maxBytes","bytes","getReport","headerContent","measuring","discovering","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","body","detailContainer","record","currentIndex","totalItems","itemLabel","onPrevious","onNext","listContainer","duplicateCount","onChange","next","onQueryChange","onSortChange","total","onRetry","notice","noticeText","accessibilityRole","onPress","retryText","fontFamilies","list","data","keyExtractor","item","String","contentContainerStyle","listContent","renderItem","flags","scaleGap","scaleAnomaly","duplicate","webp","oversize","sizeFraction","ListEmptyComponent","inlineRoot","inlineHeader","header","showToggleButton","customContent","enablePersistence","initialMode","disableScrollWrapper","AssetsToolView","props","create","flex","minHeight","backgroundColor","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","border","default","paddingBottom","marginHorizontal","marginBottom","padding","borderRadius","borderWidth","borderColor","color","surface","gap","textSecondary","fontSize","text","marginTop","textTertiary","fontWeight","letterSpacing","flexDirection","flexWrap","bg","overflow","alignItems","emptyTitle","emptyText","textAlign","lineHeight"],"sourceRoot":"../../../src","sources":["components/AssetsModal.tsx"],"mappings":"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","ignoreList":[]}