@backstage/plugin-techdocs 1.17.3 → 1.17.5

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,5 +1,28 @@
1
1
  # @backstage/plugin-techdocs
2
2
 
3
+ ## 1.17.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 59c1e54: Made the TechDocs sidebar positioning at tablet breakpoints configurable via CSS custom properties, allowing apps with custom sidebar widths to override the defaults. The available properties are `--techdocs-sidebar-closed-offset-pinned`, `--techdocs-sidebar-closed-offset-collapsed`, and `--techdocs-sidebar-open-translate`.
8
+ - bc41a91: The `zod` dependency has been bumped from `^3.25.76 || ^4.0.0` to `^4.0.0`, since `configSchema` requires the full Zod v4 package for JSON Schema support.
9
+ - Updated dependencies
10
+ - @backstage/ui@0.14.2
11
+ - @backstage/frontend-plugin-api@0.16.2
12
+ - @backstage/plugin-catalog-react@2.1.4
13
+ - @backstage/plugin-search-react@1.11.3
14
+
15
+ ## 1.17.4
16
+
17
+ ### Patch Changes
18
+
19
+ - 6b60bd7: Replaced old config schema values from existing extensions and blueprints.
20
+ - Updated dependencies
21
+ - @backstage/ui@0.14.1
22
+ - @backstage/frontend-plugin-api@0.16.1
23
+ - @backstage/plugin-catalog-react@2.1.3
24
+ - @backstage/plugin-search-react@1.11.2
25
+
3
26
  ## 1.17.3
4
27
 
5
28
  ### Patch Changes
package/dist/alpha.d.ts CHANGED
@@ -20,8 +20,8 @@ declare const techDocsSearchResultListItemExtension: _backstage_frontend_plugin_
20
20
  configInput: {
21
21
  title?: string | undefined;
22
22
  lineClamp?: number | undefined;
23
- asListItem?: boolean | undefined;
24
23
  asLink?: boolean | undefined;
24
+ asListItem?: boolean | undefined;
25
25
  noTrack?: boolean | undefined;
26
26
  };
27
27
  output: _backstage_frontend_plugin_api.ExtensionDataRef<{
@@ -158,9 +158,9 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
158
158
  filter: _backstage_filter_predicates.FilterPredicate | undefined;
159
159
  };
160
160
  configInput: {
161
- filter?: _backstage_filter_predicates.FilterPredicate | undefined;
162
161
  label?: string | undefined;
163
162
  title?: string | undefined;
163
+ filter?: _backstage_filter_predicates.FilterPredicate | undefined;
164
164
  };
165
165
  output: _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
166
166
  optional: true;
@@ -176,8 +176,12 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
176
176
  "nav-item:techdocs": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
177
177
  kind: "nav-item";
178
178
  name: undefined;
179
- config: {};
180
- configInput: {};
179
+ config: {
180
+ title: string | undefined;
181
+ };
182
+ configInput: {
183
+ title?: string | undefined;
184
+ };
181
185
  output: _backstage_frontend_plugin_api.ExtensionDataRef<{
182
186
  title: string;
183
187
  icon: _backstage_frontend_plugin_api.IconComponent;
@@ -198,8 +202,8 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
198
202
  title: string | undefined;
199
203
  };
200
204
  configInput: {
201
- title?: string | undefined;
202
205
  path?: string | undefined;
206
+ title?: string | undefined;
203
207
  };
204
208
  output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
205
209
  optional: true;
@@ -240,8 +244,8 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
240
244
  configInput: {
241
245
  withoutSearch?: boolean | undefined;
242
246
  withoutHeader?: boolean | undefined;
243
- title?: string | undefined;
244
247
  path?: string | undefined;
248
+ title?: string | undefined;
245
249
  };
246
250
  output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
247
251
  optional: true;
@@ -301,8 +305,8 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
301
305
  configInput: {
302
306
  title?: string | undefined;
303
307
  lineClamp?: number | undefined;
304
- asListItem?: boolean | undefined;
305
308
  asLink?: boolean | undefined;
309
+ asListItem?: boolean | undefined;
306
310
  noTrack?: boolean | undefined;
307
311
  };
308
312
  output: _backstage_frontend_plugin_api.ExtensionDataRef<{
package/dist/alpha.esm.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Suspense } from 'react';
3
+ import { z } from 'zod/v4';
3
4
  import { RiArticleLine } from '@remixicon/react';
4
5
  import { ApiBlueprint, PageBlueprint, createExtensionInput, coreExtensionData, createExtension, NavItemBlueprint, PluginHeaderActionBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
5
6
  import { fetchApiRef, discoveryApiRef, configApiRef } from '@backstage/core-plugin-api';
@@ -52,13 +53,11 @@ const techDocsClientApi = ApiBlueprint.make({
52
53
  })
53
54
  });
54
55
  const techDocsSearchResultListItemExtension = SearchResultListItemBlueprint.makeWithOverrides({
55
- config: {
56
- schema: {
57
- title: (z) => z.string().optional(),
58
- lineClamp: (z) => z.number().default(5),
59
- asLink: (z) => z.boolean().default(true),
60
- asListItem: (z) => z.boolean().default(true)
61
- }
56
+ configSchema: {
57
+ title: z.string().optional(),
58
+ lineClamp: z.number().default(5),
59
+ asLink: z.boolean().default(true),
60
+ asListItem: z.boolean().default(true)
62
61
  },
63
62
  factory(originalFactory, { config }) {
64
63
  return originalFactory({
@@ -83,11 +82,9 @@ const techDocsReaderPage = PageBlueprint.makeWithOverrides({
83
82
  inputs: {
84
83
  addons: createExtensionInput([AddonBlueprint.dataRefs.addon])
85
84
  },
86
- config: {
87
- schema: {
88
- withoutSearch: (z) => z.boolean().default(false),
89
- withoutHeader: (z) => z.boolean().default(false)
90
- }
85
+ configSchema: {
86
+ withoutSearch: z.boolean().default(false),
87
+ withoutHeader: z.boolean().default(false)
91
88
  },
92
89
  factory(originalFactory, { apis, inputs, config }) {
93
90
  const addonsApi = apis.get(techdocsAddonsApiRef);
@@ -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 { 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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"}
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 { z } from 'zod/v4';\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 configSchema: {\n title: z.string().optional(),\n lineClamp: z.number().default(5),\n asLink: z.boolean().default(true),\n asListItem: z.boolean().default(true),\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 configSchema: {\n withoutSearch: z.boolean().default(false),\n withoutHeader: z.boolean().default(false),\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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"}
@@ -1,5 +1,5 @@
1
1
  var name = "@backstage/plugin-techdocs";
2
- var version = "1.17.3";
2
+ var version = "1.17.5";
3
3
  var description = "The Backstage plugin that renders technical documentation for your components";
4
4
  var backstage = {
5
5
  role: "frontend-plugin",
@@ -85,7 +85,8 @@ var dependencies = {
85
85
  "git-url-parse": "^15.0.0",
86
86
  lodash: "^4.17.21",
87
87
  "react-helmet": "6.1.0",
88
- "react-use": "^17.2.4"
88
+ "react-use": "^17.2.4",
89
+ zod: "^4.0.0"
89
90
  };
90
91
  var devDependencies = {
91
92
  "@backstage/cli": "workspace:^",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,6 @@
1
- const SIDEBAR_WIDTH = "224px";
1
+ const TECHDOCS_SIDEBAR_WIDTH = "16rem";
2
+ const APP_SIDEBAR_WIDTH_PINNED = "224px";
3
+ const APP_SIDEBAR_WIDTH_COLLAPSED = "72px";
2
4
  var layout = ({ theme, sidebar }) => `
3
5
 
4
6
  /*================== Layout ==================*/
@@ -61,10 +63,10 @@ var layout = ({ theme, sidebar }) => `
61
63
  .md-sidebar {
62
64
  bottom: 75px;
63
65
  position: fixed;
64
- width: 16rem;
66
+ width: ${TECHDOCS_SIDEBAR_WIDTH};
65
67
  }
66
68
  .md-sidebar .md-sidebar__scrollwrap {
67
- width: calc(16rem);
69
+ width: calc(${TECHDOCS_SIDEBAR_WIDTH});
68
70
  height: 100%
69
71
  }
70
72
 
@@ -78,13 +80,13 @@ var layout = ({ theme, sidebar }) => `
78
80
  }
79
81
 
80
82
  .md-content {
81
- max-width: calc(100% - 16rem * 2);
82
- margin-left: 16rem;
83
+ max-width: calc(100% - ${TECHDOCS_SIDEBAR_WIDTH} * 2);
84
+ margin-left: ${TECHDOCS_SIDEBAR_WIDTH};
83
85
  margin-bottom: 50px;
84
86
  }
85
87
 
86
88
  .md-content > .md-sidebar {
87
- left: 16rem;
89
+ left: ${TECHDOCS_SIDEBAR_WIDTH};
88
90
  }
89
91
 
90
92
  .md-footer {
@@ -101,7 +103,7 @@ var layout = ({ theme, sidebar }) => `
101
103
  background-color: unset;
102
104
  }
103
105
  .md-footer-nav__link, .md-footer__link {
104
- width: 16rem;
106
+ width: ${TECHDOCS_SIDEBAR_WIDTH};
105
107
  }
106
108
 
107
109
  .md-dialog {
@@ -166,16 +168,16 @@ var layout = ({ theme, sidebar }) => `
166
168
  height: 100%;
167
169
  }
168
170
  .md-sidebar--primary {
169
- width: 16rem !important;
171
+ width: ${TECHDOCS_SIDEBAR_WIDTH} !important;
170
172
  z-index: 200;
171
- left: ${sidebar.isPinned ? `calc(-16rem + ${SIDEBAR_WIDTH})` : "calc(-16rem + 72px)"} !important;
173
+ left: ${sidebar.isPinned ? `calc(-${TECHDOCS_SIDEBAR_WIDTH} + var(--techdocs-sidebar-closed-offset-pinned, ${APP_SIDEBAR_WIDTH_PINNED}))` : `calc(-${TECHDOCS_SIDEBAR_WIDTH} + var(--techdocs-sidebar-closed-offset-collapsed, ${APP_SIDEBAR_WIDTH_COLLAPSED}))`} !important;
172
174
  }
173
175
  .md-sidebar--secondary:not([hidden]) {
174
176
  display: none;
175
177
  }
176
178
 
177
179
  [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary {
178
- transform: translateX(16rem);
180
+ transform: translateX(var(--techdocs-sidebar-open-translate, ${TECHDOCS_SIDEBAR_WIDTH}));
179
181
  }
180
182
 
181
183
  .md-content {
@@ -205,8 +207,8 @@ var layout = ({ theme, sidebar }) => `
205
207
 
206
208
  @media screen and (max-width: 600px) {
207
209
  .md-sidebar--primary {
208
- left: -16rem !important;
209
- width: 16rem;
210
+ left: -${TECHDOCS_SIDEBAR_WIDTH} !important;
211
+ width: ${TECHDOCS_SIDEBAR_WIDTH};
210
212
  }
211
213
  }
212
214
 
@@ -1 +1 @@
1
- {"version":3,"file":"layout.esm.js","sources":["../../../../../src/reader/transformers/styles/rules/layout.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { RuleOptions } from './types';\n\nconst SIDEBAR_WIDTH = '224px';\n\nexport default ({ theme, sidebar }: RuleOptions) => `\n\n/*================== Layout ==================*/\n\n/* mkdocs material v9 compat */\n.md-nav__title {\n color: var(--md-default-fg-color);\n}\n\n.md-grid {\n max-width: 100%;\n margin: 0;\n}\n\n.md-nav {\n font-size: calc(var(--md-typeset-font-size) * 0.9);\n}\n.md-nav__link:not(:has(svg)) {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.md-nav__link:has(svg) > .md-ellipsis {\n flex-grow: 1;\n}\n.md-nav__icon {\n height: 20px !important;\n width: 20px !important;\n margin-left:${theme.spacing(1)}px;\n}\n.md-nav__icon svg {\n margin: 0;\n width: 20px !important;\n height: 20px !important;\n}\n.md-nav__icon:after {\n width: 20px !important;\n height: 20px !important;\n}\n.md-status--updated::after {\n -webkit-mask-image: var(--md-status--updated);\n mask-image: var(--md-status--updated);\n}\n\n.md-nav__item--active > .md-nav__link, a.md-nav__link--active {\n text-decoration: underline;\n color: var(--md-typeset-a-color);\n}\n.md-nav__link--active > .md-status:after {\n background-color: var(--md-typeset-a-color);\n}\n.md-nav__link[href]:hover > .md-status:after {\n background-color: var(--md-accent-fg-color);\n}\n\n.md-main__inner {\n margin-top: 0;\n}\n\n.md-sidebar {\n bottom: 75px;\n position: fixed;\n width: 16rem;\n}\n.md-sidebar .md-sidebar__scrollwrap {\n width: calc(16rem);\n height: 100%\n}\n\n@supports selector(::-webkit-scrollbar) {\n [dir=ltr] .md-sidebar__inner {\n padding-right: calc(100% - 15.1rem);\n }\n}\n.md-sidebar--secondary {\n right: ${theme.spacing(3)}px;\n}\n\n.md-content {\n max-width: calc(100% - 16rem * 2);\n margin-left: 16rem;\n margin-bottom: 50px;\n}\n\n.md-content > .md-sidebar {\n left: 16rem;\n}\n\n.md-footer {\n position: fixed;\n bottom: 0px;\n pointer-events: none;\n}\n\n.md-footer-nav__link, .md-footer__link {\n pointer-events: all;\n}\n\n.md-footer__title {\n background-color: unset;\n}\n.md-footer-nav__link, .md-footer__link {\n width: 16rem;\n}\n\n.md-dialog {\n background-color: unset;\n}\n\n@media screen and (min-width: 76.25em) {\n .md-sidebar {\n height: auto;\n /* Less padding before the Previous / Next buttons */\n padding-bottom: 0 !important;\n }\n}\n\n@media screen and (max-width: 76.1875em) {\n .md-nav {\n transition: none !important;\n background-color: var(--md-default-bg-color)\n }\n .md-nav--primary .md-nav__title {\n cursor: auto;\n color: var(--md-default-fg-color);\n font-weight: 700;\n white-space: normal;\n line-height: 1rem;\n height: auto;\n display: flex;\n flex-flow: column;\n row-gap: 1.6rem;\n padding: 1.2rem .8rem .8rem;\n background-color: var(--md-default-bg-color);\n }\n .md-nav--primary .md-nav__title~.md-nav__list {\n box-shadow: none;\n }\n .md-nav--primary .md-nav__title ~ .md-nav__list > :first-child {\n border-top: none;\n }\n .md-nav--primary .md-nav__title .md-nav__button {\n display: none;\n }\n .md-nav--primary .md-nav__title .md-nav__icon {\n color: var(--md-default-fg-color);\n position: static;\n height: auto;\n margin: 0 0 0 -0.2rem;\n }\n .md-nav--primary > .md-nav__title [for=\"none\"] {\n padding-top: 0;\n }\n .md-nav--primary .md-nav__item {\n border-top: none;\n }\n .md-nav--primary :is(.md-nav__title,.md-nav__item) {\n font-size : var(--md-typeset-font-size);\n }\n .md-nav .md-source {\n display: none;\n }\n\n .md-sidebar {\n height: 100%;\n }\n .md-sidebar--primary {\n width: 16rem !important;\n z-index: 200;\n left: ${\n sidebar.isPinned\n ? `calc(-16rem + ${SIDEBAR_WIDTH})`\n : 'calc(-16rem + 72px)'\n } !important;\n }\n .md-sidebar--secondary:not([hidden]) {\n display: none;\n }\n\n [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary {\n transform: translateX(16rem);\n }\n\n .md-content {\n max-width: 100%;\n margin-left: 0;\n }\n\n .md-header__button {\n margin: 0.4rem 0;\n margin-left: 0.4rem;\n padding: 0;\n }\n\n .md-overlay {\n left: 0;\n }\n\n .md-footer {\n position: static;\n padding-left: 0;\n }\n .md-footer-nav__link {\n /* footer links begin to overlap at small sizes without setting width */\n width: 50%;\n }\n}\n\n@media screen and (max-width: 600px) {\n .md-sidebar--primary {\n left: -16rem !important;\n width: 16rem;\n }\n}\n\n\n@media print {\n .md-sidebar,\n #toggle-sidebar {\n display: none;\n }\n\n .md-content {\n margin: 0;\n width: 100%;\n max-width: 100%;\n }\n}\n`;\n"],"names":[],"mappings":"AAkBA,MAAM,aAAA,GAAgB,OAAA;AAEtB,aAAe,CAAC,EAAE,KAAA,EAAO,OAAA,EAAQ,KAAmB;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EA4BpC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EA+CrB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EA+FrB,OAAA,CAAQ,QAAA,GACJ,CAAA,cAAA,EAAiB,aAAa,MAC9B,qBACN,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;;"}
1
+ {"version":3,"file":"layout.esm.js","sources":["../../../../../src/reader/transformers/styles/rules/layout.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { RuleOptions } from './types';\n\nconst TECHDOCS_SIDEBAR_WIDTH = '16rem';\nconst APP_SIDEBAR_WIDTH_PINNED = '224px';\nconst APP_SIDEBAR_WIDTH_COLLAPSED = '72px';\n\nexport default ({ theme, sidebar }: RuleOptions) => `\n\n/*================== Layout ==================*/\n\n/* mkdocs material v9 compat */\n.md-nav__title {\n color: var(--md-default-fg-color);\n}\n\n.md-grid {\n max-width: 100%;\n margin: 0;\n}\n\n.md-nav {\n font-size: calc(var(--md-typeset-font-size) * 0.9);\n}\n.md-nav__link:not(:has(svg)) {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.md-nav__link:has(svg) > .md-ellipsis {\n flex-grow: 1;\n}\n.md-nav__icon {\n height: 20px !important;\n width: 20px !important;\n margin-left:${theme.spacing(1)}px;\n}\n.md-nav__icon svg {\n margin: 0;\n width: 20px !important;\n height: 20px !important;\n}\n.md-nav__icon:after {\n width: 20px !important;\n height: 20px !important;\n}\n.md-status--updated::after {\n -webkit-mask-image: var(--md-status--updated);\n mask-image: var(--md-status--updated);\n}\n\n.md-nav__item--active > .md-nav__link, a.md-nav__link--active {\n text-decoration: underline;\n color: var(--md-typeset-a-color);\n}\n.md-nav__link--active > .md-status:after {\n background-color: var(--md-typeset-a-color);\n}\n.md-nav__link[href]:hover > .md-status:after {\n background-color: var(--md-accent-fg-color);\n}\n\n.md-main__inner {\n margin-top: 0;\n}\n\n.md-sidebar {\n bottom: 75px;\n position: fixed;\n width: ${TECHDOCS_SIDEBAR_WIDTH};\n}\n.md-sidebar .md-sidebar__scrollwrap {\n width: calc(${TECHDOCS_SIDEBAR_WIDTH});\n height: 100%\n}\n\n@supports selector(::-webkit-scrollbar) {\n [dir=ltr] .md-sidebar__inner {\n padding-right: calc(100% - 15.1rem);\n }\n}\n.md-sidebar--secondary {\n right: ${theme.spacing(3)}px;\n}\n\n.md-content {\n max-width: calc(100% - ${TECHDOCS_SIDEBAR_WIDTH} * 2);\n margin-left: ${TECHDOCS_SIDEBAR_WIDTH};\n margin-bottom: 50px;\n}\n\n.md-content > .md-sidebar {\n left: ${TECHDOCS_SIDEBAR_WIDTH};\n}\n\n.md-footer {\n position: fixed;\n bottom: 0px;\n pointer-events: none;\n}\n\n.md-footer-nav__link, .md-footer__link {\n pointer-events: all;\n}\n\n.md-footer__title {\n background-color: unset;\n}\n.md-footer-nav__link, .md-footer__link {\n width: ${TECHDOCS_SIDEBAR_WIDTH};\n}\n\n.md-dialog {\n background-color: unset;\n}\n\n@media screen and (min-width: 76.25em) {\n .md-sidebar {\n height: auto;\n /* Less padding before the Previous / Next buttons */\n padding-bottom: 0 !important;\n }\n}\n\n@media screen and (max-width: 76.1875em) {\n .md-nav {\n transition: none !important;\n background-color: var(--md-default-bg-color)\n }\n .md-nav--primary .md-nav__title {\n cursor: auto;\n color: var(--md-default-fg-color);\n font-weight: 700;\n white-space: normal;\n line-height: 1rem;\n height: auto;\n display: flex;\n flex-flow: column;\n row-gap: 1.6rem;\n padding: 1.2rem .8rem .8rem;\n background-color: var(--md-default-bg-color);\n }\n .md-nav--primary .md-nav__title~.md-nav__list {\n box-shadow: none;\n }\n .md-nav--primary .md-nav__title ~ .md-nav__list > :first-child {\n border-top: none;\n }\n .md-nav--primary .md-nav__title .md-nav__button {\n display: none;\n }\n .md-nav--primary .md-nav__title .md-nav__icon {\n color: var(--md-default-fg-color);\n position: static;\n height: auto;\n margin: 0 0 0 -0.2rem;\n }\n .md-nav--primary > .md-nav__title [for=\"none\"] {\n padding-top: 0;\n }\n .md-nav--primary .md-nav__item {\n border-top: none;\n }\n .md-nav--primary :is(.md-nav__title,.md-nav__item) {\n font-size : var(--md-typeset-font-size);\n }\n .md-nav .md-source {\n display: none;\n }\n\n .md-sidebar {\n height: 100%;\n }\n .md-sidebar--primary {\n width: ${TECHDOCS_SIDEBAR_WIDTH} !important;\n z-index: 200;\n left: ${\n sidebar.isPinned\n ? `calc(-${TECHDOCS_SIDEBAR_WIDTH} + var(--techdocs-sidebar-closed-offset-pinned, ${APP_SIDEBAR_WIDTH_PINNED}))`\n : `calc(-${TECHDOCS_SIDEBAR_WIDTH} + var(--techdocs-sidebar-closed-offset-collapsed, ${APP_SIDEBAR_WIDTH_COLLAPSED}))`\n } !important;\n }\n .md-sidebar--secondary:not([hidden]) {\n display: none;\n }\n\n [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary {\n transform: translateX(var(--techdocs-sidebar-open-translate, ${TECHDOCS_SIDEBAR_WIDTH}));\n }\n\n .md-content {\n max-width: 100%;\n margin-left: 0;\n }\n\n .md-header__button {\n margin: 0.4rem 0;\n margin-left: 0.4rem;\n padding: 0;\n }\n\n .md-overlay {\n left: 0;\n }\n\n .md-footer {\n position: static;\n padding-left: 0;\n }\n .md-footer-nav__link {\n /* footer links begin to overlap at small sizes without setting width */\n width: 50%;\n }\n}\n\n@media screen and (max-width: 600px) {\n .md-sidebar--primary {\n left: -${TECHDOCS_SIDEBAR_WIDTH} !important;\n width: ${TECHDOCS_SIDEBAR_WIDTH};\n }\n}\n\n\n@media print {\n .md-sidebar,\n #toggle-sidebar {\n display: none;\n }\n\n .md-content {\n margin: 0;\n width: 100%;\n max-width: 100%;\n }\n}\n`;\n"],"names":[],"mappings":"AAkBA,MAAM,sBAAA,GAAyB,OAAA;AAC/B,MAAM,wBAAA,GAA2B,OAAA;AACjC,MAAM,2BAAA,GAA8B,MAAA;AAEpC,aAAe,CAAC,EAAE,KAAA,EAAO,OAAA,EAAQ,KAAmB;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EA4BpC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,SAAA,EAkCrB,sBAAsB,CAAA;AAAA;AAAA;AAAA,cAAA,EAGjB,sBAAsB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAU3B,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;;AAAA;AAAA,yBAAA,EAIA,sBAAsB,CAAA;AAAA,eAAA,EAChC,sBAAsB,CAAA;AAAA;AAAA;;AAAA;AAAA,QAAA,EAK7B,sBAAsB,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAiBrB,sBAAsB,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAiEpB,sBAAsB,CAAA;AAAA;AAAA,UAAA,EAG7B,OAAA,CAAQ,QAAA,GACJ,CAAA,MAAA,EAAS,sBAAsB,CAAA,gDAAA,EAAmD,wBAAwB,CAAA,EAAA,CAAA,GAC1G,CAAA,MAAA,EAAS,sBAAsB,CAAA,mDAAA,EAAsD,2BAA2B,CAAA,EAAA,CACtH,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iEAAA,EAO+D,sBAAsB,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,WAAA,EA8B5E,sBAAsB,CAAA;AAAA,WAAA,EACtB,sBAAsB,CAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs",
3
- "version": "1.17.3",
3
+ "version": "1.17.5",
4
4
  "description": "The Backstage plugin that renders technical documentation for your components",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -77,17 +77,17 @@
77
77
  "@backstage/core-components": "^0.18.9",
78
78
  "@backstage/core-plugin-api": "^1.12.5",
79
79
  "@backstage/errors": "^1.3.0",
80
- "@backstage/frontend-plugin-api": "^0.16.0",
80
+ "@backstage/frontend-plugin-api": "^0.16.2",
81
81
  "@backstage/integration": "^2.0.1",
82
82
  "@backstage/integration-react": "^1.2.17",
83
83
  "@backstage/plugin-auth-react": "^0.1.26",
84
- "@backstage/plugin-catalog-react": "^2.1.2",
84
+ "@backstage/plugin-catalog-react": "^2.1.4",
85
85
  "@backstage/plugin-search-common": "^1.2.23",
86
- "@backstage/plugin-search-react": "^1.11.1",
86
+ "@backstage/plugin-search-react": "^1.11.3",
87
87
  "@backstage/plugin-techdocs-common": "^0.1.1",
88
88
  "@backstage/plugin-techdocs-react": "^1.3.10",
89
89
  "@backstage/theme": "^0.7.3",
90
- "@backstage/ui": "^0.14.0",
90
+ "@backstage/ui": "^0.14.2",
91
91
  "@material-ui/core": "^4.12.2",
92
92
  "@material-ui/icons": "^4.9.1",
93
93
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -98,13 +98,14 @@
98
98
  "git-url-parse": "^15.0.0",
99
99
  "lodash": "^4.17.21",
100
100
  "react-helmet": "6.1.0",
101
- "react-use": "^17.2.4"
101
+ "react-use": "^17.2.4",
102
+ "zod": "^4.0.0"
102
103
  },
103
104
  "devDependencies": {
104
105
  "@backstage/cli": "^0.36.1",
105
106
  "@backstage/core-app-api": "^1.20.0",
106
107
  "@backstage/dev-utils": "^1.1.22",
107
- "@backstage/plugin-catalog": "^2.0.2",
108
+ "@backstage/plugin-catalog": "^2.0.4",
108
109
  "@backstage/plugin-techdocs-module-addons-contrib": "^1.1.35",
109
110
  "@backstage/test-utils": "^1.7.17",
110
111
  "@testing-library/dom": "^10.0.0",