import { css } from '@emotion/css'; import { ActionId, ActionImpl } from 'kbar'; import React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { useTheme2 } from '@grafana/ui'; export const ResultItem = React.forwardRef( ( { action, active, currentRootActionId, }: { action: ActionImpl; active: boolean; currentRootActionId: ActionId; }, ref: React.Ref ) => { const ancestors = React.useMemo(() => { if (!currentRootActionId) { return action.ancestors; } const index = action.ancestors.findIndex((ancestor) => ancestor.id === currentRootActionId); // +1 removes the currentRootAction; e.g. // if we are on the "Set theme" parent action, // the UI should not display "Set themeā€¦ > Dark" // but rather just "Dark" return action.ancestors.slice(index + 1); }, [action.ancestors, currentRootActionId]); const theme = useTheme2(); const styles = getResultItemStyles(theme, active); return (
{action.icon}
{ancestors.length > 0 && ancestors.map((ancestor) => ( {ancestor.name} ))} {action.name}
{action.subtitle && {action.subtitle}}
{action.shortcut?.length ? (
{action.shortcut.map((sc) => ( {sc} ))}
) : null}
); } ); ResultItem.displayName = 'ResultItem'; const getResultItemStyles = (theme: GrafanaTheme2, isActive: boolean) => { const textColor = isActive ? theme.colors.text.maxContrast : theme.colors.text.primary; const rowBackgroundColor = isActive ? theme.colors.background.primary : 'transparent'; const shortcutBackgroundColor = isActive ? theme.colors.background.secondary : theme.colors.background.primary; return { row: css({ color: textColor, padding: theme.spacing(1, 2), background: rowBackgroundColor, display: 'flex', alightItems: 'center', justifyContent: 'space-between', cursor: 'pointer', '&:before': { display: isActive ? 'block' : 'none', content: '" "', position: 'absolute', left: 0, top: 0, bottom: 0, width: theme.spacing(0.5), borderRadius: theme.shape.borderRadius(1), backgroundImage: theme.colors.gradients.brandVertical, }, }), actionContainer: css({ display: 'flex', gap: theme.spacing(2), alignitems: 'center', fontsize: theme.typography.fontSize, }), textContainer: css({ display: 'flex', flexDirection: 'column', }), shortcut: css({ padding: theme.spacing(0, 1), background: shortcutBackgroundColor, borderRadius: theme.shape.borderRadius(), fontsize: theme.typography.fontSize, }), breadcrumbAncestor: css({ opacity: 0.5, marginRight: theme.spacing(1), }), subtitleText: css({ fontSize: theme.typography.fontSize - 2, }), shortcutContainer: css({ display: 'grid', gridAutoFlow: 'column', gap: theme.spacing(1), }), }; };