@dxos/plugin-debug 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731

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 (233) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +373 -0
  3. package/README.md +1 -1
  4. package/dist/lib/{browser/DebugGraph-7HXJ2PS2.mjs → neutral/DebugGraph-G4FWS57E.mjs} +4 -5
  5. package/dist/lib/neutral/DebugGraph-G4FWS57E.mjs.map +7 -0
  6. package/dist/lib/neutral/DebugObjectPanel-OS65NC4M.mjs +59 -0
  7. package/dist/lib/neutral/DebugObjectPanel-OS65NC4M.mjs.map +7 -0
  8. package/dist/lib/neutral/DebugPlugin.mjs +59 -0
  9. package/dist/lib/neutral/DebugPlugin.mjs.map +7 -0
  10. package/dist/lib/neutral/DebugPlugin.node.mjs +18 -0
  11. package/dist/lib/neutral/DebugPlugin.node.mjs.map +7 -0
  12. package/dist/lib/neutral/DebugPlugin.workerd.mjs +12 -0
  13. package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +7 -0
  14. package/dist/lib/neutral/DebugSettings-RKYNQIKH.mjs +223 -0
  15. package/dist/lib/neutral/DebugSettings-RKYNQIKH.mjs.map +7 -0
  16. package/dist/lib/{browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs → neutral/DebugSpaceObjectsPanel-BHOCFWDJ.mjs} +10 -26
  17. package/dist/lib/neutral/DebugSpaceObjectsPanel-BHOCFWDJ.mjs.map +7 -0
  18. package/dist/lib/{browser/DebugStatus-COQGH37G.mjs → neutral/DebugStatus-H2BAHN26.mjs} +36 -39
  19. package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs.map +7 -0
  20. package/dist/lib/{browser/DevtoolsOverviewContainer-C75NFVER.mjs → neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs} +9 -6
  21. package/dist/lib/neutral/DevtoolsOverviewContainer-YX7Z3D2H.mjs.map +7 -0
  22. package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs +177 -0
  23. package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs.map +7 -0
  24. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs +161 -0
  25. package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs.map +7 -0
  26. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs +146 -0
  27. package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs.map +7 -0
  28. package/dist/lib/{browser/Wireframe-KAGOKEFW.mjs → neutral/Wireframe-WD7S2AUU.mjs} +9 -10
  29. package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs.map +7 -0
  30. package/dist/lib/{browser/app-graph-builder-LGUQNXHD.mjs → neutral/app-graph-builder-XYLTBYKN.mjs} +246 -259
  31. package/dist/lib/neutral/app-graph-builder-XYLTBYKN.mjs.map +7 -0
  32. package/dist/lib/neutral/capabilities/index.mjs +15 -0
  33. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-HOV6MV5B.mjs +43 -0
  35. package/dist/lib/neutral/chunk-HOV6MV5B.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  37. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  38. package/dist/lib/{browser/chunk-4UFQXPP7.mjs → neutral/chunk-UAAGABXZ.mjs} +24 -12
  39. package/dist/lib/neutral/chunk-UAAGABXZ.mjs.map +7 -0
  40. package/dist/lib/{browser/SpaceGenerator-SWSGJEEL.mjs → neutral/components/index.mjs} +90 -292
  41. package/dist/lib/neutral/components/index.mjs.map +7 -0
  42. package/dist/lib/neutral/containers/index.mjs +25 -0
  43. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  44. package/dist/lib/neutral/index.mjs +18 -0
  45. package/dist/lib/neutral/index.mjs.map +7 -0
  46. package/dist/lib/neutral/meta.json +1 -0
  47. package/dist/lib/neutral/meta.mjs +8 -0
  48. package/dist/lib/neutral/meta.mjs.map +7 -0
  49. package/dist/lib/neutral/plugin.mjs +12 -0
  50. package/dist/lib/neutral/plugin.mjs.map +7 -0
  51. package/dist/lib/{browser/react-context-I3USIAF6.mjs → neutral/react-context-MUZ3KVLU.mjs} +6 -6
  52. package/dist/lib/neutral/react-context-MUZ3KVLU.mjs.map +7 -0
  53. package/dist/lib/{browser/react-surface-BTVNKKVQ.mjs → neutral/react-surface-3MDMZGCA.mjs} +162 -180
  54. package/dist/lib/neutral/react-surface-3MDMZGCA.mjs.map +7 -0
  55. package/dist/lib/{browser/settings-SLTQJJNF.mjs → neutral/settings-MPM6YUP4.mjs} +7 -11
  56. package/dist/lib/neutral/settings-MPM6YUP4.mjs.map +7 -0
  57. package/dist/lib/neutral/translations.mjs +91 -0
  58. package/dist/lib/neutral/translations.mjs.map +7 -0
  59. package/dist/lib/neutral/types/index.mjs +14 -0
  60. package/dist/lib/neutral/types/index.mjs.map +7 -0
  61. package/dist/types/src/DebugPlugin.d.ts +2 -5
  62. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  63. package/dist/types/src/DebugPlugin.node.d.ts +5 -0
  64. package/dist/types/src/DebugPlugin.node.d.ts.map +1 -0
  65. package/dist/types/src/DebugPlugin.test.d.ts +2 -0
  66. package/dist/types/src/DebugPlugin.test.d.ts.map +1 -0
  67. package/dist/types/src/DebugPlugin.workerd.d.ts +5 -0
  68. package/dist/types/src/DebugPlugin.workerd.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/index.d.ts +11 -4
  71. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +2 -2
  74. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +2 -1
  76. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  77. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts +11 -0
  78. package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -0
  79. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +106 -0
  80. package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -0
  81. package/dist/types/src/components/DebugSettings/index.d.ts +2 -0
  82. package/dist/types/src/components/DebugSettings/index.d.ts.map +1 -0
  83. package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
  84. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +3 -4
  85. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  86. package/dist/types/src/components/SpaceGenerator/draw-util.d.ts.map +1 -1
  87. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
  88. package/dist/types/src/components/index.d.ts +2 -0
  89. package/dist/types/src/components/index.d.ts.map +1 -1
  90. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts +2 -2
  91. package/dist/types/src/containers/DebugGraph/DebugGraph.d.ts.map +1 -1
  92. package/dist/types/src/containers/DebugGraph/index.d.ts +1 -2
  93. package/dist/types/src/containers/DebugGraph/index.d.ts.map +1 -1
  94. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +3 -4
  95. package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
  96. package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -2
  97. package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
  98. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +3 -1
  99. package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
  100. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -2
  101. package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
  103. package/dist/types/src/containers/DebugStatus/index.d.ts +1 -2
  104. package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
  105. package/dist/types/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.d.ts.map +1 -1
  106. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts +1 -2
  107. package/dist/types/src/containers/DevtoolsOverviewContainer/index.d.ts.map +1 -1
  108. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +15 -0
  109. package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +1 -0
  110. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +106 -0
  111. package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +1 -0
  112. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +3 -0
  113. package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +1 -0
  114. package/dist/types/src/containers/GithubPanel/index.d.ts +2 -0
  115. package/dist/types/src/containers/GithubPanel/index.d.ts.map +1 -0
  116. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +3 -0
  117. package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +1 -0
  118. package/dist/types/src/containers/RegistryPanel/index.d.ts +2 -0
  119. package/dist/types/src/containers/RegistryPanel/index.d.ts.map +1 -0
  120. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts +3 -1
  121. package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  122. package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -2
  123. package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
  124. package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
  125. package/dist/types/src/containers/Wireframe/index.d.ts +1 -2
  126. package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
  127. package/dist/types/src/containers/index.d.ts +2 -1
  128. package/dist/types/src/containers/index.d.ts.map +1 -1
  129. package/dist/types/src/index.d.ts +1 -1
  130. package/dist/types/src/index.d.ts.map +1 -1
  131. package/dist/types/src/meta.d.ts +1 -1
  132. package/dist/types/src/meta.d.ts.map +1 -1
  133. package/dist/types/src/plugin.d.ts +4 -0
  134. package/dist/types/src/plugin.d.ts.map +1 -0
  135. package/dist/types/src/translations.d.ts +87 -61
  136. package/dist/types/src/translations.d.ts.map +1 -1
  137. package/dist/types/src/types/Settings.d.ts +8 -0
  138. package/dist/types/src/types/Settings.d.ts.map +1 -0
  139. package/dist/types/src/types/index.d.ts +70 -0
  140. package/dist/types/src/types/index.d.ts.map +1 -0
  141. package/dist/types/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +112 -71
  143. package/src/DebugPlugin.node.ts +18 -0
  144. package/src/DebugPlugin.test.ts +29 -0
  145. package/src/DebugPlugin.tsx +14 -10
  146. package/src/DebugPlugin.workerd.ts +12 -0
  147. package/src/capabilities/app-graph-builder.ts +433 -0
  148. package/src/capabilities/index.ts +6 -4
  149. package/src/capabilities/{react-context/react-context.tsx → react-context.tsx} +7 -2
  150. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +179 -161
  151. package/src/capabilities/{settings/settings.ts → settings.ts} +4 -4
  152. package/src/components/DebugSettings/DebugSettings.stories.tsx +36 -0
  153. package/src/components/DebugSettings/DebugSettings.tsx +259 -0
  154. package/src/components/DebugSettings/index.ts +5 -0
  155. package/src/components/SpaceGenerator/ObjectGenerator.tsx +28 -28
  156. package/src/components/SpaceGenerator/draw-util.ts +8 -8
  157. package/src/components/SpaceGenerator/presets.ts +39 -62
  158. package/src/components/index.ts +4 -0
  159. package/src/containers/DebugGraph/DebugGraph.tsx +3 -2
  160. package/src/containers/DebugGraph/index.ts +1 -3
  161. package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +49 -18
  162. package/src/containers/DebugObjectPanel/index.ts +1 -3
  163. package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +11 -24
  164. package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -3
  165. package/src/containers/DebugStatus/DebugStatus.tsx +42 -19
  166. package/src/containers/DebugStatus/index.ts +1 -3
  167. package/src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx +8 -1
  168. package/src/containers/DevtoolsOverviewContainer/index.ts +1 -3
  169. package/src/containers/GithubPanel/GithubComponent.stories.tsx +38 -0
  170. package/src/containers/GithubPanel/GithubComponent.tsx +192 -0
  171. package/src/containers/GithubPanel/GithubPanel.tsx +17 -0
  172. package/src/containers/GithubPanel/index.ts +5 -0
  173. package/src/containers/RegistryPanel/RegistryPanel.tsx +150 -0
  174. package/src/containers/RegistryPanel/index.ts +5 -0
  175. package/src/containers/SpaceGenerator/SpaceGenerator.tsx +104 -104
  176. package/src/containers/SpaceGenerator/index.ts +1 -3
  177. package/src/containers/Wireframe/Wireframe.tsx +3 -7
  178. package/src/containers/Wireframe/index.ts +1 -3
  179. package/src/containers/index.ts +2 -1
  180. package/src/index.ts +1 -1
  181. package/src/meta.ts +26 -6
  182. package/src/plugin.ts +10 -0
  183. package/src/translations.ts +83 -60
  184. package/src/types/Settings.ts +16 -0
  185. package/src/{types.ts → types/index.ts} +16 -14
  186. package/src/vite-env.d.ts +10 -0
  187. package/dist/lib/browser/DebugGraph-7HXJ2PS2.mjs.map +0 -7
  188. package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs +0 -33
  189. package/dist/lib/browser/DebugObjectPanel-3TCDNUNW.mjs.map +0 -7
  190. package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs +0 -174
  191. package/dist/lib/browser/DebugSettings-JZMIUDYB.mjs.map +0 -7
  192. package/dist/lib/browser/DebugSpaceObjectsPanel-7NRPLWZ4.mjs.map +0 -7
  193. package/dist/lib/browser/DebugStatus-COQGH37G.mjs.map +0 -7
  194. package/dist/lib/browser/DevtoolsOverviewContainer-C75NFVER.mjs.map +0 -7
  195. package/dist/lib/browser/SpaceGenerator-SWSGJEEL.mjs.map +0 -7
  196. package/dist/lib/browser/Wireframe-KAGOKEFW.mjs.map +0 -7
  197. package/dist/lib/browser/app-graph-builder-LGUQNXHD.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-4UFQXPP7.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-A5H5GRV6.mjs +0 -20
  200. package/dist/lib/browser/chunk-A5H5GRV6.mjs.map +0 -7
  201. package/dist/lib/browser/index.mjs +0 -132
  202. package/dist/lib/browser/index.mjs.map +0 -7
  203. package/dist/lib/browser/meta.json +0 -1
  204. package/dist/lib/browser/react-context-I3USIAF6.mjs.map +0 -7
  205. package/dist/lib/browser/react-surface-BTVNKKVQ.mjs.map +0 -7
  206. package/dist/lib/browser/settings-SLTQJJNF.mjs.map +0 -7
  207. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  208. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  209. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  210. package/dist/types/src/capabilities/react-context/index.d.ts +0 -7
  211. package/dist/types/src/capabilities/react-context/index.d.ts.map +0 -1
  212. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +0 -1
  213. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -5
  214. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  215. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  216. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  217. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  218. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  219. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +0 -10
  220. package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +0 -1
  221. package/dist/types/src/containers/DebugSettings/index.d.ts +0 -3
  222. package/dist/types/src/containers/DebugSettings/index.d.ts.map +0 -1
  223. package/dist/types/src/types.d.ts +0 -68
  224. package/dist/types/src/types.d.ts.map +0 -1
  225. package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -441
  226. package/src/capabilities/app-graph-builder/index.ts +0 -7
  227. package/src/capabilities/react-context/index.ts +0 -7
  228. package/src/capabilities/react-surface/index.ts +0 -7
  229. package/src/capabilities/settings/index.ts +0 -7
  230. package/src/containers/DebugSettings/DebugSettings.tsx +0 -201
  231. package/src/containers/DebugSettings/index.ts +0 -7
  232. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  233. /package/dist/types/src/capabilities/{react-context/react-context.d.ts → react-context.d.ts} +0 -0
@@ -1,11 +1,12 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
1
3
  // src/containers/DebugStatus/DebugStatus.tsx
2
4
  import React, { useEffect, useRef, useState } from "react";
3
5
  import { TimeoutError } from "@dxos/async";
4
- import { useActiveSpace } from "@dxos/plugin-space";
5
- import { StatusBar } from "@dxos/plugin-status-bar";
6
+ import { StatusBar } from "@dxos/plugin-status-bar/components";
6
7
  import { ConnectionState } from "@dxos/protocols/proto/dxos/client/services";
7
8
  import { useNetworkStatus } from "@dxos/react-client/mesh";
8
- import { Icon } from "@dxos/react-ui";
9
+ import { IconButton } from "@dxos/react-ui";
9
10
  var styles = {
10
11
  success: "text-sky-300 dark:text-green-700",
11
12
  warning: "text-orange-300 dark:text-orange-600",
@@ -34,20 +35,20 @@ var ErrorIndicator = () => {
34
35
  forceUpdate({});
35
36
  };
36
37
  if (errorRef.current) {
37
- return /* @__PURE__ */ React.createElement(StatusBar.Button, {
38
- title: errorRef.current.message,
39
- onClick: handleReset
40
- }, /* @__PURE__ */ React.createElement(Icon, {
38
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
39
+ variant: "ghost",
41
40
  icon: "ph--warning-circle--duotone",
42
- size: 4,
43
- classNames: styles.error
41
+ iconOnly: true,
42
+ label: errorRef.current.message,
43
+ classNames: styles.error,
44
+ onClick: handleReset
44
45
  }));
45
46
  } else {
46
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
47
- title: "No errors."
48
- }, /* @__PURE__ */ React.createElement(Icon, {
47
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
48
+ variant: "ghost",
49
49
  icon: "ph--check--regular",
50
- size: 4
50
+ iconOnly: true,
51
+ label: "No errors."
51
52
  }));
52
53
  }
53
54
  };
@@ -60,49 +61,48 @@ var SwarmIndicator = () => {
60
61
  swarm
61
62
  ]);
62
63
  if (state === 0) {
63
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
64
- title: "Connected to swarm."
65
- }, /* @__PURE__ */ React.createElement(Icon, {
64
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
65
+ variant: "ghost",
66
66
  icon: "ph--lightning--regular",
67
- size: 4
67
+ iconOnly: true,
68
+ label: "Connected to swarm."
68
69
  }));
69
70
  } else {
70
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
71
- title: "Disconnected from swarm."
72
- }, /* @__PURE__ */ React.createElement(Icon, {
71
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
72
+ variant: "ghost",
73
73
  icon: "ph--lightning-slash--regular",
74
- size: 4,
74
+ iconOnly: true,
75
+ label: "Disconnected from swarm.",
75
76
  classNames: styles.warning
76
77
  }));
77
78
  }
78
79
  };
79
80
  var SavingIndicator = () => {
80
81
  const [state, _setState] = useState(0);
81
- const _space = useActiveSpace();
82
82
  switch (state) {
83
83
  case 2:
84
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
85
- title: "Edit not saved."
86
- }, /* @__PURE__ */ React.createElement(Icon, {
84
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
85
+ variant: "ghost",
87
86
  icon: "ph--circle--duotone",
88
- size: 4,
87
+ iconOnly: true,
88
+ label: "Edit not saved.",
89
89
  classNames: styles.warning
90
90
  }));
91
91
  case 1:
92
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
93
- title: "Saving..."
94
- }, /* @__PURE__ */ React.createElement(Icon, {
92
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
93
+ variant: "ghost",
95
94
  icon: "ph--circle--duotone",
96
- size: 4,
95
+ iconOnly: true,
96
+ label: "Saving...",
97
97
  classNames: styles.success
98
98
  }));
99
99
  case 0:
100
100
  default:
101
- return /* @__PURE__ */ React.createElement(StatusBar.Item, {
102
- title: "Modified indicator."
103
- }, /* @__PURE__ */ React.createElement(Icon, {
101
+ return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
102
+ variant: "ghost",
104
103
  icon: "ph--circle--duotone",
105
- size: 4
104
+ iconOnly: true,
105
+ label: "Modified indicator."
106
106
  }));
107
107
  }
108
108
  };
@@ -116,10 +116,7 @@ var DebugStatus = () => {
116
116
  key: Indicator.name
117
117
  })));
118
118
  };
119
-
120
- // src/containers/DebugStatus/index.ts
121
- var DebugStatus_default = DebugStatus;
122
119
  export {
123
- DebugStatus_default as default
120
+ DebugStatus as default
124
121
  };
125
- //# sourceMappingURL=DebugStatus-COQGH37G.mjs.map
122
+ //# sourceMappingURL=DebugStatus-H2BAHN26.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/DebugStatus/DebugStatus.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { TimeoutError } from '@dxos/async';\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { IconButton } from '@dxos/react-ui';\n\nconst styles = {\n success: 'text-sky-300 dark:text-green-700',\n warning: 'text-orange-300 dark:text-orange-600',\n error: 'text-red-300 dark:text-red-600',\n};\n\n// TODO(burdon): Move out of debug plugin.\n// TODO(burdon): Make pluggable (move indicators to relevant plugins).\n// TODO(burdon): Vault heartbeat indicator (global scope)?\n\n/**\n * Ensure light doesn't flicker immediately after start.\n */\n// TODO(burdon): Move to @dxos/async (debounce?)\nconst _timer = (cb: (err?: Error) => void, options?: { min?: number; max?: number }) => {\n const min = options?.min ?? 500;\n let start: number;\n let pending: NodeJS.Timeout;\n let timeout: NodeJS.Timeout;\n return {\n start: () => {\n start = Date.now();\n clearTimeout(pending);\n if (options?.max) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n cb(new TimeoutError(options.max));\n }, options.max);\n }\n },\n stop: () => {\n clearTimeout(timeout);\n const delta = Date.now() - start;\n if (delta < min) {\n pending = setTimeout(() => {\n cb();\n }, min - delta);\n }\n },\n };\n};\n\n/**\n * Global error handler.\n */\n// TODO(burdon): Integrate with Sentry?\nconst ErrorIndicator = () => {\n const [, forceUpdate] = useState({});\n const errorRef = useRef<Error>(null);\n useEffect(() => {\n const errorListener = (event: any) => {\n const error: Error = event.error ?? event.reason;\n if (errorRef.current !== error) {\n errorRef.current = error;\n forceUpdate({});\n }\n };\n\n // TODO(burdon): Register globally?\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event\n window.addEventListener('error', errorListener);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n window.addEventListener('unhandledrejection', errorListener);\n\n return () => {\n window.removeEventListener('error', errorListener);\n window.removeEventListener('unhandledrejection', errorListener);\n };\n }, []);\n\n const handleReset = () => {\n errorRef.current = null;\n forceUpdate({});\n };\n\n if (errorRef.current) {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--warning-circle--duotone'\n iconOnly\n label={errorRef.current.message}\n classNames={styles.error}\n onClick={handleReset}\n />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--check--regular' iconOnly label='No errors.' />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Swarm connection handler.\n */\nconst SwarmIndicator = () => {\n const [state, setState] = useState(0);\n const { swarm } = useNetworkStatus();\n useEffect(() => {\n setState(swarm === ConnectionState.ONLINE ? 0 : 1);\n }, [swarm]);\n\n if (state === 0) {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--lightning--regular' iconOnly label='Connected to swarm.' />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--lightning-slash--regular'\n iconOnly\n label='Disconnected from swarm.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Data saving indicator.\n */\n// TODO(burdon): Merge with SaveStatus.\nconst SavingIndicator = () => {\n const [state, _setState] = useState(0);\n // TODO(dmaretskyi): Fix this when we have save status for automerge.\n // useEffect(() => {\n // if (!space) {\n // return;\n // }\n // const { start, stop } = timer(() => setState(0), { min: 250 });\n // return space.db.pendingBatch.on(({ duration, error }) => {\n // if (error) {\n // setState(2);\n // stop();\n // } else if (duration === undefined) {\n // setState(1);\n // start();\n // } else {\n // stop();\n // }\n // });\n // }, [space]);\n\n switch (state) {\n case 2:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Edit not saved.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n case 1:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Saving...'\n classNames={styles.success}\n />\n </StatusBar.Item>\n );\n case 0:\n default:\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--circle--duotone' iconOnly label='Modified indicator.' />\n </StatusBar.Item>\n );\n }\n};\n\nconst indicators = [SavingIndicator, SwarmIndicator, ErrorIndicator];\n\nexport const DebugStatus = () => {\n return (\n <>\n {indicators.map((Indicator) => (\n <Indicator key={Indicator.name} />\n ))}\n </>\n );\n};\n"],
5
+ "mappings": ";;;AAIA,OAAOA,SAASC,WAAWC,QAAQC,gBAAgB;AAEnD,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,uBAAuB;AAChC,SAASC,wBAAwB;AACjC,SAASC,kBAAkB;AAE3B,IAAMC,SAAS;EACbC,SAAS;EACTC,SAAS;EACTC,OAAO;AACT;AA0CA,IAAMC,iBAAiB,MAAA;AACrB,QAAM,CAAA,EAAGC,WAAAA,IAAeC,SAAS,CAAC,CAAA;AAClC,QAAMC,WAAWC,OAAc,IAAA;AAC/BC,YAAU,MAAA;AACR,UAAMC,gBAAgB,CAACC,UAAAA;AACrB,YAAMC,QAAeD,MAAMC,SAASD,MAAME;AAC1C,UAAIN,SAASO,YAAYF,OAAO;AAC9BL,iBAASO,UAAUF;AACnBP,oBAAY,CAAC,CAAA;MACf;IACF;AAIAU,WAAOC,iBAAiB,SAASN,aAAAA;AAGjCK,WAAOC,iBAAiB,sBAAsBN,aAAAA;AAE9C,WAAO,MAAA;AACLK,aAAOE,oBAAoB,SAASP,aAAAA;AACpCK,aAAOE,oBAAoB,sBAAsBP,aAAAA;IACnD;EACF,GAAG,CAAA,CAAE;AAEL,QAAMQ,cAAc,MAAA;AAClBX,aAASO,UAAU;AACnBT,gBAAY,CAAC,CAAA;EACf;AAEA,MAAIE,SAASO,SAAS;AACpB,WACE,sBAAA,cAACK,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;MACCC,SAAQ;MACRC,MAAK;MACLC,UAAAA;MACAC,OAAOlB,SAASO,QAAQY;MACxBC,YAAYC,OAAOhB;MACnBiB,SAASX;;EAIjB,OAAO;AACL,WACE,sBAAA,cAACC,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;MAAWC,SAAQ;MAAQC,MAAK;MAAqBC,UAAAA;MAASC,OAAM;;EAG3E;AACF;AAKA,IAAMK,iBAAiB,MAAA;AACrB,QAAM,CAACC,OAAOC,QAAAA,IAAY1B,SAAS,CAAA;AACnC,QAAM,EAAE2B,MAAK,IAAKC,iBAAAA;AAClBzB,YAAU,MAAA;AACRuB,aAASC,UAAUE,gBAAgBC,SAAS,IAAI,CAAA;EAClD,GAAG;IAACH;GAAM;AAEV,MAAIF,UAAU,GAAG;AACf,WACE,sBAAA,cAACZ,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;MAAWC,SAAQ;MAAQC,MAAK;MAAyBC,UAAAA;MAASC,OAAM;;EAG/E,OAAO;AACL,WACE,sBAAA,cAACN,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;MACCC,SAAQ;MACRC,MAAK;MACLC,UAAAA;MACAC,OAAM;MACNE,YAAYC,OAAOS;;EAI3B;AACF;AAMA,IAAMC,kBAAkB,MAAA;AACtB,QAAM,CAACP,OAAOQ,SAAAA,IAAajC,SAAS,CAAA;AAoBpC,UAAQyB,OAAAA;IACN,KAAK;AACH,aACE,sBAAA,cAACZ,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;QACCC,SAAQ;QACRC,MAAK;QACLC,UAAAA;QACAC,OAAM;QACNE,YAAYC,OAAOS;;IAI3B,KAAK;AACH,aACE,sBAAA,cAAClB,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;QACCC,SAAQ;QACRC,MAAK;QACLC,UAAAA;QACAC,OAAM;QACNE,YAAYC,OAAOY;;IAI3B,KAAK;IACL;AACE,aACE,sBAAA,cAACrB,UAAUC,MAAI,MACb,sBAAA,cAACC,YAAAA;QAAWC,SAAQ;QAAQC,MAAK;QAAsBC,UAAAA;QAASC,OAAM;;EAG9E;AACF;AAEA,IAAMgB,aAAa;EAACH;EAAiBR;EAAgB1B;;AAE9C,IAAMsC,cAAc,MAAA;AACzB,SACE,sBAAA,cAAA,MAAA,UAAA,MACGD,WAAWE,IAAI,CAACC,cACf,sBAAA,cAACA,WAAAA;IAAUC,KAAKD,UAAUE;;AAIlC;",
6
+ "names": ["React", "useEffect", "useRef", "useState", "TimeoutError", "StatusBar", "ConnectionState", "useNetworkStatus", "IconButton", "styles", "success", "warning", "error", "ErrorIndicator", "forceUpdate", "useState", "errorRef", "useRef", "useEffect", "errorListener", "event", "error", "reason", "current", "window", "addEventListener", "removeEventListener", "handleReset", "StatusBar", "Item", "IconButton", "variant", "icon", "iconOnly", "label", "message", "classNames", "styles", "onClick", "SwarmIndicator", "state", "setState", "swarm", "useNetworkStatus", "ConnectionState", "ONLINE", "warning", "SavingIndicator", "_setState", "success", "indicators", "DebugStatus", "map", "Indicator", "key", "name"]
7
+ }
@@ -1,20 +1,23 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
1
3
  // src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx
2
4
  import React from "react";
3
5
  import { Surface } from "@dxos/app-framework/ui";
4
6
  import { StatsPanel, useStats } from "@dxos/devtools";
5
7
  var DevtoolsOverviewContainer = () => {
6
8
  const [stats, refreshStats] = useStats();
9
+ const surfaceProfilerStats = Surface.useProfilerStats();
10
+ const clearSurfaceProfiler = Surface.useProfilerClear();
7
11
  return /* @__PURE__ */ React.createElement(StatsPanel, {
8
12
  stats,
9
- onRefresh: refreshStats
13
+ surfaceProfilerStats,
14
+ onRefresh: refreshStats,
15
+ onClearSurfaceProfiler: clearSurfaceProfiler
10
16
  }, /* @__PURE__ */ React.createElement(Surface.Surface, {
11
17
  role: "devtools-overview"
12
18
  }));
13
19
  };
14
-
15
- // src/containers/DevtoolsOverviewContainer/index.ts
16
- var DevtoolsOverviewContainer_default = DevtoolsOverviewContainer;
17
20
  export {
18
- DevtoolsOverviewContainer_default as default
21
+ DevtoolsOverviewContainer as default
19
22
  };
20
- //# sourceMappingURL=DevtoolsOverviewContainer-C75NFVER.mjs.map
23
+ //# sourceMappingURL=DevtoolsOverviewContainer-YX7Z3D2H.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/DevtoolsOverviewContainer/DevtoolsOverviewContainer.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { StatsPanel, useStats } from '@dxos/devtools';\n\nexport const DevtoolsOverviewContainer = () => {\n const [stats, refreshStats] = useStats();\n const surfaceProfilerStats = Surface.useProfilerStats();\n const clearSurfaceProfiler = Surface.useProfilerClear();\n\n return (\n <StatsPanel\n stats={stats}\n surfaceProfilerStats={surfaceProfilerStats}\n onRefresh={refreshStats}\n onClearSurfaceProfiler={clearSurfaceProfiler}\n >\n <Surface.Surface role='devtools-overview' />\n </StatsPanel>\n );\n};\n"],
5
+ "mappings": ";;;AAIA,OAAOA,WAAW;AAElB,SAASC,eAAe;AACxB,SAASC,YAAYC,gBAAgB;AAE9B,IAAMC,4BAA4B,MAAA;AACvC,QAAM,CAACC,OAAOC,YAAAA,IAAgBH,SAAAA;AAC9B,QAAMI,uBAAuBN,QAAQO,iBAAgB;AACrD,QAAMC,uBAAuBR,QAAQS,iBAAgB;AAErD,SACE,sBAAA,cAACR,YAAAA;IACCG;IACAE;IACAI,WAAWL;IACXM,wBAAwBH;KAExB,sBAAA,cAACR,QAAQA,SAAO;IAACY,MAAK;;AAG5B;",
6
+ "names": ["React", "Surface", "StatsPanel", "useStats", "DevtoolsOverviewContainer", "stats", "refreshStats", "surfaceProfilerStats", "useProfilerStats", "clearSurfaceProfiler", "useProfilerClear", "onRefresh", "onClearSurfaceProfiler", "role"]
7
+ }
@@ -0,0 +1,177 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/containers/GithubPanel/GithubPanel.tsx
4
+ import React2 from "react";
5
+
6
+ // src/containers/GithubPanel/GithubComponent.tsx
7
+ import React, { createContext, useContext, useEffect, useState } from "react";
8
+ import { IconButton, ScrollArea, useTranslation } from "@dxos/react-ui";
9
+ import { meta } from "#meta";
10
+ var DEFAULT_REPO = "dxos/dxos";
11
+ var DEFAULT_LIMIT = 20;
12
+ var ComponentContext = /* @__PURE__ */ createContext(null);
13
+ var useComponentContext = () => {
14
+ const ctx = useContext(ComponentContext);
15
+ if (!ctx) {
16
+ throw new Error("GithubComponent.* parts must be rendered inside GithubComponent.Root.");
17
+ }
18
+ return ctx;
19
+ };
20
+ var Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }) => {
21
+ const [pulls, setPulls] = useState([]);
22
+ const [unavailable, setUnavailable] = useState(false);
23
+ useEffect(() => {
24
+ const controller = new AbortController();
25
+ setPulls([]);
26
+ setUnavailable(false);
27
+ void (async () => {
28
+ try {
29
+ const url = new URL(`https://api.github.com/repos/${repo}/pulls`);
30
+ url.searchParams.set("state", "closed");
31
+ url.searchParams.set("sort", "updated");
32
+ url.searchParams.set("direction", "desc");
33
+ url.searchParams.set("per_page", String(limit * 2));
34
+ const response = await fetch(url.toString(), {
35
+ signal: controller.signal,
36
+ headers: {
37
+ Accept: "application/vnd.github+json"
38
+ }
39
+ });
40
+ if (!response.ok) {
41
+ setUnavailable(true);
42
+ return;
43
+ }
44
+ const items = await response.json();
45
+ setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));
46
+ setUnavailable(false);
47
+ } catch {
48
+ if (controller.signal.aborted) {
49
+ return;
50
+ }
51
+ setPulls([]);
52
+ setUnavailable(true);
53
+ }
54
+ })();
55
+ return () => controller.abort();
56
+ }, [
57
+ repo,
58
+ limit
59
+ ]);
60
+ return /* @__PURE__ */ React.createElement(ComponentContext.Provider, {
61
+ value: {
62
+ repo,
63
+ pulls,
64
+ unavailable
65
+ }
66
+ }, children);
67
+ };
68
+ var Header = () => {
69
+ const { t } = useTranslation(meta.id);
70
+ const { repo, pulls, unavailable } = useComponentContext();
71
+ return /* @__PURE__ */ React.createElement("header", {
72
+ className: "flex items-center justify-between gap-1 px-4 py-3 bg-modal-surface border-b border-subdued-separator"
73
+ }, /* @__PURE__ */ React.createElement("a", {
74
+ href: `https://github.com/${repo}`,
75
+ target: "_blank",
76
+ rel: "noopener noreferrer",
77
+ className: "text-sm font-medium truncate"
78
+ }, "@", repo), /* @__PURE__ */ React.createElement("div", {
79
+ className: "text-xs text-description"
80
+ }, unavailable ? t("github-unavailable.message") : pulls.length > 0 ? t("recent-prs.label", {
81
+ count: pulls.length
82
+ }) : t("github-loading.message")));
83
+ };
84
+ var RELATIVE_UNITS = [
85
+ [
86
+ "year",
87
+ 60 * 60 * 24 * 365
88
+ ],
89
+ [
90
+ "month",
91
+ 60 * 60 * 24 * 30
92
+ ],
93
+ [
94
+ "week",
95
+ 60 * 60 * 24 * 7
96
+ ],
97
+ [
98
+ "day",
99
+ 60 * 60 * 24
100
+ ],
101
+ [
102
+ "hour",
103
+ 60 * 60
104
+ ],
105
+ [
106
+ "minute",
107
+ 60
108
+ ]
109
+ ];
110
+ var formatRelative = (iso) => {
111
+ const formatter = new Intl.RelativeTimeFormat(void 0, {
112
+ numeric: "auto"
113
+ });
114
+ const diffSeconds = (Date.parse(iso) - Date.now()) / 1e3;
115
+ const absDiff = Math.abs(diffSeconds);
116
+ for (const [unit, secondsInUnit] of RELATIVE_UNITS) {
117
+ if (absDiff >= secondsInUnit) {
118
+ return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);
119
+ }
120
+ }
121
+ return formatter.format(Math.round(diffSeconds), "second");
122
+ };
123
+ var PullRow = ({ pull }) => /* @__PURE__ */ React.createElement("li", null, /* @__PURE__ */ React.createElement("a", {
124
+ href: pull.html_url,
125
+ target: "_blank",
126
+ rel: "noopener noreferrer",
127
+ className: "flex items-start gap-2 px-2 py-1 rounded-sm hover:bg-hover-surface"
128
+ }, /* @__PURE__ */ React.createElement("img", {
129
+ src: pull.user.avatar_url,
130
+ alt: "",
131
+ className: "w-6 h-6 rounded-full shrink-0 mt-0.5"
132
+ }), /* @__PURE__ */ React.createElement("div", {
133
+ className: "flex flex-col min-w-0 flex-1"
134
+ }, /* @__PURE__ */ React.createElement("span", {
135
+ className: "text-sm truncate"
136
+ }, pull.title), /* @__PURE__ */ React.createElement("span", {
137
+ className: "text-xs text-description truncate"
138
+ }, "#", pull.number, " \xB7 ", pull.user.login, " \xB7 ", pull.merged_at ? formatRelative(pull.merged_at) : ""))));
139
+ var Content = () => {
140
+ const { pulls } = useComponentContext();
141
+ return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
142
+ orientation: "vertical"
143
+ }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement("ul", {
144
+ className: "flex flex-col p-1"
145
+ }, pulls.map((pull) => /* @__PURE__ */ React.createElement(PullRow, {
146
+ key: pull.number,
147
+ pull
148
+ })))));
149
+ };
150
+ var StatusBar = () => {
151
+ const { t } = useTranslation(meta.id);
152
+ const { repo } = useComponentContext();
153
+ return /* @__PURE__ */ React.createElement(IconButton, {
154
+ icon: "ph--github-logo--regular",
155
+ label: t("view-on-github.button"),
156
+ variant: "primary",
157
+ classNames: "w-full",
158
+ onClick: () => {
159
+ window.open(`https://github.com/${repo}`, "_blank", "noopener,noreferrer");
160
+ }
161
+ });
162
+ };
163
+ var GithubComponent = {
164
+ Root,
165
+ Header,
166
+ Content,
167
+ StatusBar
168
+ };
169
+
170
+ // src/containers/GithubPanel/GithubPanel.tsx
171
+ var GithubPanel = () => /* @__PURE__ */ React2.createElement(GithubComponent.Root, null, /* @__PURE__ */ React2.createElement("div", {
172
+ className: "h-full grid grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden h-full is-full"
173
+ }, /* @__PURE__ */ React2.createElement(GithubComponent.Header, null), /* @__PURE__ */ React2.createElement(GithubComponent.Content, null), /* @__PURE__ */ React2.createElement(GithubComponent.StatusBar, null)));
174
+ export {
175
+ GithubPanel as default
176
+ };
177
+ //# sourceMappingURL=GithubPanel-QJKDJRVQ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/GithubPanel/GithubPanel.tsx", "../../../src/containers/GithubPanel/GithubComponent.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { GithubComponent } from './GithubComponent';\n\nexport const GithubPanel = () => (\n <GithubComponent.Root>\n <div className='h-full grid grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden h-full is-full'>\n <GithubComponent.Header />\n <GithubComponent.Content />\n <GithubComponent.StatusBar />\n </div>\n </GithubComponent.Root>\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type ReactNode, createContext, useContext, useEffect, useState } from 'react';\n\nimport { IconButton, ScrollArea, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nconst DEFAULT_REPO = 'dxos/dxos';\nconst DEFAULT_LIMIT = 20;\n\ntype GithubUser = {\n login: string;\n avatar_url: string;\n html_url: string;\n};\n\ntype GithubPullRequest = {\n number: number;\n title: string;\n html_url: string;\n merged_at: string | null;\n user: GithubUser;\n};\n\ntype ComponentContextValue = {\n repo: string;\n pulls: GithubPullRequest[];\n unavailable: boolean;\n};\n\nconst ComponentContext = createContext<ComponentContextValue | null>(null);\n\nconst useComponentContext = () => {\n const ctx = useContext(ComponentContext);\n if (!ctx) {\n throw new Error('GithubComponent.* parts must be rendered inside GithubComponent.Root.');\n }\n return ctx;\n};\n\nexport type GithubComponentRootProps = {\n /** `<owner>/<name>`. Defaults to `dxos/dxos`. */\n repo?: string;\n /** Maximum number of merged PRs to fetch. */\n limit?: number;\n children?: ReactNode;\n};\n\nconst Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }: GithubComponentRootProps) => {\n const [pulls, setPulls] = useState<GithubPullRequest[]>([]);\n const [unavailable, setUnavailable] = useState(false);\n\n useEffect(() => {\n const controller = new AbortController();\n setPulls([]);\n setUnavailable(false);\n void (async () => {\n try {\n const url = new URL(`https://api.github.com/repos/${repo}/pulls`);\n url.searchParams.set('state', 'closed');\n url.searchParams.set('sort', 'updated');\n url.searchParams.set('direction', 'desc');\n url.searchParams.set('per_page', String(limit * 2));\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.github+json' },\n });\n if (!response.ok) {\n setUnavailable(true);\n return;\n }\n const items = (await response.json()) as GithubPullRequest[];\n setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));\n setUnavailable(false);\n } catch {\n if (controller.signal.aborted) {\n return;\n }\n setPulls([]);\n setUnavailable(true);\n }\n })();\n return () => controller.abort();\n }, [repo, limit]);\n\n return <ComponentContext.Provider value={{ repo, pulls, unavailable }}>{children}</ComponentContext.Provider>;\n};\n\nconst Header = () => {\n const { t } = useTranslation(meta.id);\n const { repo, pulls, unavailable } = useComponentContext();\n return (\n <header className='flex items-center justify-between gap-1 px-4 py-3 bg-modal-surface border-b border-subdued-separator'>\n <a\n href={`https://github.com/${repo}`}\n target='_blank'\n rel='noopener noreferrer'\n className='text-sm font-medium truncate'\n >\n @{repo}\n </a>\n <div className='text-xs text-description'>\n {unavailable\n ? t('github-unavailable.message')\n : pulls.length > 0\n ? t('recent-prs.label', { count: pulls.length })\n : t('github-loading.message')}\n </div>\n </header>\n );\n};\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 60 * 60 * 24 * 365],\n ['month', 60 * 60 * 24 * 30],\n ['week', 60 * 60 * 24 * 7],\n ['day', 60 * 60 * 24],\n ['hour', 60 * 60],\n ['minute', 60],\n];\n\nconst formatRelative = (iso: string): string => {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const diffSeconds = (Date.parse(iso) - Date.now()) / 1000;\n const absDiff = Math.abs(diffSeconds);\n for (const [unit, secondsInUnit] of RELATIVE_UNITS) {\n if (absDiff >= secondsInUnit) {\n return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);\n }\n }\n return formatter.format(Math.round(diffSeconds), 'second');\n};\n\nconst PullRow = ({ pull }: { pull: GithubPullRequest }) => (\n <li>\n <a\n href={pull.html_url}\n target='_blank'\n rel='noopener noreferrer'\n className='flex items-start gap-2 px-2 py-1 rounded-sm hover:bg-hover-surface'\n >\n <img src={pull.user.avatar_url} alt='' className='w-6 h-6 rounded-full shrink-0 mt-0.5' />\n <div className='flex flex-col min-w-0 flex-1'>\n <span className='text-sm truncate'>{pull.title}</span>\n <span className='text-xs text-description truncate'>\n #{pull.number} · {pull.user.login} · {pull.merged_at ? formatRelative(pull.merged_at) : ''}\n </span>\n </div>\n </a>\n </li>\n);\n\nconst Content = () => {\n const { pulls } = useComponentContext();\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <ul className='flex flex-col p-1'>\n {pulls.map((pull) => (\n <PullRow key={pull.number} pull={pull} />\n ))}\n </ul>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n\nconst StatusBar = () => {\n const { t } = useTranslation(meta.id);\n const { repo } = useComponentContext();\n return (\n <IconButton\n icon='ph--github-logo--regular'\n label={t('view-on-github.button')}\n variant='primary'\n classNames='w-full'\n onClick={() => {\n window.open(`https://github.com/${repo}`, '_blank', 'noopener,noreferrer');\n }}\n />\n );\n};\n\nexport const GithubComponent = {\n Root,\n Header,\n Content,\n StatusBar,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "React", "createContext", "useContext", "useEffect", "useState", "IconButton", "ScrollArea", "useTranslation", "meta", "DEFAULT_REPO", "DEFAULT_LIMIT", "ComponentContext", "useComponentContext", "ctx", "Error", "Root", "repo", "limit", "children", "pulls", "setPulls", "unavailable", "setUnavailable", "controller", "AbortController", "url", "URL", "searchParams", "set", "String", "response", "fetch", "toString", "signal", "headers", "Accept", "ok", "items", "json", "filter", "pull", "merged_at", "slice", "aborted", "abort", "Provider", "value", "Header", "t", "id", "header", "className", "a", "href", "target", "rel", "div", "length", "count", "RELATIVE_UNITS", "formatRelative", "iso", "formatter", "Intl", "RelativeTimeFormat", "undefined", "numeric", "diffSeconds", "Date", "parse", "now", "absDiff", "Math", "abs", "unit", "secondsInUnit", "format", "round", "PullRow", "li", "html_url", "img", "src", "user", "avatar_url", "alt", "span", "title", "number", "login", "Content", "orientation", "Viewport", "ul", "map", "key", "StatusBar", "icon", "label", "variant", "classNames", "onClick", "window", "open", "GithubComponent", "GithubPanel", "React", "GithubComponent", "Root", "div", "className", "Header", "Content", "StatusBar"]
7
+ }
@@ -0,0 +1,161 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/containers/RegistryPanel/RegistryPanel.tsx
4
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
5
+ import { Operation } from "@dxos/compute";
6
+ import { JsonView, PanelContainer, Placeholder, Searchbar } from "@dxos/devtools";
7
+ import { Entity, Format, Obj, Type } from "@dxos/echo";
8
+ import { useClient } from "@dxos/react-client";
9
+ import { Toolbar } from "@dxos/react-ui";
10
+ import { DynamicTable } from "@dxos/react-ui-table";
11
+ import { mx } from "@dxos/ui-theme";
12
+ var textFilter = (text) => {
13
+ if (!text) {
14
+ return () => true;
15
+ }
16
+ const matcher = new RegExp(text, "i");
17
+ return (entity) => {
18
+ const typename = Entity.getTypename(entity) ?? "";
19
+ const metaKey = Obj.isObject(entity) ? Obj.getMeta(entity).key ?? "" : "";
20
+ const uri = Type.isType(entity) ? Type.getURI(entity)?.toString() ?? "" : "";
21
+ const operationKey = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? Operation.getKey(entity) ?? "" : "";
22
+ const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : "";
23
+ return [
24
+ typename,
25
+ metaKey,
26
+ uri,
27
+ operationKey,
28
+ name,
29
+ getEntityId(entity)
30
+ ].some((value) => value.match(matcher));
31
+ };
32
+ };
33
+ var getEntityId = (entity) => {
34
+ if (entity.id) {
35
+ return entity.id;
36
+ }
37
+ if (Type.isType(entity)) {
38
+ return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? "unknown-type";
39
+ }
40
+ return Entity.getTypename(entity) ?? "unknown";
41
+ };
42
+ var getKind = (entity) => {
43
+ if (Type.isType(entity)) {
44
+ return "type";
45
+ }
46
+ if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
47
+ return "operation";
48
+ }
49
+ return "other";
50
+ };
51
+ var getLabel = (entity) => {
52
+ if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
53
+ return entity.name || Operation.getKey(entity) || getEntityId(entity);
54
+ }
55
+ if (Type.isType(entity)) {
56
+ return Type.getTypename(entity) ?? getEntityId(entity);
57
+ }
58
+ return getEntityId(entity);
59
+ };
60
+ var toDetailJson = (entity) => {
61
+ if (Type.isType(entity)) {
62
+ return {
63
+ id: getEntityId(entity),
64
+ typename: Type.getTypename(entity),
65
+ uri: Type.getURI(entity)?.toString(),
66
+ version: Type.getVersion(entity),
67
+ jsonSchema: entity.jsonSchema
68
+ };
69
+ }
70
+ if (Obj.isObject(entity)) {
71
+ return Obj.toJSON(entity);
72
+ }
73
+ return {
74
+ id: getEntityId(entity),
75
+ typename: Entity.getTypename(entity)
76
+ };
77
+ };
78
+ var RegistryPanel = () => {
79
+ const client = useClient();
80
+ const [entities, setEntities] = useState([]);
81
+ const [filter, setFilter] = useState("");
82
+ const [selected, setSelected] = useState();
83
+ useEffect(() => {
84
+ const registry = client.graph.registry;
85
+ const refresh = () => setEntities([
86
+ ...registry.list()
87
+ ]);
88
+ refresh();
89
+ return registry.changed.on(refresh);
90
+ }, [
91
+ client
92
+ ]);
93
+ const properties = useMemo(() => [
94
+ {
95
+ name: "kind",
96
+ format: Format.TypeFormat.String,
97
+ size: 100
98
+ },
99
+ {
100
+ name: "label",
101
+ format: Format.TypeFormat.String
102
+ },
103
+ {
104
+ name: "id",
105
+ format: Format.TypeFormat.String,
106
+ size: 280
107
+ }
108
+ ], []);
109
+ const rows = useMemo(() => {
110
+ return entities.filter(textFilter(filter)).map((entity) => ({
111
+ id: getEntityId(entity),
112
+ kind: getKind(entity),
113
+ label: getLabel(entity),
114
+ _entity: entity
115
+ })).toSorted((left, right) => left.label.localeCompare(right.label));
116
+ }, [
117
+ entities,
118
+ filter
119
+ ]);
120
+ const handleRowClicked = useCallback((row) => {
121
+ if (!row?._entity) {
122
+ return;
123
+ }
124
+ setSelected(row._entity);
125
+ }, []);
126
+ const detailJson = useMemo(() => selected ? toDetailJson(selected) : void 0, [
127
+ selected
128
+ ]);
129
+ const features = useMemo(() => ({
130
+ selection: {
131
+ enabled: true,
132
+ mode: "single"
133
+ }
134
+ }), []);
135
+ return /* @__PURE__ */ React.createElement(PanelContainer, {
136
+ toolbar: /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(Searchbar, {
137
+ placeholder: "Filter...",
138
+ onChange: setFilter
139
+ }))
140
+ }, /* @__PURE__ */ React.createElement("div", {
141
+ className: mx("h-full grid grid-cols-[2fr_1fr] overflow-hidden")
142
+ }, /* @__PURE__ */ React.createElement("div", {
143
+ className: mx("flex flex-col min-h-0 overflow-hidden")
144
+ }, /* @__PURE__ */ React.createElement(DynamicTable, {
145
+ properties,
146
+ rows,
147
+ features,
148
+ onRowClick: handleRowClicked
149
+ })), /* @__PURE__ */ React.createElement("div", {
150
+ className: mx("min-h-0 h-full overflow-auto border-s border-separator text-sm")
151
+ }, detailJson ? /* @__PURE__ */ React.createElement(JsonView, {
152
+ data: detailJson
153
+ }) : /* @__PURE__ */ React.createElement(Placeholder, {
154
+ label: "Details"
155
+ }))));
156
+ };
157
+ export {
158
+ RegistryPanel,
159
+ RegistryPanel as default
160
+ };
161
+ //# sourceMappingURL=RegistryPanel-64GIYJHN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/RegistryPanel/RegistryPanel.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Operation } from '@dxos/compute';\nimport { JsonView, PanelContainer, Placeholder, Searchbar } from '@dxos/devtools';\nimport { Entity, Format, Obj, Type } from '@dxos/echo';\nimport { useClient } from '@dxos/react-client';\nimport { Toolbar } from '@dxos/react-ui';\nimport { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';\nimport { mx } from '@dxos/ui-theme';\n\ntype RegistryRow = {\n id: string;\n kind: string;\n label: string;\n _entity: Entity.Unknown;\n};\n\nconst textFilter = (text?: string) => {\n if (!text) {\n return () => true;\n }\n\n const matcher = new RegExp(text, 'i');\n return (entity: Entity.Unknown) => {\n const typename = Entity.getTypename(entity) ?? '';\n const metaKey = Obj.isObject(entity) ? (Obj.getMeta(entity).key ?? '') : '';\n const uri = Type.isType(entity) ? (Type.getURI(entity)?.toString() ?? '') : '';\n const operationKey =\n Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)\n ? (Operation.getKey(entity) ?? '')\n : '';\n const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : '';\n return [typename, metaKey, uri, operationKey, name, getEntityId(entity)].some((value) => value.match(matcher));\n };\n};\n\nconst getEntityId = (entity: Entity.Unknown): string => {\n if (entity.id) {\n return entity.id;\n }\n if (Type.isType(entity)) {\n return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? 'unknown-type';\n }\n return Entity.getTypename(entity) ?? 'unknown';\n};\n\nconst getKind = (entity: Entity.Unknown): string => {\n if (Type.isType(entity)) {\n return 'type';\n }\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return 'operation';\n }\n return 'other';\n};\n\nconst getLabel = (entity: Entity.Unknown): string => {\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return entity.name || Operation.getKey(entity) || getEntityId(entity);\n }\n if (Type.isType(entity)) {\n return Type.getTypename(entity) ?? getEntityId(entity);\n }\n return getEntityId(entity);\n};\n\nconst toDetailJson = (entity: Entity.Unknown): object => {\n if (Type.isType(entity)) {\n return {\n id: getEntityId(entity),\n typename: Type.getTypename(entity),\n uri: Type.getURI(entity)?.toString(),\n version: Type.getVersion(entity),\n jsonSchema: entity.jsonSchema,\n };\n }\n if (Obj.isObject(entity)) {\n return Obj.toJSON(entity);\n }\n return { id: getEntityId(entity), typename: Entity.getTypename(entity) };\n};\n\nexport const RegistryPanel = () => {\n const client = useClient();\n const [entities, setEntities] = useState<Entity.Unknown[]>([]);\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<Entity.Unknown>();\n\n useEffect(() => {\n const registry = client.graph.registry;\n const refresh = () => setEntities([...registry.list()]);\n refresh();\n return registry.changed.on(refresh);\n }, [client]);\n\n const properties = useMemo(\n () => [\n { name: 'kind', format: Format.TypeFormat.String, size: 100 },\n { name: 'label', format: Format.TypeFormat.String },\n { name: 'id', format: Format.TypeFormat.String, size: 280 },\n ],\n [],\n );\n\n const rows = useMemo((): RegistryRow[] => {\n return entities\n .filter(textFilter(filter))\n .map((entity) => ({\n id: getEntityId(entity),\n kind: getKind(entity),\n label: getLabel(entity),\n _entity: entity,\n }))\n .toSorted((left, right) => left.label.localeCompare(right.label));\n }, [entities, filter]);\n\n const handleRowClicked = useCallback((row: RegistryRow | undefined) => {\n if (!row?._entity) {\n return;\n }\n setSelected(row._entity);\n }, []);\n\n const detailJson = useMemo(() => (selected ? toDetailJson(selected) : undefined), [selected]);\n\n const features: Partial<TableFeatures> = useMemo(() => ({ selection: { enabled: true, mode: 'single' } }), []);\n\n return (\n <PanelContainer\n toolbar={\n <Toolbar.Root>\n <Searchbar placeholder='Filter...' onChange={setFilter} />\n </Toolbar.Root>\n }\n >\n <div className={mx('h-full grid grid-cols-[2fr_1fr] overflow-hidden')}>\n <div className={mx('flex flex-col min-h-0 overflow-hidden')}>\n <DynamicTable properties={properties} rows={rows} features={features} onRowClick={handleRowClicked} />\n </div>\n <div className={mx('min-h-0 h-full overflow-auto border-s border-separator text-sm')}>\n {detailJson ? <JsonView data={detailJson} /> : <Placeholder label='Details' />}\n </div>\n </div>\n </PanelContainer>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useMemo", "useState", "Operation", "JsonView", "PanelContainer", "Placeholder", "Searchbar", "Entity", "Format", "Obj", "Type", "useClient", "Toolbar", "DynamicTable", "mx", "textFilter", "text", "matcher", "RegExp", "entity", "typename", "getTypename", "metaKey", "isObject", "getMeta", "key", "uri", "isType", "getURI", "toString", "operationKey", "instanceOf", "PersistentOperation", "getKey", "name", "getEntityId", "some", "value", "match", "id", "getKind", "getLabel", "toDetailJson", "version", "getVersion", "jsonSchema", "toJSON", "RegistryPanel", "client", "entities", "setEntities", "filter", "setFilter", "selected", "setSelected", "registry", "graph", "refresh", "list", "changed", "on", "properties", "format", "TypeFormat", "String", "size", "rows", "map", "kind", "label", "_entity", "toSorted", "left", "right", "localeCompare", "handleRowClicked", "row", "detailJson", "undefined", "features", "selection", "enabled", "mode", "toolbar", "Root", "placeholder", "onChange", "div", "className", "onRowClick", "data"]
7
+ }