@codecademy/gamut 67.6.2 → 67.6.3-alpha.45eda4.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.
@@ -0,0 +1,58 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { css } from '@codecademy/gamut-styles';
3
+ import { motion } from 'framer-motion';
4
+ import { Box } from '../../Box';
5
+ export const minBarWidth = 8;
6
+ const baseBarStyles = {
7
+ alignItems: 'center',
8
+ border: 1,
9
+ borderColor: 'border-primary',
10
+ borderRadius: 'inherit',
11
+ display: 'flex',
12
+ height: '100%',
13
+ left: 0,
14
+ position: 'absolute'
15
+ };
16
+
17
+ /**
18
+ * Animated bar element for background/total value display
19
+ */
20
+ export const BackgroundBar = /*#__PURE__*/_styled(motion.create(Box), {
21
+ target: "e1lnm2ux2",
22
+ label: "BackgroundBar"
23
+ })(css({
24
+ ...baseBarStyles
25
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9CYXIvZWxlbWVudHMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXNCNkIiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L0Jhci9lbGVtZW50cy50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgbW90aW9uIH0gZnJvbSAnZnJhbWVyLW1vdGlvbic7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5cbmV4cG9ydCBjb25zdCBtaW5CYXJXaWR0aCA9IDg7XG5cbmNvbnN0IGJhc2VCYXJTdHlsZXMgPSB7XG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBib3JkZXI6IDEsXG4gIGJvcmRlckNvbG9yOiAnYm9yZGVyLXByaW1hcnknLFxuICBib3JkZXJSYWRpdXM6ICdpbmhlcml0JyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBoZWlnaHQ6ICcxMDAlJyxcbiAgbGVmdDogMCxcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEFuaW1hdGVkIGJhciBlbGVtZW50IGZvciBiYWNrZ3JvdW5kL3RvdGFsIHZhbHVlIGRpc3BsYXlcbiAqL1xuZXhwb3J0IGNvbnN0IEJhY2tncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBGb3JlZ3JvdW5kIGJhciBmb3Igc3RhY2tlZCBkaXNwbGF5IChwcm9ncmVzcyB2YWx1ZSlcbiAqIENvbG9yIHNob3VsZCBiZSBwYXNzZWQgdmlhIGJnIHByb3AgZnJvbSBwYXJlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGJhcnMgd2l0aCByZXNwb25zaXZlIGhlaWdodFxuICovXG5leHBvcnQgY29uc3QgQmFyV3JhcHBlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgZmxleDogMSxcbiAgICBoZWlnaHQ6IHsgXzogMTIsIHNtOiAyMCB9LFxuICAgIGJvcmRlclJhZGl1czogeyBfOiAnbWQnLCBzbTogJ3hsJyB9LFxuICB9KVxuKTtcbiJdfQ== */");
26
+
27
+ /**
28
+ * Foreground bar for stacked display (progress value)
29
+ * Color should be passed via bg prop from parent
30
+ */
31
+ export const ForegroundBar = /*#__PURE__*/_styled(motion.create(Box), {
32
+ target: "e1lnm2ux1",
33
+ label: "ForegroundBar"
34
+ })(css({
35
+ ...baseBarStyles
36
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9CYXIvZWxlbWVudHMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdDNkIiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L0Jhci9lbGVtZW50cy50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgbW90aW9uIH0gZnJvbSAnZnJhbWVyLW1vdGlvbic7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5cbmV4cG9ydCBjb25zdCBtaW5CYXJXaWR0aCA9IDg7XG5cbmNvbnN0IGJhc2VCYXJTdHlsZXMgPSB7XG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBib3JkZXI6IDEsXG4gIGJvcmRlckNvbG9yOiAnYm9yZGVyLXByaW1hcnknLFxuICBib3JkZXJSYWRpdXM6ICdpbmhlcml0JyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBoZWlnaHQ6ICcxMDAlJyxcbiAgbGVmdDogMCxcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEFuaW1hdGVkIGJhciBlbGVtZW50IGZvciBiYWNrZ3JvdW5kL3RvdGFsIHZhbHVlIGRpc3BsYXlcbiAqL1xuZXhwb3J0IGNvbnN0IEJhY2tncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBGb3JlZ3JvdW5kIGJhciBmb3Igc3RhY2tlZCBkaXNwbGF5IChwcm9ncmVzcyB2YWx1ZSlcbiAqIENvbG9yIHNob3VsZCBiZSBwYXNzZWQgdmlhIGJnIHByb3AgZnJvbSBwYXJlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGJhcnMgd2l0aCByZXNwb25zaXZlIGhlaWdodFxuICovXG5leHBvcnQgY29uc3QgQmFyV3JhcHBlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgZmxleDogMSxcbiAgICBoZWlnaHQ6IHsgXzogMTIsIHNtOiAyMCB9LFxuICAgIGJvcmRlclJhZGl1czogeyBfOiAnbWQnLCBzbTogJ3hsJyB9LFxuICB9KVxuKTtcbiJdfQ== */");
37
+
38
+ /**
39
+ * Container for bars with responsive height
40
+ */
41
+ export const BarWrapper = /*#__PURE__*/_styled(Box, {
42
+ target: "e1lnm2ux0",
43
+ label: "BarWrapper"
44
+ })(css({
45
+ display: 'flex',
46
+ overflow: 'hidden',
47
+ position: 'relative',
48
+ alignItems: 'center',
49
+ flex: 1,
50
+ height: {
51
+ _: 12,
52
+ sm: 20
53
+ },
54
+ borderRadius: {
55
+ _: 'md',
56
+ sm: 'xl'
57
+ }
58
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9CYXIvZWxlbWVudHMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlDMEIiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L0Jhci9lbGVtZW50cy50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgbW90aW9uIH0gZnJvbSAnZnJhbWVyLW1vdGlvbic7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5cbmV4cG9ydCBjb25zdCBtaW5CYXJXaWR0aCA9IDg7XG5cbmNvbnN0IGJhc2VCYXJTdHlsZXMgPSB7XG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBib3JkZXI6IDEsXG4gIGJvcmRlckNvbG9yOiAnYm9yZGVyLXByaW1hcnknLFxuICBib3JkZXJSYWRpdXM6ICdpbmhlcml0JyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBoZWlnaHQ6ICcxMDAlJyxcbiAgbGVmdDogMCxcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEFuaW1hdGVkIGJhciBlbGVtZW50IGZvciBiYWNrZ3JvdW5kL3RvdGFsIHZhbHVlIGRpc3BsYXlcbiAqL1xuZXhwb3J0IGNvbnN0IEJhY2tncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBGb3JlZ3JvdW5kIGJhciBmb3Igc3RhY2tlZCBkaXNwbGF5IChwcm9ncmVzcyB2YWx1ZSlcbiAqIENvbG9yIHNob3VsZCBiZSBwYXNzZWQgdmlhIGJnIHByb3AgZnJvbSBwYXJlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVncm91bmRCYXIgPSBzdHlsZWQobW90aW9uLmNyZWF0ZShCb3gpKShcbiAgY3NzKHtcbiAgICAuLi5iYXNlQmFyU3R5bGVzLFxuICB9KVxuKTtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGJhcnMgd2l0aCByZXNwb25zaXZlIGhlaWdodFxuICovXG5leHBvcnQgY29uc3QgQmFyV3JhcHBlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgZmxleDogMSxcbiAgICBoZWlnaHQ6IHsgXzogMTIsIHNtOiAyMCB9LFxuICAgIGJvcmRlclJhZGl1czogeyBfOiAnbWQnLCBzbTogJ3hsJyB9LFxuICB9KVxuKTtcbiJdfQ== */");
@@ -0,0 +1 @@
1
+ export * from './elements';
@@ -0,0 +1,2 @@
1
+ // Re-export bar elements
2
+ export * from './elements';
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { BarChartStyles } from './types';
3
+ export interface BarChartContextProps {
4
+ minRange: number;
5
+ maxRange: number;
6
+ xScale: number;
7
+ unit: string;
8
+ styleConfig: Required<BarChartStyles>;
9
+ animate: boolean;
10
+ }
11
+ export declare const BarChartContext: import("react").Context<BarChartContextProps>;
12
+ export declare const BarChartProvider: import("react").Provider<BarChartContextProps>;
@@ -0,0 +1,16 @@
1
+ import { createContext } from 'react';
2
+ const defaultStyleConfig = {
3
+ textColor: 'text',
4
+ foregroundBarColor: 'feedback-warning',
5
+ backgroundBarColor: 'background-primary'
6
+ };
7
+ export const BarChartContext = /*#__PURE__*/createContext({
8
+ minRange: 0,
9
+ maxRange: 100,
10
+ xScale: 10,
11
+ unit: '',
12
+ styleConfig: defaultStyleConfig,
13
+ animate: false
14
+ });
15
+ BarChartContext.displayName = 'BarChartContext';
16
+ export const BarChartProvider = BarChartContext.Provider;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { BarChartProps } from './types';
3
+ export declare const BarChart: React.FC<BarChartProps>;
4
+ export * from './types';
@@ -0,0 +1,73 @@
1
+ import { useMemo } from 'react';
2
+ import { Box } from '../Box';
3
+ import { Bar } from './Bar/Bar';
4
+ import { BarChartProvider } from './BarChartProvider';
5
+ import { GridLines } from './layout/GridLines';
6
+ import { ScaleChartHeader } from './layout/ScaleChartHeader';
7
+ import { sortBars, useBarChart } from './utils';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ export const BarChart = ({
10
+ 'aria-label': ariaLabel,
11
+ 'aria-labelledby': ariaLabelledBy,
12
+ animate = false,
13
+ barValues,
14
+ maxRange,
15
+ minRange,
16
+ order = 'ascending',
17
+ sortBy = 'none',
18
+ unit = '',
19
+ styleConfig,
20
+ xScale
21
+ }) => {
22
+ const contextValue = useBarChart({
23
+ minRange,
24
+ maxRange,
25
+ xScale,
26
+ unit,
27
+ styleConfig,
28
+ animate
29
+ });
30
+ const sortedBars = useMemo(() => sortBars({
31
+ bars: barValues,
32
+ sortBy,
33
+ order
34
+ }), [barValues, sortBy, order]);
35
+
36
+ // Calculate number of ticks for the scale header
37
+ const tickCount = Math.ceil((maxRange - minRange) / contextValue.xScale) + 1;
38
+ return /*#__PURE__*/_jsx(BarChartProvider, {
39
+ value: contextValue,
40
+ children: /*#__PURE__*/_jsxs(Box, {
41
+ position: "relative",
42
+ width: "100%",
43
+ children: [/*#__PURE__*/_jsx(ScaleChartHeader, {
44
+ labelCount: tickCount,
45
+ max: maxRange,
46
+ min: minRange
47
+ }), /*#__PURE__*/_jsxs(Box, {
48
+ position: "relative",
49
+ width: "100%",
50
+ children: [/*#__PURE__*/_jsx(GridLines, {
51
+ max: maxRange,
52
+ min: minRange,
53
+ tickCount: tickCount
54
+ }), /*#__PURE__*/_jsx(Box, {
55
+ "aria-label": ariaLabel,
56
+ "aria-labelledby": ariaLabelledBy,
57
+ as: "ul",
58
+ listStyle: "none",
59
+ m: 0,
60
+ p: 0,
61
+ children: sortedBars.map((bar, index) => {
62
+ const uniqueKey = `${bar.yLabel}-${bar.seriesOneValue}-${bar.seriesTwoValue ?? ''}`;
63
+ return /*#__PURE__*/_jsx(Bar, {
64
+ index: index,
65
+ ...bar
66
+ }, uniqueKey);
67
+ })
68
+ })]
69
+ })]
70
+ })
71
+ });
72
+ };
73
+ export * from './types';
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface GridLinesProps {
3
+ tickCount: number;
4
+ min: number;
5
+ max: number;
6
+ }
7
+ export declare const GridLines: React.FC<GridLinesProps>;
@@ -0,0 +1,77 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { css } from '@codecademy/gamut-styles';
3
+ import { Box } from '../../Box';
4
+ import { useLabelPositions } from '../utils';
5
+ import { VerticalSpacer } from './VerticalSpacer';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const GridLineWrapper = /*#__PURE__*/_styled(Box, {
8
+ target: "ejng4zk2",
9
+ label: "GridLineWrapper"
10
+ })(css({
11
+ position: 'absolute',
12
+ top: 0,
13
+ bottom: 0,
14
+ left: 0,
15
+ right: 0,
16
+ pointerEvents: 'none',
17
+ zIndex: 0
18
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvR3JpZExpbmVzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPd0IiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L2xheW91dC9HcmlkTGluZXMudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtc3R5bGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcblxuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vQm94JztcbmltcG9ydCB7IHVzZUxhYmVsUG9zaXRpb25zIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVydGljYWxTcGFjZXIgfSBmcm9tICcuL1ZlcnRpY2FsU3BhY2VyJztcblxuY29uc3QgR3JpZExpbmVXcmFwcGVyID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICB6SW5kZXg6IDAsXG4gIH0pXG4pO1xuXG5jb25zdCBHcmlkTGluZUNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGJvdHRvbTogMCxcbiAgICBkaXNwbGF5OiB7IF86ICdub25lJywgc206ICdibG9jaycgfSxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3JkZXJMZWZ0OiAxLFxuICAgIGJvcmRlclJpZ2h0OiAxLFxuICAgIGJvcmRlckNvbG9yOiAnYmFja2dyb3VuZC1kaXNhYmxlZCcsXG4gIH0pXG4pO1xuXG5jb25zdCBHcmlkTGluZSA9IHN0eWxlZChCb3gpPHsgcG9zaXRpb25QZXJjZW50OiBudW1iZXIgfT4oXG4gIGNzcyh7XG4gICAgYm9yZGVyTGVmdDogMSxcbiAgICBib3JkZXJDb2xvckxlZnQ6ICdiYWNrZ3JvdW5kLWRpc2FibGVkJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6IDAsXG4gICAgd2lkdGg6IDAsXG4gIH0pLFxuICAoeyBwb3NpdGlvblBlcmNlbnQgfSkgPT4gKHtcbiAgICBsZWZ0OiBgJHtwb3NpdGlvblBlcmNlbnR9JWAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gIH0pXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRMaW5lc1Byb3BzIHtcbiAgdGlja0NvdW50OiBudW1iZXI7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEdyaWRMaW5lczogUmVhY3QuRkM8R3JpZExpbmVzUHJvcHM+ID0gKHtcbiAgdGlja0NvdW50LFxuICBtaW4sXG4gIG1heCxcbn0pID0+IHtcbiAgY29uc3QgbGFiZWxQb3NpdGlvbnMgPSB1c2VMYWJlbFBvc2l0aW9ucyh7IG1pbiwgbWF4LCBjb3VudDogdGlja0NvdW50IH0pO1xuXG4gIGNvbnN0IGxpbmVzID0gbGFiZWxQb3NpdGlvbnMubWFwKCh7IHBvc2l0aW9uUGVyY2VudCwgdmFsdWUgfSkgPT4gKFxuICAgIDxHcmlkTGluZVxuICAgICAgYXJpYS1oaWRkZW5cbiAgICAgIGtleT17YGdyaWRsaW5lLSR7dmFsdWV9LSR7cG9zaXRpb25QZXJjZW50fWB9XG4gICAgICBwb3NpdGlvblBlcmNlbnQ9e3Bvc2l0aW9uUGVyY2VudH1cbiAgICAvPlxuICApKTtcblxuICByZXR1cm4gKFxuICAgIDxHcmlkTGluZVdyYXBwZXIgYXJpYS1oaWRkZW4+XG4gICAgICA8VmVydGljYWxTcGFjZXI+XG4gICAgICAgIDxHcmlkTGluZUNvbnRhaW5lcj57bGluZXN9PC9HcmlkTGluZUNvbnRhaW5lcj5cbiAgICAgIDwvVmVydGljYWxTcGFjZXI+XG4gICAgPC9HcmlkTGluZVdyYXBwZXI+XG4gICk7XG59O1xuIl19 */");
19
+ const GridLineContainer = /*#__PURE__*/_styled(Box, {
20
+ target: "ejng4zk1",
21
+ label: "GridLineContainer"
22
+ })(css({
23
+ bottom: 0,
24
+ display: {
25
+ _: 'none',
26
+ sm: 'block'
27
+ },
28
+ position: 'absolute',
29
+ top: 0,
30
+ left: 0,
31
+ right: 0,
32
+ borderLeft: 1,
33
+ borderRight: 1,
34
+ borderColor: 'background-disabled'
35
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvR3JpZExpbmVzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQjBCIiwiZmlsZSI6Ii4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvR3JpZExpbmVzLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNzcyB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5pbXBvcnQgeyB1c2VMYWJlbFBvc2l0aW9ucyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFZlcnRpY2FsU3BhY2VyIH0gZnJvbSAnLi9WZXJ0aWNhbFNwYWNlcic7XG5cbmNvbnN0IEdyaWRMaW5lV3JhcHBlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgekluZGV4OiAwLFxuICB9KVxuKTtcblxuY29uc3QgR3JpZExpbmVDb250YWluZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBib3R0b206IDAsXG4gICAgZGlzcGxheTogeyBfOiAnbm9uZScsIHNtOiAnYmxvY2snIH0sXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm9yZGVyTGVmdDogMSxcbiAgICBib3JkZXJSaWdodDogMSxcbiAgICBib3JkZXJDb2xvcjogJ2JhY2tncm91bmQtZGlzYWJsZWQnLFxuICB9KVxuKTtcblxuY29uc3QgR3JpZExpbmUgPSBzdHlsZWQoQm94KTx7IHBvc2l0aW9uUGVyY2VudDogbnVtYmVyIH0+KFxuICBjc3Moe1xuICAgIGJvcmRlckxlZnQ6IDEsXG4gICAgYm9yZGVyQ29sb3JMZWZ0OiAnYmFja2dyb3VuZC1kaXNhYmxlZCcsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIHdpZHRoOiAwLFxuICB9KSxcbiAgKHsgcG9zaXRpb25QZXJjZW50IH0pID0+ICh7XG4gICAgbGVmdDogYCR7cG9zaXRpb25QZXJjZW50fSVgLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICB9KVxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBHcmlkTGluZXNQcm9wcyB7XG4gIHRpY2tDb3VudDogbnVtYmVyO1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHcmlkTGluZXM6IFJlYWN0LkZDPEdyaWRMaW5lc1Byb3BzPiA9ICh7XG4gIHRpY2tDb3VudCxcbiAgbWluLFxuICBtYXgsXG59KSA9PiB7XG4gIGNvbnN0IGxhYmVsUG9zaXRpb25zID0gdXNlTGFiZWxQb3NpdGlvbnMoeyBtaW4sIG1heCwgY291bnQ6IHRpY2tDb3VudCB9KTtcblxuICBjb25zdCBsaW5lcyA9IGxhYmVsUG9zaXRpb25zLm1hcCgoeyBwb3NpdGlvblBlcmNlbnQsIHZhbHVlIH0pID0+IChcbiAgICA8R3JpZExpbmVcbiAgICAgIGFyaWEtaGlkZGVuXG4gICAgICBrZXk9e2BncmlkbGluZS0ke3ZhbHVlfS0ke3Bvc2l0aW9uUGVyY2VudH1gfVxuICAgICAgcG9zaXRpb25QZXJjZW50PXtwb3NpdGlvblBlcmNlbnR9XG4gICAgLz5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZExpbmVXcmFwcGVyIGFyaWEtaGlkZGVuPlxuICAgICAgPFZlcnRpY2FsU3BhY2VyPlxuICAgICAgICA8R3JpZExpbmVDb250YWluZXI+e2xpbmVzfTwvR3JpZExpbmVDb250YWluZXI+XG4gICAgICA8L1ZlcnRpY2FsU3BhY2VyPlxuICAgIDwvR3JpZExpbmVXcmFwcGVyPlxuICApO1xufTtcbiJdfQ== */");
36
+ const GridLine = /*#__PURE__*/_styled(Box, {
37
+ target: "ejng4zk0",
38
+ label: "GridLine"
39
+ })(css({
40
+ borderLeft: 1,
41
+ borderColorLeft: 'background-disabled',
42
+ height: '100%',
43
+ position: 'absolute',
44
+ top: 0,
45
+ width: 0
46
+ }), ({
47
+ positionPercent
48
+ }) => ({
49
+ left: `${positionPercent}%`,
50
+ transform: 'translateX(-50%)'
51
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvR3JpZExpbmVzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQ2lCIiwiZmlsZSI6Ii4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvR3JpZExpbmVzLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNzcyB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5pbXBvcnQgeyB1c2VMYWJlbFBvc2l0aW9ucyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFZlcnRpY2FsU3BhY2VyIH0gZnJvbSAnLi9WZXJ0aWNhbFNwYWNlcic7XG5cbmNvbnN0IEdyaWRMaW5lV3JhcHBlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgekluZGV4OiAwLFxuICB9KVxuKTtcblxuY29uc3QgR3JpZExpbmVDb250YWluZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBib3R0b206IDAsXG4gICAgZGlzcGxheTogeyBfOiAnbm9uZScsIHNtOiAnYmxvY2snIH0sXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm9yZGVyTGVmdDogMSxcbiAgICBib3JkZXJSaWdodDogMSxcbiAgICBib3JkZXJDb2xvcjogJ2JhY2tncm91bmQtZGlzYWJsZWQnLFxuICB9KVxuKTtcblxuY29uc3QgR3JpZExpbmUgPSBzdHlsZWQoQm94KTx7IHBvc2l0aW9uUGVyY2VudDogbnVtYmVyIH0+KFxuICBjc3Moe1xuICAgIGJvcmRlckxlZnQ6IDEsXG4gICAgYm9yZGVyQ29sb3JMZWZ0OiAnYmFja2dyb3VuZC1kaXNhYmxlZCcsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIHdpZHRoOiAwLFxuICB9KSxcbiAgKHsgcG9zaXRpb25QZXJjZW50IH0pID0+ICh7XG4gICAgbGVmdDogYCR7cG9zaXRpb25QZXJjZW50fSVgLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICB9KVxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBHcmlkTGluZXNQcm9wcyB7XG4gIHRpY2tDb3VudDogbnVtYmVyO1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHcmlkTGluZXM6IFJlYWN0LkZDPEdyaWRMaW5lc1Byb3BzPiA9ICh7XG4gIHRpY2tDb3VudCxcbiAgbWluLFxuICBtYXgsXG59KSA9PiB7XG4gIGNvbnN0IGxhYmVsUG9zaXRpb25zID0gdXNlTGFiZWxQb3NpdGlvbnMoeyBtaW4sIG1heCwgY291bnQ6IHRpY2tDb3VudCB9KTtcblxuICBjb25zdCBsaW5lcyA9IGxhYmVsUG9zaXRpb25zLm1hcCgoeyBwb3NpdGlvblBlcmNlbnQsIHZhbHVlIH0pID0+IChcbiAgICA8R3JpZExpbmVcbiAgICAgIGFyaWEtaGlkZGVuXG4gICAgICBrZXk9e2BncmlkbGluZS0ke3ZhbHVlfS0ke3Bvc2l0aW9uUGVyY2VudH1gfVxuICAgICAgcG9zaXRpb25QZXJjZW50PXtwb3NpdGlvblBlcmNlbnR9XG4gICAgLz5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZExpbmVXcmFwcGVyIGFyaWEtaGlkZGVuPlxuICAgICAgPFZlcnRpY2FsU3BhY2VyPlxuICAgICAgICA8R3JpZExpbmVDb250YWluZXI+e2xpbmVzfTwvR3JpZExpbmVDb250YWluZXI+XG4gICAgICA8L1ZlcnRpY2FsU3BhY2VyPlxuICAgIDwvR3JpZExpbmVXcmFwcGVyPlxuICApO1xufTtcbiJdfQ== */");
52
+ export const GridLines = ({
53
+ tickCount,
54
+ min,
55
+ max
56
+ }) => {
57
+ const labelPositions = useLabelPositions({
58
+ min,
59
+ max,
60
+ count: tickCount
61
+ });
62
+ const lines = labelPositions.map(({
63
+ positionPercent,
64
+ value
65
+ }) => /*#__PURE__*/_jsx(GridLine, {
66
+ "aria-hidden": true,
67
+ positionPercent: positionPercent
68
+ }, `gridline-${value}-${positionPercent}`));
69
+ return /*#__PURE__*/_jsx(GridLineWrapper, {
70
+ "aria-hidden": true,
71
+ children: /*#__PURE__*/_jsx(VerticalSpacer, {
72
+ children: /*#__PURE__*/_jsx(GridLineContainer, {
73
+ children: lines
74
+ })
75
+ })
76
+ });
77
+ };
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ export interface ScaleChartHeaderProps {
3
+ /** Minimum value on the scale */
4
+ min: number;
5
+ /** Maximum value on the scale */
6
+ max: number;
7
+ /** Number of labels to display */
8
+ labelCount: number;
9
+ }
10
+ export declare const ScaleChartHeader: React.FC<ScaleChartHeaderProps>;
@@ -0,0 +1,88 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { css } from '@codecademy/gamut-styles';
3
+ import { Box } from '../../Box';
4
+ import { Text } from '../../Typography';
5
+ import { formatNumberUSCompact, useBarChartContext, useLabelPositions } from '../utils';
6
+ import { VerticalSpacer } from './VerticalSpacer';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ const StyledLabelText = /*#__PURE__*/_styled(Text, {
9
+ target: "e1ssd1i12",
10
+ label: "StyledLabelText"
11
+ })(css({
12
+ position: 'absolute',
13
+ whiteSpace: 'nowrap',
14
+ margin: 0,
15
+ padding: 0
16
+ }), ({
17
+ positionPercent,
18
+ textAlign
19
+ }) => {
20
+ let transform = '';
21
+ if (textAlign === 'left') {
22
+ transform = 'translateX(0)';
23
+ } else if (textAlign === 'right') {
24
+ transform = 'translateX(-100%)';
25
+ } else {
26
+ transform = 'translateX(-50%)';
27
+ }
28
+ return {
29
+ left: `${positionPercent}%`,
30
+ transform
31
+ };
32
+ }, process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvU2NhbGVDaGFydEhlYWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJ3QiIsImZpbGUiOiIuLi8uLi8uLi9zcmMvQmFyQ2hhcnQvbGF5b3V0L1NjYWxlQ2hhcnRIZWFkZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtc3R5bGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcblxuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vQm94JztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9UeXBvZ3JhcGh5JztcbmltcG9ydCB7XG4gIGZvcm1hdE51bWJlclVTQ29tcGFjdCxcbiAgdXNlQmFyQ2hhcnRDb250ZXh0LFxuICB1c2VMYWJlbFBvc2l0aW9ucyxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVydGljYWxTcGFjZXIgfSBmcm9tICcuL1ZlcnRpY2FsU3BhY2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2FsZUNoYXJ0SGVhZGVyUHJvcHMge1xuICAvKiogTWluaW11bSB2YWx1ZSBvbiB0aGUgc2NhbGUgKi9cbiAgbWluOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHZhbHVlIG9uIHRoZSBzY2FsZSAqL1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBsYWJlbHMgdG8gZGlzcGxheSAqL1xuICBsYWJlbENvdW50OiBudW1iZXI7XG59XG5cbmNvbnN0IFN0eWxlZExhYmVsVGV4dCA9IHN0eWxlZChUZXh0KTx7XG4gIHBvc2l0aW9uUGVyY2VudDogbnVtYmVyO1xuICB0ZXh0QWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jztcbn0+KFxuICBjc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICB9KSxcbiAgKHsgcG9zaXRpb25QZXJjZW50LCB0ZXh0QWxpZ24gfSkgPT4ge1xuICAgIGxldCB0cmFuc2Zvcm0gPSAnJztcbiAgICBpZiAodGV4dEFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcbiAgICB9IGVsc2UgaWYgKHRleHRBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTEwMCUpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogYCR7cG9zaXRpb25QZXJjZW50fSVgLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH07XG4gIH1cbik7XG5cbmNvbnN0IFN0eWxlZEhlYWRlckNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB9KVxuKTtcblxuY29uc3QgSGVhZGVyTGFiZWxBcmVhID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgbWluSGVpZ2h0OiAnMjRweCcsXG4gIH0pXG4pO1xuXG5leHBvcnQgY29uc3QgU2NhbGVDaGFydEhlYWRlcjogUmVhY3QuRkM8U2NhbGVDaGFydEhlYWRlclByb3BzPiA9ICh7XG4gIGxhYmVsQ291bnQsXG4gIG1pbixcbiAgbWF4LFxufSkgPT4ge1xuICBjb25zdCB7IHN0eWxlQ29uZmlnIH0gPSB1c2VCYXJDaGFydENvbnRleHQoKTtcbiAgY29uc3QgbGFiZWxQb3NpdGlvbnMgPSB1c2VMYWJlbFBvc2l0aW9ucyh7IG1pbiwgbWF4LCBjb3VudDogbGFiZWxDb3VudCB9KTtcblxuICBjb25zdCBzY2FsZUxhYmVscyA9IGxhYmVsUG9zaXRpb25zLm1hcCgoeyB2YWx1ZSwgcG9zaXRpb25QZXJjZW50IH0pID0+IChcbiAgICA8U3R5bGVkTGFiZWxUZXh0XG4gICAgICBkYXRhLXRlc3RpZD1cImNoYXJ0LWhlYWRlci1sYWJlbFwiXG4gICAgICBrZXk9e2BsYWJlbC0ke3ZhbHVlfS0ke3Bvc2l0aW9uUGVyY2VudH1gfVxuICAgICAgcG9zaXRpb25QZXJjZW50PXtwb3NpdGlvblBlcmNlbnR9XG4gICAgICB0ZXh0QWxpZ249XCJjZW50ZXJcIlxuICAgICAgdGV4dENvbG9yPXtzdHlsZUNvbmZpZy50ZXh0Q29sb3J9XG4gICAgICB2YXJpYW50PVwicC1zbWFsbFwiXG4gICAgPlxuICAgICAge2Zvcm1hdE51bWJlclVTQ29tcGFjdCh7XG4gICAgICAgIG51bTogdmFsdWUsXG4gICAgICB9KX1cbiAgICA8L1N0eWxlZExhYmVsVGV4dD5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IG1iPXsxMn0gd2lkdGg9ezF9PlxuICAgICAgPFN0eWxlZEhlYWRlckNvbnRhaW5lclxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICBkaXNwbGF5PXt7IF86ICdub25lJywgc206ICdibG9jaycgfX1cbiAgICAgID5cbiAgICAgICAgPFZlcnRpY2FsU3BhY2VyPlxuICAgICAgICAgIDxIZWFkZXJMYWJlbEFyZWE+e3NjYWxlTGFiZWxzfTwvSGVhZGVyTGFiZWxBcmVhPlxuICAgICAgICA8L1ZlcnRpY2FsU3BhY2VyPlxuICAgICAgPC9TdHlsZWRIZWFkZXJDb250YWluZXI+XG4gICAgPC9Cb3g+XG4gICk7XG59O1xuXG4iXX0= */");
33
+ const StyledHeaderContainer = /*#__PURE__*/_styled(Box, {
34
+ target: "e1ssd1i11",
35
+ label: "StyledHeaderContainer"
36
+ })(css({
37
+ alignItems: 'center',
38
+ position: 'relative'
39
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvU2NhbGVDaGFydEhlYWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0M4QiIsImZpbGUiOiIuLi8uLi8uLi9zcmMvQmFyQ2hhcnQvbGF5b3V0L1NjYWxlQ2hhcnRIZWFkZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtc3R5bGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcblxuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vQm94JztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9UeXBvZ3JhcGh5JztcbmltcG9ydCB7XG4gIGZvcm1hdE51bWJlclVTQ29tcGFjdCxcbiAgdXNlQmFyQ2hhcnRDb250ZXh0LFxuICB1c2VMYWJlbFBvc2l0aW9ucyxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVydGljYWxTcGFjZXIgfSBmcm9tICcuL1ZlcnRpY2FsU3BhY2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2FsZUNoYXJ0SGVhZGVyUHJvcHMge1xuICAvKiogTWluaW11bSB2YWx1ZSBvbiB0aGUgc2NhbGUgKi9cbiAgbWluOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHZhbHVlIG9uIHRoZSBzY2FsZSAqL1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBsYWJlbHMgdG8gZGlzcGxheSAqL1xuICBsYWJlbENvdW50OiBudW1iZXI7XG59XG5cbmNvbnN0IFN0eWxlZExhYmVsVGV4dCA9IHN0eWxlZChUZXh0KTx7XG4gIHBvc2l0aW9uUGVyY2VudDogbnVtYmVyO1xuICB0ZXh0QWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jztcbn0+KFxuICBjc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICB9KSxcbiAgKHsgcG9zaXRpb25QZXJjZW50LCB0ZXh0QWxpZ24gfSkgPT4ge1xuICAgIGxldCB0cmFuc2Zvcm0gPSAnJztcbiAgICBpZiAodGV4dEFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcbiAgICB9IGVsc2UgaWYgKHRleHRBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTEwMCUpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogYCR7cG9zaXRpb25QZXJjZW50fSVgLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH07XG4gIH1cbik7XG5cbmNvbnN0IFN0eWxlZEhlYWRlckNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB9KVxuKTtcblxuY29uc3QgSGVhZGVyTGFiZWxBcmVhID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgbWluSGVpZ2h0OiAnMjRweCcsXG4gIH0pXG4pO1xuXG5leHBvcnQgY29uc3QgU2NhbGVDaGFydEhlYWRlcjogUmVhY3QuRkM8U2NhbGVDaGFydEhlYWRlclByb3BzPiA9ICh7XG4gIGxhYmVsQ291bnQsXG4gIG1pbixcbiAgbWF4LFxufSkgPT4ge1xuICBjb25zdCB7IHN0eWxlQ29uZmlnIH0gPSB1c2VCYXJDaGFydENvbnRleHQoKTtcbiAgY29uc3QgbGFiZWxQb3NpdGlvbnMgPSB1c2VMYWJlbFBvc2l0aW9ucyh7IG1pbiwgbWF4LCBjb3VudDogbGFiZWxDb3VudCB9KTtcblxuICBjb25zdCBzY2FsZUxhYmVscyA9IGxhYmVsUG9zaXRpb25zLm1hcCgoeyB2YWx1ZSwgcG9zaXRpb25QZXJjZW50IH0pID0+IChcbiAgICA8U3R5bGVkTGFiZWxUZXh0XG4gICAgICBkYXRhLXRlc3RpZD1cImNoYXJ0LWhlYWRlci1sYWJlbFwiXG4gICAgICBrZXk9e2BsYWJlbC0ke3ZhbHVlfS0ke3Bvc2l0aW9uUGVyY2VudH1gfVxuICAgICAgcG9zaXRpb25QZXJjZW50PXtwb3NpdGlvblBlcmNlbnR9XG4gICAgICB0ZXh0QWxpZ249XCJjZW50ZXJcIlxuICAgICAgdGV4dENvbG9yPXtzdHlsZUNvbmZpZy50ZXh0Q29sb3J9XG4gICAgICB2YXJpYW50PVwicC1zbWFsbFwiXG4gICAgPlxuICAgICAge2Zvcm1hdE51bWJlclVTQ29tcGFjdCh7XG4gICAgICAgIG51bTogdmFsdWUsXG4gICAgICB9KX1cbiAgICA8L1N0eWxlZExhYmVsVGV4dD5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IG1iPXsxMn0gd2lkdGg9ezF9PlxuICAgICAgPFN0eWxlZEhlYWRlckNvbnRhaW5lclxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICBkaXNwbGF5PXt7IF86ICdub25lJywgc206ICdibG9jaycgfX1cbiAgICAgID5cbiAgICAgICAgPFZlcnRpY2FsU3BhY2VyPlxuICAgICAgICAgIDxIZWFkZXJMYWJlbEFyZWE+e3NjYWxlTGFiZWxzfTwvSGVhZGVyTGFiZWxBcmVhPlxuICAgICAgICA8L1ZlcnRpY2FsU3BhY2VyPlxuICAgICAgPC9TdHlsZWRIZWFkZXJDb250YWluZXI+XG4gICAgPC9Cb3g+XG4gICk7XG59O1xuXG4iXX0= */");
40
+ const HeaderLabelArea = /*#__PURE__*/_styled(Box, {
41
+ target: "e1ssd1i10",
42
+ label: "HeaderLabelArea"
43
+ })(css({
44
+ minHeight: '24px'
45
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvU2NhbGVDaGFydEhlYWRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0R3QiIsImZpbGUiOiIuLi8uLi8uLi9zcmMvQmFyQ2hhcnQvbGF5b3V0L1NjYWxlQ2hhcnRIZWFkZXIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtc3R5bGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcblxuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vLi4vQm94JztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi9UeXBvZ3JhcGh5JztcbmltcG9ydCB7XG4gIGZvcm1hdE51bWJlclVTQ29tcGFjdCxcbiAgdXNlQmFyQ2hhcnRDb250ZXh0LFxuICB1c2VMYWJlbFBvc2l0aW9ucyxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVydGljYWxTcGFjZXIgfSBmcm9tICcuL1ZlcnRpY2FsU3BhY2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2FsZUNoYXJ0SGVhZGVyUHJvcHMge1xuICAvKiogTWluaW11bSB2YWx1ZSBvbiB0aGUgc2NhbGUgKi9cbiAgbWluOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHZhbHVlIG9uIHRoZSBzY2FsZSAqL1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBsYWJlbHMgdG8gZGlzcGxheSAqL1xuICBsYWJlbENvdW50OiBudW1iZXI7XG59XG5cbmNvbnN0IFN0eWxlZExhYmVsVGV4dCA9IHN0eWxlZChUZXh0KTx7XG4gIHBvc2l0aW9uUGVyY2VudDogbnVtYmVyO1xuICB0ZXh0QWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jztcbn0+KFxuICBjc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICB9KSxcbiAgKHsgcG9zaXRpb25QZXJjZW50LCB0ZXh0QWxpZ24gfSkgPT4ge1xuICAgIGxldCB0cmFuc2Zvcm0gPSAnJztcbiAgICBpZiAodGV4dEFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcbiAgICB9IGVsc2UgaWYgKHRleHRBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTEwMCUpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogYCR7cG9zaXRpb25QZXJjZW50fSVgLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH07XG4gIH1cbik7XG5cbmNvbnN0IFN0eWxlZEhlYWRlckNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB9KVxuKTtcblxuY29uc3QgSGVhZGVyTGFiZWxBcmVhID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgbWluSGVpZ2h0OiAnMjRweCcsXG4gIH0pXG4pO1xuXG5leHBvcnQgY29uc3QgU2NhbGVDaGFydEhlYWRlcjogUmVhY3QuRkM8U2NhbGVDaGFydEhlYWRlclByb3BzPiA9ICh7XG4gIGxhYmVsQ291bnQsXG4gIG1pbixcbiAgbWF4LFxufSkgPT4ge1xuICBjb25zdCB7IHN0eWxlQ29uZmlnIH0gPSB1c2VCYXJDaGFydENvbnRleHQoKTtcbiAgY29uc3QgbGFiZWxQb3NpdGlvbnMgPSB1c2VMYWJlbFBvc2l0aW9ucyh7IG1pbiwgbWF4LCBjb3VudDogbGFiZWxDb3VudCB9KTtcblxuICBjb25zdCBzY2FsZUxhYmVscyA9IGxhYmVsUG9zaXRpb25zLm1hcCgoeyB2YWx1ZSwgcG9zaXRpb25QZXJjZW50IH0pID0+IChcbiAgICA8U3R5bGVkTGFiZWxUZXh0XG4gICAgICBkYXRhLXRlc3RpZD1cImNoYXJ0LWhlYWRlci1sYWJlbFwiXG4gICAgICBrZXk9e2BsYWJlbC0ke3ZhbHVlfS0ke3Bvc2l0aW9uUGVyY2VudH1gfVxuICAgICAgcG9zaXRpb25QZXJjZW50PXtwb3NpdGlvblBlcmNlbnR9XG4gICAgICB0ZXh0QWxpZ249XCJjZW50ZXJcIlxuICAgICAgdGV4dENvbG9yPXtzdHlsZUNvbmZpZy50ZXh0Q29sb3J9XG4gICAgICB2YXJpYW50PVwicC1zbWFsbFwiXG4gICAgPlxuICAgICAge2Zvcm1hdE51bWJlclVTQ29tcGFjdCh7XG4gICAgICAgIG51bTogdmFsdWUsXG4gICAgICB9KX1cbiAgICA8L1N0eWxlZExhYmVsVGV4dD5cbiAgKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IG1iPXsxMn0gd2lkdGg9ezF9PlxuICAgICAgPFN0eWxlZEhlYWRlckNvbnRhaW5lclxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICBkaXNwbGF5PXt7IF86ICdub25lJywgc206ICdibG9jaycgfX1cbiAgICAgID5cbiAgICAgICAgPFZlcnRpY2FsU3BhY2VyPlxuICAgICAgICAgIDxIZWFkZXJMYWJlbEFyZWE+e3NjYWxlTGFiZWxzfTwvSGVhZGVyTGFiZWxBcmVhPlxuICAgICAgICA8L1ZlcnRpY2FsU3BhY2VyPlxuICAgICAgPC9TdHlsZWRIZWFkZXJDb250YWluZXI+XG4gICAgPC9Cb3g+XG4gICk7XG59O1xuXG4iXX0= */");
46
+ export const ScaleChartHeader = ({
47
+ labelCount,
48
+ min,
49
+ max
50
+ }) => {
51
+ const {
52
+ styleConfig
53
+ } = useBarChartContext();
54
+ const labelPositions = useLabelPositions({
55
+ min,
56
+ max,
57
+ count: labelCount
58
+ });
59
+ const scaleLabels = labelPositions.map(({
60
+ value,
61
+ positionPercent
62
+ }) => /*#__PURE__*/_jsx(StyledLabelText, {
63
+ "data-testid": "chart-header-label",
64
+ positionPercent: positionPercent,
65
+ textAlign: "center",
66
+ textColor: styleConfig.textColor,
67
+ variant: "p-small",
68
+ children: formatNumberUSCompact({
69
+ num: value
70
+ })
71
+ }, `label-${value}-${positionPercent}`));
72
+ return /*#__PURE__*/_jsx(Box, {
73
+ mb: 12,
74
+ width: 1,
75
+ children: /*#__PURE__*/_jsx(StyledHeaderContainer, {
76
+ "aria-hidden": "true",
77
+ display: {
78
+ _: 'none',
79
+ sm: 'block'
80
+ },
81
+ children: /*#__PURE__*/_jsx(VerticalSpacer, {
82
+ children: /*#__PURE__*/_jsx(HeaderLabelArea, {
83
+ children: scaleLabels
84
+ })
85
+ })
86
+ })
87
+ });
88
+ };
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export interface VerticalSpacerProps {
3
+ children: ReactNode;
4
+ className?: string;
5
+ }
6
+ export declare const VerticalSpacer: React.FC<VerticalSpacerProps>;
@@ -0,0 +1,47 @@
1
+ import _styled from "@emotion/styled/base";
2
+ import { css } from '@codecademy/gamut-styles';
3
+ import { Box } from '../../Box';
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ const SpacerContainer = /*#__PURE__*/_styled(Box, {
6
+ target: "e1u3mkni3",
7
+ label: "SpacerContainer"
8
+ })(css({
9
+ display: 'flex',
10
+ width: '100%',
11
+ height: '100%',
12
+ gap: 0
13
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvVmVydGljYWxTcGFjZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU13QiIsImZpbGUiOiIuLi8uLi8uLi9zcmMvQmFyQ2hhcnQvbGF5b3V0L1ZlcnRpY2FsU3BhY2VyLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNzcyB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5cbmNvbnN0IFNwYWNlckNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIGdhcDogMCxcbiAgfSlcbik7XG5cbmNvbnN0IExlZnRTcGFjZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBmbGV4U2hyaW5rOiAwLFxuICAgIG1pbldpZHRoOiAnMjAwcHgnLFxuICAgIHBsOiAxNixcbiAgfSlcbik7XG5cbmNvbnN0IENvbnRlbnRBcmVhID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleDogMSxcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgfSlcbik7XG5cbmNvbnN0IFJpZ2h0U3BhY2VyID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleFNocmluazogMCxcbiAgICB3aWR0aDogJzE2MHB4JyxcbiAgfSlcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVydGljYWxTcGFjZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFZlcnRpY2FsU3BhY2VyOiBSZWFjdC5GQzxWZXJ0aWNhbFNwYWNlclByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFNwYWNlckNvbnRhaW5lciBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICA8TGVmdFNwYWNlciAvPlxuICAgICAgPENvbnRlbnRBcmVhPntjaGlsZHJlbn08L0NvbnRlbnRBcmVhPlxuICAgICAgPFJpZ2h0U3BhY2VyIC8+XG4gICAgPC9TcGFjZXJDb250YWluZXI+XG4gICk7XG59O1xuXG4iXX0= */");
14
+ const LeftSpacer = /*#__PURE__*/_styled(Box, {
15
+ target: "e1u3mkni2",
16
+ label: "LeftSpacer"
17
+ })(css({
18
+ flexShrink: 0,
19
+ minWidth: '200px',
20
+ pl: 16
21
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvVmVydGljYWxTcGFjZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVtQiIsImZpbGUiOiIuLi8uLi8uLi9zcmMvQmFyQ2hhcnQvbGF5b3V0L1ZlcnRpY2FsU3BhY2VyLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNzcyB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL0JveCc7XG5cbmNvbnN0IFNwYWNlckNvbnRhaW5lciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIGdhcDogMCxcbiAgfSlcbik7XG5cbmNvbnN0IExlZnRTcGFjZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBmbGV4U2hyaW5rOiAwLFxuICAgIG1pbldpZHRoOiAnMjAwcHgnLFxuICAgIHBsOiAxNixcbiAgfSlcbik7XG5cbmNvbnN0IENvbnRlbnRBcmVhID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleDogMSxcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgfSlcbik7XG5cbmNvbnN0IFJpZ2h0U3BhY2VyID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleFNocmluazogMCxcbiAgICB3aWR0aDogJzE2MHB4JyxcbiAgfSlcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVydGljYWxTcGFjZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFZlcnRpY2FsU3BhY2VyOiBSZWFjdC5GQzxWZXJ0aWNhbFNwYWNlclByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFNwYWNlckNvbnRhaW5lciBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICA8TGVmdFNwYWNlciAvPlxuICAgICAgPENvbnRlbnRBcmVhPntjaGlsZHJlbn08L0NvbnRlbnRBcmVhPlxuICAgICAgPFJpZ2h0U3BhY2VyIC8+XG4gICAgPC9TcGFjZXJDb250YWluZXI+XG4gICk7XG59O1xuXG4iXX0= */");
22
+ const ContentArea = /*#__PURE__*/_styled(Box, {
23
+ target: "e1u3mkni1",
24
+ label: "ContentArea"
25
+ })(css({
26
+ flex: 1,
27
+ position: 'relative',
28
+ height: '100%'
29
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvVmVydGljYWxTcGFjZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCb0IiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L2xheW91dC9WZXJ0aWNhbFNwYWNlci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi8uLi9Cb3gnO1xuXG5jb25zdCBTcGFjZXJDb250YWluZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICBnYXA6IDAsXG4gIH0pXG4pO1xuXG5jb25zdCBMZWZ0U3BhY2VyID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleFNocmluazogMCxcbiAgICBtaW5XaWR0aDogJzIwMHB4JyxcbiAgICBwbDogMTYsXG4gIH0pXG4pO1xuXG5jb25zdCBDb250ZW50QXJlYSA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGZsZXg6IDEsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gIH0pXG4pO1xuXG5jb25zdCBSaWdodFNwYWNlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGZsZXhTaHJpbms6IDAsXG4gICAgd2lkdGg6ICcxNjBweCcsXG4gIH0pXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnRpY2FsU3BhY2VyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBWZXJ0aWNhbFNwYWNlcjogUmVhY3QuRkM8VmVydGljYWxTcGFjZXJQcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxTcGFjZXJDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgPExlZnRTcGFjZXIgLz5cbiAgICAgIDxDb250ZW50QXJlYT57Y2hpbGRyZW59PC9Db250ZW50QXJlYT5cbiAgICAgIDxSaWdodFNwYWNlciAvPlxuICAgIDwvU3BhY2VyQ29udGFpbmVyPlxuICApO1xufTtcblxuIl19 */");
30
+ const RightSpacer = /*#__PURE__*/_styled(Box, {
31
+ target: "e1u3mkni0",
32
+ label: "RightSpacer"
33
+ })(css({
34
+ flexShrink: 0,
35
+ width: '160px'
36
+ }), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9CYXJDaGFydC9sYXlvdXQvVmVydGljYWxTcGFjZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStCb0IiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL0JhckNoYXJ0L2xheW91dC9WZXJ0aWNhbFNwYWNlci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi8uLi9Cb3gnO1xuXG5jb25zdCBTcGFjZXJDb250YWluZXIgPSBzdHlsZWQoQm94KShcbiAgY3NzKHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICBnYXA6IDAsXG4gIH0pXG4pO1xuXG5jb25zdCBMZWZ0U3BhY2VyID0gc3R5bGVkKEJveCkoXG4gIGNzcyh7XG4gICAgZmxleFNocmluazogMCxcbiAgICBtaW5XaWR0aDogJzIwMHB4JyxcbiAgICBwbDogMTYsXG4gIH0pXG4pO1xuXG5jb25zdCBDb250ZW50QXJlYSA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGZsZXg6IDEsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gIH0pXG4pO1xuXG5jb25zdCBSaWdodFNwYWNlciA9IHN0eWxlZChCb3gpKFxuICBjc3Moe1xuICAgIGZsZXhTaHJpbms6IDAsXG4gICAgd2lkdGg6ICcxNjBweCcsXG4gIH0pXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnRpY2FsU3BhY2VyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBWZXJ0aWNhbFNwYWNlcjogUmVhY3QuRkM8VmVydGljYWxTcGFjZXJQcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxTcGFjZXJDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgPExlZnRTcGFjZXIgLz5cbiAgICAgIDxDb250ZW50QXJlYT57Y2hpbGRyZW59PC9Db250ZW50QXJlYT5cbiAgICAgIDxSaWdodFNwYWNlciAvPlxuICAgIDwvU3BhY2VyQ29udGFpbmVyPlxuICApO1xufTtcblxuIl19 */");
37
+ export const VerticalSpacer = ({
38
+ children,
39
+ className
40
+ }) => {
41
+ return /*#__PURE__*/_jsxs(SpacerContainer, {
42
+ className: className,
43
+ children: [/*#__PURE__*/_jsx(LeftSpacer, {}), /*#__PURE__*/_jsx(ContentArea, {
44
+ children: children
45
+ }), /*#__PURE__*/_jsx(RightSpacer, {})]
46
+ });
47
+ };
@@ -0,0 +1,56 @@
1
+ import { ColorAlias } from '@codecademy/gamut-styles';
2
+ import { GamutIconProps } from '@codecademy/gamut-icons';
3
+ import { HTMLProps } from 'react';
4
+ import { ButtonProps } from '../Button';
5
+ type BarChartAriaLabel = {
6
+ 'aria-label': string;
7
+ 'aria-labelledby'?: never;
8
+ };
9
+ type BarChartAriaLabelledBy = {
10
+ 'aria-label'?: never;
11
+ 'aria-labelledby': string;
12
+ };
13
+ type BarChartLabel = BarChartAriaLabel | BarChartAriaLabelledBy;
14
+ export type BarChartStyles = {
15
+ /** Color for text labels. Defaults to 'text' */
16
+ textColor?: ColorAlias;
17
+ /** Color for the foreground/progress bar. Defaults to 'feedback-warning' */
18
+ foregroundBarColor?: ColorAlias;
19
+ /** Color for the background/total bar. Defaults to 'paleBlue' */
20
+ backgroundBarColor?: ColorAlias;
21
+ };
22
+ export type BarProps = {
23
+ /** Label displayed on the y-axis for this bar */
24
+ yLabel: string;
25
+ /** The foreground/progress bar value (always shown) */
26
+ seriesOneValue: number;
27
+ /** The background/total bar value (optional - creates stacked effect when provided) */
28
+ seriesTwoValue?: number;
29
+ /** Optional icon to display next to the label */
30
+ icon?: React.ComponentType<GamutIconProps>;
31
+ /** Click handler - makes row interactive as a button */
32
+ onClick?: ButtonProps['onClick'];
33
+ /** Link href - makes row interactive as an anchor */
34
+ href?: HTMLProps<HTMLAnchorElement>['href'];
35
+ };
36
+ export type BarChartProps = BarChartLabel & {
37
+ /** Whether to animate bars on mount */
38
+ animate?: boolean;
39
+ /** Array of bar data to render */
40
+ barValues: BarProps[];
41
+ /** Maximum value for the x-axis scale */
42
+ maxRange: number;
43
+ /** Minimum value for the x-axis scale (usually 0) */
44
+ minRange: number;
45
+ /** Sort order for bars */
46
+ order?: 'ascending' | 'descending';
47
+ /** Property to sort bars by */
48
+ sortBy?: 'label' | 'value' | 'none';
49
+ /** Unit label to display (e.g., "XP") */
50
+ unit?: string;
51
+ /** Style configuration for colors */
52
+ styleConfig?: BarChartStyles;
53
+ /** Interval for x-axis scale markers */
54
+ xScale?: number;
55
+ };
56
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ import { BarChartContextProps } from '../BarChartProvider';
2
+ import { BarChartStyles } from '../types';
3
+ export interface LabelPosition {
4
+ value: number;
5
+ positionPercent: number;
6
+ }
7
+ /**
8
+ * Hook that calculates label positions for a given range and count
9
+ * Returns an array of { value, positionPercent } objects
10
+ */
11
+ export declare const useLabelPositions: ({ min, max, count, }: {
12
+ min: number;
13
+ max: number;
14
+ count: number;
15
+ }) => LabelPosition[];
16
+ export declare function useBarChartContext(): BarChartContextProps;
17
+ export interface UseBarChartOptions {
18
+ minRange: number;
19
+ maxRange: number;
20
+ xScale?: number;
21
+ unit?: string;
22
+ styleConfig?: BarChartStyles;
23
+ animate?: boolean;
24
+ }
25
+ export declare function useBarChart({ minRange, maxRange, xScale, unit, styleConfig, animate, }: UseBarChartOptions): {
26
+ minRange: number;
27
+ maxRange: number;
28
+ xScale: number;
29
+ unit: string;
30
+ styleConfig: {
31
+ textColor: "text" | "background" | "primary" | "secondary" | "danger" | "interface" | "text-secondary" | "text-accent" | "text-disabled" | "feedback-error" | "feedback-success" | "feedback-warning" | "background-primary" | "background-disabled" | "background-error" | "background-success" | "background-warning" | "background-contrast" | "background-current" | "background-selected" | "background-hover" | "shadow-primary" | "shadow-secondary" | "primary-hover" | "primary-inverse" | "secondary-hover" | "danger-hover" | "interface-hover" | "border-primary" | "border-secondary" | "border-disabled" | "border-tertiary";
32
+ foregroundBarColor: "text" | "background" | "primary" | "secondary" | "danger" | "interface" | "text-secondary" | "text-accent" | "text-disabled" | "feedback-error" | "feedback-success" | "feedback-warning" | "background-primary" | "background-disabled" | "background-error" | "background-success" | "background-warning" | "background-contrast" | "background-current" | "background-selected" | "background-hover" | "shadow-primary" | "shadow-secondary" | "primary-hover" | "primary-inverse" | "secondary-hover" | "danger-hover" | "interface-hover" | "border-primary" | "border-secondary" | "border-disabled" | "border-tertiary";
33
+ backgroundBarColor: "text" | "background" | "primary" | "secondary" | "danger" | "interface" | "text-secondary" | "text-accent" | "text-disabled" | "feedback-error" | "feedback-success" | "feedback-warning" | "background-primary" | "background-disabled" | "background-error" | "background-success" | "background-warning" | "background-contrast" | "background-current" | "background-selected" | "background-hover" | "shadow-primary" | "shadow-secondary" | "primary-hover" | "primary-inverse" | "secondary-hover" | "danger-hover" | "interface-hover" | "border-primary" | "border-secondary" | "border-disabled" | "border-tertiary";
34
+ };
35
+ animate: boolean;
36
+ };
@@ -0,0 +1,61 @@
1
+ import { useContext, useMemo } from 'react';
2
+ import { BarChartContext } from '../BarChartProvider';
3
+ import { calculatePositionPercent, getLabel } from './index';
4
+ const defaultStyleConfig = {
5
+ textColor: 'text',
6
+ foregroundBarColor: 'feedback-warning',
7
+ backgroundBarColor: 'background-primary'
8
+ };
9
+
10
+ /**
11
+ * Hook that calculates label positions for a given range and count
12
+ * Returns an array of { value, positionPercent } objects
13
+ */
14
+ export const useLabelPositions = ({
15
+ min,
16
+ max,
17
+ count
18
+ }) => {
19
+ return useMemo(() => Array.from({
20
+ length: count
21
+ }, (_, i) => {
22
+ const value = getLabel({
23
+ labelCount: count,
24
+ labelIndex: i,
25
+ min,
26
+ max
27
+ });
28
+ const positionPercent = calculatePositionPercent({
29
+ value,
30
+ min,
31
+ max
32
+ });
33
+ return {
34
+ value,
35
+ positionPercent
36
+ };
37
+ }), [min, max, count]);
38
+ };
39
+ export function useBarChartContext() {
40
+ return useContext(BarChartContext);
41
+ }
42
+ export function useBarChart({
43
+ minRange,
44
+ maxRange,
45
+ xScale,
46
+ unit = '',
47
+ styleConfig,
48
+ animate = false
49
+ }) {
50
+ return useMemo(() => ({
51
+ minRange,
52
+ maxRange,
53
+ xScale: xScale ?? Math.ceil((maxRange - minRange) / 5),
54
+ unit,
55
+ styleConfig: {
56
+ ...defaultStyleConfig,
57
+ ...styleConfig
58
+ },
59
+ animate
60
+ }), [minRange, maxRange, xScale, unit, styleConfig, animate]);
61
+ }