@blocklet/ui-react 3.1.47 → 3.1.49

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 (98) hide show
  1. package/.aigne/doc-smith/config.yaml +76 -0
  2. package/.aigne/doc-smith/history.yaml +9 -0
  3. package/.aigne/doc-smith/output/structure-plan.json +249 -0
  4. package/.aigne/doc-smith/upload-cache.yaml +528 -0
  5. package/docs/_sidebar.md +19 -0
  6. package/docs/components-component-management-blocklet-studio.ja.md +194 -0
  7. package/docs/components-component-management-blocklet-studio.md +194 -0
  8. package/docs/components-component-management-blocklet-studio.zh-TW.md +194 -0
  9. package/docs/components-component-management-blocklet-studio.zh.md +194 -0
  10. package/docs/components-component-management-component-installer.ja.md +256 -0
  11. package/docs/components-component-management-component-installer.md +256 -0
  12. package/docs/components-component-management-component-installer.zh-TW.md +256 -0
  13. package/docs/components-component-management-component-installer.zh.md +256 -0
  14. package/docs/components-component-management.ja.md +59 -0
  15. package/docs/components-component-management.md +59 -0
  16. package/docs/components-component-management.zh-TW.md +59 -0
  17. package/docs/components-component-management.zh.md +59 -0
  18. package/docs/components-layout-dashboard.ja.md +231 -0
  19. package/docs/components-layout-dashboard.md +231 -0
  20. package/docs/components-layout-dashboard.zh-TW.md +231 -0
  21. package/docs/components-layout-dashboard.zh.md +231 -0
  22. package/docs/components-layout-footer.ja.md +165 -0
  23. package/docs/components-layout-footer.md +165 -0
  24. package/docs/components-layout-footer.zh-TW.md +165 -0
  25. package/docs/components-layout-footer.zh.md +165 -0
  26. package/docs/components-layout-header.ja.md +233 -0
  27. package/docs/components-layout-header.md +233 -0
  28. package/docs/components-layout-header.zh-TW.md +233 -0
  29. package/docs/components-layout-header.zh.md +233 -0
  30. package/docs/components-layout.ja.md +50 -0
  31. package/docs/components-layout.md +50 -0
  32. package/docs/components-layout.zh-TW.md +50 -0
  33. package/docs/components-layout.zh.md +50 -0
  34. package/docs/components-notifications.ja.md +173 -0
  35. package/docs/components-notifications.md +173 -0
  36. package/docs/components-notifications.zh-TW.md +174 -0
  37. package/docs/components-notifications.zh.md +173 -0
  38. package/docs/components-user-management-user-center.ja.md +183 -0
  39. package/docs/components-user-management-user-center.md +183 -0
  40. package/docs/components-user-management-user-center.zh-TW.md +183 -0
  41. package/docs/components-user-management-user-center.zh.md +183 -0
  42. package/docs/components-user-management-user-sessions.ja.md +164 -0
  43. package/docs/components-user-management-user-sessions.md +164 -0
  44. package/docs/components-user-management-user-sessions.zh-TW.md +164 -0
  45. package/docs/components-user-management-user-sessions.zh.md +164 -0
  46. package/docs/components-user-management.ja.md +76 -0
  47. package/docs/components-user-management.md +76 -0
  48. package/docs/components-user-management.zh-TW.md +76 -0
  49. package/docs/components-user-management.zh.md +76 -0
  50. package/docs/components-utilities-icon.ja.md +106 -0
  51. package/docs/components-utilities-icon.md +106 -0
  52. package/docs/components-utilities-icon.zh-TW.md +106 -0
  53. package/docs/components-utilities-icon.zh.md +106 -0
  54. package/docs/components-utilities.ja.md +136 -0
  55. package/docs/components-utilities.md +136 -0
  56. package/docs/components-utilities.zh-TW.md +136 -0
  57. package/docs/components-utilities.zh.md +136 -0
  58. package/docs/components.ja.md +27 -0
  59. package/docs/components.md +27 -0
  60. package/docs/components.zh-TW.md +27 -0
  61. package/docs/components.zh.md +27 -0
  62. package/docs/core-concepts.ja.md +164 -0
  63. package/docs/core-concepts.md +164 -0
  64. package/docs/core-concepts.zh-TW.md +164 -0
  65. package/docs/core-concepts.zh.md +164 -0
  66. package/docs/getting-started.ja.md +132 -0
  67. package/docs/getting-started.md +132 -0
  68. package/docs/getting-started.zh-TW.md +132 -0
  69. package/docs/getting-started.zh.md +132 -0
  70. package/docs/hooks-api.ja.md +214 -0
  71. package/docs/hooks-api.md +214 -0
  72. package/docs/hooks-api.zh-TW.md +214 -0
  73. package/docs/hooks-api.zh.md +214 -0
  74. package/docs/how-to-guides.ja.md +413 -0
  75. package/docs/how-to-guides.md +413 -0
  76. package/docs/how-to-guides.zh-TW.md +413 -0
  77. package/docs/how-to-guides.zh.md +413 -0
  78. package/docs/overview.ja.md +91 -0
  79. package/docs/overview.md +91 -0
  80. package/docs/overview.zh-TW.md +91 -0
  81. package/docs/overview.zh.md +91 -0
  82. package/glossary.md +12 -0
  83. package/lib/Dashboard/index.js +46 -42
  84. package/lib/Footer/index.js +51 -36
  85. package/lib/Header/index.js +48 -44
  86. package/lib/UserCenter/components/settings.js +1 -0
  87. package/lib/UserCenter/components/user-center.js +133 -133
  88. package/lib/blocklets.d.ts +13 -2
  89. package/lib/blocklets.js +40 -40
  90. package/lib/common/header-addons.js +37 -33
  91. package/package.json +7 -7
  92. package/src/Dashboard/index.jsx +8 -3
  93. package/src/Footer/index.jsx +22 -4
  94. package/src/Header/index.tsx +7 -2
  95. package/src/UserCenter/components/settings.tsx +1 -0
  96. package/src/UserCenter/components/user-center.tsx +6 -6
  97. package/src/blocklets.js +18 -9
  98. package/src/common/header-addons.jsx +7 -2
@@ -0,0 +1,194 @@
1
+ # BlockletStudio
2
+
3
+ `BlockletStudio`コンポーネントは、ブロックレットリソースの公開と管理のための、効率的で埋め込み可能なユーザーインターフェースを提供します。これは、指定されたブロックレットサービスから専用の公開インターフェースを読み込むフルページの`iframe`をレンダリングすることで動作します。これにより、アプリケーションはUIをゼロから構築することなく、一貫性のある強力なリソース管理体験を提供できます。
4
+
5
+ ホストアプリケーションと`BlockletStudio` iframe間の通信は、`window.postMessage` APIを使用して安全に処理され、アップロード、リリース、接続などのイベントに対するコールバックを可能にします。
6
+
7
+ ## 使用例
8
+
9
+ `BlockletStudio`を統合するには、その可視性状態を(例:`useState`で)管理する必要があります。iframeの読み込みには時間がかかる場合があるため、ユーザーにローディングインジケーターを表示することが推奨されます。`onOpened`コールバックを使用してiframeコンテンツの準備ができたことを通知し、その時点でローディングインジケーターを非表示にすることができます。
10
+
11
+ 次の例は、`BlockletStudio`ダイアログを開き、ローディング状態を管理するボタンを実装する方法を示しています。
12
+
13
+ ```tsx icon=logos:react title="Exporter.tsx"
14
+ import { Icon } from '@iconify-icon/react';
15
+ import ArrowUp from '@iconify-icons/tabler/arrow-big-up-line';
16
+ import { Box, IconButton, CircularProgress as Spinner, svgIconClasses } from '@mui/material';
17
+ import { useState } from 'react';
18
+ import { BlockletStudio } from '@arcblock/ux-react';
19
+
20
+ // スタジオサービスを提供するブロックレットのDID。
21
+ const AI_STUDIO_COMPONENT_DID = 'z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9';
22
+
23
+ export default function Exporter() {
24
+ const [showCreateResource, setShowCreateResource] = useState(false);
25
+ const [opening, setOpening] = useState(false);
26
+
27
+ const handleShowDialog = () => {
28
+ setOpening(true);
29
+ setShowCreateResource(true);
30
+ };
31
+
32
+ return (
33
+ <>
34
+ <IconButton
35
+ sx={{
36
+ position: 'relative',
37
+ minWidth: 40,
38
+ minHeight: 40,
39
+ borderRadius: '100%',
40
+ [`.${svgIconClasses.root}`]: {
41
+ color: 'text.secondary',
42
+ },
43
+ }}
44
+ onClick={handleShowDialog}>
45
+ {opening ? <Spinner size={16} /> : <Box component={Icon} icon={ArrowUp} style={{ fontSize: 24 }} />}
46
+ </IconButton>
47
+ <BlockletStudio
48
+ open={showCreateResource}
49
+ setOpen={setShowCreateResource}
50
+ onOpened={() => setOpening(false)}
51
+ componentDid={AI_STUDIO_COMPONENT_DID}
52
+ mode="dialog"
53
+ title="Demo Project"
54
+ description="This is a demo project for the 'aigne' blocklet."
55
+ note='Please review all resources and components before publishing.'
56
+ introduction="Welcome to the resource publisher."
57
+ tenantScope="test-tenant-scope-id-2"
58
+ resourcesParams={{ name: 'test-project', extra: true }}
59
+ dependentComponentsMode="readonly"
60
+ componentsTitle="Required Components"
61
+ resourcesTitle="Add Project Files"
62
+ onConnected={() => alert('Connected')}
63
+ onUploaded={() => alert('Uploaded')}
64
+ onReleased={() => alert('Released')}
65
+ components={[
66
+ { did: 'z8ia3xzq2tMq8CRHfaXj1BTYJyYnEcHbqP8cJ', included: true, required: true },
67
+ { did: 'z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ', included: true, required: false },
68
+ ]}
69
+ resources={{
70
+ 'z8iZpog7mcgcgBZzTiXJCWESvmnRrQmnd3XBB': [
71
+ 'template-448698592710885376',
72
+ 'template-448696391418511360',
73
+ ],
74
+ }}
75
+ />
76
+ </>
77
+ );
78
+ }
79
+ ```
80
+
81
+ ## Props
82
+
83
+ `BlockletStudio`コンポーネントは、その動作と外観を制御するために以下のpropsを受け入れます。
84
+
85
+ <x-field-group>
86
+ <x-field data-name="open" data-type="boolean" data-required="true">
87
+ <x-field-desc markdown>`BlockletStudio` iframeの可視性を制御します。`true`に設定すると表示され、`false`に設定すると非表示になります。</x-field-desc>
88
+ </x-field>
89
+ <x-field data-name="setOpen" data-type="(open: boolean) => void" data-required="true">
90
+ <x-field-desc markdown>`BlockletStudio`が閉じることを要求するために使用するコールバック関数。通常、この関数は`open` propに関連付けられた状態変数を`false`に設定します。</x-field-desc>
91
+ </x-field>
92
+ <x-field data-name="componentDid" data-type="string" data-required="true">
93
+ <x-field-desc markdown>リソース公開サービスを提供するブロックレットの分散型識別子(DID)。これにより、どのスタジオインターフェースが読み込まれるかが決まります。</x-field-desc>
94
+ </x-field>
95
+ <x-field data-name="onOpened" data-type="() => void" data-required="false">
96
+ <x-field-desc markdown>`BlockletStudio` iframeの読み込みが完了し、ユーザーが操作できる状態になったときに実行されるオプションのコールバック関数。</x-field-desc>
97
+ </x-field>
98
+ <x-field data-name="onUploaded" data-type="(data: unknown) => void" data-required="false">
99
+ <x-field-desc markdown>ユーザーが新しいリソースのアップロードに成功した後にトリガーされるオプションのコールバック関数。`data`パラメータには、アップロードされたアイテムに関するメタデータが含まれます。</x-field-desc>
100
+ </x-field>
101
+ <x-field data-name="onReleased" data-type="(data: unknown) => void" data-required="false">
102
+ <x-field-desc markdown>ユーザーがコンポーネントの新しいリリースを公開した後にトリガーされるオプションのコールバック関数。`data`パラメータには、新しいリリースに関する情報が含まれます。</x-field-desc>
103
+ </x-field>
104
+ <x-field data-name="onConnected" data-type="(data: unknown) => void" data-required="false">
105
+ <x-field-desc markdown>ユーザーがリソースまたはコンポーネントを接続した後にトリガーされるオプションのコールバック関数。</x-field-desc>
106
+ </x-field>
107
+ <x-field data-name="tenantScope" data-type="string" data-required="false">
108
+ <x-field-desc markdown>リソースを特定のテナントにスコープするためのオプションの文字列。これは、マルチテナント環境でのデータ分離を保証するために使用できます。</x-field-desc>
109
+ </x-field>
110
+ <x-field data-name="resourcesParams" data-type="Record<string, any>" data-required="false" data-default="{}">
111
+ <x-field-desc markdown>ブロックレットのリソース取得APIエンドポイントに渡されるクエリパラメータを含むオブジェクト。これにより、リソースの動的なフィルタリングが可能になります。</x-field-desc>
112
+ </x-field>
113
+ <x-field data-name="mode" data-type="string" data-required="false" data-default='"dialog"'>
114
+ <x-field-desc markdown>スタジオインターフェースの表示モードを決定します。デフォルトは`'dialog'`です。</x-field-desc>
115
+ </x-field>
116
+ <x-field data-name="title" data-type="string" data-required="false">
117
+ <x-field-desc markdown>スタジオインターフェースの上部に表示されるオプションのタイトル。</x-field-desc>
118
+ </x-field>
119
+ <x-field data-name="logo" data-type="string" data-required="false">
120
+ <x-field-desc markdown>スタジオインターフェースに表示されるロゴのオプションのURL。</x-field-desc>
121
+ </x-field>
122
+ <x-field data-name="description" data-type="string" data-required="false">
123
+ <x-field-desc markdown>スタジオUIに表示される簡単な説明を提供するオプションの文字列。</x-field-desc>
124
+ </x-field>
125
+ <x-field data-name="introduction" data-type="string" data-required="false">
126
+ <x-field-desc markdown>スタジオUIに表示される、より詳細な紹介のためのオプションの文字列。</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="note" data-type="string" data-required="false">
129
+ <x-field-desc markdown>ユーザーに注意や重要なメッセージを表示するためのオプションの文字列。</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="componentsTitle" data-type="string" data-required="false">
132
+ <x-field-desc markdown>コンポーネントセクションのタイトルをカスタマイズするためのオプションの文字列。</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="resourcesTitle" data-type="string" data-required="false">
135
+ <x-field-desc markdown>リソースセクションのタイトルをカスタマイズするためのオプションの文字列。</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="components" data-type="Record<string, unknown>[]" data-required="false" data-default="[]">
138
+ <x-field-desc markdown>スタジオでデフォルトで事前選択されるべきコンポーネントを表すオブジェクトの配列。</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="resources" data-type="Record<string, unknown>" data-required="false" data-default="{}">
141
+ <x-field-desc markdown>スタジオでデフォルトで事前選択されるべきリソースを表すオブジェクト。</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="dependentComponentsMode" data-type="'auto' | 'readonly'" data-required="false">
144
+ <x-field-desc markdown>依存コンポーネントの動作を制御します。`'readonly'`モードでは、ユーザーは選択されたリソースの依存関係として自動的に含まれるコンポーネントの選択を解除できません。</x-field-desc>
145
+ </x-field>
146
+ <x-field data-name="style" data-type="React.CSSProperties" data-required="false" data-default="{}">
147
+ <x-field-desc markdown>`iframe`要素にカスタムCSSスタイルを適用するためのオブジェクト。</x-field-desc>
148
+ </x-field>
149
+ <x-field data-name="zIndex" data-type="number" data-required="false" data-default="9999">
150
+ <x-field-desc markdown>`iframe`要素のz-index CSSプロパティ。スタック順序を制御します。</x-field-desc>
151
+ </x-field>
152
+ </x-field-group>
153
+
154
+ ## 依存コンポーネント
155
+
156
+ `BlockletStudio`にリソースAPIを提供するブロックレットは、リソースデータ内で直接コンポーネントの依存関係を指定できます。ユーザーが`dependentComponents`をリストしているリソースを選択すると、`BlockletStudio`はUIでそれらのコンポーネントを自動的に選択します。
157
+
158
+ この機能は、必要なすべての依存関係が自動的に含まれるようにすることで、ユーザーエクスペリエンスを簡素化します。
159
+
160
+ これを実装するには、ブロックレットのリソースAPIは、必要なコンポーネントのDIDを含む`dependentComponents`配列を返す必要があります。
161
+
162
+ ### APIレスポンス例
163
+
164
+ 以下は、リソースAPIエンドポイントからのJSONレスポンスの例です。「Application」および「Tool」リソースは、それぞれのコンポーネント依存関係を宣言しています。
165
+
166
+ ```json 依存関係を含むAPIレスポンス
167
+ {
168
+ "resources": [
169
+ {
170
+ "id": "application-448698592710885376",
171
+ "name": "My App (as Application)",
172
+ "dependentComponents": [
173
+ "error-did",
174
+ "z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9",
175
+ "z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ",
176
+ "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"
177
+ ]
178
+ },
179
+ {
180
+ "id": "tool-448698592710885376",
181
+ "name": "My App (as Tool)",
182
+ "dependentComponents": ["error-did", "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"]
183
+ },
184
+ {
185
+ "id": "template-448698592710885376",
186
+ "name": "My App (as Template)"
187
+ }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ ## 概要
193
+
194
+ `BlockletStudio`コンポーネントは、リソースとコンポーネントの管理をアプリケーションに直接統合するための、強力で便利な方法を提供します。`iframe`と明確なpropsセットを活用することで、開発を簡素化しつつ、一貫したユーザーエクスペリエンスを提供します。依存関係管理に関する関連機能については、[ComponentInstaller](./components-component-management-component-installer.md)のドキュメントも参照してください。
@@ -0,0 +1,194 @@
1
+ # BlockletStudio
2
+
3
+ The `BlockletStudio` component provides a streamlined, embeddable user interface for publishing and managing blocklet resources. It operates by rendering a full-page `iframe` that loads a dedicated publishing interface from a specified blocklet service. This allows your application to offer a consistent and powerful resource management experience without needing to build the UI from scratch.
4
+
5
+ Communication between the host application and the `BlockletStudio` iframe is handled securely using the `window.postMessage` API, enabling callbacks for events like uploads, releases, and connections.
6
+
7
+ ## Usage Example
8
+
9
+ To integrate `BlockletStudio`, you need to manage its visibility state (e.g., with `useState`). Since the iframe may take a moment to load, it is recommended to display a loading indicator to the user. The `onOpened` callback can be used to signal that the iframe content is ready, at which point the loading indicator can be hidden.
10
+
11
+ The following example demonstrates how to implement a button that opens the `BlockletStudio` dialog and manages a loading state.
12
+
13
+ ```tsx icon=logos:react title="Exporter.tsx"
14
+ import { Icon } from '@iconify-icon/react';
15
+ import ArrowUp from '@iconify-icons/tabler/arrow-big-up-line';
16
+ import { Box, IconButton, CircularProgress as Spinner, svgIconClasses } from '@mui/material';
17
+ import { useState } from 'react';
18
+ import { BlockletStudio } from '@arcblock/ux-react';
19
+
20
+ // The DID of the blocklet that provides the studio service.
21
+ const AI_STUDIO_COMPONENT_DID = 'z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9';
22
+
23
+ export default function Exporter() {
24
+ const [showCreateResource, setShowCreateResource] = useState(false);
25
+ const [opening, setOpening] = useState(false);
26
+
27
+ const handleShowDialog = () => {
28
+ setOpening(true);
29
+ setShowCreateResource(true);
30
+ };
31
+
32
+ return (
33
+ <>
34
+ <IconButton
35
+ sx={{
36
+ position: 'relative',
37
+ minWidth: 40,
38
+ minHeight: 40,
39
+ borderRadius: '100%',
40
+ [`.${svgIconClasses.root}`]: {
41
+ color: 'text.secondary',
42
+ },
43
+ }}
44
+ onClick={handleShowDialog}>
45
+ {opening ? <Spinner size={16} /> : <Box component={Icon} icon={ArrowUp} style={{ fontSize: 24 }} />}
46
+ </IconButton>
47
+ <BlockletStudio
48
+ open={showCreateResource}
49
+ setOpen={setShowCreateResource}
50
+ onOpened={() => setOpening(false)}
51
+ componentDid={AI_STUDIO_COMPONENT_DID}
52
+ mode="dialog"
53
+ title="Demo Project"
54
+ description="This is a demo project for the 'aigne' blocklet."
55
+ note='Please review all resources and components before publishing.'
56
+ introduction="Welcome to the resource publisher."
57
+ tenantScope="test-tenant-scope-id-2"
58
+ resourcesParams={{ name: 'test-project', extra: true }}
59
+ dependentComponentsMode="readonly"
60
+ componentsTitle="Required Components"
61
+ resourcesTitle="Add Project Files"
62
+ onConnected={() => alert('Connected')}
63
+ onUploaded={() => alert('Uploaded')}
64
+ onReleased={() => alert('Released')}
65
+ components={[
66
+ { did: 'z8ia3xzq2tMq8CRHfaXj1BTYJyYnEcHbqP8cJ', included: true, required: true },
67
+ { did: 'z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ', included: true, required: false },
68
+ ]}
69
+ resources={{
70
+ 'z8iZpog7mcgcgBZzTiXJCWESvmnRrQmnd3XBB': [
71
+ 'template-448698592710885376',
72
+ 'template-448696391418511360',
73
+ ],
74
+ }}
75
+ />
76
+ </>
77
+ );
78
+ }
79
+ ```
80
+
81
+ ## Props
82
+
83
+ The `BlockletStudio` component accepts the following props to control its behavior and appearance.
84
+
85
+ <x-field-group>
86
+ <x-field data-name="open" data-type="boolean" data-required="true">
87
+ <x-field-desc markdown>Controls the visibility of the `BlockletStudio` iframe. Set to `true` to display it, and `false` to hide it.</x-field-desc>
88
+ </x-field>
89
+ <x-field data-name="setOpen" data-type="(open: boolean) => void" data-required="true">
90
+ <x-field-desc markdown>A callback function used by `BlockletStudio` to request being closed. Typically, this function will set the state variable associated with the `open` prop to `false`.</x-field-desc>
91
+ </x-field>
92
+ <x-field data-name="componentDid" data-type="string" data-required="true">
93
+ <x-field-desc markdown>The Decentralized Identifier (DID) of the blocklet that provides the resource publishing service. This determines which studio interface is loaded.</x-field-desc>
94
+ </x-field>
95
+ <x-field data-name="onOpened" data-type="() => void" data-required="false">
96
+ <x-field-desc markdown>An optional callback function that is executed when the `BlockletStudio` iframe has finished loading and is ready for user interaction.</x-field-desc>
97
+ </x-field>
98
+ <x-field data-name="onUploaded" data-type="(data: unknown) => void" data-required="false">
99
+ <x-field-desc markdown>An optional callback function that is triggered after a user successfully uploads a new resource. The `data` parameter contains metadata about the uploaded item.</x-field-desc>
100
+ </x-field>
101
+ <x-field data-name="onReleased" data-type="(data: unknown) => void" data-required="false">
102
+ <x-field-desc markdown>An optional callback function that is triggered after a user publishes a new release of a component. The `data` parameter contains information about the new release.</x-field-desc>
103
+ </x-field>
104
+ <x-field data-name="onConnected" data-type="(data: unknown) => void" data-required="false">
105
+ <x-field-desc markdown>An optional callback function that is triggered after a user connects a resource or component.</x-field-desc>
106
+ </x-field>
107
+ <x-field data-name="tenantScope" data-type="string" data-required="false">
108
+ <x-field-desc markdown>An optional string to scope the resources to a specific tenant. This can be used to ensure data isolation in a multi-tenant environment.</x-field-desc>
109
+ </x-field>
110
+ <x-field data-name="resourcesParams" data-type="Record<string, any>" data-required="false" data-default="{}">
111
+ <x-field-desc markdown>An object containing query parameters to be passed to the blocklet's resource-fetching API endpoint. This allows for dynamic filtering of resources.</x-field-desc>
112
+ </x-field>
113
+ <x-field data-name="mode" data-type="string" data-required="false" data-default='"dialog"'>
114
+ <x-field-desc markdown>Determines the display mode of the studio interface. The default is `'dialog'`.</x-field-desc>
115
+ </x-field>
116
+ <x-field data-name="title" data-type="string" data-required="false">
117
+ <x-field-desc markdown>An optional title to be displayed at the top of the studio interface.</x-field-desc>
118
+ </x-field>
119
+ <x-field data-name="logo" data-type="string" data-required="false">
120
+ <x-field-desc markdown>An optional URL for a logo to be displayed in the studio interface.</x-field-desc>
121
+ </x-field>
122
+ <x-field data-name="description" data-type="string" data-required="false">
123
+ <x-field-desc markdown>An optional string providing a short description, displayed in the studio UI.</x-field-desc>
124
+ </x-field>
125
+ <x-field data-name="introduction" data-type="string" data-required="false">
126
+ <x-field-desc markdown>An optional string for a more detailed introduction, displayed in the studio UI.</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="note" data-type="string" data-required="false">
129
+ <x-field-desc markdown>An optional string to display a note or important message to the user.</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="componentsTitle" data-type="string" data-required="false">
132
+ <x-field-desc markdown>An optional string to customize the title of the components section.</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="resourcesTitle" data-type="string" data-required="false">
135
+ <x-field-desc markdown>An optional string to customize the title of the resources section.</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="components" data-type="Record<string, unknown>[]" data-required="false" data-default="[]">
138
+ <x-field-desc markdown>An array of objects representing components that should be pre-selected by default in the studio.</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="resources" data-type="Record<string, unknown>" data-required="false" data-default="{}">
141
+ <x-field-desc markdown>An object representing resources that should be pre-selected by default in the studio.</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="dependentComponentsMode" data-type="'auto' | 'readonly'" data-required="false">
144
+ <x-field-desc markdown>Controls the behavior of dependent components. In `'readonly'` mode, users cannot deselect components that are automatically included as dependencies of a selected resource.</x-field-desc>
145
+ </x-field>
146
+ <x-field data-name="style" data-type="React.CSSProperties" data-required="false" data-default="{}">
147
+ <x-field-desc markdown>An object for applying custom CSS styles to the `iframe` element.</x-field-desc>
148
+ </x-field>
149
+ <x-field data-name="zIndex" data-type="number" data-required="false" data-default="9999">
150
+ <x-field-desc markdown>The z-index CSS property for the `iframe` element, controlling its stacking order.</x-field-desc>
151
+ </x-field>
152
+ </x-field-group>
153
+
154
+ ## Dependent Components
155
+
156
+ Blocklets that provide a resource API for the `BlockletStudio` can specify component dependencies directly within the resource data. When a user selects a resource that lists `dependentComponents`, the `BlockletStudio` will automatically select those components in the UI.
157
+
158
+ This feature simplifies the user experience by ensuring that all necessary dependencies are included automatically.
159
+
160
+ To implement this, your blocklet's resource API should return a `dependentComponents` array containing the DIDs of the required components.
161
+
162
+ ### API Response Example
163
+
164
+ Here is an example of a JSON response from a resource API endpoint. The "Application" and "Tool" resources declare their component dependencies.
165
+
166
+ ```json API Response with Dependencies
167
+ {
168
+ "resources": [
169
+ {
170
+ "id": "application-448698592710885376",
171
+ "name": "My App (as Application)",
172
+ "dependentComponents": [
173
+ "error-did",
174
+ "z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9",
175
+ "z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ",
176
+ "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"
177
+ ]
178
+ },
179
+ {
180
+ "id": "tool-448698592710885376",
181
+ "name": "My App (as Tool)",
182
+ "dependentComponents": ["error-did", "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"]
183
+ },
184
+ {
185
+ "id": "template-448698592710885376",
186
+ "name": "My App (as Template)"
187
+ }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ ## Summary
193
+
194
+ The `BlockletStudio` component offers a powerful and convenient way to integrate resource and component management directly into your application. By leveraging an `iframe` and a clear set of props, it provides a consistent user experience while simplifying development. For related functionalities regarding dependency management, you may also want to review the [ComponentInstaller](./components-component-management-component-installer.md) documentation.
@@ -0,0 +1,194 @@
1
+ # BlockletStudio
2
+
3
+ `BlockletStudio` 元件提供了一個精簡、可嵌入的使用者介面,用於發佈和管理 blocklet 資源。它透過渲染一個全頁 `iframe` 來運作,該 `iframe` 從指定的 blocklet 服務載入一個專用的發佈介面。這讓您的應用程式能夠提供一致且強大的資源管理體驗,而無需從頭開始建構 UI。
4
+
5
+ 宿主應用程式與 `BlockletStudio` iframe 之間的通訊使用 `window.postMessage` API 進行安全處理,為上傳、發佈和連線等事件啟用回呼。
6
+
7
+ ## 使用範例
8
+
9
+ 要整合 `BlockletStudio`,您需要管理其可見性狀態(例如,使用 `useState`)。由於 iframe 可能需要一些時間來載入,建議向使用者顯示一個載入指示器。`onOpened` 回呼可用於表示 iframe 內容已準備就緒,此時可以隱藏載入指示器。
10
+
11
+ 以下範例示範如何實作一個按鈕,該按鈕可開啟 `BlockletStudio` 對話方塊並管理載入狀態。
12
+
13
+ ```tsx icon=logos:react title="Exporter.tsx"
14
+ import { Icon } from '@iconify-icon/react';
15
+ import ArrowUp from '@iconify-icons/tabler/arrow-big-up-line';
16
+ import { Box, IconButton, CircularProgress as Spinner, svgIconClasses } from '@mui/material';
17
+ import { useState } from 'react';
18
+ import { BlockletStudio } from '@arcblock/ux-react';
19
+
20
+ // 提供工作室服務的 blocklet 的 DID。
21
+ const AI_STUDIO_COMPONENT_DID = 'z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9';
22
+
23
+ export default function Exporter() {
24
+ const [showCreateResource, setShowCreateResource] = useState(false);
25
+ const [opening, setOpening] = useState(false);
26
+
27
+ const handleShowDialog = () => {
28
+ setOpening(true);
29
+ setShowCreateResource(true);
30
+ };
31
+
32
+ return (
33
+ <>
34
+ <IconButton
35
+ sx={{
36
+ position: 'relative',
37
+ minWidth: 40,
38
+ minHeight: 40,
39
+ borderRadius: '100%',
40
+ [`.${svgIconClasses.root}`]: {
41
+ color: 'text.secondary',
42
+ },
43
+ }}
44
+ onClick={handleShowDialog}>
45
+ {opening ? <Spinner size={16} /> : <Box component={Icon} icon={ArrowUp} style={{ fontSize: 24 }} />}
46
+ </IconButton>
47
+ <BlockletStudio
48
+ open={showCreateResource}
49
+ setOpen={setShowCreateResource}
50
+ onOpened={() => setOpening(false)}
51
+ componentDid={AI_STUDIO_COMPONENT_DID}
52
+ mode="dialog"
53
+ title="Demo Project"
54
+ description="This is a demo project for the 'aigne' blocklet."
55
+ note='Please review all resources and components before publishing.'
56
+ introduction="Welcome to the resource publisher."
57
+ tenantScope="test-tenant-scope-id-2"
58
+ resourcesParams={{ name: 'test-project', extra: true }}
59
+ dependentComponentsMode="readonly"
60
+ componentsTitle="Required Components"
61
+ resourcesTitle="Add Project Files"
62
+ onConnected={() => alert('Connected')}
63
+ onUploaded={() => alert('Uploaded')}
64
+ onReleased={() => alert('Released')}
65
+ components={[
66
+ { did: 'z8ia3xzq2tMq8CRHfaXj1BTYJyYnEcHbqP8cJ', included: true, required: true },
67
+ { did: 'z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ', included: true, required: false },
68
+ ]}
69
+ resources={{
70
+ 'z8iZpog7mcgcgBZzTiXJCWESvmnRrQmnd3XBB': [
71
+ 'template-448698592710885376',
72
+ 'template-448696391418511360',
73
+ ],
74
+ }}
75
+ />
76
+ </>
77
+ );
78
+ }
79
+ ```
80
+
81
+ ## 屬性
82
+
83
+ `BlockletStudio` 元件接受以下屬性來控制其行為和外觀。
84
+
85
+ <x-field-group>
86
+ <x-field data-name="open" data-type="boolean" data-required="true">
87
+ <x-field-desc markdown>控制 `BlockletStudio` iframe 的可見性。設定為 `true` 可顯示,`false` 可隱藏。</x-field-desc>
88
+ </x-field>
89
+ <x-field data-name="setOpen" data-type="(open: boolean) => void" data-required="true">
90
+ <x-field-desc markdown>一個回呼函式,`BlockletStudio` 用於請求關閉。通常,此函式會將與 `open` 屬性相關的狀態變數設定為 `false`。</x-field-desc>
91
+ </x-field>
92
+ <x-field data-name="componentDid" data-type="string" data-required="true">
93
+ <x-field-desc markdown>提供資源發佈服務的 blocklet 的去中心化識別碼 (DID)。這決定了載入哪個工作室介面。</x-field-desc>
94
+ </x-field>
95
+ <x-field data-name="onOpened" data-type="() => void" data-required="false">
96
+ <x-field-desc markdown>一個可選的回呼函式,當 `BlockletStudio` iframe 完成載入並準備好進行使用者互動時執行。</x-field-desc>
97
+ </x-field>
98
+ <x-field data-name="onUploaded" data-type="(data: unknown) => void" data-required="false">
99
+ <x-field-desc markdown>一個可選的回呼函式,在使用者成功上傳新資源後觸發。`data` 參數包含有關上傳項目的元資料。</x-field-desc>
100
+ </x-field>
101
+ <x-field data-name="onReleased" data-type="(data: unknown) => void" data-required="false">
102
+ <x-field-desc markdown>一個可選的回呼函式,在使用者發佈元件的新版本後觸發。`data` 參數包含有關新版本的資訊。</x-field-desc>
103
+ </x-field>
104
+ <x-field data-name="onConnected" data-type="(data: unknown) => void" data-required="false">
105
+ <x-field-desc markdown>一個可選的回呼函式,在使用者連線資源或元件後觸發。</x-field-desc>
106
+ </x-field>
107
+ <x-field data-name="tenantScope" data-type="string" data-required="false">
108
+ <x-field-desc markdown>一個可選的字串,用於將資源範圍限定於特定租戶。這可用於確保多租戶環境中的資料隔離。</x-field-desc>
109
+ </x-field>
110
+ <x-field data-name="resourcesParams" data-type="Record<string, any>" data-required="false" data-default="{}">
111
+ <x-field-desc markdown>一個包含查詢參數的物件,這些參數將傳遞給 blocklet 的資源擷取 API 端點。這允許對資源進行動態篩選。</x-field-desc>
112
+ </x-field>
113
+ <x-field data-name="mode" data-type="string" data-required="false" data-default='"dialog"'>
114
+ <x-field-desc markdown>決定工作室介面的顯示模式。預設為 `'dialog'`。</x-field-desc>
115
+ </x-field>
116
+ <x-field data-name="title" data-type="string" data-required="false">
117
+ <x-field-desc markdown>一個可選的標題,顯示在工作室介面的頂部。</x-field-desc>
118
+ </x-field>
119
+ <x-field data-name="logo" data-type="string" data-required="false">
120
+ <x-field-desc markdown>一個可選的 logo URL,顯示在工作室介面中。</x-field-desc>
121
+ </x-field>
122
+ <x-field data-name="description" data-type="string" data-required="false">
123
+ <x-field-desc markdown>一個可選的字串,提供簡短描述,顯示在工作室 UI 中。</x-field-desc>
124
+ </x-field>
125
+ <x-field data-name="introduction" data-type="string" data-required="false">
126
+ <x-field-desc markdown>一個可選的字串,用於更詳細的介紹,顯示在工作室 UI 中。</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="note" data-type="string" data-required="false">
129
+ <x-field-desc markdown>一個可選的字串,用於向使用者顯示註釋或重要訊息。</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="componentsTitle" data-type="string" data-required="false">
132
+ <x-field-desc markdown>一個可選的字串,用於自訂元件部分的標題。</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="resourcesTitle" data-type="string" data-required="false">
135
+ <x-field-desc markdown>一個可選的字串,用於自訂資源部分的標題。</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="components" data-type="Record<string, unknown>[]" data-required="false" data-default="[]">
138
+ <x-field-desc markdown>一個物件陣列,代表在工作室中應預設預選的元件。</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="resources" data-type="Record<string, unknown>" data-required="false" data-default="{}">
141
+ <x-field-desc markdown>一個物件,代表在工作室中應預設預選的資源。</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="dependentComponentsMode" data-type="'auto' | 'readonly'" data-required="false">
144
+ <x-field-desc markdown>控制相依元件的行為。在 `'readonly'` 模式下,使用者無法取消選取作為所選資源的相依性而自動包含的元件。</x-field-desc>
145
+ </x-field>
146
+ <x-field data-name="style" data-type="React.CSSProperties" data-required="false" data-default="{}">
147
+ <x-field-desc markdown>一個用於將自訂 CSS 樣式應用於 `iframe` 元素的物件。</x-field-desc>
148
+ </x-field>
149
+ <x-field data-name="zIndex" data-type="number" data-required="false" data-default="9999">
150
+ <x-field-desc markdown>`iframe` 元素的 z-index CSS 屬性,控制其堆疊順序。</x-field-desc>
151
+ </x-field>
152
+ </x-field-group>
153
+
154
+ ## 相依元件
155
+
156
+ 為 `BlockletStudio` 提供資源 API 的 Blocklet 可以在資源資料中直接指定元件相依性。當使用者選取一個列出 `dependentComponents` 的資源時,`BlockletStudio` 將在 UI 中自動選取這些元件。
157
+
158
+ 此功能透過確保所有必要的相依性都自動包含在內,簡化了使用者體驗。
159
+
160
+ 要實作此功能,您的 blocklet 的資源 API 應返回一個包含所需元件 DID 的 `dependentComponents` 陣列。
161
+
162
+ ### API 回應範例
163
+
164
+ 以下是來自資源 API 端點的 JSON 回應範例。「應用程式」和「工具」資源宣告了它們的元件相依性。
165
+
166
+ ```json 帶有相依性的 API 回應
167
+ {
168
+ "resources": [
169
+ {
170
+ "id": "application-448698592710885376",
171
+ "name": "My App (as Application)",
172
+ "dependentComponents": [
173
+ "error-did",
174
+ "z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9",
175
+ "z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ",
176
+ "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"
177
+ ]
178
+ },
179
+ {
180
+ "id": "tool-448698592710885376",
181
+ "name": "My App (as Tool)",
182
+ "dependentComponents": ["error-did", "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"]
183
+ },
184
+ {
185
+ "id": "template-448698592710885376",
186
+ "name": "My App (as Template)"
187
+ }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ ## 總結
193
+
194
+ `BlockletStudio` 元件提供了一種強大而便利的方式,可將資源和元件管理直接整合到您的應用程式中。透過利用 `iframe` 和一組清晰的屬性,它在簡化開發的同時提供了一致的使用者體驗。有關相依性管理的相關功能,您可能還想查閱 [ComponentInstaller](./components-component-management-component-installer.md) 文件。