@tduniec/plugin-template-designer 0.4.4 → 0.4.6

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,3 +1,18 @@
1
+ ## [0.4.6](https://github.com/tduniec/template-designer-plugin/compare/template-designer-v0.4.5...template-designer-v0.4.6) (2026-01-30)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **template-designer:** adding template-designer-pro banner ([#66](https://github.com/tduniec/template-designer-plugin/issues/66)) ([19a39af](https://github.com/tduniec/template-designer-plugin/commit/19a39af2a52312c52d044e5520dec2860335a01d))
7
+
8
+ ## [0.4.5](https://github.com/tduniec/template-designer-plugin/compare/template-designer-v0.4.4...template-designer-v0.4.5) (2026-01-25)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **template-designer-foundation:** extedning form nodes for changes ([#63](https://github.com/tduniec/template-designer-plugin/issues/63)) ([d9585b7](https://github.com/tduniec/template-designer-plugin/commit/d9585b774bb5e6029fa158c7969f0d7f67f6dd32))
14
+ * **template-designer-foundation:** strip empty coditionals ([#64](https://github.com/tduniec/template-designer-plugin/issues/64)) ([77e3931](https://github.com/tduniec/template-designer-plugin/commit/77e3931cb7519c6b33b4b65fa75a2dc43d8a8a9d))
15
+
1
16
  ## [0.4.4](https://github.com/tduniec/template-designer-plugin/compare/template-designer-v0.4.3...template-designer-v0.4.4) (2026-01-12)
2
17
 
3
18
 
@@ -2,6 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useCallback, useMemo } from 'react';
3
3
  import { Page, Content, ContentHeader, SupportButton } from '@backstage/core-components';
4
4
  import { useTemplateState, useFieldEditor, TemplateWorkspace, ParametersNode, TemplateLanding, FieldEditorDialog } from '@tduniec/plugin-template-designer-foundation';
5
+ import { ProPromoBanner } from './components/ProPromoBanner.esm.js';
5
6
 
6
7
  const TemplateDesigner = ({
7
8
  FieldEditorComponent
@@ -115,9 +116,26 @@ const TemplateDesigner = ({
115
116
  ]
116
117
  );
117
118
  const ResolvedFieldEditor = FieldEditorComponent ?? FieldEditorDialog;
119
+ const showProPromo = Boolean(templateObject);
118
120
  return /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
119
121
  /* @__PURE__ */ jsxs(Content, { children: [
120
- /* @__PURE__ */ jsx(ContentHeader, { title: "Template Designer", children: /* @__PURE__ */ jsx(SupportButton, { children: "Template Designer turns blank Backstage YAML into a storyboard-like canvas, guiding anyone through drag-and-drop scaffolder authoring before ever touching code. Rally non-experts, broadcast best practices, and accelerate template launches directly inside Backstage." }) }),
122
+ /* @__PURE__ */ jsx(ContentHeader, { title: "Template Designer", children: /* @__PURE__ */ jsxs(SupportButton, { children: [
123
+ "Template Designer turns blank Backstage YAML into a storyboard-like canvas, guiding anyone through drag-and-drop scaffolder authoring before ever touching code. Rally non-experts, broadcast best practices, and accelerate template launches directly inside Backstage.",
124
+ /* @__PURE__ */ jsx("br", {}),
125
+ /* @__PURE__ */ jsx("strong", { children: "Try PRO:" }),
126
+ " unlock playground, dry-run, and advanced parameter nodes.",
127
+ " ",
128
+ /* @__PURE__ */ jsx(
129
+ "a",
130
+ {
131
+ href: "https://dx-labs.com/template-designer",
132
+ target: "_blank",
133
+ rel: "noopener noreferrer",
134
+ children: "Explore Template Designer PRO"
135
+ }
136
+ )
137
+ ] }) }),
138
+ /* @__PURE__ */ jsx(ProPromoBanner, { show: showProPromo }),
121
139
  /* @__PURE__ */ jsx(
122
140
  "input",
123
141
  {
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateDesigner.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateDesigner.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport {\n Content,\n ContentHeader,\n Page,\n SupportButton,\n} from \"@backstage/core-components\";\nimport type { ComponentType } from \"react\";\nimport {\n FieldEditorDialog,\n FieldEditorDialogProps,\n TemplateLanding,\n TemplateWorkspace,\n type DesignerFlowProps,\n ParametersNode,\n useFieldEditor,\n} from \"@tduniec/plugin-template-designer-foundation\";\nimport { useTemplateState } from \"@tduniec/plugin-template-designer-foundation\";\n\nexport type TemplateDesignerProps = {\n FieldEditorComponent?: ComponentType<FieldEditorDialogProps>;\n};\n\nexport const TemplateDesigner = ({\n FieldEditorComponent,\n}: TemplateDesignerProps) => {\n const [showYaml, setShowYaml] = useState(true);\n const {\n templateObject,\n templateYaml,\n yamlError,\n loadError,\n templateSteps,\n templateParameters,\n templateOutput,\n templateSource,\n isReloading,\n isSaving,\n isSyncing,\n fileInputRef,\n handleStartSampleTemplate,\n handleTemplateFileSelected,\n handleOpenTemplatePicker,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n availableTemplates,\n selectCatalogTemplate,\n } = useTemplateState();\n const { editorState, interactionRootRef, closeEditor, applyEditorValue } =\n useFieldEditor();\n\n const handleToggleYaml = useCallback(() => {\n setShowYaml((prev) => !prev);\n }, []);\n\n const activeTemplateLabel = templateSource?.label;\n\n let reloadButtonLabel = \"Reset sample\";\n if (templateSource?.type === \"file\") {\n reloadButtonLabel = isReloading ? \"Reloading...\" : \"Reload file\";\n } else if (templateSource?.type === \"catalog\") {\n reloadButtonLabel = \"Reload template\";\n }\n\n let saveButtonLabel =\n templateSource?.type === \"file\" ? \"Save\" : \"Save as file\";\n if (isSaving) {\n saveButtonLabel = \"Saving...\";\n }\n\n const workspace = useMemo(\n () =>\n templateObject ? (\n <TemplateWorkspace\n templateSteps={templateSteps}\n templateParameters={templateParameters}\n templateOutput={templateOutput}\n templateYaml={templateYaml}\n yamlError={yamlError}\n loadError={loadError}\n showYaml={showYaml}\n onToggleYaml={handleToggleYaml}\n onYamlChange={handleYamlChange}\n onStepsChange={handleStepsChange}\n onParametersChange={handleParametersChange}\n onOutputChange={handleOutputChange}\n onReload={handleReloadFromFile}\n onSave={handleSaveTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n activeTemplateLabel={activeTemplateLabel}\n reloadButtonLabel={reloadButtonLabel}\n saveButtonLabel={saveButtonLabel}\n isReloading={isReloading}\n isSaving={isSaving}\n isSyncing={isSyncing}\n headerActionsSlot={null}\n flowTopSlot={null}\n parametersNodeComponent={\n ParametersNode as DesignerFlowProps[\"parametersNodeComponent\"]\n }\n />\n ) : (\n <TemplateLanding\n loadError={loadError}\n onStartSampleTemplate={handleStartSampleTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n availableTemplates={availableTemplates}\n selectCatalogTemplate={selectCatalogTemplate}\n />\n ),\n [\n templateObject,\n templateSteps,\n templateParameters,\n templateOutput,\n templateYaml,\n yamlError,\n loadError,\n showYaml,\n handleToggleYaml,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n handleOpenTemplatePicker,\n activeTemplateLabel,\n reloadButtonLabel,\n saveButtonLabel,\n isReloading,\n isSaving,\n isSyncing,\n handleStartSampleTemplate,\n availableTemplates,\n selectCatalogTemplate,\n ]\n );\n\n const ResolvedFieldEditor = FieldEditorComponent ?? FieldEditorDialog;\n\n return (\n <Page themeId=\"tool\">\n <Content>\n <ContentHeader title=\"Template Designer\">\n <SupportButton>\n Template Designer turns blank Backstage YAML into a storyboard-like\n canvas, guiding anyone through drag-and-drop scaffolder authoring\n before ever touching code. Rally non-experts, broadcast best\n practices, and accelerate template launches directly inside\n Backstage.\n </SupportButton>\n </ContentHeader>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".yaml,.yml,.json\"\n style={{ display: \"none\" }}\n onChange={handleTemplateFileSelected}\n />\n\n <div ref={interactionRootRef}>{workspace}</div>\n </Content>\n <ResolvedFieldEditor\n open={Boolean(editorState)}\n label={editorState?.label}\n value={editorState?.initialValue ?? \"\"}\n onClose={closeEditor}\n onApply={applyEditorValue}\n />\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateDesigner.esm.js","sources":["../../../src/components/TemplateDesigner/TemplateDesigner.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport {\n Content,\n ContentHeader,\n Page,\n SupportButton,\n} from \"@backstage/core-components\";\nimport type { ComponentType } from \"react\";\nimport {\n FieldEditorDialog,\n FieldEditorDialogProps,\n TemplateLanding,\n TemplateWorkspace,\n type DesignerFlowProps,\n ParametersNode,\n useFieldEditor,\n} from \"@tduniec/plugin-template-designer-foundation\";\nimport { useTemplateState } from \"@tduniec/plugin-template-designer-foundation\";\nimport { ProPromoBanner } from \"./components/ProPromoBanner\";\n\nexport type TemplateDesignerProps = {\n FieldEditorComponent?: ComponentType<FieldEditorDialogProps>;\n};\n\nexport const TemplateDesigner = ({\n FieldEditorComponent,\n}: TemplateDesignerProps) => {\n const [showYaml, setShowYaml] = useState(true);\n const {\n templateObject,\n templateYaml,\n yamlError,\n loadError,\n templateSteps,\n templateParameters,\n templateOutput,\n templateSource,\n isReloading,\n isSaving,\n isSyncing,\n fileInputRef,\n handleStartSampleTemplate,\n handleTemplateFileSelected,\n handleOpenTemplatePicker,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n availableTemplates,\n selectCatalogTemplate,\n } = useTemplateState();\n const { editorState, interactionRootRef, closeEditor, applyEditorValue } =\n useFieldEditor();\n\n const handleToggleYaml = useCallback(() => {\n setShowYaml((prev) => !prev);\n }, []);\n\n const activeTemplateLabel = templateSource?.label;\n\n let reloadButtonLabel = \"Reset sample\";\n if (templateSource?.type === \"file\") {\n reloadButtonLabel = isReloading ? \"Reloading...\" : \"Reload file\";\n } else if (templateSource?.type === \"catalog\") {\n reloadButtonLabel = \"Reload template\";\n }\n\n let saveButtonLabel =\n templateSource?.type === \"file\" ? \"Save\" : \"Save as file\";\n if (isSaving) {\n saveButtonLabel = \"Saving...\";\n }\n\n const workspace = useMemo(\n () =>\n templateObject ? (\n <TemplateWorkspace\n templateSteps={templateSteps}\n templateParameters={templateParameters}\n templateOutput={templateOutput}\n templateYaml={templateYaml}\n yamlError={yamlError}\n loadError={loadError}\n showYaml={showYaml}\n onToggleYaml={handleToggleYaml}\n onYamlChange={handleYamlChange}\n onStepsChange={handleStepsChange}\n onParametersChange={handleParametersChange}\n onOutputChange={handleOutputChange}\n onReload={handleReloadFromFile}\n onSave={handleSaveTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n activeTemplateLabel={activeTemplateLabel}\n reloadButtonLabel={reloadButtonLabel}\n saveButtonLabel={saveButtonLabel}\n isReloading={isReloading}\n isSaving={isSaving}\n isSyncing={isSyncing}\n headerActionsSlot={null}\n flowTopSlot={null}\n parametersNodeComponent={\n ParametersNode as DesignerFlowProps[\"parametersNodeComponent\"]\n }\n />\n ) : (\n <TemplateLanding\n loadError={loadError}\n onStartSampleTemplate={handleStartSampleTemplate}\n onOpenTemplatePicker={handleOpenTemplatePicker}\n availableTemplates={availableTemplates}\n selectCatalogTemplate={selectCatalogTemplate}\n />\n ),\n [\n templateObject,\n templateSteps,\n templateParameters,\n templateOutput,\n templateYaml,\n yamlError,\n loadError,\n showYaml,\n handleToggleYaml,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n handleOpenTemplatePicker,\n activeTemplateLabel,\n reloadButtonLabel,\n saveButtonLabel,\n isReloading,\n isSaving,\n isSyncing,\n handleStartSampleTemplate,\n availableTemplates,\n selectCatalogTemplate,\n ]\n );\n\n const ResolvedFieldEditor = FieldEditorComponent ?? FieldEditorDialog;\n const showProPromo = Boolean(templateObject);\n\n return (\n <Page themeId=\"tool\">\n <Content>\n <ContentHeader title=\"Template Designer\">\n <SupportButton>\n Template Designer turns blank Backstage YAML into a storyboard-like\n canvas, guiding anyone through drag-and-drop scaffolder authoring\n before ever touching code. Rally non-experts, broadcast best\n practices, and accelerate template launches directly inside\n Backstage.\n <br />\n <strong>Try PRO:</strong> unlock playground, dry-run, and advanced\n parameter nodes.{\" \"}\n <a\n href=\"https://dx-labs.com/template-designer\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Explore Template Designer PRO\n </a>\n </SupportButton>\n </ContentHeader>\n\n <ProPromoBanner show={showProPromo} />\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".yaml,.yml,.json\"\n style={{ display: \"none\" }}\n onChange={handleTemplateFileSelected}\n />\n\n <div ref={interactionRootRef}>{workspace}</div>\n </Content>\n <ResolvedFieldEditor\n open={Boolean(editorState)}\n label={editorState?.label}\n value={editorState?.initialValue ?? \"\"}\n onClose={closeEditor}\n onApply={applyEditorValue}\n />\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { Box, Typography, IconButton, Button } from '@material-ui/core';
4
+ import CloseIcon from '@material-ui/icons/Close';
5
+
6
+ const STORAGE_KEY = "td-pro-promo-dismissed";
7
+ const PRO_LINK = "https://dx-labs.com/template-designer";
8
+ const ProPromoBanner = ({ show }) => {
9
+ const [visible, setVisible] = useState(false);
10
+ const [anim, setAnim] = useState("idle");
11
+ useEffect(() => {
12
+ if (!show) {
13
+ setVisible(false);
14
+ setAnim("idle");
15
+ return void 0;
16
+ }
17
+ const dismissed = window.sessionStorage.getItem(STORAGE_KEY);
18
+ if (dismissed) return void 0;
19
+ const t = window.setTimeout(() => {
20
+ setVisible(true);
21
+ window.requestAnimationFrame(() => setAnim("enter"));
22
+ }, 3e3);
23
+ return () => {
24
+ window.clearTimeout(t);
25
+ };
26
+ }, [show]);
27
+ const handleClose = () => {
28
+ window.sessionStorage.setItem(STORAGE_KEY, "true");
29
+ setAnim("hide");
30
+ window.setTimeout(() => setVisible(false), 220);
31
+ };
32
+ const style = useMemo(() => {
33
+ const base = {
34
+ borderRadius: 14,
35
+ padding: 16,
36
+ background: "linear-gradient(120deg, rgba(79,70,229,0.14), rgba(16,185,129,0.18))",
37
+ border: "1px solid rgba(79,70,229,0.35)",
38
+ boxShadow: "0 10px 28px rgba(0,0,0,0.08)",
39
+ maxWidth: "min(720px, 50vw)",
40
+ width: "100%",
41
+ transition: "opacity 200ms ease, transform 200ms ease",
42
+ opacity: anim === "enter" ? 1 : 0,
43
+ transform: anim === "enter" ? "translateY(0)" : "translateY(10px)"
44
+ };
45
+ if (anim === "hide") {
46
+ return { ...base, opacity: 0, transform: "translateY(-6px)" };
47
+ }
48
+ return base;
49
+ }, [anim]);
50
+ if (!visible) return null;
51
+ return /* @__PURE__ */ jsx(Box, { mt: 1, mb: 2, display: "flex", justifyContent: "center", children: /* @__PURE__ */ jsxs(Box, { style, children: [
52
+ /* @__PURE__ */ jsxs(
53
+ Box,
54
+ {
55
+ display: "flex",
56
+ alignItems: "flex-start",
57
+ justifyContent: "space-between",
58
+ children: [
59
+ /* @__PURE__ */ jsxs(Box, { pr: 2, children: [
60
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", style: { fontWeight: 700 }, children: "Discover Template Designer PRO" }),
61
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Unlock playground, dry-run, advanced parameter nodes, and more to ship better templates faster." })
62
+ ] }),
63
+ /* @__PURE__ */ jsx(IconButton, { "aria-label": "Zamknij", onClick: handleClose, size: "small", children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" }) })
64
+ ]
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsxs(Box, { mt: 2, display: "flex", alignItems: "center", style: { gap: 12 }, children: [
68
+ /* @__PURE__ */ jsx(
69
+ Button,
70
+ {
71
+ variant: "contained",
72
+ color: "primary",
73
+ href: PRO_LINK,
74
+ target: "_blank",
75
+ rel: "noopener noreferrer",
76
+ size: "small",
77
+ children: "Explore PRO"
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsx(
81
+ Button,
82
+ {
83
+ variant: "text",
84
+ color: "primary",
85
+ size: "small",
86
+ onClick: handleClose,
87
+ children: "Maybe later"
88
+ }
89
+ )
90
+ ] })
91
+ ] }) });
92
+ };
93
+
94
+ export { ProPromoBanner };
95
+ //# sourceMappingURL=ProPromoBanner.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProPromoBanner.esm.js","sources":["../../../../src/components/TemplateDesigner/components/ProPromoBanner.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Box, Button, IconButton, Typography } from \"@material-ui/core\";\nimport CloseIcon from \"@material-ui/icons/Close\";\n\nconst STORAGE_KEY = \"td-pro-promo-dismissed\";\nconst PRO_LINK = \"https://dx-labs.com/template-designer\";\n\ntype Props = { show: boolean };\n\nexport const ProPromoBanner = ({ show }: Props) => {\n const [visible, setVisible] = useState(false);\n const [anim, setAnim] = useState<\"idle\" | \"enter\" | \"hide\">(\"idle\");\n\n useEffect(() => {\n if (!show) {\n setVisible(false);\n setAnim(\"idle\");\n return undefined;\n }\n const dismissed = window.sessionStorage.getItem(STORAGE_KEY);\n if (dismissed) return undefined;\n const t = window.setTimeout(() => {\n setVisible(true);\n window.requestAnimationFrame(() => setAnim(\"enter\"));\n }, 3000); // 3s delay\n return () => {\n window.clearTimeout(t);\n };\n }, [show]);\n\n const handleClose = () => {\n window.sessionStorage.setItem(STORAGE_KEY, \"true\");\n setAnim(\"hide\");\n window.setTimeout(() => setVisible(false), 220);\n };\n\n const style = useMemo(() => {\n const base = {\n borderRadius: 14,\n padding: 16,\n background:\n \"linear-gradient(120deg, rgba(79,70,229,0.14), rgba(16,185,129,0.18))\",\n border: \"1px solid rgba(79,70,229,0.35)\",\n boxShadow: \"0 10px 28px rgba(0,0,0,0.08)\",\n maxWidth: \"min(720px, 50vw)\",\n width: \"100%\",\n transition: \"opacity 200ms ease, transform 200ms ease\",\n opacity: anim === \"enter\" ? 1 : 0,\n transform: anim === \"enter\" ? \"translateY(0)\" : \"translateY(10px)\",\n } as const;\n if (anim === \"hide\") {\n return { ...base, opacity: 0, transform: \"translateY(-6px)\" };\n }\n return base;\n }, [anim]);\n\n if (!visible) return null;\n\n return (\n <Box mt={1} mb={2} display=\"flex\" justifyContent=\"center\">\n <Box style={style}>\n <Box\n display=\"flex\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n >\n <Box pr={2}>\n <Typography variant=\"subtitle1\" style={{ fontWeight: 700 }}>\n Discover Template Designer PRO\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Unlock playground, dry-run, advanced parameter nodes, and more to\n ship better templates faster.\n </Typography>\n </Box>\n <IconButton aria-label=\"Zamknij\" onClick={handleClose} size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n <Box mt={2} display=\"flex\" alignItems=\"center\" style={{ gap: 12 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href={PRO_LINK}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size=\"small\"\n >\n Explore PRO\n </Button>\n <Button\n variant=\"text\"\n color=\"primary\"\n size=\"small\"\n onClick={handleClose}\n >\n Maybe later\n </Button>\n </Box>\n </Box>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  var name = "@tduniec/plugin-template-designer";
2
- var version = "0.4.3";
2
+ var version = "0.4.5";
3
3
  var license = "Apache-2.0";
4
4
  var main = "src/index.ts";
5
5
  var types = "src/index.ts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tduniec/plugin-template-designer",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",
@@ -75,7 +75,7 @@
75
75
  "@material-ui/core": "^4.12.4",
76
76
  "@material-ui/icons": "^4.11.3",
77
77
  "@material-ui/lab": "^4.0.0-alpha.61",
78
- "@tduniec/plugin-template-designer-foundation": "^0.1.7",
78
+ "@tduniec/plugin-template-designer-foundation": "^0.1.10",
79
79
  "@xyflow/react": "^12.8.6",
80
80
  "react-router-dom": "^6.23.0",
81
81
  "react-use": "^17.2.4"