@dxos/plugin-registry 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{app-graph-builder-BTBWTZHK.mjs → app-graph-builder-J5YHAGNI.mjs} +21 -5
- package/dist/lib/browser/{app-graph-builder-BTBWTZHK.mjs.map → app-graph-builder-J5YHAGNI.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +3 -8
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-NLJXCVYD.mjs +335 -0
- package/dist/lib/browser/react-surface-NLJXCVYD.mjs.map +7 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/components/PluginItem.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/package.json +18 -17
- package/src/capabilities/app-graph-builder.ts +28 -24
- package/src/capabilities/react-surface.tsx +5 -5
- package/src/components/PluginItem.tsx +20 -7
- package/src/components/PluginList.stories.tsx +1 -1
- package/src/components/PluginList.tsx +1 -1
- package/src/translations.ts +1 -6
- package/dist/lib/browser/react-surface-PNR23BFI.mjs +0 -305
- package/dist/lib/browser/react-surface-PNR23BFI.mjs.map +0 -7
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
REGISTRY_KEY,
|
|
3
|
-
REGISTRY_PLUGIN
|
|
4
|
-
} from "./chunk-ISC56E5F.mjs";
|
|
5
|
-
|
|
6
|
-
// packages/plugins/plugin-registry/src/capabilities/react-surface.tsx
|
|
7
|
-
import React5, { useCallback as useCallback3, useMemo as useMemo2 } from "react";
|
|
8
|
-
import { Capabilities as Capabilities2, contributes, createSurface, Plugin, usePluginManager as usePluginManager2 } from "@dxos/app-framework";
|
|
9
|
-
import { StackItem as StackItem2 } from "@dxos/react-ui-stack";
|
|
10
|
-
|
|
11
|
-
// packages/plugins/plugin-registry/src/components/PluginDetail.tsx
|
|
12
|
-
import React from "react";
|
|
13
|
-
import { Icon, Input, Link, useTranslation } from "@dxos/react-ui";
|
|
14
|
-
import { DeprecatedFormContainer } from "@dxos/react-ui-form";
|
|
15
|
-
var PluginDetail = ({ plugin, enabled, onEnable }) => {
|
|
16
|
-
const { t } = useTranslation(REGISTRY_PLUGIN);
|
|
17
|
-
const { id, name, description, homePage, source, screenshots } = plugin.meta;
|
|
18
|
-
return /* @__PURE__ */ React.createElement(DeprecatedFormContainer, {
|
|
19
|
-
classNames: "gap-6"
|
|
20
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
21
|
-
role: "none",
|
|
22
|
-
className: "flex justify-between items-center"
|
|
23
|
-
}, /* @__PURE__ */ React.createElement("p", null, id), /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
|
|
24
|
-
classNames: "self-center",
|
|
25
|
-
checked: enabled,
|
|
26
|
-
onClick: onEnable
|
|
27
|
-
}))), screenshots && screenshots.length > 0 && /* @__PURE__ */ React.createElement("div", {
|
|
28
|
-
role: "none"
|
|
29
|
-
}, /* @__PURE__ */ React.createElement("h1", {
|
|
30
|
-
className: "text-lg mb-2"
|
|
31
|
-
}, "Preview"), /* @__PURE__ */ React.createElement("img", {
|
|
32
|
-
src: screenshots[0],
|
|
33
|
-
alt: name,
|
|
34
|
-
className: "aspect-video object-fit"
|
|
35
|
-
})), /* @__PURE__ */ React.createElement("div", {
|
|
36
|
-
role: "none"
|
|
37
|
-
}, /* @__PURE__ */ React.createElement("p", null, description)), /* @__PURE__ */ React.createElement("div", {
|
|
38
|
-
role: "none"
|
|
39
|
-
}, /* @__PURE__ */ React.createElement("h1", {
|
|
40
|
-
className: "text-lg mb-2"
|
|
41
|
-
}, "Resources"), /* @__PURE__ */ React.createElement("div", {
|
|
42
|
-
className: "flex gap-2"
|
|
43
|
-
}, homePage && /* @__PURE__ */ React.createElement(Link, {
|
|
44
|
-
href: homePage,
|
|
45
|
-
target: "_blank",
|
|
46
|
-
rel: "noreferrer",
|
|
47
|
-
classNames: "text-sm text-description"
|
|
48
|
-
}, t("home page label"), /* @__PURE__ */ React.createElement(Icon, {
|
|
49
|
-
icon: "ph--arrow-square-out--bold",
|
|
50
|
-
size: 3,
|
|
51
|
-
classNames: "inline-block leading-none mli-1"
|
|
52
|
-
})), source && /* @__PURE__ */ React.createElement(Link, {
|
|
53
|
-
href: source,
|
|
54
|
-
target: "_blank",
|
|
55
|
-
rel: "noreferrer",
|
|
56
|
-
classNames: "text-sm text-description"
|
|
57
|
-
}, t("source label"), /* @__PURE__ */ React.createElement(Icon, {
|
|
58
|
-
icon: "ph--arrow-square-out--bold",
|
|
59
|
-
size: 3,
|
|
60
|
-
classNames: "inline-block leading-none mli-1"
|
|
61
|
-
})))));
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
// packages/plugins/plugin-registry/src/components/PluginList.tsx
|
|
65
|
-
import React3 from "react";
|
|
66
|
-
import { List } from "@dxos/react-ui";
|
|
67
|
-
|
|
68
|
-
// packages/plugins/plugin-registry/src/components/PluginItem.tsx
|
|
69
|
-
import React2, { useCallback } from "react";
|
|
70
|
-
import { Icon as Icon2, IconButton, Input as Input2, Link as Link2, ListItem, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
71
|
-
import { descriptionText, mx } from "@dxos/react-ui-theme";
|
|
72
|
-
var PluginItem = ({ plugin, enabled = [], onClick, onChange, hasSettings: _hasSettings, onSettings }) => {
|
|
73
|
-
const { t } = useTranslation2(REGISTRY_PLUGIN);
|
|
74
|
-
const { id, name, description, icon = "ph--circle--regular" } = plugin.meta;
|
|
75
|
-
const isEnabled = enabled.includes(id);
|
|
76
|
-
const inputId = `${id}-input`;
|
|
77
|
-
const labelId = `${id}-label`;
|
|
78
|
-
const descriptionId = `${id}-description`;
|
|
79
|
-
const handleClick = useCallback(() => onClick?.(id), [
|
|
80
|
-
id,
|
|
81
|
-
onClick
|
|
82
|
-
]);
|
|
83
|
-
const handleChange = useCallback((event) => {
|
|
84
|
-
event.stopPropagation();
|
|
85
|
-
onChange?.(id, !isEnabled);
|
|
86
|
-
}, [
|
|
87
|
-
id,
|
|
88
|
-
isEnabled,
|
|
89
|
-
onChange
|
|
90
|
-
]);
|
|
91
|
-
const hasSettings = _hasSettings?.(id) ?? false;
|
|
92
|
-
const handleSettings = useCallback(() => onSettings?.(id), [
|
|
93
|
-
id,
|
|
94
|
-
onSettings
|
|
95
|
-
]);
|
|
96
|
-
return /* @__PURE__ */ React2.createElement(ListItem.Root, {
|
|
97
|
-
key: id,
|
|
98
|
-
labelId,
|
|
99
|
-
"data-testid": `pluginList.${id}`,
|
|
100
|
-
"aria-describedby": descriptionId,
|
|
101
|
-
// TODO(burdon): Use Rail vars.
|
|
102
|
-
classNames: "w-full h-full grid grid-cols-[48px_1fr_48px] grid-rows-[40px_1fr_32px] p-1 border border-separator rounded-md"
|
|
103
|
-
}, /* @__PURE__ */ React2.createElement("div", {
|
|
104
|
-
className: "flex justify-center items-center"
|
|
105
|
-
}, /* @__PURE__ */ React2.createElement(Icon2, {
|
|
106
|
-
icon,
|
|
107
|
-
size: 6,
|
|
108
|
-
onClick: handleClick,
|
|
109
|
-
classNames: "text-subdued cursor-pointer"
|
|
110
|
-
})), /* @__PURE__ */ React2.createElement("div", {
|
|
111
|
-
className: "flex items-center overflow-hidden cursor-pointer",
|
|
112
|
-
onClick: handleClick
|
|
113
|
-
}, /* @__PURE__ */ React2.createElement("span", {
|
|
114
|
-
className: "truncate"
|
|
115
|
-
}, name ?? id)), /* @__PURE__ */ React2.createElement("div", {
|
|
116
|
-
className: "flex justify-center items-center"
|
|
117
|
-
}, /* @__PURE__ */ React2.createElement(Input2.Root, {
|
|
118
|
-
id: inputId
|
|
119
|
-
}, /* @__PURE__ */ React2.createElement(Input2.Switch, {
|
|
120
|
-
classNames: "self-center",
|
|
121
|
-
checked: isEnabled,
|
|
122
|
-
onClick: handleChange
|
|
123
|
-
}))), /* @__PURE__ */ React2.createElement("div", null), /* @__PURE__ */ React2.createElement("div", {
|
|
124
|
-
id: descriptionId,
|
|
125
|
-
className: "col-span-2 pb-3"
|
|
126
|
-
}, /* @__PURE__ */ React2.createElement("p", {
|
|
127
|
-
className: mx(descriptionText, "line-clamp-3 min-w-0 pie-4")
|
|
128
|
-
}, description)), /* @__PURE__ */ React2.createElement("div", null), /* @__PURE__ */ React2.createElement("div", {
|
|
129
|
-
className: "flex gap-2 items-center pie-1"
|
|
130
|
-
}, /* @__PURE__ */ React2.createElement(Link2, {
|
|
131
|
-
"aria-describedby": descriptionId,
|
|
132
|
-
classNames: "text-sm text-description cursor-pointer",
|
|
133
|
-
onClick: handleClick
|
|
134
|
-
}, t("details label")), /* @__PURE__ */ React2.createElement("div", {
|
|
135
|
-
className: "flex-1"
|
|
136
|
-
})), /* @__PURE__ */ React2.createElement("div", {
|
|
137
|
-
className: "flex justify-center items-center"
|
|
138
|
-
}, hasSettings && /* @__PURE__ */ React2.createElement(IconButton, {
|
|
139
|
-
"aria-describedby": descriptionId,
|
|
140
|
-
classNames: "text-sm text-description cursor-pointer",
|
|
141
|
-
icon: "ph--faders--regular",
|
|
142
|
-
label: t("settings label"),
|
|
143
|
-
iconOnly: true,
|
|
144
|
-
size: 4,
|
|
145
|
-
onClick: handleSettings
|
|
146
|
-
})));
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
// packages/plugins/plugin-registry/src/components/PluginList.tsx
|
|
150
|
-
var PluginList = ({ plugins = [], ...props }) => {
|
|
151
|
-
return /* @__PURE__ */ React3.createElement(List, {
|
|
152
|
-
classNames: "grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] auto-rows-[10rem] gap-3 p-3"
|
|
153
|
-
}, plugins.map((plugin) => /* @__PURE__ */ React3.createElement("div", {
|
|
154
|
-
key: plugin.meta.id,
|
|
155
|
-
className: "flex"
|
|
156
|
-
}, /* @__PURE__ */ React3.createElement(PluginItem, {
|
|
157
|
-
plugin,
|
|
158
|
-
...props
|
|
159
|
-
}))));
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
// packages/plugins/plugin-registry/src/components/RegistryContainer.tsx
|
|
163
|
-
import React4, { useCallback as useCallback2, useMemo } from "react";
|
|
164
|
-
import { Capabilities, createIntent, LayoutAction, SettingsAction, useCapability, useIntentDispatcher, usePluginManager } from "@dxos/app-framework";
|
|
165
|
-
import { ObservabilityAction } from "@dxos/plugin-observability/types";
|
|
166
|
-
import { StackItem } from "@dxos/react-ui-stack";
|
|
167
|
-
var sortByPluginMeta = ({ meta: { name: a = "" } }, { meta: { name: b = "" } }) => a.localeCompare(b);
|
|
168
|
-
var RegistryContainer = ({ id, plugins: _plugins }) => {
|
|
169
|
-
const manager = usePluginManager();
|
|
170
|
-
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
171
|
-
const plugins = useMemo(() => _plugins.sort(sortByPluginMeta), [
|
|
172
|
-
_plugins
|
|
173
|
-
]);
|
|
174
|
-
const settingsStore = useCapability(Capabilities.SettingsStore);
|
|
175
|
-
const handleChange = useCallback2(async (id2, enabled) => {
|
|
176
|
-
if (enabled) {
|
|
177
|
-
await manager.enable(id2);
|
|
178
|
-
} else {
|
|
179
|
-
await manager.disable(id2);
|
|
180
|
-
}
|
|
181
|
-
await dispatch(createIntent(ObservabilityAction.SendEvent, {
|
|
182
|
-
name: "plugins.toggle",
|
|
183
|
-
properties: {
|
|
184
|
-
plugin: id2,
|
|
185
|
-
enabled
|
|
186
|
-
}
|
|
187
|
-
}));
|
|
188
|
-
}, [
|
|
189
|
-
dispatch,
|
|
190
|
-
manager
|
|
191
|
-
]);
|
|
192
|
-
const handleClick = useCallback2((pluginId) => dispatch(createIntent(LayoutAction.Open, {
|
|
193
|
-
part: "main",
|
|
194
|
-
// TODO(wittjosiah): `/` currently is not supported in ids.
|
|
195
|
-
subject: [
|
|
196
|
-
pluginId.replaceAll("/", ":")
|
|
197
|
-
],
|
|
198
|
-
options: {
|
|
199
|
-
pivotId: id,
|
|
200
|
-
positioning: "end"
|
|
201
|
-
}
|
|
202
|
-
})), [
|
|
203
|
-
dispatch,
|
|
204
|
-
id
|
|
205
|
-
]);
|
|
206
|
-
const hasSettings = useCallback2((pluginId) => !!settingsStore.getStore(pluginId), [
|
|
207
|
-
settingsStore
|
|
208
|
-
]);
|
|
209
|
-
const handleSettings = useCallback2((pluginId) => dispatch(createIntent(SettingsAction.Open, {
|
|
210
|
-
plugin: pluginId
|
|
211
|
-
})), [
|
|
212
|
-
dispatch
|
|
213
|
-
]);
|
|
214
|
-
return /* @__PURE__ */ React4.createElement(StackItem.Content, {
|
|
215
|
-
classNames: "min-bs-0 overflow-y-auto scrollbar-thin contain-layout"
|
|
216
|
-
}, /* @__PURE__ */ React4.createElement(PluginList, {
|
|
217
|
-
plugins,
|
|
218
|
-
enabled: manager.enabled,
|
|
219
|
-
onClick: handleClick,
|
|
220
|
-
onChange: handleChange,
|
|
221
|
-
hasSettings,
|
|
222
|
-
onSettings: handleSettings
|
|
223
|
-
}));
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
// packages/plugins/plugin-registry/src/capabilities/react-surface.tsx
|
|
227
|
-
var react_surface_default = () => contributes(Capabilities2.ReactSurface, [
|
|
228
|
-
createSurface({
|
|
229
|
-
id: `${REGISTRY_PLUGIN}/all`,
|
|
230
|
-
role: "article",
|
|
231
|
-
filter: (data) => data.subject === `${REGISTRY_KEY}+all`,
|
|
232
|
-
component: () => {
|
|
233
|
-
const manager = usePluginManager2();
|
|
234
|
-
const filtered = useMemo2(() => manager.plugins.filter(({ meta }) => !manager.core.includes(meta.id)), []);
|
|
235
|
-
return /* @__PURE__ */ React5.createElement(RegistryContainer, {
|
|
236
|
-
id: `${REGISTRY_KEY}+all`,
|
|
237
|
-
plugins: filtered
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
}),
|
|
241
|
-
createSurface({
|
|
242
|
-
id: `${REGISTRY_PLUGIN}/installed`,
|
|
243
|
-
role: "article",
|
|
244
|
-
filter: (data) => data.subject === `${REGISTRY_KEY}+installed`,
|
|
245
|
-
component: () => {
|
|
246
|
-
const manager = usePluginManager2();
|
|
247
|
-
const filtered = useMemo2(() => manager.plugins.filter(({ meta }) => !manager.core.includes(meta.id)).filter(({ meta }) => manager.enabled.includes(meta.id)), []);
|
|
248
|
-
return /* @__PURE__ */ React5.createElement(RegistryContainer, {
|
|
249
|
-
id: `${REGISTRY_KEY}+installed`,
|
|
250
|
-
plugins: filtered
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
}),
|
|
254
|
-
createSurface({
|
|
255
|
-
id: `${REGISTRY_PLUGIN}/recommended`,
|
|
256
|
-
role: "article",
|
|
257
|
-
filter: (data) => data.subject === `${REGISTRY_KEY}+recommended`,
|
|
258
|
-
component: () => {
|
|
259
|
-
const manager = usePluginManager2();
|
|
260
|
-
const filtered = useMemo2(() => manager.plugins.filter(({ meta }) => !manager.core.includes(meta.id)).filter(({ meta }) => !meta.tags?.includes("experimental")), []);
|
|
261
|
-
return /* @__PURE__ */ React5.createElement(RegistryContainer, {
|
|
262
|
-
id: `${REGISTRY_KEY}+recommended`,
|
|
263
|
-
plugins: filtered
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}),
|
|
267
|
-
createSurface({
|
|
268
|
-
id: `${REGISTRY_PLUGIN}/experimental`,
|
|
269
|
-
role: "article",
|
|
270
|
-
filter: (data) => data.subject === `${REGISTRY_KEY}+experimental`,
|
|
271
|
-
component: () => {
|
|
272
|
-
const manager = usePluginManager2();
|
|
273
|
-
const filtered = useMemo2(() => manager.plugins.filter(({ meta }) => meta.tags?.includes("experimental")), []);
|
|
274
|
-
return /* @__PURE__ */ React5.createElement(RegistryContainer, {
|
|
275
|
-
id: `${REGISTRY_KEY}+experimental`,
|
|
276
|
-
plugins: filtered
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
}),
|
|
280
|
-
createSurface({
|
|
281
|
-
id: `${REGISTRY_PLUGIN}/plugin-details`,
|
|
282
|
-
role: "article",
|
|
283
|
-
filter: (data) => data.subject instanceof Plugin,
|
|
284
|
-
component: ({ data: { subject } }) => {
|
|
285
|
-
const manager = usePluginManager2();
|
|
286
|
-
const enabled = manager.enabled.includes(subject.meta.id);
|
|
287
|
-
const handleEnable = useCallback3(() => enabled ? manager.disable(subject.meta.id) : manager.enable(subject.meta.id), [
|
|
288
|
-
manager,
|
|
289
|
-
subject.meta.id,
|
|
290
|
-
enabled
|
|
291
|
-
]);
|
|
292
|
-
return /* @__PURE__ */ React5.createElement(StackItem2.Content, {
|
|
293
|
-
role: "article"
|
|
294
|
-
}, /* @__PURE__ */ React5.createElement(PluginDetail, {
|
|
295
|
-
plugin: subject,
|
|
296
|
-
enabled,
|
|
297
|
-
onEnable: handleEnable
|
|
298
|
-
}));
|
|
299
|
-
}
|
|
300
|
-
})
|
|
301
|
-
]);
|
|
302
|
-
export {
|
|
303
|
-
react_surface_default as default
|
|
304
|
-
};
|
|
305
|
-
//# sourceMappingURL=react-surface-PNR23BFI.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/PluginDetail.tsx", "../../../src/components/PluginList.tsx", "../../../src/components/PluginItem.tsx", "../../../src/components/RegistryContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Capabilities, contributes, createSurface, Plugin, usePluginManager } from '@dxos/app-framework';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { PluginDetail, RegistryContainer } from '../components';\nimport { REGISTRY_KEY, REGISTRY_PLUGIN } from '../meta';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${REGISTRY_PLUGIN}/all`,\n role: 'article',\n filter: (data): data is any => data.subject === `${REGISTRY_KEY}+all`,\n component: () => {\n const manager = usePluginManager();\n const filtered = useMemo(() => manager.plugins.filter(({ meta }) => !manager.core.includes(meta.id)), []);\n\n return <RegistryContainer id={`${REGISTRY_KEY}+all`} plugins={filtered} />;\n },\n }),\n createSurface({\n id: `${REGISTRY_PLUGIN}/installed`,\n role: 'article',\n filter: (data): data is any => data.subject === `${REGISTRY_KEY}+installed`,\n component: () => {\n const manager = usePluginManager();\n const filtered = useMemo(\n () =>\n manager.plugins\n .filter(({ meta }) => !manager.core.includes(meta.id))\n .filter(({ meta }) => manager.enabled.includes(meta.id)),\n [],\n );\n\n return <RegistryContainer id={`${REGISTRY_KEY}+installed`} plugins={filtered} />;\n },\n }),\n createSurface({\n id: `${REGISTRY_PLUGIN}/recommended`,\n role: 'article',\n filter: (data): data is any => data.subject === `${REGISTRY_KEY}+recommended`,\n component: () => {\n const manager = usePluginManager();\n const filtered = useMemo(\n () =>\n manager.plugins\n .filter(({ meta }) => !manager.core.includes(meta.id))\n .filter(({ meta }) => !meta.tags?.includes('experimental')),\n [],\n );\n\n return <RegistryContainer id={`${REGISTRY_KEY}+recommended`} plugins={filtered} />;\n },\n }),\n createSurface({\n id: `${REGISTRY_PLUGIN}/experimental`,\n role: 'article',\n filter: (data): data is any => data.subject === `${REGISTRY_KEY}+experimental`,\n component: () => {\n const manager = usePluginManager();\n const filtered = useMemo(() => manager.plugins.filter(({ meta }) => meta.tags?.includes('experimental')), []);\n\n return <RegistryContainer id={`${REGISTRY_KEY}+experimental`} plugins={filtered} />;\n },\n }),\n createSurface({\n id: `${REGISTRY_PLUGIN}/plugin-details`,\n role: 'article',\n filter: (data): data is { subject: Plugin } => data.subject instanceof Plugin,\n component: ({ data: { subject } }) => {\n const manager = usePluginManager();\n const enabled = manager.enabled.includes(subject.meta.id);\n const handleEnable = useCallback(\n () => (enabled ? manager.disable(subject.meta.id) : manager.enable(subject.meta.id)),\n [manager, subject.meta.id, enabled],\n );\n\n return (\n <StackItem.Content role='article'>\n <PluginDetail plugin={subject} enabled={enabled} onEnable={handleEnable} />\n </StackItem.Content>\n );\n },\n }),\n ]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { Icon, Input, Link, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\nimport { REGISTRY_PLUGIN } from '../meta';\n\nexport type PluginDetailProps = {\n plugin: Plugin;\n enabled?: boolean;\n onEnable?: () => void;\n};\n\nexport const PluginDetail = ({ plugin, enabled, onEnable }: PluginDetailProps) => {\n const { t } = useTranslation(REGISTRY_PLUGIN);\n const { id, name, description, homePage, source, screenshots } = plugin.meta;\n\n return (\n <DeprecatedFormContainer classNames='gap-6'>\n <div role='none' className='flex justify-between items-center'>\n <p>{id}</p>\n <Input.Root>\n <Input.Switch classNames='self-center' checked={enabled} onClick={onEnable} />\n </Input.Root>\n </div>\n\n {screenshots && screenshots.length > 0 && (\n <div role='none'>\n <h1 className='text-lg mb-2'>Preview</h1>\n <img src={screenshots[0]} alt={name} className='aspect-video object-fit' />\n </div>\n )}\n\n <div role='none'>\n <p>{description}</p>\n </div>\n\n <div role='none'>\n <h1 className='text-lg mb-2'>Resources</h1>\n <div className='flex gap-2'>\n {homePage && (\n <Link href={homePage} target='_blank' rel='noreferrer' classNames='text-sm text-description'>\n {t('home page label')}\n <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />\n </Link>\n )}\n\n {source && (\n <Link href={source} target='_blank' rel='noreferrer' classNames='text-sm text-description'>\n {t('source label')}\n <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />\n </Link>\n )}\n </div>\n </div>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { List } from '@dxos/react-ui';\n\nimport { PluginItem, type PluginItemProps } from './PluginItem';\n\nexport type PluginListProps = Omit<PluginItemProps, 'plugin'> & {\n plugins?: readonly Plugin[];\n};\n\nexport const PluginList = ({ plugins = [], ...props }: PluginListProps) => {\n return (\n <List classNames='grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] auto-rows-[10rem] gap-3 p-3'>\n {plugins.map((plugin) => (\n <div key={plugin.meta.id} className='flex'>\n <PluginItem plugin={plugin} {...props} />\n </div>\n ))}\n </List>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type MouseEvent, useCallback } from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { Icon, IconButton, Input, Link, ListItem, useTranslation } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { REGISTRY_PLUGIN } from '../meta';\n\nexport type PluginItemProps = {\n plugin: Plugin;\n installed?: readonly string[];\n enabled?: readonly string[];\n onClick?: (id: string) => void;\n onChange?: (id: string, enabled: boolean) => void;\n hasSettings?: (id: string) => boolean;\n onSettings?: (id: string) => void;\n};\n\nexport const PluginItem = ({\n plugin,\n enabled = [],\n onClick,\n onChange,\n hasSettings: _hasSettings,\n onSettings,\n}: PluginItemProps) => {\n const { t } = useTranslation(REGISTRY_PLUGIN);\n const { id, name, description, icon = 'ph--circle--regular' } = plugin.meta;\n const isEnabled = enabled.includes(id);\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n const descriptionId = `${id}-description`;\n const handleClick = useCallback(() => onClick?.(id), [id, onClick]);\n\n const handleChange = useCallback(\n (event: MouseEvent) => {\n event.stopPropagation();\n onChange?.(id, !isEnabled);\n },\n [id, isEnabled, onChange],\n );\n\n const hasSettings = _hasSettings?.(id) ?? false;\n const handleSettings = useCallback(() => onSettings?.(id), [id, onSettings]);\n\n return (\n <ListItem.Root\n key={id}\n labelId={labelId}\n data-testid={`pluginList.${id}`}\n aria-describedby={descriptionId}\n // TODO(burdon): Use Rail vars.\n classNames='w-full h-full grid grid-cols-[48px_1fr_48px] grid-rows-[40px_1fr_32px] p-1 border border-separator rounded-md'\n >\n {/* Header. */}\n <div className='flex justify-center items-center'>\n <Icon icon={icon} size={6} onClick={handleClick} classNames='text-subdued cursor-pointer' />\n </div>\n <div className='flex items-center overflow-hidden cursor-pointer' onClick={handleClick}>\n <span className='truncate'>{name ?? id}</span>\n </div>\n <div className='flex justify-center items-center'>\n <Input.Root id={inputId}>\n <Input.Switch classNames='self-center' checked={isEnabled} onClick={handleChange} />\n </Input.Root>\n </div>\n\n {/* Body. */}\n <div />\n <div id={descriptionId} className='col-span-2 pb-3'>\n <p className={mx(descriptionText, 'line-clamp-3 min-w-0 pie-4')}>{description}</p>\n </div>\n\n {/* Footer. */}\n <div />\n <div className='flex gap-2 items-center pie-1'>\n <Link\n aria-describedby={descriptionId}\n classNames='text-sm text-description cursor-pointer'\n onClick={handleClick}\n >\n {t('details label')}\n </Link>\n\n <div className='flex-1' />\n </div>\n <div className='flex justify-center items-center'>\n {hasSettings && (\n <IconButton\n aria-describedby={descriptionId}\n classNames='text-sm text-description cursor-pointer'\n icon='ph--faders--regular'\n label={t('settings label')}\n iconOnly\n size={4}\n onClick={handleSettings}\n />\n )}\n </div>\n </ListItem.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Capabilities,\n createIntent,\n LayoutAction,\n type Plugin,\n SettingsAction,\n useCapability,\n useIntentDispatcher,\n usePluginManager,\n} from '@dxos/app-framework';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { PluginList } from './PluginList';\n\nconst sortByPluginMeta = ({ meta: { name: a = '' } }: Plugin, { meta: { name: b = '' } }: Plugin) => a.localeCompare(b);\n\nexport const RegistryContainer = ({ id, plugins: _plugins }: { id: string; plugins: Plugin[] }) => {\n const manager = usePluginManager();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const plugins = useMemo(() => _plugins.sort(sortByPluginMeta), [_plugins]);\n const settingsStore = useCapability(Capabilities.SettingsStore);\n\n // TODO(wittjosiah): Factor out to an intent?\n const handleChange = useCallback(\n async (id: string, enabled: boolean) => {\n if (enabled) {\n await manager.enable(id);\n } else {\n await manager.disable(id);\n }\n\n await dispatch(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'plugins.toggle',\n properties: {\n plugin: id,\n enabled,\n },\n }),\n );\n },\n [dispatch, manager],\n );\n\n const handleClick = useCallback(\n (pluginId: string) =>\n dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n // TODO(wittjosiah): `/` currently is not supported in ids.\n subject: [pluginId.replaceAll('/', ':')],\n options: { pivotId: id, positioning: 'end' },\n }),\n ),\n [dispatch, id],\n );\n\n const hasSettings = useCallback((pluginId: string) => !!settingsStore.getStore(pluginId), [settingsStore]);\n\n const handleSettings = useCallback(\n (pluginId: string) => dispatch(createIntent(SettingsAction.Open, { plugin: pluginId })),\n [dispatch],\n );\n\n return (\n <StackItem.Content classNames='min-bs-0 overflow-y-auto scrollbar-thin contain-layout'>\n <PluginList\n plugins={plugins}\n enabled={manager.enabled}\n onClick={handleClick}\n onChange={handleChange}\n hasSettings={hasSettings}\n onSettings={handleSettings}\n />\n </StackItem.Content>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useCallback", "useMemo", "Capabilities", "contributes", "createSurface", "Plugin", "usePluginManager", "StackItem", "React", "Icon", "Input", "Link", "useTranslation", "DeprecatedFormContainer", "PluginDetail", "plugin", "enabled", "onEnable", "t", "useTranslation", "REGISTRY_PLUGIN", "id", "name", "description", "homePage", "source", "screenshots", "meta", "DeprecatedFormContainer", "classNames", "div", "role", "className", "p", "Input", "Root", "Switch", "checked", "onClick", "length", "h1", "img", "src", "alt", "Link", "href", "target", "rel", "Icon", "icon", "size", "React", "List", "React", "useCallback", "Icon", "IconButton", "Input", "Link", "ListItem", "useTranslation", "descriptionText", "mx", "PluginItem", "plugin", "enabled", "onClick", "onChange", "hasSettings", "_hasSettings", "onSettings", "t", "useTranslation", "REGISTRY_PLUGIN", "id", "name", "description", "icon", "meta", "isEnabled", "includes", "inputId", "labelId", "descriptionId", "handleClick", "useCallback", "handleChange", "event", "stopPropagation", "handleSettings", "React", "ListItem", "Root", "key", "data-testid", "aria-describedby", "classNames", "div", "className", "Icon", "size", "span", "Input", "Switch", "checked", "p", "mx", "descriptionText", "Link", "IconButton", "label", "iconOnly", "PluginList", "plugins", "props", "React", "List", "classNames", "map", "plugin", "div", "key", "meta", "id", "className", "PluginItem", "React", "useCallback", "useMemo", "Capabilities", "createIntent", "LayoutAction", "SettingsAction", "useCapability", "useIntentDispatcher", "usePluginManager", "ObservabilityAction", "StackItem", "sortByPluginMeta", "meta", "name", "a", "b", "localeCompare", "RegistryContainer", "id", "plugins", "_plugins", "manager", "usePluginManager", "dispatchPromise", "dispatch", "useIntentDispatcher", "useMemo", "sort", "settingsStore", "useCapability", "Capabilities", "SettingsStore", "handleChange", "useCallback", "enabled", "enable", "disable", "createIntent", "ObservabilityAction", "SendEvent", "properties", "plugin", "handleClick", "pluginId", "LayoutAction", "Open", "part", "subject", "replaceAll", "options", "pivotId", "positioning", "hasSettings", "getStore", "handleSettings", "SettingsAction", "React", "StackItem", "Content", "classNames", "PluginList", "onClick", "onChange", "onSettings", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "REGISTRY_PLUGIN", "role", "filter", "data", "subject", "REGISTRY_KEY", "component", "manager", "usePluginManager", "filtered", "useMemo", "plugins", "meta", "core", "includes", "React", "RegistryContainer", "enabled", "tags", "Plugin", "handleEnable", "useCallback", "disable", "enable", "StackItem", "Content", "PluginDetail", "plugin", "onEnable"]
|
|
7
|
-
}
|