@red-hat-developer-hub/backstage-plugin-dynamic-home-page 1.3.2 → 1.4.0
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 +13 -0
- package/dist/components/EntitySection/EntityCard.esm.js +89 -0
- package/dist/components/EntitySection/EntityCard.esm.js.map +1 -0
- package/dist/components/EntitySection/EntitySection.esm.js +202 -0
- package/dist/components/EntitySection/EntitySection.esm.js.map +1 -0
- package/dist/components/EntitySection/TagList.esm.js +68 -0
- package/dist/components/EntitySection/TagList.esm.js.map +1 -0
- package/dist/components/EntitySection/ViewMoreLink.esm.js +10 -0
- package/dist/components/EntitySection/ViewMoreLink.esm.js.map +1 -0
- package/dist/components/EntitySection/index.esm.js +2 -0
- package/dist/components/EntitySection/index.esm.js.map +1 -0
- package/dist/components/HomePage.esm.js +1 -1
- package/dist/components/HomePage.esm.js.map +1 -1
- package/dist/components/OnboardingSection/OnboardingCard.esm.js +66 -0
- package/dist/components/OnboardingSection/OnboardingCard.esm.js.map +1 -0
- package/dist/components/OnboardingSection/OnboardingSection.esm.js +131 -0
- package/dist/components/OnboardingSection/OnboardingSection.esm.js.map +1 -0
- package/dist/components/OnboardingSection/index.esm.js +2 -0
- package/dist/components/OnboardingSection/index.esm.js.map +1 -0
- package/dist/components/TemplateSection/TemplateCard.esm.js +94 -0
- package/dist/components/TemplateSection/TemplateCard.esm.js.map +1 -0
- package/dist/components/TemplateSection/TemplateSection.esm.js +132 -0
- package/dist/components/TemplateSection/TemplateSection.esm.js.map +1 -0
- package/dist/components/TemplateSection/ViewMoreLink.esm.js +10 -0
- package/dist/components/TemplateSection/ViewMoreLink.esm.js.map +1 -0
- package/dist/components/TemplateSection/index.esm.js +2 -0
- package/dist/components/TemplateSection/index.esm.js.map +1 -0
- package/dist/hooks/useEntities.esm.js +23 -0
- package/dist/hooks/useEntities.esm.js.map +1 -0
- package/dist/hooks/useGreeting.esm.js +32 -0
- package/dist/hooks/useGreeting.esm.js.map +1 -0
- package/dist/images/homepage-entities-1.svg +186 -0
- package/dist/images/homepage-illustration-dark.svg +1 -0
- package/dist/images/homepage-illustration-light.svg +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +26 -2
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/constants.esm.js +47 -0
- package/dist/utils/constants.esm.js.map +1 -0
- package/dist/utils/utils.esm.js +23 -0
- package/dist/utils/utils.esm.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useUserProfile } from '@backstage/plugin-user-settings';
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
5
|
+
import Grid from '@mui/material/Grid';
|
|
6
|
+
import Box from '@mui/material/Box';
|
|
7
|
+
import Typography from '@mui/material/Typography';
|
|
8
|
+
import Card from '@mui/material/Card';
|
|
9
|
+
import { useTheme } from '@mui/material/styles';
|
|
10
|
+
import OnboardingCard from './OnboardingCard.esm.js';
|
|
11
|
+
import HomePageIllustrationDark from '../../images/homepage-illustration-dark.svg';
|
|
12
|
+
import HomePageIllustrationLight from '../../images/homepage-illustration-light.svg';
|
|
13
|
+
import { LEARNING_SECTION_ITEMS } from '../../utils/constants.esm.js';
|
|
14
|
+
import useGreeting from '../../hooks/useGreeting.esm.js';
|
|
15
|
+
|
|
16
|
+
const OnboardingSection = () => {
|
|
17
|
+
const [user, setUser] = React.useState();
|
|
18
|
+
const theme = useTheme();
|
|
19
|
+
const isDarkMode = theme.palette.mode === "dark";
|
|
20
|
+
const greeting = useGreeting();
|
|
21
|
+
const {
|
|
22
|
+
displayName,
|
|
23
|
+
backstageIdentity,
|
|
24
|
+
loading: profileLoading
|
|
25
|
+
} = useUserProfile();
|
|
26
|
+
const catalogApi = useApi(catalogApiRef);
|
|
27
|
+
React.useEffect(() => {
|
|
28
|
+
const fetchUserEntity = async () => {
|
|
29
|
+
if (!backstageIdentity?.userEntityRef) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const userEntity = await catalogApi.getEntityByRef(
|
|
34
|
+
backstageIdentity.userEntityRef
|
|
35
|
+
);
|
|
36
|
+
setUser(
|
|
37
|
+
userEntity?.spec?.profile?.displayName ?? userEntity?.metadata?.title
|
|
38
|
+
);
|
|
39
|
+
} catch (_err) {
|
|
40
|
+
setUser(null);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
fetchUserEntity();
|
|
44
|
+
}, [backstageIdentity, catalogApi]);
|
|
45
|
+
const profileDisplayName = () => {
|
|
46
|
+
const name = user ?? displayName;
|
|
47
|
+
const regex = /^[^:/]+:[^/]+\/[^/]+$/;
|
|
48
|
+
if (regex.test(name)) {
|
|
49
|
+
return name.charAt(name.indexOf("/") + 1).toLocaleUpperCase("en-US").concat(name.substring(name.indexOf("/") + 2));
|
|
50
|
+
}
|
|
51
|
+
return name;
|
|
52
|
+
};
|
|
53
|
+
const content = /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Grid, { container: true, margin: "auto" }, /* @__PURE__ */ React.createElement(
|
|
54
|
+
Grid,
|
|
55
|
+
{
|
|
56
|
+
item: true,
|
|
57
|
+
xs: 12,
|
|
58
|
+
md: 6,
|
|
59
|
+
lg: 3,
|
|
60
|
+
display: "flex",
|
|
61
|
+
justifyContent: "left",
|
|
62
|
+
alignItems: "center"
|
|
63
|
+
},
|
|
64
|
+
/* @__PURE__ */ React.createElement(
|
|
65
|
+
Box,
|
|
66
|
+
{
|
|
67
|
+
component: "img",
|
|
68
|
+
src: isDarkMode ? HomePageIllustrationDark : HomePageIllustrationLight,
|
|
69
|
+
alt: "",
|
|
70
|
+
sx: {
|
|
71
|
+
width: "clamp(200px, 20vw, 264px)"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
), LEARNING_SECTION_ITEMS.map((item) => /* @__PURE__ */ React.createElement(
|
|
76
|
+
Grid,
|
|
77
|
+
{
|
|
78
|
+
item: true,
|
|
79
|
+
xs: 12,
|
|
80
|
+
md: 6,
|
|
81
|
+
lg: 3,
|
|
82
|
+
key: item.title,
|
|
83
|
+
display: "flex",
|
|
84
|
+
justifyContent: "left",
|
|
85
|
+
alignItems: "center"
|
|
86
|
+
},
|
|
87
|
+
/* @__PURE__ */ React.createElement(
|
|
88
|
+
OnboardingCard,
|
|
89
|
+
{
|
|
90
|
+
title: item.title,
|
|
91
|
+
description: item.description,
|
|
92
|
+
buttonText: item.buttonText,
|
|
93
|
+
buttonLink: item.buttonLink,
|
|
94
|
+
target: item.target,
|
|
95
|
+
ariaLabel: item.ariaLabel
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
))));
|
|
99
|
+
return /* @__PURE__ */ React.createElement(
|
|
100
|
+
Card,
|
|
101
|
+
{
|
|
102
|
+
elevation: 0,
|
|
103
|
+
sx: {
|
|
104
|
+
padding: "24px",
|
|
105
|
+
border: (muiTheme) => `1px solid ${muiTheme.palette.grey[300]}`,
|
|
106
|
+
overflow: "auto",
|
|
107
|
+
"$::-webkit-scrollbar": {
|
|
108
|
+
display: "none"
|
|
109
|
+
},
|
|
110
|
+
scrollbarWidth: "none"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
!profileLoading && /* @__PURE__ */ React.createElement(
|
|
114
|
+
Typography,
|
|
115
|
+
{
|
|
116
|
+
variant: "h3",
|
|
117
|
+
sx: {
|
|
118
|
+
display: "flex",
|
|
119
|
+
alignItems: "center",
|
|
120
|
+
fontWeight: "500",
|
|
121
|
+
fontSize: "1.5rem"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
`${greeting} ${profileDisplayName() || "Guest"}!`
|
|
125
|
+
),
|
|
126
|
+
content
|
|
127
|
+
);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { OnboardingSection };
|
|
131
|
+
//# sourceMappingURL=OnboardingSection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnboardingSection.esm.js","sources":["../../../src/components/OnboardingSection/OnboardingSection.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport React from 'react';\n\nimport { useUserProfile } from '@backstage/plugin-user-settings';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { UserEntity } from '@backstage/catalog-model';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport Grid from '@mui/material/Grid';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Card from '@mui/material/Card';\nimport { useTheme } from '@mui/material/styles';\n\nimport OnboardingCard from './OnboardingCard';\nimport HomePageIllustrationDark from '../../images/homepage-illustration-dark.svg';\nimport HomePageIllustrationLight from '../../images/homepage-illustration-light.svg';\nimport { LEARNING_SECTION_ITEMS } from '../../utils/constants';\nimport useGreeting from '../../hooks/useGreeting';\n\nexport const OnboardingSection = () => {\n const [user, setUser] = React.useState<string | null>();\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n const greeting = useGreeting();\n const {\n displayName,\n backstageIdentity,\n loading: profileLoading,\n } = useUserProfile();\n const catalogApi = useApi(catalogApiRef);\n\n React.useEffect(() => {\n const fetchUserEntity = async () => {\n if (!backstageIdentity?.userEntityRef) {\n return;\n }\n try {\n const userEntity = (await catalogApi.getEntityByRef(\n backstageIdentity.userEntityRef,\n )) as unknown as UserEntity;\n setUser(\n userEntity?.spec?.profile?.displayName ?? userEntity?.metadata?.title,\n );\n } catch (_err) {\n setUser(null);\n }\n };\n\n fetchUserEntity();\n }, [backstageIdentity, catalogApi]);\n\n const profileDisplayName = () => {\n const name = user ?? displayName;\n const regex = /^[^:/]+:[^/]+\\/[^/]+$/;\n if (regex.test(name)) {\n return name\n .charAt(name.indexOf('/') + 1)\n .toLocaleUpperCase('en-US')\n .concat(name.substring(name.indexOf('/') + 2));\n }\n return name;\n };\n\n const content = (\n <Box>\n <Grid container margin=\"auto\">\n <Grid\n item\n xs={12}\n md={6}\n lg={3}\n display=\"flex\"\n justifyContent=\"left\"\n alignItems=\"center\"\n >\n <Box\n component=\"img\"\n src={\n isDarkMode ? HomePageIllustrationDark : HomePageIllustrationLight\n }\n alt=\"\"\n sx={{\n width: 'clamp(200px, 20vw, 264px)',\n }}\n />\n </Grid>\n {LEARNING_SECTION_ITEMS.map(item => (\n <Grid\n item\n xs={12}\n md={6}\n lg={3}\n key={item.title}\n display=\"flex\"\n justifyContent=\"left\"\n alignItems=\"center\"\n >\n <OnboardingCard\n title={item.title}\n description={item.description}\n buttonText={item.buttonText}\n buttonLink={item.buttonLink}\n target={item.target}\n ariaLabel={item.ariaLabel}\n />\n </Grid>\n ))}\n </Grid>\n </Box>\n );\n\n return (\n <Card\n elevation={0}\n sx={{\n padding: '24px',\n border: muiTheme => `1px solid ${muiTheme.palette.grey[300]}`,\n overflow: 'auto',\n '$::-webkit-scrollbar': {\n display: 'none',\n },\n scrollbarWidth: 'none',\n }}\n >\n {!profileLoading && (\n <Typography\n variant=\"h3\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n fontWeight: '500',\n fontSize: '1.5rem',\n }}\n >\n {`${greeting} ${profileDisplayName() || 'Guest'}!`}\n </Typography>\n )}\n {content}\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Link, MarkdownContent } from '@backstage/core-components';
|
|
3
|
+
import Box from '@mui/material/Box';
|
|
4
|
+
import CardContent from '@mui/material/CardContent';
|
|
5
|
+
import Chip from '@mui/material/Chip';
|
|
6
|
+
import Typography from '@mui/material/Typography';
|
|
7
|
+
import Card from '@mui/material/Card';
|
|
8
|
+
|
|
9
|
+
const TemplateCard = ({
|
|
10
|
+
link,
|
|
11
|
+
title,
|
|
12
|
+
description,
|
|
13
|
+
kind
|
|
14
|
+
}) => {
|
|
15
|
+
return /* @__PURE__ */ React.createElement(
|
|
16
|
+
Card,
|
|
17
|
+
{
|
|
18
|
+
elevation: 0,
|
|
19
|
+
sx: {
|
|
20
|
+
border: (theme) => `1px solid ${theme.palette.grey[400]}`,
|
|
21
|
+
overflow: "auto",
|
|
22
|
+
maxHeight: "100%"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
/* @__PURE__ */ React.createElement(
|
|
26
|
+
CardContent,
|
|
27
|
+
{
|
|
28
|
+
sx: {
|
|
29
|
+
pb: 2,
|
|
30
|
+
"&:last-child": {
|
|
31
|
+
pb: 2
|
|
32
|
+
},
|
|
33
|
+
backgroundColor: "transparent"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
/* @__PURE__ */ React.createElement(Box, { sx: { padding: "8px 0" } }, /* @__PURE__ */ React.createElement(
|
|
37
|
+
Chip,
|
|
38
|
+
{
|
|
39
|
+
label: /* @__PURE__ */ React.createElement(Typography, { sx: { fontSize: "0.8rem", fontWeight: 400 } }, kind),
|
|
40
|
+
key: kind,
|
|
41
|
+
size: "small"
|
|
42
|
+
}
|
|
43
|
+
)),
|
|
44
|
+
/* @__PURE__ */ React.createElement(Box, { sx: { margin: "8px 0", height: "21px", overflow: "hidden" } }, /* @__PURE__ */ React.createElement(
|
|
45
|
+
Link,
|
|
46
|
+
{
|
|
47
|
+
to: link,
|
|
48
|
+
underline: "always",
|
|
49
|
+
style: {
|
|
50
|
+
display: "-webkit-box",
|
|
51
|
+
WebkitBoxOrient: "vertical",
|
|
52
|
+
WebkitLineClamp: 1,
|
|
53
|
+
overflow: "hidden",
|
|
54
|
+
textOverflow: "ellipsis",
|
|
55
|
+
fontSize: "0.9rem",
|
|
56
|
+
fontWeight: "500"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
title
|
|
60
|
+
)),
|
|
61
|
+
/* @__PURE__ */ React.createElement(
|
|
62
|
+
Box,
|
|
63
|
+
{
|
|
64
|
+
sx: {
|
|
65
|
+
padding: "8px 0",
|
|
66
|
+
height: "90px",
|
|
67
|
+
overflow: "hidden"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
/* @__PURE__ */ React.createElement(
|
|
71
|
+
Typography,
|
|
72
|
+
{
|
|
73
|
+
variant: "body2",
|
|
74
|
+
paragraph: true,
|
|
75
|
+
sx: {
|
|
76
|
+
display: "-webkit-box",
|
|
77
|
+
WebkitLineClamp: 4,
|
|
78
|
+
WebkitBoxOrient: "vertical",
|
|
79
|
+
overflow: "hidden",
|
|
80
|
+
textOverflow: "ellipsis",
|
|
81
|
+
"& p": {
|
|
82
|
+
margin: "auto"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
/* @__PURE__ */ React.createElement(MarkdownContent, { content: description })
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { TemplateCard as default };
|
|
94
|
+
//# sourceMappingURL=TemplateCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateCard.esm.js","sources":["../../../src/components/TemplateSection/TemplateCard.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport React from 'react';\n\nimport { Link } from '@backstage/core-components';\nimport { MarkdownContent } from '@backstage/core-components';\n\nimport Box from '@mui/material/Box';\nimport CardContent from '@mui/material/CardContent';\nimport Chip from '@mui/material/Chip';\nimport Typography from '@mui/material/Typography';\nimport Card from '@mui/material/Card';\n\ninterface TemplateCardProps {\n link: string;\n title: string;\n description: string;\n kind: string;\n}\n\nconst TemplateCard: React.FC<TemplateCardProps> = ({\n link,\n title,\n description,\n kind,\n}) => {\n return (\n <Card\n elevation={0}\n sx={{\n border: theme => `1px solid ${theme.palette.grey[400]}`,\n overflow: 'auto',\n maxHeight: '100%',\n }}\n >\n <CardContent\n sx={{\n pb: 2,\n '&:last-child': {\n pb: 2,\n },\n backgroundColor: 'transparent',\n }}\n >\n <Box sx={{ padding: '8px 0' }}>\n <Chip\n label={\n <Typography sx={{ fontSize: '0.8rem', fontWeight: 400 }}>\n {kind}\n </Typography>\n }\n key={kind}\n size=\"small\"\n />\n </Box>\n <Box sx={{ margin: '8px 0', height: '21px', overflow: 'hidden' }}>\n <Link\n to={link}\n underline=\"always\"\n style={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: '0.9rem',\n fontWeight: '500',\n }}\n >\n {title}\n </Link>\n </Box>\n <Box\n sx={{\n padding: '8px 0',\n height: '90px',\n overflow: 'hidden',\n }}\n >\n <Typography\n variant=\"body2\"\n paragraph\n sx={{\n display: '-webkit-box',\n WebkitLineClamp: 4,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n '& p': {\n margin: 'auto',\n },\n }}\n >\n <MarkdownContent content={description} />\n </Typography>\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default TemplateCard;\n"],"names":[],"mappings":";;;;;;;;AAiCA,MAAM,eAA4C,CAAC;AAAA,EACjD,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,CAAA;AAAA,MACX,EAAI,EAAA;AAAA,QACF,QAAQ,CAAS,KAAA,KAAA,CAAA,UAAA,EAAa,MAAM,OAAQ,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QACrD,QAAU,EAAA,MAAA;AAAA,QACV,SAAW,EAAA;AAAA;AACb,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA;AAAA,UACF,EAAI,EAAA,CAAA;AAAA,UACJ,cAAgB,EAAA;AAAA,YACd,EAAI,EAAA;AAAA,WACN;AAAA,UACA,eAAiB,EAAA;AAAA;AACnB,OAAA;AAAA,0CAEC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,OAAA,EAAS,SAClB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,KAAA,kBACG,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,EAAI,EAAA,EAAE,UAAU,QAAU,EAAA,UAAA,EAAY,GAAI,EAAA,EAAA,EACnD,IACH,CAAA;AAAA,UAEF,GAAK,EAAA,IAAA;AAAA,UACL,IAAK,EAAA;AAAA;AAAA,OAET,CAAA;AAAA,sBACA,KAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAS,MAAQ,EAAA,MAAA,EAAQ,QAAU,EAAA,QAAA,EACpD,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA,IAAA;AAAA,UACJ,SAAU,EAAA,QAAA;AAAA,UACV,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,aAAA;AAAA,YACT,eAAiB,EAAA,UAAA;AAAA,YACjB,eAAiB,EAAA,CAAA;AAAA,YACjB,QAAU,EAAA,QAAA;AAAA,YACV,YAAc,EAAA,UAAA;AAAA,YACd,QAAU,EAAA,QAAA;AAAA,YACV,UAAY,EAAA;AAAA;AACd,SAAA;AAAA,QAEC;AAAA,OAEL,CAAA;AAAA,sBACA,KAAA,CAAA,aAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,OAAS,EAAA,OAAA;AAAA,YACT,MAAQ,EAAA,MAAA;AAAA,YACR,QAAU,EAAA;AAAA;AACZ,SAAA;AAAA,wBAEA,KAAA,CAAA,aAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAQ,EAAA,OAAA;AAAA,YACR,SAAS,EAAA,IAAA;AAAA,YACT,EAAI,EAAA;AAAA,cACF,OAAS,EAAA,aAAA;AAAA,cACT,eAAiB,EAAA,CAAA;AAAA,cACjB,eAAiB,EAAA,UAAA;AAAA,cACjB,QAAU,EAAA,QAAA;AAAA,cACV,YAAc,EAAA,UAAA;AAAA,cACd,KAAO,EAAA;AAAA,gBACL,MAAQ,EAAA;AAAA;AACV;AACF,WAAA;AAAA,0BAEA,KAAA,CAAA,aAAA,CAAC,eAAgB,EAAA,EAAA,OAAA,EAAS,WAAa,EAAA;AAAA;AACzC;AACF;AACF,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Link, WarningPanel, CodeSnippet } from '@backstage/core-components';
|
|
3
|
+
import Grid from '@mui/material/Grid';
|
|
4
|
+
import Box from '@mui/material/Box';
|
|
5
|
+
import Card from '@mui/material/Card';
|
|
6
|
+
import CircularProgress from '@mui/material/CircularProgress';
|
|
7
|
+
import CardContent from '@mui/material/CardContent';
|
|
8
|
+
import { styled } from '@mui/material/styles';
|
|
9
|
+
import Typography from '@mui/material/Typography';
|
|
10
|
+
import TemplateCard from './TemplateCard.esm.js';
|
|
11
|
+
import { useEntities } from '../../hooks/useEntities.esm.js';
|
|
12
|
+
import { ViewMoreLink } from './ViewMoreLink.esm.js';
|
|
13
|
+
|
|
14
|
+
const StyledLink = styled(Link)(({ theme }) => ({
|
|
15
|
+
textDecoration: "none",
|
|
16
|
+
padding: theme.spacing(1, 1.5),
|
|
17
|
+
fontSize: "16px",
|
|
18
|
+
display: "inline-flex",
|
|
19
|
+
border: `1px solid ${theme.palette.primary.main}`,
|
|
20
|
+
borderRadius: 4
|
|
21
|
+
}));
|
|
22
|
+
const TemplateSection = () => {
|
|
23
|
+
const {
|
|
24
|
+
data: templates,
|
|
25
|
+
error,
|
|
26
|
+
isLoading
|
|
27
|
+
} = useEntities({ kind: "Template" });
|
|
28
|
+
const params = new URLSearchParams({
|
|
29
|
+
"filters[kind]": "template",
|
|
30
|
+
limit: "20"
|
|
31
|
+
});
|
|
32
|
+
const catalogTemplatesLink = `/catalog?${params.toString()}`;
|
|
33
|
+
let content;
|
|
34
|
+
if (isLoading) {
|
|
35
|
+
content = /* @__PURE__ */ React.createElement(
|
|
36
|
+
Box,
|
|
37
|
+
{
|
|
38
|
+
sx: {
|
|
39
|
+
height: "100%",
|
|
40
|
+
display: "flex",
|
|
41
|
+
alignItems: "center",
|
|
42
|
+
justifyContent: "center"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
/* @__PURE__ */ React.createElement(CircularProgress, null)
|
|
46
|
+
);
|
|
47
|
+
} else if (!templates) {
|
|
48
|
+
content = /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not fetch data." }, /* @__PURE__ */ React.createElement(
|
|
49
|
+
CodeSnippet,
|
|
50
|
+
{
|
|
51
|
+
language: "text",
|
|
52
|
+
text: error?.toString() ?? "Unknown error"
|
|
53
|
+
}
|
|
54
|
+
));
|
|
55
|
+
} else {
|
|
56
|
+
content = /* @__PURE__ */ React.createElement(Box, { sx: { padding: "8px 8px 8px 0" } }, /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 1, alignItems: "stretch" }, templates?.items.map((item) => /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 3, key: item.title }, /* @__PURE__ */ React.createElement(
|
|
57
|
+
TemplateCard,
|
|
58
|
+
{
|
|
59
|
+
link: `/create/templates/${item.metadata.namespace}/${item.metadata.name}`,
|
|
60
|
+
title: item.metadata.title,
|
|
61
|
+
description: item.metadata.description,
|
|
62
|
+
kind: "Template"
|
|
63
|
+
}
|
|
64
|
+
))), templates?.items.length === 0 && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 12 }, /* @__PURE__ */ React.createElement(
|
|
65
|
+
Box,
|
|
66
|
+
{
|
|
67
|
+
sx: {
|
|
68
|
+
display: "flex",
|
|
69
|
+
alignItems: "center",
|
|
70
|
+
justifyContent: "center",
|
|
71
|
+
border: (muiTheme) => `1px solid ${muiTheme.palette.grey[400]}`,
|
|
72
|
+
borderRadius: 3,
|
|
73
|
+
overflow: "hidden"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
/* @__PURE__ */ React.createElement(
|
|
77
|
+
CardContent,
|
|
78
|
+
{
|
|
79
|
+
sx: {
|
|
80
|
+
margin: "1rem"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
/* @__PURE__ */ React.createElement(Typography, { sx: { fontSize: "1.125rem", fontWeight: 500 } }, "No templates added yet"),
|
|
84
|
+
/* @__PURE__ */ React.createElement(
|
|
85
|
+
Typography,
|
|
86
|
+
{
|
|
87
|
+
sx: {
|
|
88
|
+
fontSize: "0.875rem",
|
|
89
|
+
fontWeight: 400,
|
|
90
|
+
mt: "20px",
|
|
91
|
+
mb: "16px"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"Once templates are added, this space will showcase relevant content tailored to your experience."
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ React.createElement(StyledLink, { to: "/catalog-import", underline: "none" }, "Register a template")
|
|
97
|
+
)
|
|
98
|
+
))), /* @__PURE__ */ React.createElement(Box, { sx: { pt: 2 } }, templates?.items.length > 0 && /* @__PURE__ */ React.createElement(ViewMoreLink, { to: catalogTemplatesLink, underline: "always" }, "View all ", templates?.totalItems ? templates?.totalItems : "", " ", "templates"))));
|
|
99
|
+
}
|
|
100
|
+
return /* @__PURE__ */ React.createElement(
|
|
101
|
+
Card,
|
|
102
|
+
{
|
|
103
|
+
elevation: 0,
|
|
104
|
+
sx: {
|
|
105
|
+
padding: "24px",
|
|
106
|
+
border: (muiTheme) => `1px solid ${muiTheme.palette.grey[300]}`,
|
|
107
|
+
overflow: "auto",
|
|
108
|
+
"$::-webkit-scrollbar": {
|
|
109
|
+
display: "none"
|
|
110
|
+
},
|
|
111
|
+
scrollbarWidth: "none"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
/* @__PURE__ */ React.createElement(
|
|
115
|
+
Typography,
|
|
116
|
+
{
|
|
117
|
+
variant: "h3",
|
|
118
|
+
sx: {
|
|
119
|
+
display: "flex",
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
fontWeight: "500",
|
|
122
|
+
fontSize: "1.5rem"
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"Explore Templates"
|
|
126
|
+
),
|
|
127
|
+
content
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export { TemplateSection };
|
|
132
|
+
//# sourceMappingURL=TemplateSection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateSection.esm.js","sources":["../../../src/components/TemplateSection/TemplateSection.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport React from 'react';\n\nimport {\n CodeSnippet,\n WarningPanel,\n Link as BackstageLink,\n} from '@backstage/core-components';\n\nimport Grid from '@mui/material/Grid';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport CardContent from '@mui/material/CardContent';\nimport { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\n\nimport TemplateCard from './TemplateCard';\nimport { useEntities } from '../../hooks/useEntities';\nimport { ViewMoreLink } from './ViewMoreLink';\n\nconst StyledLink = styled(BackstageLink)(({ theme }) => ({\n textDecoration: 'none',\n padding: theme.spacing(1, 1.5),\n fontSize: '16px',\n display: 'inline-flex',\n border: `1px solid ${theme.palette.primary.main}`,\n borderRadius: 4,\n}));\n\nexport const TemplateSection = () => {\n const {\n data: templates,\n error,\n isLoading,\n } = useEntities({ kind: 'Template' });\n\n const params = new URLSearchParams({\n 'filters[kind]': 'template',\n limit: '20',\n });\n const catalogTemplatesLink = `/catalog?${params.toString()}`;\n\n let content: React.ReactNode;\n\n if (isLoading) {\n content = (\n <Box\n sx={{\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <CircularProgress />\n </Box>\n );\n } else if (!templates) {\n content = (\n <WarningPanel severity=\"error\" title=\"Could not fetch data.\">\n <CodeSnippet\n language=\"text\"\n text={error?.toString() ?? 'Unknown error'}\n />\n </WarningPanel>\n );\n } else {\n content = (\n <Box sx={{ padding: '8px 8px 8px 0' }}>\n <React.Fragment>\n <Grid container spacing={1} alignItems=\"stretch\">\n {templates?.items.map((item: any) => (\n <Grid item xs={12} md={3} key={item.title}>\n <TemplateCard\n link={`/create/templates/${item.metadata.namespace}/${item.metadata.name}`}\n title={item.metadata.title}\n description={item.metadata.description}\n kind=\"Template\"\n />\n </Grid>\n ))}\n {templates?.items.length === 0 && (\n <Grid item xs={12} md={12}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: muiTheme =>\n `1px solid ${muiTheme.palette.grey[400]}`,\n borderRadius: 3,\n overflow: 'hidden',\n }}\n >\n <CardContent\n sx={{\n margin: '1rem',\n }}\n >\n <Typography sx={{ fontSize: '1.125rem', fontWeight: 500 }}>\n No templates added yet\n </Typography>\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 400,\n mt: '20px',\n mb: '16px',\n }}\n >\n Once templates are added, this space will showcase\n relevant content tailored to your experience.\n </Typography>\n <StyledLink to=\"/catalog-import\" underline=\"none\">\n Register a template\n </StyledLink>\n </CardContent>\n </Box>\n </Grid>\n )}\n </Grid>\n <Box sx={{ pt: 2 }}>\n {templates?.items.length > 0 && (\n <ViewMoreLink to={catalogTemplatesLink} underline=\"always\">\n View all {templates?.totalItems ? templates?.totalItems : ''}{' '}\n templates\n </ViewMoreLink>\n )}\n </Box>\n </React.Fragment>\n </Box>\n );\n }\n\n return (\n <Card\n elevation={0}\n sx={{\n padding: '24px',\n border: muiTheme => `1px solid ${muiTheme.palette.grey[300]}`,\n overflow: 'auto',\n '$::-webkit-scrollbar': {\n display: 'none',\n },\n scrollbarWidth: 'none',\n }}\n >\n <Typography\n variant=\"h3\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n fontWeight: '500',\n fontSize: '1.5rem',\n }}\n >\n Explore Templates\n </Typography>\n {content}\n </Card>\n );\n};\n"],"names":["BackstageLink"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Link } from '@backstage/core-components';
|
|
3
|
+
import Typography from '@mui/material/Typography';
|
|
4
|
+
|
|
5
|
+
const ViewMoreLink = ({ to, children }) => {
|
|
6
|
+
return /* @__PURE__ */ React.createElement(Link, { to, underline: "always", style: { textUnderlineOffset: "4px" } }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", sx: { fontWeight: 500 } }, children));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { ViewMoreLink };
|
|
10
|
+
//# sourceMappingURL=ViewMoreLink.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewMoreLink.esm.js","sources":["../../../src/components/TemplateSection/ViewMoreLink.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport React from 'react';\nimport { Link, LinkProps } from '@backstage/core-components';\nimport Typography from '@mui/material/Typography';\n\ninterface ViewMoreLinkProps extends LinkProps {\n to: string;\n children: string | React.ReactNode;\n}\n\nexport const ViewMoreLink: React.FC<ViewMoreLinkProps> = ({ to, children }) => {\n return (\n <Link to={to} underline=\"always\" style={{ textUnderlineOffset: '4px' }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 500 }}>\n {children}\n </Typography>\n </Link>\n );\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,YAA4C,GAAA,CAAC,EAAE,EAAA,EAAI,UAAe,KAAA;AAC7E,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,EAAQ,EAAA,SAAA,EAAU,UAAS,KAAO,EAAA,EAAE,qBAAqB,KAAM,EAAA,EAAA,sCAClE,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,EAAI,EAAA,EAAE,YAAY,GAAI,EAAA,EAAA,EAC/C,QACH,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
2
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
3
|
+
import useAsync from 'react-use/lib/useAsync';
|
|
4
|
+
|
|
5
|
+
const useEntities = ({ kind }) => {
|
|
6
|
+
const catalogApi = useApi(catalogApiRef);
|
|
7
|
+
const { loading, error, value } = useAsync(async () => {
|
|
8
|
+
return await catalogApi.queryEntities({
|
|
9
|
+
filter: {
|
|
10
|
+
kind
|
|
11
|
+
},
|
|
12
|
+
limit: 4
|
|
13
|
+
});
|
|
14
|
+
}, []);
|
|
15
|
+
return {
|
|
16
|
+
data: value,
|
|
17
|
+
error,
|
|
18
|
+
isLoading: loading
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { useEntities };
|
|
23
|
+
//# sourceMappingURL=useEntities.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntities.esm.js","sources":["../../src/hooks/useEntities.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport useAsync from 'react-use/lib/useAsync';\n\nexport const useEntities = ({ kind }: { kind: string | string[] }) => {\n const catalogApi = useApi(catalogApiRef);\n\n const { loading, error, value } = useAsync(async () => {\n return await catalogApi.queryEntities({\n filter: {\n kind: kind,\n },\n limit: 4,\n });\n }, []);\n\n return {\n data: value,\n error,\n isLoading: loading,\n };\n};\n"],"names":[],"mappings":";;;;AAoBO,MAAM,WAAc,GAAA,CAAC,EAAE,IAAA,EAAwC,KAAA;AACpE,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AAEvC,EAAA,MAAM,EAAE,OAAS,EAAA,KAAA,EAAO,KAAM,EAAA,GAAI,SAAS,YAAY;AACrD,IAAO,OAAA,MAAM,WAAW,aAAc,CAAA;AAAA,MACpC,MAAQ,EAAA;AAAA,QACN;AAAA,OACF;AAAA,MACA,KAAO,EAAA;AAAA,KACR,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,KAAA;AAAA,IACN,KAAA;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AACF;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const getGreetingByTimeZone = (timeZone) => {
|
|
4
|
+
const hours = (/* @__PURE__ */ new Date()).toLocaleString("en-US", {
|
|
5
|
+
timeZone,
|
|
6
|
+
hour: "numeric",
|
|
7
|
+
hour12: false
|
|
8
|
+
});
|
|
9
|
+
const hour = parseInt(hours, 10);
|
|
10
|
+
if (hour < 12) {
|
|
11
|
+
return "Good morning";
|
|
12
|
+
}
|
|
13
|
+
if (hour < 18) {
|
|
14
|
+
return "Good afternoon";
|
|
15
|
+
}
|
|
16
|
+
return "Good evening";
|
|
17
|
+
};
|
|
18
|
+
const useGreeting = (timeZone) => {
|
|
19
|
+
const [greeting, setGreeting] = React.useState(
|
|
20
|
+
getGreetingByTimeZone(timeZone)
|
|
21
|
+
);
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
const interval = setInterval(() => {
|
|
24
|
+
setGreeting(getGreetingByTimeZone(timeZone));
|
|
25
|
+
}, 6e4);
|
|
26
|
+
return () => clearInterval(interval);
|
|
27
|
+
}, [timeZone]);
|
|
28
|
+
return greeting;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { useGreeting as default };
|
|
32
|
+
//# sourceMappingURL=useGreeting.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGreeting.esm.js","sources":["../../src/hooks/useGreeting.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\nimport React from 'react';\n\nconst getGreetingByTimeZone = (timeZone?: string) => {\n const hours = new Date().toLocaleString('en-US', {\n timeZone,\n hour: 'numeric',\n hour12: false,\n });\n const hour = parseInt(hours, 10);\n\n if (hour < 12) {\n return 'Good morning';\n }\n if (hour < 18) {\n return 'Good afternoon';\n }\n return 'Good evening';\n};\n\nconst useGreeting = (timeZone?: string) => {\n const [greeting, setGreeting] = React.useState<string>(\n getGreetingByTimeZone(timeZone),\n );\n\n React.useEffect(() => {\n const interval = setInterval(() => {\n setGreeting(getGreetingByTimeZone(timeZone));\n }, 60000); // Update every minute\n\n return () => clearInterval(interval);\n }, [timeZone]);\n\n return greeting;\n};\n\nexport default useGreeting;\n"],"names":[],"mappings":";;AAiBA,MAAM,qBAAA,GAAwB,CAAC,QAAsB,KAAA;AACnD,EAAA,MAAM,KAAQ,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,eAAe,OAAS,EAAA;AAAA,IAC/C,QAAA;AAAA,IACA,IAAM,EAAA,SAAA;AAAA,IACN,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAM,MAAA,IAAA,GAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AAE/B,EAAA,IAAI,OAAO,EAAI,EAAA;AACb,IAAO,OAAA,cAAA;AAAA;AAET,EAAA,IAAI,OAAO,EAAI,EAAA;AACb,IAAO,OAAA,gBAAA;AAAA;AAET,EAAO,OAAA,cAAA;AACT,CAAA;AAEM,MAAA,WAAA,GAAc,CAAC,QAAsB,KAAA;AACzC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,KAAM,CAAA,QAAA;AAAA,IACpC,sBAAsB,QAAQ;AAAA,GAChC;AAEA,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AACjC,MAAY,WAAA,CAAA,qBAAA,CAAsB,QAAQ,CAAC,CAAA;AAAA,OAC1C,GAAK,CAAA;AAER,IAAO,OAAA,MAAM,cAAc,QAAQ,CAAA;AAAA,GACrC,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA,QAAA;AACT;;;;"}
|