@backstage/plugin-techdocs 1.17.1 → 1.17.2

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 (35) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/alpha/components/TechDocsIndexPageContent.esm.js +36 -0
  3. package/dist/alpha/components/TechDocsIndexPageContent.esm.js.map +1 -0
  4. package/dist/alpha/components/TechDocsReaderContent.esm.js +35 -0
  5. package/dist/alpha/components/TechDocsReaderContent.esm.js.map +1 -0
  6. package/dist/alpha/components/TechDocsReaderEntityCard.esm.js +59 -0
  7. package/dist/alpha/components/TechDocsReaderEntityCard.esm.js.map +1 -0
  8. package/dist/alpha/components/TechDocsReaderEntityCard.module.css.esm.js +8 -0
  9. package/dist/alpha/components/TechDocsReaderEntityCard.module.css.esm.js.map +1 -0
  10. package/dist/alpha/components/TechDocsReaderHeader.esm.js +49 -0
  11. package/dist/alpha/components/TechDocsReaderHeader.esm.js.map +1 -0
  12. package/dist/alpha/components/TechDocsReaderLayout.esm.js +21 -0
  13. package/dist/alpha/components/TechDocsReaderLayout.esm.js.map +1 -0
  14. package/dist/alpha/components/TechDocsReaderSearch.esm.js +82 -0
  15. package/dist/alpha/components/TechDocsReaderSearch.esm.js.map +1 -0
  16. package/dist/alpha.d.ts +13 -0
  17. package/dist/alpha.esm.js +15 -20
  18. package/dist/alpha.esm.js.map +1 -1
  19. package/dist/hooks/useTechDocsReaderContentData.esm.js +63 -0
  20. package/dist/hooks/useTechDocsReaderContentData.esm.js.map +1 -0
  21. package/dist/hooks/useTechDocsReaderHeaderData.esm.js +70 -0
  22. package/dist/hooks/useTechDocsReaderHeaderData.esm.js.map +1 -0
  23. package/dist/hooks/useTechDocsSearch.esm.js +46 -0
  24. package/dist/hooks/useTechDocsSearch.esm.js.map +1 -0
  25. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
  26. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
  27. package/dist/{package.json.esm.js → plugins/techdocs/package.json.esm.js} +3 -1
  28. package/dist/{package.json.esm.js.map → plugins/techdocs/package.json.esm.js.map} +1 -1
  29. package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js +18 -40
  30. package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js.map +1 -1
  31. package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js +17 -43
  32. package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js.map +1 -1
  33. package/dist/search/components/TechDocsSearch.esm.js +5 -30
  34. package/dist/search/components/TechDocsSearch.esm.js.map +1 -1
  35. package/package.json +5 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @backstage/plugin-techdocs
2
2
 
3
+ ## 1.17.2
4
+
5
+ ### Patch Changes
6
+
7
+ - f46c17d: Migrated the TechDocs alpha plugin pages to use BUI components. The index page and reader page now use BUI `Header` and `Container` instead of legacy `Page`/`Content`/`ContentHeader` wrappers. Added a `SupportButton` as a plugin header action. Changed plugin title to "Documentation" and icon to `RiArticleLine`.
8
+ - Updated dependencies
9
+ - @backstage/ui@0.13.1
10
+ - @backstage/frontend-plugin-api@0.15.1
11
+
3
12
  ## 1.17.1
4
13
 
5
14
  ### Patch Changes
@@ -0,0 +1,36 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Container } from '@backstage/ui';
3
+ import { EntityListProvider, CatalogFilterLayout, UserListPicker, EntityOwnerPicker, EntityTagPicker } from '@backstage/plugin-catalog-react';
4
+ import { TechDocsPicker } from '../../home/components/TechDocsPicker.esm.js';
5
+ import { EntityListDocsTable } from '../../home/components/Tables/EntityListDocsTable.esm.js';
6
+ import '../../home/components/Tables/DocsTable.esm.js';
7
+
8
+ const TechDocsIndexPageContent = (props) => {
9
+ const {
10
+ initialFilter = "owned",
11
+ columns,
12
+ actions,
13
+ ownerPickerMode,
14
+ pagination,
15
+ options
16
+ } = props;
17
+ return /* @__PURE__ */ jsx(Container, { mt: "6", children: /* @__PURE__ */ jsx(EntityListProvider, { pagination, children: /* @__PURE__ */ jsxs(CatalogFilterLayout, { children: [
18
+ /* @__PURE__ */ jsxs(CatalogFilterLayout.Filters, { children: [
19
+ /* @__PURE__ */ jsx(TechDocsPicker, {}),
20
+ /* @__PURE__ */ jsx(UserListPicker, { initialFilter }),
21
+ /* @__PURE__ */ jsx(EntityOwnerPicker, { mode: ownerPickerMode }),
22
+ /* @__PURE__ */ jsx(EntityTagPicker, {})
23
+ ] }),
24
+ /* @__PURE__ */ jsx(CatalogFilterLayout.Content, { children: /* @__PURE__ */ jsx(
25
+ EntityListDocsTable,
26
+ {
27
+ actions,
28
+ columns,
29
+ options
30
+ }
31
+ ) })
32
+ ] }) }) });
33
+ };
34
+
35
+ export { TechDocsIndexPageContent };
36
+ //# sourceMappingURL=TechDocsIndexPageContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsIndexPageContent.esm.js","sources":["../../../src/alpha/components/TechDocsIndexPageContent.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Container } from '@backstage/ui';\nimport {\n CatalogFilterLayout,\n EntityListProvider,\n EntityOwnerPicker,\n EntityTagPicker,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { TechDocsPicker } from '../../home/components/TechDocsPicker';\nimport { EntityListDocsTable } from '../../home/components/Tables';\nimport type { TechDocsIndexPageProps } from '../../home/components/TechDocsIndexPage';\n\nexport const TechDocsIndexPageContent = (props: TechDocsIndexPageProps) => {\n const {\n initialFilter = 'owned',\n columns,\n actions,\n ownerPickerMode,\n pagination,\n options,\n } = props;\n\n return (\n <Container mt=\"6\">\n <EntityListProvider pagination={pagination}>\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <TechDocsPicker />\n <UserListPicker initialFilter={initialFilter} />\n <EntityOwnerPicker mode={ownerPickerMode} />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <EntityListDocsTable\n actions={actions}\n columns={columns}\n options={options}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </EntityListProvider>\n </Container>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA4BO,MAAM,wBAAA,GAA2B,CAAC,KAAA,KAAkC;AACzE,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,OAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA,CAAC,aAAU,EAAA,EAAG,GAAA,EACZ,8BAAC,kBAAA,EAAA,EAAmB,UAAA,EAClB,+BAAC,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,mBAAA,CAAoB,SAApB,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,sBAChB,GAAA,CAAC,kBAAe,aAAA,EAA8B,CAAA;AAAA,sBAC9C,GAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,0BACzC,eAAA,EAAA,EAAgB;AAAA,KAAA,EACnB,CAAA;AAAA,oBACA,GAAA,CAAC,mBAAA,CAAoB,OAAA,EAApB,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,35 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { TechDocsShadowDom } from '@backstage/plugin-techdocs-react';
3
+ import { Progress } from '@backstage/core-components';
4
+ import { TechDocsStateIndicator } from '../../reader/components/TechDocsStateIndicator.esm.js';
5
+ import { withTechDocsReaderProvider } from '../../reader/components/TechDocsReaderProvider.esm.js';
6
+ import { TechDocsReaderPageContentAddons } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.esm.js';
7
+ import { useTechDocsReaderContentData } from '../../hooks/useTechDocsReaderContentData.esm.js';
8
+
9
+ const TechDocsReaderContent = withTechDocsReaderProvider(
10
+ (props) => {
11
+ const {
12
+ dom,
13
+ handleAppend,
14
+ isNotFound,
15
+ isDomReady,
16
+ showProgress,
17
+ NotFoundErrorPage
18
+ } = useTechDocsReaderContentData({
19
+ defaultPath: props.defaultPath,
20
+ onReady: props.onReady
21
+ });
22
+ if (isNotFound) return /* @__PURE__ */ jsx(NotFoundErrorPage, {});
23
+ if (!isDomReady) {
24
+ return /* @__PURE__ */ jsx(TechDocsStateIndicator, {});
25
+ }
26
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx(TechDocsStateIndicator, {}),
28
+ showProgress && /* @__PURE__ */ jsx(Progress, {}),
29
+ /* @__PURE__ */ jsx(TechDocsShadowDom, { element: dom, onAppend: handleAppend, children: /* @__PURE__ */ jsx(TechDocsReaderPageContentAddons, {}) })
30
+ ] });
31
+ }
32
+ );
33
+
34
+ export { TechDocsReaderContent };
35
+ //# sourceMappingURL=TechDocsReaderContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderContent.esm.js","sources":["../../../src/alpha/components/TechDocsReaderContent.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { TechDocsShadowDom } from '@backstage/plugin-techdocs-react';\nimport { Progress } from '@backstage/core-components';\n\nimport { TechDocsStateIndicator } from '../../reader/components/TechDocsStateIndicator';\nimport { withTechDocsReaderProvider } from '../../reader/components/TechDocsReaderProvider';\nimport { TechDocsReaderPageContentAddons } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons';\nimport type { TechDocsReaderPageContentProps } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent';\nimport { useTechDocsReaderContentData } from '../../hooks/useTechDocsReaderContentData';\n\nexport const TechDocsReaderContent = withTechDocsReaderProvider(\n (props: TechDocsReaderPageContentProps) => {\n const {\n dom,\n handleAppend,\n isNotFound,\n isDomReady,\n showProgress,\n NotFoundErrorPage,\n } = useTechDocsReaderContentData({\n defaultPath: props.defaultPath,\n onReady: props.onReady,\n });\n\n if (isNotFound) return <NotFoundErrorPage />;\n\n if (!isDomReady) {\n return <TechDocsStateIndicator />;\n }\n\n return (\n <>\n <TechDocsStateIndicator />\n {showProgress && <Progress />}\n <TechDocsShadowDom element={dom!} onAppend={handleAppend}>\n <TechDocsReaderPageContentAddons />\n </TechDocsShadowDom>\n </>\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;AAyBO,MAAM,qBAAA,GAAwB,0BAAA;AAAA,EACnC,CAAC,KAAA,KAA0C;AACzC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,QACE,4BAAA,CAA6B;AAAA,MAC/B,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,UAAA,EAAY,uBAAO,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAE1C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,2BAAQ,sBAAA,EAAA,EAAuB,CAAA;AAAA,IACjC;AAEA,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,MACvB,YAAA,wBAAiB,QAAA,EAAA,EAAS,CAAA;AAAA,sBAC3B,GAAA,CAAC,qBAAkB,OAAA,EAAS,GAAA,EAAM,UAAU,YAAA,EAC1C,QAAA,kBAAA,GAAA,CAAC,mCAAgC,CAAA,EACnC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,59 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useTechDocsReaderPage } from '@backstage/plugin-techdocs-react';
3
+ import { getEntityRelations, EntityRefLink, EntityRefLinks } from '@backstage/plugin-catalog-react';
4
+ import { RELATION_OWNED_BY } from '@backstage/catalog-model';
5
+ import { Card, CardBody, Text } from '@backstage/ui';
6
+ import capitalize from 'lodash/capitalize';
7
+ import styles from './TechDocsReaderEntityCard.module.css.esm.js';
8
+ import { TechDocsReaderSearch } from './TechDocsReaderSearch.esm.js';
9
+
10
+ const TechDocsReaderEntityCard = (props) => {
11
+ const { withSearch } = props;
12
+ const {
13
+ entityRef,
14
+ entityMetadata: { value: entityMetadata, loading: entityMetadataLoading }
15
+ } = useTechDocsReaderPage();
16
+ if (entityMetadataLoading || !entityMetadata) return null;
17
+ const { spec } = entityMetadata;
18
+ const lifecycle = spec?.lifecycle;
19
+ const ownedByRelations = getEntityRelations(
20
+ entityMetadata,
21
+ RELATION_OWNED_BY
22
+ );
23
+ return /* @__PURE__ */ jsx(Card, { className: styles.entityCard, children: /* @__PURE__ */ jsxs(CardBody, { className: styles.cardBody, children: [
24
+ /* @__PURE__ */ jsxs("dl", { className: styles.definitionList, children: [
25
+ /* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
26
+ /* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsxs(Text, { variant: "body-small", weight: "bold", children: [
27
+ capitalize(entityMetadata.kind),
28
+ ":"
29
+ ] }) }),
30
+ /* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(
31
+ EntityRefLink,
32
+ {
33
+ entityRef,
34
+ title: entityMetadata.metadata.title,
35
+ defaultKind: "Component"
36
+ }
37
+ ) })
38
+ ] }),
39
+ ownedByRelations.length > 0 && /* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
40
+ /* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: "Owner:" }) }),
41
+ /* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(
42
+ EntityRefLinks,
43
+ {
44
+ entityRefs: ownedByRelations,
45
+ defaultKind: "group"
46
+ }
47
+ ) })
48
+ ] }),
49
+ lifecycle && /* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
50
+ /* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: "Lifecycle:" }) }),
51
+ /* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(Text, { variant: "body-small", children: String(lifecycle) }) })
52
+ ] })
53
+ ] }),
54
+ withSearch && /* @__PURE__ */ jsx("div", { className: styles.searchWrapper, children: /* @__PURE__ */ jsx(TechDocsReaderSearch, { entityId: entityRef }) })
55
+ ] }) });
56
+ };
57
+
58
+ export { TechDocsReaderEntityCard };
59
+ //# sourceMappingURL=TechDocsReaderEntityCard.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderEntityCard.esm.js","sources":["../../../src/alpha/components/TechDocsReaderEntityCard.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useTechDocsReaderPage } from '@backstage/plugin-techdocs-react';\nimport {\n EntityRefLink,\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { Card, CardBody, Text } from '@backstage/ui';\nimport capitalize from 'lodash/capitalize';\nimport styles from './TechDocsReaderEntityCard.module.css';\nimport { TechDocsReaderSearch } from './TechDocsReaderSearch';\n\nexport type TechDocsReaderEntityCardProps = {\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderEntityCard = (\n props: TechDocsReaderEntityCardProps,\n) => {\n const { withSearch } = props;\n const {\n entityRef,\n entityMetadata: { value: entityMetadata, loading: entityMetadataLoading },\n } = useTechDocsReaderPage();\n\n if (entityMetadataLoading || !entityMetadata) return null;\n\n const { spec } = entityMetadata;\n const lifecycle = spec?.lifecycle;\n const ownedByRelations = getEntityRelations(\n entityMetadata,\n RELATION_OWNED_BY,\n );\n\n return (\n <Card className={styles.entityCard}>\n <CardBody className={styles.cardBody}>\n <dl className={styles.definitionList}>\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n {capitalize(entityMetadata.kind)}:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <EntityRefLink\n entityRef={entityRef}\n title={entityMetadata.metadata.title}\n defaultKind=\"Component\"\n />\n </dd>\n </div>\n {ownedByRelations.length > 0 && (\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n Owner:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <EntityRefLinks\n entityRefs={ownedByRelations}\n defaultKind=\"group\"\n />\n </dd>\n </div>\n )}\n {lifecycle && (\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n Lifecycle:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <Text variant=\"body-small\">{String(lifecycle)}</Text>\n </dd>\n </div>\n )}\n </dl>\n {withSearch && (\n <div className={styles.searchWrapper}>\n <TechDocsReaderSearch entityId={entityRef} />\n </div>\n )}\n </CardBody>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = ".TechDocsReaderEntityCard_entityCard__d9e940aed2 {\n margin-bottom: var(--bui-space-6);\n}\n\n.TechDocsReaderEntityCard_cardBody__d9e940aed2 {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: var(--bui-space-4);\n}\n\n.TechDocsReaderEntityCard_definitionList__d9e940aed2 {\n display: flex;\n flex-wrap: wrap;\n gap: var(--bui-space-6);\n margin: 0;\n padding: 0;\n flex: 1 1 0;\n align-self: center;\n}\n\n.TechDocsReaderEntityCard_definitionGroup__d9e940aed2 {\n display: flex;\n align-items: baseline;\n gap: var(--bui-space-2);\n}\n\n.TechDocsReaderEntityCard_definitionValue__d9e940aed2 {\n margin: 0;\n}\n\n.TechDocsReaderEntityCard_searchWrapper__d9e940aed2 {\n flex: 1 1 200px;\n max-width: 240px;\n}\n";
4
+ var styles = {"entityCard":"TechDocsReaderEntityCard_entityCard__d9e940aed2","cardBody":"TechDocsReaderEntityCard_cardBody__d9e940aed2","definitionList":"TechDocsReaderEntityCard_definitionList__d9e940aed2","definitionGroup":"TechDocsReaderEntityCard_definitionGroup__d9e940aed2","definitionValue":"TechDocsReaderEntityCard_definitionValue__d9e940aed2","searchWrapper":"TechDocsReaderEntityCard_searchWrapper__d9e940aed2"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=TechDocsReaderEntityCard.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderEntityCard.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,49 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import Helmet from 'react-helmet';
3
+ import { Header, ButtonLink } from '@backstage/ui';
4
+ import { RiCodeLine } from '@remixicon/react';
5
+ import { TechDocsAddonLocations } from '@backstage/plugin-techdocs-react';
6
+ import { TechDocsReaderSearch } from './TechDocsReaderSearch.esm.js';
7
+ import { useTechDocsReaderHeaderData } from '../../hooks/useTechDocsReaderHeaderData.esm.js';
8
+
9
+ const TechDocsReaderHeader = (props) => {
10
+ const { withSearch = true } = props;
11
+ const {
12
+ title,
13
+ entityRef,
14
+ tabTitle,
15
+ hidden,
16
+ showSourceLink,
17
+ sourceLink,
18
+ addons
19
+ } = useTechDocsReaderHeaderData();
20
+ if (hidden) return null;
21
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
22
+ /* @__PURE__ */ jsx(Helmet, { titleTemplate: "%s", children: /* @__PURE__ */ jsx("title", { children: tabTitle }) }),
23
+ /* @__PURE__ */ jsx(
24
+ Header,
25
+ {
26
+ title: title || "",
27
+ customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
28
+ withSearch && /* @__PURE__ */ jsx(TechDocsReaderSearch, { entityId: entityRef }),
29
+ showSourceLink && /* @__PURE__ */ jsx(
30
+ ButtonLink,
31
+ {
32
+ href: sourceLink,
33
+ target: "_blank",
34
+ rel: "noopener noreferrer",
35
+ variant: "secondary",
36
+ size: "small",
37
+ iconStart: /* @__PURE__ */ jsx(RiCodeLine, {}),
38
+ "aria-label": "View source"
39
+ }
40
+ ),
41
+ addons.renderComponentsByLocation(TechDocsAddonLocations.Header)
42
+ ] })
43
+ }
44
+ )
45
+ ] });
46
+ };
47
+
48
+ export { TechDocsReaderHeader };
49
+ //# sourceMappingURL=TechDocsReaderHeader.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderHeader.esm.js","sources":["../../../src/alpha/components/TechDocsReaderHeader.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 Helmet from 'react-helmet';\nimport { Header, ButtonLink } from '@backstage/ui';\nimport { RiCodeLine } from '@remixicon/react';\nimport { TechDocsAddonLocations as locations } from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderSearch } from './TechDocsReaderSearch';\nimport { useTechDocsReaderHeaderData } from '../../hooks/useTechDocsReaderHeaderData';\n\nexport type TechDocsReaderHeaderProps = {\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderHeader = (props: TechDocsReaderHeaderProps) => {\n const { withSearch = true } = props;\n const {\n title,\n entityRef,\n tabTitle,\n hidden,\n showSourceLink,\n sourceLink,\n addons,\n } = useTechDocsReaderHeaderData();\n\n if (hidden) return null;\n\n return (\n <>\n <Helmet titleTemplate=\"%s\">\n <title>{tabTitle}</title>\n </Helmet>\n <Header\n title={title || ''}\n customActions={\n <>\n {withSearch && <TechDocsReaderSearch entityId={entityRef} />}\n {showSourceLink && (\n <ButtonLink\n href={sourceLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiCodeLine />}\n aria-label=\"View source\"\n />\n )}\n {addons.renderComponentsByLocation(locations.Header)}\n </>\n }\n />\n </>\n );\n};\n"],"names":["locations"],"mappings":";;;;;;;;AA2BO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAK,GAAI,KAAA;AAC9B,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,2BAAA,EAA4B;AAEhC,EAAA,IAAI,QAAQ,OAAO,IAAA;AAEnB,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAO,aAAA,EAAc,IAAA,EACpB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAO,oBAAS,CAAA,EACnB,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,+BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,UAAA,oBAAc,GAAA,CAAC,oBAAA,EAAA,EAAqB,QAAA,EAAU,SAAA,EAAW,CAAA;AAAA,UACzD,cAAA,oBACC,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,qBAAA;AAAA,cACJ,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,sBAAY,UAAA,EAAA,EAAW,CAAA;AAAA,cACvB,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,UAED,MAAA,CAAO,0BAAA,CAA2BA,sBAAA,CAAU,MAAM;AAAA,SAAA,EACrD;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,21 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { Container } from '@backstage/ui';
3
+ import { TechDocsReaderHeader } from './TechDocsReaderHeader.esm.js';
4
+ import { TechDocsReaderEntityCard } from './TechDocsReaderEntityCard.esm.js';
5
+ import { TechDocsReaderPageSubheader } from '../../reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js';
6
+ import { TechDocsReaderContent } from './TechDocsReaderContent.esm.js';
7
+
8
+ const TechDocsReaderLayout = (props) => {
9
+ const { withSearch, withHeader = true } = props;
10
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
11
+ withHeader && /* @__PURE__ */ jsx(TechDocsReaderHeader, { withSearch }),
12
+ /* @__PURE__ */ jsxs(Container, { mt: "6", children: [
13
+ /* @__PURE__ */ jsx(TechDocsReaderEntityCard, { withSearch: !withHeader && withSearch }),
14
+ /* @__PURE__ */ jsx(TechDocsReaderPageSubheader, {}),
15
+ /* @__PURE__ */ jsx(TechDocsReaderContent, {})
16
+ ] })
17
+ ] });
18
+ };
19
+
20
+ export { TechDocsReaderLayout };
21
+ //# sourceMappingURL=TechDocsReaderLayout.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderLayout.esm.js","sources":["../../../src/alpha/components/TechDocsReaderLayout.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Container } from '@backstage/ui';\nimport { TechDocsReaderHeader } from './TechDocsReaderHeader';\nimport { TechDocsReaderEntityCard } from './TechDocsReaderEntityCard';\nimport { TechDocsReaderPageSubheader } from '../../reader/components/TechDocsReaderPageSubheader';\nimport { TechDocsReaderContent } from './TechDocsReaderContent';\n\nexport type TechDocsReaderLayoutProps = {\n withHeader?: boolean;\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderLayout = (props: TechDocsReaderLayoutProps) => {\n const { withSearch, withHeader = true } = props;\n return (\n <>\n {withHeader && <TechDocsReaderHeader withSearch={withSearch} />}\n <Container mt=\"6\">\n <TechDocsReaderEntityCard withSearch={!withHeader && withSearch} />\n <TechDocsReaderPageSubheader />\n <TechDocsReaderContent />\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,GAAa,IAAA,EAAK,GAAI,KAAA;AAC1C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,UAAA,oBAAc,GAAA,CAAC,wBAAqB,UAAA,EAAwB,CAAA;AAAA,oBAC7D,IAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAG,GAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,wBAAA,EAAA,EAAyB,UAAA,EAAY,CAAC,UAAA,IAAc,UAAA,EAAY,CAAA;AAAA,0BAChE,2BAAA,EAAA,EAA4B,CAAA;AAAA,0BAC5B,qBAAA,EAAA,EAAsB;AAAA,KAAA,EACzB;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,82 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useNavigate } from 'react-router-dom';
3
+ import { SearchAutocomplete, SearchAutocompleteItem, Flex, Text } from '@backstage/ui';
4
+ import { SearchContextProvider, HighlightedSearchResultText } from '@backstage/plugin-search-react';
5
+ import { useTechDocsSearch } from '../../hooks/useTechDocsSearch.esm.js';
6
+
7
+ const TechDocsReaderSearchBar = (props) => {
8
+ const { entityId } = props;
9
+ const navigate = useNavigate();
10
+ const { results, term, setTerm, deferredLoading } = useTechDocsSearch(entityId);
11
+ return /* @__PURE__ */ jsx(
12
+ SearchAutocomplete,
13
+ {
14
+ "aria-label": "Search docs",
15
+ placeholder: "Search docs",
16
+ size: "small",
17
+ inputValue: term,
18
+ onInputChange: setTerm,
19
+ isLoading: deferredLoading,
20
+ popoverWidth: "min(720px, calc(100vw - 32px))",
21
+ popoverPlacement: "bottom end",
22
+ children: results.map((result, index) => /* @__PURE__ */ jsx(
23
+ SearchAutocompleteItem,
24
+ {
25
+ id: String(index),
26
+ textValue: result.document.title,
27
+ onAction: () => {
28
+ setTerm("");
29
+ navigate(result.document.location);
30
+ requestAnimationFrame(() => {
31
+ document.activeElement?.blur();
32
+ });
33
+ },
34
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "1", children: [
35
+ /* @__PURE__ */ jsx(Text, { weight: "bold", children: result.highlight?.fields.title ? /* @__PURE__ */ jsx(
36
+ HighlightedSearchResultText,
37
+ {
38
+ text: result.highlight.fields.title,
39
+ preTag: result.highlight.preTag,
40
+ postTag: result.highlight.postTag
41
+ }
42
+ ) : result.document.title }),
43
+ (result.highlight?.fields.text || result.document.text) && /* @__PURE__ */ jsx(
44
+ Text,
45
+ {
46
+ variant: "body-small",
47
+ color: "secondary",
48
+ style: {
49
+ display: "-webkit-box",
50
+ WebkitLineClamp: 3,
51
+ WebkitBoxOrient: "vertical",
52
+ overflow: "hidden"
53
+ },
54
+ children: result.highlight?.fields.text ? /* @__PURE__ */ jsx(
55
+ HighlightedSearchResultText,
56
+ {
57
+ text: result.highlight.fields.text,
58
+ preTag: result.highlight.preTag,
59
+ postTag: result.highlight.postTag
60
+ }
61
+ ) : result.document.text
62
+ }
63
+ )
64
+ ] })
65
+ },
66
+ index
67
+ ))
68
+ }
69
+ );
70
+ };
71
+ const TechDocsReaderSearch = (props) => {
72
+ const initialState = {
73
+ term: "",
74
+ types: ["techdocs"],
75
+ pageCursor: "",
76
+ filters: props.entityId
77
+ };
78
+ return /* @__PURE__ */ jsx(SearchContextProvider, { initialState, children: /* @__PURE__ */ jsx(TechDocsReaderSearchBar, { ...props }) });
79
+ };
80
+
81
+ export { TechDocsReaderSearch };
82
+ //# sourceMappingURL=TechDocsReaderSearch.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechDocsReaderSearch.esm.js","sources":["../../../src/alpha/components/TechDocsReaderSearch.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useNavigate } from 'react-router-dom';\nimport {\n Text,\n Flex,\n SearchAutocomplete,\n SearchAutocompleteItem,\n} from '@backstage/ui';\nimport { SearchContextProvider } from '@backstage/plugin-search-react';\nimport { CompoundEntityRef } from '@backstage/catalog-model';\nimport { HighlightedSearchResultText } from '@backstage/plugin-search-react';\nimport { useTechDocsSearch } from '../../hooks/useTechDocsSearch';\n\ntype TechDocsReaderSearchBarProps = {\n entityId: CompoundEntityRef;\n};\n\nconst TechDocsReaderSearchBar = (props: TechDocsReaderSearchBarProps) => {\n const { entityId } = props;\n const navigate = useNavigate();\n const { results, term, setTerm, deferredLoading } =\n useTechDocsSearch(entityId);\n\n return (\n <SearchAutocomplete\n aria-label=\"Search docs\"\n placeholder=\"Search docs\"\n size=\"small\"\n inputValue={term}\n onInputChange={setTerm}\n isLoading={deferredLoading}\n popoverWidth=\"min(720px, calc(100vw - 32px))\"\n popoverPlacement=\"bottom end\"\n >\n {results.map((result, index) => (\n <SearchAutocompleteItem\n key={index}\n id={String(index)}\n textValue={result.document.title}\n onAction={() => {\n setTerm('');\n navigate(result.document.location);\n requestAnimationFrame(() => {\n (document.activeElement as HTMLElement)?.blur();\n });\n }}\n >\n <Flex direction=\"column\" gap=\"1\">\n <Text weight=\"bold\">\n {result.highlight?.fields.title ? (\n <HighlightedSearchResultText\n text={result.highlight.fields.title}\n preTag={result.highlight.preTag}\n postTag={result.highlight.postTag}\n />\n ) : (\n result.document.title\n )}\n </Text>\n {(result.highlight?.fields.text || result.document.text) && (\n <Text\n variant=\"body-small\"\n color=\"secondary\"\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {result.highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={result.highlight.fields.text}\n preTag={result.highlight.preTag}\n postTag={result.highlight.postTag}\n />\n ) : (\n result.document.text\n )}\n </Text>\n )}\n </Flex>\n </SearchAutocompleteItem>\n ))}\n </SearchAutocomplete>\n );\n};\n\nexport type TechDocsReaderSearchProps = {\n entityId: CompoundEntityRef;\n};\n\nexport const TechDocsReaderSearch = (props: TechDocsReaderSearchProps) => {\n const initialState = {\n term: '',\n types: ['techdocs'],\n pageCursor: '',\n filters: props.entityId,\n };\n return (\n <SearchContextProvider initialState={initialState}>\n <TechDocsReaderSearchBar {...props} />\n </SearchContextProvider>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/alpha.d.ts CHANGED
@@ -279,6 +279,19 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
279
279
  noHeader?: boolean;
280
280
  };
281
281
  }>;
282
+ "plugin-header-action:techdocs": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
283
+ kind: "plugin-header-action";
284
+ name: undefined;
285
+ config: {};
286
+ configInput: {};
287
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}>;
288
+ inputs: {};
289
+ params: (params: {
290
+ loader: () => Promise<JSX.Element>;
291
+ }) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<{
292
+ loader: () => Promise<JSX.Element>;
293
+ }>;
294
+ }>;
282
295
  "search-result-list-item:techdocs": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
283
296
  config: {
284
297
  title: string | undefined;
package/dist/alpha.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Suspense } from 'react';
3
- import LibraryBooks from '@material-ui/icons/LibraryBooks';
4
- import { ApiBlueprint, PageBlueprint, createExtensionInput, coreExtensionData, createExtension, NavItemBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
+ import { RiArticleLine } from '@remixicon/react';
4
+ import { ApiBlueprint, PageBlueprint, createExtensionInput, coreExtensionData, createExtension, NavItemBlueprint, PluginHeaderActionBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
5
5
  import { fetchApiRef, discoveryApiRef, configApiRef } from '@backstage/core-plugin-api';
6
6
  import { EntityIconLinkBlueprint, EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
7
7
  import { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';
@@ -9,21 +9,10 @@ import { AddonBlueprint, attachTechDocsAddonComponentData } from '@backstage/plu
9
9
  import { techdocsAddonsApiRef, TechDocsAddonsApiExtension } from './alpha/addonsApi.esm.js';
10
10
  import { TechDocsStorageClient, TechDocsClient } from './client.esm.js';
11
11
  import { rootRouteRef, rootDocsRouteRef, rootCatalogDocsRouteRef } from './routes.esm.js';
12
- import './reader/components/TechDocsReaderProvider.esm.js';
13
- import { TechDocsReaderLayout } from './reader/components/TechDocsReaderPage/TechDocsReaderPage.esm.js';
14
- import 'react-helmet';
15
- import '@material-ui/core/Grid';
16
- import '@material-ui/lab/Skeleton';
17
- import '@material-ui/icons/Code';
12
+ import { TechDocsReaderLayout } from './alpha/components/TechDocsReaderLayout.esm.js';
18
13
  import { techdocsStorageApiRef, techdocsApiRef, TechDocsAddons } from '@backstage/plugin-techdocs-react';
19
- import '@backstage/plugin-catalog-react';
20
- import '@backstage/catalog-model';
21
- import { DocsIcon } from '@backstage/core-components';
22
- import 'lodash/capitalize';
23
- import 'react-router-dom';
24
- import './reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js';
25
- import './reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js';
26
14
  import { useTechdocsReaderIconLinkProps } from './alpha/hooks/useTechdocsReaderIconLinkProps.esm.js';
15
+ import { DocsIcon, SupportButton } from '@backstage/core-components';
27
16
 
28
17
  const techdocsEntityIconLink = EntityIconLinkBlueprint.make({
29
18
  name: "read-docs",
@@ -86,7 +75,7 @@ const techDocsPage = PageBlueprint.make({
86
75
  params: {
87
76
  path: "/docs",
88
77
  routeRef: rootRouteRef,
89
- loader: () => import('./home/components/TechDocsIndexPage.esm.js').then((m) => /* @__PURE__ */ jsx(m.TechDocsIndexPage, {}))
78
+ loader: () => import('./alpha/components/TechDocsIndexPageContent.esm.js').then((m) => /* @__PURE__ */ jsx(m.TechDocsIndexPageContent, {}))
90
79
  }
91
80
  });
92
81
  const techDocsReaderPage = PageBlueprint.makeWithOverrides({
@@ -184,21 +173,27 @@ const techDocsEntityContentEmptyState = createExtension({
184
173
  });
185
174
  const techDocsNavItem = NavItemBlueprint.make({
186
175
  params: {
187
- icon: LibraryBooks,
176
+ icon: () => /* @__PURE__ */ jsx(RiArticleLine, {}),
188
177
  title: "Docs",
189
178
  routeRef: rootRouteRef
190
179
  }
191
180
  });
181
+ const techDocsSupportAction = PluginHeaderActionBlueprint.make({
182
+ params: (defineParams) => defineParams({
183
+ loader: async () => /* @__PURE__ */ jsx(SupportButton, { children: "Discover documentation in your ecosystem." })
184
+ })
185
+ });
192
186
  var index = createFrontendPlugin({
193
187
  pluginId: "techdocs",
194
- title: "Docs",
195
- icon: /* @__PURE__ */ jsx(LibraryBooks, { fontSize: "inherit" }),
196
- info: { packageJson: () => import('./package.json.esm.js') },
188
+ title: "Documentation",
189
+ icon: /* @__PURE__ */ jsx(RiArticleLine, {}),
190
+ info: { packageJson: () => import('./plugins/techdocs/package.json.esm.js') },
197
191
  extensions: [
198
192
  techDocsClientApi,
199
193
  techDocsStorageApi,
200
194
  TechDocsAddonsApiExtension,
201
195
  techDocsNavItem,
196
+ techDocsSupportAction,
202
197
  techDocsPage,
203
198
  techDocsReaderPage,
204
199
  techdocsEntityIconLink,
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 { Suspense } from 'react';\nimport LibraryBooks from '@material-ui/icons/LibraryBooks';\nimport {\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n NavItemBlueprint,\n createExtensionInput,\n coreExtensionData,\n createExtension,\n} from '@backstage/frontend-plugin-api';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from '@backstage/plugin-catalog-react/alpha';\nimport { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';\nimport {\n AddonBlueprint,\n attachTechDocsAddonComponentData,\n} from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAddonsApiExtension, techdocsAddonsApiRef } from './addonsApi';\nimport { TechDocsClient, TechDocsStorageClient } from '../client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from '../routes';\nimport { TechDocsReaderLayout } from '../reader';\nimport {\n TechDocsAddons,\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\n\nimport { useTechdocsReaderIconLinkProps } from './hooks/useTechdocsReaderIconLinkProps';\nimport { DocsIcon } from '@backstage/core-components';\n\n/** @alpha */\nconst techdocsEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'read-docs',\n params: {\n useProps: useTechdocsReaderIconLinkProps,\n },\n});\n\n/** @alpha */\nconst techDocsStorageApi = ApiBlueprint.make({\n name: 'storage',\n params: defineParams =>\n defineParams({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: techdocsApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nexport const techDocsSearchResultListItemExtension =\n SearchResultListItemBlueprint.makeWithOverrides({\n config: {\n schema: {\n title: z => z.string().optional(),\n lineClamp: z => z.number().default(5),\n asLink: z => z.boolean().default(true),\n asListItem: z => z.boolean().default(true),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n icon: <DocsIcon />,\n predicate: result => result.type === 'techdocs',\n component: async () => {\n const { TechDocsSearchResultListItem } = await import(\n '../search/components/TechDocsSearchResultListItem'\n );\n return props => (\n <TechDocsSearchResultListItem {...props} {...config} />\n );\n },\n });\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = PageBlueprint.make({\n params: {\n path: '/docs',\n routeRef: rootRouteRef,\n loader: () =>\n import('../home/components/TechDocsIndexPage').then(m => (\n <m.TechDocsIndexPage />\n )),\n },\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = PageBlueprint.makeWithOverrides({\n name: 'reader',\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n },\n config: {\n schema: {\n withoutSearch: z => z.boolean().default(false),\n withoutHeader: z => z.boolean().default(false),\n },\n },\n factory(originalFactory, { apis, inputs, config }) {\n const addonsApi = apis.get(techdocsAddonsApiRef);\n\n return originalFactory({\n path: '/docs/:namespace/:kind/:name',\n routeRef: rootDocsRouteRef,\n loader: async () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ TechDocsReaderRouter }) => (\n <TechDocsReaderRouter>\n <TechDocsReaderLayout\n withSearch={!config.withoutSearch}\n withHeader={!config.withoutHeader}\n />\n <TechDocsAddons>{addons}</TechDocsAddons>\n </TechDocsReaderRouter>\n ));\n },\n });\n },\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = EntityContentBlueprint.makeWithOverrides({\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n emptyState: createExtensionInput(\n [coreExtensionData.reactElement.optional()],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory(originalFactory, context) {\n const addonsApi = context.apis.get(techdocsAddonsApiRef);\n\n return originalFactory(\n {\n path: 'docs',\n title: 'TechDocs',\n group: 'documentation',\n routeRef: rootCatalogDocsRouteRef,\n loader: () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = context.inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ EmbeddedDocsRouter }) => (\n <EmbeddedDocsRouter\n emptyState={context.inputs.emptyState?.get(\n coreExtensionData.reactElement,\n )}\n >\n <TechDocsAddons>{addons}</TechDocsAddons>\n </EmbeddedDocsRouter>\n ));\n },\n },\n context,\n );\n },\n});\n\nconst techDocsEntityContentEmptyState = createExtension({\n kind: 'empty-state',\n name: 'entity-content',\n attachTo: { id: 'entity-content:techdocs', input: 'emptyState' },\n output: [coreExtensionData.reactElement.optional()],\n factory: () => [],\n});\n\n/** @alpha */\nconst techDocsNavItem = NavItemBlueprint.make({\n params: {\n icon: LibraryBooks,\n title: 'Docs',\n routeRef: rootRouteRef,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'techdocs',\n title: 'Docs',\n icon: <LibraryBooks fontSize=\"inherit\" />,\n info: { packageJson: () => import('../../package.json') },\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n TechDocsAddonsApiExtension,\n techDocsNavItem,\n techDocsPage,\n techDocsReaderPage,\n techdocsEntityIconLink,\n techDocsEntityContent,\n techDocsEntityContentEmptyState,\n techDocsSearchResultListItemExtension,\n ],\n routes: {\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 { Suspense } from 'react';\nimport { RiArticleLine } from '@remixicon/react';\nimport {\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n NavItemBlueprint,\n PluginHeaderActionBlueprint,\n createExtensionInput,\n coreExtensionData,\n createExtension,\n} from '@backstage/frontend-plugin-api';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from '@backstage/plugin-catalog-react/alpha';\nimport { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';\nimport {\n AddonBlueprint,\n attachTechDocsAddonComponentData,\n} from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAddonsApiExtension, techdocsAddonsApiRef } from './addonsApi';\nimport { TechDocsClient, TechDocsStorageClient } from '../client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from '../routes';\nimport { TechDocsReaderLayout } from './components/TechDocsReaderLayout';\nimport {\n TechDocsAddons,\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\n\nimport { useTechdocsReaderIconLinkProps } from './hooks/useTechdocsReaderIconLinkProps';\nimport { DocsIcon, SupportButton } from '@backstage/core-components';\n\n/** @alpha */\nconst techdocsEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'read-docs',\n params: {\n useProps: useTechdocsReaderIconLinkProps,\n },\n});\n\n/** @alpha */\nconst techDocsStorageApi = ApiBlueprint.make({\n name: 'storage',\n params: defineParams =>\n defineParams({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: techdocsApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nexport const techDocsSearchResultListItemExtension =\n SearchResultListItemBlueprint.makeWithOverrides({\n config: {\n schema: {\n title: z => z.string().optional(),\n lineClamp: z => z.number().default(5),\n asLink: z => z.boolean().default(true),\n asListItem: z => z.boolean().default(true),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n icon: <DocsIcon />,\n predicate: result => result.type === 'techdocs',\n component: async () => {\n const { TechDocsSearchResultListItem } = await import(\n '../search/components/TechDocsSearchResultListItem'\n );\n return props => (\n <TechDocsSearchResultListItem {...props} {...config} />\n );\n },\n });\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = PageBlueprint.make({\n params: {\n path: '/docs',\n routeRef: rootRouteRef,\n loader: () =>\n import('./components/TechDocsIndexPageContent').then(m => (\n <m.TechDocsIndexPageContent />\n )),\n },\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = PageBlueprint.makeWithOverrides({\n name: 'reader',\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n },\n config: {\n schema: {\n withoutSearch: z => z.boolean().default(false),\n withoutHeader: z => z.boolean().default(false),\n },\n },\n factory(originalFactory, { apis, inputs, config }) {\n const addonsApi = apis.get(techdocsAddonsApiRef);\n\n return originalFactory({\n path: '/docs/:namespace/:kind/:name',\n routeRef: rootDocsRouteRef,\n loader: async () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ TechDocsReaderRouter }) => (\n <TechDocsReaderRouter>\n <TechDocsReaderLayout\n withSearch={!config.withoutSearch}\n withHeader={!config.withoutHeader}\n />\n <TechDocsAddons>{addons}</TechDocsAddons>\n </TechDocsReaderRouter>\n ));\n },\n });\n },\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = EntityContentBlueprint.makeWithOverrides({\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n emptyState: createExtensionInput(\n [coreExtensionData.reactElement.optional()],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory(originalFactory, context) {\n const addonsApi = context.apis.get(techdocsAddonsApiRef);\n\n return originalFactory(\n {\n path: 'docs',\n title: 'TechDocs',\n group: 'documentation',\n routeRef: rootCatalogDocsRouteRef,\n loader: () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = context.inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ EmbeddedDocsRouter }) => (\n <EmbeddedDocsRouter\n emptyState={context.inputs.emptyState?.get(\n coreExtensionData.reactElement,\n )}\n >\n <TechDocsAddons>{addons}</TechDocsAddons>\n </EmbeddedDocsRouter>\n ));\n },\n },\n context,\n );\n },\n});\n\nconst techDocsEntityContentEmptyState = createExtension({\n kind: 'empty-state',\n name: 'entity-content',\n attachTo: { id: 'entity-content:techdocs', input: 'emptyState' },\n output: [coreExtensionData.reactElement.optional()],\n factory: () => [],\n});\n\n/** @alpha */\nconst techDocsNavItem = NavItemBlueprint.make({\n params: {\n icon: () => <RiArticleLine />,\n title: 'Docs',\n routeRef: rootRouteRef,\n },\n});\n\nconst techDocsSupportAction = PluginHeaderActionBlueprint.make({\n params: defineParams =>\n defineParams({\n loader: async () => (\n <SupportButton>Discover documentation in your ecosystem.</SupportButton>\n ),\n }),\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'techdocs',\n title: 'Documentation',\n icon: <RiArticleLine />,\n info: { packageJson: () => import('../../package.json') },\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n TechDocsAddonsApiExtension,\n techDocsNavItem,\n techDocsSupportAction,\n techDocsPage,\n techDocsReaderPage,\n techdocsEntityIconLink,\n techDocsEntityContent,\n techDocsEntityContentEmptyState,\n techDocsSearchResultListItemExtension,\n ],\n routes: {\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { useEffect, useCallback } from 'react';
2
+ import { useLocation } from 'react-router-dom';
3
+ import { useTechDocsReaderPage, useShadowDomStylesLoading, useShadowRootElements } from '@backstage/plugin-techdocs-react';
4
+ import { useApp } from '@backstage/core-plugin-api';
5
+ import { useTechDocsReaderDom } from '../reader/components/TechDocsReaderPageContent/dom.esm.js';
6
+ import { useTechDocsReader } from '../reader/components/TechDocsReaderProvider.esm.js';
7
+
8
+ function useTechDocsReaderContentData(options) {
9
+ const { defaultPath, onReady } = options;
10
+ const {
11
+ entityMetadata: { value: entityMetadata, loading: entityMetadataLoading },
12
+ entityRef,
13
+ setShadowRoot
14
+ } = useTechDocsReaderPage();
15
+ const { state } = useTechDocsReader();
16
+ const dom = useTechDocsReaderDom(entityRef, defaultPath);
17
+ const location = useLocation();
18
+ const path = location.pathname;
19
+ const hash = location.hash;
20
+ const isStyleLoading = useShadowDomStylesLoading(dom);
21
+ const [hashElement] = useShadowRootElements([`[id="${hash.slice(1)}"]`]);
22
+ const app = useApp();
23
+ const { NotFoundErrorPage } = app.getComponents();
24
+ useEffect(() => {
25
+ if (isStyleLoading) return;
26
+ if (hash) {
27
+ if (hashElement) {
28
+ hashElement.scrollIntoView();
29
+ const link = hashElement.querySelector("a.headerlink");
30
+ if (link) {
31
+ link.focus();
32
+ }
33
+ }
34
+ } else {
35
+ document?.querySelector("header")?.scrollIntoView();
36
+ }
37
+ }, [path, hash, hashElement, isStyleLoading]);
38
+ const handleAppend = useCallback(
39
+ (newShadowRoot) => {
40
+ setShadowRoot(newShadowRoot);
41
+ if (onReady instanceof Function) {
42
+ onReady();
43
+ }
44
+ },
45
+ [setShadowRoot, onReady]
46
+ );
47
+ const isNotFound = entityMetadataLoading === false && !entityMetadata;
48
+ const isDomReady = !!dom;
49
+ const showProgress = state === "CHECKING" || isStyleLoading;
50
+ return {
51
+ entityRef,
52
+ entityMetadata,
53
+ dom,
54
+ handleAppend,
55
+ isNotFound,
56
+ isDomReady,
57
+ showProgress,
58
+ NotFoundErrorPage
59
+ };
60
+ }
61
+
62
+ export { useTechDocsReaderContentData };
63
+ //# sourceMappingURL=useTechDocsReaderContentData.esm.js.map