Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/charts/api/charts.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -2121,6 +2121,9 @@ export type MetricElementEvent = {
// @public
export type MetricFontWeight = Extract<FontWeight, 'bold' | 'normal' | 500>;

// @public
export type MetricSpacing = 'small' | 'large';

// @alpha (undocumented)
export interface MetricSpec extends Spec {
// (undocumented)
Expand Down Expand Up @@ -2154,6 +2157,8 @@ export interface MetricStyle {
// (undocumented)
nonFiniteText: string;
// (undocumented)
spacing: MetricSpacing;
// (undocumented)
textDarkColor: Color;
// (undocumented)
textExtraDarkColor: Color;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ class Component extends React.Component<Props> {
bulletToMetricStyle.minValueFontSize,
false,
false,
textDimensions.metricSpacing.panelPadding,
);
const sizes = getSnappedFontSizes(fittedValueFontSize, panel.height, bulletToMetricStyle);

Expand Down
36 changes: 24 additions & 12 deletions packages/charts/src/chart_types/metric/renderer/_index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -54,51 +54,63 @@
// TODO: Find a better way to style based on sizes (i.e. sass functions)
&.echMetric--withProgressBar {
&--small {
padding-left: $progress-bar-width-small + $padding;
padding-left: calc(#{$progress-bar-width-small} + var(--echMetricProgressTextGap, #{$padding}));
}
&--medium {
padding-left: $progress-bar-width-medium + $padding;
padding-left: calc(#{$progress-bar-width-medium} + var(--echMetricProgressTextGap, #{$padding}));
}
&--large {
padding-left: $progress-bar-width-large + $padding;
padding-left: calc(#{$progress-bar-width-large} + var(--echMetricProgressTextGap, #{$padding}));
}
}

&.echMetric--withTargetProgressBar {
&--small {
padding-left: $progress-bar-width-small + $padding + $progress-bar-target-width;
padding-left: calc(
#{$progress-bar-width-small} + #{$progress-bar-target-width} + var(--echMetricProgressTextGap, #{$padding})
);
}
&--medium {
padding-left: $progress-bar-width-medium + $padding + $progress-bar-target-width;
padding-left: calc(
#{$progress-bar-width-medium} + #{$progress-bar-target-width} + var(--echMetricProgressTextGap, #{$padding})
);
}
&--large {
padding-left: $progress-bar-width-large + $padding + $progress-bar-target-width;
padding-left: calc(
#{$progress-bar-width-large} + #{$progress-bar-target-width} + var(--echMetricProgressTextGap, #{$padding})
);
}
}
}

&--horizontal {
&.echMetric--withProgressBar {
&--small {
padding-bottom: $progress-bar-height-small + $padding;
padding-bottom: calc(#{$progress-bar-height-small} + var(--echMetricProgressTextGap, #{$padding}));
}
&--medium {
padding-bottom: $progress-bar-height-medium + $padding;
padding-bottom: calc(#{$progress-bar-height-medium} + var(--echMetricProgressTextGap, #{$padding}));
}
&--large {
padding-bottom: $progress-bar-height-large + $padding;
padding-bottom: calc(#{$progress-bar-height-large} + var(--echMetricProgressTextGap, #{$padding}));
}
}

&.echMetric--withTargetProgressBar {
&--small {
padding-bottom: $progress-bar-height-small + $padding + $progress-bar-target-height;
padding-bottom: calc(
#{$progress-bar-height-small} + #{$progress-bar-target-height} + var(--echMetricProgressTextGap, #{$padding})
);
}
&--medium {
padding-bottom: $progress-bar-height-medium + $padding + $progress-bar-target-height;
padding-bottom: calc(
#{$progress-bar-height-medium} + #{$progress-bar-target-height} + var(--echMetricProgressTextGap, #{$padding})
);
}
&--large {
padding-bottom: $progress-bar-height-large + $padding + $progress-bar-target-height;
padding-bottom: calc(
#{$progress-bar-height-large} + #{$progress-bar-target-height} + var(--echMetricProgressTextGap, #{$padding})
);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ $progress-bar-border-radius: 8px;
border-radius: $progress-bar-border-radius;

&--vertical {
left: $padding;
left: var(--echMetricPadding, #{$padding});
right: 0;
top: $padding;
top: var(--echMetricPadding, #{$padding});
bottom: 0;
height: calc(100% - #{$padding * 2});
height: calc(100% - (var(--echMetricPadding, #{$padding}) * 2));
width: 100%;

&.echSingleMetricProgress--small {
Expand All @@ -29,11 +29,11 @@ $progress-bar-border-radius: 8px;
}

&--horizontal {
left: $padding;
left: var(--echMetricPadding, #{$padding});
right: 0;
width: calc(100% - #{$padding * 2});
width: calc(100% - (var(--echMetricPadding, #{$padding}) * 2));
top: 0;
bottom: $padding;
bottom: var(--echMetricPadding, #{$padding});
height: 100%;

&.echSingleMetricProgress--small {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
grid-template-columns: minmax(0, 1fr);
grid-template-rows: min-content auto min-content min-content;
height: 100%;
padding: $padding;
padding: var(--echMetricPadding, #{$padding});
line-height: 1.2;

&__gap {
Expand Down Expand Up @@ -44,7 +44,7 @@
display: flex;
align-items: center;
overflow: hidden;
padding-top: 5px;
padding-top: var(--echMetricExtraPaddingTop, 5px);

&--left {
justify-content: flex-start;
Expand Down Expand Up @@ -92,7 +92,7 @@
}

&__subtitle {
padding-top: 5px;
padding-top: var(--echMetricTitleSubtitleGap, 5px);
font-weight: normal;
width: 95%;
}
Expand All @@ -109,7 +109,7 @@
}

&__valueIcon {
padding-left: $padding;
padding-left: var(--echMetricPadding, #{$padding});
}

&__part {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ function Component({
style.minValueFontSize,
datum.valueIcon !== undefined,
style.valueFontSize === 'fit',
textDimensions.metricSpacing.panelPadding,
);
acc.fittedValueFontSize = Math.min(acc.fittedValueFontSize, valueFontSize);

Expand Down
14 changes: 13 additions & 1 deletion packages/charts/src/chart_types/metric/renderer/dom/metric.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ export const Metric: React.FunctionComponent<{
const progressBarDirection = hasProgressBar ? datum.progressBarDirection : undefined;

const hasTrend = isMetricWTrend(datum);
const { metricSpacing } = textDimensions;

const containerClassName = classNames('echMetric', {
'echMetric--rightBorder': columnIndex < totalColumns - 1,
Expand Down Expand Up @@ -192,10 +193,21 @@ export const Metric: React.FunctionComponent<{

const event: MetricElementEvent = { type: 'metricElementEvent', rowIndex, columnIndex };

const containerStyle: CSSProperties = {
const containerStyle: CSSProperties &
Record<
| '--echMetricPadding'
| '--echMetricTitleSubtitleGap'
| '--echMetricExtraPaddingTop'
| '--echMetricProgressTextGap',
string
> = {
backgroundColor: hasTrend || hasProgressBar ? backgroundColor : datumWithInteractionColor.color,
cursor: onElementClick ? 'pointer' : DEFAULT_CSS_CURSOR,
borderColor: style.border,
'--echMetricPadding': `${metricSpacing.panelPadding}px`,
'--echMetricTitleSubtitleGap': `${metricSpacing.titleSubtitleGap}px`,
'--echMetricExtraPaddingTop': `${metricSpacing.extraPaddingTop}px`,
'--echMetricProgressTextGap': `${metricSpacing.progressTextGap}px`,
};

const textContrastOptions = isColorContrastOptions(contrastOptions)
Expand Down
30 changes: 23 additions & 7 deletions packages/charts/src/chart_types/metric/renderer/dom/text.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import React from 'react';
import type { ProgressBarSize } from './metric';
import { SecondaryMetric } from './secondary_metric';
import type { MetricTextDimensions } from './text_measurements';
import { PADDING } from './text_measurements';
import { TitlesBlock } from './titles';
import type { Color } from '../../../../common/colors';
import { LayoutDirection, renderWithProps } from '../../../../utils/common';
Expand Down Expand Up @@ -52,8 +51,8 @@ const gridColumns = {
};

// Allways use three columns when the icon is visible for symmetry and centering
const getGridTemplateColumnsWithIcon = (iconSize: number) => {
const iconSizeWithPadding = `${iconSize + PADDING}px`;
const getGridTemplateColumnsWithIcon = (iconSize: number, panelPadding: number) => {
const iconSizeWithPadding = `${iconSize + panelPadding}px`;
return `${iconSizeWithPadding} minmax(0, 1fr) ${iconSizeWithPadding}`;
};

Expand Down Expand Up @@ -95,7 +94,14 @@ export const MetricText: React.FC<MetricTextprops> = ({
colors,
defaultBadgeBorderColor,
}) => {
const { heightBasedSizes: sizes, hasProgressBar, progressBarDirection, visibility, textParts } = textDimensions;
const {
heightBasedSizes: sizes,
metricSpacing,
hasProgressBar,
progressBarDirection,
visibility,
textParts,
} = textDimensions;
const { extra, body } = datum;

const containerClassName = classNames('echMetricText', {
Expand All @@ -107,7 +113,9 @@ export const MetricText: React.FC<MetricTextprops> = ({
const { valuePosition, iconAlign } = style;
const isIconVisible = !!datum.icon;

const gridTemplateColumns = isIconVisible ? getGridTemplateColumnsWithIcon(sizes.iconSize) : undefined;
const gridTemplateColumns = isIconVisible
? getGridTemplateColumnsWithIcon(sizes.iconSize, metricSpacing.panelPadding)
: undefined;
const currentGridTemplateRows = gridTemplateRows[valuePosition];

const iconGridStyles = isIconVisible ? { gridRow: '1', gridColumn: iconAlign === 'left' ? '1' : '3' } : {};
Expand Down Expand Up @@ -204,7 +212,14 @@ export const MetricText: React.FC<MetricTextprops> = ({
{/* Value Block */}
<div
className={classNames('echMetricText__valueBlock', `echMetricText__valueBlock--${style.valueTextAlign}`)}
style={{ gridRow: currentGridRows.value, gridColumn: currentGridColumns.value }}
style={{
gridRow: currentGridRows.value,
gridColumn: currentGridColumns.value,
marginBottom:
style.valuePosition === 'top' && visibility.title ? metricSpacing.primaryAdjacentGap : undefined,
marginTop:
style.valuePosition === 'bottom' && visibility.extra ? metricSpacing.primaryAdjacentGap : undefined,
}}
>
<p
className="echMetricText__value"
Expand All @@ -231,7 +246,8 @@ export const MetricText: React.FC<MetricTextprops> = ({
style={{
fontSize: sizes.valueFontSize,
color: datum.valueColor ?? colors.highContrast,
marginRight: style.valueTextAlign === 'center' ? -(sizes.valuePartFontSize + PADDING) : undefined,
marginRight:
style.valueTextAlign === 'center' ? -(sizes.valuePartFontSize + metricSpacing.panelPadding) : undefined,
}}
>
{renderWithProps(datum.valueIcon, {
Expand Down
Loading