@backstage/core-components 0.9.3-next.0 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @backstage/core-components
2
2
 
3
+ ## 0.9.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 7c7919777e: build(deps-dev): bump `@testing-library/react-hooks` from 7.0.2 to 8.0.0
8
+ - 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0
9
+ - 25b8e8d5b5: Add BackstageTab to overridableComponents so can override styles in a theme
10
+ - 230ad0826f: Bump to using `@types/node` v16
11
+ - 41fd107189: Exported `IdentityProviders` type.
12
+ - a13604b8f7: Adding a name to the core-components Tab styles so can customise in the theme settings
13
+ - 19648d5cf5: fix support config ref to use backstage/backstage
14
+ - d505e43ffc: Fix highlighting of active sidebar items.
15
+ - 72f3dfd05a: Updated ProxiedSignInPageProps docs
16
+ - 7741e47eae: `<Sidebar />` now accepts additional props `sidebarOptions` and `submenuOptions` to allow further customization
17
+ - Updated dependencies
18
+ - @backstage/core-plugin-api@1.0.1
19
+
20
+ ## 0.9.3-next.2
21
+
22
+ ### Patch Changes
23
+
24
+ - 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0
25
+ - 230ad0826f: Bump to using `@types/node` v16
26
+ - 41fd107189: Exported `IdentityProviders` type.
27
+ - d505e43ffc: Fix highlighting of active sidebar items.
28
+ - Updated dependencies
29
+ - @backstage/core-plugin-api@1.0.1-next.0
30
+
31
+ ## 0.9.3-next.1
32
+
33
+ ### Patch Changes
34
+
35
+ - 25b8e8d5b5: Add BackstageTab to overridableComponents so can override styles in a theme
36
+ - a13604b8f7: Adding a name to the core-components Tab styles so can customise in the theme settings
37
+ - 72f3dfd05a: Updated ProxiedSignInPageProps docs
38
+ - 7741e47eae: `<Sidebar />` now accepts additional props `sidebarOptions` and `submenuOptions` to allow further customization
39
+
3
40
  ## 0.9.3-next.0
4
41
 
5
42
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"RealLogViewer-5b0c3451.esm.js","sources":["../../src/components/LogViewer/AnsiProcessor.ts","../../src/components/LogViewer/styles.ts","../../src/components/LogViewer/LogLine.tsx","../../src/components/LogViewer/LogViewerControls.tsx","../../src/components/LogViewer/useLogViewerSearch.tsx","../../src/components/LogViewer/useLogViewerSelection.tsx","../../src/components/LogViewer/RealLogViewer.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 ansiRegexMaker from 'ansi-regex';\n\nconst ansiRegex = ansiRegexMaker();\nconst newlineRegex = /\\n\\r?/g;\n\n// A mapping of how each escape code changes the modifiers\nconst codeModifiers = Object.fromEntries(\n Object.entries({\n 1: m => ({ ...m, bold: true }),\n 3: m => ({ ...m, italic: true }),\n 4: m => ({ ...m, underline: true }),\n 22: ({ bold: _, ...m }) => m,\n 23: ({ italic: _, ...m }) => m,\n 24: ({ underline: _, ...m }) => m,\n 30: m => ({ ...m, foreground: 'black' }),\n 31: m => ({ ...m, foreground: 'red' }),\n 32: m => ({ ...m, foreground: 'green' }),\n 33: m => ({ ...m, foreground: 'yellow' }),\n 34: m => ({ ...m, foreground: 'blue' }),\n 35: m => ({ ...m, foreground: 'magenta' }),\n 36: m => ({ ...m, foreground: 'cyan' }),\n 37: m => ({ ...m, foreground: 'white' }),\n 39: ({ foreground: _, ...m }) => m,\n 90: m => ({ ...m, foreground: 'grey' }),\n 40: m => ({ ...m, background: 'black' }),\n 41: m => ({ ...m, background: 'red' }),\n 42: m => ({ ...m, background: 'green' }),\n 43: m => ({ ...m, background: 'yellow' }),\n 44: m => ({ ...m, background: 'blue' }),\n 45: m => ({ ...m, background: 'magenta' }),\n 46: m => ({ ...m, background: 'cyan' }),\n 47: m => ({ ...m, background: 'white' }),\n 49: ({ background: _, ...m }) => m,\n } as Record<string, (m: ChunkModifiers) => ChunkModifiers>).map(\n ([code, modifier]) => [`\\x1b[${code}m`, modifier],\n ),\n);\n\nexport type AnsiColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'grey';\n\nexport interface ChunkModifiers {\n foreground?: AnsiColor;\n background?: AnsiColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport interface AnsiChunk {\n text: string;\n modifiers: ChunkModifiers;\n}\n\nexport class AnsiLine {\n text: string;\n\n constructor(\n readonly lineNumber: number = 1,\n readonly chunks: AnsiChunk[] = [],\n ) {\n this.text = chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n\n lastChunk(): AnsiChunk | undefined {\n return this.chunks[this.chunks.length - 1];\n }\n\n replaceLastChunk(newChunks?: AnsiChunk[]) {\n if (newChunks) {\n this.chunks.splice(this.chunks.length - 1, 1, ...newChunks);\n this.text = this.chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n }\n}\n\nexport class AnsiProcessor {\n private text: string = '';\n private lines: AnsiLine[] = [];\n\n /**\n * Processes a chunk of text while keeping internal state that optimizes\n * subsequent processing that appends to the text.\n */\n process(text: string): AnsiLine[] {\n if (this.text === text) {\n return this.lines;\n }\n\n if (text.startsWith(this.text)) {\n const lastLineIndex = this.lines.length > 0 ? this.lines.length - 1 : 0;\n const lastLine = this.lines[lastLineIndex] ?? new AnsiLine();\n const lastChunk = lastLine.lastChunk();\n\n const newLines = this.processLines(\n (lastChunk?.text ?? '') + text.slice(this.text.length),\n lastChunk?.modifiers,\n lastLine?.lineNumber,\n );\n lastLine.replaceLastChunk(newLines[0]?.chunks);\n\n this.lines[lastLineIndex] = lastLine;\n this.lines.push(...newLines.slice(1));\n } else {\n this.lines = this.processLines(text);\n }\n this.text = text;\n\n return this.lines;\n }\n\n // Split a chunk of text up into lines and process each line individually\n private processLines = (\n text: string,\n modifiers: ChunkModifiers = {},\n startingLineNumber: number = 1,\n ): AnsiLine[] => {\n const lines: AnsiLine[] = [];\n\n let currentModifiers = modifiers;\n let currentLineNumber = startingLineNumber;\n\n let prevIndex = 0;\n newlineRegex.lastIndex = 0;\n for (;;) {\n const match = newlineRegex.exec(text);\n if (!match) {\n const chunks = this.processText(\n text.slice(prevIndex),\n currentModifiers,\n );\n lines.push(new AnsiLine(currentLineNumber, chunks));\n return lines;\n }\n\n const line = text.slice(prevIndex, match.index);\n prevIndex = match.index + match[0].length;\n\n const chunks = this.processText(line, currentModifiers);\n lines.push(new AnsiLine(currentLineNumber, chunks));\n\n // Modifiers that are active in the last chunk are carried over to the next line\n currentModifiers =\n chunks[chunks.length - 1].modifiers ?? currentModifiers;\n currentLineNumber += 1;\n }\n };\n\n // Processing of a one individual text chunk\n private processText = (\n fullText: string,\n modifiers: ChunkModifiers,\n ): AnsiChunk[] => {\n const chunks: AnsiChunk[] = [];\n\n let currentModifiers = modifiers;\n\n let prevIndex = 0;\n ansiRegex.lastIndex = 0;\n for (;;) {\n const match = ansiRegex.exec(fullText);\n if (!match) {\n chunks.push({\n text: fullText.slice(prevIndex),\n modifiers: currentModifiers,\n });\n return chunks;\n }\n\n const text = fullText.slice(prevIndex, match.index);\n chunks.push({ text, modifiers: currentModifiers });\n\n // For every escape code that we encounter we keep track of where the\n // next chunk of text starts, and what modifiers it has\n prevIndex = match.index + match[0].length;\n currentModifiers = this.processCode(match[0], currentModifiers);\n }\n };\n\n private processCode = (\n code: string,\n modifiers: ChunkModifiers,\n ): ChunkModifiers => {\n return codeModifiers[code]?.(modifiers) ?? modifiers;\n };\n}\n","/*\n * Copyright 2021 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 { alpha, makeStyles } from '@material-ui/core/styles';\nimport * as colors from '@material-ui/core/colors';\n\nexport const HEADER_SIZE = 40;\n\n/** @public Class keys for overriding LogViewer styles */\nexport type LogViewerClassKey =\n | 'root'\n | 'header'\n | 'log'\n | 'line'\n | 'lineSelected'\n | 'lineCopyButton'\n | 'lineNumber'\n | 'textHighlight'\n | 'textSelectedHighlight'\n | 'modifierBold'\n | 'modifierItalic'\n | 'modifierUnderline'\n | 'modifierForegroundBlack'\n | 'modifierForegroundRed'\n | 'modifierForegroundGreen'\n | 'modifierForegroundYellow'\n | 'modifierForegroundBlue'\n | 'modifierForegroundMagenta'\n | 'modifierForegroundCyan'\n | 'modifierForegroundWhite'\n | 'modifierForegroundGrey'\n | 'modifierBackgroundBlack'\n | 'modifierBackgroundRed'\n | 'modifierBackgroundGreen'\n | 'modifierBackgroundYellow'\n | 'modifierBackgroundBlue'\n | 'modifierBackgroundMagenta'\n | 'modifierBackgroundCyan'\n | 'modifierBackgroundWhite'\n | 'modifierBackgroundGrey';\n\nexport const useStyles = makeStyles(\n theme => ({\n root: {\n background: theme.palette.background.paper,\n },\n header: {\n height: HEADER_SIZE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n log: {\n fontFamily: '\"Monaco\", monospace',\n fontSize: theme.typography.pxToRem(12),\n },\n line: {\n position: 'relative',\n whiteSpace: 'pre',\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n lineSelected: {\n background: theme.palette.action.selected,\n\n '&:hover': {\n background: theme.palette.action.selected,\n },\n },\n lineCopyButton: {\n position: 'absolute',\n paddingTop: 0,\n paddingBottom: 0,\n },\n lineNumber: {\n display: 'inline-block',\n textAlign: 'end',\n width: 60,\n marginRight: theme.spacing(1),\n cursor: 'pointer',\n },\n textHighlight: {\n background: alpha(theme.palette.info.main, 0.15),\n },\n textSelectedHighlight: {\n background: alpha(theme.palette.info.main, 0.4),\n },\n modifierBold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n modifierItalic: {\n fontStyle: 'italic',\n },\n modifierUnderline: {\n textDecoration: 'underline',\n },\n modifierForegroundBlack: {\n color: colors.common.black,\n },\n modifierForegroundRed: {\n color: colors.red[500],\n },\n modifierForegroundGreen: {\n color: colors.green[500],\n },\n modifierForegroundYellow: {\n color: colors.yellow[500],\n },\n modifierForegroundBlue: {\n color: colors.blue[500],\n },\n modifierForegroundMagenta: {\n color: colors.purple[500],\n },\n modifierForegroundCyan: {\n color: colors.cyan[500],\n },\n modifierForegroundWhite: {\n color: colors.common.white,\n },\n modifierForegroundGrey: {\n color: colors.grey[500],\n },\n modifierBackgroundBlack: {\n background: colors.common.black,\n },\n modifierBackgroundRed: {\n background: colors.red[500],\n },\n modifierBackgroundGreen: {\n background: colors.green[500],\n },\n modifierBackgroundYellow: {\n background: colors.yellow[500],\n },\n modifierBackgroundBlue: {\n background: colors.blue[500],\n },\n modifierBackgroundMagenta: {\n background: colors.purple[500],\n },\n modifierBackgroundCyan: {\n background: colors.cyan[500],\n },\n modifierBackgroundWhite: {\n background: colors.common.white,\n },\n modifierBackgroundGrey: {\n background: colors.grey[500],\n },\n }),\n { name: 'BackstageLogViewer' },\n);\n","/*\n * Copyright 2021 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 React, { useMemo } from 'react';\nimport { AnsiChunk, AnsiLine, ChunkModifiers } from './AnsiProcessor';\nimport startCase from 'lodash/startCase';\nimport classnames from 'classnames';\nimport { useStyles } from './styles';\n\nexport function getModifierClasses(\n classes: ReturnType<typeof useStyles>,\n modifiers: ChunkModifiers,\n) {\n const classNames = new Array<string>();\n if (modifiers.bold) {\n classNames.push(classes.modifierBold);\n }\n if (modifiers.italic) {\n classNames.push(classes.modifierItalic);\n }\n if (modifiers.underline) {\n classNames.push(classes.modifierUnderline);\n }\n if (modifiers.foreground) {\n const key = `modifierForeground${startCase(\n modifiers.foreground,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n if (modifiers.background) {\n const key = `modifierBackground${startCase(\n modifiers.background,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n return classNames.length > 0 ? classNames.join(' ') : undefined;\n}\n\nexport function findSearchResults(text: string, searchText: string) {\n if (!searchText || !text.includes(searchText)) {\n return undefined;\n }\n const searchResults = new Array<{ start: number; end: number }>();\n let offset = 0;\n for (;;) {\n const start = text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n const end = start + searchText.length;\n searchResults.push({ start, end });\n offset = end;\n }\n return searchResults;\n}\n\nexport interface HighlightAnsiChunk extends AnsiChunk {\n highlight?: number;\n}\n\nexport function calculateHighlightedChunks(\n line: AnsiLine,\n searchText: string,\n): HighlightAnsiChunk[] {\n const results = findSearchResults(line.text, searchText);\n if (!results) {\n return line.chunks;\n }\n\n const chunks = new Array<HighlightAnsiChunk>();\n\n let lineOffset = 0;\n let resultIndex = 0;\n let result = results[resultIndex];\n for (const chunk of line.chunks) {\n const { text, modifiers } = chunk;\n if (!result || lineOffset + text.length < result.start) {\n chunks.push(chunk);\n lineOffset += text.length;\n continue;\n }\n\n let localOffset = 0;\n while (result) {\n const localStart = Math.max(result.start - lineOffset, 0);\n if (localStart > text.length) {\n break; // The next result is not in this chunk\n }\n\n const localEnd = Math.min(result.end - lineOffset, text.length);\n\n const hasTextBeforeResult = localStart > localOffset;\n if (hasTextBeforeResult) {\n chunks.push({ text: text.slice(localOffset, localStart), modifiers });\n }\n const hasResultText = localEnd > localStart;\n if (hasResultText) {\n chunks.push({\n modifiers,\n highlight: resultIndex,\n text: text.slice(localStart, localEnd),\n });\n }\n\n localOffset = localEnd;\n\n const foundCompleteResult = result.end - lineOffset === localEnd;\n if (foundCompleteResult) {\n resultIndex += 1;\n result = results[resultIndex];\n } else {\n break; // The rest of the result is in the following chunks\n }\n }\n\n const hasTextAfterResult = localOffset < text.length;\n if (hasTextAfterResult) {\n chunks.push({ text: text.slice(localOffset), modifiers });\n }\n\n lineOffset += text.length;\n }\n\n return chunks;\n}\n\nexport interface LogLineProps {\n line: AnsiLine;\n classes: ReturnType<typeof useStyles>;\n searchText: string;\n highlightResultIndex?: number;\n}\n\nexport function LogLine({\n line,\n classes,\n searchText,\n highlightResultIndex,\n}: LogLineProps) {\n const chunks = useMemo(\n () => calculateHighlightedChunks(line, searchText),\n [line, searchText],\n );\n\n const elements = useMemo(\n () =>\n chunks.map(({ text, modifiers, highlight }, index) => (\n <span\n key={index}\n className={classnames(\n getModifierClasses(classes, modifiers),\n highlight !== undefined &&\n (highlight === highlightResultIndex\n ? classes.textSelectedHighlight\n : classes.textHighlight),\n )}\n >\n {text}\n </span>\n )),\n [chunks, highlightResultIndex, classes],\n );\n\n return <>{elements}</>;\n}\n","/*\n * Copyright 2021 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 React from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { LogViewerSearch } from './useLogViewerSearch';\n\nexport interface LogViewerControlsProps extends LogViewerSearch {}\n\nexport function LogViewerControls(props: LogViewerControlsProps) {\n const { resultCount, resultIndexStep, toggleShouldFilter } = props;\n const resultIndex = props.resultIndex ?? 0;\n\n const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (event.metaKey || event.ctrlKey || event.altKey) {\n toggleShouldFilter();\n } else {\n resultIndexStep(event.shiftKey);\n }\n }\n };\n\n return (\n <>\n {resultCount !== undefined && (\n <>\n <IconButton size=\"small\" onClick={() => resultIndexStep(true)}>\n <ChevronLeftIcon />\n </IconButton>\n <Typography>\n {Math.min(resultIndex + 1, resultCount)}/{resultCount}\n </Typography>\n <IconButton size=\"small\" onClick={() => resultIndexStep()}>\n <ChevronRightIcon />\n </IconButton>\n </>\n )}\n <TextField\n size=\"small\"\n variant=\"standard\"\n placeholder=\"Search\"\n value={props.searchInput}\n onKeyPress={handleKeyPress}\n onChange={e => props.setSearchInput(e.target.value)}\n />\n <IconButton size=\"small\" onClick={toggleShouldFilter}>\n {props.shouldFilter ? (\n <FilterListIcon color=\"primary\" />\n ) : (\n <FilterListIcon color=\"disabled\" />\n )}\n </IconButton>\n </>\n );\n}\n","/*\n * Copyright 2021 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 { useMemo, useState } from 'react';\nimport { useToggle } from '@react-hookz/web';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function applySearchFilter(lines: AnsiLine[], searchText: string) {\n if (!searchText) {\n return { lines };\n }\n\n const matchingLines = [];\n const searchResults = [];\n for (const line of lines) {\n if (line.text.includes(searchText)) {\n matchingLines.push(line);\n\n let offset = 0;\n let lineResultIndex = 0;\n for (;;) {\n const start = line.text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n searchResults.push({\n lineNumber: line.lineNumber,\n lineIndex: lineResultIndex++,\n });\n offset = start + searchText.length;\n }\n }\n }\n\n return {\n lines: matchingLines,\n results: searchResults,\n };\n}\n\nexport interface LogViewerSearch {\n lines: AnsiLine[];\n\n searchText: string;\n searchInput: string;\n setSearchInput: (searchInput: string) => void;\n\n shouldFilter: boolean;\n toggleShouldFilter: () => void;\n\n resultCount: number | undefined;\n resultIndex: number | undefined;\n resultIndexStep: (decrement?: boolean) => void;\n\n resultLine: number | undefined;\n resultLineIndex: number | undefined;\n}\n\nexport function useLogViewerSearch(lines: AnsiLine[]): LogViewerSearch {\n const [searchInput, setSearchInput] = useState('');\n const searchText = searchInput.toLocaleLowerCase('en-US');\n\n const [resultIndex, setResultIndex] = useState<number>(0);\n\n const [shouldFilter, toggleShouldFilter] = useToggle(false);\n\n const filter = useMemo(\n () => applySearchFilter(lines, searchText),\n [lines, searchText],\n );\n\n const searchResult = filter.results\n ? filter.results[Math.min(resultIndex, filter.results.length - 1)]\n : undefined;\n const resultCount = filter.results?.length;\n\n const resultIndexStep = (decrement?: boolean) => {\n if (decrement) {\n if (resultCount !== undefined) {\n const next = Math.min(resultIndex - 1, resultCount - 2);\n setResultIndex(next < 0 ? resultCount - 1 : next);\n }\n } else {\n if (resultCount !== undefined) {\n const next = resultIndex + 1;\n setResultIndex(next >= resultCount ? 0 : next);\n }\n }\n };\n\n return {\n lines: shouldFilter ? filter.lines : lines,\n searchText,\n searchInput,\n setSearchInput,\n shouldFilter,\n toggleShouldFilter,\n resultCount,\n resultIndex,\n resultIndexStep,\n resultLine: searchResult?.lineNumber,\n resultLineIndex: searchResult?.lineIndex,\n };\n}\n","/*\n * Copyright 2021 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 { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport useCopyToClipboard from 'react-use/lib/useCopyToClipboard';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function useLogViewerSelection(lines: AnsiLine[]) {\n const errorApi = useApi(errorApiRef);\n const [sel, setSelection] = useState<{ start: number; end: number }>();\n const start = sel ? Math.min(sel.start, sel.end) : undefined;\n const end = sel ? Math.max(sel.start, sel.end) : undefined;\n\n const [{ error }, copyToClipboard] = useCopyToClipboard();\n\n useEffect(() => {\n if (error) {\n errorApi.post(error);\n }\n }, [error, errorApi]);\n\n return {\n shouldShowButton(line: number) {\n return start === line || end === line;\n },\n isSelected(line: number) {\n if (!sel) {\n return false;\n }\n return start! <= line && line <= end!;\n },\n setSelection(line: number, add: boolean) {\n if (add) {\n setSelection(s =>\n s ? { start: s.start, end: line } : { start: line, end: line },\n );\n } else {\n setSelection(s =>\n s?.start === line && s?.end === line\n ? undefined\n : { start: line, end: line },\n );\n }\n },\n copySelection() {\n if (sel) {\n const copyText = lines\n .slice(Math.min(sel.start, sel.end) - 1, Math.max(sel.start, sel.end))\n .map(l => l.chunks.map(c => c.text).join(''))\n .join('\\n');\n copyToClipboard(copyText);\n setSelection(undefined);\n }\n },\n };\n}\n","/*\n * Copyright 2021 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 React, { useEffect, useMemo, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport IconButton from '@material-ui/core/IconButton';\nimport CopyIcon from '@material-ui/icons/FileCopy';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList } from 'react-window';\nimport { AnsiProcessor } from './AnsiProcessor';\nimport { HEADER_SIZE, useStyles } from './styles';\nimport classnames from 'classnames';\nimport { LogLine } from './LogLine';\nimport { LogViewerControls } from './LogViewerControls';\nimport { useLogViewerSearch } from './useLogViewerSearch';\nimport { useLogViewerSelection } from './useLogViewerSelection';\n\nexport interface RealLogViewerProps {\n text: string;\n classes?: { root?: string };\n}\n\nexport function RealLogViewer(props: RealLogViewerProps) {\n const classes = useStyles({ classes: props.classes });\n const listRef = useRef<FixedSizeList | null>(null);\n\n // The processor keeps state that optimizes appending to the text\n const processor = useMemo(() => new AnsiProcessor(), []);\n const lines = processor.process(props.text);\n\n const search = useLogViewerSearch(lines);\n const selection = useLogViewerSelection(lines);\n const location = useLocation();\n\n useEffect(() => {\n if (search.resultLine !== undefined && listRef.current) {\n listRef.current.scrollToItem(search.resultLine - 1, 'center');\n }\n }, [search.resultLine]);\n\n useEffect(() => {\n if (location.hash) {\n // #line-6 -> 6\n const line = parseInt(location.hash.replace(/\\D/g, ''), 10);\n selection.setSelection(line, false);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSelectLine = (\n line: number,\n event: { shiftKey: boolean; preventDefault: () => void },\n ) => {\n selection.setSelection(line, event.shiftKey);\n };\n\n return (\n <AutoSizer>\n {({ height, width }) => (\n <div style={{ width, height }} className={classes.root}>\n <div className={classes.header}>\n <LogViewerControls {...search} />\n </div>\n <FixedSizeList\n ref={listRef}\n className={classes.log}\n height={height - HEADER_SIZE}\n width={width}\n itemData={search.lines}\n itemSize={20}\n itemCount={search.lines.length}\n >\n {({ index, style, data }) => {\n const line = data[index];\n const { lineNumber } = line;\n return (\n <div\n style={{ ...style }}\n className={classnames(classes.line, {\n [classes.lineSelected]: selection.isSelected(lineNumber),\n })}\n >\n {selection.shouldShowButton(lineNumber) && (\n <IconButton\n data-testid=\"copy-button\"\n size=\"small\"\n className={classes.lineCopyButton}\n onClick={() => selection.copySelection()}\n >\n <CopyIcon fontSize=\"inherit\" />\n </IconButton>\n )}\n <a\n role=\"row\"\n target=\"_self\"\n href={`#line-${lineNumber}`}\n className={classes.lineNumber}\n onClick={event => handleSelectLine(lineNumber, event)}\n onKeyPress={event => handleSelectLine(lineNumber, event)}\n >\n {lineNumber}\n </a>\n <LogLine\n line={line}\n classes={classes}\n searchText={search.searchText}\n highlightResultIndex={\n search.resultLine === lineNumber\n ? search.resultLineIndex\n : undefined\n }\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n )}\n </AutoSizer>\n );\n}\n"],"names":["classnames","ChevronRightIcon","FilterListIcon"],"mappings":"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"}
1
+ {"version":3,"file":"RealLogViewer-5b0c3451.esm.js","sources":["../../src/components/LogViewer/AnsiProcessor.ts","../../src/components/LogViewer/styles.ts","../../src/components/LogViewer/LogLine.tsx","../../src/components/LogViewer/LogViewerControls.tsx","../../src/components/LogViewer/useLogViewerSearch.tsx","../../src/components/LogViewer/useLogViewerSelection.tsx","../../src/components/LogViewer/RealLogViewer.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 ansiRegexMaker from 'ansi-regex';\n\nconst ansiRegex = ansiRegexMaker();\nconst newlineRegex = /\\n\\r?/g;\n\n// A mapping of how each escape code changes the modifiers\nconst codeModifiers = Object.fromEntries(\n Object.entries({\n 1: m => ({ ...m, bold: true }),\n 3: m => ({ ...m, italic: true }),\n 4: m => ({ ...m, underline: true }),\n 22: ({ bold: _, ...m }) => m,\n 23: ({ italic: _, ...m }) => m,\n 24: ({ underline: _, ...m }) => m,\n 30: m => ({ ...m, foreground: 'black' }),\n 31: m => ({ ...m, foreground: 'red' }),\n 32: m => ({ ...m, foreground: 'green' }),\n 33: m => ({ ...m, foreground: 'yellow' }),\n 34: m => ({ ...m, foreground: 'blue' }),\n 35: m => ({ ...m, foreground: 'magenta' }),\n 36: m => ({ ...m, foreground: 'cyan' }),\n 37: m => ({ ...m, foreground: 'white' }),\n 39: ({ foreground: _, ...m }) => m,\n 90: m => ({ ...m, foreground: 'grey' }),\n 40: m => ({ ...m, background: 'black' }),\n 41: m => ({ ...m, background: 'red' }),\n 42: m => ({ ...m, background: 'green' }),\n 43: m => ({ ...m, background: 'yellow' }),\n 44: m => ({ ...m, background: 'blue' }),\n 45: m => ({ ...m, background: 'magenta' }),\n 46: m => ({ ...m, background: 'cyan' }),\n 47: m => ({ ...m, background: 'white' }),\n 49: ({ background: _, ...m }) => m,\n } as Record<string, (m: ChunkModifiers) => ChunkModifiers>).map(\n ([code, modifier]) => [`\\x1b[${code}m`, modifier],\n ),\n);\n\nexport type AnsiColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'grey';\n\nexport interface ChunkModifiers {\n foreground?: AnsiColor;\n background?: AnsiColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport interface AnsiChunk {\n text: string;\n modifiers: ChunkModifiers;\n}\n\nexport class AnsiLine {\n text: string;\n\n constructor(\n readonly lineNumber: number = 1,\n readonly chunks: AnsiChunk[] = [],\n ) {\n this.text = chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n\n lastChunk(): AnsiChunk | undefined {\n return this.chunks[this.chunks.length - 1];\n }\n\n replaceLastChunk(newChunks?: AnsiChunk[]) {\n if (newChunks) {\n this.chunks.splice(this.chunks.length - 1, 1, ...newChunks);\n this.text = this.chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n }\n}\n\nexport class AnsiProcessor {\n private text: string = '';\n private lines: AnsiLine[] = [];\n\n /**\n * Processes a chunk of text while keeping internal state that optimizes\n * subsequent processing that appends to the text.\n */\n process(text: string): AnsiLine[] {\n if (this.text === text) {\n return this.lines;\n }\n\n if (text.startsWith(this.text)) {\n const lastLineIndex = this.lines.length > 0 ? this.lines.length - 1 : 0;\n const lastLine = this.lines[lastLineIndex] ?? new AnsiLine();\n const lastChunk = lastLine.lastChunk();\n\n const newLines = this.processLines(\n (lastChunk?.text ?? '') + text.slice(this.text.length),\n lastChunk?.modifiers,\n lastLine?.lineNumber,\n );\n lastLine.replaceLastChunk(newLines[0]?.chunks);\n\n this.lines[lastLineIndex] = lastLine;\n this.lines.push(...newLines.slice(1));\n } else {\n this.lines = this.processLines(text);\n }\n this.text = text;\n\n return this.lines;\n }\n\n // Split a chunk of text up into lines and process each line individually\n private processLines = (\n text: string,\n modifiers: ChunkModifiers = {},\n startingLineNumber: number = 1,\n ): AnsiLine[] => {\n const lines: AnsiLine[] = [];\n\n let currentModifiers = modifiers;\n let currentLineNumber = startingLineNumber;\n\n let prevIndex = 0;\n newlineRegex.lastIndex = 0;\n for (;;) {\n const match = newlineRegex.exec(text);\n if (!match) {\n const chunks = this.processText(\n text.slice(prevIndex),\n currentModifiers,\n );\n lines.push(new AnsiLine(currentLineNumber, chunks));\n return lines;\n }\n\n const line = text.slice(prevIndex, match.index);\n prevIndex = match.index + match[0].length;\n\n const chunks = this.processText(line, currentModifiers);\n lines.push(new AnsiLine(currentLineNumber, chunks));\n\n // Modifiers that are active in the last chunk are carried over to the next line\n currentModifiers =\n chunks[chunks.length - 1].modifiers ?? currentModifiers;\n currentLineNumber += 1;\n }\n };\n\n // Processing of a one individual text chunk\n private processText = (\n fullText: string,\n modifiers: ChunkModifiers,\n ): AnsiChunk[] => {\n const chunks: AnsiChunk[] = [];\n\n let currentModifiers = modifiers;\n\n let prevIndex = 0;\n ansiRegex.lastIndex = 0;\n for (;;) {\n const match = ansiRegex.exec(fullText);\n if (!match) {\n chunks.push({\n text: fullText.slice(prevIndex),\n modifiers: currentModifiers,\n });\n return chunks;\n }\n\n const text = fullText.slice(prevIndex, match.index);\n chunks.push({ text, modifiers: currentModifiers });\n\n // For every escape code that we encounter we keep track of where the\n // next chunk of text starts, and what modifiers it has\n prevIndex = match.index + match[0].length;\n currentModifiers = this.processCode(match[0], currentModifiers);\n }\n };\n\n private processCode = (\n code: string,\n modifiers: ChunkModifiers,\n ): ChunkModifiers => {\n return codeModifiers[code]?.(modifiers) ?? modifiers;\n };\n}\n","/*\n * Copyright 2021 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 { alpha, makeStyles } from '@material-ui/core/styles';\nimport * as colors from '@material-ui/core/colors';\n\nexport const HEADER_SIZE = 40;\n\n/** @public Class keys for overriding LogViewer styles */\nexport type LogViewerClassKey =\n | 'root'\n | 'header'\n | 'log'\n | 'line'\n | 'lineSelected'\n | 'lineCopyButton'\n | 'lineNumber'\n | 'textHighlight'\n | 'textSelectedHighlight'\n | 'modifierBold'\n | 'modifierItalic'\n | 'modifierUnderline'\n | 'modifierForegroundBlack'\n | 'modifierForegroundRed'\n | 'modifierForegroundGreen'\n | 'modifierForegroundYellow'\n | 'modifierForegroundBlue'\n | 'modifierForegroundMagenta'\n | 'modifierForegroundCyan'\n | 'modifierForegroundWhite'\n | 'modifierForegroundGrey'\n | 'modifierBackgroundBlack'\n | 'modifierBackgroundRed'\n | 'modifierBackgroundGreen'\n | 'modifierBackgroundYellow'\n | 'modifierBackgroundBlue'\n | 'modifierBackgroundMagenta'\n | 'modifierBackgroundCyan'\n | 'modifierBackgroundWhite'\n | 'modifierBackgroundGrey';\n\nexport const useStyles = makeStyles(\n theme => ({\n root: {\n background: theme.palette.background.paper,\n },\n header: {\n height: HEADER_SIZE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n log: {\n fontFamily: '\"Monaco\", monospace',\n fontSize: theme.typography.pxToRem(12),\n },\n line: {\n position: 'relative',\n whiteSpace: 'pre',\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n lineSelected: {\n background: theme.palette.action.selected,\n\n '&:hover': {\n background: theme.palette.action.selected,\n },\n },\n lineCopyButton: {\n position: 'absolute',\n paddingTop: 0,\n paddingBottom: 0,\n },\n lineNumber: {\n display: 'inline-block',\n textAlign: 'end',\n width: 60,\n marginRight: theme.spacing(1),\n cursor: 'pointer',\n },\n textHighlight: {\n background: alpha(theme.palette.info.main, 0.15),\n },\n textSelectedHighlight: {\n background: alpha(theme.palette.info.main, 0.4),\n },\n modifierBold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n modifierItalic: {\n fontStyle: 'italic',\n },\n modifierUnderline: {\n textDecoration: 'underline',\n },\n modifierForegroundBlack: {\n color: colors.common.black,\n },\n modifierForegroundRed: {\n color: colors.red[500],\n },\n modifierForegroundGreen: {\n color: colors.green[500],\n },\n modifierForegroundYellow: {\n color: colors.yellow[500],\n },\n modifierForegroundBlue: {\n color: colors.blue[500],\n },\n modifierForegroundMagenta: {\n color: colors.purple[500],\n },\n modifierForegroundCyan: {\n color: colors.cyan[500],\n },\n modifierForegroundWhite: {\n color: colors.common.white,\n },\n modifierForegroundGrey: {\n color: colors.grey[500],\n },\n modifierBackgroundBlack: {\n background: colors.common.black,\n },\n modifierBackgroundRed: {\n background: colors.red[500],\n },\n modifierBackgroundGreen: {\n background: colors.green[500],\n },\n modifierBackgroundYellow: {\n background: colors.yellow[500],\n },\n modifierBackgroundBlue: {\n background: colors.blue[500],\n },\n modifierBackgroundMagenta: {\n background: colors.purple[500],\n },\n modifierBackgroundCyan: {\n background: colors.cyan[500],\n },\n modifierBackgroundWhite: {\n background: colors.common.white,\n },\n modifierBackgroundGrey: {\n background: colors.grey[500],\n },\n }),\n { name: 'BackstageLogViewer' },\n);\n","/*\n * Copyright 2021 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 React, { useMemo } from 'react';\nimport { AnsiChunk, AnsiLine, ChunkModifiers } from './AnsiProcessor';\nimport startCase from 'lodash/startCase';\nimport classnames from 'classnames';\nimport { useStyles } from './styles';\n\nexport function getModifierClasses(\n classes: ReturnType<typeof useStyles>,\n modifiers: ChunkModifiers,\n) {\n const classNames = new Array<string>();\n if (modifiers.bold) {\n classNames.push(classes.modifierBold);\n }\n if (modifiers.italic) {\n classNames.push(classes.modifierItalic);\n }\n if (modifiers.underline) {\n classNames.push(classes.modifierUnderline);\n }\n if (modifiers.foreground) {\n const key = `modifierForeground${startCase(\n modifiers.foreground,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n if (modifiers.background) {\n const key = `modifierBackground${startCase(\n modifiers.background,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n return classNames.length > 0 ? classNames.join(' ') : undefined;\n}\n\nexport function findSearchResults(text: string, searchText: string) {\n if (!searchText || !text.includes(searchText)) {\n return undefined;\n }\n const searchResults = new Array<{ start: number; end: number }>();\n let offset = 0;\n for (;;) {\n const start = text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n const end = start + searchText.length;\n searchResults.push({ start, end });\n offset = end;\n }\n return searchResults;\n}\n\nexport interface HighlightAnsiChunk extends AnsiChunk {\n highlight?: number;\n}\n\nexport function calculateHighlightedChunks(\n line: AnsiLine,\n searchText: string,\n): HighlightAnsiChunk[] {\n const results = findSearchResults(line.text, searchText);\n if (!results) {\n return line.chunks;\n }\n\n const chunks = new Array<HighlightAnsiChunk>();\n\n let lineOffset = 0;\n let resultIndex = 0;\n let result = results[resultIndex];\n for (const chunk of line.chunks) {\n const { text, modifiers } = chunk;\n if (!result || lineOffset + text.length < result.start) {\n chunks.push(chunk);\n lineOffset += text.length;\n continue;\n }\n\n let localOffset = 0;\n while (result) {\n const localStart = Math.max(result.start - lineOffset, 0);\n if (localStart > text.length) {\n break; // The next result is not in this chunk\n }\n\n const localEnd = Math.min(result.end - lineOffset, text.length);\n\n const hasTextBeforeResult = localStart > localOffset;\n if (hasTextBeforeResult) {\n chunks.push({ text: text.slice(localOffset, localStart), modifiers });\n }\n const hasResultText = localEnd > localStart;\n if (hasResultText) {\n chunks.push({\n modifiers,\n highlight: resultIndex,\n text: text.slice(localStart, localEnd),\n });\n }\n\n localOffset = localEnd;\n\n const foundCompleteResult = result.end - lineOffset === localEnd;\n if (foundCompleteResult) {\n resultIndex += 1;\n result = results[resultIndex];\n } else {\n break; // The rest of the result is in the following chunks\n }\n }\n\n const hasTextAfterResult = localOffset < text.length;\n if (hasTextAfterResult) {\n chunks.push({ text: text.slice(localOffset), modifiers });\n }\n\n lineOffset += text.length;\n }\n\n return chunks;\n}\n\nexport interface LogLineProps {\n line: AnsiLine;\n classes: ReturnType<typeof useStyles>;\n searchText: string;\n highlightResultIndex?: number;\n}\n\nexport function LogLine({\n line,\n classes,\n searchText,\n highlightResultIndex,\n}: LogLineProps) {\n const chunks = useMemo(\n () => calculateHighlightedChunks(line, searchText),\n [line, searchText],\n );\n\n const elements = useMemo(\n () =>\n chunks.map(({ text, modifiers, highlight }, index) => (\n <span\n key={index}\n className={classnames(\n getModifierClasses(classes, modifiers),\n highlight !== undefined &&\n (highlight === highlightResultIndex\n ? classes.textSelectedHighlight\n : classes.textHighlight),\n )}\n >\n {text}\n </span>\n )),\n [chunks, highlightResultIndex, classes],\n );\n\n return <>{elements}</>;\n}\n","/*\n * Copyright 2021 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 React from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { LogViewerSearch } from './useLogViewerSearch';\n\nexport interface LogViewerControlsProps extends LogViewerSearch {}\n\nexport function LogViewerControls(props: LogViewerControlsProps) {\n const { resultCount, resultIndexStep, toggleShouldFilter } = props;\n const resultIndex = props.resultIndex ?? 0;\n\n const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (event.metaKey || event.ctrlKey || event.altKey) {\n toggleShouldFilter();\n } else {\n resultIndexStep(event.shiftKey);\n }\n }\n };\n\n return (\n <>\n {resultCount !== undefined && (\n <>\n <IconButton size=\"small\" onClick={() => resultIndexStep(true)}>\n <ChevronLeftIcon />\n </IconButton>\n <Typography>\n {Math.min(resultIndex + 1, resultCount)}/{resultCount}\n </Typography>\n <IconButton size=\"small\" onClick={() => resultIndexStep()}>\n <ChevronRightIcon />\n </IconButton>\n </>\n )}\n <TextField\n size=\"small\"\n variant=\"standard\"\n placeholder=\"Search\"\n value={props.searchInput}\n onKeyPress={handleKeyPress}\n onChange={e => props.setSearchInput(e.target.value)}\n />\n <IconButton size=\"small\" onClick={toggleShouldFilter}>\n {props.shouldFilter ? (\n <FilterListIcon color=\"primary\" />\n ) : (\n <FilterListIcon color=\"disabled\" />\n )}\n </IconButton>\n </>\n );\n}\n","/*\n * Copyright 2021 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 { useMemo, useState } from 'react';\nimport { useToggle } from '@react-hookz/web';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function applySearchFilter(lines: AnsiLine[], searchText: string) {\n if (!searchText) {\n return { lines };\n }\n\n const matchingLines = [];\n const searchResults = [];\n for (const line of lines) {\n if (line.text.includes(searchText)) {\n matchingLines.push(line);\n\n let offset = 0;\n let lineResultIndex = 0;\n for (;;) {\n const start = line.text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n searchResults.push({\n lineNumber: line.lineNumber,\n lineIndex: lineResultIndex++,\n });\n offset = start + searchText.length;\n }\n }\n }\n\n return {\n lines: matchingLines,\n results: searchResults,\n };\n}\n\nexport interface LogViewerSearch {\n lines: AnsiLine[];\n\n searchText: string;\n searchInput: string;\n setSearchInput: (searchInput: string) => void;\n\n shouldFilter: boolean;\n toggleShouldFilter: () => void;\n\n resultCount: number | undefined;\n resultIndex: number | undefined;\n resultIndexStep: (decrement?: boolean) => void;\n\n resultLine: number | undefined;\n resultLineIndex: number | undefined;\n}\n\nexport function useLogViewerSearch(lines: AnsiLine[]): LogViewerSearch {\n const [searchInput, setSearchInput] = useState('');\n const searchText = searchInput.toLocaleLowerCase('en-US');\n\n const [resultIndex, setResultIndex] = useState<number>(0);\n\n const [shouldFilter, toggleShouldFilter] = useToggle(false);\n\n const filter = useMemo(\n () => applySearchFilter(lines, searchText),\n [lines, searchText],\n );\n\n const searchResult = filter.results\n ? filter.results[Math.min(resultIndex, filter.results.length - 1)]\n : undefined;\n const resultCount = filter.results?.length;\n\n const resultIndexStep = (decrement?: boolean) => {\n if (decrement) {\n if (resultCount !== undefined) {\n const next = Math.min(resultIndex - 1, resultCount - 2);\n setResultIndex(next < 0 ? resultCount - 1 : next);\n }\n } else {\n if (resultCount !== undefined) {\n const next = resultIndex + 1;\n setResultIndex(next >= resultCount ? 0 : next);\n }\n }\n };\n\n return {\n lines: shouldFilter ? filter.lines : lines,\n searchText,\n searchInput,\n setSearchInput,\n shouldFilter,\n toggleShouldFilter,\n resultCount,\n resultIndex,\n resultIndexStep,\n resultLine: searchResult?.lineNumber,\n resultLineIndex: searchResult?.lineIndex,\n };\n}\n","/*\n * Copyright 2021 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 { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport useCopyToClipboard from 'react-use/lib/useCopyToClipboard';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function useLogViewerSelection(lines: AnsiLine[]) {\n const errorApi = useApi(errorApiRef);\n const [sel, setSelection] = useState<{ start: number; end: number }>();\n const start = sel ? Math.min(sel.start, sel.end) : undefined;\n const end = sel ? Math.max(sel.start, sel.end) : undefined;\n\n const [{ error }, copyToClipboard] = useCopyToClipboard();\n\n useEffect(() => {\n if (error) {\n errorApi.post(error);\n }\n }, [error, errorApi]);\n\n return {\n shouldShowButton(line: number) {\n return start === line || end === line;\n },\n isSelected(line: number) {\n if (!sel) {\n return false;\n }\n return start! <= line && line <= end!;\n },\n setSelection(line: number, add: boolean) {\n if (add) {\n setSelection(s =>\n s ? { start: s.start, end: line } : { start: line, end: line },\n );\n } else {\n setSelection(s =>\n s?.start === line && s?.end === line\n ? undefined\n : { start: line, end: line },\n );\n }\n },\n copySelection() {\n if (sel) {\n const copyText = lines\n .slice(Math.min(sel.start, sel.end) - 1, Math.max(sel.start, sel.end))\n .map(l => l.chunks.map(c => c.text).join(''))\n .join('\\n');\n copyToClipboard(copyText);\n setSelection(undefined);\n }\n },\n };\n}\n","/*\n * Copyright 2021 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 React, { useEffect, useMemo, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport IconButton from '@material-ui/core/IconButton';\nimport CopyIcon from '@material-ui/icons/FileCopy';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList } from 'react-window';\nimport { AnsiProcessor } from './AnsiProcessor';\nimport { HEADER_SIZE, useStyles } from './styles';\nimport classnames from 'classnames';\nimport { LogLine } from './LogLine';\nimport { LogViewerControls } from './LogViewerControls';\nimport { useLogViewerSearch } from './useLogViewerSearch';\nimport { useLogViewerSelection } from './useLogViewerSelection';\n\nexport interface RealLogViewerProps {\n text: string;\n classes?: { root?: string };\n}\n\nexport function RealLogViewer(props: RealLogViewerProps) {\n const classes = useStyles({ classes: props.classes });\n const listRef = useRef<FixedSizeList | null>(null);\n\n // The processor keeps state that optimizes appending to the text\n const processor = useMemo(() => new AnsiProcessor(), []);\n const lines = processor.process(props.text);\n\n const search = useLogViewerSearch(lines);\n const selection = useLogViewerSelection(lines);\n const location = useLocation();\n\n useEffect(() => {\n if (search.resultLine !== undefined && listRef.current) {\n listRef.current.scrollToItem(search.resultLine - 1, 'center');\n }\n }, [search.resultLine]);\n\n useEffect(() => {\n if (location.hash) {\n // #line-6 -> 6\n const line = parseInt(location.hash.replace(/\\D/g, ''), 10);\n selection.setSelection(line, false);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSelectLine = (\n line: number,\n event: { shiftKey: boolean; preventDefault: () => void },\n ) => {\n selection.setSelection(line, event.shiftKey);\n };\n\n return (\n <AutoSizer>\n {({ height, width }) => (\n <div style={{ width, height }} className={classes.root}>\n <div className={classes.header}>\n <LogViewerControls {...search} />\n </div>\n <FixedSizeList\n ref={listRef}\n className={classes.log}\n height={height - HEADER_SIZE}\n width={width}\n itemData={search.lines}\n itemSize={20}\n itemCount={search.lines.length}\n >\n {({ index, style, data }) => {\n const line = data[index];\n const { lineNumber } = line;\n return (\n <div\n style={{ ...style }}\n className={classnames(classes.line, {\n [classes.lineSelected]: selection.isSelected(lineNumber),\n })}\n >\n {selection.shouldShowButton(lineNumber) && (\n <IconButton\n data-testid=\"copy-button\"\n size=\"small\"\n className={classes.lineCopyButton}\n onClick={() => selection.copySelection()}\n >\n <CopyIcon fontSize=\"inherit\" />\n </IconButton>\n )}\n <a\n role=\"row\"\n target=\"_self\"\n href={`#line-${lineNumber}`}\n className={classes.lineNumber}\n onClick={event => handleSelectLine(lineNumber, event)}\n onKeyPress={event => handleSelectLine(lineNumber, event)}\n >\n {lineNumber}\n </a>\n <LogLine\n line={line}\n classes={classes}\n searchText={search.searchText}\n highlightResultIndex={\n search.resultLine === lineNumber\n ? search.resultLineIndex\n : undefined\n }\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n )}\n </AutoSizer>\n );\n}\n"],"names":["classnames","ChevronRightIcon","FilterListIcon"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1036,6 +1036,9 @@ interface TabsProps {
1036
1036
  declare type TabsClassKey = 'root' | 'styledTabs' | 'appbar';
1037
1037
  declare function Tabs(props: TabsProps): JSX.Element;
1038
1038
 
1039
+ /** @public */
1040
+ declare type TabClassKey = 'root' | 'selected';
1041
+
1039
1042
  declare type TabBarClassKey = 'indicator' | 'flexContainer' | 'root';
1040
1043
 
1041
1044
  declare type TabIconClassKey = 'root';
@@ -1362,7 +1365,7 @@ declare function PageWithHeader(props: PropsWithChildren<PageWithHeaderProps>):
1362
1365
  */
1363
1366
  declare type ProxiedSignInPageProps = SignInPageProps & {
1364
1367
  /**
1365
- * The provider to use, e.g. "gcp-iap" or "aws-alb". This must correspond to
1368
+ * The provider to use, e.g. "gcp-iap" or "awsalb". This must correspond to
1366
1369
  * a properly configured auth provider ID in the auth backend.
1367
1370
  */
1368
1371
  provider: string;
@@ -1384,12 +1387,52 @@ declare type ProxiedSignInPageProps = SignInPageProps & {
1384
1387
  */
1385
1388
  declare const ProxiedSignInPage: (props: ProxiedSignInPageProps) => JSX.Element | null;
1386
1389
 
1390
+ /** @public **/
1391
+ declare type SidebarOptions = {
1392
+ drawerWidthClosed?: number;
1393
+ drawerWidthOpen?: number;
1394
+ };
1395
+ /** @public **/
1396
+ declare type SubmenuOptions = {
1397
+ drawerWidthClosed?: number;
1398
+ drawerWidthOpen?: number;
1399
+ };
1400
+ declare const sidebarConfig: {
1401
+ drawerWidthClosed: number;
1402
+ drawerWidthOpen: number;
1403
+ defaultOpenDelayMs: number;
1404
+ defaultCloseDelayMs: number;
1405
+ defaultFadeDuration: number;
1406
+ logoHeight: number;
1407
+ iconContainerWidth: number;
1408
+ iconSize: number;
1409
+ iconPadding: number;
1410
+ selectedIndicatorWidth: number;
1411
+ userBadgePadding: number;
1412
+ userBadgeDiameter: number;
1413
+ mobileSidebarHeight: number;
1414
+ };
1415
+ declare const SIDEBAR_INTRO_LOCAL_STORAGE = "@backstage/core/sidebar-intro-dismissed";
1416
+ /**
1417
+ * Types for the `SidebarContext`
1418
+ */
1419
+ declare type SidebarContextType = {
1420
+ isOpen: boolean;
1421
+ setOpen: (open: boolean) => void;
1422
+ };
1423
+ /**
1424
+ * Context whether the `Sidebar` is open
1425
+ */
1426
+ declare const SidebarContext: React.Context<SidebarContextType>;
1427
+
1387
1428
  /** @public */
1388
1429
  declare type SidebarClassKey = 'drawer' | 'drawerOpen';
1389
1430
  /** @public */
1390
1431
  declare type SidebarProps = {
1391
1432
  openDelayMs?: number;
1392
1433
  closeDelayMs?: number;
1434
+ sidebarOptions?: SidebarOptions;
1435
+ submenuOptions?: SubmenuOptions;
1393
1436
  disableExpandOnHover?: boolean;
1394
1437
  children?: React__default.ReactNode;
1395
1438
  };
@@ -1627,40 +1670,13 @@ declare type IntroCardProps = {
1627
1670
  declare function IntroCard(props: IntroCardProps): JSX.Element;
1628
1671
  declare function SidebarIntro(_props: {}): JSX.Element | null;
1629
1672
 
1630
- declare const sidebarConfig: {
1631
- drawerWidthClosed: number;
1632
- drawerWidthOpen: number;
1633
- defaultOpenDelayMs: number;
1634
- defaultCloseDelayMs: number;
1635
- defaultFadeDuration: number;
1636
- logoHeight: number;
1637
- iconContainerWidth: number;
1638
- iconSize: number;
1639
- iconPadding: number;
1640
- selectedIndicatorWidth: number;
1641
- userBadgePadding: number;
1642
- userBadgeDiameter: number;
1643
- mobileSidebarHeight: number;
1644
- };
1645
- declare const SIDEBAR_INTRO_LOCAL_STORAGE = "@backstage/core/sidebar-intro-dismissed";
1646
- /**
1647
- * Types for the `SidebarContext`
1648
- */
1649
- declare type SidebarContextType = {
1650
- isOpen: boolean;
1651
- setOpen: (open: boolean) => void;
1652
- };
1653
- /**
1654
- * Context whether the `Sidebar` is open
1655
- */
1656
- declare const SidebarContext: React.Context<SidebarContextType>;
1657
-
1658
1673
  declare type SignInProviderConfig = {
1659
1674
  id: string;
1660
1675
  title: string;
1661
1676
  message: string;
1662
1677
  apiRef: ApiRef<ProfileInfoApi & BackstageIdentityApi & SessionApi>;
1663
1678
  };
1679
+ /** @public **/
1664
1680
  declare type IdentityProviders = ('guest' | 'custom' | SignInProviderConfig)[];
1665
1681
 
1666
1682
  declare type MultiSignInPageProps = SignInPageProps & {
@@ -1841,6 +1857,7 @@ declare type BackstageComponentsNameToClassKey = {
1841
1857
  BackstageTabBar: TabBarClassKey;
1842
1858
  BackstageTabIcon: TabIconClassKey;
1843
1859
  BackstageTabs: TabsClassKey;
1860
+ BackstageTab: TabClassKey;
1844
1861
  BackstageWarningPanel: WarningPanelClassKey;
1845
1862
  BackstageBottomLink: BottomLinkClassKey;
1846
1863
  BackstageBreadcrumbsClickableText: BreadcrumbsClickableTextClassKey;
@@ -1875,4 +1892,4 @@ declare type BackstageOverrides = Overrides & {
1875
1892
  [Name in keyof BackstageComponentsNameToClassKey]?: Partial<StyleRules<BackstageComponentsNameToClassKey[Name]>>;
1876
1893
  };
1877
1894
 
1878
- export { AlertDisplay, Avatar, AvatarClassKey, AvatarProps, BackstageContentClassKey, BackstageOverrides, BoldHeaderClassKey, BottomLink, BottomLinkClassKey, BottomLinkProps, Breadcrumbs, BreadcrumbsClickableTextClassKey, BreadcrumbsStyledBoxClassKey, BrokenImageIcon, Button, ButtonProps, CardActionsTopRightClassKey, CardTab, CardTabClassKey, CatalogIcon, ChatIcon, ClosedDropdownClassKey, CodeSnippet, CodeSnippetProps, Content, ContentHeader, ContentHeaderClassKey, CopyTextButton, CopyTextButtonProps, CreateButton, CreateButtonProps, CustomProviderClassKey, DashboardIcon, DependencyGraph, DependencyGraphDefaultLabelClassKey, DependencyGraphDefaultNodeClassKey, DependencyGraphEdgeClassKey, DependencyGraphNodeClassKey, DependencyGraphProps, types_d as DependencyGraphTypes, DismissableBanner, DismissableBannerClassKey, DismissbleBannerClassKey, DocsIcon, EmailIcon, EmptyState, EmptyStateClassKey, EmptyStateImageClassKey, ErrorBoundary, ErrorBoundaryProps, ErrorPage, ErrorPageClassKey, ErrorPanel, ErrorPanelClassKey, ErrorPanelProps, FeatureCalloutCircleClassKey, FeatureCalloutCircular, FiltersContainerClassKey, Gauge, GaugeCard, GaugeCardClassKey, GaugeClassKey, GaugeProps, GaugePropsGetColor, GaugePropsGetColorOptions, GitHubIcon, GroupIcon, Header, HeaderClassKey, HeaderIconLinkRow, HeaderIconLinkRowClassKey, HeaderLabel, HeaderLabelClassKey, HeaderTabs, HeaderTabsClassKey, HelpIcon, HomepageTimer, HorizontalScrollGrid, HorizontalScrollGridClassKey, IconLinkVerticalClassKey, IconLinkVerticalProps, InfoCard, InfoCardClassKey, InfoCardVariants, IntroCard, ItemCard, ItemCardGrid, ItemCardGridClassKey, ItemCardGridProps, ItemCardHeader, ItemCardHeaderClassKey, ItemCardHeaderProps, Lifecycle, LifecycleClassKey, LinearGauge, Link, LinkProps, LogViewer, LogViewerClassKey, LogViewerProps, LoginRequestListItemClassKey, MarkdownContent, MarkdownContentClassKey, MetadataTableCellClassKey, MetadataTableListClassKey, MetadataTableListItemClassKey, MetadataTableTitleCellClassKey, MicDropClassKey, MissingAnnotationEmptyState, MissingAnnotationEmptyStateClassKey, MobileSidebar, MobileSidebarProps, OAuthRequestDialog, OAuthRequestDialogClassKey, OpenedDropdownClassKey, OverflowTooltip, OverflowTooltipClassKey, Page, PageClassKey, PageWithHeader, Progress, ProxiedSignInPage, ProxiedSignInPageProps, ResponseErrorPanel, ResponseErrorPanelClassKey, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, SelectClassKey, SelectInputBaseClassKey, SelectItem, SelectedItems, Sidebar, SidebarClassKey, SidebarContext, SidebarContextType, SidebarDivider, SidebarDividerClassKey, SidebarExpandButton, SidebarGroup, SidebarGroupProps, SidebarIntro, SidebarIntroClassKey, SidebarItem, SidebarItemClassKey, SidebarPage, SidebarPageClassKey, SidebarPageProps, SidebarPinStateContext, SidebarPinStateContextType, SidebarProps, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpaceClassKey, SidebarSpacer, SidebarSpacerClassKey, SidebarSubmenu, SidebarSubmenuItem, SidebarSubmenuItemDropdownItem, SidebarSubmenuItemProps, SidebarSubmenuProps, SignInPage, SignInPageClassKey, SignInProviderConfig, SimpleStepper, SimpleStepperFooterClassKey, SimpleStepperStep, SimpleStepperStepClassKey, StatusAborted, StatusClassKey, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, StructuredMetadataTableListClassKey, StructuredMetadataTableNestedListClassKey, SubvalueCell, SubvalueCellClassKey, SupportButton, SupportButtonClassKey, SupportConfig, SupportItem, SupportItemLink, Tab, TabBarClassKey, TabIconClassKey, TabbedCard, TabbedCardClassKey, TabbedLayout, Table, TableClassKey, TableColumn, TableFilter, TableFiltersClassKey, TableHeaderClassKey, TableProps, TableState, TableToolbarClassKey, Tabs, TabsClassKey, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, WarningPanelClassKey, sidebarConfig, useContent, useQueryParamState, useSupportConfig };
1895
+ export { AlertDisplay, Avatar, AvatarClassKey, AvatarProps, BackstageContentClassKey, BackstageOverrides, BoldHeaderClassKey, BottomLink, BottomLinkClassKey, BottomLinkProps, Breadcrumbs, BreadcrumbsClickableTextClassKey, BreadcrumbsStyledBoxClassKey, BrokenImageIcon, Button, ButtonProps, CardActionsTopRightClassKey, CardTab, CardTabClassKey, CatalogIcon, ChatIcon, ClosedDropdownClassKey, CodeSnippet, CodeSnippetProps, Content, ContentHeader, ContentHeaderClassKey, CopyTextButton, CopyTextButtonProps, CreateButton, CreateButtonProps, CustomProviderClassKey, DashboardIcon, DependencyGraph, DependencyGraphDefaultLabelClassKey, DependencyGraphDefaultNodeClassKey, DependencyGraphEdgeClassKey, DependencyGraphNodeClassKey, DependencyGraphProps, types_d as DependencyGraphTypes, DismissableBanner, DismissableBannerClassKey, DismissbleBannerClassKey, DocsIcon, EmailIcon, EmptyState, EmptyStateClassKey, EmptyStateImageClassKey, ErrorBoundary, ErrorBoundaryProps, ErrorPage, ErrorPageClassKey, ErrorPanel, ErrorPanelClassKey, ErrorPanelProps, FeatureCalloutCircleClassKey, FeatureCalloutCircular, FiltersContainerClassKey, Gauge, GaugeCard, GaugeCardClassKey, GaugeClassKey, GaugeProps, GaugePropsGetColor, GaugePropsGetColorOptions, GitHubIcon, GroupIcon, Header, HeaderClassKey, HeaderIconLinkRow, HeaderIconLinkRowClassKey, HeaderLabel, HeaderLabelClassKey, HeaderTabs, HeaderTabsClassKey, HelpIcon, HomepageTimer, HorizontalScrollGrid, HorizontalScrollGridClassKey, IconLinkVerticalClassKey, IconLinkVerticalProps, IdentityProviders, InfoCard, InfoCardClassKey, InfoCardVariants, IntroCard, ItemCard, ItemCardGrid, ItemCardGridClassKey, ItemCardGridProps, ItemCardHeader, ItemCardHeaderClassKey, ItemCardHeaderProps, Lifecycle, LifecycleClassKey, LinearGauge, Link, LinkProps, LogViewer, LogViewerClassKey, LogViewerProps, LoginRequestListItemClassKey, MarkdownContent, MarkdownContentClassKey, MetadataTableCellClassKey, MetadataTableListClassKey, MetadataTableListItemClassKey, MetadataTableTitleCellClassKey, MicDropClassKey, MissingAnnotationEmptyState, MissingAnnotationEmptyStateClassKey, MobileSidebar, MobileSidebarProps, OAuthRequestDialog, OAuthRequestDialogClassKey, OpenedDropdownClassKey, OverflowTooltip, OverflowTooltipClassKey, Page, PageClassKey, PageWithHeader, Progress, ProxiedSignInPage, ProxiedSignInPageProps, ResponseErrorPanel, ResponseErrorPanelClassKey, RoutedTabs, SIDEBAR_INTRO_LOCAL_STORAGE, SelectComponent as Select, SelectClassKey, SelectInputBaseClassKey, SelectItem, SelectedItems, Sidebar, SidebarClassKey, SidebarContext, SidebarContextType, SidebarDivider, SidebarDividerClassKey, SidebarExpandButton, SidebarGroup, SidebarGroupProps, SidebarIntro, SidebarIntroClassKey, SidebarItem, SidebarItemClassKey, SidebarOptions, SidebarPage, SidebarPageClassKey, SidebarPageProps, SidebarPinStateContext, SidebarPinStateContextType, SidebarProps, SidebarScrollWrapper, SidebarSearchField, SidebarSpace, SidebarSpaceClassKey, SidebarSpacer, SidebarSpacerClassKey, SidebarSubmenu, SidebarSubmenuItem, SidebarSubmenuItemDropdownItem, SidebarSubmenuItemProps, SidebarSubmenuProps, SignInPage, SignInPageClassKey, SignInProviderConfig, SimpleStepper, SimpleStepperFooterClassKey, SimpleStepperStep, SimpleStepperStepClassKey, StatusAborted, StatusClassKey, StatusError, StatusOK, StatusPending, StatusRunning, StatusWarning, StructuredMetadataTable, StructuredMetadataTableListClassKey, StructuredMetadataTableNestedListClassKey, SubmenuOptions, SubvalueCell, SubvalueCellClassKey, SupportButton, SupportButtonClassKey, SupportConfig, SupportItem, SupportItemLink, Tab, TabBarClassKey, TabClassKey, TabIconClassKey, TabbedCard, TabbedCardClassKey, TabbedLayout, Table, TableClassKey, TableColumn, TableFilter, TableFiltersClassKey, TableHeaderClassKey, TableProps, TableState, TableToolbarClassKey, Tabs, TabsClassKey, TrendLine, UserIcon, UserIdentity, WarningIcon, WarningPanel, WarningPanelClassKey, sidebarConfig, useContent, useQueryParamState, useSupportConfig };