govuk-chakra 0.1.2 → 0.1.4

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.
Files changed (68) hide show
  1. package/README.md +42 -0
  2. package/dist/DonutChart-By-HroDD.js +2 -0
  3. package/dist/{DonutChart-Dv_SZ-sU.js.map → DonutChart-By-HroDD.js.map} +1 -1
  4. package/dist/{DonutChart-qMSUcNyC.mjs → DonutChart-hLl-PYTm.mjs} +2 -2
  5. package/dist/{DonutChart-qMSUcNyC.mjs.map → DonutChart-hLl-PYTm.mjs.map} +1 -1
  6. package/dist/chakra.cjs +1 -1
  7. package/dist/chakra.mjs +4 -4
  8. package/dist/charts.cjs +1 -1
  9. package/dist/charts.mjs +1 -1
  10. package/dist/{govuk-chakra-0wIbHjYQ.mjs → govuk-chakra-DM6zTEdn.mjs} +879 -814
  11. package/dist/govuk-chakra-DM6zTEdn.mjs.map +1 -0
  12. package/dist/govuk-chakra-tIrdgNx6.js +2 -0
  13. package/dist/govuk-chakra-tIrdgNx6.js.map +1 -0
  14. package/dist/index.cjs +1 -1
  15. package/dist/index.mjs +4 -4
  16. package/dist/types/components/Accordion/Accordion.d.ts +2 -0
  17. package/dist/types/components/Avatar/Avatar.recipe.d.ts +1 -1
  18. package/dist/types/components/BarList/BarList.d.ts +8 -15
  19. package/dist/types/components/Calendar/Calendar.recipe.d.ts +1 -1
  20. package/dist/types/components/Carousel/Carousel.recipe.d.ts +1 -1
  21. package/dist/types/components/Chart/Chart.d.ts +2 -2
  22. package/dist/types/components/ColorPicker/ColorPicker.recipe.d.ts +1 -1
  23. package/dist/types/components/Combobox/Combobox.recipe.d.ts +1 -1
  24. package/dist/types/components/DatePicker/DatePicker.d.ts +39 -39
  25. package/dist/types/components/Dialog/Dialog.recipe.d.ts +1 -1
  26. package/dist/types/components/Editable/Editable.recipe.d.ts +1 -1
  27. package/dist/types/components/EmptyState/EmptyState.recipe.d.ts +1 -1
  28. package/dist/types/components/FloatingPanel/FloatingPanel.recipe.d.ts +1 -1
  29. package/dist/types/components/HoverCard/HoverCard.recipe.d.ts +1 -1
  30. package/dist/types/components/Listbox/Listbox.recipe.d.ts +1 -1
  31. package/dist/types/components/Menu/Menu.recipe.d.ts +1 -1
  32. package/dist/types/components/PinInput/PinInput.recipe.d.ts +1 -1
  33. package/dist/types/components/Popover/Popover.recipe.d.ts +1 -1
  34. package/dist/types/components/ProgressCircle/ProgressCircle.recipe.d.ts +1 -1
  35. package/dist/types/components/Radio/Radio.d.ts +2 -2
  36. package/dist/types/components/RadioCard/RadioCard.recipe.d.ts +1 -1
  37. package/dist/types/components/Rating/Rating.recipe.d.ts +1 -1
  38. package/dist/types/components/RichTextEditor/RichTextEditor.recipe.d.ts +1 -1
  39. package/dist/types/components/ScrollArea/ScrollArea.recipe.d.ts +1 -1
  40. package/dist/types/components/SegmentedControl/SegmentedControl.recipe.d.ts +13 -13
  41. package/dist/types/components/Select/Select.d.ts +24 -24
  42. package/dist/types/components/Slider/Slider.recipe.d.ts +1 -1
  43. package/dist/types/components/Stat/Stat.d.ts +1 -1
  44. package/dist/types/components/Stat/Stat.recipe.d.ts +4 -4
  45. package/dist/types/components/Status/Status.recipe.d.ts +1 -1
  46. package/dist/types/components/StepByStep/StepByStep.d.ts +24 -0
  47. package/dist/types/components/StepByStep/index.d.ts +2 -0
  48. package/dist/types/components/Steps/Steps.recipe.d.ts +1 -1
  49. package/dist/types/components/SummaryList/SummaryList.d.ts +6 -6
  50. package/dist/types/components/Table/Table.d.ts +2 -2
  51. package/dist/types/components/TagsInput/TagsInput.recipe.d.ts +1 -1
  52. package/dist/types/components/Timeline/Timeline.recipe.d.ts +1 -1
  53. package/dist/types/components/Toast/Toast.d.ts +1 -1
  54. package/dist/types/components/Toast/Toast.recipe.d.ts +1 -1
  55. package/dist/types/components/ToggleTip/ToggleTip.recipe.d.ts +1 -1
  56. package/dist/types/components/Tooltip/Tooltip.recipe.d.ts +1 -1
  57. package/dist/types/components/TreeView/TreeView.d.ts +2 -2
  58. package/dist/types/components/TreeView/TreeView.recipe.d.ts +1 -1
  59. package/dist/types/components/index.d.ts +1 -0
  60. package/dist/types/govuk-chakra.d.ts +2 -0
  61. package/dist/types/theme/colors.d.ts +4 -4
  62. package/dist/types/theme/govUKTheme.d.ts +49 -49
  63. package/dist/types/utils/storybookControls.d.ts +10 -10
  64. package/package.json +32 -24
  65. package/dist/DonutChart-Dv_SZ-sU.js +0 -2
  66. package/dist/govuk-chakra-0wIbHjYQ.mjs.map +0 -1
  67. package/dist/govuk-chakra-Aa83RA4r.js +0 -2
  68. package/dist/govuk-chakra-Aa83RA4r.js.map +0 -1
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,23 @@ 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`.
409
+
410
+ ## Checks before committing
411
+
412
+ Enable the tracked Git hook once per clone:
413
+
414
+ ```sh
415
+ yarn hooks:install
416
+ ```
417
+
418
+ Every commit then runs `yarn precommit`: visual regression (`yarn visual:test`, including a Storybook build), lint (`yarn lint`), and unit tests (`yarn test:run`, without watch mode), in that order. Each stage prints its progress and stops the commit immediately if it fails. Run `yarn precommit` manually to check before opening the commit dialog.
419
+
420
+ The check uses CI mode so it tests the freshly built Storybook and does not create missing baselines. Stop any server using port 6006 before running it. Install the browser once with `yarn playwright install chromium` if needed. The hook checks the current working tree, so stage the changes you intend to commit before running it.
421
+
422
+ For intentional visual changes, review the differences, run `yarn visual:update`, inspect and stage the updated screenshots, then commit again.
@@ -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 (!(!e || !t || typeof e.payload != "object" || e.payload === null)) return e.payload[t];
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-qMSUcNyC.mjs.map
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":"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"}
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-Aa83RA4r.js"),r=require("./DonutChart-Dv_SZ-sU.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]}})});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./provider-CYEYtfuU.js"),t=require("./govUKTheme-CsiNVb8x.js"),n=require("./govuk-chakra-tIrdgNx6.js"),r=require("./DonutChart-By-HroDD.js"),i=require("./Button-DZLug9I8.js");exports.Accordion=n.Ot,exports.Alert=n.Et,exports.Avatar=n.Tt,exports.BackLink=n.wt,exports.Breadcrumbs=n.Ct,exports.Button=i.t,exports.Calendar=n.St,exports.Card=n.bt,exports.CardGroup=n.xt,exports.Carousel=n.yt,exports.Checkbox=n._t,exports.Code=n.gt,exports.Collapsible=n.ht,exports.ColorPicker=n.mt,exports.ColorSwatch=n.pt,exports.Combobox=n.ft,exports.CookieBanner=n.dt,exports.DateInput=n.ut,exports.Details=n.lt,exports.Dialog=n.ct,exports.DonutChart=r.t,exports.Editable=n.st,exports.EmptyState=n.ot,exports.ErrorSummary=n.at,exports.Fieldset=n.vt,exports.FileUpload=n.it,exports.FloatingPanel=n.rt,exports.GOVUKCrest=n.tt,exports.GOVUKCrown=n.et,exports.GOVUKFooter=n.$,exports.GOVUKHeader=n.Q,exports.GOVUKOGL=n.Z,exports.GOVUKProvider=e.t,exports.GenericHeader=n.nt,exports.Heading=n.Dt,exports.Highlight=n.X,exports.HoverCard=n.Y,exports.IconButton=n.J,exports.Image=n.q,exports.InsetText=n.K,exports.Kbd=n.G,exports.LanguageNavigation=n.W,exports.Link=n.kt,exports.Listbox=n.U,exports.Marquee=n.H,exports.Menu=n.V,exports.NotificationBanner=n.B,exports.Pagination=n.z,exports.Panel=n.R,exports.PhaseBanner=n.t,exports.PinInput=n.L,exports.Popover=n.I,exports.Progress=n.F,exports.ProgressCircle=n.P,exports.QRCode=n.N,exports.Radio=n.M,exports.RadioCard=n.j,exports.Rating=n.A,exports.ScrollArea=n.k,exports.SegmentedControl=n.D,exports.Select=n.O,exports.Separator=n.E,exports.ServiceNavigation=n.T,exports.Skeleton=n.w,exports.SkipLink=n.C,exports.Slider=n.S,exports.Spinner=n.x,exports.Stat=n.b,exports.Status=n.y,exports.StepByStep=n._,exports.Steps=n.v,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-0wIbHjYQ.mjs";
4
- import { r as je, t as Me } from "./DonutChart-qMSUcNyC.mjs";
5
- import { t as Ne } from "./Button-BmDGyjW7.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, kt as re, l as ie, lt as ae, m as oe, mt as se, n as ce, nt as le, o as ue, ot as de, p as fe, pt as pe, q as me, r as he, rt as ge, s as _e, st as ve, t as ye, tt as be, u as xe, ut as Se, v as Ce, vt as we, w as Te, wt as Ee, x as De, xt as Oe, y as ke, yt as Ae, z as je } from "./govuk-chakra-DM6zTEdn.mjs";
4
+ import { r as Me, t as Ne } from "./DonutChart-hLl-PYTm.mjs";
5
+ import { t as Pe } from "./Button-BmDGyjW7.mjs";
6
6
  export * from "@chakra-ui/react";
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 };
7
+ export { S as Accordion, d as Alert, k as Avatar, Ee as BackLink, s as Breadcrumbs, Pe as Button, D as Calendar, V as Card, Oe as CardGroup, Ae as Carousel, L as Checkbox, X as Code, Q as Collapsible, se as ColorPicker, pe as ColorSwatch, J as Combobox, G as CookieBanner, Se as DateInput, ae as Details, U as Dialog, Ne as DonutChart, ve as Editable, de as EmptyState, z as ErrorSummary, we as Fieldset, ee as FileUpload, ge as FloatingPanel, be as GOVUKCrest, K as GOVUKCrown, r as GOVUKFooter, w as GOVUKHeader, F as GOVUKOGL, e as GOVUKProvider, le as GenericHeader, l as Heading, N as Highlight, P as HoverCard, g as IconButton, me as Image, _ as InsetText, p as Kbd, M as LanguageNavigation, re as Link, A as Listbox, m as Marquee, j as Menu, a as NotificationBanner, je as Pagination, T as Panel, ye as PhaseBanner, v as PinInput, h as Popover, f as Progress, C as ProgressCircle, b as QRCode, y as Radio, te as RadioCard, i as Rating, ne as ScrollArea, c as SegmentedControl, x as Select, u as Separator, O as ServiceNavigation, Te as Skeleton, o as SkipLink, E as Slider, De as Spinner, B as Stat, ke as Status, I as StepByStep, Ce as Steps, Y as SummaryList, Z as Switch, oe as Table, fe as Tabs, ce as Tag, q as TagsInput, W as TaskList, Me as Text, xe as Textarea, ie as Textinput, H as Timeline, _e as Toast, ue as ToggleTip, R as Tooltip, $ as TreeView, he 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-Dv_SZ-sU.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;
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-qMSUcNyC.mjs";
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";