@buoy-gg/assets 7.0.36 → 7.0.39

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 (127) hide show
  1. package/README.md +41 -12
  2. package/lib/commonjs/capture/expo.js +1 -1
  3. package/lib/commonjs/capture/expo.js.map +1 -1
  4. package/lib/commonjs/capture/install.js +13 -0
  5. package/lib/commonjs/capture/install.js.map +1 -1
  6. package/lib/commonjs/capture/isBuoyAsset.js +23 -0
  7. package/lib/commonjs/capture/isBuoyAsset.js.map +1 -0
  8. package/lib/commonjs/capture/metroGraph.js +36 -9
  9. package/lib/commonjs/capture/metroGraph.js.map +1 -1
  10. package/lib/commonjs/capture/registry.js.map +1 -1
  11. package/lib/commonjs/components/AssetDetail.js +8 -11
  12. package/lib/commonjs/components/AssetDetail.js.map +1 -1
  13. package/lib/commonjs/components/AssetImage.js +66 -0
  14. package/lib/commonjs/components/AssetImage.js.map +1 -0
  15. package/lib/commonjs/components/AssetRow.js +5 -6
  16. package/lib/commonjs/components/AssetRow.js.map +1 -1
  17. package/lib/commonjs/components/AssetsFilterBar.js +10 -1
  18. package/lib/commonjs/components/AssetsFilterBar.js.map +1 -1
  19. package/lib/commonjs/components/AssetsHeader.js +4 -3
  20. package/lib/commonjs/components/AssetsHeader.js.map +1 -1
  21. package/lib/commonjs/components/AssetsListControls.js +3 -18
  22. package/lib/commonjs/components/AssetsListControls.js.map +1 -1
  23. package/lib/commonjs/components/AssetsModal.js +69 -38
  24. package/lib/commonjs/components/AssetsModal.js.map +1 -1
  25. package/lib/commonjs/components/ScanNotice.js +85 -0
  26. package/lib/commonjs/components/ScanNotice.js.map +1 -0
  27. package/lib/commonjs/components/optionalExpoImage.js +16 -0
  28. package/lib/commonjs/components/optionalExpoImage.js.map +1 -0
  29. package/lib/commonjs/components/optionalExpoImage.web.js +11 -0
  30. package/lib/commonjs/components/optionalExpoImage.web.js.map +1 -0
  31. package/lib/commonjs/export.js +3 -3
  32. package/lib/commonjs/export.js.map +1 -1
  33. package/lib/commonjs/hooks/useAssetScanStatus.js +28 -0
  34. package/lib/commonjs/hooks/useAssetScanStatus.js.map +1 -0
  35. package/lib/commonjs/remote.js +5 -2
  36. package/lib/commonjs/remote.js.map +1 -1
  37. package/lib/commonjs/state.js.map +1 -1
  38. package/lib/commonjs/store/assetStore.js +15 -0
  39. package/lib/commonjs/store/assetStore.js.map +1 -1
  40. package/lib/commonjs/store/baseline.js +2 -0
  41. package/lib/commonjs/store/baseline.js.map +1 -1
  42. package/lib/commonjs/utils/testIDs.js +2 -6
  43. package/lib/commonjs/utils/testIDs.js.map +1 -1
  44. package/lib/module/capture/expo.js +1 -1
  45. package/lib/module/capture/expo.js.map +1 -1
  46. package/lib/module/capture/install.js +14 -1
  47. package/lib/module/capture/install.js.map +1 -1
  48. package/lib/module/capture/isBuoyAsset.js +18 -0
  49. package/lib/module/capture/isBuoyAsset.js.map +1 -0
  50. package/lib/module/capture/metroGraph.js +36 -9
  51. package/lib/module/capture/metroGraph.js.map +1 -1
  52. package/lib/module/capture/registry.js.map +1 -1
  53. package/lib/module/components/AssetDetail.js +9 -12
  54. package/lib/module/components/AssetDetail.js.map +1 -1
  55. package/lib/module/components/AssetImage.js +62 -0
  56. package/lib/module/components/AssetImage.js.map +1 -0
  57. package/lib/module/components/AssetRow.js +6 -7
  58. package/lib/module/components/AssetRow.js.map +1 -1
  59. package/lib/module/components/AssetsFilterBar.js +10 -1
  60. package/lib/module/components/AssetsFilterBar.js.map +1 -1
  61. package/lib/module/components/AssetsHeader.js +4 -3
  62. package/lib/module/components/AssetsHeader.js.map +1 -1
  63. package/lib/module/components/AssetsListControls.js +3 -18
  64. package/lib/module/components/AssetsListControls.js.map +1 -1
  65. package/lib/module/components/AssetsModal.js +71 -40
  66. package/lib/module/components/AssetsModal.js.map +1 -1
  67. package/lib/module/components/ScanNotice.js +81 -0
  68. package/lib/module/components/ScanNotice.js.map +1 -0
  69. package/lib/module/components/optionalExpoImage.js +12 -0
  70. package/lib/module/components/optionalExpoImage.js.map +1 -0
  71. package/lib/module/components/optionalExpoImage.web.js +7 -0
  72. package/lib/module/components/optionalExpoImage.web.js.map +1 -0
  73. package/lib/module/export.js +3 -3
  74. package/lib/module/export.js.map +1 -1
  75. package/lib/module/hooks/useAssetScanStatus.js +23 -0
  76. package/lib/module/hooks/useAssetScanStatus.js.map +1 -0
  77. package/lib/module/remote.js +5 -2
  78. package/lib/module/remote.js.map +1 -1
  79. package/lib/module/state.js.map +1 -1
  80. package/lib/module/store/assetStore.js +14 -0
  81. package/lib/module/store/assetStore.js.map +1 -1
  82. package/lib/module/store/baseline.js +2 -0
  83. package/lib/module/store/baseline.js.map +1 -1
  84. package/lib/module/utils/testIDs.js +2 -6
  85. package/lib/module/utils/testIDs.js.map +1 -1
  86. package/lib/typescript/capture/install.d.ts.map +1 -1
  87. package/lib/typescript/capture/isBuoyAsset.d.ts +9 -0
  88. package/lib/typescript/capture/isBuoyAsset.d.ts.map +1 -0
  89. package/lib/typescript/capture/metroGraph.d.ts.map +1 -1
  90. package/lib/typescript/capture/registry.d.ts +1 -1
  91. package/lib/typescript/capture/registry.d.ts.map +1 -1
  92. package/lib/typescript/components/AssetDetail.d.ts +2 -2
  93. package/lib/typescript/components/AssetDetail.d.ts.map +1 -1
  94. package/lib/typescript/components/AssetImage.d.ts +9 -0
  95. package/lib/typescript/components/AssetImage.d.ts.map +1 -0
  96. package/lib/typescript/components/AssetRow.d.ts.map +1 -1
  97. package/lib/typescript/components/AssetsFilterBar.d.ts +3 -2
  98. package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -1
  99. package/lib/typescript/components/AssetsHeader.d.ts +2 -1
  100. package/lib/typescript/components/AssetsHeader.d.ts.map +1 -1
  101. package/lib/typescript/components/AssetsListControls.d.ts +2 -9
  102. package/lib/typescript/components/AssetsListControls.d.ts.map +1 -1
  103. package/lib/typescript/components/AssetsModal.d.ts.map +1 -1
  104. package/lib/typescript/components/ScanNotice.d.ts +7 -0
  105. package/lib/typescript/components/ScanNotice.d.ts.map +1 -0
  106. package/lib/typescript/components/optionalExpoImage.d.ts +13 -0
  107. package/lib/typescript/components/optionalExpoImage.d.ts.map +1 -0
  108. package/lib/typescript/components/optionalExpoImage.web.d.ts +3 -0
  109. package/lib/typescript/components/optionalExpoImage.web.d.ts.map +1 -0
  110. package/lib/typescript/hooks/useAssetScanStatus.d.ts +6 -0
  111. package/lib/typescript/hooks/useAssetScanStatus.d.ts.map +1 -0
  112. package/lib/typescript/state.d.ts +2 -0
  113. package/lib/typescript/state.d.ts.map +1 -1
  114. package/lib/typescript/store/assetStore.d.ts +3 -1
  115. package/lib/typescript/store/assetStore.d.ts.map +1 -1
  116. package/lib/typescript/store/baseline.d.ts.map +1 -1
  117. package/lib/typescript/types.d.ts +3 -0
  118. package/lib/typescript/types.d.ts.map +1 -1
  119. package/lib/typescript/utils/testIDs.d.ts +2 -5
  120. package/lib/typescript/utils/testIDs.d.ts.map +1 -1
  121. package/package.json +7 -3
  122. package/lib/commonjs/components/BaselineBar.js +0 -115
  123. package/lib/commonjs/components/BaselineBar.js.map +0 -1
  124. package/lib/module/components/BaselineBar.js +0 -111
  125. package/lib/module/components/BaselineBar.js.map +0 -1
  126. package/lib/typescript/components/BaselineBar.d.ts +0 -13
  127. package/lib/typescript/components/BaselineBar.d.ts.map +0 -1
@@ -1,111 +0,0 @@
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, night } from "@buoy-gg/shared-ui";
14
- import { formatBytes } from "../format";
15
- import { clearBaseline, saveBaseline } from "../store/baseline";
16
- import { ASSETS_TEST_IDS } from "../utils/testIDs";
17
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
- function formatAge(savedAt) {
19
- const minutes = Math.max(1, Math.round((Date.now() - savedAt) / 60000));
20
- if (minutes < 60) return `${minutes}m ago`;
21
- const hours = Math.round(minutes / 60);
22
- if (hours < 48) return `${hours}h ago`;
23
- return `${Math.round(hours / 24)}d ago`;
24
- }
25
- export function BaselineBar({
26
- diff
27
- }) {
28
- // No baseline → no bar; the BASE button in AssetsListControls creates one.
29
- if (!diff) return null;
30
- const parts = [];
31
- if (diff.added.length) parts.push(`+${diff.added.length} new`);
32
- if (diff.removed.length) parts.push(`${diff.removed.length} removed`);
33
- if (diff.grown.length) parts.push(`${diff.grown.length} grew`);
34
- const net = diff.netBytes != null && Math.abs(diff.netBytes) >= 1024 ? `${diff.netBytes > 0 ? "+" : "−"}${formatBytes(Math.abs(diff.netBytes))}` : null;
35
- const changed = parts.length > 0 || net != null;
36
- const netColor = diff.netBytes != null && diff.netBytes > 0 ? macOSColors.semantic.warning : macOSColors.semantic.success;
37
- return /*#__PURE__*/_jsxs(View, {
38
- style: styles.bar,
39
- testID: ASSETS_TEST_IDS.baseline,
40
- children: [/*#__PURE__*/_jsxs(Text, {
41
- style: styles.summary,
42
- numberOfLines: 1,
43
- testID: ASSETS_TEST_IDS.baselineSummary,
44
- children: [changed ? parts.join(" · ") : "No changes", net ? " · " : "", net ? /*#__PURE__*/_jsx(Text, {
45
- style: {
46
- color: netColor
47
- },
48
- children: net
49
- }) : null, /*#__PURE__*/_jsxs(Text, {
50
- style: styles.age,
51
- children: [" vs ", formatAge(diff.baselineSavedAt)]
52
- })]
53
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
54
- style: styles.button,
55
- testID: ASSETS_TEST_IDS.baselineUpdate,
56
- onPress: () => void saveBaseline(),
57
- children: /*#__PURE__*/_jsx(Text, {
58
- style: styles.buttonText,
59
- children: "UPDATE"
60
- })
61
- }), /*#__PURE__*/_jsx(TouchableOpacity, {
62
- style: styles.button,
63
- testID: ASSETS_TEST_IDS.baselineClear,
64
- onPress: () => void clearBaseline(),
65
- children: /*#__PURE__*/_jsx(Text, {
66
- style: styles.buttonText,
67
- children: "\u2715"
68
- })
69
- })]
70
- });
71
- }
72
- const styles = StyleSheet.create({
73
- bar: {
74
- flexDirection: "row",
75
- alignItems: "center",
76
- gap: 8,
77
- marginHorizontal: 10,
78
- marginBottom: 8,
79
- paddingHorizontal: 10,
80
- paddingVertical: 6,
81
- borderWidth: 1,
82
- borderColor: night.color.border,
83
- borderRadius: 8,
84
- backgroundColor: night.color.surface
85
- },
86
- summary: {
87
- flex: 1,
88
- color: night.color.textSecondary,
89
- fontSize: 10,
90
- fontWeight: "600"
91
- },
92
- age: {
93
- color: night.color.textTertiary,
94
- fontWeight: "400"
95
- },
96
- button: {
97
- backgroundColor: night.color.surfaceElevated,
98
- borderWidth: 1,
99
- borderColor: night.color.border,
100
- borderRadius: 6,
101
- paddingHorizontal: 8,
102
- paddingVertical: 5
103
- },
104
- buttonText: {
105
- color: night.color.textSecondary,
106
- fontSize: 9,
107
- fontWeight: "700",
108
- letterSpacing: 0.5
109
- }
110
- });
111
- //# sourceMappingURL=BaselineBar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["StyleSheet","Text","TouchableOpacity","View","macOSColors","night","formatBytes","clearBaseline","saveBaseline","ASSETS_TEST_IDS","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","testID","baseline","children","summary","numberOfLines","baselineSummary","join","color","age","baselineSavedAt","button","baselineUpdate","onPress","buttonText","baselineClear","create","flexDirection","alignItems","gap","marginHorizontal","marginBottom","paddingHorizontal","paddingVertical","borderWidth","borderColor","border","borderRadius","backgroundColor","surface","flex","textSecondary","fontSize","fontWeight","textTertiary","surfaceElevated","letterSpacing"],"sourceRoot":"../../../src","sources":["components/BaselineBar.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,13 +0,0 @@
1
- /**
2
- * BaselineBar — save/compare-against-baseline controls.
3
- *
4
- * No baseline: one "SAVE BASELINE" button. With a baseline: the diff summary
5
- * ("+3 new · 1 removed · +1.2 MB since 2h ago") plus UPDATE and ✕ (clear).
6
- * Growth renders in warning color, shrinkage in success — that's the whole
7
- * point of the feature.
8
- */
9
- import type { AssetsDiff } from "../types";
10
- export declare function BaselineBar({ diff }: {
11
- diff: AssetsDiff | null;
12
- }): import("react").JSX.Element | null;
13
- //# sourceMappingURL=BaselineBar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaselineBar.d.ts","sourceRoot":"","sources":["../../../src/components/BaselineBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAU3C,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,sCA8ChE"}