govuk-chakra 0.1.2 → 0.1.3
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.
- package/README.md +28 -0
- package/dist/DonutChart-By-HroDD.js +2 -0
- package/dist/{DonutChart-Dv_SZ-sU.js.map → DonutChart-By-HroDD.js.map} +1 -1
- package/dist/{DonutChart-qMSUcNyC.mjs → DonutChart-hLl-PYTm.mjs} +2 -2
- package/dist/{DonutChart-qMSUcNyC.mjs.map → DonutChart-hLl-PYTm.mjs.map} +1 -1
- package/dist/chakra.cjs +1 -1
- package/dist/chakra.mjs +2 -2
- package/dist/charts.cjs +1 -1
- package/dist/charts.mjs +1 -1
- package/dist/{govuk-chakra-0wIbHjYQ.mjs → govuk-chakra-DvWJuAiD.mjs} +2 -2
- package/dist/{govuk-chakra-0wIbHjYQ.mjs.map → govuk-chakra-DvWJuAiD.mjs.map} +1 -1
- package/dist/{govuk-chakra-Aa83RA4r.js → govuk-chakra-NZ5MieX-.js} +2 -2
- package/dist/{govuk-chakra-Aa83RA4r.js.map → govuk-chakra-NZ5MieX-.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +2 -2
- package/package.json +20 -16
- package/dist/DonutChart-Dv_SZ-sU.js +0 -2
package/README.md
CHANGED
|
@@ -248,6 +248,28 @@ export function AppRoot() {
|
|
|
248
248
|
}
|
|
249
249
|
```
|
|
250
250
|
|
|
251
|
+
## User-centred pattern examples
|
|
252
|
+
|
|
253
|
+
Run `yarn storybook` and open **GOV.UK → Patterns** for 30 examples grouped into
|
|
254
|
+
**Ask users for**, **Help users to**, and **Pages**. The examples use this repo's
|
|
255
|
+
components and include interactions, validation, recovery routes and service safeguards.
|
|
256
|
+
|
|
257
|
+
See the [pattern index](design/govuk/patterns/README.md) for every example, its source
|
|
258
|
+
and the production integrations it requires. These are in-memory demonstrations;
|
|
259
|
+
use fictional data when exploring them.
|
|
260
|
+
|
|
261
|
+
## Unit Tests
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
yarn test # Run unit tests in watch mode
|
|
265
|
+
yarn test:run # Run unit tests once
|
|
266
|
+
yarn test:list # List unit test files without running them
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
This repository uses Vitest. Use `yarn test:list` instead of the Jest-specific
|
|
270
|
+
`yarn test --listTests` command. To filter the file list, pass a filename fragment,
|
|
271
|
+
for example `yarn test:list Button`.
|
|
272
|
+
|
|
251
273
|
## Storybook Accessibility Tests
|
|
252
274
|
|
|
253
275
|
Storybook accessibility checks run as part of the existing browser-based Storybook Vitest project:
|
|
@@ -378,3 +400,9 @@ This project should be treated as a custom design-system layer built on Chakra U
|
|
|
378
400
|
## License
|
|
379
401
|
|
|
380
402
|
MIT License - see [LICENSE](LICENSE). Free to use, modify, and distribute. The only requirement is including the license notice.
|
|
403
|
+
|
|
404
|
+
## Open Design import
|
|
405
|
+
|
|
406
|
+
Import [the standalone DESIGN.md](adapters/open-design/govuk-chakra/DESIGN.md) into Open Design to use this repository’s design guidance and all 30 pattern examples. The folder also provides `manifest.json` and `tokens.css` for Open Design libraries. See [import instructions](docs/open-design.md).
|
|
407
|
+
|
|
408
|
+
Regenerate with `yarn design:open-design`; verify with `yarn design:open-design:check` and `yarn test:open-design`.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./fonts-C9Uv7ViY.js"),t=require("./px-to-rem-CwuxPF53.js");let n=require("@chakra-ui/react"),r=require("react/jsx-runtime"),i=require("react"),a=require("recharts"),o=require("@chakra-ui/charts");var s=(0,i.forwardRef)(function({fontSize:e,fontWeight:i=400,...a},o){typeof e==`number`&&!(e in t.a)&&console.warn(`[GOV.UK Text] fontSize={${e}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`);let s=t.t(e);return s?(0,r.jsx)(n.Text,{ref:o,fontSize:{base:s.small.fontSize,md:s.large.fontSize},lineHeight:{base:s.small.lineHeight,md:s.large.lineHeight},fontWeight:i,fontFamily:`body`,...a}):(0,r.jsx)(n.Text,{ref:o,fontSize:e,fontWeight:i,...a})}),c=(0,i.createContext)(null);function l(){let e=(0,i.useContext)(c);if(!e)throw Error(`Chart components must be rendered inside Chart.Root`);return e}function u(e,t){if(e&&t&&typeof e.payload==`object`&&e.payload!==null)return e.payload[t]}function d(e){return e==null?``:(0,i.isValidElement)(e)||typeof e==`string`||typeof e==`number`?e:typeof e==`boolean`||typeof e==`bigint`?String(e):Array.isArray(e)?e.join(`, `):String(e)}function f(e){return typeof e!=`string`||e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}function p({payload:e,label:t,labelFormatter:i,hideLabel:a,hideIndicator:o,hideSeriesLabel:c,showTotal:p,fitContent:m,nameKey:h,formatter:g,render:_}){let v=l(),y=e?.filter(e=>e.color!==`none`||e.type!==`none`);if(!y?.length)return null;let b=y,x=y[0],S=u(x,h)??t??x?.dataKey??`value`,C=d(i?.(String(S),b)??S),w=y.reduce((e,t)=>typeof t.value==`number`?e+t.value:e,0);return(0,r.jsxs)(n.Stack,{minW:m?void 0:`8rem`,gap:`1`,rounded:`l2`,bg:`bg.panel`,px:`2.5`,py:`1`,textStyle:`xs`,shadow:`md`,children:[a?null:(0,r.jsx)(s,{fontWeight:`medium`,children:C}),(0,r.jsx)(n.Box,{children:y.map((e,t)=>{let i=v.getSeries(e);if(_)return(0,r.jsx)(n.Box,{children:_(e)},t);let a=g?g(e.value,e.name):e.value?.toLocaleString(),[l,u]=Array.isArray(a)?a:[a,f(e.name)];return(0,r.jsxs)(n.Flex,{gap:`1.5`,wrap:`wrap`,align:`center`,children:[o?null:i?.color?(0,r.jsx)(n.Box,{boxSize:`2`,rounded:`full`,bg:v.color(i.color),borderWidth:`1px`,borderColor:`blackAlpha.200`,flexShrink:0}):(0,r.jsx)(n.Box,{boxSize:`2`,rounded:`full`,bg:`border.emphasized`,borderWidth:`1px`,borderColor:`blackAlpha.200`,flexShrink:0}),(0,r.jsxs)(n.HStack,{justify:`space-between`,flex:`1`,children:[c?null:(0,r.jsx)(s,{color:`fg.muted`,children:d(u)}),e.value==null?null:(0,r.jsx)(s,{fontFamily:`mono`,fontWeight:`medium`,fontVariantNumeric:`tabular-nums`,children:d(l)})]})]},t)})}),p?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.Separator,{mt:`1`}),(0,r.jsxs)(n.HStack,{gap:`1`,justify:`space-between`,pb:`1`,children:[(0,r.jsx)(n.Span,{color:`fg.muted`,children:`Total`}),(0,r.jsx)(s,{fontFamily:`mono`,fontWeight:`medium`,fontVariantNumeric:`tabular-nums`,children:g?(()=>{let e=g(w,``);return Array.isArray(e)?e[0]:e})():w.toLocaleString()})]})]}):null]})}function m({payload:e,verticalAlign:t=`bottom`,align:i=`center`,title:a,orientation:o,nameKey:c,spacing:p=`3`,interaction:m=`hover`,rootProps:h,itemProps:g,labelProps:_,indicatorProps:v}){let y=l(),b=e?.filter(e=>e.color!==`none`||e.type!==`none`);if(!b?.length)return null;let x=typeof p==`number`?`${p}px`:y.spacing(p);return(0,r.jsxs)(n.Stack,{gap:`1.5`,align:{left:`flex-start`,center:`center`,right:`flex-end`}[i],pt:t===`bottom`?`3`:void 0,pb:t===`top`?`3`:void 0,...h,children:[a?(0,r.jsx)(s,{fontWeight:`medium`,children:a}):null,(0,r.jsx)(n.Flex,{"data-orientation":o,gap:x,direction:{_horizontal:`row`,_vertical:`column`},align:{_horizontal:`center`,_vertical:`flex-start`},flexWrap:`wrap`,children:b.map((e,t)=>{let i=y.getSeries(e),a=i?.name==null?void 0:typeof i.name==`string`?i.name:String(i.name),o=f(u(e,c)??i?.label);return(0,r.jsxs)(n.HStack,{gap:`1.5`,style:{opacity:y.getSeriesOpacity(a,.6)},onClick:()=>{m===`click`&&a&&y.setHighlightedSeries(e=>e===a?null:a)},onMouseEnter:()=>{m===`hover`&&a&&y.setHighlightedSeries(a)},onMouseLeave:()=>{m===`hover`&&a&&y.setHighlightedSeries(null)},...g,children:[i?.icon?i.icon:(0,r.jsx)(n.Box,{boxSize:`2`,rounded:`full`,bg:i?.color?y.color(i.color):`border.emphasized`,borderWidth:`1px`,borderColor:`blackAlpha.200`,flexShrink:0,...v}),(0,r.jsx)(n.Span,{color:`fg.muted`,..._,children:d(o)})]},t)})})]})}function h(e){let{rootProps:t,itemProps:n,labelProps:i,indicatorProps:o,title:s,nameKey:c,interaction:l,spacing:u,payload:d,align:f,verticalAlign:p,layout:h,...g}=e;return(0,r.jsx)(a.Legend,{...g,align:f,verticalAlign:p,layout:h,content:(0,r.jsx)(m,{rootProps:t,itemProps:n,labelProps:i,indicatorProps:o,title:s,nameKey:c,interaction:l,spacing:u,payload:d,align:f,verticalAlign:p,layout:h})})}function g(e){return(0,r.jsx)(a.Tooltip,{...e,content:(0,r.jsx)(p,{...e})})}function _({fontFamily:n=`body`,fontSize:i=16,...a}){let s=t.t(i);if(!s)console.warn(`[GOV.UK Chart] fontSize={${i}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`);else return(0,r.jsx)(c.Provider,{value:a.chart,children:(0,r.jsx)(o.Chart.Root,{fontFamily:n,css:{"& svg.recharts-surface tspan":{fontSize:{base:s.small.fontSize,md:s.large.fontSize},lineHeight:{base:s.small.lineHeight,md:s.large.lineHeight},color:`fg`,fontFamily:e.t.body.value},"& .recharts-tooltip-wrapper":{background:`var(--govuk-colors-bg)`,borderRadius:`var(--govuk-radii-l2)`}},...a})})}var v=Object.assign(_,{...o.Chart,Root:_,Legend:h,LegendContent:m,Tooltip:g,TooltipContent:p});function y({chart:e,chartRootProps:t,...n}){return(0,r.jsx)(v.Root,{chart:e,...t,children:(0,r.jsx)(a.PieChart,{data:e.data,...n})})}var b=Object.assign(y,{Root:y});Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return b}});
|
|
2
|
+
//# sourceMappingURL=DonutChart-By-HroDD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DonutChart-Dv_SZ-sU.js","names":[],"sources":["../src/components/Text/Text.tsx","../src/components/Chart/Chart.tsx","../src/components/DonutChart/DonutChart.tsx"],"sourcesContent":["import { Text as ChakraText, type TextProps as ChakraTextProps } from '@chakra-ui/react'\nimport { forwardRef } from 'react'\nimport { getGovukTypeScale, govukTypeScale, type GovukTypeScalePoint } from '@/utils'\n\nexport interface TextProps extends Omit<ChakraTextProps, 'fontSize' | 'fontWeight'> {\n fontSize?: GovukTypeScalePoint | ChakraTextProps['fontSize']\n fontWeight?: ChakraTextProps['fontWeight']\n}\n\nexport const Text = forwardRef<HTMLParagraphElement, TextProps>(function Text(\n { fontSize, fontWeight = 400, ...props },\n ref\n) {\n if (typeof fontSize === 'number' && !(fontSize in govukTypeScale)) {\n console.warn(\n `[GOV.UK Text] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n }\n\n const scale = getGovukTypeScale(fontSize)\n\n if (scale) {\n return (\n <ChakraText\n ref={ref}\n fontSize={{ base: scale.small.fontSize, md: scale.large.fontSize }}\n lineHeight={{ base: scale.small.lineHeight, md: scale.large.lineHeight }}\n fontWeight={fontWeight}\n fontFamily=\"body\"\n {...props}\n />\n )\n }\n\n return (\n <ChakraText\n ref={ref}\n fontSize={fontSize as ChakraTextProps['fontSize']}\n fontWeight={fontWeight}\n {...props}\n />\n )\n})\n","import { Box, Flex, HStack, Separator, Span, Stack } from '@chakra-ui/react'\nimport { fonts } from '@/theme/fonts'\nimport {\n Chart as ChakraChart,\n type ChartLegendProps as ChakraChartLegendProps,\n type ChartTooltipProps as ChakraChartTooltipProps,\n type UseChartReturn,\n} from '@chakra-ui/charts'\nimport {\n createContext,\n isValidElement,\n useContext,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\nimport { Legend as RechartsLegend, Tooltip as RechartsTooltip } from 'recharts'\nimport type { Payload } from 'recharts/types/component/DefaultTooltipContent'\nimport type { TooltipPayloadEntry } from 'recharts/types/state/tooltipSlice'\nimport { getGovukTypeScale } from '@/utils'\nimport { Text } from '../Text'\n\nexport interface ChartRootProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraChart.Root>,\n 'chart'\n> {\n chart: UseChartReturn<T>\n}\n\nexport type ChartRechartsTooltipProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsTooltip>,\n 'content'\n> &\n ChakraChartTooltipProps\n\nexport interface ChartLegendContentProps extends ChakraChartLegendProps {\n orientation?: 'horizontal' | 'vertical'\n spacing?: string | number\n rootProps?: ComponentPropsWithoutRef<typeof Stack>\n itemProps?: ComponentPropsWithoutRef<typeof HStack>\n labelProps?: ComponentPropsWithoutRef<typeof Span>\n indicatorProps?: ComponentPropsWithoutRef<typeof Box>\n}\n\nexport type ChartRechartsLegendProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsLegend>,\n 'content'\n> &\n ChartLegendContentProps\n\nconst ChartContext = createContext<UseChartReturn<unknown> | null>(null)\n\nfunction useGovukChartContext() {\n const chart = useContext(ChartContext)\n\n if (!chart) {\n throw new Error('Chart components must be rendered inside Chart.Root')\n }\n\n return chart\n}\n\nfunction getPayloadProp(item: TooltipPayloadEntry | undefined, key?: string) {\n if (!item || !key || typeof item.payload !== 'object' || item.payload === null) {\n return undefined\n }\n\n const payload = item.payload as Record<string, unknown>\n return payload[key]\n}\n\nfunction toRenderableValue(value: unknown): ReactNode {\n if (value == null) {\n return ''\n }\n\n if (isValidElement(value)) {\n return value\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n if (typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value)\n }\n\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n return String(value)\n}\n\nfunction capitalizeLabel(value: unknown) {\n if (typeof value !== 'string' || value.length === 0) {\n return value\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nfunction ChartTooltip({\n payload: payloadProp,\n label,\n labelFormatter,\n hideLabel,\n hideIndicator,\n hideSeriesLabel,\n showTotal,\n fitContent,\n nameKey,\n formatter,\n render,\n}: ChakraChartTooltipProps) {\n const chart = useGovukChartContext()\n const payload = payloadProp?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!payload?.length) {\n return null\n }\n\n const callbackPayload = payload as Array<Payload<string | number, string>>\n const firstItem = payload[0]\n const rawLabel = getPayloadProp(firstItem, nameKey) ?? label ?? firstItem?.dataKey ?? 'value'\n const tooltipLabel = toRenderableValue(\n labelFormatter?.(String(rawLabel), callbackPayload) ?? rawLabel\n )\n const total = payload.reduce((sum, item) => {\n return typeof item.value === 'number' ? sum + item.value : sum\n }, 0)\n\n return (\n <Stack\n minW={fitContent ? undefined : '8rem'}\n gap=\"1\"\n rounded=\"l2\"\n bg=\"bg.panel\"\n px=\"2.5\"\n py=\"1\"\n textStyle=\"xs\"\n shadow=\"md\"\n >\n {!hideLabel ? <Text fontWeight=\"medium\">{tooltipLabel}</Text> : null}\n <Box>\n {payload.map((item, index) => {\n const config = chart.getSeries(item)\n\n if (render) {\n return <Box key={index}>{render(item as Payload<string, string>)}</Box>\n }\n\n const formatted = formatter\n ? formatter(item.value, item.name)\n : item.value?.toLocaleString()\n const [formattedValue, formattedName] = Array.isArray(formatted)\n ? formatted\n : [formatted, capitalizeLabel(item.name)]\n\n return (\n <Flex key={index} gap=\"1.5\" wrap=\"wrap\" align=\"center\">\n {!hideIndicator ? (\n config?.color ? (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={chart.color(config.color)}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg=\"border.emphasized\"\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n )\n ) : null}\n <HStack justify=\"space-between\" flex=\"1\">\n {!hideSeriesLabel ? (\n <Text color=\"fg.muted\">{toRenderableValue(formattedName)}</Text>\n ) : null}\n {item.value != null ? (\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {toRenderableValue(formattedValue)}\n </Text>\n ) : null}\n </HStack>\n </Flex>\n )\n })}\n </Box>\n {showTotal ? (\n <>\n <Separator mt=\"1\" />\n <HStack gap=\"1\" justify=\"space-between\" pb=\"1\">\n <Span color=\"fg.muted\">Total</Span>\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {formatter\n ? (() => {\n const formatted = formatter(total, '')\n return Array.isArray(formatted) ? formatted[0] : formatted\n })()\n : total.toLocaleString()}\n </Text>\n </HStack>\n </>\n ) : null}\n </Stack>\n )\n}\n\nfunction ChartLegendContent({\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n title,\n orientation,\n nameKey,\n spacing = '3',\n interaction = 'hover',\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n}: ChartLegendContentProps) {\n const chart = useGovukChartContext()\n const filteredPayload = payload?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!filteredPayload?.length) {\n return null\n }\n\n const spacingValue = typeof spacing === 'number' ? `${spacing}px` : chart.spacing(spacing)\n const alignMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n } as const\n\n return (\n <Stack\n gap=\"1.5\"\n align={alignMap[align]}\n pt={verticalAlign === 'bottom' ? '3' : undefined}\n pb={verticalAlign === 'top' ? '3' : undefined}\n {...rootProps}\n >\n {title ? <Text fontWeight=\"medium\">{title}</Text> : null}\n <Flex\n data-orientation={orientation}\n gap={spacingValue}\n direction={{ _horizontal: 'row', _vertical: 'column' }}\n align={{ _horizontal: 'center', _vertical: 'flex-start' }}\n flexWrap=\"wrap\"\n >\n {filteredPayload.map((item, index) => {\n const config = chart.getSeries(item)\n const seriesName =\n config?.name == null\n ? undefined\n : typeof config.name === 'string'\n ? config.name\n : String(config.name)\n const name = getPayloadProp(item as TooltipPayloadEntry, nameKey)\n const label = capitalizeLabel(name ?? config?.label)\n\n return (\n <HStack\n key={index}\n gap=\"1.5\"\n style={{ opacity: chart.getSeriesOpacity(seriesName, 0.6) }}\n onClick={() => {\n if (interaction === 'click' && seriesName) {\n chart.setHighlightedSeries((prev) => (prev === seriesName ? null : seriesName))\n }\n }}\n onMouseEnter={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(seriesName)\n }\n }}\n onMouseLeave={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(null)\n }\n }}\n {...itemProps}\n >\n {config?.icon ? (\n config.icon\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={config?.color ? chart.color(config.color) : 'border.emphasized'}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n {...indicatorProps}\n />\n )}\n <Span color=\"fg.muted\" {...labelProps}>\n {toRenderableValue(label)}\n </Span>\n </HStack>\n )\n })}\n </Flex>\n </Stack>\n )\n}\n\nfunction ChartLegend(props: ChartRechartsLegendProps) {\n const {\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n title,\n nameKey,\n interaction,\n spacing,\n payload,\n align,\n verticalAlign,\n layout,\n ...legendProps\n } = props\n\n return (\n <RechartsLegend\n {...legendProps}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n content={\n <ChartLegendContent\n rootProps={rootProps}\n itemProps={itemProps}\n labelProps={labelProps}\n indicatorProps={indicatorProps}\n title={title}\n nameKey={nameKey}\n interaction={interaction}\n spacing={spacing}\n payload={payload}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n />\n }\n />\n )\n}\n\nfunction ChartRechartsTooltip(props: ChartRechartsTooltipProps) {\n return <RechartsTooltip {...props} content={<ChartTooltip {...props} />} />\n}\n\nfunction ChartRoot<T>({ fontFamily = 'body', fontSize = 16, ...props }: ChartRootProps<T>) {\n const scale = getGovukTypeScale(fontSize)\n if (!scale) {\n console.warn(\n `[GOV.UK Chart] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n } else {\n return (\n <ChartContext.Provider value={props.chart as UseChartReturn<unknown>}>\n <ChakraChart.Root\n fontFamily={fontFamily}\n css={{\n '& svg.recharts-surface tspan': {\n fontSize: { base: scale.small.fontSize, md: scale.large.fontSize },\n lineHeight: { base: scale.small.lineHeight, md: scale.large.lineHeight },\n color: 'fg',\n fontFamily: fonts.body.value,\n },\n '& .recharts-tooltip-wrapper': {\n background: 'var(--govuk-colors-bg)',\n borderRadius: 'var(--govuk-radii-l2)',\n },\n }}\n {...props}\n />\n </ChartContext.Provider>\n )\n }\n}\n\nexport { ChartRoot }\n\nexport const Chart = Object.assign(ChartRoot, {\n ...ChakraChart,\n Root: ChartRoot,\n Legend: ChartLegend,\n LegendContent: ChartLegendContent,\n Tooltip: ChartRechartsTooltip,\n TooltipContent: ChartTooltip,\n})\n","import type { UseChartReturn } from '@chakra-ui/charts'\nimport { PieChart as ChakraDonutChart } from 'recharts'\nimport type { ComponentPropsWithoutRef } from 'react'\n\nimport { Chart, type ChartRootProps } from '@/components/Chart'\n\nexport interface DonutChartProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraDonutChart>,\n 'data'\n> {\n chart: UseChartReturn<T>\n chartRootProps?: Omit<ChartRootProps<T>, 'chart' | 'children'>\n}\n\nfunction DonutChartRoot<T>({ chart, chartRootProps, ...props }: DonutChartProps<T>) {\n return (\n <Chart.Root chart={chart} {...chartRootProps}>\n <ChakraDonutChart data={chart.data} {...props} />\n </Chart.Root>\n )\n}\n\nexport { DonutChartRoot }\n\nexport const DonutChart = Object.assign(DonutChartRoot, {\n Root: DonutChartRoot,\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DonutChart-By-HroDD.js","names":[],"sources":["../src/components/Text/Text.tsx","../src/components/Chart/Chart.tsx","../src/components/DonutChart/DonutChart.tsx"],"sourcesContent":["import { Text as ChakraText, type TextProps as ChakraTextProps } from '@chakra-ui/react'\nimport { forwardRef } from 'react'\nimport { getGovukTypeScale, govukTypeScale, type GovukTypeScalePoint } from '@/utils'\n\nexport interface TextProps extends Omit<ChakraTextProps, 'fontSize' | 'fontWeight'> {\n fontSize?: GovukTypeScalePoint | ChakraTextProps['fontSize']\n fontWeight?: ChakraTextProps['fontWeight']\n}\n\nexport const Text = forwardRef<HTMLParagraphElement, TextProps>(function Text(\n { fontSize, fontWeight = 400, ...props },\n ref\n) {\n if (typeof fontSize === 'number' && !(fontSize in govukTypeScale)) {\n console.warn(\n `[GOV.UK Text] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n }\n\n const scale = getGovukTypeScale(fontSize)\n\n if (scale) {\n return (\n <ChakraText\n ref={ref}\n fontSize={{ base: scale.small.fontSize, md: scale.large.fontSize }}\n lineHeight={{ base: scale.small.lineHeight, md: scale.large.lineHeight }}\n fontWeight={fontWeight}\n fontFamily=\"body\"\n {...props}\n />\n )\n }\n\n return (\n <ChakraText\n ref={ref}\n fontSize={fontSize as ChakraTextProps['fontSize']}\n fontWeight={fontWeight}\n {...props}\n />\n )\n})\n","import { Box, Flex, HStack, Separator, Span, Stack } from '@chakra-ui/react'\nimport { fonts } from '@/theme/fonts'\nimport {\n Chart as ChakraChart,\n type ChartLegendProps as ChakraChartLegendProps,\n type ChartTooltipProps as ChakraChartTooltipProps,\n type UseChartReturn,\n} from '@chakra-ui/charts'\nimport {\n createContext,\n isValidElement,\n useContext,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\nimport { Legend as RechartsLegend, Tooltip as RechartsTooltip } from 'recharts'\nimport type { Payload } from 'recharts/types/component/DefaultTooltipContent'\nimport type { TooltipPayloadEntry } from 'recharts/types/state/tooltipSlice'\nimport { getGovukTypeScale } from '@/utils'\nimport { Text } from '../Text'\n\nexport interface ChartRootProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraChart.Root>,\n 'chart'\n> {\n chart: UseChartReturn<T>\n}\n\nexport type ChartRechartsTooltipProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsTooltip>,\n 'content'\n> &\n ChakraChartTooltipProps\n\nexport interface ChartLegendContentProps extends ChakraChartLegendProps {\n orientation?: 'horizontal' | 'vertical'\n spacing?: string | number\n rootProps?: ComponentPropsWithoutRef<typeof Stack>\n itemProps?: ComponentPropsWithoutRef<typeof HStack>\n labelProps?: ComponentPropsWithoutRef<typeof Span>\n indicatorProps?: ComponentPropsWithoutRef<typeof Box>\n}\n\nexport type ChartRechartsLegendProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsLegend>,\n 'content'\n> &\n ChartLegendContentProps\n\nconst ChartContext = createContext<UseChartReturn<unknown> | null>(null)\n\nfunction useGovukChartContext() {\n const chart = useContext(ChartContext)\n\n if (!chart) {\n throw new Error('Chart components must be rendered inside Chart.Root')\n }\n\n return chart\n}\n\nfunction getPayloadProp(item: TooltipPayloadEntry | undefined, key?: string) {\n if (!item || !key || typeof item.payload !== 'object' || item.payload === null) {\n return undefined\n }\n\n const payload = item.payload as Record<string, unknown>\n return payload[key]\n}\n\nfunction toRenderableValue(value: unknown): ReactNode {\n if (value == null) {\n return ''\n }\n\n if (isValidElement(value)) {\n return value\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n if (typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value)\n }\n\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n return String(value)\n}\n\nfunction capitalizeLabel(value: unknown) {\n if (typeof value !== 'string' || value.length === 0) {\n return value\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nfunction ChartTooltip({\n payload: payloadProp,\n label,\n labelFormatter,\n hideLabel,\n hideIndicator,\n hideSeriesLabel,\n showTotal,\n fitContent,\n nameKey,\n formatter,\n render,\n}: ChakraChartTooltipProps) {\n const chart = useGovukChartContext()\n const payload = payloadProp?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!payload?.length) {\n return null\n }\n\n const callbackPayload = payload as Array<Payload<string | number, string>>\n const firstItem = payload[0]\n const rawLabel = getPayloadProp(firstItem, nameKey) ?? label ?? firstItem?.dataKey ?? 'value'\n const tooltipLabel = toRenderableValue(\n labelFormatter?.(String(rawLabel), callbackPayload) ?? rawLabel\n )\n const total = payload.reduce((sum, item) => {\n return typeof item.value === 'number' ? sum + item.value : sum\n }, 0)\n\n return (\n <Stack\n minW={fitContent ? undefined : '8rem'}\n gap=\"1\"\n rounded=\"l2\"\n bg=\"bg.panel\"\n px=\"2.5\"\n py=\"1\"\n textStyle=\"xs\"\n shadow=\"md\"\n >\n {!hideLabel ? <Text fontWeight=\"medium\">{tooltipLabel}</Text> : null}\n <Box>\n {payload.map((item, index) => {\n const config = chart.getSeries(item)\n\n if (render) {\n return <Box key={index}>{render(item as Payload<string, string>)}</Box>\n }\n\n const formatted = formatter\n ? formatter(item.value, item.name)\n : item.value?.toLocaleString()\n const [formattedValue, formattedName] = Array.isArray(formatted)\n ? formatted\n : [formatted, capitalizeLabel(item.name)]\n\n return (\n <Flex key={index} gap=\"1.5\" wrap=\"wrap\" align=\"center\">\n {!hideIndicator ? (\n config?.color ? (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={chart.color(config.color)}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg=\"border.emphasized\"\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n )\n ) : null}\n <HStack justify=\"space-between\" flex=\"1\">\n {!hideSeriesLabel ? (\n <Text color=\"fg.muted\">{toRenderableValue(formattedName)}</Text>\n ) : null}\n {item.value != null ? (\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {toRenderableValue(formattedValue)}\n </Text>\n ) : null}\n </HStack>\n </Flex>\n )\n })}\n </Box>\n {showTotal ? (\n <>\n <Separator mt=\"1\" />\n <HStack gap=\"1\" justify=\"space-between\" pb=\"1\">\n <Span color=\"fg.muted\">Total</Span>\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {formatter\n ? (() => {\n const formatted = formatter(total, '')\n return Array.isArray(formatted) ? formatted[0] : formatted\n })()\n : total.toLocaleString()}\n </Text>\n </HStack>\n </>\n ) : null}\n </Stack>\n )\n}\n\nfunction ChartLegendContent({\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n title,\n orientation,\n nameKey,\n spacing = '3',\n interaction = 'hover',\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n}: ChartLegendContentProps) {\n const chart = useGovukChartContext()\n const filteredPayload = payload?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!filteredPayload?.length) {\n return null\n }\n\n const spacingValue = typeof spacing === 'number' ? `${spacing}px` : chart.spacing(spacing)\n const alignMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n } as const\n\n return (\n <Stack\n gap=\"1.5\"\n align={alignMap[align]}\n pt={verticalAlign === 'bottom' ? '3' : undefined}\n pb={verticalAlign === 'top' ? '3' : undefined}\n {...rootProps}\n >\n {title ? <Text fontWeight=\"medium\">{title}</Text> : null}\n <Flex\n data-orientation={orientation}\n gap={spacingValue}\n direction={{ _horizontal: 'row', _vertical: 'column' }}\n align={{ _horizontal: 'center', _vertical: 'flex-start' }}\n flexWrap=\"wrap\"\n >\n {filteredPayload.map((item, index) => {\n const config = chart.getSeries(item)\n const seriesName =\n config?.name == null\n ? undefined\n : typeof config.name === 'string'\n ? config.name\n : String(config.name)\n const name = getPayloadProp(item as TooltipPayloadEntry, nameKey)\n const label = capitalizeLabel(name ?? config?.label)\n\n return (\n <HStack\n key={index}\n gap=\"1.5\"\n style={{ opacity: chart.getSeriesOpacity(seriesName, 0.6) }}\n onClick={() => {\n if (interaction === 'click' && seriesName) {\n chart.setHighlightedSeries((prev) => (prev === seriesName ? null : seriesName))\n }\n }}\n onMouseEnter={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(seriesName)\n }\n }}\n onMouseLeave={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(null)\n }\n }}\n {...itemProps}\n >\n {config?.icon ? (\n config.icon\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={config?.color ? chart.color(config.color) : 'border.emphasized'}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n {...indicatorProps}\n />\n )}\n <Span color=\"fg.muted\" {...labelProps}>\n {toRenderableValue(label)}\n </Span>\n </HStack>\n )\n })}\n </Flex>\n </Stack>\n )\n}\n\nfunction ChartLegend(props: ChartRechartsLegendProps) {\n const {\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n title,\n nameKey,\n interaction,\n spacing,\n payload,\n align,\n verticalAlign,\n layout,\n ...legendProps\n } = props\n\n return (\n <RechartsLegend\n {...legendProps}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n content={\n <ChartLegendContent\n rootProps={rootProps}\n itemProps={itemProps}\n labelProps={labelProps}\n indicatorProps={indicatorProps}\n title={title}\n nameKey={nameKey}\n interaction={interaction}\n spacing={spacing}\n payload={payload}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n />\n }\n />\n )\n}\n\nfunction ChartRechartsTooltip(props: ChartRechartsTooltipProps) {\n return <RechartsTooltip {...props} content={<ChartTooltip {...props} />} />\n}\n\nfunction ChartRoot<T>({ fontFamily = 'body', fontSize = 16, ...props }: ChartRootProps<T>) {\n const scale = getGovukTypeScale(fontSize)\n if (!scale) {\n console.warn(\n `[GOV.UK Chart] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n } else {\n return (\n <ChartContext.Provider value={props.chart as UseChartReturn<unknown>}>\n <ChakraChart.Root\n fontFamily={fontFamily}\n css={{\n '& svg.recharts-surface tspan': {\n fontSize: { base: scale.small.fontSize, md: scale.large.fontSize },\n lineHeight: { base: scale.small.lineHeight, md: scale.large.lineHeight },\n color: 'fg',\n fontFamily: fonts.body.value,\n },\n '& .recharts-tooltip-wrapper': {\n background: 'var(--govuk-colors-bg)',\n borderRadius: 'var(--govuk-radii-l2)',\n },\n }}\n {...props}\n />\n </ChartContext.Provider>\n )\n }\n}\n\nexport { ChartRoot }\n\nexport const Chart = Object.assign(ChartRoot, {\n ...ChakraChart,\n Root: ChartRoot,\n Legend: ChartLegend,\n LegendContent: ChartLegendContent,\n Tooltip: ChartRechartsTooltip,\n TooltipContent: ChartTooltip,\n})\n","import type { UseChartReturn } from '@chakra-ui/charts'\nimport { PieChart as ChakraDonutChart } from 'recharts'\nimport type { ComponentPropsWithoutRef } from 'react'\n\nimport { Chart, type ChartRootProps } from '@/components/Chart'\n\nexport interface DonutChartProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraDonutChart>,\n 'data'\n> {\n chart: UseChartReturn<T>\n chartRootProps?: Omit<ChartRootProps<T>, 'chart' | 'children'>\n}\n\nfunction DonutChartRoot<T>({ chart, chartRootProps, ...props }: DonutChartProps<T>) {\n return (\n <Chart.Root chart={chart} {...chartRootProps}>\n <ChakraDonutChart data={chart.data} {...props} />\n </Chart.Root>\n )\n}\n\nexport { DonutChartRoot }\n\nexport const DonutChart = Object.assign(DonutChartRoot, {\n Root: DonutChartRoot,\n})\n"],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ function C() {
|
|
|
35
35
|
return e;
|
|
36
36
|
}
|
|
37
37
|
function w(e, t) {
|
|
38
|
-
if (
|
|
38
|
+
if (e && t && typeof e.payload == "object" && e.payload !== null) return e.payload[t];
|
|
39
39
|
}
|
|
40
40
|
function T(e) {
|
|
41
41
|
return e == null ? "" : h(e) || typeof e == "string" || typeof e == "number" ? e : typeof e == "boolean" || typeof e == "bigint" ? String(e) : Array.isArray(e) ? e.join(", ") : String(e);
|
|
@@ -262,4 +262,4 @@ var P = Object.assign(N, { Root: N });
|
|
|
262
262
|
//#endregion
|
|
263
263
|
export { M as n, x as r, P as t };
|
|
264
264
|
|
|
265
|
-
//# sourceMappingURL=DonutChart-
|
|
265
|
+
//# sourceMappingURL=DonutChart-hLl-PYTm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DonutChart-qMSUcNyC.mjs","names":[],"sources":["../src/components/Text/Text.tsx","../src/components/Chart/Chart.tsx","../src/components/DonutChart/DonutChart.tsx"],"sourcesContent":["import { Text as ChakraText, type TextProps as ChakraTextProps } from '@chakra-ui/react'\nimport { forwardRef } from 'react'\nimport { getGovukTypeScale, govukTypeScale, type GovukTypeScalePoint } from '@/utils'\n\nexport interface TextProps extends Omit<ChakraTextProps, 'fontSize' | 'fontWeight'> {\n fontSize?: GovukTypeScalePoint | ChakraTextProps['fontSize']\n fontWeight?: ChakraTextProps['fontWeight']\n}\n\nexport const Text = forwardRef<HTMLParagraphElement, TextProps>(function Text(\n { fontSize, fontWeight = 400, ...props },\n ref\n) {\n if (typeof fontSize === 'number' && !(fontSize in govukTypeScale)) {\n console.warn(\n `[GOV.UK Text] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n }\n\n const scale = getGovukTypeScale(fontSize)\n\n if (scale) {\n return (\n <ChakraText\n ref={ref}\n fontSize={{ base: scale.small.fontSize, md: scale.large.fontSize }}\n lineHeight={{ base: scale.small.lineHeight, md: scale.large.lineHeight }}\n fontWeight={fontWeight}\n fontFamily=\"body\"\n {...props}\n />\n )\n }\n\n return (\n <ChakraText\n ref={ref}\n fontSize={fontSize as ChakraTextProps['fontSize']}\n fontWeight={fontWeight}\n {...props}\n />\n )\n})\n","import { Box, Flex, HStack, Separator, Span, Stack } from '@chakra-ui/react'\nimport { fonts } from '@/theme/fonts'\nimport {\n Chart as ChakraChart,\n type ChartLegendProps as ChakraChartLegendProps,\n type ChartTooltipProps as ChakraChartTooltipProps,\n type UseChartReturn,\n} from '@chakra-ui/charts'\nimport {\n createContext,\n isValidElement,\n useContext,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\nimport { Legend as RechartsLegend, Tooltip as RechartsTooltip } from 'recharts'\nimport type { Payload } from 'recharts/types/component/DefaultTooltipContent'\nimport type { TooltipPayloadEntry } from 'recharts/types/state/tooltipSlice'\nimport { getGovukTypeScale } from '@/utils'\nimport { Text } from '../Text'\n\nexport interface ChartRootProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraChart.Root>,\n 'chart'\n> {\n chart: UseChartReturn<T>\n}\n\nexport type ChartRechartsTooltipProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsTooltip>,\n 'content'\n> &\n ChakraChartTooltipProps\n\nexport interface ChartLegendContentProps extends ChakraChartLegendProps {\n orientation?: 'horizontal' | 'vertical'\n spacing?: string | number\n rootProps?: ComponentPropsWithoutRef<typeof Stack>\n itemProps?: ComponentPropsWithoutRef<typeof HStack>\n labelProps?: ComponentPropsWithoutRef<typeof Span>\n indicatorProps?: ComponentPropsWithoutRef<typeof Box>\n}\n\nexport type ChartRechartsLegendProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsLegend>,\n 'content'\n> &\n ChartLegendContentProps\n\nconst ChartContext = createContext<UseChartReturn<unknown> | null>(null)\n\nfunction useGovukChartContext() {\n const chart = useContext(ChartContext)\n\n if (!chart) {\n throw new Error('Chart components must be rendered inside Chart.Root')\n }\n\n return chart\n}\n\nfunction getPayloadProp(item: TooltipPayloadEntry | undefined, key?: string) {\n if (!item || !key || typeof item.payload !== 'object' || item.payload === null) {\n return undefined\n }\n\n const payload = item.payload as Record<string, unknown>\n return payload[key]\n}\n\nfunction toRenderableValue(value: unknown): ReactNode {\n if (value == null) {\n return ''\n }\n\n if (isValidElement(value)) {\n return value\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n if (typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value)\n }\n\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n return String(value)\n}\n\nfunction capitalizeLabel(value: unknown) {\n if (typeof value !== 'string' || value.length === 0) {\n return value\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nfunction ChartTooltip({\n payload: payloadProp,\n label,\n labelFormatter,\n hideLabel,\n hideIndicator,\n hideSeriesLabel,\n showTotal,\n fitContent,\n nameKey,\n formatter,\n render,\n}: ChakraChartTooltipProps) {\n const chart = useGovukChartContext()\n const payload = payloadProp?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!payload?.length) {\n return null\n }\n\n const callbackPayload = payload as Array<Payload<string | number, string>>\n const firstItem = payload[0]\n const rawLabel = getPayloadProp(firstItem, nameKey) ?? label ?? firstItem?.dataKey ?? 'value'\n const tooltipLabel = toRenderableValue(\n labelFormatter?.(String(rawLabel), callbackPayload) ?? rawLabel\n )\n const total = payload.reduce((sum, item) => {\n return typeof item.value === 'number' ? sum + item.value : sum\n }, 0)\n\n return (\n <Stack\n minW={fitContent ? undefined : '8rem'}\n gap=\"1\"\n rounded=\"l2\"\n bg=\"bg.panel\"\n px=\"2.5\"\n py=\"1\"\n textStyle=\"xs\"\n shadow=\"md\"\n >\n {!hideLabel ? <Text fontWeight=\"medium\">{tooltipLabel}</Text> : null}\n <Box>\n {payload.map((item, index) => {\n const config = chart.getSeries(item)\n\n if (render) {\n return <Box key={index}>{render(item as Payload<string, string>)}</Box>\n }\n\n const formatted = formatter\n ? formatter(item.value, item.name)\n : item.value?.toLocaleString()\n const [formattedValue, formattedName] = Array.isArray(formatted)\n ? formatted\n : [formatted, capitalizeLabel(item.name)]\n\n return (\n <Flex key={index} gap=\"1.5\" wrap=\"wrap\" align=\"center\">\n {!hideIndicator ? (\n config?.color ? (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={chart.color(config.color)}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg=\"border.emphasized\"\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n )\n ) : null}\n <HStack justify=\"space-between\" flex=\"1\">\n {!hideSeriesLabel ? (\n <Text color=\"fg.muted\">{toRenderableValue(formattedName)}</Text>\n ) : null}\n {item.value != null ? (\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {toRenderableValue(formattedValue)}\n </Text>\n ) : null}\n </HStack>\n </Flex>\n )\n })}\n </Box>\n {showTotal ? (\n <>\n <Separator mt=\"1\" />\n <HStack gap=\"1\" justify=\"space-between\" pb=\"1\">\n <Span color=\"fg.muted\">Total</Span>\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {formatter\n ? (() => {\n const formatted = formatter(total, '')\n return Array.isArray(formatted) ? formatted[0] : formatted\n })()\n : total.toLocaleString()}\n </Text>\n </HStack>\n </>\n ) : null}\n </Stack>\n )\n}\n\nfunction ChartLegendContent({\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n title,\n orientation,\n nameKey,\n spacing = '3',\n interaction = 'hover',\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n}: ChartLegendContentProps) {\n const chart = useGovukChartContext()\n const filteredPayload = payload?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!filteredPayload?.length) {\n return null\n }\n\n const spacingValue = typeof spacing === 'number' ? `${spacing}px` : chart.spacing(spacing)\n const alignMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n } as const\n\n return (\n <Stack\n gap=\"1.5\"\n align={alignMap[align]}\n pt={verticalAlign === 'bottom' ? '3' : undefined}\n pb={verticalAlign === 'top' ? '3' : undefined}\n {...rootProps}\n >\n {title ? <Text fontWeight=\"medium\">{title}</Text> : null}\n <Flex\n data-orientation={orientation}\n gap={spacingValue}\n direction={{ _horizontal: 'row', _vertical: 'column' }}\n align={{ _horizontal: 'center', _vertical: 'flex-start' }}\n flexWrap=\"wrap\"\n >\n {filteredPayload.map((item, index) => {\n const config = chart.getSeries(item)\n const seriesName =\n config?.name == null\n ? undefined\n : typeof config.name === 'string'\n ? config.name\n : String(config.name)\n const name = getPayloadProp(item as TooltipPayloadEntry, nameKey)\n const label = capitalizeLabel(name ?? config?.label)\n\n return (\n <HStack\n key={index}\n gap=\"1.5\"\n style={{ opacity: chart.getSeriesOpacity(seriesName, 0.6) }}\n onClick={() => {\n if (interaction === 'click' && seriesName) {\n chart.setHighlightedSeries((prev) => (prev === seriesName ? null : seriesName))\n }\n }}\n onMouseEnter={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(seriesName)\n }\n }}\n onMouseLeave={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(null)\n }\n }}\n {...itemProps}\n >\n {config?.icon ? (\n config.icon\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={config?.color ? chart.color(config.color) : 'border.emphasized'}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n {...indicatorProps}\n />\n )}\n <Span color=\"fg.muted\" {...labelProps}>\n {toRenderableValue(label)}\n </Span>\n </HStack>\n )\n })}\n </Flex>\n </Stack>\n )\n}\n\nfunction ChartLegend(props: ChartRechartsLegendProps) {\n const {\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n title,\n nameKey,\n interaction,\n spacing,\n payload,\n align,\n verticalAlign,\n layout,\n ...legendProps\n } = props\n\n return (\n <RechartsLegend\n {...legendProps}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n content={\n <ChartLegendContent\n rootProps={rootProps}\n itemProps={itemProps}\n labelProps={labelProps}\n indicatorProps={indicatorProps}\n title={title}\n nameKey={nameKey}\n interaction={interaction}\n spacing={spacing}\n payload={payload}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n />\n }\n />\n )\n}\n\nfunction ChartRechartsTooltip(props: ChartRechartsTooltipProps) {\n return <RechartsTooltip {...props} content={<ChartTooltip {...props} />} />\n}\n\nfunction ChartRoot<T>({ fontFamily = 'body', fontSize = 16, ...props }: ChartRootProps<T>) {\n const scale = getGovukTypeScale(fontSize)\n if (!scale) {\n console.warn(\n `[GOV.UK Chart] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n } else {\n return (\n <ChartContext.Provider value={props.chart as UseChartReturn<unknown>}>\n <ChakraChart.Root\n fontFamily={fontFamily}\n css={{\n '& svg.recharts-surface tspan': {\n fontSize: { base: scale.small.fontSize, md: scale.large.fontSize },\n lineHeight: { base: scale.small.lineHeight, md: scale.large.lineHeight },\n color: 'fg',\n fontFamily: fonts.body.value,\n },\n '& .recharts-tooltip-wrapper': {\n background: 'var(--govuk-colors-bg)',\n borderRadius: 'var(--govuk-radii-l2)',\n },\n }}\n {...props}\n />\n </ChartContext.Provider>\n )\n }\n}\n\nexport { ChartRoot }\n\nexport const Chart = Object.assign(ChartRoot, {\n ...ChakraChart,\n Root: ChartRoot,\n Legend: ChartLegend,\n LegendContent: ChartLegendContent,\n Tooltip: ChartRechartsTooltip,\n TooltipContent: ChartTooltip,\n})\n","import type { UseChartReturn } from '@chakra-ui/charts'\nimport { PieChart as ChakraDonutChart } from 'recharts'\nimport type { ComponentPropsWithoutRef } from 'react'\n\nimport { Chart, type ChartRootProps } from '@/components/Chart'\n\nexport interface DonutChartProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraDonutChart>,\n 'data'\n> {\n chart: UseChartReturn<T>\n chartRootProps?: Omit<ChartRootProps<T>, 'chart' | 'children'>\n}\n\nfunction DonutChartRoot<T>({ chart, chartRootProps, ...props }: DonutChartProps<T>) {\n return (\n <Chart.Root chart={chart} {...chartRootProps}>\n <ChakraDonutChart data={chart.data} {...props} />\n </Chart.Root>\n )\n}\n\nexport { DonutChartRoot }\n\nexport const DonutChart = Object.assign(DonutChartRoot, {\n Root: DonutChartRoot,\n})\n"],"mappings":";;;;;;;;AASA,IAAa,IAAO,EAA4C,SAC9D,EAAE,aAAU,gBAAa,KAAK,GAAG,KACjC,GACA;CACA,AAAI,OAAO,KAAa,YAAY,EAAE,KAAY,MAChD,QAAQ,KACN,2BAA2B,EAAS,kFACtC;CAGF,IAAM,IAAQ,EAAkB,CAAQ;CAexC,OAbI,IAEA,kBAAC,GAAD;EACO;EACL,UAAU;GAAE,MAAM,EAAM,MAAM;GAAU,IAAI,EAAM,MAAM;EAAS;EACjE,YAAY;GAAE,MAAM,EAAM,MAAM;GAAY,IAAI,EAAM,MAAM;EAAW;EAC3D;EACZ,YAAW;EACX,GAAI;CACL,CAAA,IAKH,kBAAC,GAAD;EACO;EACK;EACE;EACZ,GAAI;CACL,CAAA;AAEL,CAAC,GCOK,IAAe,EAA8C,IAAI;AAEvE,SAAS,IAAuB;CAC9B,IAAM,IAAQ,EAAW,CAAY;CAErC,IAAI,CAAC,GACH,MAAU,MAAM,qDAAqD;CAGvE,OAAO;AACT;AAEA,SAAS,EAAe,GAAuC,GAAc;CACvE,OAAC,KAAQ,CAAC,KAAO,OAAO,EAAK,WAAY,YAAY,EAAK,YAAY,OAK1E,OADgB,EAAK,QACN;AACjB;AAEA,SAAS,EAAkB,GAA2B;CAqBpD,OApBI,KAAS,OACJ,KAGL,EAAe,CAAK,KAIpB,OAAO,KAAU,YAAY,OAAO,KAAU,WACzC,IAGL,OAAO,KAAU,aAAa,OAAO,KAAU,WAC1C,OAAO,CAAK,IAGjB,MAAM,QAAQ,CAAK,IACd,EAAM,KAAK,IAAI,IAGjB,OAAO,CAAK;AACrB;AAEA,SAAS,EAAgB,GAAgB;CAKvC,OAJI,OAAO,KAAU,YAAY,EAAM,WAAW,IACzC,IAGF,EAAM,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAM,MAAM,CAAC;AACtD;AAEA,SAAS,EAAa,EACpB,SAAS,GACT,UACA,mBACA,cACA,kBACA,oBACA,cACA,eACA,YACA,cACA,aAC0B;CAC1B,IAAM,IAAQ,EAAqB,GAC7B,IAAU,GAAa,QAAQ,MAAS,EAAK,UAAU,UAAU,EAAK,SAAS,MAAM;CAE3F,IAAI,CAAC,GAAS,QACZ,OAAO;CAGT,IAAM,IAAkB,GAClB,IAAY,EAAQ,IACpB,IAAW,EAAe,GAAW,CAAO,KAAK,KAAS,GAAW,WAAW,SAChF,IAAe,EACnB,IAAiB,OAAO,CAAQ,GAAG,CAAe,KAAK,CACzD,GACM,IAAQ,EAAQ,QAAQ,GAAK,MAC1B,OAAO,EAAK,SAAU,WAAW,IAAM,EAAK,QAAQ,GAC1D,CAAC;CAEJ,OACE,kBAAC,GAAD;EACE,MAAM,IAAa,KAAA,IAAY;EAC/B,KAAI;EACJ,SAAQ;EACR,IAAG;EACH,IAAG;EACH,IAAG;EACH,WAAU;EACV,QAAO;EART,UAAA;GAUI,IAA8D,OAAlD,kBAAC,GAAD;IAAM,YAAW;IAAU,UAAA;GAAmB,CAAA;GAC5D,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,GAAM,MAAU;IAC5B,IAAM,IAAS,EAAM,UAAU,CAAI;IAEnC,IAAI,GACF,OAAO,kBAAC,GAAD,EAAA,UAAkB,EAAO,CAA+B,EAAO,GAArD,CAAqD;IAGxE,IAAM,IAAY,IACd,EAAU,EAAK,OAAO,EAAK,IAAI,IAC/B,EAAK,OAAO,eAAe,GACzB,CAAC,GAAgB,KAAiB,MAAM,QAAQ,CAAS,IAC3D,IACA,CAAC,GAAW,EAAgB,EAAK,IAAI,CAAC;IAE1C,OACE,kBAAC,GAAD;KAAkB,KAAI;KAAM,MAAK;KAAO,OAAM;KAA9C,UAAA,CACI,IAoBE,OAnBF,GAAQ,QACN,kBAAC,GAAD;MACE,SAAQ;MACR,SAAQ;MACR,IAAI,EAAM,MAAM,EAAO,KAAK;MAC5B,aAAY;MACZ,aAAY;MACZ,YAAY;KACb,CAAA,IAED,kBAAC,GAAD;MACE,SAAQ;MACR,SAAQ;MACR,IAAG;MACH,aAAY;MACZ,aAAY;MACZ,YAAY;KACb,CAAA,GAGL,kBAAC,GAAD;MAAQ,SAAQ;MAAgB,MAAK;MAArC,UAAA,CACI,IAEE,OADF,kBAAC,GAAD;OAAM,OAAM;OAAY,UAAA,EAAkB,CAAa;MAAQ,CAAA,GAEhE,EAAK,SAAS,OAIX,OAHF,kBAAC,GAAD;OAAM,YAAW;OAAO,YAAW;OAAS,oBAAmB;OAC5D,UAAA,EAAkB,CAAc;MAC7B,CAAA,CAEF;KACJ,CAAA,CAAA;IAhCK,GAAA,CAgCL;GAEV,CAAC,EACE,CAAA;GACJ,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAW,IAAG,IAAK,CAAA,GACnB,kBAAC,GAAD;IAAQ,KAAI;IAAI,SAAQ;IAAgB,IAAG;IAA3C,UAAA,CACE,kBAAC,GAAD;KAAM,OAAM;KAAW,UAAA;IAAW,CAAA,GAClC,kBAAC,GAAD;KAAM,YAAW;KAAO,YAAW;KAAS,oBAAmB;KAC5D,UAAA,WACU;MACL,IAAM,IAAY,EAAU,GAAO,EAAE;MACrC,OAAO,MAAM,QAAQ,CAAS,IAAI,EAAU,KAAK;KACnD,EAAA,CAAG,IACH,EAAM,eAAe;IACrB,CAAA,CACA;GACR,CAAA,CAAA,EAAA,CAAA,IACA;EACC;;AAEX;AAEA,SAAS,EAAmB,EAC1B,YACA,mBAAgB,UAChB,WAAQ,UACR,UACA,gBACA,YACA,aAAU,KACV,iBAAc,SACd,cACA,cACA,eACA,qBAC0B;CAC1B,IAAM,IAAQ,EAAqB,GAC7B,IAAkB,GAAS,QAAQ,MAAS,EAAK,UAAU,UAAU,EAAK,SAAS,MAAM;CAE/F,IAAI,CAAC,GAAiB,QACpB,OAAO;CAGT,IAAM,IAAe,OAAO,KAAY,WAAW,GAAG,EAAQ,MAAM,EAAM,QAAQ,CAAO;CAOzF,OACE,kBAAC,GAAD;EACE,KAAI;EACJ,OAAO;GART,MAAM;GACN,QAAQ;GACR,OAAO;EAME,EAAS;EAChB,IAAI,MAAkB,WAAW,MAAM,KAAA;EACvC,IAAI,MAAkB,QAAQ,MAAM,KAAA;EACpC,GAAI;EALN,UAAA,CAOG,IAAQ,kBAAC,GAAD;GAAM,YAAW;GAAU,UAAA;EAAY,CAAA,IAAI,MACpD,kBAAC,GAAD;GACE,oBAAkB;GAClB,KAAK;GACL,WAAW;IAAE,aAAa;IAAO,WAAW;GAAS;GACrD,OAAO;IAAE,aAAa;IAAU,WAAW;GAAa;GACxD,UAAS;GAER,UAAA,EAAgB,KAAK,GAAM,MAAU;IACpC,IAAM,IAAS,EAAM,UAAU,CAAI,GAC7B,IACJ,GAAQ,QAAQ,OACZ,KAAA,IACA,OAAO,EAAO,QAAS,WACrB,EAAO,OACP,OAAO,EAAO,IAAI,GAEpB,IAAQ,EADD,EAAe,GAA6B,CAC3B,KAAQ,GAAQ,KAAK;IAEnD,OACE,kBAAC,GAAD;KAEE,KAAI;KACJ,OAAO,EAAE,SAAS,EAAM,iBAAiB,GAAY,EAAG,EAAE;KAC1D,eAAe;MACb,AAAI,MAAgB,WAAW,KAC7B,EAAM,sBAAsB,MAAU,MAAS,IAAa,OAAO,CAAW;KAElF;KACA,oBAAoB;MAClB,AAAI,MAAgB,WAAW,KAC7B,EAAM,qBAAqB,CAAU;KAEzC;KACA,oBAAoB;MAClB,AAAI,MAAgB,WAAW,KAC7B,EAAM,qBAAqB,IAAI;KAEnC;KACA,GAAI;KAnBN,UAAA,CAqBG,GAAQ,OACP,EAAO,OAEP,kBAAC,GAAD;MACE,SAAQ;MACR,SAAQ;MACR,IAAI,GAAQ,QAAQ,EAAM,MAAM,EAAO,KAAK,IAAI;MAChD,aAAY;MACZ,aAAY;MACZ,YAAY;MACZ,GAAI;KACL,CAAA,GAEH,kBAAC,GAAD;MAAM,OAAM;MAAW,GAAI;MACxB,UAAA,EAAkB,CAAK;KACpB,CAAA,CACA;IApCD,GAAA,CAoCC;GAEZ,CAAC;EACG,CAAA,CACD;;AAEX;AAEA,SAAS,EAAY,GAAiC;CACpD,IAAM,EACJ,cACA,cACA,eACA,mBACA,UACA,YACA,gBACA,YACA,YACA,UACA,kBACA,WACA,GAAG,MACD;CAEJ,OACE,kBAAC,GAAD;EACE,GAAI;EACG;EACQ;EACP;EACR,SACE,kBAAC,GAAD;GACa;GACA;GACC;GACI;GACT;GACE;GACI;GACJ;GACA;GACF;GACQ;GACP;EACT,CAAA;CAEJ,CAAA;AAEL;AAEA,SAAS,EAAqB,GAAkC;CAC9D,OAAO,kBAAC,GAAD;EAAiB,GAAI;EAAO,SAAS,kBAAC,GAAD,EAAc,GAAI,EAAQ,CAAA;CAAI,CAAA;AAC5E;AAEA,SAAS,EAAa,EAAE,gBAAa,QAAQ,cAAW,IAAI,GAAG,KAA4B;CACzF,IAAM,IAAQ,EAAkB,CAAQ;CACxC,IAAI,CAAC,GACH,QAAQ,KACN,4BAA4B,EAAS,kFACvC;MAEA,OACE,kBAAC,EAAa,UAAd;EAAuB,OAAO,EAAM;EAClC,UAAA,kBAAC,EAAY,MAAb;GACc;GACZ,KAAK;IACH,gCAAgC;KAC9B,UAAU;MAAE,MAAM,EAAM,MAAM;MAAU,IAAI,EAAM,MAAM;KAAS;KACjE,YAAY;MAAE,MAAM,EAAM,MAAM;MAAY,IAAI,EAAM,MAAM;KAAW;KACvE,OAAO;KACP,YAAY,EAAM,KAAK;IACzB;IACA,+BAA+B;KAC7B,YAAY;KACZ,cAAc;IAChB;GACF;GACA,GAAI;EACL,CAAA;CACoB,CAAA;AAG7B;AAIA,IAAa,IAAQ,OAAO,OAAO,GAAW;CAC5C,GAAG;CACH,MAAM;CACN,QAAQ;CACR,eAAe;CACf,SAAS;CACT,gBAAgB;AAClB,CAAC;;;ACrYD,SAAS,EAAkB,EAAE,UAAO,mBAAgB,GAAG,KAA6B;CAClF,OACE,kBAAC,EAAM,MAAP;EAAmB;EAAO,GAAI;EAC5B,UAAA,kBAAC,GAAD;GAAkB,MAAM,EAAM;GAAM,GAAI;EAAQ,CAAA;CACtC,CAAA;AAEhB;AAIA,IAAa,IAAa,OAAO,OAAO,GAAgB,EACtD,MAAM,EACR,CAAC"}
|
|
1
|
+
{"version":3,"file":"DonutChart-hLl-PYTm.mjs","names":[],"sources":["../src/components/Text/Text.tsx","../src/components/Chart/Chart.tsx","../src/components/DonutChart/DonutChart.tsx"],"sourcesContent":["import { Text as ChakraText, type TextProps as ChakraTextProps } from '@chakra-ui/react'\nimport { forwardRef } from 'react'\nimport { getGovukTypeScale, govukTypeScale, type GovukTypeScalePoint } from '@/utils'\n\nexport interface TextProps extends Omit<ChakraTextProps, 'fontSize' | 'fontWeight'> {\n fontSize?: GovukTypeScalePoint | ChakraTextProps['fontSize']\n fontWeight?: ChakraTextProps['fontWeight']\n}\n\nexport const Text = forwardRef<HTMLParagraphElement, TextProps>(function Text(\n { fontSize, fontWeight = 400, ...props },\n ref\n) {\n if (typeof fontSize === 'number' && !(fontSize in govukTypeScale)) {\n console.warn(\n `[GOV.UK Text] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n }\n\n const scale = getGovukTypeScale(fontSize)\n\n if (scale) {\n return (\n <ChakraText\n ref={ref}\n fontSize={{ base: scale.small.fontSize, md: scale.large.fontSize }}\n lineHeight={{ base: scale.small.lineHeight, md: scale.large.lineHeight }}\n fontWeight={fontWeight}\n fontFamily=\"body\"\n {...props}\n />\n )\n }\n\n return (\n <ChakraText\n ref={ref}\n fontSize={fontSize as ChakraTextProps['fontSize']}\n fontWeight={fontWeight}\n {...props}\n />\n )\n})\n","import { Box, Flex, HStack, Separator, Span, Stack } from '@chakra-ui/react'\nimport { fonts } from '@/theme/fonts'\nimport {\n Chart as ChakraChart,\n type ChartLegendProps as ChakraChartLegendProps,\n type ChartTooltipProps as ChakraChartTooltipProps,\n type UseChartReturn,\n} from '@chakra-ui/charts'\nimport {\n createContext,\n isValidElement,\n useContext,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react'\nimport { Legend as RechartsLegend, Tooltip as RechartsTooltip } from 'recharts'\nimport type { Payload } from 'recharts/types/component/DefaultTooltipContent'\nimport type { TooltipPayloadEntry } from 'recharts/types/state/tooltipSlice'\nimport { getGovukTypeScale } from '@/utils'\nimport { Text } from '../Text'\n\nexport interface ChartRootProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraChart.Root>,\n 'chart'\n> {\n chart: UseChartReturn<T>\n}\n\nexport type ChartRechartsTooltipProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsTooltip>,\n 'content'\n> &\n ChakraChartTooltipProps\n\nexport interface ChartLegendContentProps extends ChakraChartLegendProps {\n orientation?: 'horizontal' | 'vertical'\n spacing?: string | number\n rootProps?: ComponentPropsWithoutRef<typeof Stack>\n itemProps?: ComponentPropsWithoutRef<typeof HStack>\n labelProps?: ComponentPropsWithoutRef<typeof Span>\n indicatorProps?: ComponentPropsWithoutRef<typeof Box>\n}\n\nexport type ChartRechartsLegendProps = Omit<\n ComponentPropsWithoutRef<typeof RechartsLegend>,\n 'content'\n> &\n ChartLegendContentProps\n\nconst ChartContext = createContext<UseChartReturn<unknown> | null>(null)\n\nfunction useGovukChartContext() {\n const chart = useContext(ChartContext)\n\n if (!chart) {\n throw new Error('Chart components must be rendered inside Chart.Root')\n }\n\n return chart\n}\n\nfunction getPayloadProp(item: TooltipPayloadEntry | undefined, key?: string) {\n if (!item || !key || typeof item.payload !== 'object' || item.payload === null) {\n return undefined\n }\n\n const payload = item.payload as Record<string, unknown>\n return payload[key]\n}\n\nfunction toRenderableValue(value: unknown): ReactNode {\n if (value == null) {\n return ''\n }\n\n if (isValidElement(value)) {\n return value\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n if (typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value)\n }\n\n if (Array.isArray(value)) {\n return value.join(', ')\n }\n\n return String(value)\n}\n\nfunction capitalizeLabel(value: unknown) {\n if (typeof value !== 'string' || value.length === 0) {\n return value\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nfunction ChartTooltip({\n payload: payloadProp,\n label,\n labelFormatter,\n hideLabel,\n hideIndicator,\n hideSeriesLabel,\n showTotal,\n fitContent,\n nameKey,\n formatter,\n render,\n}: ChakraChartTooltipProps) {\n const chart = useGovukChartContext()\n const payload = payloadProp?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!payload?.length) {\n return null\n }\n\n const callbackPayload = payload as Array<Payload<string | number, string>>\n const firstItem = payload[0]\n const rawLabel = getPayloadProp(firstItem, nameKey) ?? label ?? firstItem?.dataKey ?? 'value'\n const tooltipLabel = toRenderableValue(\n labelFormatter?.(String(rawLabel), callbackPayload) ?? rawLabel\n )\n const total = payload.reduce((sum, item) => {\n return typeof item.value === 'number' ? sum + item.value : sum\n }, 0)\n\n return (\n <Stack\n minW={fitContent ? undefined : '8rem'}\n gap=\"1\"\n rounded=\"l2\"\n bg=\"bg.panel\"\n px=\"2.5\"\n py=\"1\"\n textStyle=\"xs\"\n shadow=\"md\"\n >\n {!hideLabel ? <Text fontWeight=\"medium\">{tooltipLabel}</Text> : null}\n <Box>\n {payload.map((item, index) => {\n const config = chart.getSeries(item)\n\n if (render) {\n return <Box key={index}>{render(item as Payload<string, string>)}</Box>\n }\n\n const formatted = formatter\n ? formatter(item.value, item.name)\n : item.value?.toLocaleString()\n const [formattedValue, formattedName] = Array.isArray(formatted)\n ? formatted\n : [formatted, capitalizeLabel(item.name)]\n\n return (\n <Flex key={index} gap=\"1.5\" wrap=\"wrap\" align=\"center\">\n {!hideIndicator ? (\n config?.color ? (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={chart.color(config.color)}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg=\"border.emphasized\"\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n />\n )\n ) : null}\n <HStack justify=\"space-between\" flex=\"1\">\n {!hideSeriesLabel ? (\n <Text color=\"fg.muted\">{toRenderableValue(formattedName)}</Text>\n ) : null}\n {item.value != null ? (\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {toRenderableValue(formattedValue)}\n </Text>\n ) : null}\n </HStack>\n </Flex>\n )\n })}\n </Box>\n {showTotal ? (\n <>\n <Separator mt=\"1\" />\n <HStack gap=\"1\" justify=\"space-between\" pb=\"1\">\n <Span color=\"fg.muted\">Total</Span>\n <Text fontFamily=\"mono\" fontWeight=\"medium\" fontVariantNumeric=\"tabular-nums\">\n {formatter\n ? (() => {\n const formatted = formatter(total, '')\n return Array.isArray(formatted) ? formatted[0] : formatted\n })()\n : total.toLocaleString()}\n </Text>\n </HStack>\n </>\n ) : null}\n </Stack>\n )\n}\n\nfunction ChartLegendContent({\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n title,\n orientation,\n nameKey,\n spacing = '3',\n interaction = 'hover',\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n}: ChartLegendContentProps) {\n const chart = useGovukChartContext()\n const filteredPayload = payload?.filter((item) => item.color !== 'none' || item.type !== 'none')\n\n if (!filteredPayload?.length) {\n return null\n }\n\n const spacingValue = typeof spacing === 'number' ? `${spacing}px` : chart.spacing(spacing)\n const alignMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n } as const\n\n return (\n <Stack\n gap=\"1.5\"\n align={alignMap[align]}\n pt={verticalAlign === 'bottom' ? '3' : undefined}\n pb={verticalAlign === 'top' ? '3' : undefined}\n {...rootProps}\n >\n {title ? <Text fontWeight=\"medium\">{title}</Text> : null}\n <Flex\n data-orientation={orientation}\n gap={spacingValue}\n direction={{ _horizontal: 'row', _vertical: 'column' }}\n align={{ _horizontal: 'center', _vertical: 'flex-start' }}\n flexWrap=\"wrap\"\n >\n {filteredPayload.map((item, index) => {\n const config = chart.getSeries(item)\n const seriesName =\n config?.name == null\n ? undefined\n : typeof config.name === 'string'\n ? config.name\n : String(config.name)\n const name = getPayloadProp(item as TooltipPayloadEntry, nameKey)\n const label = capitalizeLabel(name ?? config?.label)\n\n return (\n <HStack\n key={index}\n gap=\"1.5\"\n style={{ opacity: chart.getSeriesOpacity(seriesName, 0.6) }}\n onClick={() => {\n if (interaction === 'click' && seriesName) {\n chart.setHighlightedSeries((prev) => (prev === seriesName ? null : seriesName))\n }\n }}\n onMouseEnter={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(seriesName)\n }\n }}\n onMouseLeave={() => {\n if (interaction === 'hover' && seriesName) {\n chart.setHighlightedSeries(null)\n }\n }}\n {...itemProps}\n >\n {config?.icon ? (\n config.icon\n ) : (\n <Box\n boxSize=\"2\"\n rounded=\"full\"\n bg={config?.color ? chart.color(config.color) : 'border.emphasized'}\n borderWidth=\"1px\"\n borderColor=\"blackAlpha.200\"\n flexShrink={0}\n {...indicatorProps}\n />\n )}\n <Span color=\"fg.muted\" {...labelProps}>\n {toRenderableValue(label)}\n </Span>\n </HStack>\n )\n })}\n </Flex>\n </Stack>\n )\n}\n\nfunction ChartLegend(props: ChartRechartsLegendProps) {\n const {\n rootProps,\n itemProps,\n labelProps,\n indicatorProps,\n title,\n nameKey,\n interaction,\n spacing,\n payload,\n align,\n verticalAlign,\n layout,\n ...legendProps\n } = props\n\n return (\n <RechartsLegend\n {...legendProps}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n content={\n <ChartLegendContent\n rootProps={rootProps}\n itemProps={itemProps}\n labelProps={labelProps}\n indicatorProps={indicatorProps}\n title={title}\n nameKey={nameKey}\n interaction={interaction}\n spacing={spacing}\n payload={payload}\n align={align}\n verticalAlign={verticalAlign}\n layout={layout}\n />\n }\n />\n )\n}\n\nfunction ChartRechartsTooltip(props: ChartRechartsTooltipProps) {\n return <RechartsTooltip {...props} content={<ChartTooltip {...props} />} />\n}\n\nfunction ChartRoot<T>({ fontFamily = 'body', fontSize = 16, ...props }: ChartRootProps<T>) {\n const scale = getGovukTypeScale(fontSize)\n if (!scale) {\n console.warn(\n `[GOV.UK Chart] fontSize={${fontSize}} is not a valid GOV.UK type scale point. Use one of: 16, 19, 24, 27, 36, 48, 80.`\n )\n } else {\n return (\n <ChartContext.Provider value={props.chart as UseChartReturn<unknown>}>\n <ChakraChart.Root\n fontFamily={fontFamily}\n css={{\n '& svg.recharts-surface tspan': {\n fontSize: { base: scale.small.fontSize, md: scale.large.fontSize },\n lineHeight: { base: scale.small.lineHeight, md: scale.large.lineHeight },\n color: 'fg',\n fontFamily: fonts.body.value,\n },\n '& .recharts-tooltip-wrapper': {\n background: 'var(--govuk-colors-bg)',\n borderRadius: 'var(--govuk-radii-l2)',\n },\n }}\n {...props}\n />\n </ChartContext.Provider>\n )\n }\n}\n\nexport { ChartRoot }\n\nexport const Chart = Object.assign(ChartRoot, {\n ...ChakraChart,\n Root: ChartRoot,\n Legend: ChartLegend,\n LegendContent: ChartLegendContent,\n Tooltip: ChartRechartsTooltip,\n TooltipContent: ChartTooltip,\n})\n","import type { UseChartReturn } from '@chakra-ui/charts'\nimport { PieChart as ChakraDonutChart } from 'recharts'\nimport type { ComponentPropsWithoutRef } from 'react'\n\nimport { Chart, type ChartRootProps } from '@/components/Chart'\n\nexport interface DonutChartProps<T> extends Omit<\n ComponentPropsWithoutRef<typeof ChakraDonutChart>,\n 'data'\n> {\n chart: UseChartReturn<T>\n chartRootProps?: Omit<ChartRootProps<T>, 'chart' | 'children'>\n}\n\nfunction DonutChartRoot<T>({ chart, chartRootProps, ...props }: DonutChartProps<T>) {\n return (\n <Chart.Root chart={chart} {...chartRootProps}>\n <ChakraDonutChart data={chart.data} {...props} />\n </Chart.Root>\n )\n}\n\nexport { DonutChartRoot }\n\nexport const DonutChart = Object.assign(DonutChartRoot, {\n Root: DonutChartRoot,\n})\n"],"mappings":"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"}
|
package/dist/chakra.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./provider-CYEYtfuU.js"),t=require("./govUKTheme-CsiNVb8x.js"),n=require("./govuk-chakra-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./provider-CYEYtfuU.js"),t=require("./govUKTheme-CsiNVb8x.js"),n=require("./govuk-chakra-NZ5MieX-.js"),r=require("./DonutChart-By-HroDD.js"),i=require("./Button-DZLug9I8.js");exports.Accordion=n.Dt,exports.Alert=n.Tt,exports.Avatar=n.wt,exports.BackLink=n.Ct,exports.Breadcrumbs=n.St,exports.Button=i.t,exports.Calendar=n.xt,exports.Card=n.yt,exports.CardGroup=n.bt,exports.Carousel=n.vt,exports.Checkbox=n.gt,exports.Code=n.ht,exports.Collapsible=n.mt,exports.ColorPicker=n.pt,exports.ColorSwatch=n.ft,exports.Combobox=n.dt,exports.CookieBanner=n.ut,exports.DateInput=n.lt,exports.Details=n.ct,exports.Dialog=n.st,exports.DonutChart=r.t,exports.Editable=n.ot,exports.EmptyState=n.at,exports.ErrorSummary=n.it,exports.Fieldset=n._t,exports.FileUpload=n.rt,exports.FloatingPanel=n.nt,exports.GOVUKCrest=n.et,exports.GOVUKCrown=n.$,exports.GOVUKFooter=n.Q,exports.GOVUKHeader=n.Z,exports.GOVUKOGL=n.X,exports.GOVUKProvider=e.t,exports.GenericHeader=n.tt,exports.Heading=n.Et,exports.Highlight=n.Y,exports.HoverCard=n.J,exports.IconButton=n.q,exports.Image=n.K,exports.InsetText=n.G,exports.Kbd=n.W,exports.LanguageNavigation=n.U,exports.Link=n.Ot,exports.Listbox=n.H,exports.Marquee=n.V,exports.Menu=n.B,exports.NotificationBanner=n.z,exports.Pagination=n.R,exports.Panel=n.L,exports.PhaseBanner=n.t,exports.PinInput=n.I,exports.Popover=n.F,exports.Progress=n.P,exports.ProgressCircle=n.N,exports.QRCode=n.M,exports.Radio=n.j,exports.RadioCard=n.A,exports.Rating=n.k,exports.ScrollArea=n.O,exports.SegmentedControl=n.E,exports.Select=n.D,exports.Separator=n.T,exports.ServiceNavigation=n.w,exports.Skeleton=n.C,exports.SkipLink=n.S,exports.Slider=n.x,exports.Spinner=n.b,exports.Stat=n.y,exports.Status=n.v,exports.Steps=n._,exports.SummaryList=n.g,exports.Switch=n.h,exports.Table=n.m,exports.Tabs=n.p,exports.Tag=n.n,exports.TagsInput=n.f,exports.TaskList=n.d,exports.Text=r.r,exports.Textarea=n.u,exports.Textinput=n.l,exports.Timeline=n.c,exports.Toast=n.s,exports.ToggleTip=n.o,exports.Tooltip=n.a,exports.TreeView=n.i,exports.WarningText=n.r,exports.govUKTheme=t.t,exports.govUKThemeSystem=t.n;var a=require("@chakra-ui/react");Object.keys(a).forEach(function(e){e!=="default"&&!Object.prototype.hasOwnProperty.call(exports,e)&&Object.defineProperty(exports,e,{enumerable:!0,get:function(){return a[e]}})});
|
package/dist/chakra.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as e } from "./provider-pKYp1gHz.mjs";
|
|
2
2
|
import { n as t, t as n } from "./govUKTheme-B4LmrRd_.mjs";
|
|
3
|
-
import { $ as r, A as i, B as a, C as o, Ct as s, D as c, Dt as l, E as u, Et as d, F as f, G as p, H as m, I as h, J as g, K as _, L as v, M as y, N as b, O as x, Ot as S, P as C, Q as w, R as T, S as E, St as D, T as O, Tt as k, U as A, V as j, W as M, X as N, Y as P, Z as F, _ as I, _t as L, a as R, at as z, b as B, bt as V, c as H, ct as U, d as W, dt as G, et as K, f as q, ft as J, g as Y, gt as X, h as Z, ht as Q, i as $, it as ee, j as te, k as ne, l as re, lt as ie, m as ae, mt as oe, n as se, nt as ce, o as le, ot as ue, p as de, pt as fe, q as pe, r as me, rt as he, s as ge, st as _e, t as ve, tt as ye, u as be, ut as xe, v as Se, vt as Ce, w as we, wt as Te, x as Ee, xt as De, y as Oe, yt as ke, z as Ae } from "./govuk-chakra-
|
|
4
|
-
import { r as je, t as Me } from "./DonutChart-
|
|
3
|
+
import { $ as r, A as i, B as a, C as o, Ct as s, D as c, Dt as l, E as u, Et as d, F as f, G as p, H as m, I as h, J as g, K as _, L as v, M as y, N as b, O as x, Ot as S, P as C, Q as w, R as T, S as E, St as D, T as O, Tt as k, U as A, V as j, W as M, X as N, Y as P, Z as F, _ as I, _t as L, a as R, at as z, b as B, bt as V, c as H, ct as U, d as W, dt as G, et as K, f as q, ft as J, g as Y, gt as X, h as Z, ht as Q, i as $, it as ee, j as te, k as ne, l as re, lt as ie, m as ae, mt as oe, n as se, nt as ce, o as le, ot as ue, p as de, pt as fe, q as pe, r as me, rt as he, s as ge, st as _e, t as ve, tt as ye, u as be, ut as xe, v as Se, vt as Ce, w as we, wt as Te, x as Ee, xt as De, y as Oe, yt as ke, z as Ae } from "./govuk-chakra-DvWJuAiD.mjs";
|
|
4
|
+
import { r as je, t as Me } from "./DonutChart-hLl-PYTm.mjs";
|
|
5
5
|
import { t as Ne } from "./Button-BmDGyjW7.mjs";
|
|
6
6
|
export * from "@chakra-ui/react";
|
|
7
7
|
export { l as Accordion, k as Alert, Te as Avatar, s as BackLink, D as Breadcrumbs, Ne as Button, De as Calendar, ke as Card, V as CardGroup, Ce as Carousel, X as Checkbox, Q as Code, oe as Collapsible, fe as ColorPicker, J as ColorSwatch, G as Combobox, xe as CookieBanner, ie as DateInput, U as Details, _e as Dialog, Me as DonutChart, ue as Editable, z as EmptyState, ee as ErrorSummary, L as Fieldset, he as FileUpload, ce as FloatingPanel, K as GOVUKCrest, r as GOVUKCrown, w as GOVUKFooter, F as GOVUKHeader, N as GOVUKOGL, e as GOVUKProvider, ye as GenericHeader, d as Heading, P as Highlight, g as HoverCard, pe as IconButton, _ as Image, p as InsetText, M as Kbd, A as LanguageNavigation, S as Link, m as Listbox, j as Marquee, a as Menu, Ae as NotificationBanner, T as Pagination, v as Panel, ve as PhaseBanner, h as PinInput, f as Popover, C as Progress, b as ProgressCircle, y as QRCode, te as Radio, i as RadioCard, ne as Rating, x as ScrollArea, u as SegmentedControl, c as Select, O as Separator, we as ServiceNavigation, o as Skeleton, E as SkipLink, Ee as Slider, B as Spinner, Oe as Stat, Se as Status, I as Steps, Y as SummaryList, Z as Switch, ae as Table, de as Tabs, se as Tag, q as TagsInput, W as TaskList, je as Text, be as Textarea, re as Textinput, H as Timeline, ge as Toast, le as ToggleTip, R as Tooltip, $ as TreeView, me as WarningText, n as govUKTheme, t as govUKThemeSystem };
|
package/dist/charts.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./px-to-rem-CwuxPF53.js"),t=require("./DonutChart-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./px-to-rem-CwuxPF53.js"),t=require("./DonutChart-By-HroDD.js");let n=require("@chakra-ui/react"),r=require("react/jsx-runtime"),i=require("react"),a=require("recharts"),o=require("@chakra-ui/charts");function s({chart:e,chartRootProps:n,style:i,...o}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.AreaChart,{data:e.data,style:{...i},...o})})}var c=Object.assign(s,{Root:s});function l({chart:e,chartRootProps:n,...i}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.BarChart,{data:e.data,...i})})}var u=Object.assign(l,{Root:l}),d=(0,i.createContext)(null);function f(){let e=(0,i.useContext)(d);if(!e)throw Error(`BarList components must be rendered inside BarList.Root`);return e}var p=({chart:e,barSize:t=`10`,children:i,...a})=>(0,r.jsx)(n.Box,{...a,css:{"--bar-size":e.size(t)},children:(0,r.jsx)(d.Provider,{value:e,children:i})}),m=e=>(0,r.jsx)(n.HStack,{textStyle:`md`,mb:`4`,fontWeight:`medium`,...e}),h=e=>(0,r.jsx)(n.Flex,{flexWrap:`nowrap`,align:`flex-end`,gap:`4`,...e}),g=({payload:e,labelFormatter:t,...i})=>{let a=f(),o=t||a.formatNumber({style:`decimal`});return!e||a.highlightedSeries!==e.name?null:(0,r.jsx)(n.AbsoluteCenter,{display:{base:`none`,_groupHover:`block`},axis:`vertical`,right:`2`,zIndex:`1`,textStyle:`xs`,fontWeight:`medium`,bg:`bg.panel`,px:`1.5`,py:`1`,rounded:`l2`,shadow:`xs`,pointerEvents:`none`,...i,children:o(e.value)})},_=Object.assign(p,{Root:p,Title:m,Content:h,Tooltip:g,Bar:({label:e,tooltip:a,...o})=>{let s=f(),c=s.series[0],l=(0,i.useCallback)(e=>s.getValuePercent(`value`,e,e=>[0,e.max]),[s]),u=(0,i.useCallback)(e=>{let t=s.getSeries(e)?.color??s.getSeries({name:e.name})?.color??c?.color??e.color;return t?s.color(t):s.color(`blue.500`)},[s,c?.color]);return(0,r.jsx)(n.Stack,{flex:`1`,...o,children:s.data.map((i,o)=>(0,r.jsx)(n.HStack,{className:`bar-list_item`,flex:1,minH:`var(--bar-size)`,w:`full`,gap:`8`,_hover:{bg:`bg.subtle`},onMouseMove:()=>{a&&s.highlightedSeries!==i.name&&s.setHighlightedSeries(i.name)},onMouseLeave:()=>{a&&s.setHighlightedSeries(null)},children:(0,r.jsxs)(n.Box,{pos:`relative`,flex:`1`,className:`group`,children:[typeof a==`function`?a({payload:i}):null,typeof a==`boolean`&&a?(0,r.jsx)(g,{payload:i}):null,(0,r.jsx)(n.Box,{pos:`absolute`,insetStart:`0`,top:`0`,bottom:`0`,bgColor:u(i)?u(i):`blue.500`,rounded:`l2`,width:`var(--bar-width)`,style:{"--bar-width":`${l(i.value)}%`}}),(0,r.jsx)(n.HStack,{flex:`1`,justify:`flex-start`,textStyle:`sm`,pos:`relative`,wordBreak:`break-all`,w:`full`,minH:`var(--bar-size)`,px:`2.5`,className:`barlist-value`,children:(0,r.jsx)(t.r,{fontSize:16,color:`white`,children:(0,r.jsx)(n.Show,{when:e,fallback:i.name,children:e?.({payload:i,index:o})})})})]})},i.name))})},Value:({valueFormatter:e,...i})=>{let a=f(),o=e||a.formatNumber({notation:`compact`,maximumFractionDigits:2});return(0,r.jsx)(n.Stack,{...i,children:a.data.map(e=>(0,r.jsx)(n.HStack,{minH:`var(--bar-size)`,justify:`flex-end`,textStyle:`sm`,fontWeight:`medium`,className:`list_value`,children:(0,r.jsx)(t.r,{color:`fg`,fontSize:16,children:o(e.value)})},e.name))})},Label:({title:e,titleAlignment:i,children:a,...o})=>(0,r.jsxs)(n.Stack,{className:`bar_list_label`,...o,children:[(0,r.jsx)(t.r,{fontSize:19,fontWeight:`medium`,color:`fg`,textAlign:i,children:e}),a]})}),v=({fontFamily:e=`body`,...t})=>(0,r.jsx)(o.BarSegment.Root,{fontFamily:e,...t}),y=Object.assign(v,{Root:v,Content:e=>(0,r.jsx)(o.BarSegment.Content,{...e}),Label:({fontSize:t=16,children:n,...i})=>{let a=e.t(t);if(a)return(0,r.jsx)(o.BarSegment.Label,{...i,className:`labels`,css:{"& > div":{color:`fg.muted`,fontSize:{base:a.small.fontSize,md:a.large.fontSize},lineHeight:{base:a.small.lineHeight,md:a.large.lineHeight},fontWeight:`700`}},children:n})},Bar:e=>(0,r.jsx)(o.BarSegment.Bar,{...e}),Reference:e=>(0,r.jsx)(o.BarSegment.Reference,{...e}),Value:({fontSize:t=16,children:n,...i})=>{let a=e.t(t);if(a)return(0,r.jsx)(o.BarSegment.Value,{...i,className:`values`,css:{"& > div":{color:`fg.muted`,fontSize:{base:a.small.fontSize,md:a.large.fontSize},lineHeight:{base:a.small.lineHeight,md:a.large.lineHeight}}},children:n})},Legend:e=>(0,r.jsx)(o.BarSegment.Legend,{...e,className:`legend`}),Tooltip:e=>(0,r.jsx)(o.BarSegment.Tooltip,{...e})});function b({chart:e,chartRootProps:n,style:i,...o}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.LineChart,{data:e.data,style:{fontFamily:`var(--chakra-fonts-body)`,...i},...o})})}var x=Object.assign(b,{Root:b});function S({chart:e,chartRootProps:n,style:i,...o}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.PieChart,{data:e.data,style:{fontFamily:`var(--chakra-fonts-body)`,...i},...o})})}var C=Object.assign(S,{Root:S});function w({chart:e,chartRootProps:n,...i}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.RadarChart,{data:e.data,...i})})}var T=Object.assign(w,{Root:w});function E({chart:e,chartRootProps:n,...i}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.ScatterChart,{data:e.data,...i})})}var D=Object.assign(E,{Root:E});function O({chart:e,chartRootProps:n,style:i,...o}){return(0,r.jsx)(t.n.Root,{chart:e,...n,children:(0,r.jsx)(a.LineChart,{data:e.data,style:{fontFamily:`var(--chakra-fonts-body)`,...i},...o})})}var k=Object.assign(O,{Root:O});exports.AreaChart=c,exports.BarChart=u,exports.BarList=_,exports.BarSegment=y,exports.Chart=t.n,exports.DonutChart=t.t,exports.LineChart=x,exports.PieChart=C,exports.RadarChart=T,exports.ScatterChart=D,exports.Sparkline=k;
|
|
2
2
|
//# sourceMappingURL=charts.cjs.map
|
package/dist/charts.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "./px-to-rem-DcgNLA9k.mjs";
|
|
2
|
-
import { n as t, r as n, t as r } from "./DonutChart-
|
|
2
|
+
import { n as t, r as n, t as r } from "./DonutChart-hLl-PYTm.mjs";
|
|
3
3
|
import { AbsoluteCenter as i, Box as a, Flex as o, HStack as s, Show as c, Stack as l } from "@chakra-ui/react";
|
|
4
4
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
5
5
|
import { createContext as f, useCallback as p, useContext as m } from "react";
|
|
@@ -3,7 +3,7 @@ import "./provider-pKYp1gHz.mjs";
|
|
|
3
3
|
import { t as e } from "./fieldFocusStyles-DDekTwf2.mjs";
|
|
4
4
|
import { a as t, n, o as r, t as i } from "./px-to-rem-DcgNLA9k.mjs";
|
|
5
5
|
import "./govUKTheme-B4LmrRd_.mjs";
|
|
6
|
-
import { r as a } from "./DonutChart-
|
|
6
|
+
import { r as a } from "./DonutChart-hLl-PYTm.mjs";
|
|
7
7
|
import { n as o, t as s } from "./fa6-B66QVeAG.mjs";
|
|
8
8
|
import { n as c, t as l } from "./io-CkcOP1Jp.mjs";
|
|
9
9
|
import { t as u } from "./md-BNmQVYCf.mjs";
|
|
@@ -5389,4 +5389,4 @@ var To = B(function({ phase: e = "beta", children: t, ...n }, i) {
|
|
|
5389
5389
|
//#endregion
|
|
5390
5390
|
export { En as $, ii as A, dr as B, qi as C, Mt as Ct, ki as D, xt as Dt, Mi as E, G as Et, Br as F, Qn as G, lr as H, zr as I, Jn as J, Zn as K, Nr as L, Ur as M, Hr as N, si as O, W as Ot, Vr as P, Rn as Q, kr as R, Ji as S, Bt as St, Pi as T, At as Tt, cr as U, ur as V, er as W, Gn as X, qn as Y, Wn as Z, da as _, Gt as _t, _o as a, un as at, Zi as b, Ht as bt, uo as c, on as ct, eo as d, Qt as dt, Tn as et, qa as f, Zt as ft, Ea as g, q as gt, Da as h, qt as ht, bo as i, pn as it, ri as j, oi as k, lo as l, J as lt, Va as m, Jt as mt, Co as n, _n as nt, go as o, cn as ot, Ka as p, Xt as pt, Xn as q, xo as r, Z as rt, po as s, sn as st, Ao as t, wn as tt, $ as u, $t as ut, la as v, Wt as vt, Ki as w, jt as wt, Yi as x, Vt as xt, ca as y, K as yt, yr as z };
|
|
5391
5391
|
|
|
5392
|
-
//# sourceMappingURL=govuk-chakra-
|
|
5392
|
+
//# sourceMappingURL=govuk-chakra-DvWJuAiD.mjs.map
|