@lvce-editor/extension-detail-view 3.31.0 → 3.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensionDetailViewWorkerMain.js +164 -116
- package/package.json +1 -1
|
@@ -944,30 +944,34 @@ const {
|
|
|
944
944
|
|
|
945
945
|
const create$1 = (uid, uri, x, y, width, height, platform, assetDir) => {
|
|
946
946
|
const state = {
|
|
947
|
+
assetDir: assetDir || '',
|
|
948
|
+
baseUrl: '',
|
|
949
|
+
builtinExtensionsBadgeEnabled: true,
|
|
950
|
+
categories: [],
|
|
951
|
+
changelogVirtualDom: [],
|
|
947
952
|
description: '',
|
|
948
|
-
|
|
949
|
-
selectedFeature: '',
|
|
950
|
-
name: '',
|
|
951
|
-
sanitizedReadmeHtml: '',
|
|
952
|
-
selectedTab: '',
|
|
953
|
-
sizeOnDisk: 0,
|
|
954
|
-
width,
|
|
955
|
-
uri,
|
|
953
|
+
detailsVirtualDom: [],
|
|
956
954
|
entries: [],
|
|
957
|
-
secondEntries: [],
|
|
958
|
-
categories: [],
|
|
959
|
-
resources: [],
|
|
960
|
-
selectedFeatureMarkdownDom: '',
|
|
961
955
|
extension: {},
|
|
962
|
-
baseUrl: '',
|
|
963
956
|
features: [],
|
|
957
|
+
featuresVirtualDom: [],
|
|
964
958
|
folderSize: 0,
|
|
965
|
-
|
|
959
|
+
iconSrc: '',
|
|
960
|
+
name: '',
|
|
966
961
|
platform,
|
|
967
962
|
readmeScrollTop: 0,
|
|
963
|
+
resources: [],
|
|
964
|
+
sanitizedReadmeHtml: '',
|
|
965
|
+
scrollToTopButtonEnabled: false,
|
|
966
|
+
secondEntries: [],
|
|
967
|
+
selectedFeature: '',
|
|
968
|
+
themesMarkdownDom: [],
|
|
969
|
+
selectedTab: '',
|
|
968
970
|
settingsButtonEnabled: false,
|
|
969
|
-
|
|
970
|
-
|
|
971
|
+
showAdditionalDetailsBreakpoint: 600,
|
|
972
|
+
sizeOnDisk: 0,
|
|
973
|
+
uri,
|
|
974
|
+
width
|
|
971
975
|
};
|
|
972
976
|
set$1(uid, state, state);
|
|
973
977
|
};
|
|
@@ -1402,10 +1406,61 @@ const SetColorTheme = 'SetColorTheme';
|
|
|
1402
1406
|
const Disable = 'Disable';
|
|
1403
1407
|
const Uninstall = 'Uninstall';
|
|
1404
1408
|
|
|
1409
|
+
const getMarkdownVirtualDom = async html => {
|
|
1410
|
+
string(html);
|
|
1411
|
+
const dom = await getMarkdownDom(html);
|
|
1412
|
+
return dom;
|
|
1413
|
+
};
|
|
1414
|
+
|
|
1415
|
+
const readFile = async uri => {
|
|
1416
|
+
return readFile$1(uri);
|
|
1417
|
+
};
|
|
1418
|
+
|
|
1419
|
+
const ENOENT = 'ENOENT';
|
|
1420
|
+
|
|
1421
|
+
const isEnoentError = error => {
|
|
1422
|
+
return error && error.code === ENOENT;
|
|
1423
|
+
};
|
|
1424
|
+
|
|
1425
|
+
const join = (pathSeparator, ...parts) => {
|
|
1426
|
+
return parts.join(pathSeparator);
|
|
1427
|
+
};
|
|
1428
|
+
|
|
1429
|
+
const loadChangelogContent = async path => {
|
|
1430
|
+
try {
|
|
1431
|
+
const changelogUrl = join('/', path, 'CHANGELOG.md');
|
|
1432
|
+
const changelogContent = await readFile(changelogUrl);
|
|
1433
|
+
return changelogContent;
|
|
1434
|
+
} catch (error) {
|
|
1435
|
+
if (isEnoentError(error)) {
|
|
1436
|
+
return '';
|
|
1437
|
+
}
|
|
1438
|
+
// TODO send message to error worker
|
|
1439
|
+
// @ts-ignore
|
|
1440
|
+
console.error(new VError(error, 'Failed to load Changelog content'));
|
|
1441
|
+
return `${error}`;
|
|
1442
|
+
}
|
|
1443
|
+
};
|
|
1444
|
+
|
|
1445
|
+
const renderMarkdown = async (markdown, options = {}) => {
|
|
1446
|
+
const html = await renderMarkdown$1(markdown, options);
|
|
1447
|
+
return html;
|
|
1448
|
+
};
|
|
1449
|
+
|
|
1405
1450
|
const selectTabChangelog = async state => {
|
|
1451
|
+
const {
|
|
1452
|
+
extension,
|
|
1453
|
+
baseUrl
|
|
1454
|
+
} = state;
|
|
1455
|
+
const changelogContent = await loadChangelogContent(extension.path); // TODO use uri
|
|
1456
|
+
const changelogMarkdownHtml = await renderMarkdown(changelogContent, {
|
|
1457
|
+
baseUrl
|
|
1458
|
+
});
|
|
1459
|
+
const changelogDom = await getMarkdownVirtualDom(changelogMarkdownHtml);
|
|
1406
1460
|
return {
|
|
1407
1461
|
...state,
|
|
1408
|
-
selectedTab: Changelog$1
|
|
1462
|
+
selectedTab: Changelog$1,
|
|
1463
|
+
changelogVirtualDom: changelogDom
|
|
1409
1464
|
};
|
|
1410
1465
|
};
|
|
1411
1466
|
|
|
@@ -1413,11 +1468,56 @@ const selectTabDefault = async state => {
|
|
|
1413
1468
|
return state;
|
|
1414
1469
|
};
|
|
1415
1470
|
|
|
1471
|
+
const getRemoteSrc = uri => {
|
|
1472
|
+
const src = `/remote${uri}`;
|
|
1473
|
+
return src;
|
|
1474
|
+
};
|
|
1475
|
+
|
|
1476
|
+
const Web = 1;
|
|
1477
|
+
const Electron = 2;
|
|
1478
|
+
const Remote = 3;
|
|
1479
|
+
|
|
1480
|
+
const getBaseUrl = (extensionPath, platform) => {
|
|
1481
|
+
switch (platform) {
|
|
1482
|
+
case Remote:
|
|
1483
|
+
case Electron:
|
|
1484
|
+
return getRemoteSrc(extensionPath + '/');
|
|
1485
|
+
default:
|
|
1486
|
+
return extensionPath;
|
|
1487
|
+
}
|
|
1488
|
+
};
|
|
1489
|
+
|
|
1490
|
+
const loadReadmeContent = async path => {
|
|
1491
|
+
try {
|
|
1492
|
+
const readmeUrl = join('/', path, 'README.md');
|
|
1493
|
+
const readmeContent = await readFile(readmeUrl);
|
|
1494
|
+
return readmeContent;
|
|
1495
|
+
} catch (error) {
|
|
1496
|
+
if (isEnoentError(error)) {
|
|
1497
|
+
return '';
|
|
1498
|
+
}
|
|
1499
|
+
// TODO send message to error worker
|
|
1500
|
+
// @ts-ignore
|
|
1501
|
+
console.error(new VError(error, 'Failed to load Readme content'));
|
|
1502
|
+
return `${error}`;
|
|
1503
|
+
}
|
|
1504
|
+
};
|
|
1505
|
+
|
|
1416
1506
|
const selectTabDetails = async state => {
|
|
1417
|
-
|
|
1507
|
+
const {
|
|
1508
|
+
extension,
|
|
1509
|
+
platform
|
|
1510
|
+
} = state;
|
|
1511
|
+
const readmeContent = await loadReadmeContent(extension.path);
|
|
1512
|
+
const baseUrl = getBaseUrl(extension.path, platform);
|
|
1513
|
+
const readmeHtml = await renderMarkdown(readmeContent, {
|
|
1514
|
+
baseUrl
|
|
1515
|
+
});
|
|
1516
|
+
const detailsDom = await getMarkdownVirtualDom(readmeHtml);
|
|
1418
1517
|
return {
|
|
1419
1518
|
...state,
|
|
1420
|
-
selectedTab: Details
|
|
1519
|
+
selectedTab: Details,
|
|
1520
|
+
detailsVirtualDom: detailsDom
|
|
1421
1521
|
};
|
|
1422
1522
|
};
|
|
1423
1523
|
|
|
@@ -1454,30 +1554,31 @@ const getThemeMarkdown = (themes, iconThemes, productIconThemes) => {
|
|
|
1454
1554
|
return markdown;
|
|
1455
1555
|
};
|
|
1456
1556
|
|
|
1457
|
-
const
|
|
1458
|
-
const html = await renderMarkdown$1(markdown, options);
|
|
1459
|
-
return html;
|
|
1460
|
-
};
|
|
1461
|
-
|
|
1462
|
-
const selectTab$1 = async state => {
|
|
1557
|
+
const selectTabFeatures = async state => {
|
|
1463
1558
|
const {
|
|
1464
1559
|
extension,
|
|
1465
|
-
baseUrl
|
|
1560
|
+
baseUrl,
|
|
1561
|
+
selectedFeature
|
|
1466
1562
|
} = state;
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1563
|
+
|
|
1564
|
+
// Only generate theme markdown when the selected feature is actually "Theme"
|
|
1565
|
+
let themesMarkdownDom = [];
|
|
1566
|
+
if (!selectedFeature || selectedFeature === Theme) {
|
|
1567
|
+
const {
|
|
1568
|
+
colorThemes,
|
|
1569
|
+
iconThemes,
|
|
1570
|
+
productIconThemes
|
|
1571
|
+
} = extension;
|
|
1572
|
+
const markdown = getThemeMarkdown(colorThemes || [], iconThemes || [], productIconThemes || []);
|
|
1573
|
+
const rendered = await renderMarkdown(markdown, {
|
|
1574
|
+
baseUrl
|
|
1575
|
+
});
|
|
1576
|
+
themesMarkdownDom = await getMarkdownVirtualDom(rendered);
|
|
1577
|
+
}
|
|
1477
1578
|
return {
|
|
1478
1579
|
...state,
|
|
1479
1580
|
selectedTab: Features$1,
|
|
1480
|
-
|
|
1581
|
+
themesMarkdownDom: themesMarkdownDom
|
|
1481
1582
|
};
|
|
1482
1583
|
};
|
|
1483
1584
|
|
|
@@ -1486,7 +1587,7 @@ const getSelectTabHandler = selectedTab => {
|
|
|
1486
1587
|
case Details:
|
|
1487
1588
|
return selectTabDetails;
|
|
1488
1589
|
case Features$1:
|
|
1489
|
-
return
|
|
1590
|
+
return selectTabFeatures;
|
|
1490
1591
|
case Changelog$1:
|
|
1491
1592
|
return selectTabChangelog;
|
|
1492
1593
|
default:
|
|
@@ -1524,10 +1625,6 @@ const isThemeExtension = extension => {
|
|
|
1524
1625
|
return extension.name && extension.name.endsWith(' Theme');
|
|
1525
1626
|
};
|
|
1526
1627
|
|
|
1527
|
-
const Web = 1;
|
|
1528
|
-
const Electron = 2;
|
|
1529
|
-
const Remote = 3;
|
|
1530
|
-
|
|
1531
1628
|
const getIcon = (extension, platform, assetDir) => {
|
|
1532
1629
|
if (!extension) {
|
|
1533
1630
|
return extensionDefaultIcon(assetDir);
|
|
@@ -1596,21 +1693,6 @@ const getExtension = async (id, platform) => {
|
|
|
1596
1693
|
}
|
|
1597
1694
|
};
|
|
1598
1695
|
|
|
1599
|
-
const getRemoteSrc = uri => {
|
|
1600
|
-
const src = `/remote${uri}`;
|
|
1601
|
-
return src;
|
|
1602
|
-
};
|
|
1603
|
-
|
|
1604
|
-
const getBaseUrl = (extensionPath, platform) => {
|
|
1605
|
-
switch (platform) {
|
|
1606
|
-
case Remote:
|
|
1607
|
-
case Electron:
|
|
1608
|
-
return getRemoteSrc(extensionPath + '/');
|
|
1609
|
-
default:
|
|
1610
|
-
return extensionPath;
|
|
1611
|
-
}
|
|
1612
|
-
};
|
|
1613
|
-
|
|
1614
1696
|
const getCategories = () => {
|
|
1615
1697
|
return [{
|
|
1616
1698
|
id: 'themes',
|
|
@@ -1729,36 +1811,6 @@ const getViewletSize = width => {
|
|
|
1729
1811
|
return Large$1;
|
|
1730
1812
|
};
|
|
1731
1813
|
|
|
1732
|
-
const readFile = async uri => {
|
|
1733
|
-
return readFile$1(uri);
|
|
1734
|
-
};
|
|
1735
|
-
|
|
1736
|
-
const ENOENT = 'ENOENT';
|
|
1737
|
-
|
|
1738
|
-
const isEnoentError = error => {
|
|
1739
|
-
return error && error.code === ENOENT;
|
|
1740
|
-
};
|
|
1741
|
-
|
|
1742
|
-
const join = (pathSeparator, ...parts) => {
|
|
1743
|
-
return parts.join(pathSeparator);
|
|
1744
|
-
};
|
|
1745
|
-
|
|
1746
|
-
const loadReadmeContent = async path => {
|
|
1747
|
-
try {
|
|
1748
|
-
const readmeUrl = join('/', path, 'README.md');
|
|
1749
|
-
const readmeContent = await readFile(readmeUrl);
|
|
1750
|
-
return readmeContent;
|
|
1751
|
-
} catch (error) {
|
|
1752
|
-
if (isEnoentError(error)) {
|
|
1753
|
-
return '';
|
|
1754
|
-
}
|
|
1755
|
-
// TODO send message to error worker
|
|
1756
|
-
// @ts-ignore
|
|
1757
|
-
console.error(new VError(error, 'Failed to load Readme content'));
|
|
1758
|
-
return `${error}`;
|
|
1759
|
-
}
|
|
1760
|
-
};
|
|
1761
|
-
|
|
1762
1814
|
const getSavedSelectedFeature = savedState => {
|
|
1763
1815
|
if (savedState && typeof savedState === 'object' && 'selectedFeature' in savedState && typeof savedState.selectedFeature === 'string') {
|
|
1764
1816
|
return savedState.selectedFeature;
|
|
@@ -2253,12 +2305,6 @@ const getInstallationEntries = (displaySize, extensionId, extensionVersion, exte
|
|
|
2253
2305
|
return entries;
|
|
2254
2306
|
};
|
|
2255
2307
|
|
|
2256
|
-
const getMarkdownVirtualDom = async html => {
|
|
2257
|
-
string(html);
|
|
2258
|
-
const dom = await getMarkdownDom(html);
|
|
2259
|
-
return dom;
|
|
2260
|
-
};
|
|
2261
|
-
|
|
2262
2308
|
const getMarketplaceEntries = () => {
|
|
2263
2309
|
return [{
|
|
2264
2310
|
key: 'Published',
|
|
@@ -2294,14 +2340,13 @@ const getChildCount = (additionalDetails, scrollToTopEnabled) => {
|
|
|
2294
2340
|
}
|
|
2295
2341
|
return count;
|
|
2296
2342
|
};
|
|
2297
|
-
const getDetailsVirtualDom = async (sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories$1, resources$1) => {
|
|
2343
|
+
const getDetailsVirtualDom = async (sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories$1, resources$1, showAdditionalDetailsBreakpoint) => {
|
|
2298
2344
|
const firstHeading = installation();
|
|
2299
2345
|
const entries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
|
|
2300
2346
|
const secondHeading = marketplace();
|
|
2301
2347
|
const secondEntries = getMarketplaceEntries();
|
|
2302
2348
|
const thirdHeading = categories();
|
|
2303
2349
|
const fourthHeading = resources();
|
|
2304
|
-
const showAdditionalDetailsBreakpoint = 600;
|
|
2305
2350
|
const showAdditionalDetails = width > showAdditionalDetailsBreakpoint;
|
|
2306
2351
|
const childCount = getChildCount(showAdditionalDetails, scrollToTopButtonEnabled);
|
|
2307
2352
|
const dom = [{
|
|
@@ -2540,9 +2585,8 @@ const getVirtualDomChildCount = dom => {
|
|
|
2540
2585
|
return stack.length;
|
|
2541
2586
|
};
|
|
2542
2587
|
|
|
2543
|
-
const getFeatureThemesVirtualDom = async
|
|
2544
|
-
const
|
|
2545
|
-
const childCount = getVirtualDomChildCount(markdownDom);
|
|
2588
|
+
const getFeatureThemesVirtualDom = async themesDom => {
|
|
2589
|
+
const childCount = getVirtualDomChildCount(themesDom);
|
|
2546
2590
|
const heading = theme();
|
|
2547
2591
|
return [{
|
|
2548
2592
|
type: VirtualDomElements.Div,
|
|
@@ -2552,7 +2596,7 @@ const getFeatureThemesVirtualDom = async themesHtml => {
|
|
|
2552
2596
|
type: VirtualDomElements.Div,
|
|
2553
2597
|
className: DefaultMarkdown,
|
|
2554
2598
|
childCount
|
|
2555
|
-
}, ...
|
|
2599
|
+
}, ...themesDom];
|
|
2556
2600
|
};
|
|
2557
2601
|
|
|
2558
2602
|
const toWebView = rawWebView => {
|
|
@@ -2621,10 +2665,10 @@ const getFeatureWebViewsVirtualDom = extension => {
|
|
|
2621
2665
|
}, ...webViews$1.flatMap(getWebViewVirtualDom)];
|
|
2622
2666
|
};
|
|
2623
2667
|
|
|
2624
|
-
const getFeatureContentVirtualDom = async (features,
|
|
2668
|
+
const getFeatureContentVirtualDom = async (features, themesDom, selectedFeature, extension) => {
|
|
2625
2669
|
switch (selectedFeature) {
|
|
2626
2670
|
case Theme:
|
|
2627
|
-
return await getFeatureThemesVirtualDom(
|
|
2671
|
+
return await getFeatureThemesVirtualDom(themesDom);
|
|
2628
2672
|
case Commands:
|
|
2629
2673
|
return getFeatureCommandsVirtualDom(extension);
|
|
2630
2674
|
case JsonValidation:
|
|
@@ -2666,7 +2710,7 @@ const getFeatureListVirtualDom = features => {
|
|
|
2666
2710
|
}, ...features.flatMap(getFeatureListItemVirtualDom)];
|
|
2667
2711
|
};
|
|
2668
2712
|
|
|
2669
|
-
const getFeaturesVirtualDom = async (features,
|
|
2713
|
+
const getFeaturesVirtualDom = async (features, themesDom, selectedFeature, extension) => {
|
|
2670
2714
|
if (features.length === 0) {
|
|
2671
2715
|
const none$1 = none();
|
|
2672
2716
|
return [{
|
|
@@ -2683,15 +2727,15 @@ const getFeaturesVirtualDom = async (features, themesHtml, selectedFeature, exte
|
|
|
2683
2727
|
type: VirtualDomElements.Div,
|
|
2684
2728
|
className: mergeClassNames(Sash, SashVertical),
|
|
2685
2729
|
childCount: 0
|
|
2686
|
-
}, ...(await getFeatureContentVirtualDom(features,
|
|
2730
|
+
}, ...(await getFeatureContentVirtualDom(features, themesDom, selectedFeature, extension))];
|
|
2687
2731
|
};
|
|
2688
2732
|
|
|
2689
|
-
const getExtensionDetailContentVirtualDom = async (sanitizedReadmeHtml,
|
|
2733
|
+
const getExtensionDetailContentVirtualDom = async (sanitizedReadmeHtml, themesDom, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, scrollToTopButtonEnabled, categories, resources, breakpoint) => {
|
|
2690
2734
|
switch (selectedTab) {
|
|
2691
2735
|
case Details:
|
|
2692
|
-
return await getDetailsVirtualDom(sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extension.uri || extension.path || '', scrollToTopButtonEnabled, categories, resources);
|
|
2736
|
+
return await getDetailsVirtualDom(sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extension.uri || extension.path || '', scrollToTopButtonEnabled, categories, resources, breakpoint);
|
|
2693
2737
|
case Features$1:
|
|
2694
|
-
return await getFeaturesVirtualDom(features,
|
|
2738
|
+
return await getFeaturesVirtualDom(features, themesDom, selectedFeature, extension);
|
|
2695
2739
|
case Changelog$1:
|
|
2696
2740
|
return getChangelogVirtualDom();
|
|
2697
2741
|
default:
|
|
@@ -2748,6 +2792,17 @@ const getExtensionDetailHeaderActionsVirtualDom = (buttonDefs, settingsButtonEna
|
|
|
2748
2792
|
return dom;
|
|
2749
2793
|
};
|
|
2750
2794
|
|
|
2795
|
+
const getExtensionDetailIconVirtualDom = iconSrc => {
|
|
2796
|
+
return {
|
|
2797
|
+
type: VirtualDomElements.Img,
|
|
2798
|
+
className: ExtensionDetailIcon,
|
|
2799
|
+
alt: '',
|
|
2800
|
+
draggable: false,
|
|
2801
|
+
childCount: 0,
|
|
2802
|
+
src: iconSrc
|
|
2803
|
+
};
|
|
2804
|
+
};
|
|
2805
|
+
|
|
2751
2806
|
const getNameBadgeVirtualDom = badge => {
|
|
2752
2807
|
if (!badge) {
|
|
2753
2808
|
return [];
|
|
@@ -2772,14 +2827,7 @@ const getExtensionDetailHeaderVirtualDom = (name, iconSrc, description, badge, b
|
|
|
2772
2827
|
type: VirtualDomElements.Div,
|
|
2773
2828
|
className: ExtensionDetailHeader,
|
|
2774
2829
|
childCount: 2
|
|
2775
|
-
}, {
|
|
2776
|
-
type: VirtualDomElements.Img,
|
|
2777
|
-
className: ExtensionDetailIcon,
|
|
2778
|
-
alt: '',
|
|
2779
|
-
draggable: false,
|
|
2780
|
-
childCount: 0,
|
|
2781
|
-
src: iconSrc
|
|
2782
|
-
}, {
|
|
2830
|
+
}, getExtensionDetailIconVirtualDom(iconSrc), {
|
|
2783
2831
|
type: VirtualDomElements.Div,
|
|
2784
2832
|
className: ExtensionDetailHeaderDetails,
|
|
2785
2833
|
childCount: 3
|
|
@@ -2855,7 +2903,7 @@ const getExtensionDetailVirtualDom = async (newState, sanitizedReadmeHtml, selec
|
|
|
2855
2903
|
// 2. view model
|
|
2856
2904
|
// 3. virtual dom
|
|
2857
2905
|
// 4. dom
|
|
2858
|
-
const themesHtml = newState
|
|
2906
|
+
const themesHtml = newState.themesMarkdownDom;
|
|
2859
2907
|
const selectedFeature = newState?.selectedFeature || '';
|
|
2860
2908
|
const extension = newState?.extension || {};
|
|
2861
2909
|
const features = getFeatures(selectedFeature, extension);
|
|
@@ -2881,7 +2929,7 @@ const getExtensionDetailVirtualDom = async (newState, sanitizedReadmeHtml, selec
|
|
|
2881
2929
|
type: VirtualDomElements.Div,
|
|
2882
2930
|
className: mergeClassNames(Viewlet, ExtensionDetail, sizeClass),
|
|
2883
2931
|
childCount: 3
|
|
2884
|
-
}, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttonDefs, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...(await getExtensionDetailContentVirtualDom(sanitizedReadmeHtml, themesHtml, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, newState.scrollToTopButtonEnabled, newState.categories, newState.resources))];
|
|
2932
|
+
}, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttonDefs, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...(await getExtensionDetailContentVirtualDom(sanitizedReadmeHtml, themesHtml, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, newState.scrollToTopButtonEnabled, newState.categories, newState.resources, newState.showAdditionalDetailsBreakpoint))];
|
|
2885
2933
|
return dom;
|
|
2886
2934
|
};
|
|
2887
2935
|
|