Skip to content

feat(data-viz): create intial pages for engineering #4312

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 24 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
fe7988b
feat(docs): data viz base structure
krisantrobus Apr 10, 2025
4654b80
feat(data-viz): wokring base chart
krisantrobus Apr 11, 2025
0cbd203
feat(data-viz): wip
krisantrobus Apr 11, 2025
97f8ac2
feat(data-viz): wip
krisantrobus Apr 11, 2025
1f696ac
feat(data-viz): wip
krisantrobus Apr 14, 2025
427a1bd
feat(data-viz): wip
krisantrobus Apr 14, 2025
3ba6789
feat(data-viz): sitemap
krisantrobus Apr 14, 2025
db40510
feat(data-viz): docs exmapleds
krisantrobus Apr 14, 2025
1b60202
feat(data-viz): ci checks
krisantrobus Apr 14, 2025
b82ba11
feat(data-viz): docs refinement
krisantrobus Apr 16, 2025
317220a
Merge branch 'main' of github.com:twilio-labs/paste into docs-data-vi…
krisantrobus Apr 16, 2025
1b5bc22
chore(cleanup): remove redundant story
krisantrobus Apr 16, 2025
bb8c48b
chore(cleanup): changeset
krisantrobus Apr 16, 2025
7d0d76b
fix(data-viz): fix urls
krisantrobus Apr 16, 2025
d828fb3
fix(data-viz): fix slugs
krisantrobus Apr 16, 2025
8b7fcf4
feat(data-vix): chart-provider in project.json
krisantrobus Apr 16, 2025
2297ca3
chore(data-vix): test chanpshots
krisantrobus Apr 16, 2025
882cefc
chore(ci): fix supabase
krisantrobus Apr 16, 2025
65f2844
chore(ci): fix supabase
krisantrobus Apr 16, 2025
3f21680
chore(ci): ignore generated files for linting
krisantrobus Apr 16, 2025
e4b069a
chore(data-vix): typos
krisantrobus Apr 16, 2025
856fa96
chore(data-vix): trigger rebuild
krisantrobus Apr 16, 2025
fa6c7b4
chore(data-vix): trigger rebuild
krisantrobus Apr 16, 2025
34bcf1e
chore(data-vix): trigger rebuild
krisantrobus Apr 16, 2025
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
3 changes: 3 additions & 0 deletions cypress/integration/sitemap-vrt/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export const SITEMAP = [
"/components/card/",
"/components/card/api",
"/components/card/changelog",
"/components/chart-provider/",
"/components/chat-composer/",
"/components/chat-composer/api",
"/components/chat-composer/changelog",
Expand Down Expand Up @@ -285,6 +286,8 @@ export const SITEMAP = [
"/foundations/content/word-list/",
"/foundations/illustrations/",
"/foundations/data-visualization/",
"/foundations/data-visualization/engineering/",
"/foundations/data-visualization/engineering/chart-types/",
"/foundations/spacing-and-layout/",
"/foundations/typography/",
"/inclusive-design/",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,15 @@ export const usePasteHighchartsTheme = (options: Highcharts.Options): Highcharts
},
},
tooltip: {
backgroundColor: context.backgroundColors.colorBackground,
backgroundColor: context.backgroundColors.colorBackgroundBodyInverse,
borderColor: context.borderColors.colorBorderInverse,
borderWidth: context.borderWidths.borderWidth10,
borderRadius: context.radii.borderRadius30.replace("px", ""),
padding: 12,
style: {
fontFamily: context.fonts.fontFamilyText,
color: context.textColors.colorText,
fontSize: context.fontSizes.fontSize30,
Comment on lines +108 to +116
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aligns more closely with our tooltip. The previous tooltip did not set the font from the theme

},
},
credits: {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import type { Meta, StoryFn } from "@storybook/react";
import { ChartProvider } from "@twilio-paste/chart-provider";
import { Stack } from "@twilio-paste/stack";
import * as React from "react";

import { BaseChart } from "./components/BaseChart";
import { lineChartOptions } from "./options/lineChartOptions";

// eslint-disable-next-line import/no-default-export
export default {
title: "Libraries/data-visualization/base-chart",
parameters: {
chromatic: { disableSnapshot: true },
a11y: {
// no need to a11y check composition of a11y checked components
disable: true,
},
},
} as Meta;

export const HighchartsOptions: StoryFn = () => {
return (
<Stack orientation="vertical" spacing="space100">
<ChartProvider highchartsOptions={{ chart: { type: "line" }, series: lineChartOptions.series }}>
<BaseChart />
</ChartProvider>
</Stack>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Box } from "@twilio-paste/box";
import { ChartContext } from "@twilio-paste/chart-provider";
import * as Highcharts from "highcharts";
import HighchartsReact from "highcharts-react-official";
import HighchartsAccessibilityModule from "highcharts/modules/accessibility";
import * as React from "react";

import { applyPasteHighchartsModules, usePasteHighchartsTheme } from "../../src";

const Chart: React.FC = () => {
applyPasteHighchartsModules(Highcharts, HighchartsAccessibilityModule);
const chartRef = React.useRef<HTMLElement | null>(null);
const { options, setChart, setChartRef } = React.useContext(ChartContext);
const [chartOptions, setChartOptions] = React.useState<Highcharts.Options>(
// disabling animation for stories only. Not included in our docs examples
usePasteHighchartsTheme({ ...options, plotOptions: { series: { animation: false } } }),
);

React.useLayoutEffect(() => {
setChartOptions(Highcharts.merge(chartOptions, options));
}, [options]);

React.useEffect(() => {
if (chartRef.current) {
setChartRef(chartRef.current);
}
}, [chartRef.current]);

const callback = (chart: Highcharts.Chart): void => {
if (chart?.series?.length > 0) {
setChart(chart);
}
};

return (
<Box gridArea="base-chart" ref={chartRef} position="relative">
<HighchartsReact
highcharts={Highcharts}
options={chartOptions}
constructorType={chartOptions.chart?.map ? "mapChart" : undefined}
updateArgs={[true, true, false]}
callback={callback}
/>
</Box>
);
};

export const BaseChart = React.memo(Chart);
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { Box } from "@twilio-paste/box";
import { ChartContext } from "@twilio-paste/chart-provider";

Check failure on line 2 in packages/paste-website/src/component-examples/data-visualization/BaseChart.tsx

View workflow job for this annotation

GitHub Actions / Lint repository

'@twilio-paste/chart-provider' should be listed in the project's dependencies. Run 'npm i -S @twilio-paste/chart-provider' to add it
import * as Highcharts from "highcharts";
import HighchartsReact from "highcharts-react-official";
import HighchartsAccessibilityModule from "highcharts/modules/accessibility";
import { applyPasteHighchartsModules, usePasteHighchartsTheme } from "@twilio-paste/data-visualization-library";
import * as React from "react";

const Chart: React.FC = () => {
applyPasteHighchartsModules(Highcharts, HighchartsAccessibilityModule);
const chartRef = React.useRef<HTMLElement | null>(null);
const { options, setChart, setChartRef } = React.useContext(ChartContext);
const [chartOptions, setChartOptions] = React.useState<Highcharts.Options>(usePasteHighchartsTheme(options));

React.useLayoutEffect(() => {
setChartOptions(Highcharts.merge(chartOptions, options));
}, [options]);

React.useEffect(() => {
if (chartRef.current) {
setChartRef(chartRef.current);
}
}, [chartRef.current]);

const callback = (chart: Highcharts.Chart) => {

Check failure on line 25 in packages/paste-website/src/component-examples/data-visualization/BaseChart.tsx

View workflow job for this annotation

GitHub Actions / Lint repository

Missing return type on function
if (chart?.series?.length > 0) {
setChart(chart);
}
};

return (
<Box gridArea="base-chart" ref={chartRef} position="relative">
<HighchartsReact
highcharts={Highcharts}
options={chartOptions}
constructorType={chartOptions.chart?.map ? "mapChart" : undefined}
updateArgs={[true, true, false]}
callback={callback}
/>
</Box>
);
};

export const ExamplesDataVizBaseChart = React.memo(Chart);
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
export const SimpleChartProviderExample = `
const ChartProviderExample = () => {
const lineSeriesData = [
{
name: "Installation",
data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175],
},
{
name: "Manufacturing",
data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434],
},
]
Comment on lines +2 to +12
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

decided to include the series so consumers can understand the formats required. Easier to onboard

return (
<ChartProvider highchartsOptions={{ chart: { type: "line" }, series: lineSeriesData }}>
<BaseChart />
</ChartProvider>
);
};
render(<ChartProviderExample />);
`.trim();

export const CustomChartProviderExample = `
const ChartProviderExample = () => {
const lineSeriesData = [
{
name: "Installation",
data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175],
type: "line",
},
{
name: "Manufacturing",
data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434],
type: "line",
},
{
name: "Sales & Distribution",
data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387],
type: "column",
},
{
name: "Project Development",
data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227],
type: "column",
},
]
return (
<ChartProvider highchartsOptions={{title: {floating: true, align: "right", text: "Custom charting title"}, series: lineSeriesData}}>
<BaseChart />
</ChartProvider>
);
};
render(<ChartProviderExample />);
`.trim();
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,18 @@ const SiteSidebarNavigation = (): JSX.Element => {
</SidebarAnchor>
<SidebarAnchor href={`${SidebarCategoryRoutes.CONTENT}/word-list`}>Word list</SidebarAnchor>
</NavigationDisclosure>
<SidebarAnchor href={`${SidebarCategoryRoutes.FOUNDATIONS}/data-visualization`}>
Data visualization
</SidebarAnchor>
<NavigationDisclosure buttonText="Data visualization" categoryRoute={SidebarCategoryRoutes.DATA_VISUALIZATION}>
<SidebarAnchor href={SidebarCategoryRoutes.DATA_VISUALIZATION}>Overview</SidebarAnchor>
<NavigationDisclosure
buttonText="Engineering"
categoryRoute={`${SidebarCategoryRoutes.DATA_VISUALIZATION}/engineering`}
>
<SidebarAnchor href={`${SidebarCategoryRoutes.DATA_VISUALIZATION}/engineering/`}>Overview</SidebarAnchor>
<SidebarAnchor href={`${SidebarCategoryRoutes.DATA_VISUALIZATION}/engineering/chart-types`}>
Chart types
</SidebarAnchor>
</NavigationDisclosure>
</NavigationDisclosure>
<SidebarAnchor
href={`${SidebarCategoryRoutes.FOUNDATIONS}/elevation`}
onClick={() =>
Expand Down Expand Up @@ -363,6 +372,32 @@ const SiteSidebarNavigation = (): JSX.Element => {
if (name === "Sidebar Navigation") {
return null;
}
if (["Chart Provider"].includes(name)) {
return null;
}
if (name === "Data Visualization") {
return (
<NavigationDisclosure
buttonText={name}
categoryRoute={categoryRoute}
key={slug}
onClick={() =>
event({
category: "Left Navigation",
action: `click-${name}`,
label: name,
})
}
>
<SidebarAnchor
href={`${SidebarCategoryRoutes.COMPONENTS}/chart-provider`}
selected={pathname.includes(`${SidebarCategoryRoutes.COMPONENTS}/chart-provider`)}
>
Chart Provider
</SidebarAnchor>
</NavigationDisclosure>
);
}
return (
<SidebarAnchor selected={selected} href={categoryRoute} key={slug}>
{name}
Expand Down
1 change: 1 addition & 0 deletions packages/paste-website/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export const SidebarCategoryRoutes = {
FOUNDATIONS: "/foundations",
CONTENT: "/foundations/content",
FOUNDATIONS_LOCALIZATION: "/foundations/localization",
DATA_VISUALIZATION: "/foundations/data-visualization",
PATTERNS: "/patterns",
EXPERIENCES: "/experiences",
COMPONENTS: "/components",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import Changelog from '@twilio-paste/chart-provider/CHANGELOG.md'; // I don't know why this is needed but if you remove it the page fails to render
import packageJson from '@twilio-paste/chart-provider/package.json';

import {SidebarCategoryRoutes} from '../../../constants';
import ComponentPageLayout from '../../../layouts/ComponentPageLayout';
import {getFeature, getNavigationData, getComponentApi} from '../../../utils/api';

export const meta = {
title: 'ChartProvider',
package: '@twilio-paste/chart-provider',
description: packageJson.description,
slug: '/components/chart-provider/api',
};

export default ComponentPageLayout;

export const getStaticProps = async () => {
const navigationData = await getNavigationData();
const feature = await getFeature('Chart Provider');
const {componentApi, componentApiTocData} = getComponentApi('@twilio-paste/chart-provider');
return {
props: {
data: {
...packageJson,
...feature,
},
componentApi,
mdxHeadings: [...mdxHeadings, ...componentApiTocData],
navigationData,
pageHeaderData: {
categoryRoute: SidebarCategoryRoutes.COMPONENTS,
githubUrl: 'https://github.com/twilio-labs/paste/tree/main/packages/paste-core/components/chart-provider',
storybookUrl: '/?path=/story/components-chartprovider',
},
},
};
};

## Installation

```bash
yarn add @twilio-paste/chart-provider - or - yarn add @twilio-paste/core
```

## Usage

```jsx
import { ChartProvider } from '@twilio-paste/core/chart-provider';

const ChartProviderExample = () => {
return (
<ChartProvider {...config}>
<BaseChart />
</ChartProvider>
);
};
```

## Props

<PropsTable componentApi={props.componentApi} />
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {SidebarCategoryRoutes} from '../../../constants';
import Changelog from '@twilio-paste/chart-provider/CHANGELOG.md';
import packageJson from '@twilio-paste/chart-provider/package.json';
import ComponentPageLayout from '../../../layouts/ComponentPageLayout';
import {getFeature, getNavigationData} from '../../../utils/api';

export const meta = {
title: 'Chart Provider',
package: '@twilio-paste/chart-provider',
description: packageJson.description,
slug: '/components/chart-provider/changelog',
};

export default ComponentPageLayout;

export const getStaticProps = async () => {
const navigationData = await getNavigationData();
const feature = await getFeature('Chart Provider');
return {
props: {
data: {
...packageJson,
...feature,
},
navigationData,
mdxHeadings,
pageHeaderData: {
categoryRoute: SidebarCategoryRoutes.COMPONENTS,
githubUrl: 'https://github.com/twilio-labs/paste/tree/main/packages/paste-core/components/chart-provider',
storybookUrl: '/?path=/story/components-chartprovider',
},
},
};
};

<Changelog />
Loading
Loading