@dxos/plugin-registry 0.8.4-main.f9ba587 → 0.8.4-main.fffef41

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 (66) hide show
  1. package/dist/lib/browser/{app-graph-builder-LKQBQDUA.mjs → app-graph-builder-6CNBP3A4.mjs} +27 -26
  2. package/dist/lib/browser/app-graph-builder-6CNBP3A4.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-XPEFEID2.mjs +19 -0
  4. package/dist/lib/browser/chunk-XPEFEID2.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +6 -8
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/{intent-resolver-W67CIJI3.mjs → intent-resolver-LKNUYBTN.mjs} +5 -5
  8. package/dist/lib/browser/{intent-resolver-W67CIJI3.mjs.map → intent-resolver-LKNUYBTN.mjs.map} +3 -3
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/{react-surface-SRFVJQKE.mjs → react-surface-IGCXOVE2.mjs} +116 -92
  11. package/dist/lib/browser/react-surface-IGCXOVE2.mjs.map +7 -0
  12. package/dist/types/src/RegistryPlugin.d.ts +1 -1
  13. package/dist/types/src/RegistryPlugin.d.ts.map +1 -1
  14. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  15. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  16. package/dist/types/src/capabilities/index.d.ts +3 -3
  17. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  18. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  19. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  20. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  21. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  22. package/dist/types/src/components/PluginDetail.d.ts.map +1 -1
  23. package/dist/types/src/components/PluginDetail.stories.d.ts +29 -5
  24. package/dist/types/src/components/PluginDetail.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/PluginItem.d.ts +1 -1
  26. package/dist/types/src/components/PluginItem.d.ts.map +1 -1
  27. package/dist/types/src/components/PluginList.d.ts.map +1 -1
  28. package/dist/types/src/components/PluginList.stories.d.ts +31 -8
  29. package/dist/types/src/components/PluginList.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/RegistryContainer.d.ts.map +1 -1
  31. package/dist/types/src/meta.d.ts +0 -1
  32. package/dist/types/src/meta.d.ts.map +1 -1
  33. package/dist/types/src/types.d.ts +3 -1
  34. package/dist/types/src/types.d.ts.map +1 -1
  35. package/dist/types/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +28 -30
  37. package/src/RegistryPlugin.tsx +23 -24
  38. package/src/capabilities/app-graph-builder.ts +27 -26
  39. package/src/capabilities/intent-resolver.ts +4 -4
  40. package/src/capabilities/react-surface.tsx +9 -13
  41. package/src/components/PluginDetail.stories.tsx +9 -9
  42. package/src/components/PluginDetail.tsx +53 -34
  43. package/src/components/PluginItem.tsx +53 -52
  44. package/src/components/PluginList.stories.tsx +25 -27
  45. package/src/components/PluginList.tsx +2 -4
  46. package/src/components/RegistryContainer.tsx +3 -11
  47. package/src/meta.ts +6 -3
  48. package/src/types.ts +5 -1
  49. package/dist/lib/browser/app-graph-builder-LKQBQDUA.mjs.map +0 -7
  50. package/dist/lib/browser/chunk-AEBASNOI.mjs +0 -16
  51. package/dist/lib/browser/chunk-AEBASNOI.mjs.map +0 -7
  52. package/dist/lib/browser/react-surface-SRFVJQKE.mjs.map +0 -7
  53. package/dist/lib/node-esm/app-graph-builder-N44OGVQA.mjs +0 -162
  54. package/dist/lib/node-esm/app-graph-builder-N44OGVQA.mjs.map +0 -7
  55. package/dist/lib/node-esm/chunk-R3GXMWPJ.mjs +0 -18
  56. package/dist/lib/node-esm/chunk-R3GXMWPJ.mjs.map +0 -7
  57. package/dist/lib/node-esm/index.mjs +0 -72
  58. package/dist/lib/node-esm/index.mjs.map +0 -7
  59. package/dist/lib/node-esm/intent-resolver-M2CBVUVQ.mjs +0 -24
  60. package/dist/lib/node-esm/intent-resolver-M2CBVUVQ.mjs.map +0 -7
  61. package/dist/lib/node-esm/meta.json +0 -1
  62. package/dist/lib/node-esm/react-surface-5XAG2EYX.mjs +0 -336
  63. package/dist/lib/node-esm/react-surface-5XAG2EYX.mjs.map +0 -7
  64. package/dist/types/src/components/Icon.stories.d.ts +0 -6
  65. package/dist/types/src/components/Icon.stories.d.ts.map +0 -1
  66. package/src/components/Icon.stories.tsx +0 -107
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-registry",
3
- "version": "0.8.4-main.f9ba587",
3
+ "version": "0.8.4-main.fffef41",
4
4
  "description": "Braneframe plugin gallery",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,6 +10,7 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs"
15
16
  }
@@ -24,41 +25,38 @@
24
25
  ],
25
26
  "dependencies": {
26
27
  "@preact-signals/safe-react": "^0.9.0",
27
- "@dxos/app-framework": "0.8.4-main.f9ba587",
28
- "@dxos/echo": "0.8.4-main.f9ba587",
29
- "@dxos/echo-schema": "0.8.4-main.f9ba587",
30
- "@dxos/invariant": "0.8.4-main.f9ba587",
31
- "@dxos/plugin-graph": "0.8.4-main.f9ba587",
32
- "@dxos/live-object": "0.8.4-main.f9ba587",
33
- "@dxos/react-ui-form": "0.8.4-main.f9ba587",
34
- "@dxos/react-ui-stack": "0.8.4-main.f9ba587",
35
- "@dxos/plugin-observability": "0.8.4-main.f9ba587",
36
- "@dxos/util": "0.8.4-main.f9ba587"
28
+ "@dxos/app-framework": "0.8.4-main.fffef41",
29
+ "@dxos/invariant": "0.8.4-main.fffef41",
30
+ "@dxos/live-object": "0.8.4-main.fffef41",
31
+ "@dxos/echo": "0.8.4-main.fffef41",
32
+ "@dxos/plugin-graph": "0.8.4-main.fffef41",
33
+ "@dxos/react-ui-form": "0.8.4-main.fffef41",
34
+ "@dxos/util": "0.8.4-main.fffef41",
35
+ "@dxos/plugin-observability": "0.8.4-main.fffef41",
36
+ "@dxos/react-ui-stack": "0.8.4-main.fffef41"
37
37
  },
38
38
  "devDependencies": {
39
- "@effect-rx/rx-react": "0.38.0",
40
- "@effect/platform": "0.88.0",
41
- "@phosphor-icons/react": "^2.1.5",
42
- "@types/react": "~18.2.0",
43
- "@types/react-dom": "~18.2.0",
44
- "effect": "3.16.13",
45
- "react": "~18.2.0",
46
- "react-dom": "~18.2.0",
47
- "vite": "5.4.7",
48
- "@dxos/random": "0.8.4-main.f9ba587",
49
- "@dxos/react-ui": "0.8.4-main.f9ba587",
50
- "@dxos/react-ui-theme": "0.8.4-main.f9ba587",
51
- "@dxos/storybook-utils": "0.8.4-main.f9ba587"
39
+ "@effect-atom/atom-react": "^0.3.4",
40
+ "@effect/platform": "0.92.1",
41
+ "@types/react": "~19.2.2",
42
+ "@types/react-dom": "~19.2.2",
43
+ "effect": "3.18.3",
44
+ "react": "~19.2.0",
45
+ "react-dom": "~19.2.0",
46
+ "vite": "7.1.9",
47
+ "@dxos/random": "0.8.4-main.fffef41",
48
+ "@dxos/storybook-utils": "0.8.4-main.fffef41",
49
+ "@dxos/react-ui-theme": "0.8.4-main.fffef41",
50
+ "@dxos/react-ui": "0.8.4-main.fffef41"
52
51
  },
53
52
  "peerDependencies": {
54
- "@effect-rx/rx-react": "^0.34.1",
53
+ "@effect-atom/atom-react": "^0.3.4",
55
54
  "@effect/platform": "^0.80.12",
56
- "@phosphor-icons/react": "^2.1.5",
57
55
  "effect": "^3.13.3",
58
- "react": "~18.2.0",
59
- "react-dom": "~18.2.0",
60
- "@dxos/react-ui": "0.8.4-main.f9ba587",
61
- "@dxos/react-ui-theme": "0.8.4-main.f9ba587"
56
+ "react": "^19.0.0",
57
+ "react-dom": "^19.0.0",
58
+ "@dxos/react-ui": "0.8.4-main.fffef41",
59
+ "@dxos/react-ui-theme": "0.8.4-main.fffef41"
62
60
  },
63
61
  "publishConfig": {
64
62
  "access": "public"
@@ -2,32 +2,31 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, defineModule, definePlugin, Events } from '@dxos/app-framework';
5
+ import { Capabilities, Events, contributes, defineModule, definePlugin } from '@dxos/app-framework';
6
6
 
7
7
  import { AppGraphBuilder, IntentResolver, ReactSurface } from './capabilities';
8
8
  import { meta } from './meta';
9
9
  import { translations } from './translations';
10
10
 
11
- export const RegistryPlugin = () =>
12
- definePlugin(meta, [
13
- defineModule({
14
- id: `${meta.id}/module/translations`,
15
- activatesOn: Events.SetupTranslations,
16
- activate: () => contributes(Capabilities.Translations, translations),
17
- }),
18
- defineModule({
19
- id: `${meta.id}/module/react-surface`,
20
- activatesOn: Events.SetupReactSurface,
21
- activate: ReactSurface,
22
- }),
23
- defineModule({
24
- id: `${meta.id}/module/intent-resolver`,
25
- activatesOn: Events.SetupIntentResolver,
26
- activate: IntentResolver,
27
- }),
28
- defineModule({
29
- id: `${meta.id}/module/app-graph-builder`,
30
- activatesOn: Events.SetupAppGraph,
31
- activate: AppGraphBuilder,
32
- }),
33
- ]);
11
+ export const RegistryPlugin = definePlugin(meta, () => [
12
+ defineModule({
13
+ id: `${meta.id}/module/translations`,
14
+ activatesOn: Events.SetupTranslations,
15
+ activate: () => contributes(Capabilities.Translations, translations),
16
+ }),
17
+ defineModule({
18
+ id: `${meta.id}/module/react-surface`,
19
+ activatesOn: Events.SetupReactSurface,
20
+ activate: ReactSurface,
21
+ }),
22
+ defineModule({
23
+ id: `${meta.id}/module/intent-resolver`,
24
+ activatesOn: Events.SetupIntentResolver,
25
+ activate: IntentResolver,
26
+ }),
27
+ defineModule({
28
+ id: `${meta.id}/module/app-graph-builder`,
29
+ activatesOn: Events.SetupAppGraph,
30
+ activate: AppGraphBuilder,
31
+ }),
32
+ ]);
@@ -2,32 +2,33 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe } from 'effect';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
7
8
 
8
- import { Capabilities, contributes, createIntent, SettingsAction, type PluginContext } from '@dxos/app-framework';
9
+ import { Capabilities, type PluginContext, SettingsAction, contributes, createIntent } from '@dxos/app-framework';
9
10
  import { createExtension } from '@dxos/plugin-graph';
10
11
 
11
- import { REGISTRY_ID, REGISTRY_KEY, REGISTRY_PLUGIN } from '../meta';
12
+ import { REGISTRY_ID, REGISTRY_KEY, meta } from '../meta';
12
13
 
13
14
  export default (context: PluginContext) =>
14
15
  contributes(Capabilities.AppGraphBuilder, [
15
16
  createExtension({
16
- id: REGISTRY_PLUGIN,
17
+ id: meta.id,
17
18
  actions: (node) =>
18
- Rx.make((get) =>
19
- pipe(
19
+ Atom.make((get) =>
20
+ Function.pipe(
20
21
  get(node),
21
22
  Option.flatMap((node) => (node.id === 'root' ? Option.some(node) : Option.none())),
22
23
  Option.map((node) => [
23
24
  {
24
- id: REGISTRY_PLUGIN,
25
+ id: meta.id,
25
26
  data: async () => {
26
27
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
27
28
  await dispatch(createIntent(SettingsAction.OpenPluginRegistry));
28
29
  },
29
30
  properties: {
30
- label: ['open plugin registry label', { ns: REGISTRY_PLUGIN }],
31
+ label: ['open plugin registry label', { ns: meta.id }],
31
32
  icon: 'ph--squares-four--regular',
32
33
  disposition: 'menu',
33
34
  },
@@ -38,18 +39,18 @@ export default (context: PluginContext) =>
38
39
  ),
39
40
  }),
40
41
  createExtension({
41
- id: REGISTRY_PLUGIN,
42
+ id: meta.id,
42
43
  connector: (node) =>
43
- Rx.make((get) =>
44
- pipe(
44
+ Atom.make((get) =>
45
+ Function.pipe(
45
46
  get(node),
46
47
  Option.flatMap((node) => (node.id === 'root' ? Option.some(node) : Option.none())),
47
48
  Option.map((node) => [
48
49
  {
49
50
  id: REGISTRY_ID,
50
- type: REGISTRY_PLUGIN,
51
+ type: meta.id,
51
52
  properties: {
52
- label: ['plugin registry label', { ns: REGISTRY_PLUGIN }],
53
+ label: ['plugin registry label', { ns: meta.id }],
53
54
  icon: 'ph--squares-four--regular',
54
55
  disposition: 'pin-end',
55
56
  testId: 'treeView.pluginRegistry',
@@ -60,7 +61,7 @@ export default (context: PluginContext) =>
60
61
  type: 'category',
61
62
  data: `${REGISTRY_KEY}+all`,
62
63
  properties: {
63
- label: ['all plugins label', { ns: REGISTRY_PLUGIN }],
64
+ label: ['all plugins label', { ns: meta.id }],
64
65
  icon: 'ph--squares-four--regular',
65
66
  key: REGISTRY_KEY,
66
67
  testId: 'pluginRegistry.all',
@@ -71,7 +72,7 @@ export default (context: PluginContext) =>
71
72
  type: 'category',
72
73
  data: `${REGISTRY_KEY}+installed`,
73
74
  properties: {
74
- label: ['installed plugins label', { ns: REGISTRY_PLUGIN }],
75
+ label: ['installed plugins label', { ns: meta.id }],
75
76
  icon: 'ph--check--regular',
76
77
  key: REGISTRY_KEY,
77
78
  testId: 'pluginRegistry.installed',
@@ -82,7 +83,7 @@ export default (context: PluginContext) =>
82
83
  type: 'category',
83
84
  data: `${REGISTRY_KEY}+recommended`,
84
85
  properties: {
85
- label: ['recommended plugins label', { ns: REGISTRY_PLUGIN }],
86
+ label: ['recommended plugins label', { ns: meta.id }],
86
87
  icon: 'ph--star--regular',
87
88
  key: REGISTRY_KEY,
88
89
  testId: 'pluginRegistry.recommended',
@@ -93,7 +94,7 @@ export default (context: PluginContext) =>
93
94
  type: 'category',
94
95
  data: `${REGISTRY_KEY}+labs`,
95
96
  properties: {
96
- label: ['labs plugins label', { ns: REGISTRY_PLUGIN }],
97
+ label: ['labs plugins label', { ns: meta.id }],
97
98
  icon: 'ph--flask--regular',
98
99
  key: REGISTRY_KEY,
99
100
  testId: 'pluginRegistry.labs',
@@ -107,18 +108,18 @@ export default (context: PluginContext) =>
107
108
  ),
108
109
  }),
109
110
  createExtension({
110
- id: `${REGISTRY_PLUGIN}/actions`,
111
+ id: `${meta.id}/actions`,
111
112
  actions: (node) =>
112
- Rx.make((get) =>
113
- pipe(
113
+ Atom.make((get) =>
114
+ Function.pipe(
114
115
  get(node),
115
116
  Option.flatMap((node) => (node.id === REGISTRY_ID ? Option.some(node) : Option.none())),
116
117
  Option.map(() => [
117
118
  {
118
- id: `${REGISTRY_PLUGIN}/load-by-url`,
119
+ id: `${meta.id}/load-by-url`,
119
120
  data: async () => {},
120
121
  properties: {
121
- label: ['load by url label', { ns: REGISTRY_PLUGIN }],
122
+ label: ['load by url label', { ns: meta.id }],
122
123
  icon: 'ph--cloud-arrow-down--regular',
123
124
  disabled: true,
124
125
  },
@@ -129,10 +130,10 @@ export default (context: PluginContext) =>
129
130
  ),
130
131
  }),
131
132
  createExtension({
132
- id: `${REGISTRY_PLUGIN}/plugins`,
133
+ id: `${meta.id}/plugins`,
133
134
  connector: (node) =>
134
- Rx.make((get) =>
135
- pipe(
135
+ Atom.make((get) =>
136
+ Function.pipe(
136
137
  get(node),
137
138
  Option.flatMap((node) => (node.id === REGISTRY_ID ? Option.some(node) : Option.none())),
138
139
  Option.map(() => {
@@ -3,12 +3,12 @@
3
3
  //
4
4
 
5
5
  import {
6
- contributes,
7
- SettingsAction,
8
- createResolver,
9
- LayoutAction,
10
6
  Capabilities,
7
+ LayoutAction,
8
+ SettingsAction,
9
+ contributes,
11
10
  createIntent,
11
+ createResolver,
12
12
  } from '@dxos/app-framework';
13
13
 
14
14
  import { REGISTRY_ID } from '../meta';
@@ -4,16 +4,16 @@
4
4
 
5
5
  import React, { useCallback, useMemo } from 'react';
6
6
 
7
- import { Capabilities, contributes, createSurface, Plugin, usePluginManager } from '@dxos/app-framework';
8
- import { StackItem } from '@dxos/react-ui-stack';
7
+ import { Capabilities, Plugin, contributes, createSurface } from '@dxos/app-framework';
8
+ import { usePluginManager } from '@dxos/app-framework/react';
9
9
 
10
10
  import { PluginDetail, RegistryContainer } from '../components';
11
- import { REGISTRY_KEY, REGISTRY_PLUGIN } from '../meta';
11
+ import { REGISTRY_KEY, meta } from '../meta';
12
12
 
13
13
  export default () =>
14
14
  contributes(Capabilities.ReactSurface, [
15
15
  createSurface({
16
- id: `${REGISTRY_PLUGIN}/all`,
16
+ id: `${meta.id}/all`,
17
17
  role: 'article',
18
18
  filter: (data): data is any => data.subject === `${REGISTRY_KEY}+all`,
19
19
  component: () => {
@@ -24,7 +24,7 @@ export default () =>
24
24
  },
25
25
  }),
26
26
  createSurface({
27
- id: `${REGISTRY_PLUGIN}/installed`,
27
+ id: `${meta.id}/installed`,
28
28
  role: 'article',
29
29
  filter: (data): data is any => data.subject === `${REGISTRY_KEY}+installed`,
30
30
  component: () => {
@@ -41,7 +41,7 @@ export default () =>
41
41
  },
42
42
  }),
43
43
  createSurface({
44
- id: `${REGISTRY_PLUGIN}/recommended`,
44
+ id: `${meta.id}/recommended`,
45
45
  role: 'article',
46
46
  filter: (data): data is any => data.subject === `${REGISTRY_KEY}+recommended`,
47
47
  component: () => {
@@ -58,7 +58,7 @@ export default () =>
58
58
  },
59
59
  }),
60
60
  createSurface({
61
- id: `${REGISTRY_PLUGIN}/labs`,
61
+ id: `${meta.id}/labs`,
62
62
  role: 'article',
63
63
  filter: (data): data is any => data.subject === `${REGISTRY_KEY}+labs`,
64
64
  component: () => {
@@ -69,7 +69,7 @@ export default () =>
69
69
  },
70
70
  }),
71
71
  createSurface({
72
- id: `${REGISTRY_PLUGIN}/plugin-details`,
72
+ id: `${meta.id}/plugin-details`,
73
73
  role: 'article',
74
74
  filter: (data): data is { subject: Plugin } => data.subject instanceof Plugin,
75
75
  component: ({ data: { subject } }) => {
@@ -80,11 +80,7 @@ export default () =>
80
80
  [manager, subject.meta.id, enabled],
81
81
  );
82
82
 
83
- return (
84
- <StackItem.Content role='article'>
85
- <PluginDetail plugin={subject} enabled={enabled} onEnable={handleEnable} />
86
- </StackItem.Content>
87
- );
83
+ return <PluginDetail plugin={subject} enabled={enabled} onEnable={handleEnable} />;
88
84
  },
89
85
  }),
90
86
  ]);
@@ -2,28 +2,27 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
7
  import { faker } from '@dxos/random';
10
- import { withLayout, withTheme } from '@dxos/storybook-utils';
8
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
9
 
12
- import { PluginDetail, type PluginDetailProps } from './PluginDetail';
13
10
  import { translations } from '../translations';
14
11
 
15
- const meta: Meta<PluginDetailProps> = {
12
+ import { PluginDetail } from './PluginDetail';
13
+
14
+ const meta = {
16
15
  title: 'plugins/plugin-registry/PluginDetail',
17
16
  component: PluginDetail,
18
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
17
+ decorators: [withTheme, withLayout({ container: 'column' })],
19
18
  parameters: {
20
19
  translations,
21
20
  },
22
- };
21
+ } satisfies Meta<typeof PluginDetail>;
23
22
 
24
23
  export default meta;
25
24
 
26
- type Story = StoryObj<PluginDetailProps>;
25
+ type Story = StoryObj<typeof meta>;
27
26
 
28
27
  export const Default: Story = {
29
28
  args: {
@@ -33,6 +32,7 @@ export const Default: Story = {
33
32
  name: 'Test Plugin',
34
33
  description: faker.lorem.paragraphs(2),
35
34
  icon: 'ph--bug--regular',
35
+ iconHue: 'sky',
36
36
  homePage: 'https://example.com',
37
37
  source: 'https://github.com/example/test-plugin',
38
38
  screenshots: [
@@ -6,9 +6,10 @@ import React from 'react';
6
6
 
7
7
  import { type Plugin } from '@dxos/app-framework';
8
8
  import { Icon, Input, Link, useTranslation } from '@dxos/react-ui';
9
- import { DeprecatedFormContainer } from '@dxos/react-ui-form';
9
+ import { StackItem } from '@dxos/react-ui-stack';
10
+ import { getStyles, mx } from '@dxos/react-ui-theme';
10
11
 
11
- import { REGISTRY_PLUGIN } from '../meta';
12
+ import { meta } from '../meta';
12
13
 
13
14
  export type PluginDetailProps = {
14
15
  plugin: Plugin;
@@ -17,47 +18,65 @@ export type PluginDetailProps = {
17
18
  };
18
19
 
19
20
  export const PluginDetail = ({ plugin, enabled, onEnable }: PluginDetailProps) => {
20
- const { t } = useTranslation(REGISTRY_PLUGIN);
21
- const { id, name, description, homePage, source, screenshots } = plugin.meta;
21
+ const { t } = useTranslation(meta.id);
22
+ const {
23
+ id,
24
+ name,
25
+ description,
26
+ homePage,
27
+ source,
28
+ screenshots,
29
+ icon = 'ph--circle--regular',
30
+ iconHue = 'neutral',
31
+ } = plugin.meta;
32
+ const styles = getStyles(iconHue);
22
33
 
23
34
  return (
24
- <DeprecatedFormContainer classNames='gap-6'>
25
- <div role='none' className='flex justify-between items-center'>
26
- <p>{id}</p>
27
- <Input.Root>
28
- <Input.Switch classNames='self-center' checked={enabled} onClick={onEnable} />
29
- </Input.Root>
30
- </div>
31
-
32
- {screenshots && screenshots.length > 0 && (
35
+ <StackItem.Content scrollable>
36
+ <div role='none' className='grid grid-cols-[min-content_1fr] gap-4 container-max-width p-4'>
33
37
  <div role='none'>
34
- <h1 className='text-lg mb-2'>Preview</h1>
35
- <img src={screenshots[0]} alt={name} className='aspect-video object-fit' />
38
+ <Icon classNames={mx('p-1 rounded', styles.bg, styles.icon)} icon={icon} size={14} />
36
39
  </div>
37
- )}
40
+ <div role='none' className='flex flex-col gap-6'>
41
+ <div role='none' className='grid grid-cols-[1fr_min-content] gap-x-3 is-full pbs-1'>
42
+ <h2 className='text-xl'>{name}</h2>
43
+ <Input.Root>
44
+ <Input.Switch classNames='self-center' checked={enabled} onClick={onEnable} />
45
+ </Input.Root>
46
+ <p className='pbs-0.5 text-sm text-description'>{id}</p>
47
+ </div>
38
48
 
39
- <div role='none'>
40
- <p>{description}</p>
41
- </div>
49
+ <div role='none'>
50
+ <p className='text-description'>{description}</p>
51
+ </div>
42
52
 
43
- <div role='none'>
44
- <h1 className='text-lg mb-2'>Resources</h1>
45
- <div className='flex gap-2'>
46
- {homePage && (
47
- <Link href={homePage} target='_blank' rel='noreferrer' classNames='text-sm text-description'>
48
- {t('home page label')}
49
- <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />
50
- </Link>
53
+ {screenshots && screenshots.length > 0 && (
54
+ <div role='none' className='flex flex-col gap-2'>
55
+ <h2>Preview</h2>
56
+ <img src={screenshots[0]} alt={name} className='aspect-video object-fit' />
57
+ </div>
51
58
  )}
52
59
 
53
- {source && (
54
- <Link href={source} target='_blank' rel='noreferrer' classNames='text-sm text-description'>
55
- {t('source label')}
56
- <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />
57
- </Link>
58
- )}
60
+ <div role='none' className='flex flex-col gap-2'>
61
+ <h2>Resources</h2>
62
+ <div className='flex gap-2'>
63
+ {homePage && (
64
+ <Link href={homePage} target='_blank' rel='noreferrer' classNames='text-sm text-description'>
65
+ {t('home page label')}
66
+ <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />
67
+ </Link>
68
+ )}
69
+
70
+ {source && (
71
+ <Link href={source} target='_blank' rel='noreferrer' classNames='text-sm text-description'>
72
+ {t('source label')}
73
+ <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mli-1' />
74
+ </Link>
75
+ )}
76
+ </div>
77
+ </div>
59
78
  </div>
60
79
  </div>
61
- </DeprecatedFormContainer>
80
+ </StackItem.Content>
62
81
  );
63
82
  };