@backstage/plugin-techdocs 0.0.0-nightly-20220510022953 → 0.0.0-nightly-20220511024315

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/CHANGELOG.md CHANGED
@@ -1,25 +1,56 @@
1
1
  # @backstage/plugin-techdocs
2
2
 
3
- ## 0.0.0-nightly-20220510022953
3
+ ## 0.0.0-nightly-20220511024315
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 52419be116: Create a menu in the sub header of documentation pages, it is responsible for rendering TechDocs addons that allow users to customize their reading experience.
7
8
  - 1af133f779: Updated dependency `event-source-polyfill` to `1.0.26`.
9
+ - cc8ddd0979: revert dependency `event-source-polyfill` to `1.0.25`
8
10
  - a307a14be0: Removed dependency on `@backstage/core-app-api`.
9
11
  - bed0d64ce9: Fixed bugs that prevented a 404 error from being shown when it should have been.
10
12
  - 2dcb2c9678: Loading SVGs correctly with `bota` with extended characters
11
13
  - 52fddad92d: The `TechDocsStorageApi` and its associated ref are now exported by `@backstage/plugin-techdocs-react`. The API interface, ref, and types are now deprecated in `@backstage/plugin-techdocs` and will be removed in a future release.
12
14
  - 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms
13
15
  - Updated dependencies
14
- - @backstage/core-components@0.0.0-nightly-20220510022953
15
- - @backstage/core-plugin-api@0.0.0-nightly-20220510022953
16
- - @backstage/integration@0.0.0-nightly-20220510022953
17
- - @backstage/plugin-catalog-react@0.0.0-nightly-20220510022953
18
- - @backstage/integration-react@0.0.0-nightly-20220510022953
19
- - @backstage/config@0.0.0-nightly-20220510022953
20
- - @backstage/plugin-search-react@0.0.0-nightly-20220510022953
21
- - @backstage/plugin-techdocs-react@0.0.0-nightly-20220510022953
22
- - @backstage/plugin-search-common@0.0.0-nightly-20220510022953
16
+ - @backstage/core-components@0.0.0-nightly-20220511024315
17
+ - @backstage/core-plugin-api@0.0.0-nightly-20220511024315
18
+ - @backstage/integration@0.0.0-nightly-20220511024315
19
+ - @backstage/plugin-catalog-react@0.0.0-nightly-20220511024315
20
+ - @backstage/integration-react@0.0.0-nightly-20220511024315
21
+ - @backstage/plugin-techdocs-react@0.0.0-nightly-20220511024315
22
+ - @backstage/config@0.0.0-nightly-20220511024315
23
+ - @backstage/plugin-search-react@0.0.0-nightly-20220511024315
24
+ - @backstage/plugin-search-common@0.0.0-nightly-20220511024315
25
+ - @backstage/catalog-model@0.0.0-nightly-20220511024315
26
+
27
+ ## 1.1.1-next.3
28
+
29
+ ### Patch Changes
30
+
31
+ - cc8ddd0979: revert dependency `event-source-polyfill` to `1.0.25`
32
+ - Updated dependencies
33
+ - @backstage/core-components@0.9.4-next.2
34
+
35
+ ## 1.1.1-next.2
36
+
37
+ ### Patch Changes
38
+
39
+ - 52419be116: Create a menu in the sub header of documentation pages, it is responsible for rendering TechDocs addons that allow users to customize their reading experience.
40
+ - 1af133f779: Updated dependency `event-source-polyfill` to `1.0.26`.
41
+ - 2dcb2c9678: Loading SVGs correctly with `bota` with extended characters
42
+ - 3a74e203a8: Updated search result components to support rendering content with highlighted matched terms
43
+ - Updated dependencies
44
+ - @backstage/core-components@0.9.4-next.1
45
+ - @backstage/plugin-techdocs-react@0.1.1-next.2
46
+ - @backstage/config@1.0.1-next.0
47
+ - @backstage/plugin-search-react@0.2.0-next.2
48
+ - @backstage/plugin-search-common@0.3.4-next.0
49
+ - @backstage/plugin-catalog-react@1.1.0-next.2
50
+ - @backstage/catalog-model@1.0.2-next.0
51
+ - @backstage/core-plugin-api@1.0.2-next.1
52
+ - @backstage/integration@1.2.0-next.1
53
+ - @backstage/integration-react@1.1.0-next.2
23
54
 
24
55
  ## 1.1.1-next.1
25
56
 
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
2
2
  import useAsync from 'react-use/lib/useAsync';
3
3
  import { makeStyles } from '@material-ui/core';
4
4
  import { catalogApiRef, CATALOG_FILTER_EXISTS, useEntityOwnership } from '@backstage/plugin-catalog-react';
5
- import { T as TechDocsPageWrapper, D as DocsTable, a as DocsCardGrid } from './index-913b47d9.esm.js';
5
+ import { T as TechDocsPageWrapper, D as DocsTable, a as DocsCardGrid } from './index-c537b1f3.esm.js';
6
6
  import { Content, Progress, WarningPanel, CodeSnippet, HeaderTabs, ContentHeader, SupportButton } from '@backstage/core-components';
7
7
  import { useApi } from '@backstage/core-plugin-api';
8
8
  import '@backstage/errors';
@@ -30,6 +30,7 @@ import 'dompurify';
30
30
  import 'react-helmet';
31
31
  import '@material-ui/icons/Code';
32
32
  import '@backstage/catalog-model';
33
+ import '@material-ui/icons/Settings';
33
34
  import 'react-use/lib/useCopyToClipboard';
34
35
  import 'lodash';
35
36
  import '@material-ui/icons/Share';
@@ -131,4 +132,4 @@ const TechDocsCustomHome = (props) => {
131
132
  };
132
133
 
133
134
  export { TechDocsCustomHome };
134
- //# sourceMappingURL=TechDocsCustomHome-968d179e.esm.js.map
135
+ //# sourceMappingURL=TechDocsCustomHome-b77adc6d.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TechDocsCustomHome-968d179e.esm.js","sources":["../../src/home/components/TechDocsCustomHome.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { makeStyles } from '@material-ui/core';\nimport { CSSProperties } from '@material-ui/styles';\nimport {\n CATALOG_FILTER_EXISTS,\n catalogApiRef,\n CatalogApi,\n useEntityOwnership,\n} from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\nimport { DocsTable } from './Tables';\nimport { DocsCardGrid } from './Grids';\nimport { TechDocsPageWrapper } from './TechDocsPageWrapper';\n\nimport {\n CodeSnippet,\n Content,\n HeaderTabs,\n Progress,\n WarningPanel,\n SupportButton,\n ContentHeader,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nconst panels = {\n DocsTable: DocsTable,\n DocsCardGrid: DocsCardGrid,\n};\n\n/**\n * Available panel types\n *\n * @public\n */\nexport type PanelType = 'DocsCardGrid' | 'DocsTable';\n\n/**\n * Type representing a TechDocsCustomHome panel.\n *\n * @public\n */\nexport interface PanelConfig {\n title: string;\n description: string;\n panelType: PanelType;\n panelCSS?: CSSProperties;\n filterPredicate: ((entity: Entity) => boolean) | string;\n}\n\n/**\n * Type representing a TechDocsCustomHome tab.\n *\n * @public\n */\nexport interface TabConfig {\n label: string;\n panels: PanelConfig[];\n}\n\n/**\n * Type representing a list of TechDocsCustomHome tabs.\n *\n * @public\n */\nexport type TabsConfig = TabConfig[];\n\nconst CustomPanel = ({\n config,\n entities,\n index,\n}: {\n config: PanelConfig;\n entities: Entity[];\n index: number;\n}) => {\n const useStyles = makeStyles({\n panelContainer: {\n marginBottom: '2rem',\n ...(config.panelCSS ? config.panelCSS : {}),\n },\n });\n const classes = useStyles();\n const { loading: loadingOwnership, isOwnedEntity } = useEntityOwnership();\n\n const Panel = panels[config.panelType];\n\n const shownEntities = entities.filter(entity => {\n if (config.filterPredicate === 'ownedByUser') {\n if (loadingOwnership) {\n return false;\n }\n return isOwnedEntity(entity);\n }\n\n return (\n typeof config.filterPredicate === 'function' &&\n config.filterPredicate(entity)\n );\n });\n\n return (\n <>\n <ContentHeader title={config.title} description={config.description}>\n {index === 0 ? (\n <SupportButton>\n Discover documentation in your ecosystem.\n </SupportButton>\n ) : null}\n </ContentHeader>\n <div className={classes.panelContainer}>\n <Panel data-testid=\"techdocs-custom-panel\" entities={shownEntities} />\n </div>\n </>\n );\n};\n\n/**\n * Props for {@link TechDocsCustomHome}\n *\n * @public\n */\nexport type TechDocsCustomHomeProps = {\n tabsConfig: TabsConfig;\n};\n\nexport const TechDocsCustomHome = (props: TechDocsCustomHomeProps) => {\n const { tabsConfig } = props;\n const [selectedTab, setSelectedTab] = useState<number>(0);\n const catalogApi: CatalogApi = useApi(catalogApiRef);\n\n const {\n value: entities,\n loading,\n error,\n } = useAsync(async () => {\n const response = await catalogApi.getEntities({\n filter: {\n 'metadata.annotations.backstage.io/techdocs-ref': CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'apiVersion',\n 'kind',\n 'metadata',\n 'relations',\n 'spec.owner',\n 'spec.type',\n ],\n });\n return response.items.filter((entity: Entity) => {\n return !!entity.metadata.annotations?.['backstage.io/techdocs-ref'];\n });\n });\n\n const currentTabConfig = tabsConfig[selectedTab];\n\n if (loading) {\n return (\n <TechDocsPageWrapper>\n <Content>\n <Progress />\n </Content>\n </TechDocsPageWrapper>\n );\n }\n\n if (error) {\n return (\n <TechDocsPageWrapper>\n <Content>\n <WarningPanel\n severity=\"error\"\n title=\"Could not load available documentation.\"\n >\n <CodeSnippet language=\"text\" text={error.toString()} />\n </WarningPanel>\n </Content>\n </TechDocsPageWrapper>\n );\n }\n\n return (\n <TechDocsPageWrapper>\n <HeaderTabs\n selectedIndex={selectedTab}\n onChange={index => setSelectedTab(index)}\n tabs={tabsConfig.map(({ label }, index) => ({\n id: index.toString(),\n label,\n }))}\n />\n <Content data-testid=\"techdocs-content\">\n {currentTabConfig.panels.map((config, index) => (\n <CustomPanel\n key={index}\n config={config}\n entities={!!entities ? entities : []}\n index={index}\n />\n ))}\n </Content>\n </TechDocsPageWrapper>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TechDocsCustomHome-b77adc6d.esm.js","sources":["../../src/home/components/TechDocsCustomHome.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { makeStyles } from '@material-ui/core';\nimport { CSSProperties } from '@material-ui/styles';\nimport {\n CATALOG_FILTER_EXISTS,\n catalogApiRef,\n CatalogApi,\n useEntityOwnership,\n} from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\nimport { DocsTable } from './Tables';\nimport { DocsCardGrid } from './Grids';\nimport { TechDocsPageWrapper } from './TechDocsPageWrapper';\n\nimport {\n CodeSnippet,\n Content,\n HeaderTabs,\n Progress,\n WarningPanel,\n SupportButton,\n ContentHeader,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nconst panels = {\n DocsTable: DocsTable,\n DocsCardGrid: DocsCardGrid,\n};\n\n/**\n * Available panel types\n *\n * @public\n */\nexport type PanelType = 'DocsCardGrid' | 'DocsTable';\n\n/**\n * Type representing a TechDocsCustomHome panel.\n *\n * @public\n */\nexport interface PanelConfig {\n title: string;\n description: string;\n panelType: PanelType;\n panelCSS?: CSSProperties;\n filterPredicate: ((entity: Entity) => boolean) | string;\n}\n\n/**\n * Type representing a TechDocsCustomHome tab.\n *\n * @public\n */\nexport interface TabConfig {\n label: string;\n panels: PanelConfig[];\n}\n\n/**\n * Type representing a list of TechDocsCustomHome tabs.\n *\n * @public\n */\nexport type TabsConfig = TabConfig[];\n\nconst CustomPanel = ({\n config,\n entities,\n index,\n}: {\n config: PanelConfig;\n entities: Entity[];\n index: number;\n}) => {\n const useStyles = makeStyles({\n panelContainer: {\n marginBottom: '2rem',\n ...(config.panelCSS ? config.panelCSS : {}),\n },\n });\n const classes = useStyles();\n const { loading: loadingOwnership, isOwnedEntity } = useEntityOwnership();\n\n const Panel = panels[config.panelType];\n\n const shownEntities = entities.filter(entity => {\n if (config.filterPredicate === 'ownedByUser') {\n if (loadingOwnership) {\n return false;\n }\n return isOwnedEntity(entity);\n }\n\n return (\n typeof config.filterPredicate === 'function' &&\n config.filterPredicate(entity)\n );\n });\n\n return (\n <>\n <ContentHeader title={config.title} description={config.description}>\n {index === 0 ? (\n <SupportButton>\n Discover documentation in your ecosystem.\n </SupportButton>\n ) : null}\n </ContentHeader>\n <div className={classes.panelContainer}>\n <Panel data-testid=\"techdocs-custom-panel\" entities={shownEntities} />\n </div>\n </>\n );\n};\n\n/**\n * Props for {@link TechDocsCustomHome}\n *\n * @public\n */\nexport type TechDocsCustomHomeProps = {\n tabsConfig: TabsConfig;\n};\n\nexport const TechDocsCustomHome = (props: TechDocsCustomHomeProps) => {\n const { tabsConfig } = props;\n const [selectedTab, setSelectedTab] = useState<number>(0);\n const catalogApi: CatalogApi = useApi(catalogApiRef);\n\n const {\n value: entities,\n loading,\n error,\n } = useAsync(async () => {\n const response = await catalogApi.getEntities({\n filter: {\n 'metadata.annotations.backstage.io/techdocs-ref': CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'apiVersion',\n 'kind',\n 'metadata',\n 'relations',\n 'spec.owner',\n 'spec.type',\n ],\n });\n return response.items.filter((entity: Entity) => {\n return !!entity.metadata.annotations?.['backstage.io/techdocs-ref'];\n });\n });\n\n const currentTabConfig = tabsConfig[selectedTab];\n\n if (loading) {\n return (\n <TechDocsPageWrapper>\n <Content>\n <Progress />\n </Content>\n </TechDocsPageWrapper>\n );\n }\n\n if (error) {\n return (\n <TechDocsPageWrapper>\n <Content>\n <WarningPanel\n severity=\"error\"\n title=\"Could not load available documentation.\"\n >\n <CodeSnippet language=\"text\" text={error.toString()} />\n </WarningPanel>\n </Content>\n </TechDocsPageWrapper>\n );\n }\n\n return (\n <TechDocsPageWrapper>\n <HeaderTabs\n selectedIndex={selectedTab}\n onChange={index => setSelectedTab(index)}\n tabs={tabsConfig.map(({ label }, index) => ({\n id: index.toString(),\n label,\n }))}\n />\n <Content data-testid=\"techdocs-content\">\n {currentTabConfig.panels.map((config, index) => (\n <CustomPanel\n key={index}\n config={config}\n entities={!!entities ? entities : []}\n index={index}\n />\n ))}\n </Content>\n </TechDocsPageWrapper>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { c as TechDocsReaderLayout, b as TechDocsReaderPage } from './index-913b47d9.esm.js';
1
+ export { c as TechDocsReaderLayout, b as TechDocsReaderPage } from './index-c537b1f3.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'event-source-polyfill';
@@ -30,9 +30,10 @@ import 'react-helmet';
30
30
  import '@material-ui/icons/Code';
31
31
  import '@backstage/plugin-catalog-react';
32
32
  import '@backstage/catalog-model';
33
+ import '@material-ui/icons/Settings';
33
34
  import 'react-use/lib/useCopyToClipboard';
34
35
  import 'lodash';
35
36
  import '@material-ui/icons/Share';
36
37
  import '@material-ui/icons/Star';
37
38
  import '@material-ui/icons/StarBorder';
38
- //# sourceMappingURL=index-9f90aba8.esm.js.map
39
+ //# sourceMappingURL=index-52f21300.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-52f21300.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,7 +6,7 @@ import { useParams, useNavigate as useNavigate$1, useOutlet, Routes, Route } fro
6
6
  import { Link, LogViewer, ErrorPage, Progress, SidebarPinStateContext, Content, HeaderLabel, Header, Page, ItemCardGrid, ItemCardHeader, Button as Button$1, WarningPanel, CodeSnippet, SubvalueCell, Table, EmptyState, PageWithHeader, ContentHeader, SupportButton, MissingAnnotationEmptyState } from '@backstage/core-components';
7
7
  import { techdocsStorageApiRef as techdocsStorageApiRef$1, useTechDocsReaderPage, useTechDocsAddons, TechDocsAddonLocations, TECHDOCS_ADDONS_WRAPPER_KEY, TechDocsReaderPageProvider, techdocsApiRef as techdocsApiRef$1 } from '@backstage/plugin-techdocs-react';
8
8
  import { create } from 'jss';
9
- import { makeStyles, ListItemText, ListItem, Divider, TextField, InputAdornment, IconButton, CircularProgress, createStyles, Button, Drawer, Grid, Typography, withStyles, Tooltip, ThemeProvider, SvgIcon, useTheme, Portal, Toolbar, Box, Card, CardMedia, CardContent, CardActions } from '@material-ui/core';
9
+ import { makeStyles, ListItemText, ListItem, Divider, TextField, InputAdornment, IconButton, CircularProgress, createStyles, Button, Drawer, Grid, Typography, withStyles, Tooltip, ThemeProvider, SvgIcon, useTheme, Portal, Toolbar, Box, Menu, Card, CardMedia, CardContent, CardActions } from '@material-ui/core';
10
10
  import { jssPreset, StylesProvider, withStyles as withStyles$1 } from '@material-ui/styles';
11
11
  import { HighlightedSearchResultText, SearchContextProvider, useSearch } from '@backstage/plugin-search-react';
12
12
  import SearchIcon from '@material-ui/icons/Search';
@@ -29,6 +29,7 @@ import Helmet from 'react-helmet';
29
29
  import CodeIcon from '@material-ui/icons/Code';
30
30
  import { getEntityRelations, EntityRefLink, EntityRefLinks, useEntityList, humanizeEntityRef, useStarredEntities, CATALOG_FILTER_EXISTS, EntityListProvider, CatalogFilterLayout, UserListPicker, EntityOwnerPicker, EntityTagPicker, useEntity } from '@backstage/plugin-catalog-react';
31
31
  import { RELATION_OWNED_BY, getCompoundEntityRef } from '@backstage/catalog-model';
32
+ import SettingsIcon from '@material-ui/icons/Settings';
32
33
  import useCopyToClipboard from 'react-use/lib/useCopyToClipboard';
33
34
  import { capitalize } from 'lodash';
34
35
  import ShareIcon from '@material-ui/icons/Share';
@@ -1805,24 +1806,46 @@ const TechDocsReaderPageSubheader = ({
1805
1806
  toolbarProps
1806
1807
  }) => {
1807
1808
  const classes = useStyles();
1809
+ const [anchorEl, setAnchorEl] = useState(null);
1810
+ const handleClick = useCallback((event) => {
1811
+ setAnchorEl(event.currentTarget);
1812
+ }, []);
1813
+ const handleClose = useCallback(() => {
1814
+ setAnchorEl(null);
1815
+ }, []);
1808
1816
  const {
1809
1817
  entityMetadata: { value: entityMetadata, loading: entityMetadataLoading }
1810
1818
  } = useTechDocsReaderPage();
1811
1819
  const addons = useTechDocsAddons();
1812
1820
  const subheaderAddons = addons.renderComponentsByLocation(TechDocsAddonLocations.Subheader);
1813
- if (!subheaderAddons)
1821
+ const settingsAddons = addons.renderComponentsByLocation(TechDocsAddonLocations.Settings);
1822
+ if (!subheaderAddons && !settingsAddons)
1814
1823
  return null;
1815
1824
  if (entityMetadataLoading === false && !entityMetadata)
1816
1825
  return null;
1817
1826
  return /* @__PURE__ */ React.createElement(Toolbar, {
1818
1827
  classes,
1819
1828
  ...toolbarProps
1820
- }, subheaderAddons && /* @__PURE__ */ React.createElement(Box, {
1829
+ }, /* @__PURE__ */ React.createElement(Box, {
1821
1830
  display: "flex",
1822
1831
  justifyContent: "flex-end",
1823
1832
  width: "100%",
1824
1833
  flexWrap: "wrap"
1825
- }, subheaderAddons));
1834
+ }, subheaderAddons, settingsAddons ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, {
1835
+ title: "Settings"
1836
+ }, /* @__PURE__ */ React.createElement(IconButton, {
1837
+ "aria-controls": "tech-docs-reader-page-settings",
1838
+ "aria-haspopup": "true",
1839
+ onClick: handleClick
1840
+ }, /* @__PURE__ */ React.createElement(SettingsIcon, null))), /* @__PURE__ */ React.createElement(Menu, {
1841
+ id: "tech-docs-reader-page-settings",
1842
+ getContentAnchorEl: null,
1843
+ anchorEl,
1844
+ anchorOrigin: { vertical: "bottom", horizontal: "right" },
1845
+ open: Boolean(anchorEl),
1846
+ onClose: handleClose,
1847
+ keepMounted: true
1848
+ }, settingsAddons)) : null));
1826
1849
  };
1827
1850
 
1828
1851
  const TechDocsReaderLayout = ({
@@ -2159,7 +2182,7 @@ const EntityTechdocsContent = techdocsPlugin.provide(createRoutableExtension({
2159
2182
  }));
2160
2183
  const TechDocsCustomHome = techdocsPlugin.provide(createRoutableExtension({
2161
2184
  name: "TechDocsCustomHome",
2162
- component: () => import('./TechDocsCustomHome-968d179e.esm.js').then((m) => m.TechDocsCustomHome),
2185
+ component: () => import('./TechDocsCustomHome-b77adc6d.esm.js').then((m) => m.TechDocsCustomHome),
2163
2186
  mountPoint: rootRouteRef
2164
2187
  }));
2165
2188
  const TechDocsIndexPage$2 = techdocsPlugin.provide(createRoutableExtension({
@@ -2169,7 +2192,7 @@ const TechDocsIndexPage$2 = techdocsPlugin.provide(createRoutableExtension({
2169
2192
  }));
2170
2193
  const TechDocsReaderPage = techdocsPlugin.provide(createRoutableExtension({
2171
2194
  name: "TechDocsReaderPage",
2172
- component: () => import('./index-9f90aba8.esm.js').then((m) => m.TechDocsReaderPage),
2195
+ component: () => import('./index-52f21300.esm.js').then((m) => m.TechDocsReaderPage),
2173
2196
  mountPoint: rootDocsRouteRef
2174
2197
  }));
2175
2198
 
@@ -2231,4 +2254,4 @@ var Router$1 = /*#__PURE__*/Object.freeze({
2231
2254
  });
2232
2255
 
2233
2256
  export { isTechDocsAvailable as A, Router as B, EmbeddedDocsRouter as C, DocsTable as D, EntityTechdocsContent as E, Reader as R, TechDocsPageWrapper as T, DocsCardGrid as a, TechDocsReaderPage$1 as b, TechDocsReaderLayout as c, TechDocsCustomHome as d, TechDocsIndexPage$2 as e, TechdocsPage as f, TechDocsReaderPage as g, techdocsStorageApiRef as h, techdocsApiRef as i, TechDocsClient as j, TechDocsStorageClient as k, TechDocsReaderPageHeader as l, TechDocsReaderPageContent as m, TechDocsReaderProvider as n, useTechDocsReaderDom as o, TechDocsReaderPageSubheader as p, TechDocsStateIndicator as q, TechDocsSearchResultListItem as r, TechDocsSearch as s, techdocsPlugin as t, useTechDocsReader as u, EntityListDocsGrid as v, withTechDocsReaderProvider as w, EntityListDocsTable as x, DefaultTechDocsHome as y, TechDocsPicker as z };
2234
- //# sourceMappingURL=index-913b47d9.esm.js.map
2257
+ //# sourceMappingURL=index-c537b1f3.esm.js.map