From 4e762e6893a661e94256e4efc44777e2c623011a Mon Sep 17 00:00:00 2001 From: Vivek Hipparkar Date: Sun, 21 Dec 2025 00:41:44 +0530 Subject: [PATCH 1/5] fix(scaffolder): open markdown links in new tab for template outputs Signed-off-by: Vivek Hipparkar --- .../components/TemplateOutputs/DefaultTemplateOutputs.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx index cfe3d57e74..6e2c6171e5 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx @@ -96,7 +96,10 @@ export const DefaultTemplateOutputs = (props: { titleTypographyProps={{ component: 'h2' }} > - + From de1d2829434d5f2f806affc1aa19d417efca9d4e Mon Sep 17 00:00:00 2001 From: Vivek Hipparkar Date: Sat, 21 Feb 2026 11:44:00 +0530 Subject: [PATCH 2/5] chore: add changeset for scaffolder markdown list behavior fix Signed-off-by: Vivek Hipparkar --- .changeset/common-shrimps-wink.md | 5 +++++ .changeset/solid-pianos-act.md | 5 +++++ .../src/components/MarkdownContent/MarkdownContent.tsx | 10 ++++++++++ .../TemplateOutputs/DefaultTemplateOutputs.tsx | 5 +---- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 .changeset/common-shrimps-wink.md create mode 100644 .changeset/solid-pianos-act.md diff --git a/.changeset/common-shrimps-wink.md b/.changeset/common-shrimps-wink.md new file mode 100644 index 0000000000..796840a32c --- /dev/null +++ b/.changeset/common-shrimps-wink.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': major +--- + +Fixed template output markdown links to open in a new tab, preventing users from losing context when navigating to external resources. diff --git a/.changeset/solid-pianos-act.md b/.changeset/solid-pianos-act.md new file mode 100644 index 0000000000..701e7ed755 --- /dev/null +++ b/.changeset/solid-pianos-act.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Use Backstage Link component for markdown anchor rendering to ensure consistent internal and external link behavior. diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 6d978ebb6f..50bcf3956e 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -23,6 +23,7 @@ import { HeadingProps } from 'react-markdown/lib/ast-to-react'; import rehypeRaw from 'rehype-raw'; import rehypeSanitize, { defaultSchema } from 'rehype-sanitize'; import type { PluggableList } from 'react-markdown/lib/react-markdown'; +import { Link } from '../Link'; export type MarkdownContentClassKey = 'markdown'; @@ -109,6 +110,15 @@ const components: Options['components'] = { h4: headingRenderer, h5: headingRenderer, h6: headingRenderer, + + a: ({ href, children, ...props }) => + href ? ( + + {children} + + ) : ( + <>{children} + ), }; const gfmRehypePlugins: PluggableList = [ diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx index 6e2c6171e5..cfe3d57e74 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx @@ -96,10 +96,7 @@ export const DefaultTemplateOutputs = (props: { titleTypographyProps={{ component: 'h2' }} > - + From 58b9f3f88c815342059d87f240e5f693cd2fb107 Mon Sep 17 00:00:00 2001 From: Vivek Hipparkar Date: Sat, 21 Feb 2026 11:44:00 +0530 Subject: [PATCH 3/5] chore: add changeset for scaffolder markdown list behavior fix Signed-off-by: Vivek Hipparkar --- .changeset/solid-pianos-act.md | 5 +++++ .../src/components/MarkdownContent/MarkdownContent.tsx | 10 ++++++++++ .../TemplateOutputs/DefaultTemplateOutputs.tsx | 5 +---- 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 .changeset/solid-pianos-act.md diff --git a/.changeset/solid-pianos-act.md b/.changeset/solid-pianos-act.md new file mode 100644 index 0000000000..701e7ed755 --- /dev/null +++ b/.changeset/solid-pianos-act.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Use Backstage Link component for markdown anchor rendering to ensure consistent internal and external link behavior. diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 6d978ebb6f..50bcf3956e 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -23,6 +23,7 @@ import { HeadingProps } from 'react-markdown/lib/ast-to-react'; import rehypeRaw from 'rehype-raw'; import rehypeSanitize, { defaultSchema } from 'rehype-sanitize'; import type { PluggableList } from 'react-markdown/lib/react-markdown'; +import { Link } from '../Link'; export type MarkdownContentClassKey = 'markdown'; @@ -109,6 +110,15 @@ const components: Options['components'] = { h4: headingRenderer, h5: headingRenderer, h6: headingRenderer, + + a: ({ href, children, ...props }) => + href ? ( + + {children} + + ) : ( + <>{children} + ), }; const gfmRehypePlugins: PluggableList = [ diff --git a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx index 6e2c6171e5..cfe3d57e74 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx @@ -96,10 +96,7 @@ export const DefaultTemplateOutputs = (props: { titleTypographyProps={{ component: 'h2' }} > - + From 0449cf02fdee20bef9d44fcf71bcd4b2b31039e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 31 Mar 2026 17:20:34 +0200 Subject: [PATCH 4/5] Update packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/components/MarkdownContent/MarkdownContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 579eacf05e..61e519f33a 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -113,7 +113,7 @@ const components: Options['components'] = { a: ({ href, children, title, target, rel }) => href ? ( - + {children} ) : ( From f46363130ca697e5e8ff2ed7f66a89af411fa52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 31 Mar 2026 17:54:39 +0200 Subject: [PATCH 5/5] Update packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../src/components/MarkdownContent/MarkdownContent.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 61e519f33a..4098a6e52d 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -113,7 +113,12 @@ const components: Options['components'] = { a: ({ href, children, title, target, rel }) => href ? ( - + {children} ) : (