@dxos/plugin-registry 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6

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 (140) hide show
  1. package/dist/lib/browser/cli/index.mjs +219 -0
  2. package/dist/lib/browser/cli/index.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +52 -52
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/node-esm/cli/index.mjs +221 -0
  7. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +73 -0
  9. package/dist/lib/node-esm/index.mjs.map +7 -0
  10. package/dist/lib/node-esm/meta.json +1 -0
  11. package/dist/types/src/RegistryPlugin.d.ts +2 -1
  12. package/dist/types/src/RegistryPlugin.d.ts.map +1 -1
  13. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  14. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  15. package/dist/types/src/capabilities/index.d.ts +5 -3
  16. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  17. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  18. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  19. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  20. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  21. package/dist/types/src/cli/commands/disable.d.ts +11 -0
  22. package/dist/types/src/cli/commands/disable.d.ts.map +1 -0
  23. package/dist/types/src/cli/commands/enable.d.ts +11 -0
  24. package/dist/types/src/cli/commands/enable.d.ts.map +1 -0
  25. package/dist/types/src/cli/commands/index.d.ts +3 -0
  26. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  27. package/dist/types/src/cli/commands/list.d.ts +7 -0
  28. package/dist/types/src/cli/commands/list.d.ts.map +1 -0
  29. package/dist/types/src/cli/commands/util.d.ts +11 -0
  30. package/dist/types/src/cli/commands/util.d.ts.map +1 -0
  31. package/dist/types/src/cli/index.d.ts +3 -0
  32. package/dist/types/src/cli/index.d.ts.map +1 -0
  33. package/dist/types/src/cli/plugin.d.ts +3 -0
  34. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  35. package/dist/types/src/cli/storage.d.ts +18 -0
  36. package/dist/types/src/cli/storage.d.ts.map +1 -0
  37. package/dist/types/src/components/PluginDetail/PluginDetail.d.ts +15 -0
  38. package/dist/types/src/components/PluginDetail/PluginDetail.d.ts.map +1 -0
  39. package/dist/types/src/components/PluginDetail/PluginDetail.stories.d.ts +43 -0
  40. package/dist/types/src/components/PluginDetail/PluginDetail.stories.d.ts.map +1 -0
  41. package/dist/types/src/components/PluginDetail/index.d.ts +2 -0
  42. package/dist/types/src/components/PluginDetail/index.d.ts.map +1 -0
  43. package/dist/types/src/components/{PluginItem.d.ts → PluginList/PluginItem.d.ts} +2 -2
  44. package/dist/types/src/components/PluginList/PluginItem.d.ts.map +1 -0
  45. package/dist/types/src/components/{PluginList.d.ts → PluginList/PluginList.d.ts} +1 -1
  46. package/dist/types/src/components/PluginList/PluginList.d.ts.map +1 -0
  47. package/dist/types/src/components/PluginList/PluginList.stories.d.ts +38 -0
  48. package/dist/types/src/components/PluginList/PluginList.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/PluginList/index.d.ts +2 -0
  50. package/dist/types/src/components/PluginList/index.d.ts.map +1 -0
  51. package/dist/types/src/components/index.d.ts +0 -1
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/containers/LoadPluginDialog/LoadPluginDialog.d.ts +4 -0
  54. package/dist/types/src/containers/LoadPluginDialog/LoadPluginDialog.d.ts.map +1 -0
  55. package/dist/types/src/containers/LoadPluginDialog/index.d.ts +3 -0
  56. package/dist/types/src/containers/LoadPluginDialog/index.d.ts.map +1 -0
  57. package/dist/types/src/containers/PluginArticle/PluginArticle.d.ts +7 -0
  58. package/dist/types/src/containers/PluginArticle/PluginArticle.d.ts.map +1 -0
  59. package/dist/types/src/containers/PluginArticle/index.d.ts +3 -0
  60. package/dist/types/src/containers/PluginArticle/index.d.ts.map +1 -0
  61. package/dist/types/src/containers/PluginRegistry/PluginRegistry.d.ts +14 -0
  62. package/dist/types/src/containers/PluginRegistry/PluginRegistry.d.ts.map +1 -0
  63. package/dist/types/src/containers/PluginRegistry/index.d.ts +3 -0
  64. package/dist/types/src/containers/PluginRegistry/index.d.ts.map +1 -0
  65. package/dist/types/src/containers/index.d.ts +6 -0
  66. package/dist/types/src/containers/index.d.ts.map +1 -0
  67. package/dist/types/src/meta.d.ts +7 -4
  68. package/dist/types/src/meta.d.ts.map +1 -1
  69. package/dist/types/src/operations/index.d.ts +3 -0
  70. package/dist/types/src/operations/index.d.ts.map +1 -0
  71. package/dist/types/src/operations/open-plugin-registry.d.ts +5 -0
  72. package/dist/types/src/operations/open-plugin-registry.d.ts.map +1 -0
  73. package/dist/types/src/translations.d.ts +19 -15
  74. package/dist/types/src/translations.d.ts.map +1 -1
  75. package/dist/types/src/types.d.ts +3 -1
  76. package/dist/types/src/types.d.ts.map +1 -1
  77. package/dist/types/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +59 -34
  79. package/src/RegistryPlugin.tsx +12 -26
  80. package/src/capabilities/app-graph-builder.ts +128 -135
  81. package/src/capabilities/index.ts +8 -4
  82. package/src/capabilities/operation-handler.ts +16 -0
  83. package/src/capabilities/react-surface.tsx +83 -79
  84. package/src/cli/commands/disable.ts +47 -0
  85. package/src/cli/commands/enable.ts +44 -0
  86. package/src/cli/commands/index.ts +14 -0
  87. package/src/cli/commands/list.ts +41 -0
  88. package/src/cli/commands/util.ts +24 -0
  89. package/src/cli/index.ts +6 -0
  90. package/src/cli/plugin.ts +17 -0
  91. package/src/cli/storage.ts +50 -0
  92. package/src/components/PluginDetail/PluginDetail.stories.tsx +44 -0
  93. package/src/components/PluginDetail/PluginDetail.tsx +84 -0
  94. package/src/components/PluginDetail/index.ts +5 -0
  95. package/src/components/PluginList/PluginItem.tsx +124 -0
  96. package/src/components/PluginList/PluginList.stories.tsx +87 -0
  97. package/src/components/{PluginList.tsx → PluginList/PluginList.tsx} +3 -5
  98. package/src/components/PluginList/index.ts +5 -0
  99. package/src/components/index.ts +0 -1
  100. package/src/containers/LoadPluginDialog/LoadPluginDialog.tsx +84 -0
  101. package/src/containers/LoadPluginDialog/index.ts +7 -0
  102. package/src/containers/PluginArticle/PluginArticle.tsx +28 -0
  103. package/src/containers/PluginArticle/index.ts +7 -0
  104. package/src/containers/PluginRegistry/PluginRegistry.tsx +94 -0
  105. package/src/containers/PluginRegistry/index.ts +7 -0
  106. package/src/containers/index.ts +10 -0
  107. package/src/meta.ts +19 -9
  108. package/src/operations/index.ts +7 -0
  109. package/src/operations/open-plugin-registry.ts +21 -0
  110. package/src/translations.ts +19 -15
  111. package/src/types.ts +5 -1
  112. package/dist/lib/browser/app-graph-builder-LKQBQDUA.mjs +0 -161
  113. package/dist/lib/browser/app-graph-builder-LKQBQDUA.mjs.map +0 -7
  114. package/dist/lib/browser/chunk-AEBASNOI.mjs +0 -16
  115. package/dist/lib/browser/chunk-AEBASNOI.mjs.map +0 -7
  116. package/dist/lib/browser/intent-resolver-W67CIJI3.mjs +0 -23
  117. package/dist/lib/browser/intent-resolver-W67CIJI3.mjs.map +0 -7
  118. package/dist/lib/browser/react-surface-3GNB7AOY.mjs +0 -333
  119. package/dist/lib/browser/react-surface-3GNB7AOY.mjs.map +0 -7
  120. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  121. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  122. package/dist/types/src/components/Icon.stories.d.ts +0 -6
  123. package/dist/types/src/components/Icon.stories.d.ts.map +0 -1
  124. package/dist/types/src/components/PluginDetail.d.ts +0 -9
  125. package/dist/types/src/components/PluginDetail.d.ts.map +0 -1
  126. package/dist/types/src/components/PluginDetail.stories.d.ts +0 -8
  127. package/dist/types/src/components/PluginDetail.stories.d.ts.map +0 -1
  128. package/dist/types/src/components/PluginItem.d.ts.map +0 -1
  129. package/dist/types/src/components/PluginList.d.ts.map +0 -1
  130. package/dist/types/src/components/PluginList.stories.d.ts +0 -11
  131. package/dist/types/src/components/PluginList.stories.d.ts.map +0 -1
  132. package/dist/types/src/components/RegistryContainer.d.ts +0 -7
  133. package/dist/types/src/components/RegistryContainer.d.ts.map +0 -1
  134. package/src/capabilities/intent-resolver.ts +0 -27
  135. package/src/components/Icon.stories.tsx +0 -108
  136. package/src/components/PluginDetail.stories.tsx +0 -45
  137. package/src/components/PluginDetail.tsx +0 -63
  138. package/src/components/PluginItem.tsx +0 -119
  139. package/src/components/PluginList.stories.tsx +0 -82
  140. package/src/components/RegistryContainer.tsx +0 -84
@@ -1,6 +0,0 @@
1
- import '@dxos-theme';
2
- import { type Meta } from '@storybook/react-vite';
3
- export declare const Default: {};
4
- declare const meta: Meta;
5
- export default meta;
6
- //# sourceMappingURL=Icon.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Icon.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/Icon.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AA0FlD,eAAO,MAAM,OAAO,IAAK,CAAC;AAE1B,QAAA,MAAM,IAAI,EAAE,IAMX,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { type Plugin } from '@dxos/app-framework';
3
- export type PluginDetailProps = {
4
- plugin: Plugin;
5
- enabled?: boolean;
6
- onEnable?: () => void;
7
- };
8
- export declare const PluginDetail: ({ plugin, enabled, onEnable }: PluginDetailProps) => React.JSX.Element;
9
- //# sourceMappingURL=PluginDetail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginDetail.d.ts","sourceRoot":"","sources":["../../../../src/components/PluginDetail.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,+BAA+B,iBAAiB,sBA4C5E,CAAC"}
@@ -1,8 +0,0 @@
1
- import '@dxos-theme';
2
- import { type StoryObj, type Meta } from '@storybook/react-vite';
3
- import { type PluginDetailProps } from './PluginDetail';
4
- declare const meta: Meta<PluginDetailProps>;
5
- export default meta;
6
- type Story = StoryObj<PluginDetailProps>;
7
- export declare const Default: Story;
8
- //# sourceMappingURL=PluginDetail.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginDetail.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/PluginDetail.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAKjE,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGtE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAOjC,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAEzC,eAAO,MAAM,OAAO,EAAE,KAiBrB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginItem.d.ts","sourceRoot":"","sources":["../../../../src/components/PluginItem.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,gFAOxB,eAAe,sBAyFjB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginList.d.ts","sourceRoot":"","sources":["../../../../src/components/PluginList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG;IAC9D,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,uBAA4B,eAAe,sBAUrE,CAAC"}
@@ -1,11 +0,0 @@
1
- import '@dxos-theme';
2
- import { type Meta } from '@storybook/react-vite';
3
- declare const meta: Meta;
4
- export default meta;
5
- export declare const Default: {};
6
- export declare const Column: {
7
- args: {
8
- classNames: string;
9
- };
10
- };
11
- //# sourceMappingURL=PluginList.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginList.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/PluginList.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAyDlD,QAAA,MAAM,IAAI,EAAE,IAQX,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,eAAO,MAAM,OAAO,IAAK,CAAC;AAE1B,eAAO,MAAM,MAAM;;;;CAIlB,CAAC"}
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import { type Plugin } from '@dxos/app-framework';
3
- export declare const RegistryContainer: ({ id, plugins: _plugins }: {
4
- id: string;
5
- plugins: Plugin[];
6
- }) => React.JSX.Element;
7
- //# sourceMappingURL=RegistryContainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RegistryContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/RegistryContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAEpD,OAAO,EAIL,KAAK,MAAM,EAKZ,MAAM,qBAAqB,CAAC;AAQ7B,eAAO,MAAM,iBAAiB,GAAI,2BAA2B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,sBA4D7F,CAAC"}
@@ -1,27 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import {
6
- contributes,
7
- SettingsAction,
8
- createResolver,
9
- LayoutAction,
10
- Capabilities,
11
- createIntent,
12
- } from '@dxos/app-framework';
13
-
14
- import { REGISTRY_ID } from '../meta';
15
-
16
- export default () =>
17
- contributes(
18
- Capabilities.IntentResolver,
19
- createResolver({
20
- intent: SettingsAction.OpenPluginRegistry,
21
- resolve: () => {
22
- return {
23
- intents: [createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: REGISTRY_ID })],
24
- };
25
- },
26
- }),
27
- );
@@ -1,108 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import { IconBase, type IconWeight, type IconProps } from '@phosphor-icons/react';
8
- import { type Meta } from '@storybook/react-vite';
9
- import React, { forwardRef, type SVGProps, type ReactElement } from 'react';
10
-
11
- import { Icon } from '@dxos/react-ui';
12
- import { getSize, mx } from '@dxos/react-ui-theme';
13
-
14
- /**
15
- * Serializable icon props.
16
- */
17
- type StoryIconProps = {
18
- name: string;
19
- weights: Record<string, SVGProps<SVGPathElement>[]>;
20
- };
21
-
22
- /**
23
- * Create icon from serializable data.
24
- * https://github.com/phosphor-icons/react#custom-icons
25
- * https://github.com/phosphor-icons/core/tree/main/assets
26
- */
27
- const createIcon = ({ name, weights }: StoryIconProps) => {
28
- const CustomIcon = forwardRef<SVGSVGElement, IconProps>((props, ref) => (
29
- <IconBase
30
- ref={ref}
31
- {...props}
32
- weights={
33
- new Map<IconWeight, ReactElement>(
34
- Object.entries(weights).map(
35
- ([key, paths]) =>
36
- [
37
- key,
38
- <>
39
- {paths.map((props, i) => (
40
- <path key={`${key}-${i}`} {...props} />
41
- ))}
42
- </>,
43
- ] as [IconWeight, ReactElement],
44
- ),
45
- )
46
- }
47
- />
48
- ));
49
- CustomIcon.displayName = name;
50
- return CustomIcon;
51
- };
52
-
53
- const DefaultStory = () => {
54
- const CustomIcon = createIcon({
55
- name: 'GithubLogo',
56
- weights: {
57
- // https://github.com/phosphor-icons/core/tree/main/assets
58
- // <path d="M119.83,56A52,52,0,0,0,76,32a51.92,51.92,0,0,0-3.49,44.7A49.28,49.28,0,0,0,64,104v8a48,48,0,0,0,48,48h48a48,48,0,0,0,48-48v-8a49.28,49.28,0,0,0-8.51-27.3A51.92,51.92,0,0,0,196,32a52,52,0,0,0-43.83,24Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>
59
- // <path d="M104,232V192a32,32,0,0,1,32-32h0a32,32,0,0,1,32,32v40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>
60
- // <path d="M104,208H72a32,32,0,0,1-32-32A32,32,0,0,0,8,144" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>
61
- regular: [
62
- {
63
- d: 'M119.83,56A52,52,0,0,0,76,32a51.92,51.92,0,0,0-3.49,44.7A49.28,49.28,0,0,0,64,104v8a48,48,0,0,0,48,48h48a48,48,0,0,0,48-48v-8a49.28,49.28,0,0,0-8.51-27.3A51.92,51.92,0,0,0,196,32a52,52,0,0,0-43.83,24Z',
64
- fill: 'none',
65
- stroke: 'currentColor',
66
- strokeLinecap: 'round',
67
- strokeLinejoin: 'round',
68
- strokeWidth: '16',
69
- },
70
- {
71
- d: 'M104,232V192a32,32,0,0,1,32-32h0a32,32,0,0,1,32,32v40',
72
- fill: 'none',
73
- stroke: 'currentColor',
74
- strokeLinecap: 'round',
75
- strokeLinejoin: 'round',
76
- strokeWidth: '16',
77
- },
78
- {
79
- d: 'M104,208H72a32,32,0,0,1-32-32A32,32,0,0,0,8,144',
80
- fill: 'none',
81
- stroke: 'currentColor',
82
- strokeLinecap: 'round',
83
- strokeLinejoin: 'round',
84
- strokeWidth: '16',
85
- },
86
- ],
87
- },
88
- });
89
-
90
- return (
91
- <div className='flex gap-4 p-8 ring'>
92
- <CustomIcon weight={'regular'} className={mx(getSize(8))} />
93
- <Icon icon='ph--github-logo--regular' classNames={mx(getSize(8))} />
94
- </div>
95
- );
96
- };
97
-
98
- export const Default = {};
99
-
100
- const meta: Meta = {
101
- title: 'plugins/plugin-registry/Icon',
102
- render: DefaultStory,
103
- parameters: {
104
- layout: 'centered',
105
- },
106
- };
107
-
108
- export default meta;
@@ -1,45 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
8
-
9
- import { faker } from '@dxos/random';
10
- import { withLayout, withTheme } from '@dxos/storybook-utils';
11
-
12
- import { PluginDetail, type PluginDetailProps } from './PluginDetail';
13
- import { translations } from '../translations';
14
-
15
- const meta: Meta<PluginDetailProps> = {
16
- title: 'plugins/plugin-registry/PluginDetail',
17
- component: PluginDetail,
18
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
19
- parameters: {
20
- translations,
21
- },
22
- };
23
-
24
- export default meta;
25
-
26
- type Story = StoryObj<PluginDetailProps>;
27
-
28
- export const Default: Story = {
29
- args: {
30
- plugin: {
31
- meta: {
32
- id: 'example.com/plugin/test-plugin',
33
- name: 'Test Plugin',
34
- description: faker.lorem.paragraphs(2),
35
- icon: 'ph--bug--regular',
36
- homePage: 'https://example.com',
37
- source: 'https://github.com/example/test-plugin',
38
- screenshots: [
39
- 'https://media.gcflearnfree.org/content/55e073de7dd48174331f51b3_01_17_2014/getting_started_interactive2.png',
40
- ],
41
- },
42
- modules: [],
43
- },
44
- },
45
- };
@@ -1,63 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { type Plugin } from '@dxos/app-framework';
8
- import { Icon, Input, Link, useTranslation } from '@dxos/react-ui';
9
- import { DeprecatedFormContainer } from '@dxos/react-ui-form';
10
-
11
- import { REGISTRY_PLUGIN } from '../meta';
12
-
13
- export type PluginDetailProps = {
14
- plugin: Plugin;
15
- enabled?: boolean;
16
- onEnable?: () => void;
17
- };
18
-
19
- export const PluginDetail = ({ plugin, enabled, onEnable }: PluginDetailProps) => {
20
- const { t } = useTranslation(REGISTRY_PLUGIN);
21
- const { id, name, description, homePage, source, screenshots } = plugin.meta;
22
-
23
- 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 && (
33
- <div role='none'>
34
- <h1 className='text-lg mb-2'>Preview</h1>
35
- <img src={screenshots[0]} alt={name} className='aspect-video object-fit' />
36
- </div>
37
- )}
38
-
39
- <div role='none'>
40
- <p>{description}</p>
41
- </div>
42
-
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>
51
- )}
52
-
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
- )}
59
- </div>
60
- </div>
61
- </DeprecatedFormContainer>
62
- );
63
- };
@@ -1,119 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React, { type MouseEvent, useCallback } from 'react';
6
-
7
- import { type Plugin } from '@dxos/app-framework';
8
- import { Icon, IconButton, Input, Link, ListItem, Tag, useTranslation } from '@dxos/react-ui';
9
- import { descriptionText, mx } from '@dxos/react-ui-theme';
10
-
11
- import { REGISTRY_PLUGIN } from '../meta';
12
-
13
- export type PluginItemProps = {
14
- plugin: Plugin;
15
- installed?: readonly string[];
16
- enabled?: readonly string[];
17
- onClick?: (id: string) => void;
18
- onChange?: (id: string, enabled: boolean) => void;
19
- hasSettings?: (id: string) => boolean;
20
- onSettings?: (id: string) => void;
21
- };
22
-
23
- export const PluginItem = ({
24
- plugin,
25
- enabled = [],
26
- onClick,
27
- onChange,
28
- hasSettings: _hasSettings,
29
- onSettings,
30
- }: PluginItemProps) => {
31
- const { t } = useTranslation(REGISTRY_PLUGIN);
32
- const { id, name, description, tags, icon = 'ph--circle--regular' } = plugin.meta;
33
- const isEnabled = enabled.includes(id);
34
- const inputId = `${id}-input`;
35
- const labelId = `${id}-label`;
36
- const descriptionId = `${id}-description`;
37
- const handleClick = useCallback(() => onClick?.(id), [id, onClick]);
38
-
39
- const handleChange = useCallback(
40
- (event: MouseEvent) => {
41
- event.stopPropagation();
42
- onChange?.(id, !isEnabled);
43
- },
44
- [id, isEnabled, onChange],
45
- );
46
-
47
- const hasSettings = _hasSettings?.(id) ?? false;
48
- const handleSettings = useCallback(() => onSettings?.(id), [id, onSettings]);
49
-
50
- return (
51
- <ListItem.Root
52
- key={id}
53
- labelId={labelId}
54
- data-testid={`pluginList.${id}`}
55
- aria-describedby={descriptionId}
56
- // TODO(burdon): Use Rail vars.
57
- classNames='is-full bs-full grid grid-cols-[48px_1fr_48px] grid-rows-[40px_1fr_32px] p-1 border border-separator rounded-md'
58
- >
59
- {/* Header. */}
60
- <div className='flex flex-col grow justify-center items-center'>
61
- <Icon icon={icon} size={6} onClick={handleClick} classNames='text-subdued cursor-pointer' />
62
- </div>
63
- <div className='flex items-center overflow-hidden cursor-pointer' onClick={handleClick}>
64
- <span className='truncate'>{name ?? id}</span>
65
- </div>
66
- <div className='flex justify-center items-center'>
67
- <Input.Root id={inputId}>
68
- <Input.Switch classNames='self-center' checked={isEnabled} onClick={handleChange} />
69
- </Input.Root>
70
- </div>
71
-
72
- {/* Body. */}
73
- <div />
74
- {(description || tags) && (
75
- <div id={descriptionId} className='col-span-2 flex flex-col w-full justify-between gap-2 pb-2'>
76
- <div className='grow'>
77
- <p className={mx(descriptionText, 'line-clamp-3 min-w-0 pie-2')}>{description}</p>
78
- </div>
79
- {tags && tags.length > 0 && (
80
- <div>
81
- {tags.map((tag) => (
82
- <Tag key={tag} palette={'indigo'} classNames='text-xs capitalize'>
83
- {tag}
84
- </Tag>
85
- ))}
86
- </div>
87
- )}
88
- </div>
89
- )}
90
-
91
- {/* Footer. */}
92
- <div />
93
- <div className='flex gap-2 items-center pie-1'>
94
- <Link
95
- aria-describedby={descriptionId}
96
- classNames='text-sm text-description cursor-pointer'
97
- onClick={handleClick}
98
- >
99
- {t('details label')}
100
- </Link>
101
-
102
- <div className='flex-1' />
103
- </div>
104
- <div className='flex justify-center items-center'>
105
- {hasSettings && (
106
- <IconButton
107
- aria-describedby={descriptionId}
108
- classNames='text-sm text-description cursor-pointer'
109
- icon='ph--gear--regular'
110
- label={t('settings label')}
111
- iconOnly
112
- size={4}
113
- onClick={handleSettings}
114
- />
115
- )}
116
- </div>
117
- </ListItem.Root>
118
- );
119
- };
@@ -1,82 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import { type Meta } from '@storybook/react-vite';
8
- import React, { useState } from 'react';
9
-
10
- import { definePlugin, type Plugin } from '@dxos/app-framework';
11
- import { faker } from '@dxos/random';
12
- import { type ThemedClassName } from '@dxos/react-ui';
13
- import { mx } from '@dxos/react-ui-theme';
14
- import { withTheme, withLayout } from '@dxos/storybook-utils';
15
-
16
- import { PluginList } from './PluginList';
17
- import { translations } from '../translations';
18
-
19
- faker.seed(1);
20
-
21
- const icons = [
22
- 'ph--bug--regular',
23
- 'ph--compass--regular',
24
- 'ph--kanban--regular',
25
- 'ph--table--regular',
26
- 'ph--gear--regular',
27
- 'ph--github-logo--regular',
28
- ];
29
-
30
- const DefaultStory = ({ classNames }: ThemedClassName<{}>) => {
31
- const [plugins] = useState<Plugin[]>(
32
- faker.helpers.multiple(
33
- () =>
34
- definePlugin(
35
- {
36
- id: `dxos.org/plugin/plugin-${faker.string.uuid()}`,
37
- name: `${faker.commerce.productName()}`,
38
- description: faker.lorem.sentences(Math.ceil(Math.random() * 3)),
39
- tags: faker.datatype.boolean({ probability: 0.6 })
40
- ? [faker.helpers.arrayElement(['labs', 'beta', 'alpha', 'stable', 'new', '新発売'])]
41
- : undefined,
42
- icon: faker.helpers.arrayElement(icons),
43
- homePage: faker.datatype.boolean({ probability: 0.5 }) ? faker.internet.url() : undefined,
44
- source: faker.internet.url(),
45
- },
46
- [],
47
- ),
48
- { count: 16 },
49
- ),
50
- );
51
- const [enabled, setEnabled] = useState<string[]>([]);
52
-
53
- const handleChange = (id: string, enabled: boolean) => {
54
- setEnabled((plugins) => (enabled ? [...plugins, id] : plugins.filter((plugin) => plugin === id)));
55
- };
56
-
57
- return (
58
- <div className={mx('flex overflow-hidden', classNames)}>
59
- <PluginList plugins={plugins} enabled={enabled} onChange={handleChange} hasSettings={() => true} />
60
- </div>
61
- );
62
- };
63
-
64
- const meta: Meta = {
65
- title: 'plugins/plugin-registry/PluginList',
66
- component: PluginList,
67
- render: DefaultStory,
68
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
69
- parameters: {
70
- translations,
71
- },
72
- };
73
-
74
- export default meta;
75
-
76
- export const Default = {};
77
-
78
- export const Column = {
79
- args: {
80
- classNames: 'w-[30rem]',
81
- },
82
- };
@@ -1,84 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import React, { useCallback, useMemo } from 'react';
6
-
7
- import {
8
- Capabilities,
9
- createIntent,
10
- LayoutAction,
11
- type Plugin,
12
- SettingsAction,
13
- useCapability,
14
- useIntentDispatcher,
15
- usePluginManager,
16
- } from '@dxos/app-framework';
17
- import { ObservabilityAction } from '@dxos/plugin-observability/types';
18
- import { StackItem } from '@dxos/react-ui-stack';
19
-
20
- import { PluginList } from './PluginList';
21
-
22
- const sortByPluginMeta = ({ meta: { name: a = '' } }: Plugin, { meta: { name: b = '' } }: Plugin) => a.localeCompare(b);
23
-
24
- export const RegistryContainer = ({ id, plugins: _plugins }: { id: string; plugins: Plugin[] }) => {
25
- const manager = usePluginManager();
26
- const { dispatchPromise: dispatch } = useIntentDispatcher();
27
- const plugins = useMemo(() => _plugins.sort(sortByPluginMeta), [_plugins]);
28
- const settingsStore = useCapability(Capabilities.SettingsStore);
29
-
30
- // TODO(wittjosiah): Factor out to an intent?
31
- const handleChange = useCallback(
32
- async (id: string, enabled: boolean) => {
33
- if (enabled) {
34
- await manager.enable(id);
35
- } else {
36
- await manager.disable(id);
37
- }
38
-
39
- await dispatch(
40
- createIntent(ObservabilityAction.SendEvent, {
41
- name: 'plugins.toggle',
42
- properties: {
43
- plugin: id,
44
- enabled,
45
- },
46
- }),
47
- );
48
- },
49
- [dispatch, manager],
50
- );
51
-
52
- const handleClick = useCallback(
53
- (pluginId: string) =>
54
- dispatch(
55
- createIntent(LayoutAction.Open, {
56
- part: 'main',
57
- // TODO(wittjosiah): `/` currently is not supported in ids.
58
- subject: [pluginId.replaceAll('/', ':')],
59
- options: { pivotId: id, positioning: 'end' },
60
- }),
61
- ),
62
- [dispatch, id],
63
- );
64
-
65
- const hasSettings = useCallback((pluginId: string) => !!settingsStore.getStore(pluginId), [settingsStore]);
66
-
67
- const handleSettings = useCallback(
68
- (pluginId: string) => dispatch(createIntent(SettingsAction.Open, { plugin: pluginId })),
69
- [dispatch],
70
- );
71
-
72
- return (
73
- <StackItem.Content classNames='min-bs-0 overflow-y-auto scrollbar-thin contain-layout'>
74
- <PluginList
75
- plugins={plugins}
76
- enabled={manager.enabled}
77
- onClick={handleClick}
78
- onChange={handleChange}
79
- hasSettings={hasSettings}
80
- onSettings={handleSettings}
81
- />
82
- </StackItem.Content>
83
- );
84
- };