@64mb/freelens-power 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/out/main/common/power-logs.js.map +1 -1
- package/out/main/common/resource-search.js.map +1 -1
- package/out/main/power-logs-child.js +3 -3
- package/out/main/power-logs-child.js.map +1 -1
- package/out/main/power-logs-database.js +165 -7
- package/out/main/power-logs-database.js.map +1 -1
- package/out/main/power-logs-ipc.js +12 -3
- package/out/main/power-logs-ipc.js.map +1 -1
- package/out/main/power-logs-worker.js +29 -7
- package/out/main/power-logs-worker.js.map +1 -1
- package/out/main/resource-search-database.js +3 -2
- package/out/main/resource-search-database.js.map +1 -1
- package/out/main/resource-search.js +2 -1
- package/out/main/resource-search.js.map +1 -1
- package/out/renderer/_virtual/_global-external_react.js +2 -1
- package/out/renderer/ai-context-mutations.js +14 -0
- package/out/renderer/ai-context-mutations.js.map +1 -0
- package/out/renderer/ai-copy-answer.js +18 -15
- package/out/renderer/ai-copy-answer.js.map +1 -1
- package/out/renderer/ai-diagnostic-handoff.js +2 -2
- package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
- package/out/renderer/ai-extras.js +41 -38
- package/out/renderer/ai-extras.js.map +1 -1
- package/out/renderer/ai-message.js +50 -39
- package/out/renderer/ai-message.js.map +1 -1
- package/out/renderer/ai-provider-icon.js +39 -32
- package/out/renderer/ai-provider-icon.js.map +1 -1
- package/out/renderer/ai-resize.js +40 -37
- package/out/renderer/ai-resize.js.map +1 -1
- package/out/renderer/ai-shortcuts.js +20 -17
- package/out/renderer/ai-shortcuts.js.map +1 -1
- package/out/renderer/ai-terminal-context.js +42 -48
- package/out/renderer/ai-terminal-context.js.map +1 -1
- package/out/renderer/ai.js +137 -111
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/cluster-icon-colors.js +10 -7
- package/out/renderer/cluster-icon-colors.js.map +1 -1
- package/out/renderer/cluster-icons.js +47 -40
- package/out/renderer/cluster-icons.js.map +1 -1
- package/out/renderer/details/service-diagnostics-details.js +25 -23
- package/out/renderer/details/service-diagnostics-details.js.map +1 -1
- package/out/renderer/diagnostic-explain-button.js +7 -4
- package/out/renderer/diagnostic-explain-button.js.map +1 -1
- package/out/renderer/diagnostics-screen-finding.js +51 -0
- package/out/renderer/diagnostics-screen-finding.js.map +1 -0
- package/out/renderer/diagnostics.css.js +1 -1
- package/out/renderer/diagnostics.css.js.map +1 -1
- package/out/renderer/diagnostics.js +146 -107
- package/out/renderer/diagnostics.js.map +1 -1
- package/out/renderer/incident-copy-button.js +24 -21
- package/out/renderer/incident-copy-button.js.map +1 -1
- package/out/renderer/index.js +2 -0
- package/out/renderer/index.js.map +1 -1
- package/out/renderer/monitoring.js +19 -22
- package/out/renderer/monitoring.js.map +1 -1
- package/out/renderer/native-tooltip.js +22 -0
- package/out/renderer/native-tooltip.js.map +1 -0
- package/out/renderer/pod-details-enhancements.js +106 -0
- package/out/renderer/pod-details-enhancements.js.map +1 -0
- package/out/renderer/power-log-json-cell.js +44 -38
- package/out/renderer/power-log-json-cell.js.map +1 -1
- package/out/renderer/power-log-json.js +17 -10
- package/out/renderer/power-log-json.js.map +1 -1
- package/out/renderer/power-log-sql-editor.js +31 -2
- package/out/renderer/power-log-sql-editor.js.map +1 -1
- package/out/renderer/power-logs-client.js +5 -0
- package/out/renderer/power-logs-client.js.map +1 -1
- package/out/renderer/power-logs-entrypoints.js +10 -36
- package/out/renderer/power-logs-entrypoints.js.map +1 -1
- package/out/renderer/power-logs.css.js +9 -2
- package/out/renderer/power-logs.css.js.map +1 -1
- package/out/renderer/power-logs.js +376 -214
- package/out/renderer/power-logs.js.map +1 -1
- package/out/renderer/preferences/dashboard-preferences.js +42 -35
- package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
- package/out/renderer/preferences/logs-preferences.js +1 -1
- package/out/renderer/preferences/logs-preferences.js.map +1 -1
- package/out/renderer/preferences/monitoring-preferences.js +7 -4
- package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
- package/out/renderer/preferences/preferences.js +2 -2
- package/out/renderer/preferences/preferences.js.map +1 -1
- package/out/renderer/preferences/settings-icon-action.js +12 -11
- package/out/renderer/preferences/settings-icon-action.js.map +1 -1
- package/out/renderer/relationship-map-finding.js +53 -0
- package/out/renderer/relationship-map-finding.js.map +1 -0
- package/out/renderer/resource-relationships.css.js +6 -0
- package/out/renderer/resource-relationships.css.js.map +1 -1
- package/out/renderer/resource-relationships.js +94 -47
- package/out/renderer/resource-relationships.js.map +1 -1
- package/out/renderer/resource-search-client.js.map +1 -1
- package/out/renderer/resource-search.js +88 -35
- package/out/renderer/resource-search.js.map +1 -1
- package/out/renderer/src/common/gateway-relationships.js +8 -7
- package/out/renderer/src/common/gateway-relationships.js.map +1 -1
- package/out/renderer/src/common/power-log-json-filter-sql.js +12 -0
- package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -1
- package/out/renderer/src/common/power-log-json-preset.js +2 -2
- package/out/renderer/src/common/power-log-json-preset.js.map +1 -1
- package/out/renderer/src/common/power-logs.js.map +1 -1
- package/out/renderer/src/common/resource-relationships.js +10 -8
- package/out/renderer/src/common/resource-relationships.js.map +1 -1
- package/out/renderer/src/common/resource-search.js.map +1 -1
- package/out/renderer/welcome.js +16 -1
- package/out/renderer/welcome.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-icons.js","names":[],"sources":["../../src/renderer/cluster-icons.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { CLUSTER_ICONS_CHANNEL, type ClusterIconEntry } from \"../common/cluster-icon-ipc\";\nimport {\n type ClusterIconDesign,\n clusterIconDataUrl,\n defaultClusterIconDesign,\n GLYPHS,\n normalizeClusterIconDesign,\n} from \"../common/cluster-icons\";\nimport { IconColorPicker, MATCHING_ICON_COLORS } from \"./cluster-icon-colors\";\nimport { SettingsModal } from \"./preferences/settings-modal\";\n\nconst styles = `\n.ClusterManager main.power-icon-studio, .power-icon-studio { display: block; position: relative; z-index: 2; flex: 1; min-width: 0; height: 100%; overflow: auto; padding: 32px; box-sizing: border-box; background: var(--mainBackground); color: var(--textColorPrimary); }\n.power-icon-studio > .power-icon-content { max-width: 1000px; margin: 0 auto; }\n.power-icon-header { display: flex; align-items: center; justify-content: space-between; gap: 24px; margin-bottom: 28px; }\n.power-icon-header h1 { font-size: 24px; font-weight: 600; margin: 0 0 8px; color: var(--textColorAccent); }\n.power-icon-header p { margin: 0; color: var(--textColorSecondary); }\n.power-icon-search { width: 240px; }\n.power-icon-grid { display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 16px; }\n.power-icon-card { display: flex; flex-direction: column; align-items: center; gap: 12px; position: relative; padding: 20px 14px 16px; min-width: 0; border: 1px solid var(--borderFaintColor); border-radius: 14px; background: var(--contentColor); color: var(--textColorPrimary); font: inherit; cursor: pointer; transition: border-color 150ms ease, background-color 150ms ease, transform 150ms ease; }\n.power-icon-card:hover { border-color: var(--primary); background: color-mix(in srgb,var(--primary) 4%,var(--contentColor)); transform: translateY(-2px); }\n.power-icon-card:focus-visible, .power-icon-glyph:focus-visible, .power-icon-swatch:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }\n.power-icon-card > img, .power-icon-card .power-icon-current-avatar { width: 64px; height: 64px; object-fit: contain; border-radius: 16px; }\n.power-icon-card-name { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n.power-icon-empty { padding: 64px 24px; text-align: center; border: 1px dashed var(--borderFaintColor); border-radius: 14px; color: var(--textColorSecondary); }\n.power-icon-editor { display: grid; grid-template-columns: 144px minmax(0,1fr); gap: 24px; }\n.power-icon-preview { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 22px; padding: 24px 12px; border: 1px solid var(--borderFaintColor); border-radius: 12px; background: var(--contentColor); }\n.power-icon-preview-main { width: 96px; height: 96px; }\n.power-icon-preview-sizes { display: flex; align-items: center; gap: 14px; }\n.power-icon-preview-caption { font-size: 11px; color: var(--textColorSecondary); }\n.power-icon-fields { display: grid; gap: 16px; }\n.power-icon-field { display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: 13px; }\n.power-icon-field input[type=text] { width: 100px; padding: 8px 10px; border: 1px solid var(--borderFaintColor); border-radius: 6px; background: var(--contentColor); color: var(--textColorPrimary); font: inherit; }\n.power-icon-field input:focus-visible { outline: 1px solid var(--primary); }\n.power-icon-section-label { color: var(--textColorSecondary); font-size: 12px; margin-bottom: 10px; }\n.power-icon-glyphs { display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 8px; }\n.power-icon-glyph { display: flex; align-items: center; justify-content: center; min-height: 54px; padding: 6px; border: 1px solid var(--borderFaintColor); border-radius: 8px; background: var(--contentColor); cursor: pointer; transition: border-color 150ms ease, background-color 150ms ease; }\n.power-icon-glyph:hover, .power-icon-glyph[aria-pressed=true] { border-color: var(--primary); background: color-mix(in srgb,var(--primary) 8%,var(--contentColor)); }\n.power-icon-glyph img { width: 38px; height: 38px; }\n.power-icon-swatches { display: flex; align-items: center; gap: 8px; }\n.power-icon-swatch { width: 22px; height: 22px; border: 2px solid transparent; border-radius: 50%; cursor: pointer; }\n.power-icon-swatch[aria-pressed=true] { box-shadow: 0 0 0 2px var(--mainBackground),0 0 0 3px var(--primary); }\n.power-icon-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 12px; border-top: 1px solid var(--borderFaintColor); }\n.power-icon-footer-actions { display: flex; gap: 8px; margin-left: auto; }\n.power-icon-error { color: var(--colorError); font-size: 12px; line-height: 1.5; }\n@media (max-width: 900px) { .power-icon-grid { grid-template-columns: repeat(4,minmax(0,1fr)); } }\n@media (max-width: 700px) { .power-icon-header { align-items: stretch; flex-direction: column; } .power-icon-search { width: 100%; } .power-icon-grid { grid-template-columns: repeat(3,minmax(0,1fr)); } .ClusterManager main.power-icon-studio, .power-icon-studio { padding: 20px; } }\n@media (max-width: 480px) { .power-icon-grid { grid-template-columns: repeat(2,minmax(0,1fr)); } .power-icon-editor { grid-template-columns: 1fr; } .power-icon-preview { flex-direction: row; padding: 16px; } .power-icon-preview-main { width: 72px; height: 72px; } }\n@media (prefers-reduced-motion: reduce) { .power-icon-card { transition: none; transform: none; } }\n`;\n\nfunction IconEditor({\n entry,\n onClose,\n onSaved,\n}: {\n entry: ClusterIconEntry;\n onClose: () => void;\n onSaved: (entries: ClusterIconEntry[]) => void;\n}) {\n const [design, setDesign] = useState<ClusterIconDesign>(() => entry.design ?? defaultClusterIconDesign(entry.name));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(\"\");\n const paletteOpen = useRef(false);\n const onPaletteOpenChange = useCallback((open: boolean) => {\n paletteOpen.current = open;\n }, []);\n const update = (key: keyof ClusterIconDesign, value: string) =>\n setDesign((previous) => ({ ...previous, [key]: value }));\n const save = async () => {\n setBusy(true);\n setError(\"\");\n try {\n const entries = await ipcRenderer.invoke(CLUSTER_ICONS_CHANNEL, {\n operation: \"apply\",\n id: entry.id,\n design,\n });\n onSaved(entries);\n } catch {\n setError(\"Unable to save this cluster icon. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n let validDesign: ClusterIconDesign | undefined;\n try {\n validDesign = normalizeClusterIconDesign(design);\n } catch {\n validDesign = undefined;\n }\n const previewDesign = validDesign ?? defaultClusterIconDesign(entry.name);\n const preview = clusterIconDataUrl(previewDesign);\n return (\n <SettingsModal\n id=\"power-cluster-icon-editor\"\n title={entry.name}\n onClose={() => {\n if (!busy && !paletteOpen.current) onClose();\n }}\n >\n <style>{styles}</style>\n <div className=\"power-icon-editor\">\n <div className=\"power-icon-preview\">\n <img className=\"power-icon-preview-main\" src={preview} alt=\"Cluster icon preview\" />\n <div className=\"power-icon-preview-sizes\">\n <img src={preview} width={36} height={36} alt=\"\" />\n </div>\n <span className=\"power-icon-preview-caption\">Sidebar preview</span>\n </div>\n <div className=\"power-icon-fields\">\n <label className=\"power-icon-field\" htmlFor=\"power-icon-label\">\n Label\n <input\n id=\"power-icon-label\"\n type=\"text\"\n value={design.label}\n onChange={(event) => update(\"label\", Array.from(event.target.value).slice(0, 3).join(\"\"))}\n disabled={busy}\n autoFocus\n />\n </label>\n {(\n [\n [\"outlineColor\", \"Outline\"],\n [\"labelColor\", \"Label color\"],\n [\"iconColor\", \"Icon color\"],\n ] as const\n ).map(([key, label]) => (\n <div className=\"power-icon-field\" key={key}>\n <span>{label}</span>\n <IconColorPicker\n label={label}\n value={design[key]}\n onChange={(color) => update(key, color)}\n disabled={busy}\n onOpenChange={onPaletteOpenChange}\n />\n </div>\n ))}\n <div>\n <div className=\"power-icon-section-label\">Matching outline & label</div>\n <div className=\"power-icon-swatches\">\n {MATCHING_ICON_COLORS.map(({ name, color }) => (\n <button\n key={color}\n type=\"button\"\n className=\"power-icon-swatch\"\n style={{ background: color }}\n title={`${name} · ${color}`}\n aria-label={`Use ${color} for outline and label`}\n aria-pressed={design.outlineColor === color && design.labelColor === color}\n disabled={busy}\n onClick={() => setDesign((previous) => ({ ...previous, outlineColor: color, labelColor: color }))}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n <div>\n <div className=\"power-icon-section-label\">Choose an icon</div>\n <div className=\"power-icon-glyphs\">\n {GLYPHS.map((glyph) => (\n <button\n type=\"button\"\n key={glyph.id}\n className=\"power-icon-glyph\"\n title={glyph.label}\n aria-label={glyph.label}\n aria-pressed={design.glyph === glyph.id}\n disabled={busy}\n onClick={() => update(\"glyph\", glyph.id)}\n >\n <img src={clusterIconDataUrl({ ...previewDesign, glyph: glyph.id })} alt=\"\" />\n </button>\n ))}\n </div>\n </div>\n {!validDesign && (\n <div role=\"alert\" className=\"power-icon-error\">\n Use up to three visible characters for the label.\n </div>\n )}\n {error && (\n <div role=\"alert\" className=\"power-icon-error\">\n {error}\n </div>\n )}\n <div className=\"power-icon-footer\">\n <div className=\"power-icon-footer-actions\">\n <Renderer.Component.Button label=\"Cancel\" disabled={busy} onClick={onClose} />\n <Renderer.Component.Button\n primary\n label={busy ? \"Applying…\" : \"Apply\"}\n disabled={busy || !validDesign}\n onClick={() => void save()}\n />\n </div>\n </div>\n </SettingsModal>\n );\n}\n\nexport function ClusterIconsPage() {\n const [entries, setEntries] = useState<ClusterIconEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n const [query, setQuery] = useState(\"\");\n const [editing, setEditing] = useState<ClusterIconEntry>();\n const load = () => {\n setLoading(true);\n setError(\"\");\n return ipcRenderer\n .invoke(CLUSTER_ICONS_CHANNEL, { operation: \"list\" })\n .then(setEntries)\n .catch(() => setError(\"Unable to load saved clusters. Try again.\"))\n .finally(() => setLoading(false));\n };\n useEffect(() => {\n void load();\n }, []);\n const visible = entries.filter((entry) => entry.name.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()));\n return (\n <main className=\"power-icon-studio\">\n <style>{styles}</style>\n <div className=\"power-icon-content\">\n <header className=\"power-icon-header\">\n <div>\n <h1>Cluster icons</h1>\n <p>A shared style. A distinct identity for every cluster.</p>\n </div>\n <div className=\"power-icon-search\">\n <Renderer.Component.Input\n value={query}\n onChange={setQuery}\n placeholder=\"Find a cluster…\"\n aria-label=\"Find a cluster\"\n />\n </div>\n </header>\n {error ? (\n <div className=\"power-icon-empty\" role=\"alert\">\n {error} <Renderer.Component.Button label=\"Retry\" onClick={() => void load()} />\n </div>\n ) : loading ? (\n <div className=\"power-icon-empty\" role=\"status\">\n Loading clusters…\n </div>\n ) : visible.length === 0 ? (\n <div className=\"power-icon-empty\">\n {entries.length ? \"No matching clusters\" : \"Your saved clusters will appear here\"}\n </div>\n ) : (\n <div className=\"power-icon-grid\">\n {visible.map((entry) => (\n <button\n type=\"button\"\n key={entry.id}\n className=\"power-icon-card\"\n title={`Edit icon for ${entry.name}`}\n onClick={() => setEditing(entry)}\n >\n <Renderer.Component.Avatar\n title={entry.name}\n size={64}\n src={entry.icon?.startsWith(\"data:image/\") ? entry.icon : undefined}\n background={entry.icon && !entry.icon.startsWith(\"data:\") ? entry.icon : undefined}\n colorHash={`${entry.name}-${Renderer.Catalog.catalogEntities.getById(entry.id)?.metadata.source ?? \"\"}`}\n className=\"power-icon-current-avatar\"\n />\n <span className=\"power-icon-card-name\">{entry.name}</span>\n </button>\n ))}\n </div>\n )}\n {editing && (\n <IconEditor\n key={editing.id}\n entry={editing}\n onClose={() => setEditing(undefined)}\n onSaved={(next) => {\n setEntries(next);\n setEditing(undefined);\n }}\n />\n )}\n </div>\n </main>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cluster-icons.js","names":[],"sources":["../../src/renderer/cluster-icons.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { CLUSTER_ICONS_CHANNEL, type ClusterIconEntry } from \"../common/cluster-icon-ipc\";\nimport {\n type ClusterIconDesign,\n clusterIconDataUrl,\n defaultClusterIconDesign,\n GLYPHS,\n normalizeClusterIconDesign,\n} from \"../common/cluster-icons\";\nimport { IconColorPicker, MATCHING_ICON_COLORS } from \"./cluster-icon-colors\";\nimport { NativeTooltip } from \"./native-tooltip\";\nimport { SettingsModal } from \"./preferences/settings-modal\";\n\nconst styles = `\n.ClusterManager main.power-icon-studio, .power-icon-studio { display: block; position: relative; z-index: 2; flex: 1; min-width: 0; height: 100%; overflow: auto; padding: 32px; box-sizing: border-box; background: var(--mainBackground); color: var(--textColorPrimary); }\n.power-icon-studio > .power-icon-content { max-width: 1000px; margin: 0 auto; }\n.power-icon-header { display: flex; align-items: center; justify-content: space-between; gap: 24px; margin-bottom: 28px; }\n.power-icon-header h1 { font-size: 24px; font-weight: 600; margin: 0 0 8px; color: var(--textColorAccent); }\n.power-icon-header p { margin: 0; color: var(--textColorSecondary); }\n.power-icon-search { width: 240px; }\n.power-icon-grid { display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 16px; }\n.power-icon-card { display: flex; flex-direction: column; align-items: center; gap: 12px; position: relative; padding: 20px 14px 16px; min-width: 0; border: 1px solid var(--borderFaintColor); border-radius: 14px; background: var(--contentColor); color: var(--textColorPrimary); font: inherit; cursor: pointer; transition: border-color 150ms ease, background-color 150ms ease, transform 150ms ease; }\n.power-icon-card:hover { border-color: var(--primary); background: color-mix(in srgb,var(--primary) 4%,var(--contentColor)); transform: translateY(-2px); }\n.power-icon-card:focus-visible, .power-icon-glyph:focus-visible, .power-icon-swatch:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }\n.power-icon-card > img, .power-icon-card .power-icon-current-avatar { width: 64px; height: 64px; object-fit: contain; border-radius: 16px; }\n.power-icon-card-name { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }\n.power-icon-empty { padding: 64px 24px; text-align: center; border: 1px dashed var(--borderFaintColor); border-radius: 14px; color: var(--textColorSecondary); }\n.power-icon-editor { display: grid; grid-template-columns: 144px minmax(0,1fr); gap: 24px; }\n.power-icon-preview { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 22px; padding: 24px 12px; border: 1px solid var(--borderFaintColor); border-radius: 12px; background: var(--contentColor); }\n.power-icon-preview-main { width: 96px; height: 96px; }\n.power-icon-preview-sizes { display: flex; align-items: center; gap: 14px; }\n.power-icon-preview-caption { font-size: 11px; color: var(--textColorSecondary); }\n.power-icon-fields { display: grid; gap: 16px; }\n.power-icon-field { display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: 13px; }\n.power-icon-field input[type=text] { width: 100px; padding: 8px 10px; border: 1px solid var(--borderFaintColor); border-radius: 6px; background: var(--contentColor); color: var(--textColorPrimary); font: inherit; }\n.power-icon-field input:focus-visible { outline: 1px solid var(--primary); }\n.power-icon-section-label { color: var(--textColorSecondary); font-size: 12px; margin-bottom: 10px; }\n.power-icon-glyphs { display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 8px; }\n.power-icon-glyph { display: flex; align-items: center; justify-content: center; min-height: 54px; padding: 6px; border: 1px solid var(--borderFaintColor); border-radius: 8px; background: var(--contentColor); cursor: pointer; transition: border-color 150ms ease, background-color 150ms ease; }\n.power-icon-glyph:hover, .power-icon-glyph[aria-pressed=true] { border-color: var(--primary); background: color-mix(in srgb,var(--primary) 8%,var(--contentColor)); }\n.power-icon-glyph img { width: 38px; height: 38px; }\n.power-icon-swatches { display: flex; align-items: center; gap: 8px; }\n.power-icon-swatch { width: 22px; height: 22px; border: 2px solid transparent; border-radius: 50%; cursor: pointer; }\n.power-icon-swatch[aria-pressed=true] { box-shadow: 0 0 0 2px var(--mainBackground),0 0 0 3px var(--primary); }\n.power-icon-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 12px; border-top: 1px solid var(--borderFaintColor); }\n.power-icon-footer-actions { display: flex; gap: 8px; margin-left: auto; }\n.power-icon-error { color: var(--colorError); font-size: 12px; line-height: 1.5; }\n@media (max-width: 900px) { .power-icon-grid { grid-template-columns: repeat(4,minmax(0,1fr)); } }\n@media (max-width: 700px) { .power-icon-header { align-items: stretch; flex-direction: column; } .power-icon-search { width: 100%; } .power-icon-grid { grid-template-columns: repeat(3,minmax(0,1fr)); } .ClusterManager main.power-icon-studio, .power-icon-studio { padding: 20px; } }\n@media (max-width: 480px) { .power-icon-grid { grid-template-columns: repeat(2,minmax(0,1fr)); } .power-icon-editor { grid-template-columns: 1fr; } .power-icon-preview { flex-direction: row; padding: 16px; } .power-icon-preview-main { width: 72px; height: 72px; } }\n@media (prefers-reduced-motion: reduce) { .power-icon-card { transition: none; transform: none; } }\n`;\n\nfunction IconEditor({\n entry,\n onClose,\n onSaved,\n}: {\n entry: ClusterIconEntry;\n onClose: () => void;\n onSaved: (entries: ClusterIconEntry[]) => void;\n}) {\n const [design, setDesign] = useState<ClusterIconDesign>(() => entry.design ?? defaultClusterIconDesign(entry.name));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(\"\");\n const paletteOpen = useRef(false);\n const onPaletteOpenChange = useCallback((open: boolean) => {\n paletteOpen.current = open;\n }, []);\n const update = (key: keyof ClusterIconDesign, value: string) =>\n setDesign((previous) => ({ ...previous, [key]: value }));\n const save = async () => {\n setBusy(true);\n setError(\"\");\n try {\n const entries = await ipcRenderer.invoke(CLUSTER_ICONS_CHANNEL, {\n operation: \"apply\",\n id: entry.id,\n design,\n });\n onSaved(entries);\n } catch {\n setError(\"Unable to save this cluster icon. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n let validDesign: ClusterIconDesign | undefined;\n try {\n validDesign = normalizeClusterIconDesign(design);\n } catch {\n validDesign = undefined;\n }\n const previewDesign = validDesign ?? defaultClusterIconDesign(entry.name);\n const preview = clusterIconDataUrl(previewDesign);\n return (\n <SettingsModal\n id=\"power-cluster-icon-editor\"\n title={entry.name}\n onClose={() => {\n if (!busy && !paletteOpen.current) onClose();\n }}\n >\n <style>{styles}</style>\n <div className=\"power-icon-editor\">\n <div className=\"power-icon-preview\">\n <img className=\"power-icon-preview-main\" src={preview} alt=\"Cluster icon preview\" />\n <div className=\"power-icon-preview-sizes\">\n <img src={preview} width={36} height={36} alt=\"\" />\n </div>\n <span className=\"power-icon-preview-caption\">Sidebar preview</span>\n </div>\n <div className=\"power-icon-fields\">\n <label className=\"power-icon-field\" htmlFor=\"power-icon-label\">\n Label\n <input\n id=\"power-icon-label\"\n type=\"text\"\n value={design.label}\n onChange={(event) => update(\"label\", Array.from(event.target.value).slice(0, 3).join(\"\"))}\n disabled={busy}\n autoFocus\n />\n </label>\n {(\n [\n [\"outlineColor\", \"Outline\"],\n [\"labelColor\", \"Label color\"],\n [\"iconColor\", \"Icon color\"],\n ] as const\n ).map(([key, label]) => (\n <div className=\"power-icon-field\" key={key}>\n <span>{label}</span>\n <IconColorPicker\n label={label}\n value={design[key]}\n onChange={(color) => update(key, color)}\n disabled={busy}\n onOpenChange={onPaletteOpenChange}\n />\n </div>\n ))}\n <div>\n <div className=\"power-icon-section-label\">Matching outline & label</div>\n <div className=\"power-icon-swatches\">\n {MATCHING_ICON_COLORS.map(({ name, color }) => (\n <NativeTooltip key={color} title={`${name} · ${color}`}>\n <button\n type=\"button\"\n className=\"power-icon-swatch\"\n style={{ background: color }}\n aria-label={`Use ${color} for outline and label`}\n aria-pressed={design.outlineColor === color && design.labelColor === color}\n disabled={busy}\n onClick={() => setDesign((previous) => ({ ...previous, outlineColor: color, labelColor: color }))}\n />\n </NativeTooltip>\n ))}\n </div>\n </div>\n </div>\n </div>\n <div>\n <div className=\"power-icon-section-label\">Choose an icon</div>\n <div className=\"power-icon-glyphs\">\n {GLYPHS.map((glyph) => (\n <NativeTooltip key={glyph.id} title={glyph.label}>\n <button\n type=\"button\"\n className=\"power-icon-glyph\"\n aria-label={glyph.label}\n aria-pressed={design.glyph === glyph.id}\n disabled={busy}\n onClick={() => update(\"glyph\", glyph.id)}\n >\n <img src={clusterIconDataUrl({ ...previewDesign, glyph: glyph.id })} alt=\"\" />\n </button>\n </NativeTooltip>\n ))}\n </div>\n </div>\n {!validDesign && (\n <div role=\"alert\" className=\"power-icon-error\">\n Use up to three visible characters for the label.\n </div>\n )}\n {error && (\n <div role=\"alert\" className=\"power-icon-error\">\n {error}\n </div>\n )}\n <div className=\"power-icon-footer\">\n <div className=\"power-icon-footer-actions\">\n <Renderer.Component.Button label=\"Cancel\" disabled={busy} onClick={onClose} />\n <Renderer.Component.Button\n primary\n label={busy ? \"Applying…\" : \"Apply\"}\n disabled={busy || !validDesign}\n onClick={() => void save()}\n />\n </div>\n </div>\n </SettingsModal>\n );\n}\n\nexport function ClusterIconsPage() {\n const [entries, setEntries] = useState<ClusterIconEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n const [query, setQuery] = useState(\"\");\n const [editing, setEditing] = useState<ClusterIconEntry>();\n const load = () => {\n setLoading(true);\n setError(\"\");\n return ipcRenderer\n .invoke(CLUSTER_ICONS_CHANNEL, { operation: \"list\" })\n .then(setEntries)\n .catch(() => setError(\"Unable to load saved clusters. Try again.\"))\n .finally(() => setLoading(false));\n };\n useEffect(() => {\n void load();\n }, []);\n const visible = entries.filter((entry) => entry.name.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()));\n return (\n <main className=\"power-icon-studio\">\n <style>{styles}</style>\n <div className=\"power-icon-content\">\n <header className=\"power-icon-header\">\n <div>\n <h1>Cluster icons</h1>\n <p>A shared style. A distinct identity for every cluster.</p>\n </div>\n <div className=\"power-icon-search\">\n <Renderer.Component.Input\n value={query}\n onChange={setQuery}\n placeholder=\"Find a cluster…\"\n aria-label=\"Find a cluster\"\n />\n </div>\n </header>\n {error ? (\n <div className=\"power-icon-empty\" role=\"alert\">\n {error} <Renderer.Component.Button label=\"Retry\" onClick={() => void load()} />\n </div>\n ) : loading ? (\n <div className=\"power-icon-empty\" role=\"status\">\n Loading clusters…\n </div>\n ) : visible.length === 0 ? (\n <div className=\"power-icon-empty\">\n {entries.length ? \"No matching clusters\" : \"Your saved clusters will appear here\"}\n </div>\n ) : (\n <div className=\"power-icon-grid\">\n {visible.map((entry) => (\n <NativeTooltip key={entry.id} title={`Edit icon for ${entry.name}`}>\n <button type=\"button\" className=\"power-icon-card\" onClick={() => setEditing(entry)}>\n <Renderer.Component.Avatar\n title={entry.name}\n size={64}\n src={entry.icon?.startsWith(\"data:image/\") ? entry.icon : undefined}\n background={entry.icon && !entry.icon.startsWith(\"data:\") ? entry.icon : undefined}\n colorHash={`${entry.name}-${Renderer.Catalog.catalogEntities.getById(entry.id)?.metadata.source ?? \"\"}`}\n className=\"power-icon-current-avatar\"\n />\n <span className=\"power-icon-card-name\">{entry.name}</span>\n </button>\n </NativeTooltip>\n ))}\n </div>\n )}\n {editing && (\n <IconEditor\n key={editing.id}\n entry={editing}\n onClose={() => setEditing(undefined)}\n onSaved={(next) => {\n setEntries(next);\n setEditing(undefined);\n }}\n />\n )}\n </div>\n </main>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ const require_extensions = require("../_virtual/_global-external_@freelensapp/ex
|
|
|
2
2
|
const require__global_external_mobx_react = require("../_virtual/_global-external_mobx-react.js");
|
|
3
3
|
const require__global_external_react = require("../_virtual/_global-external_react.js");
|
|
4
4
|
const require_jsx_runtime = require("../_virtual/_global-external_react/jsx-runtime.js");
|
|
5
|
+
const require_native_tooltip = require("../native-tooltip.js");
|
|
5
6
|
const require_service_diagnostics = require("../src/common/service-diagnostics.js");
|
|
6
7
|
//#region src/renderer/details/service-diagnostics-details.tsx
|
|
7
8
|
var { DrawerTitle, DrawerItem, Icon } = require_extensions.Renderer.Component;
|
|
@@ -60,30 +61,31 @@ var ServiceDiagnosticsDetails = require__global_external_mobx_react.observer(({
|
|
|
60
61
|
minWidth: 0
|
|
61
62
|
},
|
|
62
63
|
children: "Service backend diagnostics"
|
|
63
|
-
}), !external && /* @__PURE__ */ require_jsx_runtime.jsx(
|
|
64
|
-
type: "button",
|
|
64
|
+
}), !external && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
|
|
65
65
|
title: "Refresh backend evidence",
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
66
|
+
children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
|
|
67
|
+
type: "button",
|
|
68
|
+
"aria-label": "Refresh evidence",
|
|
69
|
+
disabled: !evidence.loaded,
|
|
70
|
+
style: {
|
|
71
|
+
display: "inline-flex",
|
|
72
|
+
alignItems: "center",
|
|
73
|
+
justifyContent: "center",
|
|
74
|
+
width: 32,
|
|
75
|
+
height: 32,
|
|
76
|
+
flexShrink: 0,
|
|
77
|
+
padding: 0,
|
|
78
|
+
background: "transparent",
|
|
79
|
+
border: 0,
|
|
80
|
+
color: "var(--textColorSecondary)",
|
|
81
|
+
cursor: evidence.loaded ? "pointer" : "default",
|
|
82
|
+
opacity: evidence.loaded ? 1 : .4
|
|
83
|
+
},
|
|
84
|
+
onClick: () => setRefresh((value) => value + 1),
|
|
85
|
+
children: /* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
|
|
86
|
+
material: "refresh",
|
|
87
|
+
size: 18
|
|
88
|
+
})
|
|
87
89
|
})
|
|
88
90
|
})]
|
|
89
91
|
}) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-diagnostics-details.js","names":[],"sources":["../../../src/renderer/details/service-diagnostics-details.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { diagnoseService } from \"../../common/service-diagnostics\";\n\nconst { DrawerTitle, DrawerItem, Icon } = Renderer.Component;\ntype Evidence = { pods?: Renderer.K8sApi.Pod[]; slices?: Renderer.K8sApi.EndpointSlice[]; loaded: boolean };\nexport const ServiceDiagnosticsDetails = observer(\n ({ object }: Renderer.Component.KubeObjectDetailsProps<Renderer.K8sApi.Service>) => {\n const [expanded, setExpanded] = useState(false);\n const [refresh, setRefresh] = useState(0);\n const [evidence, setEvidence] = useState<Evidence>({ loaded: false });\n const namespace = object.getNs();\n const name = object.getName();\n const external = object.spec.type === \"ExternalName\";\n useEffect(() => {\n let active = true;\n setEvidence({ loaded: false });\n setExpanded(false);\n if (external) {\n setEvidence({ loaded: true });\n return;\n }\n const load = async () => {\n const [pods, slices] = await Promise.allSettled([\n Renderer.K8sApi.podsApi.list({ namespace }),\n Renderer.K8sApi.endpointSliceApi.list({ namespace }, { labelSelector: `kubernetes.io/service-name=${name}` }),\n ]);\n if (active)\n setEvidence({\n loaded: true,\n pods: pods.status === \"fulfilled\" ? (pods.value ?? undefined) : undefined,\n slices: slices.status === \"fulfilled\" ? (slices.value ?? undefined) : undefined,\n });\n };\n void load();\n return () => {\n active = false;\n };\n }, [namespace, name, external, refresh]);\n const result = diagnoseService(object, evidence.pods, evidence.slices);\n const partial =\n !evidence.loaded ||\n evidence.pods === undefined ||\n evidence.slices === undefined ||\n (!!result.readyEndpoints && result.missingEndpointPorts);\n const warning =\n !partial &&\n !external &&\n !!result.matchingPods &&\n (!result.matchingPods.length ||\n !result.readyEndpoints ||\n result.readyPods?.length !== result.matchingPods.length ||\n result.ports.some((port) => port.unresolved || port.numericMismatch));\n const healthy = !partial && !external && !!result.matchingPods?.length && !warning;\n const summaryColor = warning ? \"var(--colorWarning)\" : healthy ? \"var(--colorOk)\" : \"var(--textColorSecondary)\";\n const listLimit = expanded ? Infinity : 5;\n const hidden =\n Math.max(0, (result.matchingPods?.length ?? 0) - 5) + Math.max(0, (result.matchingSlices?.length ?? 0) - 5);\n return (\n <>\n <DrawerTitle>\n <span\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, width: \"100%\" }}\n >\n <span style={{ flex: 1, minWidth: 0 }}>Service backend diagnostics</span>\n {!external && (\n <button\n type=\"button\"\n title=\"Refresh backend evidence\"\n aria-label=\"Refresh evidence\"\n disabled={!evidence.loaded}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n flexShrink: 0,\n padding: 0,\n background: \"transparent\",\n border: 0,\n color: \"var(--textColorSecondary)\",\n cursor: evidence.loaded ? \"pointer\" : \"default\",\n opacity: evidence.loaded ? 1 : 0.4,\n }}\n onClick={() => setRefresh((value) => value + 1)}\n >\n <Icon material=\"refresh\" tooltip=\"Refresh backend evidence\" size={18} />\n </button>\n )}\n </span>\n </DrawerTitle>\n <DrawerItem name=\"Summary\">\n <span style={{ color: summaryColor }}>\n <Icon material={warning ? \"warning\" : healthy ? \"check_circle\" : \"info\"} />{\" \"}\n {evidence.loaded ? result.summary : \"Loading backend evidence…\"}\n </span>\n </DrawerItem>\n {evidence.loaded && (\n <>\n <DrawerItem name=\"Selector\">\n {Object.entries(object.spec.selector ?? {})\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \") || \"None\"}\n </DrawerItem>\n {result.ports.map((p) => (\n <DrawerItem key={p.name} name={`Port ${p.name}`}>\n {p.protocol} → {p.target} · EndpointSlice ports: {p.endpointPorts.join(\", \") || \"unavailable\"}\n {p.unresolved ? ` · named target unresolved in ${p.unresolved} selected pods` : \"\"}\n {p.numericMismatch ? \" · EndpointSlice port differs from numeric target\" : \"\"}\n </DrawerItem>\n ))}\n {result.matchingPods?.slice(0, listLimit).map((pod) => (\n <DrawerItem key={pod.metadata.uid} name=\"Selected pod\">\n <button\n type=\"button\"\n onClick={() => Renderer.Navigation.showDetails(pod.selfLink)}\n style={{\n background: \"transparent\",\n border: 0,\n padding: 0,\n color: \"var(--primary)\",\n cursor: \"pointer\",\n }}\n >\n {pod.getName()}\n </button>\n </DrawerItem>\n ))}\n {result.matchingSlices?.slice(0, listLimit).map((slice) => (\n <DrawerItem key={slice.metadata.uid} name={`EndpointSlice (${slice.addressType})`}>\n <button\n type=\"button\"\n onClick={() => Renderer.Navigation.showDetails(slice.selfLink)}\n style={{\n background: \"transparent\",\n border: 0,\n padding: 0,\n color: \"var(--primary)\",\n cursor: \"pointer\",\n }}\n >\n {slice.getName()}\n </button>\n </DrawerItem>\n ))}\n {hidden > 0 && (\n <button type=\"button\" onClick={() => setExpanded((value) => !value)}>\n {expanded ? \"Show fewer resources\" : `Show ${hidden} more resources`}\n </button>\n )}\n {result.limitations.map((item) => (\n <DrawerItem key={item} name=\"Scope\">\n {item}\n </DrawerItem>\n ))}\n </>\n )}\n </>\n );\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service-diagnostics-details.js","names":[],"sources":["../../../src/renderer/details/service-diagnostics-details.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { diagnoseService } from \"../../common/service-diagnostics\";\nimport { NativeTooltip } from \"../native-tooltip\";\n\nconst { DrawerTitle, DrawerItem, Icon } = Renderer.Component;\ntype Evidence = { pods?: Renderer.K8sApi.Pod[]; slices?: Renderer.K8sApi.EndpointSlice[]; loaded: boolean };\nexport const ServiceDiagnosticsDetails = observer(\n ({ object }: Renderer.Component.KubeObjectDetailsProps<Renderer.K8sApi.Service>) => {\n const [expanded, setExpanded] = useState(false);\n const [refresh, setRefresh] = useState(0);\n const [evidence, setEvidence] = useState<Evidence>({ loaded: false });\n const namespace = object.getNs();\n const name = object.getName();\n const external = object.spec.type === \"ExternalName\";\n useEffect(() => {\n let active = true;\n setEvidence({ loaded: false });\n setExpanded(false);\n if (external) {\n setEvidence({ loaded: true });\n return;\n }\n const load = async () => {\n const [pods, slices] = await Promise.allSettled([\n Renderer.K8sApi.podsApi.list({ namespace }),\n Renderer.K8sApi.endpointSliceApi.list({ namespace }, { labelSelector: `kubernetes.io/service-name=${name}` }),\n ]);\n if (active)\n setEvidence({\n loaded: true,\n pods: pods.status === \"fulfilled\" ? (pods.value ?? undefined) : undefined,\n slices: slices.status === \"fulfilled\" ? (slices.value ?? undefined) : undefined,\n });\n };\n void load();\n return () => {\n active = false;\n };\n }, [namespace, name, external, refresh]);\n const result = diagnoseService(object, evidence.pods, evidence.slices);\n const partial =\n !evidence.loaded ||\n evidence.pods === undefined ||\n evidence.slices === undefined ||\n (!!result.readyEndpoints && result.missingEndpointPorts);\n const warning =\n !partial &&\n !external &&\n !!result.matchingPods &&\n (!result.matchingPods.length ||\n !result.readyEndpoints ||\n result.readyPods?.length !== result.matchingPods.length ||\n result.ports.some((port) => port.unresolved || port.numericMismatch));\n const healthy = !partial && !external && !!result.matchingPods?.length && !warning;\n const summaryColor = warning ? \"var(--colorWarning)\" : healthy ? \"var(--colorOk)\" : \"var(--textColorSecondary)\";\n const listLimit = expanded ? Infinity : 5;\n const hidden =\n Math.max(0, (result.matchingPods?.length ?? 0) - 5) + Math.max(0, (result.matchingSlices?.length ?? 0) - 5);\n return (\n <>\n <DrawerTitle>\n <span\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, width: \"100%\" }}\n >\n <span style={{ flex: 1, minWidth: 0 }}>Service backend diagnostics</span>\n {!external && (\n <NativeTooltip title=\"Refresh backend evidence\">\n <button\n type=\"button\"\n aria-label=\"Refresh evidence\"\n disabled={!evidence.loaded}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n flexShrink: 0,\n padding: 0,\n background: \"transparent\",\n border: 0,\n color: \"var(--textColorSecondary)\",\n cursor: evidence.loaded ? \"pointer\" : \"default\",\n opacity: evidence.loaded ? 1 : 0.4,\n }}\n onClick={() => setRefresh((value) => value + 1)}\n >\n <Icon material=\"refresh\" size={18} />\n </button>\n </NativeTooltip>\n )}\n </span>\n </DrawerTitle>\n <DrawerItem name=\"Summary\">\n <span style={{ color: summaryColor }}>\n <Icon material={warning ? \"warning\" : healthy ? \"check_circle\" : \"info\"} />{\" \"}\n {evidence.loaded ? result.summary : \"Loading backend evidence…\"}\n </span>\n </DrawerItem>\n {evidence.loaded && (\n <>\n <DrawerItem name=\"Selector\">\n {Object.entries(object.spec.selector ?? {})\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \") || \"None\"}\n </DrawerItem>\n {result.ports.map((p) => (\n <DrawerItem key={p.name} name={`Port ${p.name}`}>\n {p.protocol} → {p.target} · EndpointSlice ports: {p.endpointPorts.join(\", \") || \"unavailable\"}\n {p.unresolved ? ` · named target unresolved in ${p.unresolved} selected pods` : \"\"}\n {p.numericMismatch ? \" · EndpointSlice port differs from numeric target\" : \"\"}\n </DrawerItem>\n ))}\n {result.matchingPods?.slice(0, listLimit).map((pod) => (\n <DrawerItem key={pod.metadata.uid} name=\"Selected pod\">\n <button\n type=\"button\"\n onClick={() => Renderer.Navigation.showDetails(pod.selfLink)}\n style={{\n background: \"transparent\",\n border: 0,\n padding: 0,\n color: \"var(--primary)\",\n cursor: \"pointer\",\n }}\n >\n {pod.getName()}\n </button>\n </DrawerItem>\n ))}\n {result.matchingSlices?.slice(0, listLimit).map((slice) => (\n <DrawerItem key={slice.metadata.uid} name={`EndpointSlice (${slice.addressType})`}>\n <button\n type=\"button\"\n onClick={() => Renderer.Navigation.showDetails(slice.selfLink)}\n style={{\n background: \"transparent\",\n border: 0,\n padding: 0,\n color: \"var(--primary)\",\n cursor: \"pointer\",\n }}\n >\n {slice.getName()}\n </button>\n </DrawerItem>\n ))}\n {hidden > 0 && (\n <button type=\"button\" onClick={() => setExpanded((value) => !value)}>\n {expanded ? \"Show fewer resources\" : `Show ${hidden} more resources`}\n </button>\n )}\n {result.limitations.map((item) => (\n <DrawerItem key={item} name=\"Scope\">\n {item}\n </DrawerItem>\n ))}\n </>\n )}\n </>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
const require__global_external_mobx_react = require("./_virtual/_global-external_mobx-react.js");
|
|
2
2
|
const require_ai_preferences_store = require("./src/common/store/ai-preferences-store.js");
|
|
3
3
|
const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
|
|
4
|
+
const require_native_tooltip = require("./native-tooltip.js");
|
|
4
5
|
//#region src/renderer/diagnostic-explain-button.tsx
|
|
5
6
|
var DiagnosticExplainButton = require__global_external_mobx_react.observer(function DiagnosticExplainButton(props) {
|
|
6
7
|
const enabled = require_ai_preferences_store.AiPreferencesStore.getInstanceOrCreate().enabled;
|
|
7
|
-
return /* @__PURE__ */ require_jsx_runtime.jsx(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
return /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
|
|
9
|
+
title: enabled ? props.title : "Enable AI in Power settings to explain this finding",
|
|
10
|
+
children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
|
|
11
|
+
...props,
|
|
12
|
+
disabled: !enabled || props.disabled
|
|
13
|
+
})
|
|
11
14
|
});
|
|
12
15
|
});
|
|
13
16
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic-explain-button.js","names":[],"sources":["../../src/renderer/diagnostic-explain-button.tsx"],"sourcesContent":["import { observer } from \"mobx-react\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\n\nexport const DiagnosticExplainButton = observer(function DiagnosticExplainButton(\n props: ButtonHTMLAttributes<HTMLButtonElement>,\n) {\n const enabled = AiPreferencesStore.getInstanceOrCreate<AiPreferencesStore>().enabled;\n return (\n <
|
|
1
|
+
{"version":3,"file":"diagnostic-explain-button.js","names":[],"sources":["../../src/renderer/diagnostic-explain-button.tsx"],"sourcesContent":["import { observer } from \"mobx-react\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\nimport { NativeTooltip } from \"./native-tooltip\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\n\nexport const DiagnosticExplainButton = observer(function DiagnosticExplainButton(\n props: ButtonHTMLAttributes<HTMLButtonElement>,\n) {\n const enabled = AiPreferencesStore.getInstanceOrCreate<AiPreferencesStore>().enabled;\n return (\n <NativeTooltip title={enabled ? props.title : \"Enable AI in Power settings to explain this finding\"}>\n <button {...props} disabled={!enabled || props.disabled} />\n </NativeTooltip>\n );\n});\n"],"mappings":";;;;;AAMA,IAAa,0BAA0B,oCAAA,SAAS,SAAS,wBACvD,OACA;CACA,MAAM,UAAU,6BAAA,mBAAmB,oBAAwC,CAAC,CAAC;CAC7E,OACE,oCAAA,IAAC,uBAAA,eAAD;EAAe,OAAO,UAAU,MAAM,QAAQ;YAC5C,oCAAA,IAAC,UAAD;GAAQ,GAAI;GAAO,UAAU,CAAC,WAAW,MAAM;EAAW,CAAA;CAC7C,CAAA;AAEnB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/renderer/diagnostics-screen-finding.ts
|
|
2
|
+
function diagnosticsScreenFinding(clusterId, tab, groups, timeline, resource) {
|
|
3
|
+
const metric = (value) => ({
|
|
4
|
+
requests: value.requests,
|
|
5
|
+
scheduledRequests: value.scheduledRequests,
|
|
6
|
+
unscheduledRequests: value.unscheduledRequests,
|
|
7
|
+
usage: value.usage,
|
|
8
|
+
coveredPods: value.coveredPods,
|
|
9
|
+
totalPods: value.totalPods,
|
|
10
|
+
unknownRequestPods: value.unknownRequestPods
|
|
11
|
+
});
|
|
12
|
+
const rows = tab === "Consumers" ? groups.slice(0, 100).map((group) => ({
|
|
13
|
+
namespace: group.namespace,
|
|
14
|
+
kind: group.kind,
|
|
15
|
+
name: group.name,
|
|
16
|
+
pods: group.pods.length,
|
|
17
|
+
cpu: metric(group.cpu),
|
|
18
|
+
memory: metric(group.memory)
|
|
19
|
+
})) : timeline.slice(0, 100).map((entry) => ({
|
|
20
|
+
resource: resource(entry).slice(0, 800),
|
|
21
|
+
reason: entry.reason.slice(0, 300),
|
|
22
|
+
message: entry.message.slice(0, 1e3),
|
|
23
|
+
time: entry.time,
|
|
24
|
+
firstTime: entry.firstTime,
|
|
25
|
+
count: entry.count,
|
|
26
|
+
certainty: entry.certainty,
|
|
27
|
+
gap: entry.gap?.slice(0, 300)
|
|
28
|
+
}));
|
|
29
|
+
const snapshot = {
|
|
30
|
+
view: tab,
|
|
31
|
+
scope: "Current filtered and sorted diagnostics list; read-only snapshot, may be partial or stale",
|
|
32
|
+
omitted: (tab === "Consumers" ? groups.length : timeline.length) - rows.length,
|
|
33
|
+
rows
|
|
34
|
+
};
|
|
35
|
+
let summary = JSON.stringify(snapshot);
|
|
36
|
+
while (summary.length > 8e3 && snapshot.rows.length) {
|
|
37
|
+
snapshot.rows.pop();
|
|
38
|
+
snapshot.omitted++;
|
|
39
|
+
summary = JSON.stringify(snapshot);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
clusterId,
|
|
43
|
+
source: "diagnostics",
|
|
44
|
+
title: `Diagnostics · ${tab}`,
|
|
45
|
+
summary
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
exports.diagnosticsScreenFinding = diagnosticsScreenFinding;
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=diagnostics-screen-finding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics-screen-finding.js","names":[],"sources":["../../src/renderer/diagnostics-screen-finding.ts"],"sourcesContent":["import type { ConsumerGroup, ResourceSummary, TimelineEntry } from \"../common/resource-diagnostics\";\nimport type { DiagnosticFinding } from \"./ai-diagnostic-handoff\";\n\nexport function diagnosticsScreenFinding(\n clusterId: string,\n tab: \"Consumers\" | \"Timeline\",\n groups: ConsumerGroup[],\n timeline: TimelineEntry[],\n resource: (entry: TimelineEntry) => string,\n): DiagnosticFinding {\n const metric = (value: ResourceSummary) => ({\n requests: value.requests,\n scheduledRequests: value.scheduledRequests,\n unscheduledRequests: value.unscheduledRequests,\n usage: value.usage,\n coveredPods: value.coveredPods,\n totalPods: value.totalPods,\n unknownRequestPods: value.unknownRequestPods,\n });\n const rows =\n tab === \"Consumers\"\n ? groups.slice(0, 100).map((group) => ({\n namespace: group.namespace,\n kind: group.kind,\n name: group.name,\n pods: group.pods.length,\n cpu: metric(group.cpu),\n memory: metric(group.memory),\n }))\n : timeline.slice(0, 100).map((entry) => ({\n resource: resource(entry).slice(0, 800),\n reason: entry.reason.slice(0, 300),\n message: entry.message.slice(0, 1000),\n time: entry.time,\n firstTime: entry.firstTime,\n count: entry.count,\n certainty: entry.certainty,\n gap: entry.gap?.slice(0, 300),\n }));\n const snapshot = {\n view: tab,\n scope: \"Current filtered and sorted diagnostics list; read-only snapshot, may be partial or stale\",\n omitted: (tab === \"Consumers\" ? groups.length : timeline.length) - rows.length,\n rows,\n };\n let summary = JSON.stringify(snapshot);\n while (summary.length > 8000 && snapshot.rows.length) {\n snapshot.rows.pop();\n snapshot.omitted++;\n summary = JSON.stringify(snapshot);\n }\n return { clusterId, source: \"diagnostics\", title: `Diagnostics · ${tab}`, summary };\n}\n"],"mappings":";AAGA,SAAgB,yBACd,WACA,KACA,QACA,UACA,UACmB;CACnB,MAAM,UAAU,WAA4B;EAC1C,UAAU,MAAM;EAChB,mBAAmB,MAAM;EACzB,qBAAqB,MAAM;EAC3B,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,WAAW,MAAM;EACjB,oBAAoB,MAAM;CAC5B;CACA,MAAM,OACJ,QAAQ,cACJ,OAAO,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,WAAW;EACnC,WAAW,MAAM;EACjB,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,MAAM,MAAM,KAAK;EACjB,KAAK,OAAO,MAAM,GAAG;EACrB,QAAQ,OAAO,MAAM,MAAM;CAC7B,EAAE,IACF,SAAS,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,WAAW;EACrC,UAAU,SAAS,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG;EACtC,QAAQ,MAAM,OAAO,MAAM,GAAG,GAAG;EACjC,SAAS,MAAM,QAAQ,MAAM,GAAG,GAAI;EACpC,MAAM,MAAM;EACZ,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,WAAW,MAAM;EACjB,KAAK,MAAM,KAAK,MAAM,GAAG,GAAG;CAC9B,EAAE;CACR,MAAM,WAAW;EACf,MAAM;EACN,OAAO;EACP,UAAU,QAAQ,cAAc,OAAO,SAAS,SAAS,UAAU,KAAK;EACxE;CACF;CACA,IAAI,UAAU,KAAK,UAAU,QAAQ;CACrC,OAAO,QAAQ,SAAS,OAAQ,SAAS,KAAK,QAAQ;EACpD,SAAS,KAAK,IAAI;EAClB,SAAS;EACT,UAAU,KAAK,UAAU,QAAQ;CACnC;CACA,OAAO;EAAE;EAAW,QAAQ;EAAe,OAAO,iBAAiB;EAAO;CAAQ;AACpF"}
|
|
@@ -38,7 +38,7 @@ var diagnosticsStyles = `
|
|
|
38
38
|
|
|
39
39
|
.power-diagnostics .incident-copy button,.power-diagnostics .consumer-row-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:28px;height:28px;min-width:28px;min-height:28px;gap:0;padding:0;line-height:1;vertical-align:middle}.power-diagnostics .incident-copy button>.Icon,.power-diagnostics .consumer-row-actions .explain-finding>.Icon{margin:0;flex-shrink:0}
|
|
40
40
|
|
|
41
|
-
.power-diagnostics .timeline-card-top{display:flex;align-items:
|
|
41
|
+
.power-diagnostics .timeline-card-top{display:flex;align-items:center;justify-content:space-between;gap:16px}.power-diagnostics .timeline-card-top>.timeline-card-heading{flex:1;min-width:0;padding-right:0}.power-diagnostics .timeline-card-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.power-diagnostics .timeline-card-actions .incident-copy{position:relative;margin:0}.power-diagnostics .timeline-card-actions .incident-copy [role=status]{position:absolute;right:0;top:calc(100% + 6px);white-space:nowrap;max-width:260px;background:var(--contentColor);border:1px solid var(--borderColor);padding:4px 6px;z-index:2}.power-diagnostics .timeline-content .timeline-card-actions .timeline-resource-action{position:static;width:28px;height:28px;min-width:28px;margin:0}.power-diagnostics .timeline-card-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;margin:0;padding:0 8px;line-height:1}.power-diagnostics .timeline-card-actions .explain-finding>.Icon{margin:0;flex-shrink:0}
|
|
42
42
|
.power-diagnostics .namespace-scope{display:flex;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:6px;margin:4px 0 16px;min-height:32px}.power-diagnostics .namespace-scope-label{overflow-wrap:anywhere}.power-diagnostics .namespace-scope button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:4px 0;margin:0;border:0;background:transparent;box-shadow:none;color:var(--textColorSecondary)}.power-diagnostics .namespace-scope button:hover{color:var(--primary);background:transparent}.power-diagnostics .namespace-scope button:focus-visible{outline:2px solid var(--primary);outline-offset:3px}
|
|
43
43
|
@container diagnostics (max-width:700px){.power-diagnostics .timeline-card-actions .timeline-action-label{display:none}.power-diagnostics .timeline-card-actions .explain-finding{width:28px;min-width:28px;padding:0}.power-diagnostics .timeline-card-top{gap:12px}}
|
|
44
44
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.css.js","names":[],"sources":["../../src/renderer/diagnostics.css.ts"],"sourcesContent":["export const diagnosticsStyles = `\n.power-diagnostics{container-type:inline-size;container-name:diagnostics;box-sizing:border-box;color:var(--textColorPrimary);max-width:100%;line-height:1.5}\n.power-diagnostics *{box-sizing:border-box}.power-diagnostics h2{margin:0 0 6px;font-size:24px}.power-diagnostics h3{margin:0 0 6px;font-size:18px}.power-diagnostics p{margin:8px 0 16px}.power-diagnostics .page-intro,.power-diagnostics small,.power-diagnostics .view-intro p{color:var(--textColorSecondary)}\n.power-diagnostics nav{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px;border-bottom:1px solid var(--borderColor);padding-bottom:8px}.power-diagnostics button{cursor:pointer;display:inline-flex;align-items:center;gap:6px;border-radius:5px;border:1px solid var(--borderColor);background:var(--contentColor);color:var(--textColorPrimary);font:inherit;padding:6px 10px;margin:3px 4px 3px 0}.power-diagnostics button:hover{border-color:var(--primary)}.power-diagnostics button[aria-pressed=true]{color:var(--primary);border-color:var(--primary)}.power-diagnostics button:disabled{opacity:.5;cursor:default}.power-diagnostics :is(button,input,summary):focus-visible{outline:2px solid var(--primary);outline-offset:2px}\n.power-diagnostics .diagnostics-header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.power-diagnostics .snapshot-meta{white-space:pre-wrap;font-size:12px;color:var(--textColorSecondary)}.power-diagnostics .view-intro{margin:16px 0}.power-diagnostics .view-intro p{margin:4px 0 0}.power-diagnostics .diagnostics-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:22px}.power-diagnostics .diagnostics-summary>.summary-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--borderColor);border-radius:8px;background:var(--contentColor)}.power-diagnostics .diagnostics-summary strong{display:block;font-size:25px;font-variant-numeric:tabular-nums}.power-diagnostics .diagnostics-summary span{color:var(--textColorSecondary)}.power-diagnostics .summary-card{--summary-color:var(--textColorSecondary)}.power-diagnostics .summary-card.workloads{--summary-color:#bc86df}.power-diagnostics .summary-card.pods{--summary-color:var(--primary,#609ee8)}.power-diagnostics .summary-card.pending{--summary-color:var(--colorSuccess,#67b58b)}.power-diagnostics .summary-card.pending.unavailable{--summary-color:var(--textColorSecondary)}.power-diagnostics .summary-card.unavailable strong{font-size:18px}.power-diagnostics .summary-card.attention{--summary-color:var(--colorWarning,#e0a134)}.power-diagnostics .summary-card strong{color:var(--summary-color)}.power-diagnostics .diagnostics-summary .summary-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:42px;height:42px;border-radius:10px;color:var(--summary-color);background:color-mix(in srgb,var(--summary-color) 12%,transparent)}.power-diagnostics .summary-icon .Icon{color:inherit}\n.power-diagnostics .toolbar{display:grid;align-items:end;gap:16px;margin-bottom:16px}.power-diagnostics .consumers-toolbar{grid-template-columns:160px minmax(160px,1fr) 180px max-content}.power-diagnostics .timeline-toolbar{grid-template-columns:minmax(200px,1fr) 240px max-content}.power-diagnostics .toolbar>label{display:flex;flex-direction:column;gap:6px;min-width:0;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-select{display:block;min-width:180px;max-width:100%;vertical-align:middle}.power-diagnostics .toolbar .diagnostics-select{min-width:0;width:100%}.power-diagnostics .diagnostics-select>div{width:100%}.power-diagnostics .diagnostics-select .Select{min-width:0;width:100%}.power-diagnostics .diagnostics-select .Select__control{min-height:32px;height:32px}.power-diagnostics .diagnostics-select .Select__value-container{padding:0 8px;min-width:0}.power-diagnostics .diagnostics-select .Select__single-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.power-diagnostics .diagnostics-select .Select__input-container{margin:0;padding:0}.power-diagnostics .diagnostics-select .Select__indicator{padding:5px 8px}.power-diagnostics .diagnostics-input{display:block;min-width:0;height:32px}.power-diagnostics .diagnostics-input .Input{height:32px;min-height:32px;margin:0;border:1px solid var(--borderColor);border-radius:4px;background:var(--contentColor);padding:0 9px}.power-diagnostics .diagnostics-input .Input>.input-area{height:30px;min-height:0;min-width:0;padding:0;border:0;border-bottom:0}.power-diagnostics .diagnostics-input .Input>.input-area:after,.power-diagnostics .diagnostics-input .Input>.input-area:before{display:none}.power-diagnostics .diagnostics-input .Input:focus-within{border-color:var(--primary)}.power-diagnostics .diagnostics-input input{width:100%;max-width:100%;height:30px;min-height:0;padding:0;border:0;border-bottom:0;outline:none;background:transparent;color:var(--textColorPrimary);font:inherit}.power-diagnostics .diagnostics-input .Input:after,.power-diagnostics .diagnostics-input .Input:before{display:none}.power-diagnostics .warning-filter{display:flex;align-items:center;min-height:32px;padding:0 0 1px}.power-diagnostics .warning-filter .Checkbox{margin:0;white-space:nowrap}.power-diagnostics .warning-filter label{display:inline-flex;align-items:center;flex-direction:row;color:var(--textColorPrimary)}\n.power-diagnostics .evidence-table{min-width:660px;table-layout:fixed}.power-diagnostics .evidence-source{width:180px}.power-diagnostics .evidence-node{width:160px}.power-diagnostics .evidence-finding{width:auto}.power-diagnostics .evidence-table th{white-space:nowrap;overflow-wrap:normal}.power-diagnostics .evidence-table td:first-child{min-width:0;overflow-wrap:normal;word-break:normal}.power-diagnostics .evidence-table td:nth-child(2){overflow-wrap:break-word;word-break:normal}.power-diagnostics .evidence-table td:nth-child(3){overflow-wrap:anywhere}.power-diagnostics .diagnostics-table{overflow-x:auto;max-width:100%;border:1px solid var(--borderColor);border-radius:7px;margin:16px 0}.power-diagnostics table{width:100%;border-collapse:collapse}.power-diagnostics th,.power-diagnostics td{text-align:left;padding:14px 16px;border-bottom:1px solid var(--borderColor);vertical-align:top;overflow-wrap:anywhere}.power-diagnostics th{color:var(--textColorSecondary);font-weight:500;background:var(--contentColor)}.power-diagnostics td:first-child{min-width:240px}.power-diagnostics .numeric{text-align:right;min-width:170px;font-variant-numeric:tabular-nums}.power-diagnostics small{display:block;font-size:12px}.power-diagnostics .resource-cell strong{display:block;font-size:16px}.power-diagnostics .resource-cell>span{display:block;margin-top:8px}.power-diagnostics .diagnostics-explainer{margin:14px 0;padding:12px 16px;border:1px solid var(--borderColor);border-radius:6px;overflow-wrap:anywhere}.power-diagnostics summary{cursor:pointer;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-empty{padding:28px;text-align:center;border:1px dashed var(--borderColor);border-radius:8px;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-notice{padding:12px 16px;border-left:3px solid var(--colorWarning,#d49a35);background:var(--contentColor)}.power-diagnostics .pending-heading{padding:18px;border:1px solid var(--borderColor);border-radius:8px;margin-top:20px}.power-diagnostics .pending-heading>strong{display:block;color:var(--textColorSecondary);margin-bottom:8px}\n.power-diagnostics .timeline-legend{display:flex;flex-wrap:wrap;gap:14px;margin:18px 0}.power-diagnostics .timeline-type{--event-color:var(--textColorSecondary);display:inline-flex;align-items:center;gap:7px;font-size:12px;color:var(--textColorSecondary)}.power-diagnostics .timeline-type:before{content:\"\";width:8px;height:8px;border-radius:50%;background:var(--event-color);flex-shrink:0}.power-diagnostics .observed{--event-color:#7eacb5}.power-diagnostics .warning{--event-color:var(--colorWarning,#e0a134)}.power-diagnostics .rollout{--event-color:var(--primary,#609ee8)}.power-diagnostics .restart{--event-color:#bc86df}.power-diagnostics .readiness{--event-color:var(--colorSuccess,#67b58b)}\n.power-diagnostics .diagnostics-timeline{list-style:none;padding:0;margin:24px 0}.power-diagnostics .timeline-entry{display:grid;grid-template-columns:170px minmax(0,1fr);gap:30px;position:relative;padding-bottom:24px;--event-color:var(--textColorSecondary)}.power-diagnostics .timeline-entry.observed{--event-color:#7eacb5}.power-diagnostics .timeline-entry.warning{--event-color:var(--colorWarning,#e0a134)}.power-diagnostics .timeline-entry.rollout{--event-color:var(--primary,#609ee8)}.power-diagnostics .timeline-entry.restart{--event-color:#bc86df}.power-diagnostics .timeline-entry.readiness{--event-color:var(--colorSuccess,#67b58b)}.power-diagnostics .timeline-time time{white-space:pre-wrap}.power-diagnostics .timeline-time{padding-top:12px;text-align:right;font-variant-numeric:tabular-nums}.power-diagnostics .timeline-content{position:relative;min-width:0;padding:12px 16px;border:1px solid var(--borderColor);border-radius:7px;overflow-wrap:anywhere}.power-diagnostics .timeline-content:before{content:\"\";position:absolute;left:-22px;top:20px;width:11px;height:11px;background:var(--event-color);border:2px solid var(--mainBackground,var(--contentColor));border-radius:50%;z-index:1}.power-diagnostics .timeline-entry:before{content:\"\";position:absolute;left:183px;top:24px;bottom:-24px;width:2px;background:var(--borderColor)}.power-diagnostics .timeline-entry:last-child:before{display:none}.power-diagnostics .timeline-card-heading{padding-right:32px}.power-diagnostics .timeline-content .timeline-resource-action{position:absolute;top:10px;right:10px;display:flex;align-items:center;justify-content:center;width:26px;height:26px;min-width:26px;padding:0;margin:0;border-color:transparent;background:transparent;color:var(--textColorSecondary)}.power-diagnostics .timeline-content .timeline-resource-action:hover{color:var(--primary);background:var(--contentColor);border-color:var(--borderColor)}.power-diagnostics .timeline-content small{white-space:pre-wrap}.power-diagnostics .timeline-resource-identity{display:flex;align-items:center;gap:5px;overflow-wrap:anywhere}.power-diagnostics .timeline-content h4{margin:5px 0;font-size:15px}.power-diagnostics .timeline-content p{margin:4px 0 10px}\n.power-diagnostics .consumer-status{display:inline-flex;align-items:center;gap:4px;padding:1px 6px;margin-left:4px;border-radius:4px;font-size:11px;vertical-align:middle;color:var(--textColorSecondary);background:color-mix(in srgb,var(--textColorSecondary) 8%,transparent)}.power-diagnostics .consumer-status.warning{color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 10%,transparent)}.power-diagnostics .consumer-status.error{color:var(--colorError,#e56d79);background:color-mix(in srgb,var(--colorError,#e56d79) 10%,transparent)}.power-diagnostics .consumer-status.healthy{color:var(--colorSuccess,#67b58b);background:color-mix(in srgb,var(--colorSuccess,#67b58b) 10%,transparent)}.power-diagnostics .resource-cell .request-burst{display:inline-flex;align-items:center;gap:4px;margin-top:4px;padding:1px 5px;border-radius:4px;font-size:11px;color:var(--textColorSecondary);background:color-mix(in srgb,var(--colorWarning,#e0a134) 10%,transparent)}.power-diagnostics .timeline-content{border-left:2px solid color-mix(in srgb,var(--event-color) 60%,var(--borderColor))}.power-diagnostics .timeline-entry.warning .timeline-content{border-color:color-mix(in srgb,var(--event-color) 35%,var(--borderColor));border-left-color:var(--event-color);background:color-mix(in srgb,var(--event-color) 4%,transparent)}.power-diagnostics .evidence-badge{display:inline-flex;align-items:center;gap:5px;border-radius:4px;padding:2px 6px;font-size:12px;color:var(--primary,#609ee8);background:color-mix(in srgb,var(--primary,#609ee8) 9%,transparent);margin-bottom:4px}.power-diagnostics .evidence-badge.inferred{color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 9%,transparent)}\n.power-diagnostics .diagnostics-summary>button.summary-card{margin:0;width:100%;text-align:left;line-height:inherit;font:inherit}.power-diagnostics .diagnostics-summary>button.summary-card:hover{border-color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 5%,var(--contentColor))}\n@container diagnostics (min-width:701px) and (max-width:900px){.power-diagnostics .consumers-toolbar{grid-template-columns:160px minmax(160px,1fr) 180px}.power-diagnostics .consumers-toolbar>.warning-filter{grid-column:1/-1}}\n.power-diagnostics .consumer-identity-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;margin-bottom:4px}.power-diagnostics .consumer-identity-label{min-width:0;font-weight:500;overflow-wrap:anywhere}.power-diagnostics .consumer-identity-row .consumer-resource-link{display:inline-flex;align-items:center;justify-content:flex-start;gap:6px;min-width:0;margin:0;padding:0;border:0;background:transparent;text-align:left;font-weight:500;overflow-wrap:anywhere}.power-diagnostics .consumer-resource-link:hover{color:var(--primary)}.power-diagnostics .consumer-resource-link>.Icon{flex-shrink:0;opacity:.65}.power-diagnostics .consumer-expand-slot{display:flex;justify-content:flex-end;flex-shrink:0;padding-left:10px;border-left:1px solid var(--borderColor)}.power-diagnostics .consumer-identity-row .consumer-expand{display:flex;align-items:center;justify-content:center;width:28px;height:28px;min-width:28px;margin:0;padding:0;border:1px solid var(--borderColor);border-radius:4px;background:var(--contentColor);color:var(--textColorSecondary)}.power-diagnostics .consumer-identity-row .consumer-expand:hover{color:var(--primary);border-color:var(--primary)}\n.power-diagnostics .consumer-depth-1>td:first-child{padding-left:32px;position:relative}.power-diagnostics .consumer-depth-2>td:first-child{padding-left:48px;position:relative}.power-diagnostics .consumer-depth-1>td:first-child:before,.power-diagnostics .consumer-depth-2>td:first-child:before{content:\"\";position:absolute;top:0;bottom:0;left:16px;width:1px;background:var(--borderColor)}.power-diagnostics .consumer-depth-2>td:first-child:before{left:32px}.power-diagnostics .consumer-pod-row>td{background:color-mix(in srgb,var(--textColorSecondary) 3%,transparent)}.power-diagnostics .consumer-namespace-row>td:first-child{font-weight:500}.power-diagnostics .namespace-identity{min-width:0;max-width:100%;display:inline-flex;align-items:center;gap:7px;font-size:14px}.power-diagnostics .namespace-identity>.Icon{color:var(--primary)}\n.power-diagnostics .consumers-table{table-layout:fixed;min-width:900px}.power-diagnostics .consumers-table .metric-column{width:205px}.power-diagnostics .consumers-table .unscheduled-column{width:165px}.power-diagnostics .consumers-table th{white-space:nowrap;overflow-wrap:normal}.power-diagnostics .consumers-table th:last-child{white-space:normal;word-break:normal;overflow-wrap:normal}.power-diagnostics .consumers-table td{padding-top:12px;padding-bottom:12px}.power-diagnostics .consumer-identity-main{flex:1;min-width:0}.power-diagnostics .consumer-title-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}.power-diagnostics .consumer-title-line .consumer-status{margin-left:0}.power-diagnostics .consumer-subtitle{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:5px;line-height:1.4}.power-diagnostics .consumer-subtitle>.Icon{flex-shrink:0}.power-diagnostics .consumer-row-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.power-diagnostics .consumer-identity-row{align-items:flex-start;margin-bottom:0}.power-diagnostics .consumer-identity-row .consumer-resource-link{font-size:14px;color:var(--textColorPrimary)}.power-diagnostics .resource-value,.power-diagnostics .resource-request{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.power-diagnostics .resource-value small,.power-diagnostics .resource-request small{font-size:11px;white-space:nowrap}.power-diagnostics .resource-cell .resource-value strong{font-size:15px;font-weight:600}.power-diagnostics .resource-request{margin-top:3px}.power-diagnostics .resource-request>span{font-size:12px}.power-diagnostics .resource-cell .resource-coverage{margin-top:4px;font-size:10px;line-height:1.4}.power-diagnostics .unscheduled-cell>div{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.power-diagnostics .unscheduled-cell>div+div{margin-top:5px}.power-diagnostics .unscheduled-cell small{font-size:11px}.power-diagnostics .unscheduled-cell span{font-size:12px}.power-diagnostics .unscheduled-cell.has-requests span{color:var(--colorWarning,#e0a134)}.power-diagnostics .unscheduled-empty{color:var(--textColorSecondary);font-size:12px}.power-diagnostics .timeline-entry{color:var(--textColorPrimary)}.power-diagnostics .timeline-entry.warning .timeline-content h4{color:var(--colorWarning,#e0a134)}.power-diagnostics .pending-heading{padding:14px}.power-diagnostics .pending-heading>p{color:var(--textColorSecondary);margin-bottom:0}.power-diagnostics .diagnostics-summary{gap:10px;margin-bottom:16px}.power-diagnostics .diagnostics-summary>.summary-card{padding:10px 14px}.power-diagnostics .diagnostics-summary strong{font-size:22px}.power-diagnostics .diagnostics-summary .summary-icon{width:36px;height:36px;border-radius:8px}.power-diagnostics .diagnostics-summary .summary-card>div>span{font-size:12px}.power-diagnostics .diagnostics-explainer{padding:9px 12px}.power-diagnostics .view-intro{margin:12px 0}.power-diagnostics .view-intro p{font-size:12px}\n.power-diagnostics .pending-title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.power-diagnostics .pending-title-row>div{min-width:0}.power-diagnostics .pending-title-row strong{font-size:12px;color:var(--textColorSecondary);overflow-wrap:anywhere}.power-diagnostics .pending-state-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px}.power-diagnostics .pending-state-row h3{margin:0}.power-diagnostics .pending-title-row .pending-open-action{margin:0;flex-shrink:0;min-height:28px;padding:3px 8px;font-size:12px;white-space:nowrap}.power-diagnostics .pending-request-badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.power-diagnostics .pending-request-badges>span{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:4px;background:var(--contentColor);color:var(--textColorSecondary);font-size:12px}.power-diagnostics .pending-request-badges strong{color:var(--textColorPrimary);font-weight:500;font-variant-numeric:tabular-nums}\n.power-diagnostics .attention-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:20px}.power-diagnostics .attention-empty strong{font-size:15px;color:var(--textColorPrimary)}.power-diagnostics .attention-empty small{max-width:520px;line-height:1.5}.power-diagnostics .attention-empty>.Icon{color:var(--textColorSecondary)}.power-diagnostics .attention-empty.all-ready>.Icon,.power-diagnostics .attention-empty.all-ready strong{color:var(--colorSuccess,#67b58b)}.power-diagnostics .attention-empty.all-ready{border-color:color-mix(in srgb,var(--colorSuccess,#67b58b) 35%,var(--borderColor));background:color-mix(in srgb,var(--colorSuccess,#67b58b) 3%,transparent)}.power-diagnostics .consumer-tone-error>td{background:color-mix(in srgb,var(--colorError,#e56d79) 4%,transparent)}.power-diagnostics .consumer-tone-warning>td{background:color-mix(in srgb,var(--colorWarning,#e0a134) 3%,transparent)}.power-diagnostics .consumer-tone-error>td:first-child{box-shadow:inset 3px 0 var(--colorError,#e56d79)}.power-diagnostics .consumer-tone-warning>td:first-child{box-shadow:inset 3px 0 var(--colorWarning,#e0a134)}\n@media(max-width:700px){.power-diagnostics .diagnostics-summary{grid-template-columns:1fr}.power-diagnostics .toolbar{grid-template-columns:minmax(0,1fr);align-items:stretch}.power-diagnostics .toolbar>*,.power-diagnostics .diagnostics-select{width:100%;min-width:0}.power-diagnostics .warning-filter{padding:0}.power-diagnostics .timeline-entry{grid-template-columns:minmax(0,1fr);gap:6px;padding-left:24px}.power-diagnostics .timeline-time{text-align:left;padding:0}.power-diagnostics .timeline-entry:before{left:5px;top:44px}.power-diagnostics .timeline-content:before{left:-24px}.power-diagnostics .timeline-content{margin-left:0}}\n\n@container diagnostics (max-width:700px){.power-diagnostics .diagnostics-summary{grid-template-columns:1fr}.power-diagnostics .toolbar{grid-template-columns:minmax(0,1fr);align-items:stretch}.power-diagnostics .toolbar>*,.power-diagnostics .diagnostics-select{width:100%;min-width:0}.power-diagnostics .warning-filter{padding:0}.power-diagnostics .timeline-entry{grid-template-columns:minmax(0,1fr);gap:6px;padding-left:24px}.power-diagnostics .timeline-time{text-align:left;padding:0}.power-diagnostics .timeline-entry:before{left:5px;top:44px}.power-diagnostics .timeline-content:before{left:-24px}.power-diagnostics .timeline-content{margin-left:0}}\n\n.power-diagnostics .diagnostics-select .Select__control{background:color-mix(in srgb,var(--textColorPrimary) 5%,var(--contentColor));border:1px solid var(--inputControlBorder,var(--halfGray));box-shadow:none;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s}\n.power-diagnostics .diagnostics-select .Select__control:hover{border-color:var(--textColorSecondary);background:color-mix(in srgb,var(--textColorPrimary) 8%,var(--contentColor))}\n.power-diagnostics .diagnostics-select .Select__control--is-focused{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}\n.power-diagnostics .diagnostics-select .Select__single-value{color:var(--textColorPrimary)}\n.power-diagnostics .diagnostics-select .Select__indicators{border-left:1px solid var(--borderFaintColor);align-self:stretch;padding:0 3px}\n.power-diagnostics .diagnostics-select .Select__dropdown-indicator{opacity:.85;color:var(--textColorSecondary)}\n@media(prefers-reduced-motion:reduce){.power-diagnostics .diagnostics-select .Select__control{transition:none}}\n\n.power-diagnostics .diagnostics-summary .summary-icon .Icon,.power-diagnostics .diagnostics-summary .summary-icon .Icon>.icon{color:var(--summary-color)}\n.power-diagnostics .pending-heading.error{border-left:3px solid var(--colorError,#e56d79);background:color-mix(in srgb,var(--colorError,#e56d79) 4%,transparent)}\n.power-diagnostics .pending-heading.warning{border-left:3px solid var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 3%,transparent)}\n.power-diagnostics .pending-heading>.consumer-status{margin:0 0 10px}\n.power-diagnostics .consumers-table .consumer-column{width:380px}.power-diagnostics .consumer-title-line{flex-wrap:wrap;white-space:normal}.power-diagnostics .consumer-identity-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.power-diagnostics .consumer-title-line .consumer-resource-link{display:inline-flex;max-width:100%;transition:color 160ms ease}.power-diagnostics .consumer-link-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.power-diagnostics .consumer-identity-row .consumer-resource-link:hover,.power-diagnostics .consumer-identity-row .consumer-resource-link:focus-visible{color:var(--primary)}.power-diagnostics .consumer-resource-link:focus-visible{outline:2px solid var(--primary);outline-offset:3px}.power-diagnostics .consumer-pod-row .consumer-resource-link,.power-diagnostics .consumer-pod-row .consumer-subtitle{padding-left:8px}@media(prefers-reduced-motion:reduce){.power-diagnostics .consumer-title-line .consumer-resource-link{transition:none}}.power-diagnostics .consumer-subtitle{flex-wrap:nowrap;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.power-diagnostics .consumer-status{flex-shrink:1;min-width:0;white-space:normal;overflow-wrap:anywhere}.power-diagnostics .consumers-table td{padding-top:8px;padding-bottom:8px}.power-diagnostics .resource-cell .request-burst{display:inline-flex;margin-top:3px;font-size:10px;white-space:nowrap}.power-diagnostics .explain-finding{font-size:11px;padding:3px 6px}.power-diagnostics .consumer-row-actions .explain-finding{width:26px;height:26px;padding:3px;margin:0}.power-diagnostics .timeline-content details{margin-top:6px}.power-diagnostics .timeline-content details li{margin:8px 0}\n.power-diagnostics .incident-copy{display:inline-flex;align-items:center;gap:8px;margin-right:8px}.power-diagnostics .incident-copy button{min-width:28px;min-height:28px;padding:4px;margin:0}.power-diagnostics .incident-copy [role=status]{font-size:11px;max-width:150px}.power-diagnostics .consumer-row-actions .incident-copy{margin-right:0}.power-diagnostics .consumer-row-actions .explain-finding{min-width:28px;min-height:28px}\n.power-diagnostics .explain-finding{min-width:28px;min-height:28px}.power-diagnostics .consumer-row-actions .incident-copy{position:relative}.power-diagnostics .consumer-row-actions .incident-copy [role=status]{position:absolute;right:0;top:100%;white-space:nowrap;background:var(--contentColor);padding:3px 6px;border:1px solid var(--borderColor);z-index:2;max-width:none}\n\n.power-diagnostics .incident-copy button,.power-diagnostics .consumer-row-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:28px;height:28px;min-width:28px;min-height:28px;gap:0;padding:0;line-height:1;vertical-align:middle}.power-diagnostics .incident-copy button>.Icon,.power-diagnostics .consumer-row-actions .explain-finding>.Icon{margin:0;flex-shrink:0}\n\n.power-diagnostics .timeline-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.power-diagnostics .timeline-card-top>.timeline-card-heading{flex:1;min-width:0;padding-right:0}.power-diagnostics .timeline-card-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.power-diagnostics .timeline-card-actions .incident-copy{position:relative;margin:0}.power-diagnostics .timeline-card-actions .incident-copy [role=status]{position:absolute;right:0;top:calc(100% + 6px);white-space:nowrap;max-width:260px;background:var(--contentColor);border:1px solid var(--borderColor);padding:4px 6px;z-index:2}.power-diagnostics .timeline-content .timeline-card-actions .timeline-resource-action{position:static;width:28px;height:28px;min-width:28px;margin:0}.power-diagnostics .timeline-card-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;margin:0;padding:0 8px;line-height:1}.power-diagnostics .timeline-card-actions .explain-finding>.Icon{margin:0;flex-shrink:0}\n.power-diagnostics .namespace-scope{display:flex;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:6px;margin:4px 0 16px;min-height:32px}.power-diagnostics .namespace-scope-label{overflow-wrap:anywhere}.power-diagnostics .namespace-scope button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:4px 0;margin:0;border:0;background:transparent;box-shadow:none;color:var(--textColorSecondary)}.power-diagnostics .namespace-scope button:hover{color:var(--primary);background:transparent}.power-diagnostics .namespace-scope button:focus-visible{outline:2px solid var(--primary);outline-offset:3px}\n@container diagnostics (max-width:700px){.power-diagnostics .timeline-card-actions .timeline-action-label{display:none}.power-diagnostics .timeline-card-actions .explain-finding{width:28px;min-width:28px;padding:0}.power-diagnostics .timeline-card-top{gap:12px}}\n`;\n"],"mappings":";AAAA,IAAa,oBAAoB"}
|
|
1
|
+
{"version":3,"file":"diagnostics.css.js","names":[],"sources":["../../src/renderer/diagnostics.css.ts"],"sourcesContent":["export const diagnosticsStyles = `\n.power-diagnostics{container-type:inline-size;container-name:diagnostics;box-sizing:border-box;color:var(--textColorPrimary);max-width:100%;line-height:1.5}\n.power-diagnostics *{box-sizing:border-box}.power-diagnostics h2{margin:0 0 6px;font-size:24px}.power-diagnostics h3{margin:0 0 6px;font-size:18px}.power-diagnostics p{margin:8px 0 16px}.power-diagnostics .page-intro,.power-diagnostics small,.power-diagnostics .view-intro p{color:var(--textColorSecondary)}\n.power-diagnostics nav{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px;border-bottom:1px solid var(--borderColor);padding-bottom:8px}.power-diagnostics button{cursor:pointer;display:inline-flex;align-items:center;gap:6px;border-radius:5px;border:1px solid var(--borderColor);background:var(--contentColor);color:var(--textColorPrimary);font:inherit;padding:6px 10px;margin:3px 4px 3px 0}.power-diagnostics button:hover{border-color:var(--primary)}.power-diagnostics button[aria-pressed=true]{color:var(--primary);border-color:var(--primary)}.power-diagnostics button:disabled{opacity:.5;cursor:default}.power-diagnostics :is(button,input,summary):focus-visible{outline:2px solid var(--primary);outline-offset:2px}\n.power-diagnostics .diagnostics-header{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.power-diagnostics .snapshot-meta{white-space:pre-wrap;font-size:12px;color:var(--textColorSecondary)}.power-diagnostics .view-intro{margin:16px 0}.power-diagnostics .view-intro p{margin:4px 0 0}.power-diagnostics .diagnostics-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:22px}.power-diagnostics .diagnostics-summary>.summary-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--borderColor);border-radius:8px;background:var(--contentColor)}.power-diagnostics .diagnostics-summary strong{display:block;font-size:25px;font-variant-numeric:tabular-nums}.power-diagnostics .diagnostics-summary span{color:var(--textColorSecondary)}.power-diagnostics .summary-card{--summary-color:var(--textColorSecondary)}.power-diagnostics .summary-card.workloads{--summary-color:#bc86df}.power-diagnostics .summary-card.pods{--summary-color:var(--primary,#609ee8)}.power-diagnostics .summary-card.pending{--summary-color:var(--colorSuccess,#67b58b)}.power-diagnostics .summary-card.pending.unavailable{--summary-color:var(--textColorSecondary)}.power-diagnostics .summary-card.unavailable strong{font-size:18px}.power-diagnostics .summary-card.attention{--summary-color:var(--colorWarning,#e0a134)}.power-diagnostics .summary-card strong{color:var(--summary-color)}.power-diagnostics .diagnostics-summary .summary-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:42px;height:42px;border-radius:10px;color:var(--summary-color);background:color-mix(in srgb,var(--summary-color) 12%,transparent)}.power-diagnostics .summary-icon .Icon{color:inherit}\n.power-diagnostics .toolbar{display:grid;align-items:end;gap:16px;margin-bottom:16px}.power-diagnostics .consumers-toolbar{grid-template-columns:160px minmax(160px,1fr) 180px max-content}.power-diagnostics .timeline-toolbar{grid-template-columns:minmax(200px,1fr) 240px max-content}.power-diagnostics .toolbar>label{display:flex;flex-direction:column;gap:6px;min-width:0;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-select{display:block;min-width:180px;max-width:100%;vertical-align:middle}.power-diagnostics .toolbar .diagnostics-select{min-width:0;width:100%}.power-diagnostics .diagnostics-select>div{width:100%}.power-diagnostics .diagnostics-select .Select{min-width:0;width:100%}.power-diagnostics .diagnostics-select .Select__control{min-height:32px;height:32px}.power-diagnostics .diagnostics-select .Select__value-container{padding:0 8px;min-width:0}.power-diagnostics .diagnostics-select .Select__single-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.power-diagnostics .diagnostics-select .Select__input-container{margin:0;padding:0}.power-diagnostics .diagnostics-select .Select__indicator{padding:5px 8px}.power-diagnostics .diagnostics-input{display:block;min-width:0;height:32px}.power-diagnostics .diagnostics-input .Input{height:32px;min-height:32px;margin:0;border:1px solid var(--borderColor);border-radius:4px;background:var(--contentColor);padding:0 9px}.power-diagnostics .diagnostics-input .Input>.input-area{height:30px;min-height:0;min-width:0;padding:0;border:0;border-bottom:0}.power-diagnostics .diagnostics-input .Input>.input-area:after,.power-diagnostics .diagnostics-input .Input>.input-area:before{display:none}.power-diagnostics .diagnostics-input .Input:focus-within{border-color:var(--primary)}.power-diagnostics .diagnostics-input input{width:100%;max-width:100%;height:30px;min-height:0;padding:0;border:0;border-bottom:0;outline:none;background:transparent;color:var(--textColorPrimary);font:inherit}.power-diagnostics .diagnostics-input .Input:after,.power-diagnostics .diagnostics-input .Input:before{display:none}.power-diagnostics .warning-filter{display:flex;align-items:center;min-height:32px;padding:0 0 1px}.power-diagnostics .warning-filter .Checkbox{margin:0;white-space:nowrap}.power-diagnostics .warning-filter label{display:inline-flex;align-items:center;flex-direction:row;color:var(--textColorPrimary)}\n.power-diagnostics .evidence-table{min-width:660px;table-layout:fixed}.power-diagnostics .evidence-source{width:180px}.power-diagnostics .evidence-node{width:160px}.power-diagnostics .evidence-finding{width:auto}.power-diagnostics .evidence-table th{white-space:nowrap;overflow-wrap:normal}.power-diagnostics .evidence-table td:first-child{min-width:0;overflow-wrap:normal;word-break:normal}.power-diagnostics .evidence-table td:nth-child(2){overflow-wrap:break-word;word-break:normal}.power-diagnostics .evidence-table td:nth-child(3){overflow-wrap:anywhere}.power-diagnostics .diagnostics-table{overflow-x:auto;max-width:100%;border:1px solid var(--borderColor);border-radius:7px;margin:16px 0}.power-diagnostics table{width:100%;border-collapse:collapse}.power-diagnostics th,.power-diagnostics td{text-align:left;padding:14px 16px;border-bottom:1px solid var(--borderColor);vertical-align:top;overflow-wrap:anywhere}.power-diagnostics th{color:var(--textColorSecondary);font-weight:500;background:var(--contentColor)}.power-diagnostics td:first-child{min-width:240px}.power-diagnostics .numeric{text-align:right;min-width:170px;font-variant-numeric:tabular-nums}.power-diagnostics small{display:block;font-size:12px}.power-diagnostics .resource-cell strong{display:block;font-size:16px}.power-diagnostics .resource-cell>span{display:block;margin-top:8px}.power-diagnostics .diagnostics-explainer{margin:14px 0;padding:12px 16px;border:1px solid var(--borderColor);border-radius:6px;overflow-wrap:anywhere}.power-diagnostics summary{cursor:pointer;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-empty{padding:28px;text-align:center;border:1px dashed var(--borderColor);border-radius:8px;color:var(--textColorSecondary)}.power-diagnostics .diagnostics-notice{padding:12px 16px;border-left:3px solid var(--colorWarning,#d49a35);background:var(--contentColor)}.power-diagnostics .pending-heading{padding:18px;border:1px solid var(--borderColor);border-radius:8px;margin-top:20px}.power-diagnostics .pending-heading>strong{display:block;color:var(--textColorSecondary);margin-bottom:8px}\n.power-diagnostics .timeline-legend{display:flex;flex-wrap:wrap;gap:14px;margin:18px 0}.power-diagnostics .timeline-type{--event-color:var(--textColorSecondary);display:inline-flex;align-items:center;gap:7px;font-size:12px;color:var(--textColorSecondary)}.power-diagnostics .timeline-type:before{content:\"\";width:8px;height:8px;border-radius:50%;background:var(--event-color);flex-shrink:0}.power-diagnostics .observed{--event-color:#7eacb5}.power-diagnostics .warning{--event-color:var(--colorWarning,#e0a134)}.power-diagnostics .rollout{--event-color:var(--primary,#609ee8)}.power-diagnostics .restart{--event-color:#bc86df}.power-diagnostics .readiness{--event-color:var(--colorSuccess,#67b58b)}\n.power-diagnostics .diagnostics-timeline{list-style:none;padding:0;margin:24px 0}.power-diagnostics .timeline-entry{display:grid;grid-template-columns:170px minmax(0,1fr);gap:30px;position:relative;padding-bottom:24px;--event-color:var(--textColorSecondary)}.power-diagnostics .timeline-entry.observed{--event-color:#7eacb5}.power-diagnostics .timeline-entry.warning{--event-color:var(--colorWarning,#e0a134)}.power-diagnostics .timeline-entry.rollout{--event-color:var(--primary,#609ee8)}.power-diagnostics .timeline-entry.restart{--event-color:#bc86df}.power-diagnostics .timeline-entry.readiness{--event-color:var(--colorSuccess,#67b58b)}.power-diagnostics .timeline-time time{white-space:pre-wrap}.power-diagnostics .timeline-time{padding-top:12px;text-align:right;font-variant-numeric:tabular-nums}.power-diagnostics .timeline-content{position:relative;min-width:0;padding:12px 16px;border:1px solid var(--borderColor);border-radius:7px;overflow-wrap:anywhere}.power-diagnostics .timeline-content:before{content:\"\";position:absolute;left:-22px;top:20px;width:11px;height:11px;background:var(--event-color);border:2px solid var(--mainBackground,var(--contentColor));border-radius:50%;z-index:1}.power-diagnostics .timeline-entry:before{content:\"\";position:absolute;left:183px;top:24px;bottom:-24px;width:2px;background:var(--borderColor)}.power-diagnostics .timeline-entry:last-child:before{display:none}.power-diagnostics .timeline-card-heading{padding-right:32px}.power-diagnostics .timeline-content .timeline-resource-action{position:absolute;top:10px;right:10px;display:flex;align-items:center;justify-content:center;width:26px;height:26px;min-width:26px;padding:0;margin:0;border-color:transparent;background:transparent;color:var(--textColorSecondary)}.power-diagnostics .timeline-content .timeline-resource-action:hover{color:var(--primary);background:var(--contentColor);border-color:var(--borderColor)}.power-diagnostics .timeline-content small{white-space:pre-wrap}.power-diagnostics .timeline-resource-identity{display:flex;align-items:center;gap:5px;overflow-wrap:anywhere}.power-diagnostics .timeline-content h4{margin:5px 0;font-size:15px}.power-diagnostics .timeline-content p{margin:4px 0 10px}\n.power-diagnostics .consumer-status{display:inline-flex;align-items:center;gap:4px;padding:1px 6px;margin-left:4px;border-radius:4px;font-size:11px;vertical-align:middle;color:var(--textColorSecondary);background:color-mix(in srgb,var(--textColorSecondary) 8%,transparent)}.power-diagnostics .consumer-status.warning{color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 10%,transparent)}.power-diagnostics .consumer-status.error{color:var(--colorError,#e56d79);background:color-mix(in srgb,var(--colorError,#e56d79) 10%,transparent)}.power-diagnostics .consumer-status.healthy{color:var(--colorSuccess,#67b58b);background:color-mix(in srgb,var(--colorSuccess,#67b58b) 10%,transparent)}.power-diagnostics .resource-cell .request-burst{display:inline-flex;align-items:center;gap:4px;margin-top:4px;padding:1px 5px;border-radius:4px;font-size:11px;color:var(--textColorSecondary);background:color-mix(in srgb,var(--colorWarning,#e0a134) 10%,transparent)}.power-diagnostics .timeline-content{border-left:2px solid color-mix(in srgb,var(--event-color) 60%,var(--borderColor))}.power-diagnostics .timeline-entry.warning .timeline-content{border-color:color-mix(in srgb,var(--event-color) 35%,var(--borderColor));border-left-color:var(--event-color);background:color-mix(in srgb,var(--event-color) 4%,transparent)}.power-diagnostics .evidence-badge{display:inline-flex;align-items:center;gap:5px;border-radius:4px;padding:2px 6px;font-size:12px;color:var(--primary,#609ee8);background:color-mix(in srgb,var(--primary,#609ee8) 9%,transparent);margin-bottom:4px}.power-diagnostics .evidence-badge.inferred{color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 9%,transparent)}\n.power-diagnostics .diagnostics-summary>button.summary-card{margin:0;width:100%;text-align:left;line-height:inherit;font:inherit}.power-diagnostics .diagnostics-summary>button.summary-card:hover{border-color:var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 5%,var(--contentColor))}\n@container diagnostics (min-width:701px) and (max-width:900px){.power-diagnostics .consumers-toolbar{grid-template-columns:160px minmax(160px,1fr) 180px}.power-diagnostics .consumers-toolbar>.warning-filter{grid-column:1/-1}}\n.power-diagnostics .consumer-identity-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;margin-bottom:4px}.power-diagnostics .consumer-identity-label{min-width:0;font-weight:500;overflow-wrap:anywhere}.power-diagnostics .consumer-identity-row .consumer-resource-link{display:inline-flex;align-items:center;justify-content:flex-start;gap:6px;min-width:0;margin:0;padding:0;border:0;background:transparent;text-align:left;font-weight:500;overflow-wrap:anywhere}.power-diagnostics .consumer-resource-link:hover{color:var(--primary)}.power-diagnostics .consumer-resource-link>.Icon{flex-shrink:0;opacity:.65}.power-diagnostics .consumer-expand-slot{display:flex;justify-content:flex-end;flex-shrink:0;padding-left:10px;border-left:1px solid var(--borderColor)}.power-diagnostics .consumer-identity-row .consumer-expand{display:flex;align-items:center;justify-content:center;width:28px;height:28px;min-width:28px;margin:0;padding:0;border:1px solid var(--borderColor);border-radius:4px;background:var(--contentColor);color:var(--textColorSecondary)}.power-diagnostics .consumer-identity-row .consumer-expand:hover{color:var(--primary);border-color:var(--primary)}\n.power-diagnostics .consumer-depth-1>td:first-child{padding-left:32px;position:relative}.power-diagnostics .consumer-depth-2>td:first-child{padding-left:48px;position:relative}.power-diagnostics .consumer-depth-1>td:first-child:before,.power-diagnostics .consumer-depth-2>td:first-child:before{content:\"\";position:absolute;top:0;bottom:0;left:16px;width:1px;background:var(--borderColor)}.power-diagnostics .consumer-depth-2>td:first-child:before{left:32px}.power-diagnostics .consumer-pod-row>td{background:color-mix(in srgb,var(--textColorSecondary) 3%,transparent)}.power-diagnostics .consumer-namespace-row>td:first-child{font-weight:500}.power-diagnostics .namespace-identity{min-width:0;max-width:100%;display:inline-flex;align-items:center;gap:7px;font-size:14px}.power-diagnostics .namespace-identity>.Icon{color:var(--primary)}\n.power-diagnostics .consumers-table{table-layout:fixed;min-width:900px}.power-diagnostics .consumers-table .metric-column{width:205px}.power-diagnostics .consumers-table .unscheduled-column{width:165px}.power-diagnostics .consumers-table th{white-space:nowrap;overflow-wrap:normal}.power-diagnostics .consumers-table th:last-child{white-space:normal;word-break:normal;overflow-wrap:normal}.power-diagnostics .consumers-table td{padding-top:12px;padding-bottom:12px}.power-diagnostics .consumer-identity-main{flex:1;min-width:0}.power-diagnostics .consumer-title-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}.power-diagnostics .consumer-title-line .consumer-status{margin-left:0}.power-diagnostics .consumer-subtitle{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:5px;line-height:1.4}.power-diagnostics .consumer-subtitle>.Icon{flex-shrink:0}.power-diagnostics .consumer-row-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.power-diagnostics .consumer-identity-row{align-items:flex-start;margin-bottom:0}.power-diagnostics .consumer-identity-row .consumer-resource-link{font-size:14px;color:var(--textColorPrimary)}.power-diagnostics .resource-value,.power-diagnostics .resource-request{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.power-diagnostics .resource-value small,.power-diagnostics .resource-request small{font-size:11px;white-space:nowrap}.power-diagnostics .resource-cell .resource-value strong{font-size:15px;font-weight:600}.power-diagnostics .resource-request{margin-top:3px}.power-diagnostics .resource-request>span{font-size:12px}.power-diagnostics .resource-cell .resource-coverage{margin-top:4px;font-size:10px;line-height:1.4}.power-diagnostics .unscheduled-cell>div{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.power-diagnostics .unscheduled-cell>div+div{margin-top:5px}.power-diagnostics .unscheduled-cell small{font-size:11px}.power-diagnostics .unscheduled-cell span{font-size:12px}.power-diagnostics .unscheduled-cell.has-requests span{color:var(--colorWarning,#e0a134)}.power-diagnostics .unscheduled-empty{color:var(--textColorSecondary);font-size:12px}.power-diagnostics .timeline-entry{color:var(--textColorPrimary)}.power-diagnostics .timeline-entry.warning .timeline-content h4{color:var(--colorWarning,#e0a134)}.power-diagnostics .pending-heading{padding:14px}.power-diagnostics .pending-heading>p{color:var(--textColorSecondary);margin-bottom:0}.power-diagnostics .diagnostics-summary{gap:10px;margin-bottom:16px}.power-diagnostics .diagnostics-summary>.summary-card{padding:10px 14px}.power-diagnostics .diagnostics-summary strong{font-size:22px}.power-diagnostics .diagnostics-summary .summary-icon{width:36px;height:36px;border-radius:8px}.power-diagnostics .diagnostics-summary .summary-card>div>span{font-size:12px}.power-diagnostics .diagnostics-explainer{padding:9px 12px}.power-diagnostics .view-intro{margin:12px 0}.power-diagnostics .view-intro p{font-size:12px}\n.power-diagnostics .pending-title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.power-diagnostics .pending-title-row>div{min-width:0}.power-diagnostics .pending-title-row strong{font-size:12px;color:var(--textColorSecondary);overflow-wrap:anywhere}.power-diagnostics .pending-state-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px}.power-diagnostics .pending-state-row h3{margin:0}.power-diagnostics .pending-title-row .pending-open-action{margin:0;flex-shrink:0;min-height:28px;padding:3px 8px;font-size:12px;white-space:nowrap}.power-diagnostics .pending-request-badges{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.power-diagnostics .pending-request-badges>span{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:4px;background:var(--contentColor);color:var(--textColorSecondary);font-size:12px}.power-diagnostics .pending-request-badges strong{color:var(--textColorPrimary);font-weight:500;font-variant-numeric:tabular-nums}\n.power-diagnostics .attention-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:20px}.power-diagnostics .attention-empty strong{font-size:15px;color:var(--textColorPrimary)}.power-diagnostics .attention-empty small{max-width:520px;line-height:1.5}.power-diagnostics .attention-empty>.Icon{color:var(--textColorSecondary)}.power-diagnostics .attention-empty.all-ready>.Icon,.power-diagnostics .attention-empty.all-ready strong{color:var(--colorSuccess,#67b58b)}.power-diagnostics .attention-empty.all-ready{border-color:color-mix(in srgb,var(--colorSuccess,#67b58b) 35%,var(--borderColor));background:color-mix(in srgb,var(--colorSuccess,#67b58b) 3%,transparent)}.power-diagnostics .consumer-tone-error>td{background:color-mix(in srgb,var(--colorError,#e56d79) 4%,transparent)}.power-diagnostics .consumer-tone-warning>td{background:color-mix(in srgb,var(--colorWarning,#e0a134) 3%,transparent)}.power-diagnostics .consumer-tone-error>td:first-child{box-shadow:inset 3px 0 var(--colorError,#e56d79)}.power-diagnostics .consumer-tone-warning>td:first-child{box-shadow:inset 3px 0 var(--colorWarning,#e0a134)}\n@media(max-width:700px){.power-diagnostics .diagnostics-summary{grid-template-columns:1fr}.power-diagnostics .toolbar{grid-template-columns:minmax(0,1fr);align-items:stretch}.power-diagnostics .toolbar>*,.power-diagnostics .diagnostics-select{width:100%;min-width:0}.power-diagnostics .warning-filter{padding:0}.power-diagnostics .timeline-entry{grid-template-columns:minmax(0,1fr);gap:6px;padding-left:24px}.power-diagnostics .timeline-time{text-align:left;padding:0}.power-diagnostics .timeline-entry:before{left:5px;top:44px}.power-diagnostics .timeline-content:before{left:-24px}.power-diagnostics .timeline-content{margin-left:0}}\n\n@container diagnostics (max-width:700px){.power-diagnostics .diagnostics-summary{grid-template-columns:1fr}.power-diagnostics .toolbar{grid-template-columns:minmax(0,1fr);align-items:stretch}.power-diagnostics .toolbar>*,.power-diagnostics .diagnostics-select{width:100%;min-width:0}.power-diagnostics .warning-filter{padding:0}.power-diagnostics .timeline-entry{grid-template-columns:minmax(0,1fr);gap:6px;padding-left:24px}.power-diagnostics .timeline-time{text-align:left;padding:0}.power-diagnostics .timeline-entry:before{left:5px;top:44px}.power-diagnostics .timeline-content:before{left:-24px}.power-diagnostics .timeline-content{margin-left:0}}\n\n.power-diagnostics .diagnostics-select .Select__control{background:color-mix(in srgb,var(--textColorPrimary) 5%,var(--contentColor));border:1px solid var(--inputControlBorder,var(--halfGray));box-shadow:none;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s}\n.power-diagnostics .diagnostics-select .Select__control:hover{border-color:var(--textColorSecondary);background:color-mix(in srgb,var(--textColorPrimary) 8%,var(--contentColor))}\n.power-diagnostics .diagnostics-select .Select__control--is-focused{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}\n.power-diagnostics .diagnostics-select .Select__single-value{color:var(--textColorPrimary)}\n.power-diagnostics .diagnostics-select .Select__indicators{border-left:1px solid var(--borderFaintColor);align-self:stretch;padding:0 3px}\n.power-diagnostics .diagnostics-select .Select__dropdown-indicator{opacity:.85;color:var(--textColorSecondary)}\n@media(prefers-reduced-motion:reduce){.power-diagnostics .diagnostics-select .Select__control{transition:none}}\n\n.power-diagnostics .diagnostics-summary .summary-icon .Icon,.power-diagnostics .diagnostics-summary .summary-icon .Icon>.icon{color:var(--summary-color)}\n.power-diagnostics .pending-heading.error{border-left:3px solid var(--colorError,#e56d79);background:color-mix(in srgb,var(--colorError,#e56d79) 4%,transparent)}\n.power-diagnostics .pending-heading.warning{border-left:3px solid var(--colorWarning,#e0a134);background:color-mix(in srgb,var(--colorWarning,#e0a134) 3%,transparent)}\n.power-diagnostics .pending-heading>.consumer-status{margin:0 0 10px}\n.power-diagnostics .consumers-table .consumer-column{width:380px}.power-diagnostics .consumer-title-line{flex-wrap:wrap;white-space:normal}.power-diagnostics .consumer-identity-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.power-diagnostics .consumer-title-line .consumer-resource-link{display:inline-flex;max-width:100%;transition:color 160ms ease}.power-diagnostics .consumer-link-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.power-diagnostics .consumer-identity-row .consumer-resource-link:hover,.power-diagnostics .consumer-identity-row .consumer-resource-link:focus-visible{color:var(--primary)}.power-diagnostics .consumer-resource-link:focus-visible{outline:2px solid var(--primary);outline-offset:3px}.power-diagnostics .consumer-pod-row .consumer-resource-link,.power-diagnostics .consumer-pod-row .consumer-subtitle{padding-left:8px}@media(prefers-reduced-motion:reduce){.power-diagnostics .consumer-title-line .consumer-resource-link{transition:none}}.power-diagnostics .consumer-subtitle{flex-wrap:nowrap;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.power-diagnostics .consumer-status{flex-shrink:1;min-width:0;white-space:normal;overflow-wrap:anywhere}.power-diagnostics .consumers-table td{padding-top:8px;padding-bottom:8px}.power-diagnostics .resource-cell .request-burst{display:inline-flex;margin-top:3px;font-size:10px;white-space:nowrap}.power-diagnostics .explain-finding{font-size:11px;padding:3px 6px}.power-diagnostics .consumer-row-actions .explain-finding{width:26px;height:26px;padding:3px;margin:0}.power-diagnostics .timeline-content details{margin-top:6px}.power-diagnostics .timeline-content details li{margin:8px 0}\n.power-diagnostics .incident-copy{display:inline-flex;align-items:center;gap:8px;margin-right:8px}.power-diagnostics .incident-copy button{min-width:28px;min-height:28px;padding:4px;margin:0}.power-diagnostics .incident-copy [role=status]{font-size:11px;max-width:150px}.power-diagnostics .consumer-row-actions .incident-copy{margin-right:0}.power-diagnostics .consumer-row-actions .explain-finding{min-width:28px;min-height:28px}\n.power-diagnostics .explain-finding{min-width:28px;min-height:28px}.power-diagnostics .consumer-row-actions .incident-copy{position:relative}.power-diagnostics .consumer-row-actions .incident-copy [role=status]{position:absolute;right:0;top:100%;white-space:nowrap;background:var(--contentColor);padding:3px 6px;border:1px solid var(--borderColor);z-index:2;max-width:none}\n\n.power-diagnostics .incident-copy button,.power-diagnostics .consumer-row-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:28px;height:28px;min-width:28px;min-height:28px;gap:0;padding:0;line-height:1;vertical-align:middle}.power-diagnostics .incident-copy button>.Icon,.power-diagnostics .consumer-row-actions .explain-finding>.Icon{margin:0;flex-shrink:0}\n\n.power-diagnostics .timeline-card-top{display:flex;align-items:center;justify-content:space-between;gap:16px}.power-diagnostics .timeline-card-top>.timeline-card-heading{flex:1;min-width:0;padding-right:0}.power-diagnostics .timeline-card-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.power-diagnostics .timeline-card-actions .incident-copy{position:relative;margin:0}.power-diagnostics .timeline-card-actions .incident-copy [role=status]{position:absolute;right:0;top:calc(100% + 6px);white-space:nowrap;max-width:260px;background:var(--contentColor);border:1px solid var(--borderColor);padding:4px 6px;z-index:2}.power-diagnostics .timeline-content .timeline-card-actions .timeline-resource-action{position:static;width:28px;height:28px;min-width:28px;margin:0}.power-diagnostics .timeline-card-actions .explain-finding{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;margin:0;padding:0 8px;line-height:1}.power-diagnostics .timeline-card-actions .explain-finding>.Icon{margin:0;flex-shrink:0}\n.power-diagnostics .namespace-scope{display:flex;align-items:center;flex-wrap:wrap;column-gap:20px;row-gap:6px;margin:4px 0 16px;min-height:32px}.power-diagnostics .namespace-scope-label{overflow-wrap:anywhere}.power-diagnostics .namespace-scope button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:4px 0;margin:0;border:0;background:transparent;box-shadow:none;color:var(--textColorSecondary)}.power-diagnostics .namespace-scope button:hover{color:var(--primary);background:transparent}.power-diagnostics .namespace-scope button:focus-visible{outline:2px solid var(--primary);outline-offset:3px}\n@container diagnostics (max-width:700px){.power-diagnostics .timeline-card-actions .timeline-action-label{display:none}.power-diagnostics .timeline-card-actions .explain-finding{width:28px;min-width:28px;padding:0}.power-diagnostics .timeline-card-top{gap:12px}}\n`;\n"],"mappings":";AAAA,IAAa,oBAAoB"}
|