@abtnode/ux 1.16.27-beta-426c1690 → 1.16.27-beta-d27e19fa

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 (44) hide show
  1. package/lib/blocklet/component/add-component/add-component-core.js +4 -5
  2. package/lib/blocklet/component/add-component/step-connect.js +8 -0
  3. package/lib/blocklet/publish/{select-components.js → create-release/blocklets.js} +41 -20
  4. package/lib/blocklet/publish/create-release/branding.js +410 -0
  5. package/lib/blocklet/publish/{connect-store-list.js → create-release/connect-store-list.js} +2 -2
  6. package/lib/blocklet/publish/create-release/header.js +407 -0
  7. package/lib/blocklet/publish/create-release/index.js +576 -0
  8. package/lib/blocklet/publish/create-release/introduction-preview.js +28 -0
  9. package/lib/blocklet/publish/create-release/introduction.js +109 -0
  10. package/lib/blocklet/publish/create-release/release-stepper.js +161 -0
  11. package/lib/blocklet/publish/{resource.js → create-release/resources.js} +37 -21
  12. package/lib/blocklet/publish/create-release/step-icon.js +63 -0
  13. package/lib/blocklet/publish/{stop-box.js → create-release/stop-box.js} +13 -6
  14. package/lib/blocklet/publish/{tree.js → create-release/tree.js} +1 -1
  15. package/lib/blocklet/publish/create-release/version.js +93 -0
  16. package/lib/blocklet/publish/index.js +1 -1
  17. package/lib/blocklet/publish/project-list.js +3 -3
  18. package/lib/blocklet/publish/release-list.js +2 -2
  19. package/lib/blocklet/publish/utils/validate-params.js +92 -0
  20. package/lib/blocklet/router/action/add-domain-alias.js +2 -46
  21. package/lib/blocklet/router/add-domain.js +203 -67
  22. package/lib/contexts/domain.js +1 -22
  23. package/lib/hooks/use-bundle-logo.js +3 -2
  24. package/lib/layout/addon.js +3 -17
  25. package/lib/locales/ar.js +18 -2
  26. package/lib/locales/de.js +18 -2
  27. package/lib/locales/en.js +14 -1
  28. package/lib/locales/es.js +18 -2
  29. package/lib/locales/fr.js +18 -2
  30. package/lib/locales/hi.js +18 -2
  31. package/lib/locales/i18n.db +0 -0
  32. package/lib/locales/id.js +18 -2
  33. package/lib/locales/ja.js +18 -2
  34. package/lib/locales/ko.js +18 -2
  35. package/lib/locales/pt.js +18 -2
  36. package/lib/locales/ru.js +18 -2
  37. package/lib/locales/th.js +18 -2
  38. package/lib/locales/vi.js +18 -2
  39. package/lib/locales/zh-tw.js +18 -2
  40. package/lib/locales/zh.js +18 -2
  41. package/lib/util/index.js +7 -5
  42. package/package.json +19 -18
  43. package/lib/blocklet/publish/create-release.js +0 -1207
  44. /package/lib/blocklet/publish/{connect-store-button.js → create-release/connect-store-button.js} +0 -0
@@ -0,0 +1,576 @@
1
+ import { useState, useEffect, useRef, useCallback, useMemo } from 'react';
2
+ import { useParams } from 'react-router-dom';
3
+ import styled from '@emotion/styled';
4
+ import PropTypes from 'prop-types';
5
+ import useSetState from 'react-use/lib/useSetState';
6
+ import pick from 'lodash/pick';
7
+ import semver from 'semver';
8
+ import { Box, Typography, useMediaQuery, Tooltip } from '@mui/material';
9
+ import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
10
+ import Toast from '@arcblock/ux/lib/Toast';
11
+ import Tabs from '@arcblock/ux/lib/Tabs';
12
+ import { UNOWNED_DID } from '@abtnode/constant';
13
+ import QuestionMarkIcon from '@arcblock/icons/lib/QuestionMarkCircle';
14
+ import BlockletBundleAvatar from '../../bundle-avatar';
15
+ import { useNodeContext } from '../../../contexts/node';
16
+ import { useBlockletContext } from '../../../contexts/blocklet';
17
+ import EmptySpinner from '../../../empty-spinner';
18
+ import { formatError } from '../../../util';
19
+ import Resources from './resources';
20
+ import Blocklets from './blocklets';
21
+ import StopBox from './stop-box';
22
+ import Branding from './branding';
23
+ import Version from './version';
24
+ import Header from './header';
25
+ import ReleaseStepper from './release-stepper';
26
+ import Introduction from './introduction';
27
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
+ const addComponentTabs = ({
29
+ tabs,
30
+ blocklet,
31
+ ancestors = []
32
+ }) => {
33
+ const key = blocklet.meta.did;
34
+ tabs.push({
35
+ label: /*#__PURE__*/_jsxs(Box, {
36
+ display: "flex",
37
+ alignItems: "center",
38
+ justifyContent: "flex-start",
39
+ children: [/*#__PURE__*/_jsx(BlockletBundleAvatar, {
40
+ size: 24,
41
+ blocklet: blocklet,
42
+ ancestors: ancestors
43
+ }), /*#__PURE__*/_jsx(Box, {
44
+ ml: "4px",
45
+ className: "text",
46
+ children: /*#__PURE__*/_jsx(Box, {
47
+ children: blocklet.meta.title
48
+ })
49
+ })]
50
+ }, key),
51
+ value: key
52
+ });
53
+ };
54
+ const pickParams = (baseParams, app) => {
55
+ const params = pick(baseParams, ['blockletVersion', 'blockletTitle', 'blockletDescription', 'blockletLogo', 'blockletIntroduction', 'blockletScreenshots', 'connectedStores', 'blockletComponents', 'lastReleaseId', 'note']);
56
+ if (!params.blockletComponents) {
57
+ params.blockletComponents = (app.children || []).map(x => ({
58
+ did: x.meta.did,
59
+ included: false,
60
+ required: false
61
+ }));
62
+ } else {
63
+ params.blockletComponents = params.blockletComponents.map(x => ({
64
+ ...x,
65
+ included: true
66
+ }));
67
+ }
68
+ return params;
69
+ };
70
+ const stepsToLabel = {
71
+ 0: 'branding',
72
+ 1: 'introduction',
73
+ 2: 'resources',
74
+ 3: 'blocklets',
75
+ 4: 'version'
76
+ };
77
+ const labelToStep = {
78
+ branding: 0,
79
+ introduction: 1,
80
+ resources: 2,
81
+ blocklets: 3,
82
+ version: 4
83
+ };
84
+ export default function CreateRelease({
85
+ initUrl,
86
+ ...rest
87
+ }) {
88
+ const {
89
+ projectId,
90
+ mode,
91
+ releaseId: inputReleaseId,
92
+ componentDid = ''
93
+ } = useParams();
94
+ const {
95
+ t
96
+ } = useLocaleContext();
97
+ const {
98
+ blocklet
99
+ } = useBlockletContext();
100
+ const [params, setParams] = useSetState({
101
+ blockletScreenshots: [],
102
+ publishedStoreIds: [],
103
+ connectedStores: []
104
+ });
105
+ const [paramsErrTip, setParamsErrTip] = useSetState({});
106
+ const [loading, setLoading] = useState(false);
107
+ const [release, setRelease] = useSetState(null);
108
+ const {
109
+ api
110
+ } = useNodeContext();
111
+ const isMobile = useMediaQuery(theme => theme.breakpoints.down('md'));
112
+ const [initialResources, setInitialResources] = useState({});
113
+ const [releaseUsedLast, setReleaseUsedLast] = useState(false);
114
+ const saveSelectedEventsRef = useRef({});
115
+ const [selectedResourceIds, _setSelectedResourceIds] = useSetState({});
116
+ const [initLogoUrl, setInitLogoUrl] = useState('');
117
+ const [resourceComponentsMap, _setResourceComponentsMap] = useSetState({});
118
+ const dependentComponentsMode = initUrl?.searchParams.get('dependentComponentsMode');
119
+ const disabledSelectComponents = dependentComponentsMode === 'readonly';
120
+ const setResourceComponentsMap = useCallback(setter => {
121
+ if (disabledSelectComponents) {
122
+ setParams({
123
+ blockletComponents: []
124
+ });
125
+ }
126
+ _setResourceComponentsMap(setter);
127
+ }, [disabledSelectComponents, _setResourceComponentsMap, setParams]);
128
+ const setSelectedResourceIds = useCallback((...args) => {
129
+ _setSelectedResourceIds(...args);
130
+ setParamsErrTip({
131
+ blockletResources: ''
132
+ });
133
+ // eslint-disable-next-line react-hooks/exhaustive-deps
134
+ }, []);
135
+ const releaseId = inputReleaseId === 'none' ? params?.lastReleaseId || '' : inputReleaseId;
136
+ const [activeStep, setActiveStep] = useState(mode === 'new-release' ? 4 : 0);
137
+ useEffect(() => {
138
+ if (projectId) {
139
+ setParamsErrTip({
140
+ projectId: ''
141
+ });
142
+ }
143
+ }, [projectId, setParamsErrTip]);
144
+ const projectType = useMemo(() => params?.blockletComponents?.some(x => x.included) ? 'pack' : 'resource', [params?.blockletComponents]);
145
+ const tabs = [];
146
+ const resourceComponents = (blocklet?.children || []).filter(x => x.meta.resource?.exportApi).filter(x => !componentDid || x.meta.did === componentDid);
147
+ resourceComponents.forEach(item => {
148
+ addComponentTabs({
149
+ tabs,
150
+ blocklet: item,
151
+ t,
152
+ ancestors: [blocklet]
153
+ });
154
+ });
155
+ const [tab, setTab] = useState(tabs[0]?.value);
156
+ const isPublished = !releaseUsedLast && release?.status === 'published';
157
+ const readOnly = isPublished;
158
+ const resourceRelateComponents = useMemo(() => {
159
+ const result = {};
160
+ Object.keys(resourceComponentsMap).forEach(key => {
161
+ const item = resourceComponentsMap[key];
162
+ if (item) {
163
+ item.forEach(k => {
164
+ result[k] = true;
165
+ });
166
+ }
167
+ });
168
+ return result;
169
+ }, [resourceComponentsMap]);
170
+ const getRelease = async () => {
171
+ if (!releaseId) {
172
+ return;
173
+ }
174
+ try {
175
+ const res = await api.getRelease({
176
+ input: {
177
+ did: blocklet.meta.did,
178
+ projectId,
179
+ releaseId
180
+ }
181
+ });
182
+ setLoading(false);
183
+ if (!res.release) {
184
+ Toast.error('Release not found');
185
+ return;
186
+ }
187
+ setParams(lastParams => pickParams({
188
+ ...lastParams,
189
+ ...res.release,
190
+ blockletVersion: mode === 'create' || mode === 'new-release' ? semver.inc(res.release.blockletVersion, 'patch') : res.release.blockletVersion
191
+ }, blocklet));
192
+ setRelease(res.release);
193
+ } catch (err) {
194
+ setLoading(false);
195
+ Toast.error(formatError(err));
196
+ }
197
+ };
198
+ const getProject = async () => {
199
+ if (projectId === UNOWNED_DID) {
200
+ setParams({
201
+ blockletVersion: '1.0.0',
202
+ blockletTitle: ''
203
+ });
204
+ return;
205
+ }
206
+ if (!projectId) {
207
+ Toast.error(t('blocklet.publish.errorTip.noDid'));
208
+ return;
209
+ }
210
+ try {
211
+ const res = await api.getProject({
212
+ input: {
213
+ did: blocklet.meta.did,
214
+ projectId
215
+ }
216
+ });
217
+ setLoading(false);
218
+ const data = res.project || {};
219
+ if (!data.blockletVersion) {
220
+ data.blockletVersion = '1.0.0';
221
+ } else if ((mode === 'create' || mode === 'new-release') && semver.valid(data.blockletVersion)) {
222
+ data.blockletVersion = semver.inc(data.blockletVersion, 'patch');
223
+ }
224
+ const theParams = pickParams(data, blocklet);
225
+ setParams(theParams);
226
+ } catch (err) {
227
+ setLoading(false);
228
+ Toast.error(formatError(err));
229
+ }
230
+ };
231
+ const getData = useCallback(async () => {
232
+ if (mode === 'view') {
233
+ if (!releaseId) {
234
+ Toast.error('Empty release id');
235
+ return;
236
+ }
237
+ await getProject();
238
+ await getRelease();
239
+ return;
240
+ }
241
+ await getProject();
242
+ if (releaseId) {
243
+ setReleaseUsedLast(true);
244
+ await getRelease();
245
+ }
246
+ // eslint-disable-next-line react-hooks/exhaustive-deps
247
+ }, [mode, releaseId]);
248
+ const handleChangeSelectedComponents = data => {
249
+ setParams({
250
+ blockletComponents: data
251
+ });
252
+ };
253
+ useEffect(() => {
254
+ getData();
255
+ }, [getData]);
256
+ useEffect(() => {
257
+ if (projectId === UNOWNED_DID && (mode === 'create' || mode === 'new-release') && initUrl) {
258
+ setInitLogoUrl(initUrl.searchParams.get('logo'));
259
+ setParams({
260
+ blockletTitle: initUrl.searchParams.get('title'),
261
+ blockletDescription: initUrl.searchParams.get('description'),
262
+ blockletIntroduction: initUrl.searchParams.get('introduction') || initUrl.searchParams.get('description'),
263
+ blockletComponents: JSON.parse(initUrl.searchParams.get('components') || '[]'),
264
+ note: initUrl.searchParams.get('note') || 'No note'
265
+ });
266
+ const resourcesString = initUrl.searchParams.get('resources');
267
+ try {
268
+ const resources = JSON.parse(resourcesString);
269
+ setInitialResources(resources);
270
+ } catch (_) {
271
+ //
272
+ }
273
+ }
274
+ }, [setParams, projectId, initUrl, mode]);
275
+ const isSelectedResources = useMemo(() => {
276
+ return !!Object.keys(selectedResourceIds).find(key => {
277
+ if (selectedResourceIds[key].length) {
278
+ return true;
279
+ }
280
+ return false;
281
+ });
282
+ }, [selectedResourceIds]);
283
+ if (!params && loading) {
284
+ return /*#__PURE__*/_jsx(EmptySpinner, {});
285
+ }
286
+ if (!params) {
287
+ return null;
288
+ }
289
+ const resourceItem = resourceComponents.find(x => x.meta.did === tab);
290
+ const allResourceComponentsStop = resourceComponents.every(x => x.status !== 'running');
291
+ if (allResourceComponentsStop) {
292
+ return /*#__PURE__*/_jsx(StopBox, {
293
+ children: t('blocklet.publish.allComponentsNotRunning')
294
+ });
295
+ }
296
+ const onTabChange = x => {
297
+ setTab(x);
298
+ };
299
+ const resourcesUrlTitle = initUrl?.searchParams.get('resourcesTitle');
300
+ const componentsUrlTitle = initUrl?.searchParams.get('componentsTitle');
301
+ const steps = [{
302
+ label: t('blocklet.publish.branding'),
303
+ description: t('blocklet.publish.steps.branding')
304
+ }, {
305
+ label: t('common.introduction'),
306
+ description: t('blocklet.publish.steps.introduction')
307
+ }, {
308
+ label: resourcesUrlTitle || t('blocklet.publish.resourceTitle'),
309
+ description: t('blocklet.publish.steps.resources')
310
+ }, {
311
+ label: componentsUrlTitle || t('common.components'),
312
+ description: t('blocklet.publish.steps.blocklets')
313
+ }, {
314
+ label: mode === 'create' || mode === 'new-version' ? t('blocklet.publish.newVersionTitle') : t('blocklet.publish.versionTitle'),
315
+ description: t('blocklet.publish.steps.version')
316
+ }];
317
+ const nowStep = steps[activeStep] || steps[steps.length - 1];
318
+ const nowStepLabel = stepsToLabel[activeStep];
319
+ return /*#__PURE__*/_jsxs(Main, {
320
+ ...rest,
321
+ children: [/*#__PURE__*/_jsx(Header, {
322
+ blocklet: blocklet,
323
+ release: release,
324
+ getRelease: getRelease,
325
+ mode: mode,
326
+ params: params,
327
+ setParams: setParams,
328
+ setParamsErrTip: setParamsErrTip,
329
+ readOnly: readOnly,
330
+ isPublished: isPublished,
331
+ loading: loading,
332
+ setLoading: setLoading,
333
+ initLogoUrl: initLogoUrl,
334
+ releaseId: releaseId,
335
+ projectId: projectId,
336
+ resourceComponents: resourceComponents,
337
+ resourceComponentsMap: resourceComponentsMap,
338
+ resourceRelateComponents: resourceRelateComponents,
339
+ resourceItem: resourceItem,
340
+ saveSelectedEventsRef: saveSelectedEventsRef,
341
+ isSelectedResources: isSelectedResources,
342
+ releaseUsedLast: releaseUsedLast,
343
+ setReleaseUsedLast: setReleaseUsedLast,
344
+ setRelease: setRelease
345
+ }), /*#__PURE__*/_jsxs(Box, {
346
+ display: "flex",
347
+ flexDirection: "column",
348
+ sx: {
349
+ width: '100%'
350
+ },
351
+ children: [/*#__PURE__*/_jsx(Box, {
352
+ pt: 3
353
+ }), /*#__PURE__*/_jsxs(Box, {
354
+ sx: {
355
+ gap: 3
356
+ },
357
+ display: "flex",
358
+ flexDirection: isMobile ? 'column' : 'row',
359
+ children: [!isMobile && /*#__PURE__*/_jsx(ReleaseStepper, {
360
+ steps: steps,
361
+ viewMode: mode === 'view',
362
+ params: params,
363
+ isSelectedResources: isSelectedResources,
364
+ paramsErrTip: paramsErrTip,
365
+ activeStep: activeStep,
366
+ setActiveStep: setActiveStep,
367
+ projectId: projectId,
368
+ resourcesUrlTitle: resourcesUrlTitle,
369
+ componentsUrlTitle: componentsUrlTitle
370
+ }), /*#__PURE__*/_jsxs(Box, {
371
+ flex: "1",
372
+ maxWidth: "720px",
373
+ children: [!isMobile && nowStepLabel !== 'introduction' && /*#__PURE__*/_jsxs(Typography, {
374
+ variant: "h6",
375
+ fontWeight: "bold",
376
+ display: "flex",
377
+ flexDirection: "row",
378
+ alignItems: "center",
379
+ children: [nowStep.label, nowStepLabel === 'branding' && /*#__PURE__*/_jsx(Tooltip, {
380
+ title: t('blocklet.publish.brandingHelp'),
381
+ placement: "right",
382
+ children: /*#__PURE__*/_jsx(Box, {
383
+ component: "a",
384
+ target: "_blank",
385
+ href: "https://www.arcblock.io/docs/blocklet-store/en/blocklet-detail-page",
386
+ sx: {
387
+ paddingTop: 1,
388
+ marginLeft: 1
389
+ },
390
+ style: {
391
+ color: 'gray'
392
+ },
393
+ children: /*#__PURE__*/_jsx(QuestionMarkIcon, {})
394
+ })
395
+ })]
396
+ }), (isMobile || nowStepLabel === 'branding') && /*#__PURE__*/_jsx(Box, {
397
+ flexDirection: "column",
398
+ children: /*#__PURE__*/_jsx(Branding, {
399
+ projectId: projectId,
400
+ setParams: setParams,
401
+ setParamsErrTip: setParamsErrTip,
402
+ params: params,
403
+ componentDid: componentDid,
404
+ blocklet: blocklet,
405
+ initUrl: initUrl,
406
+ loading: loading,
407
+ setLoading: setLoading,
408
+ paramsErrTip: paramsErrTip,
409
+ readOnly: readOnly,
410
+ initLogoUrl: initLogoUrl,
411
+ setInitLogoUrl: setInitLogoUrl
412
+ })
413
+ }), isMobile && /*#__PURE__*/_jsx(Box, {
414
+ flexDirection: "column",
415
+ children: /*#__PURE__*/_jsx(Version, {
416
+ loading: loading,
417
+ params: params,
418
+ paramsErrTip: paramsErrTip,
419
+ setParams: setParams,
420
+ setParamsErrTip: setParamsErrTip,
421
+ readOnly: readOnly
422
+ })
423
+ }), (isMobile || nowStepLabel === 'introduction') && /*#__PURE__*/_jsx(Box, {
424
+ display: "flex",
425
+ flexDirection: "column",
426
+ sx: {
427
+ mt: isMobile ? 5 : 0,
428
+ width: '100%'
429
+ },
430
+ children: /*#__PURE__*/_jsx(Introduction, {
431
+ loading: loading,
432
+ readOnly: readOnly,
433
+ params: params,
434
+ setParams: setParams,
435
+ paramsErrTip: paramsErrTip,
436
+ setParamsErrTip: setParamsErrTip
437
+ })
438
+ }), isMobile && /*#__PURE__*/_jsx(Typography, {
439
+ variant: "h6",
440
+ fontWeight: "bold",
441
+ mt: 5,
442
+ children: steps[labelToStep.resources].label
443
+ }), /*#__PURE__*/_jsx(Box, {
444
+ display: isMobile || nowStepLabel === 'resources' ? 'flex' : 'none',
445
+ sx: {
446
+ maxWidth: 720
447
+ },
448
+ flexDirection: "column",
449
+ children: /*#__PURE__*/_jsx(Box, {
450
+ display: "flex",
451
+ mt: 3,
452
+ className: "section full-width",
453
+ children: /*#__PURE__*/_jsxs(Box, {
454
+ sx: {
455
+ flex: 1
456
+ },
457
+ children: [!componentDid && /*#__PURE__*/_jsx(Tabs, {
458
+ tabs: tabs,
459
+ current: tab,
460
+ onChange: onTabChange,
461
+ sx: {
462
+ ml: -2,
463
+ mt: -1.5
464
+ }
465
+ }), /*#__PURE__*/_jsx(Box, {
466
+ children: /*#__PURE__*/_jsx(Resources, {
467
+ loading: loading,
468
+ initialResources: initialResources,
469
+ saveSelectedEventsRef: saveSelectedEventsRef,
470
+ selectedResourceIds: selectedResourceIds,
471
+ setSelectedResourceIds: setSelectedResourceIds,
472
+ setResourceComponentsMap: setResourceComponentsMap,
473
+ error: paramsErrTip.blockletResource,
474
+ app: blocklet,
475
+ readOnly: readOnly,
476
+ component: resourceItem,
477
+ componentDid: componentDid,
478
+ initUrl: initUrl,
479
+ projectId: projectId === UNOWNED_DID ? '' : projectId,
480
+ releaseUsedLast: releaseUsedLast,
481
+ release: {
482
+ ...release,
483
+ id: releaseId
484
+ }
485
+ })
486
+ })]
487
+ })
488
+ })
489
+ }), isMobile && /*#__PURE__*/_jsx(Typography, {
490
+ variant: "h6",
491
+ fontWeight: "bold",
492
+ mt: 5,
493
+ children: steps[labelToStep.blocklets].label
494
+ }), (isMobile || nowStepLabel === 'blocklets') && /*#__PURE__*/_jsx(Box, {
495
+ flexDirection: "column",
496
+ children: /*#__PURE__*/_jsx(Box, {
497
+ display: "flex",
498
+ mt: 3,
499
+ className: "section full-width",
500
+ children: /*#__PURE__*/_jsx(Box, {
501
+ sx: {
502
+ flex: 1
503
+ },
504
+ children: /*#__PURE__*/_jsx(Blocklets, {
505
+ projectType: projectType,
506
+ disabled: loading || readOnly,
507
+ app: blocklet,
508
+ value: params?.blockletComponents || [],
509
+ onChange: handleChangeSelectedComponents,
510
+ resourceRelateComponents: resourceRelateComponents,
511
+ dependentComponentsMode: dependentComponentsMode
512
+ })
513
+ })
514
+ })
515
+ }), !isMobile && nowStepLabel === 'version' && /*#__PURE__*/_jsx(Box, {
516
+ flexDirection: "column",
517
+ children: /*#__PURE__*/_jsx(Version, {
518
+ loading: loading,
519
+ params: params,
520
+ paramsErrTip: paramsErrTip,
521
+ setParams: setParams,
522
+ setParamsErrTip: setParamsErrTip,
523
+ readOnly: readOnly
524
+ })
525
+ })]
526
+ })]
527
+ })]
528
+ })]
529
+ });
530
+ }
531
+ CreateRelease.propTypes = {
532
+ initUrl: PropTypes.object
533
+ };
534
+ CreateRelease.defaultProps = {
535
+ initUrl: null
536
+ };
537
+ const Main = styled.div`
538
+ .section {
539
+ &.full-width {
540
+ max-width: 100%;
541
+ }
542
+ .MuiTypography-h3 {
543
+ font-size: 1.1rem;
544
+ font-weight: 700;
545
+ }
546
+ .left {
547
+ flex-shrink: 0;
548
+ width: 140px;
549
+ }
550
+ .MuiTabs-indicator {
551
+ display: none;
552
+ }
553
+ .MuiTypography-subtitle1 {
554
+ width: 120px;
555
+ font-weight: 700;
556
+ font-size: 1rem;
557
+ ${({
558
+ theme
559
+ }) => theme.breakpoints.down('sm')} {
560
+ width: 80px;
561
+ }
562
+ }
563
+ }
564
+ .MuiButtonBase-root {
565
+ a {
566
+ color: inherit;
567
+ }
568
+ }
569
+ .MuiInputBase-multiline .MuiInputAdornment-positionEnd {
570
+ align-self: flex-end;
571
+ .MuiTypography-root {
572
+ font-size: 0.8rem;
573
+ }
574
+ font-size: 0.8rem;
575
+ }
576
+ `;
@@ -0,0 +1,28 @@
1
+ import MarkdownPreview from '@uiw/react-markdown-preview';
2
+ import PropTypes from 'prop-types';
3
+ import rehypeExternalLinks from 'rehype-external-links';
4
+ import { EmptyIcon } from '@arcblock/icons';
5
+ import StopBox from './stop-box';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ function IntroductionPreview({
8
+ text
9
+ }) {
10
+ if (!text) {
11
+ return /*#__PURE__*/_jsx(StopBox, {
12
+ Icon: EmptyIcon
13
+ });
14
+ }
15
+ return /*#__PURE__*/_jsx(MarkdownPreview, {
16
+ wrapperElement: {
17
+ 'data-color-mode': 'light'
18
+ },
19
+ source: text,
20
+ rehypePlugins: [[rehypeExternalLinks, {
21
+ target: '_blank'
22
+ }]]
23
+ });
24
+ }
25
+ IntroductionPreview.propTypes = {
26
+ text: PropTypes.string.isRequired
27
+ };
28
+ export default IntroductionPreview;