diff --git a/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/bar.tsx b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/bar.tsx new file mode 100644 index 0000000000..f7cccf1f21 --- /dev/null +++ b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/bar.tsx @@ -0,0 +1,62 @@ +import { + typedCartesianChart, + Heading, + Section, +} from "@mittwald/flow-react-components"; + +export default () => { + const data = [ + { + Monat: "Juli", + Datenbanken: 10, + Webspace: 15.4, + Email: 5.1, + }, + { + Monat: "August", + Datenbanken: 32.9, + Webspace: 25.6, + Email: 10, + }, + { + Monat: "September", + Datenbanken: 40, + Webspace: 20.2, + Email: 8, + }, + ]; + + const CartesianChart = typedCartesianChart<{ + Monat: string; + Datenbanken: number; + Webspace: number; + Email: number; + }>(); + + return ( +
+ Speicherplatz + + + + + + + + + + +
+ ); +}; diff --git a/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barHorizontal.tsx b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barHorizontal.tsx new file mode 100644 index 0000000000..2f8ee4ea4d --- /dev/null +++ b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barHorizontal.tsx @@ -0,0 +1,38 @@ +import { + typedCartesianChart, + Heading, + Section, +} from "@mittwald/flow-react-components"; + +export default () => { + const data = [ + { Projekt: "Projekt A", Speicherplatz: 68 }, + { Projekt: "Projekt B", Speicherplatz: 42 }, + { Projekt: "Projekt C", Speicherplatz: 21 }, + ]; + + const CartesianChart = typedCartesianChart<{ + Projekt: string; + Speicherplatz: number; + }>(); + + return ( +
+ Speicherplatz pro Projekt + + + + + + + +
+ ); +}; diff --git a/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barStacked.tsx b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barStacked.tsx new file mode 100644 index 0000000000..1bddcc3836 --- /dev/null +++ b/apps/docs/src/content/components/data-visualisation/cartesian-chart/examples/barStacked.tsx @@ -0,0 +1,65 @@ +import { + typedCartesianChart, + Heading, + Section, +} from "@mittwald/flow-react-components"; + +export default () => { + const data = [ + { + Monat: "Juli", + Datenbanken: 10, + Webspace: 15.4, + Email: 5.1, + }, + { + Monat: "August", + Datenbanken: 32.9, + Webspace: 25.6, + Email: 10, + }, + { + Monat: "September", + Datenbanken: 40, + Webspace: 20.2, + Email: 8, + }, + ]; + + const CartesianChart = typedCartesianChart<{ + Monat: string; + Datenbanken: number; + Webspace: number; + Email: number; + }>(); + + return ( +
+ Speicherplatz + + + + + + + + + + +
+ ); +}; diff --git a/apps/docs/src/content/components/data-visualisation/cartesian-chart/index.mdx b/apps/docs/src/content/components/data-visualisation/cartesian-chart/index.mdx index 35a1baaf90..88c9d77687 100644 --- a/apps/docs/src/content/components/data-visualisation/cartesian-chart/index.mdx +++ b/apps/docs/src/content/components/data-visualisation/cartesian-chart/index.mdx @@ -1,8 +1,8 @@ --- component: CartesianChart description: - Das CartesianChart stellt Metriken über Zeit als Liniendiagramm oder - Flächendiagramm dar. + Das CartesianChart stellt Metriken als Linien-, Flächen- oder Balkendiagramm + dar. --- @@ -16,13 +16,16 @@ description: [Categorical Colors](/foundations/design/colors#categorical-color) dar. - Sortiere die Areas bei der Area-Darstellung nach Größe, die größte unten. - Halte die Zahl der Dimensionen übersichtlich. Das sichert die Lesbarkeit. +- Bei der Bar-Darstellung darf die x-Achse auch kategorisch sein. Balken + vergleichen Kategorien, nicht nur Zeitpunkte. +- Stapele Balken nur dort, wo die Summe eine Bedeutung hat. --- # Darstellungstypen Im CartesianChart können unterschiedliche Darstellungstypen wie ``, -`` oder eine Kombination aus beiden verwendet werden. +``, `` oder eine Kombination daraus verwendet werden. ## Line @@ -38,6 +41,32 @@ Anteil einzelner Objekte daran. +## Bar + +Vergleicht Werte einzelner Kategorien miteinander. Ohne `stackId` stehen die +Balken einer Kategorie nebeneinander. + + + +Mehrere `` mit derselben `stackId` werden gestapelt. Das zeigt den Anteil +einzelner Objekte am Gesamtwert einer Kategorie. + + + +### Ausrichtung + +Die Property `layout` bestimmt, wo die Kategorie-Achse liegt. Mit dem Default +`horizontal` liegt sie auf der x-Achse, die Balken wachsen nach oben. Mit +`vertical` liegt sie auf der y-Achse und die Balken wachsen zur Seite. Der +`dataKey` wandert dabei auf die ``, die Achsentypen ergeben sich von +selbst. + +Nutze die vertikale Ausrichtung für lange Kategorie-Namen oder für viele +Kategorien. Nur Balken lassen sich sinnvoll drehen. `` und `` +zeigen einen Verlauf und bleiben horizontal. + + + --- # Color diff --git a/apps/remote-dom-demo/src/app/remote/chart/page.tsx b/apps/remote-dom-demo/src/app/remote/chart/page.tsx index 4d1ffe8dcc..c48ab747a6 100644 --- a/apps/remote-dom-demo/src/app/remote/chart/page.tsx +++ b/apps/remote-dom-demo/src/app/remote/chart/page.tsx @@ -2,6 +2,7 @@ import { Area, + Bar, CartesianChart, CartesianGrid, ChartTooltip, @@ -69,11 +70,32 @@ export default function Page() { ); }; + const BarChart: FC<{ layout: "horizontal" | "vertical" }> = ({ layout }) => { + const vertical = layout === "vertical"; + + return ( + + + + + {vertical ? : } + {vertical ? ( + + ) : ( + + )} + + + ); + }; + return ( <> + + ); } diff --git a/packages/components/src/components/CartesianChart/CartesianChart.tsx b/packages/components/src/components/CartesianChart/CartesianChart.tsx index e3280d8da6..afbf088a4c 100644 --- a/packages/components/src/components/CartesianChart/CartesianChart.tsx +++ b/packages/components/src/components/CartesianChart/CartesianChart.tsx @@ -14,10 +14,13 @@ import { useChartClipRect } from "@/components/CartesianChart/hooks/useChartClip import DivView from "@/views/DivView"; import Wrap from "@/components/Wrap"; import type { + CartesianChartLayout, ChartDataValue, DataKeyProp, } from "@/components/CartesianChart/types"; +import { CartesianChartContextProvider } from "@/components/CartesianChart/context"; import { TypedArea } from "@/components/CartesianChart/components/Area"; +import { TypedBar } from "@/components/CartesianChart/components/Bar"; import { TypedXAxis } from "@/components/CartesianChart/components/XAxis"; import { TypedYAxis } from "@/components/CartesianChart/components/YAxis"; import { TypedChartGrid } from "@/components/CartesianChart/components/ChartGrid"; @@ -44,6 +47,17 @@ export interface CartesianChartProps /** The height of the chart. */ height?: string; + /** + * The orientation of the axes and graphical items. `"horizontal"` puts the + * category axis on the x-axis — bars grow upwards. `"vertical"` puts it on + * the y-axis — bars grow to the side. `XAxis` and `YAxis` follow the layout + * on their own; only the `dataKey` moves to whichever axis is the categorical + * one. + * + * @default "horizontal" + */ + layout?: CartesianChartLayout; + /** View that is provided when data is empty/undefined */ emptyView?: ReactNode; @@ -56,8 +70,16 @@ export interface CartesianChartProps /** @flr-generate all */ export const CartesianChart: FC = (props) => { - const { children, data, className, height, flexGrow, emptyView, ...rest } = - props; + const { + children, + data, + className, + height, + flexGrow, + emptyView, + layout = "horizontal", + ...rest + } = props; const warnDeprecation = useWarnDeprecation(); const { viewDimensions, ref: containerRef } = useChartClipRect(); @@ -88,32 +110,41 @@ export const CartesianChart: FC = (props) => { return null; }, [emptyView]); + const contextValue = useMemo(() => ({ layout }), [layout]); + return ( - -
- - - {children} - {showEmptyView && viewDimensions && ( - - - {emptyElement} - - - )} - - -
-
+ + +
+ + + {children} + {showEmptyView && viewDimensions && ( + + + {emptyElement} + + + )} + + +
+
+
); }; @@ -124,6 +155,7 @@ export const typedCartesianChart = < >() => ({ Chart: CartesianChart as ComponentType>, Area: TypedArea(), + Bar: TypedBar(), XAxis: TypedXAxis(), YAxis: TypedYAxis(), Grid: TypedChartGrid(), diff --git a/packages/components/src/components/CartesianChart/components/Bar/Bar.tsx b/packages/components/src/components/CartesianChart/components/Bar/Bar.tsx new file mode 100644 index 0000000000..bfc366303e --- /dev/null +++ b/packages/components/src/components/CartesianChart/components/Bar/Bar.tsx @@ -0,0 +1,76 @@ +import { type ComponentType, type FC } from "react"; +import * as Recharts from "recharts"; +import type { CategoricalWithCustomColor } from "@/lib/tokens/CategoricalColors"; +import { isCategoricalColor } from "@/lib/tokens/isCategoricalColor"; +import { + type ChartDataValue, + type DataKeyProp, + type DataKeyWithLabel, + isDataKeyWithLabel, +} from "@/components/CartesianChart/types"; +import { useCartesianChartContext } from "@/components/CartesianChart/context"; +import { useDesignTokens } from "@/lib/theming"; + +type BarBaseProps = Pick< + Recharts.BarProps, + | "className" + | "stackId" + | "key" + | "xAxisId" + | "yAxisId" + | "unit" + | "barSize" + | "maxBarSize" + | "minPointSize" +> & { + /** The color of the bar. @default "sea-green" */ + color?: CategoricalWithCustomColor; +}; + +export interface BarPropsByDataKeyProp< + TData extends ChartDataValue = ChartDataValue, +> extends BarBaseProps { + dataKey: DataKeyProp; +} + +export interface BarPropsByDataKey< + TData extends ChartDataValue = ChartDataValue, +> + extends BarBaseProps, DataKeyWithLabel {} + +export type BarProps = + BarPropsByDataKey | BarPropsByDataKeyProp; + +/** @flr-generate all */ +export const Bar: FC = (props) => { + const { color: colorFromProps = "sea-green", ...rest } = props; + + const tokens = useDesignTokens(); + const { layout } = useCartesianChartContext(); + + const color = isCategoricalColor(colorFromProps) + ? `var(--color--categorical--${colorFromProps})` + : colorFromProps; + + const cornerRadius = parseInt(tokens.bar["corner-radius"].value); + const radius: Recharts.BarProps["radius"] = + props.stackId !== undefined + ? 0 + : layout === "vertical" + ? [0, cornerRadius, cornerRadius, 0] + : [cornerRadius, cornerRadius, 0, 0]; + + return ( + + ); +}; + +export const TypedBar = () => + Bar as ComponentType>; + +export default Bar; diff --git a/packages/components/src/components/CartesianChart/components/Bar/index.ts b/packages/components/src/components/CartesianChart/components/Bar/index.ts new file mode 100644 index 0000000000..77f082917d --- /dev/null +++ b/packages/components/src/components/CartesianChart/components/Bar/index.ts @@ -0,0 +1,2 @@ +export { default } from "./Bar"; +export * from "./Bar"; diff --git a/packages/components/src/components/CartesianChart/components/Bar/view.ts b/packages/components/src/components/CartesianChart/components/Bar/view.ts new file mode 100644 index 0000000000..f900348858 --- /dev/null +++ b/packages/components/src/components/CartesianChart/components/Bar/view.ts @@ -0,0 +1,10 @@ +/* prettier-ignore */ +/* This file is auto-generated with the remote-components-generator */ +import type { Bar } from "./Bar"; +import type { ViewComponent } from "@/lib/viewComponentContext"; + +declare global { + interface FlowViewComponents { + Bar: ViewComponent; + } +} diff --git a/packages/components/src/components/CartesianChart/components/XAxis/XAxis.tsx b/packages/components/src/components/CartesianChart/components/XAxis/XAxis.tsx index cbbb3da78e..4690b07853 100644 --- a/packages/components/src/components/CartesianChart/components/XAxis/XAxis.tsx +++ b/packages/components/src/components/CartesianChart/components/XAxis/XAxis.tsx @@ -31,11 +31,14 @@ export type XAxisProps< /** @flr-generate all */ export const XAxis: FC = (props) => { + const { type = "auto", ...rest } = props; + const tokens = useDesignTokens(); return ( = (props) => { - const { domain, ...rest } = props; + const { domain, type = "auto", ...rest } = props; const tokens = useDesignTokens(); @@ -39,6 +39,7 @@ export const YAxis: FC = (props) => { {...rest} allowDataOverflow domain={domain} + type={type} fontSize={tokens.axis["font-size"].value} tick={{ fill: tokens.axis["color"].value, diff --git a/packages/components/src/components/CartesianChart/context.ts b/packages/components/src/components/CartesianChart/context.ts new file mode 100644 index 0000000000..615230f7ac --- /dev/null +++ b/packages/components/src/components/CartesianChart/context.ts @@ -0,0 +1,15 @@ +import { createContext, useContext } from "react"; +import type { CartesianChartLayout } from "@/components/CartesianChart/types"; + +interface CartesianChartContext { + layout: CartesianChartLayout; +} + +const cartesianChartContext = createContext({ + layout: "horizontal", +}); + +export const useCartesianChartContext = (): CartesianChartContext => + useContext(cartesianChartContext); + +export const CartesianChartContextProvider = cartesianChartContext.Provider; diff --git a/packages/components/src/components/CartesianChart/index.ts b/packages/components/src/components/CartesianChart/index.ts index 43584d2000..c87c43ce79 100644 --- a/packages/components/src/components/CartesianChart/index.ts +++ b/packages/components/src/components/CartesianChart/index.ts @@ -7,6 +7,7 @@ export { } from "./CartesianChart"; export * from "./components/Area"; export * from "./components/AreaDot"; +export * from "./components/Bar"; export * from "./components/Line"; export * from "./components/ChartTooltip"; export * from "./components/ChartGrid"; diff --git a/packages/components/src/components/CartesianChart/stories/Default.stories.tsx b/packages/components/src/components/CartesianChart/stories/Default.stories.tsx index e0bea44c78..777bcfbc9e 100644 --- a/packages/components/src/components/CartesianChart/stories/Default.stories.tsx +++ b/packages/components/src/components/CartesianChart/stories/Default.stories.tsx @@ -1,6 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react"; import CartesianChart, { typedCartesianChart } from "../CartesianChart"; import Area from "../components/Area"; +import Bar from "../components/Bar"; +import Line from "../components/Line"; import IllustratedMessage from "@/components/IllustratedMessage"; import { Heading, IconMonitoring } from "@/components/public"; import ChartTooltip from "@/components/CartesianChart/components/ChartTooltip/ChartTooltip"; @@ -283,3 +285,62 @@ export const WithIntlNumberFormat: Story = { ), }; + +export const WithBars: Story = { + render: (props) => ( + + + + + + + + + + + ), +}; + +export const WithStackedBars: Story = { + render: (props) => ( + + + + + + + + + + + ), +}; + +export const WithHorizontalBars: Story = { + render: (props) => ( + + + + + + + + + + ), +}; + +export const WithBarsAndLine: Story = { + render: (props) => ( + + + + + + + + + + + ), +}; diff --git a/packages/components/src/components/CartesianChart/typedCartesianChart.test-types.tsx b/packages/components/src/components/CartesianChart/typedCartesianChart.test-types.tsx index 46f68dbfb2..8205e6dd34 100644 --- a/packages/components/src/components/CartesianChart/typedCartesianChart.test-types.tsx +++ b/packages/components/src/components/CartesianChart/typedCartesianChart.test-types.tsx @@ -6,6 +6,7 @@ import { ChartLegend } from "@/components/CartesianChart/components/ChartLegend" import { XAxis } from "@/components/CartesianChart/components/XAxis"; import type { ChartDataValue } from "@/components/CartesianChart/types"; import { Area } from "@/components/CartesianChart/components/Area"; +import { Bar } from "@/components/CartesianChart/components/Bar"; interface ChartData { time: Date; @@ -34,6 +35,17 @@ function filters() { 3} />; } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function testKnownBarProperty() { + ; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function testUnknownBarProperty() { + // @ts-expect-error Is unknown + ; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars function testLegendFormatter() { ; } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function testUntypedBarWithDataKeyAndLabel() { + ; + { + expectTypeOf(data).toMatchTypeOf(); + return 1337; + }} + dataKeyLabel={"foo"} + />; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function testUntypedBarWithDataKeyMissingLabel() { + // @ts-expect-error Is unknown + { + expectTypeOf(data).toMatchTypeOf(); + return 1337; + }} + />; + } } diff --git a/packages/components/src/components/CartesianChart/types.ts b/packages/components/src/components/CartesianChart/types.ts index 5dc623d591..1ecf7e2abf 100644 --- a/packages/components/src/components/CartesianChart/types.ts +++ b/packages/components/src/components/CartesianChart/types.ts @@ -37,3 +37,10 @@ export const isDataKeyWithLabel = ( typeof obj.dataKeyLabel === "string" ); }; + +/** + * The orientation of the chart's axes and graphical items. `"horizontal"` puts + * the category axis on the x-axis (bars grow upwards), `"vertical"` puts it on + * the y-axis (bars grow to the side). + */ +export type CartesianChartLayout = "horizontal" | "vertical"; diff --git a/packages/components/src/views/BarView.tsx b/packages/components/src/views/BarView.tsx new file mode 100644 index 0000000000..293f96dbe3 --- /dev/null +++ b/packages/components/src/views/BarView.tsx @@ -0,0 +1,16 @@ +/* prettier-ignore */ +/* This file is auto-generated with the remote-components-generator */ +import React, { memo, type FC, useContext } from "react"; +import { + Bar, + type BarProps, +} from "@/components/CartesianChart/components/Bar/Bar"; +import { viewComponentContext } from "@/lib/viewComponentContext/viewComponentContext"; + +const BarView: FC = memo((props) => { + const View = useContext(viewComponentContext)["Bar"] ?? Bar; + return ; +}); +BarView.displayName = "BarView"; + +export default BarView; diff --git a/packages/design-tokens/src/dataVisualisation/bar.yml b/packages/design-tokens/src/dataVisualisation/bar.yml new file mode 100644 index 0000000000..fff0a7bb4f --- /dev/null +++ b/packages/design-tokens/src/dataVisualisation/bar.yml @@ -0,0 +1,3 @@ +bar: + corner-radius: + value: "{corner-radius.s}" diff --git a/packages/remote-elements/src/auto-generated/RemoteBarElement.ts b/packages/remote-elements/src/auto-generated/RemoteBarElement.ts new file mode 100644 index 0000000000..2699bf60d8 --- /dev/null +++ b/packages/remote-elements/src/auto-generated/RemoteBarElement.ts @@ -0,0 +1,43 @@ +/* prettier-ignore */ +/* This file is auto-generated with the remote-components-generator */ +import { FlowRemoteElement } from "@/lib/FlowRemoteElement"; +import type { BarProps as RemoteBarElementProps } from "@mittwald/flow-react-components"; +export type { BarProps as RemoteBarElementProps } from "@mittwald/flow-react-components"; + +export class RemoteBarElement extends FlowRemoteElement { + static override get remoteAttributes() { + return ["style"]; + } + + static override get remoteProperties() { + return { + barSize: {}, + className: {}, + color: {}, + dataKey: {}, + dataKeyLabel: {}, + maxBarSize: {}, + minPointSize: {}, + stackId: {}, + unit: {}, + xAxisId: {}, + yAxisId: {}, + }; + } + + static override get remoteEvents() { + return {}; + } + + static override get remoteSlots() { + return []; + } +} + +declare global { + interface HTMLElementTagNameMap { + "flr-bar": InstanceType; + } +} + +customElements.define("flr-bar", RemoteBarElement); diff --git a/packages/remote-elements/src/auto-generated/RemoteCartesianChartElement.ts b/packages/remote-elements/src/auto-generated/RemoteCartesianChartElement.ts index 64acc3e8ba..061eb47608 100644 --- a/packages/remote-elements/src/auto-generated/RemoteCartesianChartElement.ts +++ b/packages/remote-elements/src/auto-generated/RemoteCartesianChartElement.ts @@ -15,6 +15,7 @@ export class RemoteCartesianChartElement extends FlowRemoteElement { + await render( + + + + + + + + + , + ); + + await testScreenshot("CartesianChart with Bars"); + }, +); + +test.each(testEnvironments)( + "CartesianChart with stacked Bars (%s)", + async ({ + testScreenshot, + render, + components: { CartesianChart, ChartGrid, Bar, XAxis, YAxis, ChartLegend }, + }) => { + await render( + + + + + + + + , + ); + + await testScreenshot("CartesianChart with stacked Bars"); + }, +); + +test.each(testEnvironments)( + "CartesianChart with horizontal Bars (%s)", + async ({ + testScreenshot, + render, + components: { CartesianChart, ChartGrid, Bar, XAxis, YAxis, ChartLegend }, + }) => { + await render( + + + + + + + + , + ); + + await testScreenshot("CartesianChart with horizontal Bars"); + }, +); diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-darwin.png new file mode 100644 index 0000000000..1b83818e99 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-linux.png new file mode 100644 index 0000000000..6007cdd4ec Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-firefox-linux.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-darwin.png new file mode 100644 index 0000000000..631e880b30 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-linux.png new file mode 100644 index 0000000000..8ac0988f56 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-Bars-webkit-linux.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-darwin.png new file mode 100644 index 0000000000..13014d401c Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-linux.png new file mode 100644 index 0000000000..edd8d188f5 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-firefox-linux.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-darwin.png new file mode 100644 index 0000000000..e2aa2c12d2 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-linux.png new file mode 100644 index 0000000000..b700eb8349 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-horizontal-Bars-webkit-linux.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-darwin.png new file mode 100644 index 0000000000..cb5904d703 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-linux.png new file mode 100644 index 0000000000..f764db6262 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-firefox-linux.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-darwin.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-darwin.png new file mode 100644 index 0000000000..3e3f9bea6f Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-darwin.png differ diff --git a/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-linux.png b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-linux.png new file mode 100644 index 0000000000..b2eb8a96e9 Binary files /dev/null and b/packages/remote-react-components/src/tests/visual/__screenshots__/CartesianChart.browser.test.tsx/CartesianChart-with-stacked-Bars-webkit-linux.png differ diff --git a/packages/remote-react-renderer/src/auto-generated/index.ts b/packages/remote-react-renderer/src/auto-generated/index.ts index 9265ea56e4..b1a3e9f396 100644 --- a/packages/remote-react-renderer/src/auto-generated/index.ts +++ b/packages/remote-react-renderer/src/auto-generated/index.ts @@ -14,6 +14,7 @@ import { Autocomplete as Autocomplete } from "@mittwald/flow-react-components"; import { Avatar as Avatar } from "@mittwald/flow-react-components"; import { AvatarStack as AvatarStack } from "@mittwald/flow-react-components"; import { Badge as Badge } from "@mittwald/flow-react-components"; +import { Bar as Bar } from "@mittwald/flow-react-components"; import { BigNumber as BigNumber } from "@mittwald/flow-react-components"; import { Breadcrumb as Breadcrumb } from "@mittwald/flow-react-components"; import { Button as Button } from "@mittwald/flow-react-components"; @@ -161,6 +162,7 @@ export const flowComponents = { AvatarStack, ), "flr-badge": createFlowRemoteComponentRenderer("Badge", Badge), + "flr-bar": createFlowRemoteComponentRenderer("Bar", Bar), "flr-big-number": createFlowRemoteComponentRenderer("BigNumber", BigNumber), "flr-breadcrumb": createFlowRemoteComponentRenderer("Breadcrumb", Breadcrumb), "flr-button": createFlowRemoteComponentRenderer("Button", Button),