@drewswiredin/backstage-plugin-assistants 0.5.0 → 0.5.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.
|
@@ -2,28 +2,32 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useState, useRef, useEffect } from 'react';
|
|
3
3
|
import mermaid from 'mermaid';
|
|
4
4
|
import { CircularProgress, Typography, Tooltip, Dialog, IconButton } from '@material-ui/core';
|
|
5
|
-
import { makeStyles } from '@material-ui/core/styles';
|
|
5
|
+
import { useTheme, makeStyles } from '@material-ui/core/styles';
|
|
6
6
|
import CloseIcon from '@material-ui/icons/Close';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
8
|
+
function mermaidConfig(theme) {
|
|
9
|
+
const p = theme.palette;
|
|
10
|
+
return {
|
|
11
|
+
startOnLoad: false,
|
|
12
|
+
theme: "base",
|
|
13
|
+
suppressErrorRendering: true,
|
|
14
|
+
themeVariables: {
|
|
15
|
+
background: "transparent",
|
|
16
|
+
mainBkg: p.background.paper,
|
|
17
|
+
primaryColor: p.background.paper,
|
|
18
|
+
primaryTextColor: p.text.primary,
|
|
19
|
+
primaryBorderColor: p.divider,
|
|
20
|
+
lineColor: p.text.secondary,
|
|
21
|
+
secondaryColor: p.background.default,
|
|
22
|
+
tertiaryColor: p.background.default,
|
|
23
|
+
clusterBkg: p.background.default,
|
|
24
|
+
clusterBorder: p.divider,
|
|
25
|
+
edgeLabelBackground: p.background.default,
|
|
26
|
+
textColor: p.text.primary,
|
|
27
|
+
fontFamily: "Inter, Roboto, Arial, sans-serif"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
27
31
|
let idCounter = 0;
|
|
28
32
|
const DEBOUNCE_MS = 600;
|
|
29
33
|
const useStyles = makeStyles((theme) => ({
|
|
@@ -40,8 +44,8 @@ const useStyles = makeStyles((theme) => ({
|
|
|
40
44
|
padding: theme.spacing(1),
|
|
41
45
|
border: `1px solid ${theme.palette.divider}`,
|
|
42
46
|
borderRadius: theme.shape.borderRadius,
|
|
43
|
-
backgroundColor: "
|
|
44
|
-
color:
|
|
47
|
+
backgroundColor: "transparent",
|
|
48
|
+
color: theme.palette.text.primary,
|
|
45
49
|
cursor: "zoom-in",
|
|
46
50
|
overflow: "auto",
|
|
47
51
|
transition: "filter 0.3s ease, opacity 0.3s ease",
|
|
@@ -102,8 +106,8 @@ const useStyles = makeStyles((theme) => ({
|
|
|
102
106
|
minWidth: "100%",
|
|
103
107
|
padding: theme.spacing(2),
|
|
104
108
|
borderRadius: theme.shape.borderRadius,
|
|
105
|
-
backgroundColor: "
|
|
106
|
-
color:
|
|
109
|
+
backgroundColor: "transparent",
|
|
110
|
+
color: theme.palette.text.primary,
|
|
107
111
|
"& svg": {
|
|
108
112
|
width: "auto",
|
|
109
113
|
height: "auto",
|
|
@@ -124,6 +128,7 @@ const useStyles = makeStyles((theme) => ({
|
|
|
124
128
|
}));
|
|
125
129
|
function MermaidDiagram({ code }) {
|
|
126
130
|
const classes = useStyles();
|
|
131
|
+
const theme = useTheme();
|
|
127
132
|
const [svg, setSvg] = useState("");
|
|
128
133
|
const [rendering, setRendering] = useState(true);
|
|
129
134
|
const [error, setError] = useState("");
|
|
@@ -133,6 +138,7 @@ function MermaidDiagram({ code }) {
|
|
|
133
138
|
const errorTimerRef = useRef();
|
|
134
139
|
const lastRenderedCode = useRef("");
|
|
135
140
|
useEffect(() => {
|
|
141
|
+
let active = true;
|
|
136
142
|
const trimmed = code.trim();
|
|
137
143
|
const isFirst = !svg && !error;
|
|
138
144
|
const delay = isFirst ? 0 : DEBOUNCE_MS;
|
|
@@ -141,18 +147,20 @@ function MermaidDiagram({ code }) {
|
|
|
141
147
|
setShowError(false);
|
|
142
148
|
clearTimeout(timerRef.current);
|
|
143
149
|
clearTimeout(errorTimerRef.current);
|
|
150
|
+
const renderKey = `${theme.palette.type}
|
|
151
|
+
${trimmed}`;
|
|
144
152
|
timerRef.current = setTimeout(() => {
|
|
145
|
-
if (
|
|
153
|
+
if (renderKey === lastRenderedCode.current) {
|
|
146
154
|
setRendering(false);
|
|
147
155
|
return;
|
|
148
156
|
}
|
|
149
|
-
let active = true;
|
|
150
157
|
const id = `mermaid-${++idCounter}`;
|
|
158
|
+
mermaid.initialize(mermaidConfig(theme));
|
|
151
159
|
mermaid.render(id, trimmed).then(({ svg: rendered }) => {
|
|
152
160
|
if (active) {
|
|
153
161
|
setSvg(rendered);
|
|
154
162
|
setError("");
|
|
155
|
-
lastRenderedCode.current =
|
|
163
|
+
lastRenderedCode.current = renderKey;
|
|
156
164
|
setRendering(false);
|
|
157
165
|
}
|
|
158
166
|
}).catch((err) => {
|
|
@@ -168,15 +176,13 @@ function MermaidDiagram({ code }) {
|
|
|
168
176
|
}
|
|
169
177
|
}
|
|
170
178
|
});
|
|
171
|
-
return () => {
|
|
172
|
-
active = false;
|
|
173
|
-
};
|
|
174
179
|
}, delay);
|
|
175
180
|
return () => {
|
|
181
|
+
active = false;
|
|
176
182
|
clearTimeout(timerRef.current);
|
|
177
183
|
clearTimeout(errorTimerRef.current);
|
|
178
184
|
};
|
|
179
|
-
}, [code]);
|
|
185
|
+
}, [code, theme.palette.type]);
|
|
180
186
|
const handleKeyDown = (event) => {
|
|
181
187
|
if (event.key === "Enter" || event.key === " ") {
|
|
182
188
|
event.preventDefault();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MermaidDiagram.esm.js","sources":["../../../src/collapsible/surface/MermaidDiagram.tsx"],"sourcesContent":["import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport mermaid from 'mermaid';\nimport {\n CircularProgress,\n Dialog,\n IconButton,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\n\nmermaid.initialize({\n startOnLoad: false,\n theme: 'base',\n themeVariables: {\n background: '#ffffff',\n mainBkg: '#ffffff',\n primaryColor: '#f8fafc',\n primaryTextColor: '#111827',\n primaryBorderColor: '#334155',\n lineColor: '#475569',\n secondaryColor: '#eef2ff',\n tertiaryColor: '#f8fafc',\n clusterBkg: '#f8fafc',\n clusterBorder: '#cbd5e1',\n edgeLabelBackground: '#ffffff',\n fontFamily: 'Inter, Roboto, Arial, sans-serif',\n },\n suppressErrorRendering: true,\n});\n\nlet idCounter = 0;\nconst DEBOUNCE_MS = 600;\n\nconst useStyles = makeStyles(theme => ({\n wrapper: {\n position: 'relative',\n margin: theme.spacing(1.5, 0),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n minHeight: 80,\n },\n diagram: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor: '#ffffff',\n color: '#111827',\n cursor: 'zoom-in',\n overflow: 'auto',\n transition: 'filter 0.3s ease, opacity 0.3s ease',\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n '& svg': {\n maxWidth: '100%',\n height: 'auto',\n },\n },\n diagramLoading: {\n filter: 'blur(4px)',\n opacity: 0.4,\n pointerEvents: 'none',\n },\n overlay: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n zIndex: 1,\n // frosted glass\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(30, 30, 30, 0.6)'\n : 'rgba(255, 255, 255, 0.6)',\n backdropFilter: 'blur(8px)',\n borderRadius: theme.shape.borderRadius,\n },\n dialogPaper: {\n backgroundColor: theme.palette.background.default,\n },\n dialogBody: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: theme.spacing(7, 3, 3),\n overflow: 'auto',\n },\n closeButton: {\n position: 'fixed',\n top: theme.spacing(1.5),\n right: theme.spacing(1.5),\n zIndex: 1,\n backgroundColor: theme.palette.background.paper,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n fullscreenDiagram: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '100%',\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: '#ffffff',\n color: '#111827',\n '& svg': {\n width: 'auto',\n height: 'auto',\n maxWidth: 'calc(100vw - 48px)',\n maxHeight: 'calc(100vh - 96px)',\n },\n },\n error: {\n margin: theme.spacing(1.5, 0),\n padding: theme.spacing(1.5),\n overflow: 'auto',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontSize: theme.typography.caption.fontSize,\n },\n}));\n\n/**\n * Streaming-safe Mermaid renderer.\n *\n * Renders the first frame immediately, then debounces subsequent renders to\n * avoid thrashing while the diagram source is still streaming in. Keeps the\n * last good render on screen if an in-progress (incomplete) diagram fails to\n * parse, and only surfaces a parse error once the stream has settled. Clicking\n * the rendered diagram opens a fullscreen dialog.\n */\nexport function MermaidDiagram({ code }: { code: string }) {\n const classes = useStyles();\n const [svg, setSvg] = useState<string>('');\n const [rendering, setRendering] = useState(true);\n const [error, setError] = useState<string>('');\n const [showError, setShowError] = useState(false);\n const [open, setOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const errorTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastRenderedCode = useRef<string>('');\n\n useEffect(() => {\n const trimmed = code.trim();\n\n // If this is the first render (no svg yet), render immediately\n // Otherwise debounce to avoid rapid re-renders during streaming\n const isFirst = !svg && !error;\n const delay = isFirst ? 0 : DEBOUNCE_MS;\n\n setRendering(true);\n setError('');\n setShowError(false);\n\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n timerRef.current = setTimeout(() => {\n // Skip if code hasn't changed since last successful render\n if (trimmed === lastRenderedCode.current) {\n setRendering(false);\n return;\n }\n\n let active = true;\n const id = `mermaid-${++idCounter}`;\n\n mermaid\n .render(id, trimmed)\n .then(({ svg: rendered }) => {\n if (active) {\n setSvg(rendered);\n setError('');\n lastRenderedCode.current = trimmed;\n setRendering(false);\n }\n })\n .catch((err: Error) => {\n if (active) {\n // During streaming, don't replace a good render with an error\n // from incomplete code — just keep showing the loading state\n if (svg) {\n setRendering(false);\n } else {\n setError(err.message);\n setRendering(false);\n errorTimerRef.current = setTimeout(() => {\n setShowError(true);\n }, 1500);\n }\n }\n });\n\n return () => {\n active = false;\n };\n }, delay);\n\n return () => {\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [code]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n if (error && !svg && showError) {\n return (\n <pre className={classes.error}>\n <code>{code}</code>\n </pre>\n );\n }\n\n const isLoading = rendering && !!svg;\n const isInitialLoading = !svg && (rendering || (error && !showError));\n\n return (\n <>\n <div className={classes.wrapper}>\n {isLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {isInitialLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {svg && (\n <Tooltip title=\"Open diagram fullscreen\">\n <div\n className={`${classes.diagram} ${\n isLoading ? classes.diagramLoading : ''\n }`}\n dangerouslySetInnerHTML={{ __html: svg }}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Open Mermaid diagram fullscreen\"\n onClick={() => !isLoading && setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </Tooltip>\n )}\n </div>\n\n <Dialog\n fullScreen\n open={open}\n onClose={() => setOpen(false)}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <div className={classes.dialogBody}>\n <Tooltip title=\"Close\">\n <IconButton\n className={classes.closeButton}\n aria-label=\"Close fullscreen diagram\"\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <div\n className={classes.fullscreenDiagram}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </div>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MermaidDiagram.esm.js","sources":["../../../src/collapsible/surface/MermaidDiagram.tsx"],"sourcesContent":["import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport mermaid from 'mermaid';\nimport {\n CircularProgress,\n Dialog,\n IconButton,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles, useTheme, type Theme } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\n\n/**\n * Mermaid config derived from the active Backstage theme so diagrams follow\n * light/dark mode. The diagram background is transparent so it blends with the\n * conversation surface (no mismatched light box on a dark thread); nodes, text,\n * borders, and lines come from the palette.\n */\nfunction mermaidConfig(theme: Theme) {\n const p = theme.palette;\n return {\n startOnLoad: false,\n theme: 'base' as const,\n suppressErrorRendering: true,\n themeVariables: {\n background: 'transparent',\n mainBkg: p.background.paper,\n primaryColor: p.background.paper,\n primaryTextColor: p.text.primary,\n primaryBorderColor: p.divider,\n lineColor: p.text.secondary,\n secondaryColor: p.background.default,\n tertiaryColor: p.background.default,\n clusterBkg: p.background.default,\n clusterBorder: p.divider,\n edgeLabelBackground: p.background.default,\n textColor: p.text.primary,\n fontFamily: 'Inter, Roboto, Arial, sans-serif',\n },\n };\n}\n\nlet idCounter = 0;\nconst DEBOUNCE_MS = 600;\n\nconst useStyles = makeStyles(theme => ({\n wrapper: {\n position: 'relative',\n margin: theme.spacing(1.5, 0),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n minHeight: 80,\n },\n diagram: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n cursor: 'zoom-in',\n overflow: 'auto',\n transition: 'filter 0.3s ease, opacity 0.3s ease',\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n '& svg': {\n maxWidth: '100%',\n height: 'auto',\n },\n },\n diagramLoading: {\n filter: 'blur(4px)',\n opacity: 0.4,\n pointerEvents: 'none',\n },\n overlay: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n zIndex: 1,\n // frosted glass\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(30, 30, 30, 0.6)'\n : 'rgba(255, 255, 255, 0.6)',\n backdropFilter: 'blur(8px)',\n borderRadius: theme.shape.borderRadius,\n },\n dialogPaper: {\n backgroundColor: theme.palette.background.default,\n },\n dialogBody: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: theme.spacing(7, 3, 3),\n overflow: 'auto',\n },\n closeButton: {\n position: 'fixed',\n top: theme.spacing(1.5),\n right: theme.spacing(1.5),\n zIndex: 1,\n backgroundColor: theme.palette.background.paper,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n fullscreenDiagram: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '100%',\n padding: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: 'transparent',\n color: theme.palette.text.primary,\n '& svg': {\n width: 'auto',\n height: 'auto',\n maxWidth: 'calc(100vw - 48px)',\n maxHeight: 'calc(100vh - 96px)',\n },\n },\n error: {\n margin: theme.spacing(1.5, 0),\n padding: theme.spacing(1.5),\n overflow: 'auto',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[100],\n color: theme.palette.text.primary,\n fontSize: theme.typography.caption.fontSize,\n },\n}));\n\n/**\n * Streaming-safe Mermaid renderer.\n *\n * Renders the first frame immediately, then debounces subsequent renders to\n * avoid thrashing while the diagram source is still streaming in. Keeps the\n * last good render on screen if an in-progress (incomplete) diagram fails to\n * parse, and only surfaces a parse error once the stream has settled. Clicking\n * the rendered diagram opens a fullscreen dialog.\n */\nexport function MermaidDiagram({ code }: { code: string }) {\n const classes = useStyles();\n const theme = useTheme();\n const [svg, setSvg] = useState<string>('');\n const [rendering, setRendering] = useState(true);\n const [error, setError] = useState<string>('');\n const [showError, setShowError] = useState(false);\n const [open, setOpen] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const errorTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const lastRenderedCode = useRef<string>('');\n\n useEffect(() => {\n // Cleared by the effect cleanup so an in-flight render can't setState after\n // unmount / re-run.\n let active = true;\n const trimmed = code.trim();\n\n // If this is the first render (no svg yet), render immediately\n // Otherwise debounce to avoid rapid re-renders during streaming\n const isFirst = !svg && !error;\n const delay = isFirst ? 0 : DEBOUNCE_MS;\n\n setRendering(true);\n setError('');\n setShowError(false);\n\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n // Re-render when either the code or the theme (light/dark) changes.\n const renderKey = `${theme.palette.type}\\n${trimmed}`;\n timerRef.current = setTimeout(() => {\n // Skip if nothing relevant changed since the last successful render.\n if (renderKey === lastRenderedCode.current) {\n setRendering(false);\n return;\n }\n\n const id = `mermaid-${++idCounter}`;\n\n // Apply the current Backstage theme before rendering.\n mermaid.initialize(mermaidConfig(theme));\n mermaid\n .render(id, trimmed)\n .then(({ svg: rendered }) => {\n if (active) {\n setSvg(rendered);\n setError('');\n lastRenderedCode.current = renderKey;\n setRendering(false);\n }\n })\n .catch((err: Error) => {\n if (active) {\n // During streaming, don't replace a good render with an error\n // from incomplete code — just keep showing the loading state\n if (svg) {\n setRendering(false);\n } else {\n setError(err.message);\n setRendering(false);\n errorTimerRef.current = setTimeout(() => {\n setShowError(true);\n }, 1500);\n }\n }\n });\n }, delay);\n\n return () => {\n active = false;\n clearTimeout(timerRef.current);\n clearTimeout(errorTimerRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [code, theme.palette.type]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n if (error && !svg && showError) {\n return (\n <pre className={classes.error}>\n <code>{code}</code>\n </pre>\n );\n }\n\n const isLoading = rendering && !!svg;\n const isInitialLoading = !svg && (rendering || (error && !showError));\n\n return (\n <>\n <div className={classes.wrapper}>\n {isLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {isInitialLoading && (\n <div className={classes.overlay}>\n <CircularProgress size={24} />\n <Typography variant=\"caption\" color=\"textSecondary\">\n Rendering diagram…\n </Typography>\n </div>\n )}\n\n {svg && (\n <Tooltip title=\"Open diagram fullscreen\">\n <div\n className={`${classes.diagram} ${\n isLoading ? classes.diagramLoading : ''\n }`}\n dangerouslySetInnerHTML={{ __html: svg }}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Open Mermaid diagram fullscreen\"\n onClick={() => !isLoading && setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n </Tooltip>\n )}\n </div>\n\n <Dialog\n fullScreen\n open={open}\n onClose={() => setOpen(false)}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <div className={classes.dialogBody}>\n <Tooltip title=\"Close\">\n <IconButton\n className={classes.closeButton}\n aria-label=\"Close fullscreen diagram\"\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </Tooltip>\n <div\n className={classes.fullscreenDiagram}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n </div>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drewswiredin/backstage-plugin-assistants",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Frontend plugin — AI Assistants for Backstage.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"@backstage/core-plugin-api": "^1.12.0",
|
|
67
67
|
"@backstage/frontend-plugin-api": "^0.17.0",
|
|
68
68
|
"@backstage/ui": "^0.15.0",
|
|
69
|
-
"@drewswiredin/backstage-plugin-assistants-common": "0.5.
|
|
69
|
+
"@drewswiredin/backstage-plugin-assistants-common": "0.5.2",
|
|
70
70
|
"@material-ui/core": "^4.12.4",
|
|
71
71
|
"@material-ui/icons": "^4.11.3",
|
|
72
72
|
"@remixicon/react": "^4.5.0",
|