@backstage/core-components 0.18.15-next.0 → 0.18.15-next.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.
- package/CHANGELOG.md +12 -0
- package/dist/components/StructuredMetadataTable/StructuredMetadataTable.esm.js +1 -1
- package/dist/components/StructuredMetadataTable/StructuredMetadataTable.esm.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/layout/Sidebar/Items.esm.js +23 -4
- package/dist/layout/Sidebar/Items.esm.js.map +1 -1
- package/dist/layout/Sidebar/config.esm.js +2 -1
- package/dist/layout/Sidebar/config.esm.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage/core-components
|
|
2
2
|
|
|
3
|
+
## 0.18.15-next.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 76ac6ed: Updated dependency `js-yaml` to `^5.0.0`.
|
|
8
|
+
|
|
9
|
+
## 0.18.15-next.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- e859c29: Added `defaultCloseDelayMs` option to `SubmenuOptions` to configure a delay before a submenu closes.
|
|
14
|
+
|
|
3
15
|
## 0.18.15-next.0
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -4,7 +4,7 @@ import startCase from 'lodash/startCase';
|
|
|
4
4
|
import Typography from '@material-ui/core/Typography';
|
|
5
5
|
import { MetadataList, MetadataTable, MetadataTableItem, MetadataListItem } from './MetadataTable.esm.js';
|
|
6
6
|
import { CodeSnippet } from '../CodeSnippet/CodeSnippet.esm.js';
|
|
7
|
-
import jsyaml from 'js-yaml';
|
|
7
|
+
import * as jsyaml from 'js-yaml';
|
|
8
8
|
import { createStyles, withStyles } from '@material-ui/core/styles';
|
|
9
9
|
|
|
10
10
|
const listStyle = createStyles({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StructuredMetadataTable.esm.js","sources":["../../../src/components/StructuredMetadataTable/StructuredMetadataTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { ReactNode, isValidElement, Fragment, ReactElement } from 'react';\nimport startCase from 'lodash/startCase';\nimport Typography from '@material-ui/core/Typography';\n\nimport {\n MetadataList,\n MetadataListItem,\n MetadataTable,\n MetadataTableItem,\n} from './MetadataTable';\nimport { CodeSnippet } from '../CodeSnippet';\nimport jsyaml from 'js-yaml';\nimport {\n Theme,\n createStyles,\n WithStyles,\n withStyles,\n} from '@material-ui/core/styles';\n\nexport type StructuredMetadataTableListClassKey = 'root';\n\nconst listStyle = createStyles({\n root: {\n margin: '0 0',\n listStyleType: 'none',\n },\n});\n\nexport type StructuredMetadataTableNestedListClassKey = 'root';\nconst nestedListStyle = (theme: Theme) =>\n createStyles({\n root: {\n ...listStyle.root,\n paddingLeft: theme.spacing(1),\n },\n });\n\ninterface StyleProps extends WithStyles {\n children?: ReactNode;\n}\n// Sub Components\nconst StyledList = withStyles(listStyle, {\n name: 'BackstageStructuredMetadataTableList',\n})(({ classes, children }: StyleProps) => (\n <MetadataList classes={classes}>{children}</MetadataList>\n));\nconst StyledNestedList = withStyles(nestedListStyle, {\n name: 'BackstageStructuredMetadataTableNestedList',\n})(({ classes, children }: StyleProps) => (\n <MetadataList classes={classes}>{children}</MetadataList>\n));\n\nfunction renderList(list: Array<any>, options: Options, nested: boolean) {\n const values = list.map((item: any, index: number) => (\n <MetadataListItem key={index}>\n {toValue(item, options, nested)}\n </MetadataListItem>\n ));\n return nested ? (\n <StyledNestedList>{values}</StyledNestedList>\n ) : (\n <StyledList>{values}</StyledList>\n );\n}\n\nfunction renderMap(\n map: { [key: string]: any },\n options: Options,\n nested: boolean,\n) {\n const values = Object.keys(map).map(key => {\n const value = toValue(map[key], options, true);\n return (\n <MetadataListItem key={key}>\n <Typography variant=\"body2\" component=\"span\">\n {`${options.titleFormat(key)}: `}\n </Typography>\n {value}\n </MetadataListItem>\n );\n });\n\n return nested ? (\n <StyledNestedList>{values}</StyledNestedList>\n ) : (\n <StyledList>{values}</StyledList>\n );\n}\n\nfunction toValue(\n value: ReactElement | object | Array<any> | boolean,\n options: Options,\n nested: boolean,\n) {\n if (isValidElement(value)) {\n return <Fragment>{value}</Fragment>;\n }\n if (value !== null && typeof value === 'object') {\n if (options.nestedValuesAsYaml) {\n return (\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(value)}\n customStyle={{\n background: 'transparent',\n lineHeight: '1.4',\n padding: '0',\n margin: 0,\n }}\n />\n );\n }\n if (!Array.isArray(value)) {\n return renderMap(value, options, nested);\n }\n }\n\n if (Array.isArray(value)) {\n return renderList(value, options, nested);\n }\n\n if (typeof value === 'boolean') {\n return <Fragment>{value ? '✅' : '❌'}</Fragment>;\n }\n return (\n <Typography variant=\"body2\" component=\"span\">\n {value}\n </Typography>\n );\n}\nconst ItemValue = ({ value, options }: { value: any; options: Options }) => (\n <Fragment>{toValue(value, options, false)}</Fragment>\n);\n\nconst TableItem = ({\n title,\n value,\n options,\n}: {\n title: string;\n value: any;\n options: Options;\n}) => {\n return (\n <MetadataTableItem title={options.titleFormat(title)}>\n <ItemValue value={value} options={options} />\n </MetadataTableItem>\n );\n};\n\nfunction mapToItems(info: { [key: string]: string }, options: Options) {\n return Object.keys(info).map(key => (\n <TableItem key={key} title={key} value={info[key]} options={options} />\n ));\n}\n\n/** @public */\nexport interface StructuredMetadataTableProps {\n metadata: { [key: string]: any };\n dense?: boolean;\n options?: {\n /**\n * Function to format the keys from the `metadata` object. Defaults to\n * startCase from the lodash library.\n * @param key - A key within the `metadata`\n * @returns Formatted key\n */\n titleFormat?: (key: string) => string;\n nestedValuesAsYaml?: boolean;\n };\n}\n\ntype Options = Required<NonNullable<StructuredMetadataTableProps['options']>>;\n\n/** @public */\nexport function StructuredMetadataTable(props: StructuredMetadataTableProps) {\n const { metadata, dense = true, options } = props;\n const metadataItems = mapToItems(metadata, {\n titleFormat: startCase,\n nestedValuesAsYaml: options?.nestedValuesAsYaml ?? false,\n ...options,\n });\n return <MetadataTable dense={dense}>{metadataItems}</MetadataTable>;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StructuredMetadataTable.esm.js","sources":["../../../src/components/StructuredMetadataTable/StructuredMetadataTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { ReactNode, isValidElement, Fragment, ReactElement } from 'react';\nimport startCase from 'lodash/startCase';\nimport Typography from '@material-ui/core/Typography';\n\nimport {\n MetadataList,\n MetadataListItem,\n MetadataTable,\n MetadataTableItem,\n} from './MetadataTable';\nimport { CodeSnippet } from '../CodeSnippet';\nimport * as jsyaml from 'js-yaml';\nimport {\n Theme,\n createStyles,\n WithStyles,\n withStyles,\n} from '@material-ui/core/styles';\n\nexport type StructuredMetadataTableListClassKey = 'root';\n\nconst listStyle = createStyles({\n root: {\n margin: '0 0',\n listStyleType: 'none',\n },\n});\n\nexport type StructuredMetadataTableNestedListClassKey = 'root';\nconst nestedListStyle = (theme: Theme) =>\n createStyles({\n root: {\n ...listStyle.root,\n paddingLeft: theme.spacing(1),\n },\n });\n\ninterface StyleProps extends WithStyles {\n children?: ReactNode;\n}\n// Sub Components\nconst StyledList = withStyles(listStyle, {\n name: 'BackstageStructuredMetadataTableList',\n})(({ classes, children }: StyleProps) => (\n <MetadataList classes={classes}>{children}</MetadataList>\n));\nconst StyledNestedList = withStyles(nestedListStyle, {\n name: 'BackstageStructuredMetadataTableNestedList',\n})(({ classes, children }: StyleProps) => (\n <MetadataList classes={classes}>{children}</MetadataList>\n));\n\nfunction renderList(list: Array<any>, options: Options, nested: boolean) {\n const values = list.map((item: any, index: number) => (\n <MetadataListItem key={index}>\n {toValue(item, options, nested)}\n </MetadataListItem>\n ));\n return nested ? (\n <StyledNestedList>{values}</StyledNestedList>\n ) : (\n <StyledList>{values}</StyledList>\n );\n}\n\nfunction renderMap(\n map: { [key: string]: any },\n options: Options,\n nested: boolean,\n) {\n const values = Object.keys(map).map(key => {\n const value = toValue(map[key], options, true);\n return (\n <MetadataListItem key={key}>\n <Typography variant=\"body2\" component=\"span\">\n {`${options.titleFormat(key)}: `}\n </Typography>\n {value}\n </MetadataListItem>\n );\n });\n\n return nested ? (\n <StyledNestedList>{values}</StyledNestedList>\n ) : (\n <StyledList>{values}</StyledList>\n );\n}\n\nfunction toValue(\n value: ReactElement | object | Array<any> | boolean,\n options: Options,\n nested: boolean,\n) {\n if (isValidElement(value)) {\n return <Fragment>{value}</Fragment>;\n }\n if (value !== null && typeof value === 'object') {\n if (options.nestedValuesAsYaml) {\n return (\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(value)}\n customStyle={{\n background: 'transparent',\n lineHeight: '1.4',\n padding: '0',\n margin: 0,\n }}\n />\n );\n }\n if (!Array.isArray(value)) {\n return renderMap(value, options, nested);\n }\n }\n\n if (Array.isArray(value)) {\n return renderList(value, options, nested);\n }\n\n if (typeof value === 'boolean') {\n return <Fragment>{value ? '✅' : '❌'}</Fragment>;\n }\n return (\n <Typography variant=\"body2\" component=\"span\">\n {value}\n </Typography>\n );\n}\nconst ItemValue = ({ value, options }: { value: any; options: Options }) => (\n <Fragment>{toValue(value, options, false)}</Fragment>\n);\n\nconst TableItem = ({\n title,\n value,\n options,\n}: {\n title: string;\n value: any;\n options: Options;\n}) => {\n return (\n <MetadataTableItem title={options.titleFormat(title)}>\n <ItemValue value={value} options={options} />\n </MetadataTableItem>\n );\n};\n\nfunction mapToItems(info: { [key: string]: string }, options: Options) {\n return Object.keys(info).map(key => (\n <TableItem key={key} title={key} value={info[key]} options={options} />\n ));\n}\n\n/** @public */\nexport interface StructuredMetadataTableProps {\n metadata: { [key: string]: any };\n dense?: boolean;\n options?: {\n /**\n * Function to format the keys from the `metadata` object. Defaults to\n * startCase from the lodash library.\n * @param key - A key within the `metadata`\n * @returns Formatted key\n */\n titleFormat?: (key: string) => string;\n nestedValuesAsYaml?: boolean;\n };\n}\n\ntype Options = Required<NonNullable<StructuredMetadataTableProps['options']>>;\n\n/** @public */\nexport function StructuredMetadataTable(props: StructuredMetadataTableProps) {\n const { metadata, dense = true, options } = props;\n const metadataItems = mapToItems(metadata, {\n titleFormat: startCase,\n nestedValuesAsYaml: options?.nestedValuesAsYaml ?? false,\n ...options,\n });\n return <MetadataTable dense={dense}>{metadataItems}</MetadataTable>;\n}\n"],"names":[],"mappings":";;;;;;;;;AAqCA,MAAM,YAAY,YAAA,CAAa;AAAA,EAC7B,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,KAAA;AAAA,IACR,aAAA,EAAe;AAAA;AAEnB,CAAC,CAAA;AAGD,MAAM,eAAA,GAAkB,CAAC,KAAA,KACvB,YAAA,CAAa;AAAA,EACX,IAAA,EAAM;AAAA,IACJ,GAAG,SAAA,CAAU,IAAA;AAAA,IACb,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAEhC,CAAC,CAAA;AAMH,MAAM,UAAA,GAAa,WAAW,SAAA,EAAW;AAAA,EACvC,IAAA,EAAM;AACR,CAAC,CAAA,CAAE,CAAC,EAAE,OAAA,EAAS,QAAA,uBACb,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAmB,QAAA,EAAS,CAC3C,CAAA;AACD,MAAM,gBAAA,GAAmB,WAAW,eAAA,EAAiB;AAAA,EACnD,IAAA,EAAM;AACR,CAAC,CAAA,CAAE,CAAC,EAAE,OAAA,EAAS,QAAA,uBACb,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAmB,QAAA,EAAS,CAC3C,CAAA;AAED,SAAS,UAAA,CAAW,IAAA,EAAkB,OAAA,EAAkB,MAAA,EAAiB;AACvE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,MAAW,KAAA,qBAClC,GAAA,CAAC,gBAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA,EAAA,EADT,KAEvB,CACD,CAAA;AACD,EAAA,OAAO,yBACL,GAAA,CAAC,gBAAA,EAAA,EAAkB,kBAAO,CAAA,mBAE1B,GAAA,CAAC,cAAY,QAAA,EAAA,MAAA,EAAO,CAAA;AAExB;AAEA,SAAS,SAAA,CACP,GAAA,EACA,OAAA,EACA,MAAA,EACA;AACA,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAI,CAAA,GAAA,KAAO;AACzC,IAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG,SAAS,IAAI,CAAA;AAC7C,IAAA,4BACG,gBAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,MAAA,EACnC,aAAG,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAC,CAAA,EAAA,CAAA,EAC9B,CAAA;AAAA,MACC;AAAA,KAAA,EAAA,EAJoB,GAKvB,CAAA;AAAA,EAEJ,CAAC,CAAA;AAED,EAAA,OAAO,yBACL,GAAA,CAAC,gBAAA,EAAA,EAAkB,kBAAO,CAAA,mBAE1B,GAAA,CAAC,cAAY,QAAA,EAAA,MAAA,EAAO,CAAA;AAExB;AAEA,SAAS,OAAA,CACP,KAAA,EACA,OAAA,EACA,MAAA,EACA;AACA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,uBAAO,GAAA,CAAC,YAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,MAAA,uBACE,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,MAAA;AAAA,UACT,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,UACvB,WAAA,EAAa;AAAA,YACX,UAAA,EAAY,aAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,GAAA;AAAA,YACT,MAAA,EAAQ;AAAA;AACV;AAAA,OACF;AAAA,IAEJ;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAU,QAAA,EAAA,KAAA,GAAQ,QAAA,GAAM,QAAA,EAAI,CAAA;AAAA,EACtC;AACA,EAAA,2BACG,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,QACnC,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;AACA,MAAM,SAAA,GAAY,CAAC,EAAE,KAAA,EAAO,OAAA,EAAQ,qBAClC,GAAA,CAAC,QAAA,EAAA,EAAU,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA,EAAE,CAAA;AAG5C,MAAM,YAAY,CAAC;AAAA,EACjB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,uBACE,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,OAAA,EAAkB,CAAA,EAC7C,CAAA;AAEJ,CAAA;AAEA,SAAS,UAAA,CAAW,MAAiC,OAAA,EAAkB;AACrE,EAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,GAAA,CAAI,yBAC3B,GAAA,CAAC,SAAA,EAAA,EAAoB,KAAA,EAAO,GAAA,EAAK,OAAO,IAAA,CAAK,GAAG,CAAA,EAAG,OAAA,EAAA,EAAnC,GAAqD,CACtE,CAAA;AACH;AAqBO,SAAS,wBAAwB,KAAA,EAAqC;AAC3E,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,GAAQ,IAAA,EAAM,SAAQ,GAAI,KAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,WAAW,QAAA,EAAU;AAAA,IACzC,WAAA,EAAa,SAAA;AAAA,IACb,kBAAA,EAAoB,SAAS,kBAAA,IAAsB,KAAA;AAAA,IACnD,GAAG;AAAA,GACJ,CAAA;AACD,EAAA,uBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAe,QAAA,EAAA,aAAA,EAAc,CAAA;AACrD;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import ArrowDropUpIcon from '@material-ui/icons/ArrowDropUp';
|
|
|
11
11
|
import ArrowRightIcon from '@material-ui/icons/ArrowRight';
|
|
12
12
|
import Search from '@material-ui/icons/Search';
|
|
13
13
|
import classNames from 'classnames';
|
|
14
|
-
import { createElement, forwardRef, useContext, useCallback, useMemo, useState } from 'react';
|
|
14
|
+
import { createElement, forwardRef, useContext, useCallback, useMemo, useState, useRef, useEffect } from 'react';
|
|
15
15
|
import { useLocation, useResolvedPath, Link, resolvePath } from 'react-router-dom';
|
|
16
16
|
import { SidebarConfigContext, SidebarItemWithSubmenuContext } from './config.esm.js';
|
|
17
17
|
import DoubleArrowLeft from './icons/DoubleArrowLeft.esm.js';
|
|
@@ -322,7 +322,7 @@ const SidebarItemWithSubmenu = ({
|
|
|
322
322
|
children,
|
|
323
323
|
...props
|
|
324
324
|
}) => {
|
|
325
|
-
const { sidebarConfig } = useContext(SidebarConfigContext);
|
|
325
|
+
const { sidebarConfig, submenuConfig } = useContext(SidebarConfigContext);
|
|
326
326
|
const classes = useMemoStyles(sidebarConfig);
|
|
327
327
|
const [isHoveredOn, setIsHoveredOn] = useState(false);
|
|
328
328
|
const location = useLocation();
|
|
@@ -330,11 +330,30 @@ const SidebarItemWithSubmenu = ({
|
|
|
330
330
|
const isSmallScreen = useMediaQuery(
|
|
331
331
|
(theme) => theme.breakpoints.down("sm")
|
|
332
332
|
);
|
|
333
|
+
const closeTimerRef = useRef();
|
|
334
|
+
useEffect(() => {
|
|
335
|
+
return () => {
|
|
336
|
+
if (closeTimerRef.current) {
|
|
337
|
+
clearTimeout(closeTimerRef.current);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}, []);
|
|
333
341
|
const handleMouseEnter = () => {
|
|
342
|
+
if (closeTimerRef.current) {
|
|
343
|
+
clearTimeout(closeTimerRef.current);
|
|
344
|
+
closeTimerRef.current = void 0;
|
|
345
|
+
}
|
|
334
346
|
setIsHoveredOn(true);
|
|
335
347
|
};
|
|
336
|
-
const handleMouseLeave = () => {
|
|
337
|
-
|
|
348
|
+
const handleMouseLeave = (event) => {
|
|
349
|
+
if (event.type === "mouseleave" && submenuConfig.defaultCloseDelayMs > 0) {
|
|
350
|
+
closeTimerRef.current = window.setTimeout(() => {
|
|
351
|
+
closeTimerRef.current = void 0;
|
|
352
|
+
setIsHoveredOn(false);
|
|
353
|
+
}, submenuConfig.defaultCloseDelayMs);
|
|
354
|
+
} else {
|
|
355
|
+
setIsHoveredOn(false);
|
|
356
|
+
}
|
|
338
357
|
};
|
|
339
358
|
const arrowIcon = () => {
|
|
340
359
|
if (isSmallScreen) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Items.esm.js","sources":["../../../src/layout/Sidebar/Items.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 {\n IconComponent,\n useAnalytics,\n useElementFilter,\n} from '@backstage/core-plugin-api';\nimport Badge from '@material-ui/core/Badge';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles, styled, Theme } from '@material-ui/core/styles';\nimport {\n CreateCSSProperties,\n StyledComponentProps,\n} from '@material-ui/core/styles/withStyles';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport ArrowDropDown from '@material-ui/icons/ArrowDropDown';\nimport ArrowDropUp from '@material-ui/icons/ArrowDropUp';\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\nimport SearchIcon from '@material-ui/icons/Search';\nimport classnames from 'classnames';\nimport type { Location } from 'history';\n\nimport {\n ComponentProps,\n ComponentType,\n CSSProperties,\n forwardRef,\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n MouseEvent,\n ChangeEvent,\n ReactElement,\n createElement,\n} from 'react';\n\nimport {\n Link,\n NavLinkProps,\n resolvePath,\n useLocation,\n useResolvedPath,\n} from 'react-router-dom';\n\nimport {\n SidebarConfig,\n SidebarConfigContext,\n SidebarItemWithSubmenuContext,\n} from './config';\nimport DoubleArrowLeft from './icons/DoubleArrowLeft';\nimport DoubleArrowRight from './icons/DoubleArrowRight';\nimport { useSidebarOpenState } from './SidebarOpenStateContext';\nimport { SidebarSubmenu, SidebarSubmenuProps } from './SidebarSubmenu';\nimport { SidebarSubmenuItemProps } from './SidebarSubmenuItem';\nimport { isLocationMatch } from './utils';\nimport Button from '@material-ui/core/Button';\n\n/** @public */\nexport type SidebarItemClassKey =\n | 'root'\n | 'buttonItem'\n | 'closed'\n | 'open'\n | 'highlightable'\n | 'highlighted'\n | 'label'\n | 'iconContainer'\n | 'searchRoot'\n | 'searchField'\n | 'searchFieldHTMLInput'\n | 'searchContainer'\n | 'secondaryAction'\n | 'closedItemIcon'\n | 'submenuArrow'\n | 'expandButton'\n | 'arrows'\n | 'selected';\n\nconst makeSidebarStyles = (sidebarConfig: SidebarConfig) =>\n makeStyles(\n theme => ({\n root: {\n color: theme.palette.navigation.color,\n display: 'flex',\n flexFlow: 'row nowrap',\n alignItems: 'center',\n height: 48,\n cursor: 'pointer',\n },\n buttonItem: {\n background: 'none',\n border: 'none',\n width: '100%',\n margin: 0,\n padding: 0,\n textAlign: 'inherit',\n font: 'inherit',\n textTransform: 'none',\n },\n itemIcon: {\n display: 'inline-flex',\n fontSize: theme.typography.fontSize,\n lineHeight: 0,\n '& svg': {\n width: '1.5em',\n height: '1.5em',\n fontSize: 'inherit',\n flexShrink: 0,\n },\n },\n closed: {\n width: sidebarConfig.drawerWidthClosed,\n justifyContent: 'center',\n },\n open: {\n [theme.breakpoints.up('sm')]: {\n width: sidebarConfig.drawerWidthOpen,\n },\n },\n highlightable: {\n '&:hover': {\n background:\n theme.palette.navigation.navItem?.hoverBackground ?? '#404040',\n },\n },\n highlighted: {\n background:\n theme.palette.navigation.navItem?.hoverBackground ?? '#404040',\n },\n label: {\n // XXX (@koroeskohr): I can't seem to achieve the desired font-weight from the designs\n fontWeight: 'bold',\n whiteSpace: 'nowrap',\n lineHeight: 'auto',\n flex: '3 1 auto',\n width: '110px',\n overflow: 'hidden',\n 'text-overflow': 'ellipsis',\n },\n iconContainer: {\n boxSizing: 'border-box',\n height: '100%',\n width: sidebarConfig.iconContainerWidth,\n marginRight: -theme.spacing(2),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: '0',\n },\n searchRoot: {\n marginBottom: 12,\n },\n searchField: {\n color: '#b5b5b5',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.fontSize,\n },\n searchFieldHTMLInput: {\n padding: theme.spacing(2, 0, 2),\n },\n searchContainer: {\n width: sidebarConfig.drawerWidthOpen - sidebarConfig.iconContainerWidth,\n },\n secondaryAction: {\n width: theme.spacing(6),\n textAlign: 'center',\n marginRight: theme.spacing(1),\n },\n closedItemIcon: {\n width: '100%',\n justifyContent: 'center',\n },\n submenuArrow: {\n display: 'flex',\n },\n expandButton: {\n background: 'none',\n border: 'none',\n color: theme.palette.navigation.color,\n width: '100%',\n cursor: 'pointer',\n position: 'relative',\n height: 48,\n },\n arrows: {\n position: 'absolute',\n right: 10,\n },\n selected: {\n '&$root': {\n borderLeft: `solid ${sidebarConfig.selectedIndicatorWidth}px ${theme.palette.navigation.indicator}`,\n color: theme.palette.navigation.selectedColor,\n },\n '&$closed': {\n width: sidebarConfig.drawerWidthClosed,\n },\n '& $closedItemIcon': {\n paddingRight: sidebarConfig.selectedIndicatorWidth,\n },\n '& $iconContainer': {\n marginLeft: -sidebarConfig.selectedIndicatorWidth,\n },\n },\n }),\n { name: 'BackstageSidebarItem' },\n );\n\n// This is a workaround for this issue https://github.com/mui/material-ui/issues/15511\n// The styling of the `selected` elements doesn't work as expected when using a prop callback.\n// Don't use this pattern unless needed\nfunction useMemoStyles(sidebarConfig: SidebarConfig) {\n const useStyles = useMemo(\n () => makeSidebarStyles(sidebarConfig),\n [sidebarConfig],\n );\n return useStyles();\n}\n\n/**\n * Evaluates the routes of the SubmenuItems & nested DropdownItems.\n * The reevaluation is only triggered, if the `locationPathname` changes, as `useElementFilter` uses memorization.\n *\n * @param submenu SidebarSubmenu component\n * @param location Location\n * @returns boolean\n */\nconst useLocationMatch = (\n submenu: ReactElement<SidebarSubmenuProps>,\n location: Location,\n): boolean =>\n useElementFilter(\n submenu.props.children,\n elements => {\n let active = false;\n elements\n .getElements()\n .forEach(\n ({\n props: { to, dropdownItems },\n }: {\n props: Partial<SidebarSubmenuItemProps>;\n }) => {\n if (!active) {\n if (dropdownItems?.length) {\n dropdownItems.forEach(\n ({ to: _to }) =>\n (active =\n active || isLocationMatch(location, resolvePath(_to))),\n );\n return;\n }\n if (to) {\n active = isLocationMatch(location, resolvePath(to));\n }\n }\n },\n );\n return active;\n },\n [location.pathname],\n );\n\ntype SidebarItemBaseProps = {\n icon: IconComponent;\n text?: string;\n hasNotifications?: boolean;\n hasSubmenu?: boolean;\n disableHighlight?: boolean;\n className?: string;\n noTrack?: boolean;\n onClick?: (ev: MouseEvent) => void;\n};\n\ntype SidebarItemButtonProps = SidebarItemBaseProps & {\n onClick: (ev: MouseEvent) => void;\n children?: ReactNode;\n};\n\ntype SidebarItemLinkProps = SidebarItemBaseProps & {\n to: string;\n onClick?: (ev: MouseEvent) => void;\n} & NavLinkProps;\n\ntype SidebarItemWithSubmenuProps = SidebarItemBaseProps & {\n to?: string;\n onClick?: (ev: MouseEvent) => void;\n children: ReactNode;\n};\n\n/**\n * SidebarItem with 'to' property will be a clickable link.\n * SidebarItem with 'onClick' property and without 'to' property will be a clickable button.\n * SidebarItem which wraps a SidebarSubmenu will be a clickable button which opens a submenu.\n */\ntype SidebarItemProps =\n | SidebarItemLinkProps\n | SidebarItemButtonProps\n | SidebarItemWithSubmenuProps;\n\nfunction isButtonItem(\n props: SidebarItemProps,\n): props is SidebarItemButtonProps {\n return (props as SidebarItemLinkProps).to === undefined;\n}\n\nconst sidebarSubmenuType = createElement(SidebarSubmenu).type;\n\n// TODO(Rugvip): Remove this once NavLink is updated in react-router-dom.\n// This is needed because react-router doesn't handle the path comparison\n// properly yet, matching for example /foobar with /foo.\nexport const WorkaroundNavLink = forwardRef<\n HTMLAnchorElement,\n NavLinkProps & {\n children?: ReactNode;\n activeStyle?: CSSProperties;\n activeClassName?: string;\n }\n>(function WorkaroundNavLinkWithRef(\n {\n to,\n end,\n style,\n className,\n activeStyle,\n caseSensitive,\n activeClassName = 'active',\n 'aria-current': ariaCurrentProp = 'page',\n ...rest\n },\n ref,\n) {\n let { pathname: locationPathname } = useLocation();\n let { pathname: toPathname } = useResolvedPath(to);\n\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n toPathname = toPathname.toLowerCase();\n }\n\n let isActive = locationPathname === toPathname;\n if (!isActive && !end) {\n // This is the behavior that is different from the original NavLink\n isActive = locationPathname.startsWith(`${toPathname}/`);\n }\n\n const ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n return (\n <Link\n {...rest}\n to={to}\n ref={ref}\n aria-current={ariaCurrent}\n style={{ ...style, ...(isActive ? activeStyle : undefined) }}\n className={classnames([\n typeof className !== 'function' ? className : undefined,\n isActive ? activeClassName : undefined,\n ])}\n />\n );\n});\n\n/**\n * Common component used by SidebarItem & SidebarItemWithSubmenu\n */\nconst SidebarItemBase = forwardRef<\n any,\n SidebarItemProps & { children: ReactNode }\n>((props, ref) => {\n const {\n icon: Icon,\n text,\n hasNotifications = false,\n hasSubmenu = false,\n disableHighlight = false,\n onClick,\n noTrack,\n children,\n className,\n ...navLinkProps\n } = props;\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n // XXX (@koroeskohr): unsure this is optimal. But I just really didn't want to have the item component\n // depend on the current location, and at least have it being optionally forced to selected.\n // Still waiting on a Q answered to fine tune the implementation\n const { isOpen } = useSidebarOpenState();\n\n const divStyle =\n !isOpen && hasSubmenu\n ? { display: 'flex', marginLeft: '20px' }\n : { lineHeight: '0' };\n\n const displayItemIcon = (\n <Box style={divStyle}>\n <Box component=\"span\" className={classes.itemIcon}>\n <Icon fontSize=\"inherit\" />\n </Box>\n {!isOpen && hasSubmenu ? <ArrowRightIcon fontSize=\"small\" /> : <></>}\n </Box>\n );\n\n const itemIcon = (\n <Badge\n color=\"secondary\"\n variant=\"dot\"\n overlap=\"circular\"\n invisible={!hasNotifications}\n className={classnames({ [classes.closedItemIcon]: !isOpen })}\n >\n {displayItemIcon}\n </Badge>\n );\n\n const openContent = (\n <>\n <Box data-testid=\"login-button\" className={classes.iconContainer}>\n {itemIcon}\n </Box>\n {text && (\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.label}\n >\n {text}\n </Typography>\n )}\n <div className={classes.secondaryAction}>{children}</div>\n </>\n );\n\n const content = isOpen ? openContent : itemIcon;\n\n const childProps = {\n onClick,\n className: classnames(\n className,\n classes.root,\n isOpen ? classes.open : classes.closed,\n isButtonItem(props) && classes.buttonItem,\n { [classes.highlightable]: !disableHighlight },\n ),\n };\n\n const analyticsApi = useAnalytics();\n const { pathname: to } = useResolvedPath(\n !isButtonItem(props) && props.to ? props.to : '',\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {\n if (!noTrack) {\n const action = 'click';\n const subject = text ?? 'Sidebar Item';\n const options = to ? { attributes: { to } } : undefined;\n analyticsApi.captureEvent(action, subject, options);\n }\n onClick?.(event);\n },\n [analyticsApi, text, to, noTrack, onClick],\n );\n\n if (isButtonItem(props)) {\n return (\n <Button\n role=\"button\"\n aria-label={text}\n {...childProps}\n ref={ref}\n onClick={handleClick}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <WorkaroundNavLink\n {...childProps}\n activeClassName={classes.selected}\n to={props.to ? props.to : ''}\n ref={ref}\n aria-label={text ? text : props.to}\n {...navLinkProps}\n onClick={handleClick}\n >\n {content}\n </WorkaroundNavLink>\n );\n});\n\nconst SidebarItemWithSubmenu = ({\n children,\n ...props\n}: SidebarItemBaseProps & {\n children: ReactElement<SidebarSubmenuProps>;\n}) => {\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n const [isHoveredOn, setIsHoveredOn] = useState(false);\n const location = useLocation();\n const isActive = useLocationMatch(children, location);\n const isSmallScreen = useMediaQuery((theme: Theme) =>\n theme.breakpoints.down('sm'),\n );\n\n const handleMouseEnter = () => {\n setIsHoveredOn(true);\n };\n const handleMouseLeave = () => {\n setIsHoveredOn(false);\n };\n\n const arrowIcon = () => {\n if (isSmallScreen) {\n return isHoveredOn ? (\n <ArrowDropUp fontSize=\"small\" className={classes.submenuArrow} />\n ) : (\n <ArrowDropDown fontSize=\"small\" className={classes.submenuArrow} />\n );\n }\n return (\n !isHoveredOn && (\n <ArrowRightIcon fontSize=\"small\" className={classes.submenuArrow} />\n )\n );\n };\n\n return (\n <SidebarItemWithSubmenuContext.Provider\n value={{\n isHoveredOn,\n setIsHoveredOn,\n }}\n >\n <div\n data-testid=\"item-with-submenu\"\n onMouseLeave={handleMouseLeave}\n onTouchStart={isHoveredOn ? handleMouseLeave : handleMouseEnter}\n onMouseEnter={handleMouseEnter}\n className={classnames(isHoveredOn && classes.highlighted)}\n >\n <SidebarItemBase\n hasSubmenu\n className={isActive ? classes.selected : ''}\n {...props}\n >\n {arrowIcon()}\n </SidebarItemBase>\n {isHoveredOn && children}\n </div>\n </SidebarItemWithSubmenuContext.Provider>\n );\n};\n\n/**\n * Creates a `SidebarItem`\n *\n * @remarks\n * If children contain a `SidebarSubmenu` component the `SidebarItem` will have a expandable submenu\n */\nexport const SidebarItem = forwardRef<\n any,\n SidebarItemProps & { children: ReactNode }\n>((props, ref) => {\n // Filter children for SidebarSubmenu components\n const [submenu] = useElementFilter(props.children, elements =>\n // Directly comparing child.type with SidebarSubmenu will not work with in\n // combination with react-hot-loader\n //\n // https://github.com/gaearon/react-hot-loader/issues/304#issuecomment-456569720\n elements.getElements().filter(child => child.type === sidebarSubmenuType),\n );\n\n if (submenu) {\n return (\n <SidebarItemWithSubmenu {...props}>\n {submenu as ReactElement<SidebarSubmenuProps>}\n </SidebarItemWithSubmenu>\n );\n }\n\n return <SidebarItemBase {...props} ref={ref} />;\n}) as (props: SidebarItemProps) => JSX.Element;\n\ntype SidebarSearchFieldProps = {\n onSearch: (input: string) => void;\n to?: string;\n icon?: IconComponent;\n};\n\nexport function SidebarSearchField(props: SidebarSearchFieldProps) {\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const [input, setInput] = useState('');\n const classes = useMemoStyles(sidebarConfig);\n const Icon = props.icon ? props.icon : SearchIcon;\n\n const search = () => {\n props.onSearch(input);\n setInput('');\n };\n\n const handleEnter: KeyboardEventHandler = ev => {\n if (ev.key === 'Enter') {\n ev.preventDefault();\n search();\n }\n };\n\n const handleInput = (ev: ChangeEvent<HTMLInputElement>) => {\n setInput(ev.target.value);\n };\n\n const handleInputClick = (ev: MouseEvent<HTMLInputElement>) => {\n // Clicking into the search fields shouldn't navigate to the search page\n ev.preventDefault();\n ev.stopPropagation();\n };\n\n const handleItemClick = (ev: MouseEvent) => {\n // Clicking on the search icon while should execute a query with the current field content\n search();\n ev.preventDefault();\n };\n\n return (\n <Box className={classes.searchRoot}>\n <SidebarItem\n icon={Icon}\n to={props.to}\n onClick={handleItemClick}\n disableHighlight\n >\n <TextField\n placeholder=\"Search\"\n value={input}\n onClick={handleInputClick}\n onChange={handleInput}\n onKeyDown={handleEnter}\n className={classes.searchContainer}\n InputProps={{\n disableUnderline: true,\n className: classes.searchField,\n }}\n inputProps={{\n className: classes.searchFieldHTMLInput,\n }}\n />\n </SidebarItem>\n </Box>\n );\n}\n\nexport type SidebarSpaceClassKey = 'root';\n\nexport const SidebarSpace = styled('div')(\n {\n flex: 1,\n },\n { name: 'BackstageSidebarSpace' },\n) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\nexport type SidebarSpacerClassKey = 'root';\n\nexport const SidebarSpacer = styled('div')(\n {\n height: 8,\n },\n { name: 'BackstageSidebarSpacer' },\n) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\nexport type SidebarDividerClassKey = 'root';\n\nexport const SidebarDivider = styled('hr')(\n ({ theme }) => ({\n height: 1,\n width: '100%',\n background: '#383838',\n border: 'none',\n margin: theme.spacing(1.2, 0),\n }),\n { name: 'BackstageSidebarDivider' },\n) as ComponentType<ComponentProps<'hr'> & StyledComponentProps<'root'>>;\n\nconst styledScrollbar = (theme: Theme): CreateCSSProperties => ({\n overflowY: 'auto',\n '&::-webkit-scrollbar': {\n backgroundColor: theme.palette.background.default,\n width: '5px',\n borderRadius: '5px',\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: theme.palette.text.secondary,\n borderRadius: '5px',\n },\n});\n\nexport const SidebarScrollWrapper = styled('div')(({ theme }) => {\n const scrollbarStyles = styledScrollbar(theme);\n return {\n flex: '0 1 auto',\n overflowX: 'hidden',\n width: '100%',\n // Display at least one item in the container\n // Question: Can this be a config/theme variable - if so, which? :/\n minHeight: '48px',\n overflowY: 'hidden',\n '@media (hover: none)': scrollbarStyles,\n '&:hover': scrollbarStyles,\n };\n}) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\n/**\n * A button which allows you to expand the sidebar when clicked.\n *\n * @remarks\n * Use optionally to replace sidebar's expand-on-hover feature with expand-on-click.\n *\n * If you are using this you might want to set the `disableExpandOnHover` of the `Sidebar` to `true`.\n *\n * @public\n */\nexport const SidebarExpandButton = () => {\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n const { isOpen, setOpen } = useSidebarOpenState();\n const isSmallScreen = useMediaQuery<Theme>(\n theme => theme.breakpoints.down('md'),\n { noSsr: true },\n );\n\n if (isSmallScreen) {\n return null;\n }\n\n const handleClick = () => {\n setOpen(!isOpen);\n };\n\n return (\n <Button\n role=\"button\"\n onClick={handleClick}\n className={classes.expandButton}\n aria-label=\"Expand Sidebar\"\n data-testid=\"sidebar-expand-button\"\n >\n <Box className={classes.arrows}>\n {isOpen ? <DoubleArrowLeft /> : <DoubleArrowRight />}\n </Box>\n </Button>\n );\n};\n"],"names":["classnames","ArrowDropUp","ArrowDropDown","SearchIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiGA,MAAM,iBAAA,GAAoB,CAAC,aAAA,KACzB,UAAA;AAAA,EACE,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,KAAA;AAAA,MAChC,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,UAAA,EAAY,QAAA;AAAA,MACZ,MAAA,EAAQ,EAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY;AAAA,MACV,UAAA,EAAY,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,MAC3B,UAAA,EAAY,CAAA;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY;AAAA;AACd,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAO,aAAA,CAAc,iBAAA;AAAA,MACrB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,CAAC,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,GAAG;AAAA,QAC5B,OAAO,aAAA,CAAc;AAAA;AACvB,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAA,EAAW;AAAA,QACT,UAAA,EACE,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,eAAA,IAAmB;AAAA;AACzD,KACF;AAAA,IACA,WAAA,EAAa;AAAA,MACX,UAAA,EACE,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,eAAA,IAAmB;AAAA,KACzD;AAAA,IACA,KAAA,EAAO;AAAA;AAAA,MAEL,UAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,YAAA;AAAA,MACX,MAAA,EAAQ,MAAA;AAAA,MACR,OAAO,aAAA,CAAc,kBAAA;AAAA,MACrB,WAAA,EAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC7B,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,IACA,UAAA,EAAY;AAAA,MACV,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,QAAA,EAAU,MAAM,UAAA,CAAW;AAAA,KAC7B;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC;AAAA,KAChC;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO,aAAA,CAAc,eAAA,GAAkB,aAAA,CAAc;AAAA,KACvD;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,SAAA,EAAW,QAAA;AAAA,MACX,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC9B;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,MAAA;AAAA,MACP,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,UAAA,EAAY,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,KAAA;AAAA,MAChC,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,QAAA,EAAU;AAAA,QACR,UAAA,EAAY,SAAS,aAAA,CAAc,sBAAsB,MAAM,KAAA,CAAM,OAAA,CAAQ,WAAW,SAAS,CAAA,CAAA;AAAA,QACjG,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,OAClC;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAO,aAAA,CAAc;AAAA,OACvB;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,cAAc,aAAA,CAAc;AAAA,OAC9B;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,UAAA,EAAY,CAAC,aAAA,CAAc;AAAA;AAC7B;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,sBAAA;AACV,CAAA;AAKF,SAAS,cAAc,aAAA,EAA8B;AACnD,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,MAAM,kBAAkB,aAAa,CAAA;AAAA,IACrC,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,OAAO,SAAA,EAAU;AACnB;AAUA,MAAM,gBAAA,GAAmB,CACvB,OAAA,EACA,QAAA,KAEA,gBAAA;AAAA,EACE,QAAQ,KAAA,CAAM,QAAA;AAAA,EACd,CAAA,QAAA,KAAY;AACV,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,QAAA,CACG,aAAY,CACZ,OAAA;AAAA,MACC,CAAC;AAAA,QACC,KAAA,EAAO,EAAE,EAAA,EAAI,aAAA;AAAc,OAC7B,KAEM;AACJ,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,YAAA,aAAA,CAAc,OAAA;AAAA,cACZ,CAAC,EAAE,EAAA,EAAI,GAAA,EAAI,KACR,MAAA,GACC,MAAA,IAAU,eAAA,CAAgB,QAAA,EAAU,WAAA,CAAY,GAAG,CAAC;AAAA,aAC1D;AACA,YAAA;AAAA,UACF;AACA,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,MAAA,GAAS,eAAA,CAAgB,QAAA,EAAU,WAAA,CAAY,EAAE,CAAC,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,KACF;AACF,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,CAAC,SAAS,QAAQ;AACpB,CAAA;AAuCF,SAAS,aACP,KAAA,EACiC;AACjC,EAAA,OAAQ,MAA+B,EAAA,KAAO,MAAA;AAChD;AAEA,MAAM,kBAAA,GAAqB,aAAA,CAAc,cAAc,CAAA,CAAE,IAAA;AAKlD,MAAM,iBAAA,GAAoB,UAAA,CAO/B,SAAS,wBAAA,CACT;AAAA,EACE,EAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA,GAAkB,QAAA;AAAA,EAClB,gBAAgB,eAAA,GAAkB,MAAA;AAAA,EAClC,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,IAAI,EAAE,QAAA,EAAU,gBAAA,EAAiB,GAAI,WAAA,EAAY;AACjD,EAAA,IAAI,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,gBAAgB,EAAE,CAAA;AAEjD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,gBAAA,GAAmB,iBAAiB,WAAA,EAAY;AAChD,IAAA,UAAA,GAAa,WAAW,WAAA,EAAY;AAAA,EACtC;AAEA,EAAA,IAAI,WAAW,gBAAA,KAAqB,UAAA;AACpC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,GAAA,EAAK;AAErB,IAAA,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,CAAA,EAAG,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,WAAA,GAAc,WAAW,eAAA,GAAkB,MAAA;AAEjD,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,EAAA;AAAA,MACA,GAAA;AAAA,MACA,cAAA,EAAc,WAAA;AAAA,MACd,OAAO,EAAE,GAAG,OAAO,GAAI,QAAA,GAAW,cAAc,MAAA,EAAW;AAAA,MAC3D,WAAWA,UAAA,CAAW;AAAA,QACpB,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,GAAY,MAAA;AAAA,QAC9C,WAAW,eAAA,GAAkB;AAAA,OAC9B;AAAA;AAAA,GACH;AAEJ,CAAC;AAKD,MAAM,eAAA,GAAkB,UAAA,CAGtB,CAAC,KAAA,EAAO,GAAA,KAAQ;AAChB,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,IAAA;AAAA,IACN,IAAA;AAAA,IACA,gBAAA,GAAmB,KAAA;AAAA,IACnB,UAAA,GAAa,KAAA;AAAA,IACb,gBAAA,GAAmB,KAAA;AAAA,IACnB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AACJ,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,CAAW,oBAAoB,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,cAAc,aAAa,CAAA;AAI3C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,mBAAA,EAAoB;AAEvC,EAAA,MAAM,QAAA,GACJ,CAAC,MAAA,IAAU,UAAA,GACP,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAO,GACtC,EAAE,UAAA,EAAY,GAAA,EAAI;AAExB,EAAA,MAAM,eAAA,mBACJ,IAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,QAAA,EACV,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,UACvC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAC3B,CAAA;AAAA,IACC,CAAC,UAAU,UAAA,mBAAa,GAAA,CAAC,kBAAe,QAAA,EAAS,OAAA,EAAQ,oBAAK,GAAA,CAAA,QAAA,EAAA,EAAE;AAAA,GAAA,EACnE,CAAA;AAGF,EAAA,MAAM,QAAA,mBACJ,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAQ,UAAA;AAAA,MACR,WAAW,CAAC,gBAAA;AAAA,MACZ,SAAA,EAAWA,WAAW,EAAE,CAAC,QAAQ,cAAc,GAAG,CAAC,MAAA,EAAQ,CAAA;AAAA,MAE1D,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,MAAM,8BACJ,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAI,aAAA,EAAY,cAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,eAChD,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,IACC,IAAA,oBACC,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAU,MAAA;AAAA,QACV,WAAW,OAAA,CAAQ,KAAA;AAAA,QAElB,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,iBAAkB,QAAA,EAAS;AAAA,GAAA,EACrD,CAAA;AAGF,EAAA,MAAM,OAAA,GAAU,SAAS,WAAA,GAAc,QAAA;AAEvC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,OAAA;AAAA,IACA,SAAA,EAAWA,UAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAA,CAAQ,IAAA;AAAA,MACR,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,MAAA;AAAA,MAChC,YAAA,CAAa,KAAK,CAAA,IAAK,OAAA,CAAQ,UAAA;AAAA,MAC/B,EAAE,CAAC,OAAA,CAAQ,aAAa,GAAG,CAAC,gBAAA;AAAiB;AAC/C,GACF;AAEA,EAAA,MAAM,eAAe,YAAA,EAAa;AAClC,EAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,eAAA;AAAA,IACvB,CAAC,YAAA,CAAa,KAAK,KAAK,KAAA,CAAM,EAAA,GAAK,MAAM,EAAA,GAAK;AAAA,GAChD;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,KAAA,KAA6D;AAC5D,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,MAAA,GAAS,OAAA;AACf,QAAA,MAAM,UAAU,IAAA,IAAQ,cAAA;AACxB,QAAA,MAAM,UAAU,EAAA,GAAK,EAAE,YAAY,EAAE,EAAA,IAAK,GAAI,MAAA;AAC9C,QAAA,YAAA,CAAa,YAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,GAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,IAAA,EAAM,EAAA,EAAI,SAAS,OAAO;AAAA,GAC3C;AAEA,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,IAAA;AAAA,QACX,GAAG,UAAA;AAAA,QACJ,GAAA;AAAA,QACA,OAAA,EAAS,WAAA;AAAA,QAER,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,iBAAiB,OAAA,CAAQ,QAAA;AAAA,MACzB,EAAA,EAAI,KAAA,CAAM,EAAA,GAAK,KAAA,CAAM,EAAA,GAAK,EAAA;AAAA,MAC1B,GAAA;AAAA,MACA,YAAA,EAAY,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,EAAA;AAAA,MAC/B,GAAG,YAAA;AAAA,MACJ,OAAA,EAAS,WAAA;AAAA,MAER,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;AAED,MAAM,yBAAyB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAEM;AACJ,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,CAAW,oBAAoB,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,cAAc,aAAa,CAAA;AAC3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,aAAA;AAAA,IAAc,CAAC,KAAA,KACnC,KAAA,CAAM,WAAA,CAAY,KAAK,IAAI;AAAA,GAC7B;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,WAAA,mBACL,GAAA,CAACC,eAAA,EAAA,EAAY,QAAA,EAAS,SAAQ,SAAA,EAAW,OAAA,CAAQ,YAAA,EAAc,CAAA,uBAE9DC,iBAAA,EAAA,EAAc,QAAA,EAAS,OAAA,EAAQ,SAAA,EAAW,QAAQ,YAAA,EAAc,CAAA;AAAA,IAErE;AACA,IAAA,OACE,CAAC,+BACC,GAAA,CAAC,cAAA,EAAA,EAAe,UAAS,OAAA,EAAQ,SAAA,EAAW,QAAQ,YAAA,EAAc,CAAA;AAAA,EAGxE,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,6BAAA,CAA8B,QAAA;AAAA,IAA9B;AAAA,MACC,KAAA,EAAO;AAAA,QACL,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,mBAAA;AAAA,UACZ,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc,cAAc,gBAAA,GAAmB,gBAAA;AAAA,UAC/C,YAAA,EAAc,gBAAA;AAAA,UACd,SAAA,EAAWF,UAAA,CAAW,WAAA,IAAe,OAAA,CAAQ,WAAW,CAAA;AAAA,UAExD,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,UAAA,EAAU,IAAA;AAAA,gBACV,SAAA,EAAW,QAAA,GAAW,OAAA,CAAQ,QAAA,GAAW,EAAA;AAAA,gBACxC,GAAG,KAAA;AAAA,gBAEH,QAAA,EAAA,SAAA;AAAU;AAAA,aACb;AAAA,YACC,WAAA,IAAe;AAAA;AAAA;AAAA;AAClB;AAAA,GACF;AAEJ,CAAA;AAQO,MAAM,WAAA,GAAc,UAAA,CAGzB,CAAC,KAAA,EAAO,GAAA,KAAQ;AAEhB,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,gBAAA;AAAA,IAAiB,KAAA,CAAM,QAAA;AAAA,IAAU,CAAA,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKjD,SAAS,WAAA,EAAY,CAAE,OAAO,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,kBAAkB;AAAA;AAAA,GAC1E;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA,CAAC,sBAAA,EAAA,EAAwB,GAAG,KAAA,EACzB,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,KAAA,EAAO,GAAA,EAAU,CAAA;AAC/C,CAAC;AAQM,SAAS,mBAAmB,KAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,CAAW,oBAAoB,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,cAAc,aAAa,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAOG,MAAA;AAEvC,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AACpB,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,cAAoC,CAAA,EAAA,KAAM;AAC9C,IAAA,IAAI,EAAA,CAAG,QAAQ,OAAA,EAAS;AACtB,MAAA,EAAA,CAAG,cAAA,EAAe;AAClB,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,EAAA,KAAsC;AACzD,IAAA,QAAA,CAAS,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAA,KAAqC;AAE7D,IAAA,EAAA,CAAG,cAAA,EAAe;AAClB,IAAA,EAAA,CAAG,eAAA,EAAgB;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAmB;AAE1C,IAAA,MAAA,EAAO;AACP,IAAA,EAAA,CAAG,cAAA,EAAe;AAAA,EACpB,CAAA;AAEA,EAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,UAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,IAAA;AAAA,MACN,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,OAAA,EAAS,eAAA;AAAA,MACT,gBAAA,EAAgB,IAAA;AAAA,MAEhB,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAY,QAAA;AAAA,UACZ,KAAA,EAAO,KAAA;AAAA,UACP,OAAA,EAAS,gBAAA;AAAA,UACT,QAAA,EAAU,WAAA;AAAA,UACV,SAAA,EAAW,WAAA;AAAA,UACX,WAAW,OAAA,CAAQ,eAAA;AAAA,UACnB,UAAA,EAAY;AAAA,YACV,gBAAA,EAAkB,IAAA;AAAA,YAClB,WAAW,OAAA,CAAQ;AAAA,WACrB;AAAA,UACA,UAAA,EAAY;AAAA,YACV,WAAW,OAAA,CAAQ;AAAA;AACrB;AAAA;AACF;AAAA,GACF,EACF,CAAA;AAEJ;AAIO,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,EACtC;AAAA,IACE,IAAA,EAAM;AAAA,GACR;AAAA,EACA,EAAE,MAAM,uBAAA;AACV;AAIO,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAAA,EACvC;AAAA,IACE,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,EAAE,MAAM,wBAAA;AACV;AAIO,MAAM,cAAA,GAAiB,OAAO,IAAI,CAAA;AAAA,EACvC,CAAC,EAAE,KAAA,EAAM,MAAO;AAAA,IACd,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAC;AAAA,GAC9B,CAAA;AAAA,EACA,EAAE,MAAM,yBAAA;AACV;AAEA,MAAM,eAAA,GAAkB,CAAC,KAAA,MAAuC;AAAA,EAC9D,SAAA,EAAW,MAAA;AAAA,EACX,sBAAA,EAAwB;AAAA,IACtB,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,IAC1C,KAAA,EAAO,KAAA;AAAA,IACP,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,IACpC,YAAA,EAAc;AAAA;AAElB,CAAA,CAAA;AAEO,MAAM,uBAAuB,MAAA,CAAO,KAAK,EAAE,CAAC,EAAE,OAAM,KAAM;AAC/D,EAAA,MAAM,eAAA,GAAkB,gBAAgB,KAAK,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,SAAA,EAAW,QAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA;AAAA;AAAA,IAGP,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW,QAAA;AAAA,IACX,sBAAA,EAAwB,eAAA;AAAA,IACxB,SAAA,EAAW;AAAA,GACb;AACF,CAAC;AAYM,MAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,CAAW,oBAAoB,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,cAAc,aAAa,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,mBAAA,EAAoB;AAChD,EAAA,MAAM,aAAA,GAAgB,aAAA;AAAA,IACpB,CAAA,KAAA,KAAS,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC,EAAE,OAAO,IAAA;AAAK,GAChB;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,CAAC,MAAM,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,WAAW,OAAA,CAAQ,YAAA;AAAA,MACnB,YAAA,EAAW,gBAAA;AAAA,MACX,aAAA,EAAY,uBAAA;AAAA,MAEZ,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACrB,QAAA,EAAA,MAAA,mBAAS,GAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,mBAAK,GAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,EACpD;AAAA;AAAA,GACF;AAEJ;;"}
|
|
1
|
+
{"version":3,"file":"Items.esm.js","sources":["../../../src/layout/Sidebar/Items.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 {\n IconComponent,\n useAnalytics,\n useElementFilter,\n} from '@backstage/core-plugin-api';\nimport Badge from '@material-ui/core/Badge';\nimport Box from '@material-ui/core/Box';\nimport { makeStyles, styled, Theme } from '@material-ui/core/styles';\nimport {\n CreateCSSProperties,\n StyledComponentProps,\n} from '@material-ui/core/styles/withStyles';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport ArrowDropDown from '@material-ui/icons/ArrowDropDown';\nimport ArrowDropUp from '@material-ui/icons/ArrowDropUp';\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\nimport SearchIcon from '@material-ui/icons/Search';\nimport classnames from 'classnames';\nimport type { Location } from 'history';\n\nimport {\n ComponentProps,\n ComponentType,\n CSSProperties,\n forwardRef,\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n MouseEvent,\n ChangeEvent,\n ReactElement,\n createElement,\n TouchEvent,\n} from 'react';\n\nimport {\n Link,\n NavLinkProps,\n resolvePath,\n useLocation,\n useResolvedPath,\n} from 'react-router-dom';\n\nimport {\n SidebarConfig,\n SidebarConfigContext,\n SidebarItemWithSubmenuContext,\n} from './config';\nimport DoubleArrowLeft from './icons/DoubleArrowLeft';\nimport DoubleArrowRight from './icons/DoubleArrowRight';\nimport { useSidebarOpenState } from './SidebarOpenStateContext';\nimport { SidebarSubmenu, SidebarSubmenuProps } from './SidebarSubmenu';\nimport { SidebarSubmenuItemProps } from './SidebarSubmenuItem';\nimport { isLocationMatch } from './utils';\nimport Button from '@material-ui/core/Button';\n\n/** @public */\nexport type SidebarItemClassKey =\n | 'root'\n | 'buttonItem'\n | 'closed'\n | 'open'\n | 'highlightable'\n | 'highlighted'\n | 'label'\n | 'iconContainer'\n | 'searchRoot'\n | 'searchField'\n | 'searchFieldHTMLInput'\n | 'searchContainer'\n | 'secondaryAction'\n | 'closedItemIcon'\n | 'submenuArrow'\n | 'expandButton'\n | 'arrows'\n | 'selected';\n\nconst makeSidebarStyles = (sidebarConfig: SidebarConfig) =>\n makeStyles(\n theme => ({\n root: {\n color: theme.palette.navigation.color,\n display: 'flex',\n flexFlow: 'row nowrap',\n alignItems: 'center',\n height: 48,\n cursor: 'pointer',\n },\n buttonItem: {\n background: 'none',\n border: 'none',\n width: '100%',\n margin: 0,\n padding: 0,\n textAlign: 'inherit',\n font: 'inherit',\n textTransform: 'none',\n },\n itemIcon: {\n display: 'inline-flex',\n fontSize: theme.typography.fontSize,\n lineHeight: 0,\n '& svg': {\n width: '1.5em',\n height: '1.5em',\n fontSize: 'inherit',\n flexShrink: 0,\n },\n },\n closed: {\n width: sidebarConfig.drawerWidthClosed,\n justifyContent: 'center',\n },\n open: {\n [theme.breakpoints.up('sm')]: {\n width: sidebarConfig.drawerWidthOpen,\n },\n },\n highlightable: {\n '&:hover': {\n background:\n theme.palette.navigation.navItem?.hoverBackground ?? '#404040',\n },\n },\n highlighted: {\n background:\n theme.palette.navigation.navItem?.hoverBackground ?? '#404040',\n },\n label: {\n // XXX (@koroeskohr): I can't seem to achieve the desired font-weight from the designs\n fontWeight: 'bold',\n whiteSpace: 'nowrap',\n lineHeight: 'auto',\n flex: '3 1 auto',\n width: '110px',\n overflow: 'hidden',\n 'text-overflow': 'ellipsis',\n },\n iconContainer: {\n boxSizing: 'border-box',\n height: '100%',\n width: sidebarConfig.iconContainerWidth,\n marginRight: -theme.spacing(2),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n lineHeight: '0',\n },\n searchRoot: {\n marginBottom: 12,\n },\n searchField: {\n color: '#b5b5b5',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.fontSize,\n },\n searchFieldHTMLInput: {\n padding: theme.spacing(2, 0, 2),\n },\n searchContainer: {\n width: sidebarConfig.drawerWidthOpen - sidebarConfig.iconContainerWidth,\n },\n secondaryAction: {\n width: theme.spacing(6),\n textAlign: 'center',\n marginRight: theme.spacing(1),\n },\n closedItemIcon: {\n width: '100%',\n justifyContent: 'center',\n },\n submenuArrow: {\n display: 'flex',\n },\n expandButton: {\n background: 'none',\n border: 'none',\n color: theme.palette.navigation.color,\n width: '100%',\n cursor: 'pointer',\n position: 'relative',\n height: 48,\n },\n arrows: {\n position: 'absolute',\n right: 10,\n },\n selected: {\n '&$root': {\n borderLeft: `solid ${sidebarConfig.selectedIndicatorWidth}px ${theme.palette.navigation.indicator}`,\n color: theme.palette.navigation.selectedColor,\n },\n '&$closed': {\n width: sidebarConfig.drawerWidthClosed,\n },\n '& $closedItemIcon': {\n paddingRight: sidebarConfig.selectedIndicatorWidth,\n },\n '& $iconContainer': {\n marginLeft: -sidebarConfig.selectedIndicatorWidth,\n },\n },\n }),\n { name: 'BackstageSidebarItem' },\n );\n\n// This is a workaround for this issue https://github.com/mui/material-ui/issues/15511\n// The styling of the `selected` elements doesn't work as expected when using a prop callback.\n// Don't use this pattern unless needed\nfunction useMemoStyles(sidebarConfig: SidebarConfig) {\n const useStyles = useMemo(\n () => makeSidebarStyles(sidebarConfig),\n [sidebarConfig],\n );\n return useStyles();\n}\n\n/**\n * Evaluates the routes of the SubmenuItems & nested DropdownItems.\n * The reevaluation is only triggered, if the `locationPathname` changes, as `useElementFilter` uses memorization.\n *\n * @param submenu SidebarSubmenu component\n * @param location Location\n * @returns boolean\n */\nconst useLocationMatch = (\n submenu: ReactElement<SidebarSubmenuProps>,\n location: Location,\n): boolean =>\n useElementFilter(\n submenu.props.children,\n elements => {\n let active = false;\n elements\n .getElements()\n .forEach(\n ({\n props: { to, dropdownItems },\n }: {\n props: Partial<SidebarSubmenuItemProps>;\n }) => {\n if (!active) {\n if (dropdownItems?.length) {\n dropdownItems.forEach(\n ({ to: _to }) =>\n (active =\n active || isLocationMatch(location, resolvePath(_to))),\n );\n return;\n }\n if (to) {\n active = isLocationMatch(location, resolvePath(to));\n }\n }\n },\n );\n return active;\n },\n [location.pathname],\n );\n\ntype SidebarItemBaseProps = {\n icon: IconComponent;\n text?: string;\n hasNotifications?: boolean;\n hasSubmenu?: boolean;\n disableHighlight?: boolean;\n className?: string;\n noTrack?: boolean;\n onClick?: (ev: MouseEvent) => void;\n};\n\ntype SidebarItemButtonProps = SidebarItemBaseProps & {\n onClick: (ev: MouseEvent) => void;\n children?: ReactNode;\n};\n\ntype SidebarItemLinkProps = SidebarItemBaseProps & {\n to: string;\n onClick?: (ev: MouseEvent) => void;\n} & NavLinkProps;\n\ntype SidebarItemWithSubmenuProps = SidebarItemBaseProps & {\n to?: string;\n onClick?: (ev: MouseEvent) => void;\n children: ReactNode;\n};\n\n/**\n * SidebarItem with 'to' property will be a clickable link.\n * SidebarItem with 'onClick' property and without 'to' property will be a clickable button.\n * SidebarItem which wraps a SidebarSubmenu will be a clickable button which opens a submenu.\n */\ntype SidebarItemProps =\n | SidebarItemLinkProps\n | SidebarItemButtonProps\n | SidebarItemWithSubmenuProps;\n\nfunction isButtonItem(\n props: SidebarItemProps,\n): props is SidebarItemButtonProps {\n return (props as SidebarItemLinkProps).to === undefined;\n}\n\nconst sidebarSubmenuType = createElement(SidebarSubmenu).type;\n\n// TODO(Rugvip): Remove this once NavLink is updated in react-router-dom.\n// This is needed because react-router doesn't handle the path comparison\n// properly yet, matching for example /foobar with /foo.\nexport const WorkaroundNavLink = forwardRef<\n HTMLAnchorElement,\n NavLinkProps & {\n children?: ReactNode;\n activeStyle?: CSSProperties;\n activeClassName?: string;\n }\n>(function WorkaroundNavLinkWithRef(\n {\n to,\n end,\n style,\n className,\n activeStyle,\n caseSensitive,\n activeClassName = 'active',\n 'aria-current': ariaCurrentProp = 'page',\n ...rest\n },\n ref,\n) {\n let { pathname: locationPathname } = useLocation();\n let { pathname: toPathname } = useResolvedPath(to);\n\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n toPathname = toPathname.toLowerCase();\n }\n\n let isActive = locationPathname === toPathname;\n if (!isActive && !end) {\n // This is the behavior that is different from the original NavLink\n isActive = locationPathname.startsWith(`${toPathname}/`);\n }\n\n const ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n return (\n <Link\n {...rest}\n to={to}\n ref={ref}\n aria-current={ariaCurrent}\n style={{ ...style, ...(isActive ? activeStyle : undefined) }}\n className={classnames([\n typeof className !== 'function' ? className : undefined,\n isActive ? activeClassName : undefined,\n ])}\n />\n );\n});\n\n/**\n * Common component used by SidebarItem & SidebarItemWithSubmenu\n */\nconst SidebarItemBase = forwardRef<\n any,\n SidebarItemProps & { children: ReactNode }\n>((props, ref) => {\n const {\n icon: Icon,\n text,\n hasNotifications = false,\n hasSubmenu = false,\n disableHighlight = false,\n onClick,\n noTrack,\n children,\n className,\n ...navLinkProps\n } = props;\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n // XXX (@koroeskohr): unsure this is optimal. But I just really didn't want to have the item component\n // depend on the current location, and at least have it being optionally forced to selected.\n // Still waiting on a Q answered to fine tune the implementation\n const { isOpen } = useSidebarOpenState();\n\n const divStyle =\n !isOpen && hasSubmenu\n ? { display: 'flex', marginLeft: '20px' }\n : { lineHeight: '0' };\n\n const displayItemIcon = (\n <Box style={divStyle}>\n <Box component=\"span\" className={classes.itemIcon}>\n <Icon fontSize=\"inherit\" />\n </Box>\n {!isOpen && hasSubmenu ? <ArrowRightIcon fontSize=\"small\" /> : <></>}\n </Box>\n );\n\n const itemIcon = (\n <Badge\n color=\"secondary\"\n variant=\"dot\"\n overlap=\"circular\"\n invisible={!hasNotifications}\n className={classnames({ [classes.closedItemIcon]: !isOpen })}\n >\n {displayItemIcon}\n </Badge>\n );\n\n const openContent = (\n <>\n <Box data-testid=\"login-button\" className={classes.iconContainer}>\n {itemIcon}\n </Box>\n {text && (\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.label}\n >\n {text}\n </Typography>\n )}\n <div className={classes.secondaryAction}>{children}</div>\n </>\n );\n\n const content = isOpen ? openContent : itemIcon;\n\n const childProps = {\n onClick,\n className: classnames(\n className,\n classes.root,\n isOpen ? classes.open : classes.closed,\n isButtonItem(props) && classes.buttonItem,\n { [classes.highlightable]: !disableHighlight },\n ),\n };\n\n const analyticsApi = useAnalytics();\n const { pathname: to } = useResolvedPath(\n !isButtonItem(props) && props.to ? props.to : '',\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {\n if (!noTrack) {\n const action = 'click';\n const subject = text ?? 'Sidebar Item';\n const options = to ? { attributes: { to } } : undefined;\n analyticsApi.captureEvent(action, subject, options);\n }\n onClick?.(event);\n },\n [analyticsApi, text, to, noTrack, onClick],\n );\n\n if (isButtonItem(props)) {\n return (\n <Button\n role=\"button\"\n aria-label={text}\n {...childProps}\n ref={ref}\n onClick={handleClick}\n >\n {content}\n </Button>\n );\n }\n\n return (\n <WorkaroundNavLink\n {...childProps}\n activeClassName={classes.selected}\n to={props.to ? props.to : ''}\n ref={ref}\n aria-label={text ? text : props.to}\n {...navLinkProps}\n onClick={handleClick}\n >\n {content}\n </WorkaroundNavLink>\n );\n});\n\nconst SidebarItemWithSubmenu = ({\n children,\n ...props\n}: SidebarItemBaseProps & {\n children: ReactElement<SidebarSubmenuProps>;\n}) => {\n const { sidebarConfig, submenuConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n const [isHoveredOn, setIsHoveredOn] = useState(false);\n const location = useLocation();\n const isActive = useLocationMatch(children, location);\n const isSmallScreen = useMediaQuery((theme: Theme) =>\n theme.breakpoints.down('sm'),\n );\n const closeTimerRef = useRef<number>();\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n }\n };\n }, []);\n\n const handleMouseEnter = () => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = undefined;\n }\n setIsHoveredOn(true);\n };\n const handleMouseLeave = (event: MouseEvent | TouchEvent) => {\n if (event.type === 'mouseleave' && submenuConfig.defaultCloseDelayMs > 0) {\n closeTimerRef.current = window.setTimeout(() => {\n closeTimerRef.current = undefined;\n setIsHoveredOn(false);\n }, submenuConfig.defaultCloseDelayMs);\n } else {\n setIsHoveredOn(false);\n }\n };\n\n const arrowIcon = () => {\n if (isSmallScreen) {\n return isHoveredOn ? (\n <ArrowDropUp fontSize=\"small\" className={classes.submenuArrow} />\n ) : (\n <ArrowDropDown fontSize=\"small\" className={classes.submenuArrow} />\n );\n }\n return (\n !isHoveredOn && (\n <ArrowRightIcon fontSize=\"small\" className={classes.submenuArrow} />\n )\n );\n };\n\n return (\n <SidebarItemWithSubmenuContext.Provider\n value={{\n isHoveredOn,\n setIsHoveredOn,\n }}\n >\n <div\n data-testid=\"item-with-submenu\"\n onMouseLeave={handleMouseLeave}\n onTouchStart={isHoveredOn ? handleMouseLeave : handleMouseEnter}\n onMouseEnter={handleMouseEnter}\n className={classnames(isHoveredOn && classes.highlighted)}\n >\n <SidebarItemBase\n hasSubmenu\n className={isActive ? classes.selected : ''}\n {...props}\n >\n {arrowIcon()}\n </SidebarItemBase>\n {isHoveredOn && children}\n </div>\n </SidebarItemWithSubmenuContext.Provider>\n );\n};\n\n/**\n * Creates a `SidebarItem`\n *\n * @remarks\n * If children contain a `SidebarSubmenu` component the `SidebarItem` will have a expandable submenu\n */\nexport const SidebarItem = forwardRef<\n any,\n SidebarItemProps & { children: ReactNode }\n>((props, ref) => {\n // Filter children for SidebarSubmenu components\n const [submenu] = useElementFilter(props.children, elements =>\n // Directly comparing child.type with SidebarSubmenu will not work with in\n // combination with react-hot-loader\n //\n // https://github.com/gaearon/react-hot-loader/issues/304#issuecomment-456569720\n elements.getElements().filter(child => child.type === sidebarSubmenuType),\n );\n\n if (submenu) {\n return (\n <SidebarItemWithSubmenu {...props}>\n {submenu as ReactElement<SidebarSubmenuProps>}\n </SidebarItemWithSubmenu>\n );\n }\n\n return <SidebarItemBase {...props} ref={ref} />;\n}) as (props: SidebarItemProps) => JSX.Element;\n\ntype SidebarSearchFieldProps = {\n onSearch: (input: string) => void;\n to?: string;\n icon?: IconComponent;\n};\n\nexport function SidebarSearchField(props: SidebarSearchFieldProps) {\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const [input, setInput] = useState('');\n const classes = useMemoStyles(sidebarConfig);\n const Icon = props.icon ? props.icon : SearchIcon;\n\n const search = () => {\n props.onSearch(input);\n setInput('');\n };\n\n const handleEnter: KeyboardEventHandler = ev => {\n if (ev.key === 'Enter') {\n ev.preventDefault();\n search();\n }\n };\n\n const handleInput = (ev: ChangeEvent<HTMLInputElement>) => {\n setInput(ev.target.value);\n };\n\n const handleInputClick = (ev: MouseEvent<HTMLInputElement>) => {\n // Clicking into the search fields shouldn't navigate to the search page\n ev.preventDefault();\n ev.stopPropagation();\n };\n\n const handleItemClick = (ev: MouseEvent) => {\n // Clicking on the search icon while should execute a query with the current field content\n search();\n ev.preventDefault();\n };\n\n return (\n <Box className={classes.searchRoot}>\n <SidebarItem\n icon={Icon}\n to={props.to}\n onClick={handleItemClick}\n disableHighlight\n >\n <TextField\n placeholder=\"Search\"\n value={input}\n onClick={handleInputClick}\n onChange={handleInput}\n onKeyDown={handleEnter}\n className={classes.searchContainer}\n InputProps={{\n disableUnderline: true,\n className: classes.searchField,\n }}\n inputProps={{\n className: classes.searchFieldHTMLInput,\n }}\n />\n </SidebarItem>\n </Box>\n );\n}\n\nexport type SidebarSpaceClassKey = 'root';\n\nexport const SidebarSpace = styled('div')(\n {\n flex: 1,\n },\n { name: 'BackstageSidebarSpace' },\n) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\nexport type SidebarSpacerClassKey = 'root';\n\nexport const SidebarSpacer = styled('div')(\n {\n height: 8,\n },\n { name: 'BackstageSidebarSpacer' },\n) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\nexport type SidebarDividerClassKey = 'root';\n\nexport const SidebarDivider = styled('hr')(\n ({ theme }) => ({\n height: 1,\n width: '100%',\n background: '#383838',\n border: 'none',\n margin: theme.spacing(1.2, 0),\n }),\n { name: 'BackstageSidebarDivider' },\n) as ComponentType<ComponentProps<'hr'> & StyledComponentProps<'root'>>;\n\nconst styledScrollbar = (theme: Theme): CreateCSSProperties => ({\n overflowY: 'auto',\n '&::-webkit-scrollbar': {\n backgroundColor: theme.palette.background.default,\n width: '5px',\n borderRadius: '5px',\n },\n '&::-webkit-scrollbar-thumb': {\n backgroundColor: theme.palette.text.secondary,\n borderRadius: '5px',\n },\n});\n\nexport const SidebarScrollWrapper = styled('div')(({ theme }) => {\n const scrollbarStyles = styledScrollbar(theme);\n return {\n flex: '0 1 auto',\n overflowX: 'hidden',\n width: '100%',\n // Display at least one item in the container\n // Question: Can this be a config/theme variable - if so, which? :/\n minHeight: '48px',\n overflowY: 'hidden',\n '@media (hover: none)': scrollbarStyles,\n '&:hover': scrollbarStyles,\n };\n}) as ComponentType<ComponentProps<'div'> & StyledComponentProps<'root'>>;\n\n/**\n * A button which allows you to expand the sidebar when clicked.\n *\n * @remarks\n * Use optionally to replace sidebar's expand-on-hover feature with expand-on-click.\n *\n * If you are using this you might want to set the `disableExpandOnHover` of the `Sidebar` to `true`.\n *\n * @public\n */\nexport const SidebarExpandButton = () => {\n const { sidebarConfig } = useContext(SidebarConfigContext);\n const classes = useMemoStyles(sidebarConfig);\n const { isOpen, setOpen } = useSidebarOpenState();\n const isSmallScreen = useMediaQuery<Theme>(\n theme => theme.breakpoints.down('md'),\n { noSsr: true },\n );\n\n if (isSmallScreen) {\n return null;\n }\n\n const handleClick = () => {\n setOpen(!isOpen);\n };\n\n return (\n <Button\n role=\"button\"\n onClick={handleClick}\n className={classes.expandButton}\n aria-label=\"Expand Sidebar\"\n data-testid=\"sidebar-expand-button\"\n >\n <Box className={classes.arrows}>\n {isOpen ? <DoubleArrowLeft /> : <DoubleArrowRight />}\n </Box>\n </Button>\n );\n};\n"],"names":["classnames","ArrowDropUp","ArrowDropDown","SearchIcon"],"mappings":"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"}
|
|
@@ -30,7 +30,8 @@ const makeSidebarConfig = (customSidebarConfig) => ({
|
|
|
30
30
|
const submenuConfig = {
|
|
31
31
|
drawerWidthClosed: 0,
|
|
32
32
|
drawerWidthOpen: 202,
|
|
33
|
-
defaultOpenDelayMs: sidebarConfig.defaultOpenDelayMs + 200
|
|
33
|
+
defaultOpenDelayMs: sidebarConfig.defaultOpenDelayMs + 200,
|
|
34
|
+
defaultCloseDelayMs: 0
|
|
34
35
|
};
|
|
35
36
|
const makeSidebarSubmenuConfig = (customSubmenuConfig) => ({
|
|
36
37
|
...submenuConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.esm.js","sources":["../../../src/layout/Sidebar/config.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { createContext, Dispatch, SetStateAction } from 'react';\n\nconst drawerWidthClosed = 72;\nconst iconPadding = 24;\nconst userBadgePadding = 18;\n\n/** @public */\nexport type SidebarOptions = {\n drawerWidthClosed?: number;\n drawerWidthOpen?: number;\n};\n\n/** @public */\nexport type SubmenuOptions = {\n drawerWidthClosed?: number;\n drawerWidthOpen?: number;\n};\n\n/** @internal */\nexport type SidebarConfig = {\n drawerWidthClosed: number;\n drawerWidthOpen: number;\n defaultOpenDelayMs: number;\n defaultCloseDelayMs: number;\n defaultFadeDuration: number;\n logoHeight: number;\n iconContainerWidth: number;\n iconSize: number;\n iconPadding: number;\n selectedIndicatorWidth: number;\n userBadgePadding: number;\n userBadgeDiameter: number;\n mobileSidebarHeight: number;\n};\n\nexport const sidebarConfig = {\n drawerWidthClosed,\n drawerWidthOpen: 224,\n // As per NN/g's guidance on timing for exposing hidden content\n // See https://www.nngroup.com/articles/timing-exposing-content/\n defaultOpenDelayMs: 100,\n defaultCloseDelayMs: 0,\n defaultFadeDuration: 200,\n logoHeight: 32,\n iconContainerWidth: drawerWidthClosed,\n iconSize: drawerWidthClosed - iconPadding * 2,\n iconPadding,\n selectedIndicatorWidth: 3,\n userBadgePadding,\n userBadgeDiameter: drawerWidthClosed - userBadgePadding * 2,\n mobileSidebarHeight: 56,\n};\n\nexport const makeSidebarConfig = (\n customSidebarConfig: Partial<SidebarOptions>,\n) => ({\n ...sidebarConfig,\n ...customSidebarConfig,\n iconContainerWidth: sidebarConfig.drawerWidthClosed,\n iconSize: sidebarConfig.drawerWidthClosed - sidebarConfig.iconPadding * 2,\n userBadgeDiameter:\n sidebarConfig.drawerWidthClosed - sidebarConfig.userBadgePadding * 2,\n});\n\n/** @internal */\nexport type SubmenuConfig = {\n drawerWidthClosed: number;\n drawerWidthOpen: number;\n defaultOpenDelayMs: number;\n};\n\nexport const submenuConfig = {\n drawerWidthClosed: 0,\n drawerWidthOpen: 202,\n defaultOpenDelayMs: sidebarConfig.defaultOpenDelayMs + 200,\n};\n\nexport const makeSidebarSubmenuConfig = (\n customSubmenuConfig: Partial<SubmenuOptions>,\n) => ({\n ...submenuConfig,\n ...customSubmenuConfig,\n});\n\nexport const SIDEBAR_INTRO_LOCAL_STORAGE =\n '@backstage/core/sidebar-intro-dismissed';\n\nexport type SidebarConfigContextType = {\n sidebarConfig: SidebarConfig;\n submenuConfig: SubmenuConfig;\n};\n\nexport const SidebarConfigContext = createContext<SidebarConfigContextType>({\n sidebarConfig,\n submenuConfig,\n});\n\nexport type SidebarItemWithSubmenuContextType = {\n isHoveredOn: boolean;\n setIsHoveredOn: Dispatch<SetStateAction<boolean>>;\n};\n\nexport const SidebarItemWithSubmenuContext =\n createContext<SidebarItemWithSubmenuContextType>({\n isHoveredOn: false,\n setIsHoveredOn: () => {},\n });\n"],"names":[],"mappings":";;AAkBA,MAAM,iBAAA,GAAoB,EAAA;AAC1B,MAAM,WAAA,GAAc,EAAA;AACpB,MAAM,gBAAA,GAAmB,EAAA;
|
|
1
|
+
{"version":3,"file":"config.esm.js","sources":["../../../src/layout/Sidebar/config.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { createContext, Dispatch, SetStateAction } from 'react';\n\nconst drawerWidthClosed = 72;\nconst iconPadding = 24;\nconst userBadgePadding = 18;\n\n/** @public */\nexport type SidebarOptions = {\n drawerWidthClosed?: number;\n drawerWidthOpen?: number;\n};\n\n/** @public */\nexport type SubmenuOptions = {\n drawerWidthClosed?: number;\n drawerWidthOpen?: number;\n defaultCloseDelayMs?: number;\n};\n\n/** @internal */\nexport type SidebarConfig = {\n drawerWidthClosed: number;\n drawerWidthOpen: number;\n defaultOpenDelayMs: number;\n defaultCloseDelayMs: number;\n defaultFadeDuration: number;\n logoHeight: number;\n iconContainerWidth: number;\n iconSize: number;\n iconPadding: number;\n selectedIndicatorWidth: number;\n userBadgePadding: number;\n userBadgeDiameter: number;\n mobileSidebarHeight: number;\n};\n\nexport const sidebarConfig = {\n drawerWidthClosed,\n drawerWidthOpen: 224,\n // As per NN/g's guidance on timing for exposing hidden content\n // See https://www.nngroup.com/articles/timing-exposing-content/\n defaultOpenDelayMs: 100,\n defaultCloseDelayMs: 0,\n defaultFadeDuration: 200,\n logoHeight: 32,\n iconContainerWidth: drawerWidthClosed,\n iconSize: drawerWidthClosed - iconPadding * 2,\n iconPadding,\n selectedIndicatorWidth: 3,\n userBadgePadding,\n userBadgeDiameter: drawerWidthClosed - userBadgePadding * 2,\n mobileSidebarHeight: 56,\n};\n\nexport const makeSidebarConfig = (\n customSidebarConfig: Partial<SidebarOptions>,\n) => ({\n ...sidebarConfig,\n ...customSidebarConfig,\n iconContainerWidth: sidebarConfig.drawerWidthClosed,\n iconSize: sidebarConfig.drawerWidthClosed - sidebarConfig.iconPadding * 2,\n userBadgeDiameter:\n sidebarConfig.drawerWidthClosed - sidebarConfig.userBadgePadding * 2,\n});\n\n/** @internal */\nexport type SubmenuConfig = {\n drawerWidthClosed: number;\n drawerWidthOpen: number;\n defaultOpenDelayMs: number;\n defaultCloseDelayMs: number;\n};\n\nexport const submenuConfig = {\n drawerWidthClosed: 0,\n drawerWidthOpen: 202,\n defaultOpenDelayMs: sidebarConfig.defaultOpenDelayMs + 200,\n defaultCloseDelayMs: 0,\n};\n\nexport const makeSidebarSubmenuConfig = (\n customSubmenuConfig: Partial<SubmenuOptions>,\n) => ({\n ...submenuConfig,\n ...customSubmenuConfig,\n});\n\nexport const SIDEBAR_INTRO_LOCAL_STORAGE =\n '@backstage/core/sidebar-intro-dismissed';\n\nexport type SidebarConfigContextType = {\n sidebarConfig: SidebarConfig;\n submenuConfig: SubmenuConfig;\n};\n\nexport const SidebarConfigContext = createContext<SidebarConfigContextType>({\n sidebarConfig,\n submenuConfig,\n});\n\nexport type SidebarItemWithSubmenuContextType = {\n isHoveredOn: boolean;\n setIsHoveredOn: Dispatch<SetStateAction<boolean>>;\n};\n\nexport const SidebarItemWithSubmenuContext =\n createContext<SidebarItemWithSubmenuContextType>({\n isHoveredOn: false,\n setIsHoveredOn: () => {},\n });\n"],"names":[],"mappings":";;AAkBA,MAAM,iBAAA,GAAoB,EAAA;AAC1B,MAAM,WAAA,GAAc,EAAA;AACpB,MAAM,gBAAA,GAAmB,EAAA;AAgClB,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA;AAAA,EACA,eAAA,EAAiB,GAAA;AAAA;AAAA;AAAA,EAGjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,mBAAA,EAAqB,CAAA;AAAA,EACrB,mBAAA,EAAqB,GAAA;AAAA,EACrB,UAAA,EAAY,EAAA;AAAA,EACZ,kBAAA,EAAoB,iBAAA;AAAA,EACpB,QAAA,EAAU,oBAAoB,WAAA,GAAc,CAAA;AAAA,EAC5C,WAAA;AAAA,EACA,sBAAA,EAAwB,CAAA;AAAA,EACxB,gBAAA;AAAA,EACA,iBAAA,EAAmB,oBAAoB,gBAAA,GAAmB,CAAA;AAAA,EAC1D,mBAAA,EAAqB;AACvB;AAEO,MAAM,iBAAA,GAAoB,CAC/B,mBAAA,MACI;AAAA,EACJ,GAAG,aAAA;AAAA,EACH,GAAG,mBAAA;AAAA,EACH,oBAAoB,aAAA,CAAc,iBAAA;AAAA,EAClC,QAAA,EAAU,aAAA,CAAc,iBAAA,GAAoB,aAAA,CAAc,WAAA,GAAc,CAAA;AAAA,EACxE,iBAAA,EACE,aAAA,CAAc,iBAAA,GAAoB,aAAA,CAAc,gBAAA,GAAmB;AACvE,CAAA;AAUO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,CAAA;AAAA,EACnB,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,cAAc,kBAAA,GAAqB,GAAA;AAAA,EACvD,mBAAA,EAAqB;AACvB;AAEO,MAAM,wBAAA,GAA2B,CACtC,mBAAA,MACI;AAAA,EACJ,GAAG,aAAA;AAAA,EACH,GAAG;AACL,CAAA;AAEO,MAAM,2BAAA,GACX;AAOK,MAAM,uBAAuB,aAAA,CAAwC;AAAA,EAC1E,aAAA;AAAA,EACA;AACF,CAAC;AAOM,MAAM,gCACX,aAAA,CAAiD;AAAA,EAC/C,WAAA,EAAa,KAAA;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AACzB,CAAC;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/core-components",
|
|
3
|
-
"version": "0.18.15-next.
|
|
3
|
+
"version": "0.18.15-next.2",
|
|
4
4
|
"description": "Core components used by Backstage plugins and apps",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "web-library"
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"d3-selection": "^3.0.0",
|
|
89
89
|
"d3-shape": "^3.0.0",
|
|
90
90
|
"d3-zoom": "^3.0.0",
|
|
91
|
-
"js-yaml": "^
|
|
91
|
+
"js-yaml": "^5.0.0",
|
|
92
92
|
"linkify-react": "4.3.2",
|
|
93
93
|
"linkifyjs": "4.3.2",
|
|
94
94
|
"lodash": "^4.17.21",
|