From 7b99f365baf7ff27bdd0ba789bbd047eb2dd2c39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 09:46:47 +0000 Subject: [PATCH] deploy: 5f1453aefda878d0b55c2509c384c6602d543546 --- 404.html | 2 +- assets/js/1d29b0d8.21c83f2c.js | 1 + assets/js/1d29b0d8.8fa1bc20.js | 1 - .../js/{1df93b7f.0fc48f5c.js => 1df93b7f.1ca22ede.js} | 2 +- assets/js/1ff5abae.3774152c.js | 1 + assets/js/1ff5abae.b0c49283.js | 1 - assets/js/44a464d7.bfee92aa.js | 1 + assets/js/44a464d7.ef547f4b.js | 1 - assets/js/4c3c7f6c.4099e1b2.js | 1 + assets/js/4c3c7f6c.a4278219.js | 1 - assets/js/5181bfc2.1cd0a538.js | 1 + assets/js/5181bfc2.b1d31591.js | 1 - assets/js/544aba92.70e03cf8.js | 1 - assets/js/544aba92.973bfd97.js | 1 + assets/js/62692344.29aaf915.js | 1 + assets/js/62692344.d438a31c.js | 1 - assets/js/712b8a2d.8a52facb.js | 1 + assets/js/712b8a2d.b2c49b65.js | 1 - assets/js/7ef89a43.154ed672.js | 1 + assets/js/7ef89a43.37a63f5c.js | 1 - assets/js/80060540.a76e6a01.js | 1 - assets/js/80060540.fa6ad726.js | 1 + assets/js/918c9c28.442e3710.js | 1 - assets/js/918c9c28.a570135e.js | 1 + assets/js/935f2afb.b83907d5.js | 1 + assets/js/935f2afb.d81b4fa2.js | 1 - assets/js/b0e8dd6d.14bdb836.js | 1 - assets/js/b0e8dd6d.480b3d8a.js | 1 + assets/js/b7f64af1.4fb71bce.js | 1 + assets/js/b7f64af1.7bb0cce2.js | 1 - assets/js/df751193.11c160c7.js | 1 - assets/js/df751193.4637bd9c.js | 1 + assets/js/e1621294.0a2fc20e.js | 1 + assets/js/e1621294.274910be.js | 1 - assets/js/fdebbd26.9af8dffb.js | 1 + assets/js/fdebbd26.e19eb6a0.js | 1 - ...ntime~main.04a480b9.js => runtime~main.9669ca4a.js} | 2 +- docs/Accessibility.html | 4 ++-- docs/BundleSize.html | 4 ++-- docs/CHANGELOG.html | 2 +- docs/Charting-Concepts/AreaChart.html | 8 ++++---- docs/Charting-Concepts/DonutChart.html | 8 ++++---- docs/Charting-Concepts/GaugeChart.html | 8 ++++---- docs/Charting-Concepts/GroupedVerticalBarChart.html | 8 ++++---- docs/Charting-Concepts/HeatMapChart.html | 8 ++++---- docs/Charting-Concepts/HorizontalBarChart.html | 8 ++++---- docs/Charting-Concepts/LineChart.html | 8 ++++---- docs/Charting-Concepts/SankeyChart.html | 8 ++++---- docs/Charting-Concepts/SparklineChart.html | 8 ++++---- docs/Charting-Concepts/StackedBarChart.html | 8 ++++---- docs/Charting-Concepts/VerticalBarChart.html | 10 +++++----- docs/Charting-Concepts/VerticalStackedBarChart.html | 8 ++++---- docs/Contributor Guide.html | 6 +++--- docs/Debugging.html | 6 +++--- docs/Detailed Implementation Steps.html | 6 +++--- docs/Implementation Best Practices.html | 4 ++-- docs/Overview.html | 4 ++-- docs/Start Developing.html | 4 ++-- docs/Technical Details.html | 6 +++--- docs/Test Plans/AreaChart/ComponentTests.html | 4 ++-- docs/Test Plans/DonutChart/ComponentTests.html | 4 ++-- docs/Test Plans/GaugeChart/ComponentTests.html | 4 ++-- .../GroupedVerticalBarChart/ComponentTests.html | 4 ++-- docs/Test Plans/HeatMapChart/ComponentTests.html | 4 ++-- docs/Test Plans/HorizontalBarChart/ComponentTests.html | 6 +++--- docs/Test Plans/HorizontalBarChart/UnitTests.html | 4 ++-- .../HorizontalBarChartWithAxis/ComponentTests.html | 4 ++-- .../HorizontalBarChartWithAxis/UnitTests.html | 4 ++-- docs/Test Plans/LineChart/ComponentTests.html | 4 ++-- .../MultiStackedBarChart/componentTests.html | 4 ++-- docs/Test Plans/SankeyChart/ComponentTests.html | 4 ++-- docs/Test Plans/StackedBarChart/ComponentTests.html | 4 ++-- docs/Test Plans/TestingGuide.html | 4 ++-- docs/Test Plans/Utilities/UnitTests.html | 4 ++-- docs/Test Plans/VerticalBarChart/ComponentTests.html | 4 ++-- .../VerticalStackedBarChart/ComponentTests.html | 4 ++-- docs/TestCoverage.html | 4 ++-- docs/Testing Strategy.html | 4 ++-- docs/Testing Unpublished Library Version.html | 4 ++-- docs/changelogSplits/5.0.html | 4 ++-- docs/changelogSplits/5.1.html | 4 ++-- docs/changelogSplits/5.10.html | 4 ++-- docs/changelogSplits/5.11.html | 4 ++-- docs/changelogSplits/5.12.html | 4 ++-- docs/changelogSplits/5.13.html | 4 ++-- docs/changelogSplits/5.14.html | 4 ++-- docs/changelogSplits/5.15.html | 4 ++-- docs/changelogSplits/5.16.html | 4 ++-- docs/changelogSplits/5.17.html | 4 ++-- docs/changelogSplits/5.18.html | 4 ++-- docs/changelogSplits/5.19.html | 4 ++-- docs/changelogSplits/5.2.html | 4 ++-- docs/changelogSplits/5.3.html | 4 ++-- docs/changelogSplits/5.4.html | 4 ++-- docs/changelogSplits/5.5.html | 4 ++-- docs/changelogSplits/5.6.html | 4 ++-- docs/changelogSplits/5.7.html | 4 ++-- docs/changelogSplits/5.8.html | 4 ++-- docs/changelogSplits/5.9.html | 4 ++-- docs/colors.html | 4 ++-- docs/creating-date-objects-for-chart-data.html | 4 ++-- docs/implementing-2-to-1-spacing.html | 4 ++-- index.html | 2 +- search.html | 2 +- 104 files changed, 181 insertions(+), 181 deletions(-) create mode 100644 assets/js/1d29b0d8.21c83f2c.js delete mode 100644 assets/js/1d29b0d8.8fa1bc20.js rename assets/js/{1df93b7f.0fc48f5c.js => 1df93b7f.1ca22ede.js} (97%) create mode 100644 assets/js/1ff5abae.3774152c.js delete mode 100644 assets/js/1ff5abae.b0c49283.js create mode 100644 assets/js/44a464d7.bfee92aa.js delete mode 100644 assets/js/44a464d7.ef547f4b.js create mode 100644 assets/js/4c3c7f6c.4099e1b2.js delete mode 100644 assets/js/4c3c7f6c.a4278219.js create mode 100644 assets/js/5181bfc2.1cd0a538.js delete mode 100644 assets/js/5181bfc2.b1d31591.js delete mode 100644 assets/js/544aba92.70e03cf8.js create mode 100644 assets/js/544aba92.973bfd97.js create mode 100644 assets/js/62692344.29aaf915.js delete mode 100644 assets/js/62692344.d438a31c.js create mode 100644 assets/js/712b8a2d.8a52facb.js delete mode 100644 assets/js/712b8a2d.b2c49b65.js create mode 100644 assets/js/7ef89a43.154ed672.js delete mode 100644 assets/js/7ef89a43.37a63f5c.js delete mode 100644 assets/js/80060540.a76e6a01.js create mode 100644 assets/js/80060540.fa6ad726.js delete mode 100644 assets/js/918c9c28.442e3710.js create mode 100644 assets/js/918c9c28.a570135e.js create mode 100644 assets/js/935f2afb.b83907d5.js delete mode 100644 assets/js/935f2afb.d81b4fa2.js delete mode 100644 assets/js/b0e8dd6d.14bdb836.js create mode 100644 assets/js/b0e8dd6d.480b3d8a.js create mode 100644 assets/js/b7f64af1.4fb71bce.js delete mode 100644 assets/js/b7f64af1.7bb0cce2.js delete mode 100644 assets/js/df751193.11c160c7.js create mode 100644 assets/js/df751193.4637bd9c.js create mode 100644 assets/js/e1621294.0a2fc20e.js delete mode 100644 assets/js/e1621294.274910be.js create mode 100644 assets/js/fdebbd26.9af8dffb.js delete mode 100644 assets/js/fdebbd26.e19eb6a0.js rename assets/js/{runtime~main.04a480b9.js => runtime~main.9669ca4a.js} (50%) diff --git a/404.html b/404.html index 629a0f6efb..17b0ebf8dc 100644 --- a/404.html +++ b/404.html @@ -5,7 +5,7 @@ Page Not Found | FluentUI Charting Contrib Docsite - + diff --git a/assets/js/1d29b0d8.21c83f2c.js b/assets/js/1d29b0d8.21c83f2c.js new file mode 100644 index 0000000000..49672a0540 --- /dev/null +++ b/assets/js/1d29b0d8.21c83f2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[3861],{6001:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=t(5893),a=t(1151);const r={},o="Sankey Chart",s={id:"Charting-Concepts/SankeyChart",title:"Sankey Chart",description:"Sankey charts are a type of data visualization that are particularly useful for showing the flow of resources, energy, or information through a system. They are characterized by their flowing, interconnected arrows that represent the quantity or value of something as it moves from one stage or category to another.",source:"@site/../../docs/Charting-Concepts/SankeyChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/SankeyChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/SankeyChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Line Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/LineChart"},next:{title:"Sparkline Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/SparklineChart"}},h={},d=[{value:"Use cases:",id:"use-cases",level:2},{value:"Dev Design details",id:"dev-design-details",level:2},{value:"1. Nodes",id:"1-nodes",level:3},{value:"2.Links",id:"2links",level:3},{value:"Flow Direction",id:"flow-direction",level:4},{value:"Width",id:"width",level:4},{value:"Color",id:"color",level:4},{value:"Interactivity",id:"interactivity",level:4},{value:"Mathematical/Geometrical concepts",id:"mathematicalgeometrical-concepts",level:2},{value:"Dynamic node padding in Fluent Sankey chart",id:"dynamic-node-padding-in-fluent-sankey-chart",level:3},{value:"Minimum height of the node for Fluent Sankey charts will be 1% of the total column height.",id:"minimum-height-of-the-node-for-fluent-sankey-charts-will-be-1-of-the-total-column-height",level:3},{value:"Performance",id:"performance",level:2},{value:"Accessibility",id:"accessibility",level:2},{value:"Variants",id:"variants",level:2},{value:"Error scenarios",id:"error-scenarios",level:2},{value:"Chart is not rendered properly if for a link source and target node will be same.",id:"chart-is-not-rendered-properly-if-for-a-link-source-and-target-node-will-be-same",level:3},{value:"Chart is not rendered properly if consistent names are not used properly while configuring links.",id:"chart-is-not-rendered-properly-if-consistent-names--are-not-used-properly-while-configuring-links",level:3},{value:"The chart cannot be loaded because of one or more reasons:",id:"the-chart-cannot-be-loaded-because-of-one-or-more-reasons",level:3},{value:"The chart is in a loading state because of one or more reasons below.",id:"the-chart-is-in-a-loading-state-because-of-one-or-more-reasons-below",level:3},{value:"Extremely high density:",id:"extremely-high-density",level:3},{value:"Some notable PRs and their brief description",id:"some-notable-prs-and-their-brief-description",level:2},{value:"Design figma",id:"design-figma",level:2},{value:"Rendering details",id:"rendering-details",level:2},{value:"Interactions",id:"interactions",level:2},{value:"Hover Over Nodes",id:"hover-over-nodes",level:4},{value:"Hover Over links",id:"hover-over-links",level:4}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"sankey-chart",children:"Sankey Chart"}),"\n",(0,i.jsx)(n.p,{children:"Sankey charts are a type of data visualization that are particularly useful for showing the flow of resources, energy, or information through a system. They are characterized by their flowing, interconnected arrows that represent the quantity or value of something as it moves from one stage or category to another."}),"\n",(0,i.jsx)(n.h2,{id:"use-cases",children:"Use cases:"}),"\n",(0,i.jsx)(n.p,{children:"Sankey charts are used for various use cases which involve Energy Flows, Material Flow Analysis, Website User Flow, Customer Journey Mapping, Water Usage and Conservation, Financial Flows, Environmental Impact, Project Management etc."}),"\n",(0,i.jsx)(n.p,{children:"###Fluent Sankey charts offer various functionalities, including node descriptions, diverse hover actions triggered when interacting with nodes and links."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(7994).Z+"",width:"1210",height:"728"})}),"\n",(0,i.jsx)(n.h2,{id:"dev-design-details",children:"Dev Design details"}),"\n",(0,i.jsx)(n.p,{children:"Following are the major components that contribute towards creating a complete Sankey Chart"}),"\n",(0,i.jsx)(n.h3,{id:"1-nodes",children:"1. Nodes"}),"\n",(0,i.jsx)(n.p,{children:'In a Sankey chart, "nodes" represent the distinct categories or stages within a system where resources, energy, or information flow. These nodes are usually depicted as rectangles or blocks, and they are interconnected by arrows or lines that indicate the flow between them. Each node represents a specific entity or group, and the width of the arrows or lines is proportional to the quantity or value of what is flowing from one node to another.\n_createNodes() is used for creating Sankey nodes .This function creates an array of React nodes based on the SankeyChartData property of the data object passed in as a prop. For each node in the SankeyChartData.nodes array, the method calculates the height of the node based on the difference between the y1 and y0 properties of the node. If the height is less than a certain minimum height, an extra padding of 6 pixels is added between the node description and the node weight. The method then truncates the node name to fit within the available space, and creates a tooltip with the full node name.The method then creates a React node for the current node, which consists of a rectangle and two text elements. The rectangle is positioned based on the x0, y0, x1, and y1 properties of the node, and is filled with a color based on the fillNodeColors method. The rectangle also has event handlers for mouseover, mouseout, and focus events.The two text elements are positioned based on the height of the node and the length of the node weight text. The first text element contains the node name, and the second text element contains the node weight. Both text elements have event handlers for mouseover and mouseout events that show and hide the tooltip, respectively.'}),"\n",(0,i.jsx)(n.h3,{id:"2links",children:"2.Links"}),"\n",(0,i.jsx)(n.p,{children:'In a Sankey chart, "links" represent the connections or flows of resources, energy, or information between nodes. Links are typically depicted as lines or arrows that connect one node to another, indicating the quantity or value of what is flowing from the source node to the target node. Here are some key characteristics of links in Sankey charts:'}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"flow-direction",children:"Flow Direction"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Links have a direction, moving from a source node to a target node. The direction of the link illustrates how resources or information is flowing within the system."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"width",children:"Width"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The width of the link is proportional to the quantity or value of the flow it represents. Wider links indicate larger flows, while narrower links represent smaller flows."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"color",children:"Color"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Links can be colored to provide additional information or to differentiate between different types of flows or categories. For example, different colors might represent different materials, energy sources, or information types."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"interactivity",children:"Interactivity"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In some Sankey charts, links can be interactive. For instance, hovering over a link may display additional information, such as the exact value of the flow or other related data."}),"\n",(0,i.jsxs)(n.p,{children:["Links are created using createLInks() function. The method takes no arguments. For each link, the method creates a linear gradient that goes from the color of the source node to the color of the target node. The method then calculates the data points for the link area using the ",(0,i.jsx)(n.code,{children:"data"})," function, which takes a single link object and returns an array of two points that define the shape of the link. the ",(0,i.jsx)(n.code,{children:"d3CurveBasis"})," curve type to create a smooth curve for the link area. The method then creates a React node for the link, which consists of a ",(0,i.jsx)(n.code,{children:"path"})," element that uses the link area to define its shape. The ",(0,i.jsx)(n.code,{children:"path"})," element is filled with the linear gradient created earlier, and has a stroke color and width that are determined by the",(0,i.jsx)(n.code,{children:"_fillStreamBorder"})," and ",(0,i.jsx)(n.code,{children:"_getOpacityStreamBorder"})," methods, respectively."]}),"\n",(0,i.jsx)(n.h2,{id:"mathematicalgeometrical-concepts",children:"Mathematical/Geometrical concepts"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/d3/d3-sankey",children:"d3-sankey"})," is a JavaScript library that extends the capabilities of the popular data visualization library D3.js to create Sankey charts easily. The primary role of ",(0,i.jsx)(n.a,{href:"https://github.com/d3/d3-sankey",children:"d3-sankey"})," in creating Sankey charts is to simplify the process of generating these complex diagrams by providing a set of functions and methods tailored specifically for Sankey diagrams.\nThe _preRenderLayout method initializes a d3Sankey object that is used to calculate the layout of the Sankey diagram. The d3Sankey object is configured with various properties, such as the width of the nodes, the extent of the diagram, and the alignment of the nodes.The d3Sankey object is then used to calculate the layout of the Sankey diagram in the _createNodes and _createLinks methods. The d3Sankey object takes in the nodes and links arrays and calculates the positions of the nodes and the paths of the links based on the properties of the nodes and links.\n\u2022\tNodes will contain an array of node objects, each with properties like name, x0, x1, y0, and y1.\n\u2022\tLinks will contain an array of link objects, each with properties like source, target, and value."]}),"\n",(0,i.jsx)(n.h3,{id:"dynamic-node-padding-in-fluent-sankey-chart",children:"Dynamic node padding in Fluent Sankey chart"}),"\n",(0,i.jsxs)(n.p,{children:["We have also introduced dynamic padding concept for Sankey charts .This is used for cases where the number of nodes in a column is huge.so that we maintain a node to space ratio for such columns as if we fail to do so the chart is devoid of nodes and only shows links. See the code for dynamic at ",(0,i.jsx)(n.a,{href:"https://github.com/microsoft/fluentui/blob/f9ef593dd07abb0341e7be09f60cb841d577135d/packages/react-charting/src/components/SankeyChart/SankeyChart.base.tsx#L295",children:"githublink"}),". This is necessary because D3 Sankey reduces the node height when there are more nodes within a constrained chart height while maintaining the same node padding as specified."]}),"\n",(0,i.jsx)(n.h3,{id:"minimum-height-of-the-node-for-fluent-sankey-charts-will-be-1-of-the-total-column-height",children:"Minimum height of the node for Fluent Sankey charts will be 1% of the total column height."}),"\n",(0,i.jsx)(n.h2,{id:"performance",children:"Performance"}),"\n",(0,i.jsx)(n.p,{children:"The performance aspect of a chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a area chart:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Data Visualization Efficiency"}),"\n",(0,i.jsx)(n.li,{children:"Clarity and Simplicity"}),"\n",(0,i.jsx)(n.li,{children:"Responsiveness"}),"\n",(0,i.jsx)(n.li,{children:"Handling Large Datasets"}),"\n",(0,i.jsx)(n.li,{children:"Interactive Features"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Currently we are working on improving the performance . We are currently working on improving 3 of the performance lighthouse metrics FCP, TBT, TTI.\nThe current implementation of the Sankey chart is already performing well. However, as part of our future plans, we aim to assess the Lighthouse performance score, particularly when dealing with extensive datasets for the chart. We are committed to enhancing the performance further by identifying and capitalizing on any opportunities for improvement that may arise."}),"\n",(0,i.jsx)(n.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,i.jsxs)(n.p,{children:["Chart ",(0,i.jsx)(n.code,{children:""}),"The role is set as presentation, and the aria-label attribute is set as a string to describe its contents. This is readable by screen reader if user has given chartTitle prop\nHorizontal bar chart provides a bunch of props to enable custom accessibility messages. UsexAxisCalloutAccessibilityData and callOutAccessibilityData to configure x axis and y axis accessibility messages respectively."]}),"\n",(0,i.jsx)(n.h2,{id:"variants",children:"Variants"}),"\n",(0,i.jsxs)(n.p,{children:["Different variants of Sankey chart are available at below location:\n",(0,i.jsx)(n.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/sankeychart",children:"Fluent UI React Charting Examples - Sankey Charts"}),"\nThe Variants in the above consisting of different functionalities:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Nodes can have customized colors, or else the default colors will be assigned. The node border also follows the same approach."}),"\n",(0,i.jsxs)(n.li,{children:["The color of links depends on the action taken on the chart. In the default state, the link color is grey. However, when hovering over the link, it transitions into a gradient between the source and target nodes, creating a visually appealing effect.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(2323).Z+"",width:"1164",height:"444"})]}),"\n",(0,i.jsxs)(n.li,{children:["The details inside nodes, such as node name and weight, depend on the size of the node. If the node's height is less than 24px, no details will appear inside the node. This is because with such limited width, reading any details within the node becomes challenging. We will cover an alternative method for accessing this information in the interaction section of the contributor guide.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(1435).Z+"",width:"240",height:"48"})]}),"\n",(0,i.jsxs)(n.li,{children:["There are two ways to display the node name and weight. To have the node name and weight displayed on two separate lines, a minimum height of 36px is required.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(3593).Z+"",width:"898",height:"210"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"error-scenarios",children:"Error scenarios"}),"\n",(0,i.jsx)(n.h3,{id:"chart-is-not-rendered-properly-if-for-a-link-source-and-target-node-will-be-same",children:"Chart is not rendered properly if for a link source and target node will be same."}),"\n",(0,i.jsx)(n.h3,{id:"chart-is-not-rendered-properly-if-consistent-names--are-not-used-properly-while-configuring-links",children:"Chart is not rendered properly if consistent names are not used properly while configuring links."}),"\n",(0,i.jsx)(n.h3,{id:"the-chart-cannot-be-loaded-because-of-one-or-more-reasons",children:"The chart cannot be loaded because of one or more reasons:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Empty data passed such that chart does not have visual to show."}),"\n",(0,i.jsx)(n.li,{children:"One of the datapoint passed to the chart is corrupted. The corrupted datapoint can be for a continuous chart like line or area, or a discrete chart like bar chart, donut chart."}),"\n",(0,i.jsx)(n.li,{children:"The type of data passed to the chart is not supported."}),"\n",(0,i.jsx)(n.li,{children:"The user has not provided the required property."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"the-chart-is-in-a-loading-state-because-of-one-or-more-reasons-below",children:"The chart is in a loading state because of one or more reasons below."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The chart data is too heavy."}),"\n",(0,i.jsx)(n.li,{children:"Chart is waiting for data from a webservice."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"extremely-high-density",children:"Extremely high density:"}),"\n",(0,i.jsx)(n.p,{children:"The number of nodes in the chart are more considering the height and width of the canvas provided."}),"\n",(0,i.jsx)(n.h2,{id:"some-notable-prs-and-their-brief-description",children:"Some notable PRs and their brief description"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://github.com/microsoft/fluentui/pull/25455",children:"PR"})}),"\n",(0,i.jsx)(n.h2,{id:"design-figma",children:"Design figma"}),"\n",(0,i.jsxs)(n.p,{children:["Sankey Chart Figma : ",(0,i.jsx)(n.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21212-72120&mode=design&t=uSjYIeUd9e3vBPuc-0",children:"Data viz (Archive) \u2013 Figma"})]}),"\n",(0,i.jsx)(n.h2,{id:"rendering-details",children:"Rendering details"}),"\n",(0,i.jsx)(n.p,{children:"The Sankey chart in SankeyChart.base.tsx is rendered using D3.js, a popular JavaScript library for data visualization. The chart is created by rendering a series of SVG elements, including rectangles for the nodes and paths for the links between the nodes.\nThe chart is created in the _createSankey function, which initializes the D3 Sankey layout and sets the chart's dimensions and margins. The function then creates the nodes and links for the chart using the d3.sankey layout and the chart's data.\nThe nodes are rendered as rectangles using the rect SVG element, with the position and size of each rectangle determined by the x, y, width, and height properties of the node. The links between the nodes are rendered as paths using the path SVG element, with the position and shape of each path determined by the x0, y0, x1, y1, and width properties of the link.\nThe chart also includes event handlers for mouseover and mouseout events on the nodes and links, which highlight the corresponding elements and display tooltips with additional information."}),"\n",(0,i.jsx)(n.h2,{id:"interactions",children:"Interactions"}),"\n",(0,i.jsx)(n.p,{children:"There are various interactions that a user experiences in Line Chart which are"}),"\n",(0,i.jsx)(n.h4,{id:"hover-over-nodes",children:"Hover Over Nodes"}),"\n",(0,i.jsxs)(n.p,{children:["When the user hovers over nodes, the entire flow associated with that node will be highlighted, encompassing both the links and nodes within the entire flow. Furthermore, the entire flow will be colored to match the node upon which the user has hovered. To enhance visibility, all other nodes will be rendered in white with reduced opacity.Below is an example. Here user has hovered over node with value 62 .\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(488).Z+"",width:"998",height:"472"})]}),"\n",(0,i.jsx)(n.p,{children:"Hovering on the node with height less than 24px will display a callout with details of node name and weight."}),"\n",(0,i.jsx)(n.h4,{id:"hover-over-links",children:"Hover Over links"}),"\n",(0,i.jsx)(n.p,{children:"When the user hovers over a link, the entire flow will be highlighted. All nodes will retain their original colors, while the links themselves will adopt a gradient color derived from the source and target nodes. Additionally, a callout will appear, displaying details about the link, such as the source node's name, weight, and the target node's name. To enhance the visual appeal, the link border will also transition into a gradient when the link is hovered over. Below is an example of a link being hovered over, in this case, between node 4 and node 12."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(4010).Z+"",width:"1032",height:"628"})})]})}function c(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},7994:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic1-21938ac4624ca9c0b2e7a81642895f54.png"},2323:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic2-f8b20217db956a3f15db72749f483f96.png"},3593:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic4-94529d27a2a3b60dc3a8eb5bbe3da5c6.png"},488:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic5-981250d62a5438d1f49a7189100e63c0.png"},4010:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic6-af110dd78bfea90678297931ac13a72f.png"},1435:(e,n,t)=>{t.d(n,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAAwCAYAAAAvvfcmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAAABfaVRYdFNuaXBNZXRhZGF0YQAAAAAAeyJjbGlwUG9pbnRzIjpbeyJ4IjowLCJ5IjowfSx7IngiOjIzOSwieSI6MH0seyJ4IjoyMzksInkiOjQ3fSx7IngiOjAsInkiOjQ3fV19jVsYmgAAAjdJREFUeF7t3c1qE1EYh/F3JnZrKdoplmiySqyIrqRgaBFlaKgrpYuKbrqpS115Bd6D9+JGdOtGdNMvreIHkhYqtYFUOhPPmQyl2ya1zD8+P3jJIZPVwJMZknASdB0DICdwwnwNQBABA8IIGBBGwIAwAgaEETAgjIABYQQMCCNgQBgBA8Jkf0r541vLnj97YR/XvtrIyJn8WaCIAjddS5LUZuau2fStKfPZ+YnjuPeSPvifUsoHvLH6xcbOjtvEWNWdpt6JAgojCKzzp23ft9ezgO8uNOz+o/gw4HK5nL/w+IYi4PWVzzY5XrUrlZtWCkouXwJGcbjEbOd3y959emXJQerivWPLTxbzo4MZmoAvnK/Y5UvTBIzC8QH/2tuy95tvsoDvPbxtj58+yI8OxvfLh1iAMAIGhBEwIIyAAWEEDAgjYEAYAQPCCBgQRsCAMAIGhBEwIIyAAWEEDAgjYEAYAQPCCBgQRsCAMAIGhBEwIGwoAva7UYZhiWGKOUd2rvJ7ZJ2kodhW9tzohJWjuns34oYCBeN6bXd2bfPnh2xTu/mFhi0uzecHzaIoylfH5ze1Y2N34JT4faEb8VW7MVvP9oT2ms1m9tgP36/sJcufgDRNrZv6x96aYYo6SZJk49dh6O4V8xmU7BV4u7Vjr1++tb3dtgUncCKAfyVJDmy/s2+pS+1iNbL69crhH4jUarXeog/St9DA/076FhoA3wMD0ggYEEbAgDACBoQRMCCMgAEAOH1mfwGdx7oHd1aLQgAAAABJRU5ErkJggg=="},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>o});var i=t(7294);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1d29b0d8.8fa1bc20.js b/assets/js/1d29b0d8.8fa1bc20.js deleted file mode 100644 index a2dbb29a00..0000000000 --- a/assets/js/1d29b0d8.8fa1bc20.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[3861],{6001:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=t(5893),a=t(1151);const r={},o="Contributor Guide: Sankey Chart",s={id:"Charting-Concepts/SankeyChart",title:"Contributor Guide: Sankey Chart",description:"Sankey charts are a type of data visualization that are particularly useful for showing the flow of resources, energy, or information through a system. They are characterized by their flowing, interconnected arrows that represent the quantity or value of something as it moves from one stage or category to another.",source:"@site/../../docs/Charting-Concepts/SankeyChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/SankeyChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/SankeyChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributor guide: Line Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/LineChart"},next:{title:"Contributor guide: Sparkline Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/SparklineChart"}},h={},d=[{value:"Use cases:",id:"use-cases",level:2},{value:"Dev Design details",id:"dev-design-details",level:2},{value:"1. Nodes",id:"1-nodes",level:3},{value:"2.Links",id:"2links",level:3},{value:"Flow Direction",id:"flow-direction",level:4},{value:"Width",id:"width",level:4},{value:"Color",id:"color",level:4},{value:"Interactivity",id:"interactivity",level:4},{value:"Mathematical/Geometrical concepts",id:"mathematicalgeometrical-concepts",level:2},{value:"Dynamic node padding in Fluent Sankey chart",id:"dynamic-node-padding-in-fluent-sankey-chart",level:3},{value:"Minimum height of the node for Fluent Sankey charts will be 1% of the total column height.",id:"minimum-height-of-the-node-for-fluent-sankey-charts-will-be-1-of-the-total-column-height",level:3},{value:"Performance",id:"performance",level:2},{value:"Accessibility",id:"accessibility",level:2},{value:"Variants",id:"variants",level:2},{value:"Error scenarios",id:"error-scenarios",level:2},{value:"Chart is not rendered properly if for a link source and target node will be same.",id:"chart-is-not-rendered-properly-if-for-a-link-source-and-target-node-will-be-same",level:3},{value:"Chart is not rendered properly if consistent names are not used properly while configuring links.",id:"chart-is-not-rendered-properly-if-consistent-names--are-not-used-properly-while-configuring-links",level:3},{value:"The chart cannot be loaded because of one or more reasons:",id:"the-chart-cannot-be-loaded-because-of-one-or-more-reasons",level:3},{value:"The chart is in a loading state because of one or more reasons below.",id:"the-chart-is-in-a-loading-state-because-of-one-or-more-reasons-below",level:3},{value:"Extremely high density:",id:"extremely-high-density",level:3},{value:"Some notable PRs and their brief description",id:"some-notable-prs-and-their-brief-description",level:2},{value:"Design figma",id:"design-figma",level:2},{value:"Rendering details",id:"rendering-details",level:2},{value:"Interactions",id:"interactions",level:2},{value:"Hover Over Nodes",id:"hover-over-nodes",level:4},{value:"Hover Over links",id:"hover-over-links",level:4}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"contributor-guide-sankey-chart",children:"Contributor Guide: Sankey Chart"}),"\n",(0,i.jsx)(n.p,{children:"Sankey charts are a type of data visualization that are particularly useful for showing the flow of resources, energy, or information through a system. They are characterized by their flowing, interconnected arrows that represent the quantity or value of something as it moves from one stage or category to another."}),"\n",(0,i.jsx)(n.h2,{id:"use-cases",children:"Use cases:"}),"\n",(0,i.jsx)(n.p,{children:"Sankey charts are used for various use cases which involve Energy Flows, Material Flow Analysis, Website User Flow, Customer Journey Mapping, Water Usage and Conservation, Financial Flows, Environmental Impact, Project Management etc."}),"\n",(0,i.jsx)(n.p,{children:"###Fluent Sankey charts offer various functionalities, including node descriptions, diverse hover actions triggered when interacting with nodes and links."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(7994).Z+"",width:"1210",height:"728"})}),"\n",(0,i.jsx)(n.h2,{id:"dev-design-details",children:"Dev Design details"}),"\n",(0,i.jsx)(n.p,{children:"Following are the major components that contribute towards creating a complete Sankey Chart"}),"\n",(0,i.jsx)(n.h3,{id:"1-nodes",children:"1. Nodes"}),"\n",(0,i.jsx)(n.p,{children:'In a Sankey chart, "nodes" represent the distinct categories or stages within a system where resources, energy, or information flow. These nodes are usually depicted as rectangles or blocks, and they are interconnected by arrows or lines that indicate the flow between them. Each node represents a specific entity or group, and the width of the arrows or lines is proportional to the quantity or value of what is flowing from one node to another.\n_createNodes() is used for creating Sankey nodes .This function creates an array of React nodes based on the SankeyChartData property of the data object passed in as a prop. For each node in the SankeyChartData.nodes array, the method calculates the height of the node based on the difference between the y1 and y0 properties of the node. If the height is less than a certain minimum height, an extra padding of 6 pixels is added between the node description and the node weight. The method then truncates the node name to fit within the available space, and creates a tooltip with the full node name.The method then creates a React node for the current node, which consists of a rectangle and two text elements. The rectangle is positioned based on the x0, y0, x1, and y1 properties of the node, and is filled with a color based on the fillNodeColors method. The rectangle also has event handlers for mouseover, mouseout, and focus events.The two text elements are positioned based on the height of the node and the length of the node weight text. The first text element contains the node name, and the second text element contains the node weight. Both text elements have event handlers for mouseover and mouseout events that show and hide the tooltip, respectively.'}),"\n",(0,i.jsx)(n.h3,{id:"2links",children:"2.Links"}),"\n",(0,i.jsx)(n.p,{children:'In a Sankey chart, "links" represent the connections or flows of resources, energy, or information between nodes. Links are typically depicted as lines or arrows that connect one node to another, indicating the quantity or value of what is flowing from the source node to the target node. Here are some key characteristics of links in Sankey charts:'}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"flow-direction",children:"Flow Direction"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Links have a direction, moving from a source node to a target node. The direction of the link illustrates how resources or information is flowing within the system."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"width",children:"Width"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The width of the link is proportional to the quantity or value of the flow it represents. Wider links indicate larger flows, while narrower links represent smaller flows."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"color",children:"Color"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Links can be colored to provide additional information or to differentiate between different types of flows or categories. For example, different colors might represent different materials, energy sources, or information types."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.h4,{id:"interactivity",children:"Interactivity"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In some Sankey charts, links can be interactive. For instance, hovering over a link may display additional information, such as the exact value of the flow or other related data."}),"\n",(0,i.jsxs)(n.p,{children:["Links are created using createLInks() function. The method takes no arguments. For each link, the method creates a linear gradient that goes from the color of the source node to the color of the target node. The method then calculates the data points for the link area using the ",(0,i.jsx)(n.code,{children:"data"})," function, which takes a single link object and returns an array of two points that define the shape of the link. the ",(0,i.jsx)(n.code,{children:"d3CurveBasis"})," curve type to create a smooth curve for the link area. The method then creates a React node for the link, which consists of a ",(0,i.jsx)(n.code,{children:"path"})," element that uses the link area to define its shape. The ",(0,i.jsx)(n.code,{children:"path"})," element is filled with the linear gradient created earlier, and has a stroke color and width that are determined by the",(0,i.jsx)(n.code,{children:"_fillStreamBorder"})," and ",(0,i.jsx)(n.code,{children:"_getOpacityStreamBorder"})," methods, respectively."]}),"\n",(0,i.jsx)(n.h2,{id:"mathematicalgeometrical-concepts",children:"Mathematical/Geometrical concepts"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/d3/d3-sankey",children:"d3-sankey"})," is a JavaScript library that extends the capabilities of the popular data visualization library D3.js to create Sankey charts easily. The primary role of ",(0,i.jsx)(n.a,{href:"https://github.com/d3/d3-sankey",children:"d3-sankey"})," in creating Sankey charts is to simplify the process of generating these complex diagrams by providing a set of functions and methods tailored specifically for Sankey diagrams.\nThe _preRenderLayout method initializes a d3Sankey object that is used to calculate the layout of the Sankey diagram. The d3Sankey object is configured with various properties, such as the width of the nodes, the extent of the diagram, and the alignment of the nodes.The d3Sankey object is then used to calculate the layout of the Sankey diagram in the _createNodes and _createLinks methods. The d3Sankey object takes in the nodes and links arrays and calculates the positions of the nodes and the paths of the links based on the properties of the nodes and links.\n\u2022\tNodes will contain an array of node objects, each with properties like name, x0, x1, y0, and y1.\n\u2022\tLinks will contain an array of link objects, each with properties like source, target, and value."]}),"\n",(0,i.jsx)(n.h3,{id:"dynamic-node-padding-in-fluent-sankey-chart",children:"Dynamic node padding in Fluent Sankey chart"}),"\n",(0,i.jsxs)(n.p,{children:["We have also introduced dynamic padding concept for Sankey charts .This is used for cases where the number of nodes in a column is huge.so that we maintain a node to space ratio for such columns as if we fail to do so the chart is devoid of nodes and only shows links. See the code for dynamic at ",(0,i.jsx)(n.a,{href:"https://github.com/microsoft/fluentui/blob/f9ef593dd07abb0341e7be09f60cb841d577135d/packages/react-charting/src/components/SankeyChart/SankeyChart.base.tsx#L295",children:"githublink"}),". This is necessary because D3 Sankey reduces the node height when there are more nodes within a constrained chart height while maintaining the same node padding as specified."]}),"\n",(0,i.jsx)(n.h3,{id:"minimum-height-of-the-node-for-fluent-sankey-charts-will-be-1-of-the-total-column-height",children:"Minimum height of the node for Fluent Sankey charts will be 1% of the total column height."}),"\n",(0,i.jsx)(n.h2,{id:"performance",children:"Performance"}),"\n",(0,i.jsx)(n.p,{children:"The performance aspect of a chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a area chart:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Data Visualization Efficiency"}),"\n",(0,i.jsx)(n.li,{children:"Clarity and Simplicity"}),"\n",(0,i.jsx)(n.li,{children:"Responsiveness"}),"\n",(0,i.jsx)(n.li,{children:"Handling Large Datasets"}),"\n",(0,i.jsx)(n.li,{children:"Interactive Features"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Currently we are working on improving the performance . We are currently working on improving 3 of the performance lighthouse metrics FCP, TBT, TTI.\nThe current implementation of the Sankey chart is already performing well. However, as part of our future plans, we aim to assess the Lighthouse performance score, particularly when dealing with extensive datasets for the chart. We are committed to enhancing the performance further by identifying and capitalizing on any opportunities for improvement that may arise."}),"\n",(0,i.jsx)(n.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,i.jsxs)(n.p,{children:["Chart ",(0,i.jsx)(n.code,{children:""}),"The role is set as presentation, and the aria-label attribute is set as a string to describe its contents. This is readable by screen reader if user has given chartTitle prop\nHorizontal bar chart provides a bunch of props to enable custom accessibility messages. UsexAxisCalloutAccessibilityData and callOutAccessibilityData to configure x axis and y axis accessibility messages respectively."]}),"\n",(0,i.jsx)(n.h2,{id:"variants",children:"Variants"}),"\n",(0,i.jsxs)(n.p,{children:["Different variants of Sankey chart are available at below location:\n",(0,i.jsx)(n.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/sankeychart",children:"Fluent UI React Charting Examples - Sankey Charts"}),"\nThe Variants in the above consisting of different functionalities:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Nodes can have customized colors, or else the default colors will be assigned. The node border also follows the same approach."}),"\n",(0,i.jsxs)(n.li,{children:["The color of links depends on the action taken on the chart. In the default state, the link color is grey. However, when hovering over the link, it transitions into a gradient between the source and target nodes, creating a visually appealing effect.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(2323).Z+"",width:"1164",height:"444"})]}),"\n",(0,i.jsxs)(n.li,{children:["The details inside nodes, such as node name and weight, depend on the size of the node. If the node's height is less than 24px, no details will appear inside the node. This is because with such limited width, reading any details within the node becomes challenging. We will cover an alternative method for accessing this information in the interaction section of the contributor guide.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(1435).Z+"",width:"240",height:"48"})]}),"\n",(0,i.jsxs)(n.li,{children:["There are two ways to display the node name and weight. To have the node name and weight displayed on two separate lines, a minimum height of 36px is required.\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(3593).Z+"",width:"898",height:"210"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"error-scenarios",children:"Error scenarios"}),"\n",(0,i.jsx)(n.h3,{id:"chart-is-not-rendered-properly-if-for-a-link-source-and-target-node-will-be-same",children:"Chart is not rendered properly if for a link source and target node will be same."}),"\n",(0,i.jsx)(n.h3,{id:"chart-is-not-rendered-properly-if-consistent-names--are-not-used-properly-while-configuring-links",children:"Chart is not rendered properly if consistent names are not used properly while configuring links."}),"\n",(0,i.jsx)(n.h3,{id:"the-chart-cannot-be-loaded-because-of-one-or-more-reasons",children:"The chart cannot be loaded because of one or more reasons:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Empty data passed such that chart does not have visual to show."}),"\n",(0,i.jsx)(n.li,{children:"One of the datapoint passed to the chart is corrupted. The corrupted datapoint can be for a continuous chart like line or area, or a discrete chart like bar chart, donut chart."}),"\n",(0,i.jsx)(n.li,{children:"The type of data passed to the chart is not supported."}),"\n",(0,i.jsx)(n.li,{children:"The user has not provided the required property."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"the-chart-is-in-a-loading-state-because-of-one-or-more-reasons-below",children:"The chart is in a loading state because of one or more reasons below."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The chart data is too heavy."}),"\n",(0,i.jsx)(n.li,{children:"Chart is waiting for data from a webservice."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"extremely-high-density",children:"Extremely high density:"}),"\n",(0,i.jsx)(n.p,{children:"The number of nodes in the chart are more considering the height and width of the canvas provided."}),"\n",(0,i.jsx)(n.h2,{id:"some-notable-prs-and-their-brief-description",children:"Some notable PRs and their brief description"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://github.com/microsoft/fluentui/pull/25455",children:"PR"})}),"\n",(0,i.jsx)(n.h2,{id:"design-figma",children:"Design figma"}),"\n",(0,i.jsxs)(n.p,{children:["Sankey Chart Figma : ",(0,i.jsx)(n.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21212-72120&mode=design&t=uSjYIeUd9e3vBPuc-0",children:"Data viz (Archive) \u2013 Figma"})]}),"\n",(0,i.jsx)(n.h2,{id:"rendering-details",children:"Rendering details"}),"\n",(0,i.jsx)(n.p,{children:"The Sankey chart in SankeyChart.base.tsx is rendered using D3.js, a popular JavaScript library for data visualization. The chart is created by rendering a series of SVG elements, including rectangles for the nodes and paths for the links between the nodes.\nThe chart is created in the _createSankey function, which initializes the D3 Sankey layout and sets the chart's dimensions and margins. The function then creates the nodes and links for the chart using the d3.sankey layout and the chart's data.\nThe nodes are rendered as rectangles using the rect SVG element, with the position and size of each rectangle determined by the x, y, width, and height properties of the node. The links between the nodes are rendered as paths using the path SVG element, with the position and shape of each path determined by the x0, y0, x1, y1, and width properties of the link.\nThe chart also includes event handlers for mouseover and mouseout events on the nodes and links, which highlight the corresponding elements and display tooltips with additional information."}),"\n",(0,i.jsx)(n.h2,{id:"interactions",children:"Interactions"}),"\n",(0,i.jsx)(n.p,{children:"There are various interactions that a user experiences in Line Chart which are"}),"\n",(0,i.jsx)(n.h4,{id:"hover-over-nodes",children:"Hover Over Nodes"}),"\n",(0,i.jsxs)(n.p,{children:["When the user hovers over nodes, the entire flow associated with that node will be highlighted, encompassing both the links and nodes within the entire flow. Furthermore, the entire flow will be colored to match the node upon which the user has hovered. To enhance visibility, all other nodes will be rendered in white with reduced opacity.Below is an example. Here user has hovered over node with value 62 .\n",(0,i.jsx)(n.img,{alt:"image.png",src:t(488).Z+"",width:"998",height:"472"})]}),"\n",(0,i.jsx)(n.p,{children:"Hovering on the node with height less than 24px will display a callout with details of node name and weight."}),"\n",(0,i.jsx)(n.h4,{id:"hover-over-links",children:"Hover Over links"}),"\n",(0,i.jsx)(n.p,{children:"When the user hovers over a link, the entire flow will be highlighted. All nodes will retain their original colors, while the links themselves will adopt a gradient color derived from the source and target nodes. Additionally, a callout will appear, displaying details about the link, such as the source node's name, weight, and the target node's name. To enhance the visual appeal, the link border will also transition into a gradient when the link is hovered over. Below is an example of a link being hovered over, in this case, between node 4 and node 12."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(4010).Z+"",width:"1032",height:"628"})})]})}function c(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},7994:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic1-21938ac4624ca9c0b2e7a81642895f54.png"},2323:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic2-f8b20217db956a3f15db72749f483f96.png"},3593:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic4-94529d27a2a3b60dc3a8eb5bbe3da5c6.png"},488:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic5-981250d62a5438d1f49a7189100e63c0.png"},4010:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/SankeyChartPic6-af110dd78bfea90678297931ac13a72f.png"},1435:(e,n,t)=>{t.d(n,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAAwCAYAAAAvvfcmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAAABfaVRYdFNuaXBNZXRhZGF0YQAAAAAAeyJjbGlwUG9pbnRzIjpbeyJ4IjowLCJ5IjowfSx7IngiOjIzOSwieSI6MH0seyJ4IjoyMzksInkiOjQ3fSx7IngiOjAsInkiOjQ3fV19jVsYmgAAAjdJREFUeF7t3c1qE1EYh/F3JnZrKdoplmiySqyIrqRgaBFlaKgrpYuKbrqpS115Bd6D9+JGdOtGdNMvreIHkhYqtYFUOhPPmQyl2ya1zD8+P3jJIZPVwJMZknASdB0DICdwwnwNQBABA8IIGBBGwIAwAgaEETAgjIABYQQMCCNgQBgBA8Jkf0r541vLnj97YR/XvtrIyJn8WaCIAjddS5LUZuau2fStKfPZ+YnjuPeSPvifUsoHvLH6xcbOjtvEWNWdpt6JAgojCKzzp23ft9ezgO8uNOz+o/gw4HK5nL/w+IYi4PWVzzY5XrUrlZtWCkouXwJGcbjEbOd3y959emXJQerivWPLTxbzo4MZmoAvnK/Y5UvTBIzC8QH/2tuy95tvsoDvPbxtj58+yI8OxvfLh1iAMAIGhBEwIIyAAWEEDAgjYEAYAQPCCBgQRsCAMAIGhBEwIIyAAWEEDAgjYEAYAQPCCBgQRsCAMAIGhBEwIGwoAva7UYZhiWGKOUd2rvJ7ZJ2kodhW9tzohJWjuns34oYCBeN6bXd2bfPnh2xTu/mFhi0uzecHzaIoylfH5ze1Y2N34JT4faEb8VW7MVvP9oT2ms1m9tgP36/sJcufgDRNrZv6x96aYYo6SZJk49dh6O4V8xmU7BV4u7Vjr1++tb3dtgUncCKAfyVJDmy/s2+pS+1iNbL69crhH4jUarXeog/St9DA/076FhoA3wMD0ggYEEbAgDACBoQRMCCMgAEAOH1mfwGdx7oHd1aLQgAAAABJRU5ErkJggg=="},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>o});var i=t(7294);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.0fc48f5c.js b/assets/js/1df93b7f.1ca22ede.js similarity index 97% rename from assets/js/1df93b7f.0fc48f5c.js rename to assets/js/1df93b7f.1ca22ede.js index 4f6ce66b3d..7e796fd843 100644 --- a/assets/js/1df93b7f.0fc48f5c.js +++ b/assets/js/1df93b7f.1ca22ede.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[3237],{9722:(e,a,t)=>{t.d(a,{Z:()=>c});var l,r=t(7294);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...c}=e;return r.createElement("svg",n({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":t},c),void 0===a?r.createElement("title",{id:t},"Easy to Use"):a?r.createElement("title",{id:t},a):null,l||(l=r.createElement("g",{"data-name":"Group 12"},r.createElement("g",{"data-name":"Group 11"},r.createElement("path",{"data-name":"Path 83",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 84",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 85",d:"m302 282.962 26-57 36 83-31-60Z",opacity:.1}),r.createElement("path",{"data-name":"Path 86",d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z",opacity:.1}),r.createElement("path",{"data-name":"Path 87",d:"M464.411 315.191 493 292.962l130 150-132-128Z",opacity:.1}),r.createElement("path",{"data-name":"Path 88",d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z",opacity:.1}),r.createElement("circle",{"data-name":"Ellipse 11",cx:3,cy:3,r:3,transform:"translate(479 98.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 12",cx:3,cy:3,r:3,transform:"translate(396 201.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 13",cx:2,cy:2,r:2,transform:"translate(600 220.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 14",cx:2,cy:2,r:2,transform:"translate(180 265.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 15",cx:2,cy:2,r:2,transform:"translate(612 96.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 16",cx:2,cy:2,r:2,transform:"translate(736 192.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 17",cx:2,cy:2,r:2,transform:"translate(858 344.962)",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 89",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 90",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 91",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 92",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z",opacity:.1}),r.createElement("ellipse",{"data-name":"Ellipse 18",cx:544,cy:30,rx:544,ry:30,transform:"translate(0 583.962)",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 93",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z",fill:"#ff6584"}),r.createElement("path",{"data-name":"Path 94",d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z",opacity:.1}),r.createElement("rect",{"data-name":"Rectangle 97",width:92,height:18,rx:9,transform:"translate(489 604.962)",fill:"#2f2e41"}),r.createElement("rect",{"data-name":"Rectangle 98",width:92,height:18,rx:9,transform:"translate(489 586.962)",fill:"#2f2e41"}),r.createElement("path",{"data-name":"Path 95",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 96",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 97",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 98",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 99",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 100",d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z",opacity:.2}),r.createElement("path",{"data-name":"Path 101",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 102",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 103",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 104",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 105",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 106",d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z",opacity:.2}),r.createElement("path",{"data-name":"Path 107",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 108",d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z",opacity:.2}),r.createElement("path",{"data-name":"Path 109",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 110",d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z",opacity:.2}),r.createElement("path",{"data-name":"Path 111",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 112",d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z",opacity:.2}),r.createElement("path",{"data-name":"Path 113",d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z",opacity:.1}),r.createElement("path",{"data-name":"Path 114",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z",fill:"#3f3d56"})),r.createElement("path",{"data-name":"Path 40",d:"M360.175 475.732h91.791v37.153h-91.791Z",fill:"#fff",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 41",d:"M277.126 597.026a21.828 21.828 0 0 1-18.908-10.927 21.829 21.829 0 0 0 18.908 32.782h21.855v-21.855Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 42",d:"m375.451 481.607 76.514-4.782v-10.928a21.854 21.854 0 0 0-21.855-21.855h-98.347l-2.732-4.735a3.154 3.154 0 0 0-5.464 0l-2.732 4.732-2.732-4.732a3.154 3.154 0 0 0-5.464 0l-2.732 4.732-2.731-4.732a3.154 3.154 0 0 0-5.464 0l-2.732 4.735h-.071l-4.526-4.525a3.153 3.153 0 0 0-5.276 1.414l-1.5 5.577-5.674-1.521a3.154 3.154 0 0 0-3.863 3.864l1.52 5.679-5.575 1.494a3.155 3.155 0 0 0-1.416 5.278l4.526 4.526v.07l-4.735 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.727a3.154 3.154 0 0 0 0 5.464l4.735 2.736-4.735 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.735a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.728a3.154 3.154 0 0 0 0 5.464l4.732 2.732a21.854 21.854 0 0 0 21.858 21.855h131.13a21.854 21.854 0 0 0 21.855-21.855v-87.42l-76.514-4.782a11.632 11.632 0 0 1 0-23.219",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 43",d:"M408.255 618.882h32.782v-43.71h-32.782Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 44",d:"M462.893 591.563a5.438 5.438 0 0 0-.7.07c-.042-.164-.081-.329-.127-.493a5.457 5.457 0 1 0-5.4-9.372q-.181-.185-.366-.367a5.454 5.454 0 1 0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467 5.467 0 1 0-10.788 0c-.162.042-.325.08-.486.126a5.457 5.457 0 1 0-9.384 5.4 21.843 21.843 0 1 0 36.421 21.02 5.452 5.452 0 1 0 .7-10.858",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 45",d:"M419.183 553.317h32.782v-21.855h-32.782Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 46",d:"M462.893 545.121a2.732 2.732 0 1 0 0-5.464 2.811 2.811 0 0 0-.349.035c-.022-.082-.04-.164-.063-.246a2.733 2.733 0 0 0-1.052-5.253 2.7 2.7 0 0 0-1.648.566q-.09-.093-.184-.184a2.7 2.7 0 0 0 .553-1.633 2.732 2.732 0 0 0-5.245-1.07 10.928 10.928 0 1 0 0 21.031 2.732 2.732 0 0 0 5.245-1.07 2.7 2.7 0 0 0-.553-1.633q.093-.09.184-.184a2.7 2.7 0 0 0 1.648.566 2.732 2.732 0 0 0 1.052-5.253c.023-.081.042-.164.063-.246a2.814 2.814 0 0 0 .349.035",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 47",d:"M320.836 479.556a2.732 2.732 0 0 1-2.732-2.732 8.2 8.2 0 0 0-16.391 0 2.732 2.732 0 0 1-5.464 0 13.66 13.66 0 0 1 27.319 0 2.732 2.732 0 0 1-2.732 2.732",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 48",d:"M364.546 618.881h65.565a21.854 21.854 0 0 0 21.855-21.855v-76.492h-65.565a21.854 21.854 0 0 0-21.855 21.855Z",fill:"#ffff50",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 49",d:"M435.596 554.41h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0-54.434h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0 21.652h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m16.369-100.959c-.013 0-.024-.007-.037-.005-3.377.115-4.974 3.492-6.384 6.472-1.471 3.114-2.608 5.139-4.473 5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932 3.053-6.346 5.646-1.5 2.762-2.529 4.442-4.5 4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879 2.606-6.3 4.808-1.5 2.328-2.552 3.746-4.551 3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807 2.153-6.224 3.954-1.346 1.709-2.4 3.062-4.621 2.977a1.094 1.094 0 0 0-.079 2.186c3.3.11 4.967-1.967 6.417-3.81 1.286-1.635 2.4-3.045 4.582-3.12 2.1-.09 3.091 1.218 4.584 3.327 1.417 2 3.026 4.277 6.263 4.394 3.391.114 5.022-2.42 6.467-4.663 1.292-2 2.406-3.734 4.535-3.807 1.959-.073 3.026 1.475 4.529 4.022 1.417 2.4 3.023 5.121 6.324 5.241 3.415.118 5.064-2.863 6.5-5.5 1.245-2.282 2.419-4.437 4.5-4.509 1.959-.046 2.981 1.743 4.492 4.732 1.412 2.79 3.013 5.95 6.365 6.071h.185c3.348 0 4.937-3.36 6.343-6.331 1.245-2.634 2.423-5.114 4.444-5.216Z",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 50",d:"M342.691 618.882h43.71v-43.71h-43.71Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 8",transform:"rotate(-14.98 2188.845 -1120.376)"},r.createElement("rect",{"data-name":"Rectangle 3",width:92.361,height:36.462,rx:2,fill:"#d8d8d8"}),r.createElement("g",{"data-name":"Group 2",transform:"translate(1.531 23.03)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 4",width:5.336,height:5.336,rx:1,transform:"translate(16.797)"}),r.createElement("rect",{"data-name":"Rectangle 5",width:5.336,height:5.336,rx:1,transform:"translate(23.12)"}),r.createElement("rect",{"data-name":"Rectangle 6",width:5.336,height:5.336,rx:1,transform:"translate(29.444)"}),r.createElement("rect",{"data-name":"Rectangle 7",width:5.336,height:5.336,rx:1,transform:"translate(35.768)"}),r.createElement("rect",{"data-name":"Rectangle 8",width:5.336,height:5.336,rx:1,transform:"translate(42.091)"}),r.createElement("rect",{"data-name":"Rectangle 9",width:5.336,height:5.336,rx:1,transform:"translate(48.415)"}),r.createElement("rect",{"data-name":"Rectangle 10",width:5.336,height:5.336,rx:1,transform:"translate(54.739)"}),r.createElement("rect",{"data-name":"Rectangle 11",width:5.336,height:5.336,rx:1,transform:"translate(61.063)"}),r.createElement("rect",{"data-name":"Rectangle 12",width:5.336,height:5.336,rx:1,transform:"translate(67.386)"}),r.createElement("path",{"data-name":"Path 51",d:"M1.093 0h13.425a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H1.093A1.093 1.093 0 0 1 0 4.243v-3.15A1.093 1.093 0 0 1 1.093 0ZM75 0h13.426a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H75a1.093 1.093 0 0 1-1.093-1.093v-3.15A1.093 1.093 0 0 1 75 0Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 3",transform:"translate(1.531 10.261)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 52",d:"M1.093 0h5.125A1.093 1.093 0 0 1 7.31 1.093v3.149a1.093 1.093 0 0 1-1.092 1.093H1.093A1.093 1.093 0 0 1 0 4.242V1.093A1.093 1.093 0 0 1 1.093 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 13",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 14",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 15",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 16",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 17",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 18",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 19",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 20",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 21",width:5.336,height:5.336,rx:1,transform:"translate(58.888)"}),r.createElement("rect",{"data-name":"Rectangle 22",width:5.336,height:5.336,rx:1,transform:"translate(65.212)"}),r.createElement("rect",{"data-name":"Rectangle 23",width:5.336,height:5.336,rx:1,transform:"translate(71.536)"}),r.createElement("rect",{"data-name":"Rectangle 24",width:5.336,height:5.336,rx:1,transform:"translate(77.859)"}),r.createElement("rect",{"data-name":"Rectangle 25",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"})),r.createElement("g",{"data-name":"Group 4",transform:"rotate(180 45.525 4.773)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 53",d:"M1.093 0h5.126a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H1.093A1.093 1.093 0 0 1 0 4.243v-3.15A1.093 1.093 0 0 1 1.093 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 26",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 27",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 28",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 29",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 30",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 31",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 32",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 33",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 34",width:5.336,height:5.336,rx:1,transform:"translate(58.889)"}),r.createElement("rect",{"data-name":"Rectangle 35",width:5.336,height:5.336,rx:1,transform:"translate(65.213)"}),r.createElement("rect",{"data-name":"Rectangle 36",width:5.336,height:5.336,rx:1,transform:"translate(71.537)"}),r.createElement("rect",{"data-name":"Rectangle 37",width:5.336,height:5.336,rx:1,transform:"translate(77.86)"}),r.createElement("rect",{"data-name":"Rectangle 38",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"}),r.createElement("rect",{"data-name":"Rectangle 39",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 40",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 41",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 42",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 43",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 44",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 45",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 46",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 47",width:5.336,height:5.336,rx:1,transform:"translate(58.889)"}),r.createElement("rect",{"data-name":"Rectangle 48",width:5.336,height:5.336,rx:1,transform:"translate(65.213)"}),r.createElement("rect",{"data-name":"Rectangle 49",width:5.336,height:5.336,rx:1,transform:"translate(71.537)"}),r.createElement("rect",{"data-name":"Rectangle 50",width:5.336,height:5.336,rx:1,transform:"translate(77.86)"}),r.createElement("rect",{"data-name":"Rectangle 51",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"})),r.createElement("g",{"data-name":"Group 6",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 54",d:"M2.624 16.584h7.3a1.093 1.093 0 0 1 1.092 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093h-7.3a1.093 1.093 0 0 1-1.092-1.093v-3.149a1.093 1.093 0 0 1 1.093-1.094Z",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 5",transform:"translate(12.202 16.584)"},r.createElement("rect",{"data-name":"Rectangle 52",width:5.336,height:5.336,rx:1}),r.createElement("rect",{"data-name":"Rectangle 53",width:5.336,height:5.336,rx:1,transform:"translate(6.324)"}),r.createElement("rect",{"data-name":"Rectangle 54",width:5.336,height:5.336,rx:1,transform:"translate(12.647)"}),r.createElement("rect",{"data-name":"Rectangle 55",width:5.336,height:5.336,rx:1,transform:"translate(18.971)"}),r.createElement("rect",{"data-name":"Rectangle 56",width:5.336,height:5.336,rx:1,transform:"translate(25.295)"}),r.createElement("rect",{"data-name":"Rectangle 57",width:5.336,height:5.336,rx:1,transform:"translate(31.619)"}),r.createElement("rect",{"data-name":"Rectangle 58",width:5.336,height:5.336,rx:1,transform:"translate(37.942)"}),r.createElement("rect",{"data-name":"Rectangle 59",width:5.336,height:5.336,rx:1,transform:"translate(44.265)"}),r.createElement("rect",{"data-name":"Rectangle 60",width:5.336,height:5.336,rx:1,transform:"translate(50.589)"}),r.createElement("rect",{"data-name":"Rectangle 61",width:5.336,height:5.336,rx:1,transform:"translate(56.912)"}),r.createElement("rect",{"data-name":"Rectangle 62",width:5.336,height:5.336,rx:1,transform:"translate(63.236)"})),r.createElement("path",{"data-name":"Path 55",d:"M83.053 16.584h6.906a1.093 1.093 0 0 1 1.091 1.093v3.15a1.093 1.093 0 0 1-1.091 1.093h-6.907a1.093 1.093 0 0 1-1.093-1.093v-3.149a1.093 1.093 0 0 1 1.093-1.094Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 7",transform:"translate(1.531 29.627)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 63",width:5.336,height:5.336,rx:1}),r.createElement("rect",{"data-name":"Rectangle 64",width:5.336,height:5.336,rx:1,transform:"translate(6.324)"}),r.createElement("rect",{"data-name":"Rectangle 65",width:5.336,height:5.336,rx:1,transform:"translate(12.647)"}),r.createElement("rect",{"data-name":"Rectangle 66",width:5.336,height:5.336,rx:1,transform:"translate(18.971)"}),r.createElement("path",{"data-name":"Path 56",d:"M26.387 0h30.422a1.093 1.093 0 0 1 1.093 1.093v3.151a1.093 1.093 0 0 1-1.093 1.093H26.387a1.093 1.093 0 0 1-1.093-1.093V1.093A1.093 1.093 0 0 1 26.387 0Zm33.594 0h3.942a1.093 1.093 0 0 1 1.093 1.093v3.151a1.093 1.093 0 0 1-1.093 1.093h-3.942a1.093 1.093 0 0 1-1.093-1.093V1.093A1.093 1.093 0 0 1 59.981 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 67",width:5.336,height:5.336,rx:1,transform:"translate(66.003)"}),r.createElement("rect",{"data-name":"Rectangle 68",width:5.336,height:5.336,rx:1,transform:"translate(72.327)"}),r.createElement("rect",{"data-name":"Rectangle 69",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"}),r.createElement("path",{"data-name":"Path 57",d:"M78.254 2.273v-1.18A1.093 1.093 0 0 1 79.347 0h3.15a1.093 1.093 0 0 1 1.093 1.093v1.18Z"}),r.createElement("path",{"data-name":"Path 58",d:"M83.591 3.063v1.18a1.093 1.093 0 0 1-1.093 1.093h-3.15a1.093 1.093 0 0 1-1.093-1.093v-1.18Z"})),r.createElement("rect",{"data-name":"Rectangle 70",width:88.927,height:2.371,rx:1.085,transform:"translate(1.925 1.17)",fill:"#4a4a4a"}),r.createElement("rect",{"data-name":"Rectangle 71",width:4.986,height:1.581,rx:.723,transform:"translate(4.1 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 72",width:4.986,height:1.581,rx:.723,transform:"translate(10.923 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 73",width:4.986,height:1.581,rx:.723,transform:"translate(16.173 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 74",width:4.986,height:1.581,rx:.723,transform:"translate(21.421 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 75",width:4.986,height:1.581,rx:.723,transform:"translate(26.671 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 76",width:4.986,height:1.581,rx:.723,transform:"translate(33.232 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 77",width:4.986,height:1.581,rx:.723,transform:"translate(38.48 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 78",width:4.986,height:1.581,rx:.723,transform:"translate(43.73 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 79",width:4.986,height:1.581,rx:.723,transform:"translate(48.978 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 80",width:4.986,height:1.581,rx:.723,transform:"translate(55.54 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 81",width:4.986,height:1.581,rx:.723,transform:"translate(60.788 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 82",width:4.986,height:1.581,rx:.723,transform:"translate(66.038 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 83",width:4.986,height:1.581,rx:.723,transform:"translate(72.599 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 84",width:4.986,height:1.581,rx:.723,transform:"translate(77.847 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 85",width:4.986,height:1.581,rx:.723,transform:"translate(83.097 1.566)",fill:"#d8d8d8",opacity:.136})),r.createElement("path",{"data-name":"Path 59",d:"M408.256 591.563a5.439 5.439 0 0 0-.7.07c-.042-.164-.081-.329-.127-.493a5.457 5.457 0 1 0-5.4-9.372q-.181-.185-.366-.367a5.454 5.454 0 1 0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467 5.467 0 1 0-10.788 0c-.162.042-.325.08-.486.126a5.457 5.457 0 1 0-9.384 5.4 21.843 21.843 0 1 0 36.421 21.02 5.452 5.452 0 1 0 .7-10.858",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 60",d:"M342.691 553.317h43.71v-21.855h-43.71Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 61",d:"M397.328 545.121a2.732 2.732 0 1 0 0-5.464 2.811 2.811 0 0 0-.349.035c-.022-.082-.04-.164-.063-.246a2.733 2.733 0 0 0-1.052-5.253 2.7 2.7 0 0 0-1.648.566q-.09-.093-.184-.184a2.7 2.7 0 0 0 .553-1.633 2.732 2.732 0 0 0-5.245-1.07 10.928 10.928 0 1 0 0 21.031 2.732 2.732 0 0 0 5.245-1.07 2.7 2.7 0 0 0-.553-1.633q.093-.09.184-.184a2.7 2.7 0 0 0 1.648.566 2.732 2.732 0 0 0 1.052-5.253c.023-.081.042-.164.063-.246a2.811 2.811 0 0 0 .349.035",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 62",d:"M408.256 464.531a2.967 2.967 0 0 1-.535-.055 2.754 2.754 0 0 1-.514-.153 2.838 2.838 0 0 1-.471-.251 4.139 4.139 0 0 1-.415-.339 3.2 3.2 0 0 1-.338-.415 2.7 2.7 0 0 1-.459-1.517 2.968 2.968 0 0 1 .055-.535 3.152 3.152 0 0 1 .152-.514 2.874 2.874 0 0 1 .252-.47 2.633 2.633 0 0 1 .753-.754 2.837 2.837 0 0 1 .471-.251 2.753 2.753 0 0 1 .514-.153 2.527 2.527 0 0 1 1.071 0 2.654 2.654 0 0 1 .983.4 4.139 4.139 0 0 1 .415.339 4.019 4.019 0 0 1 .339.415 2.786 2.786 0 0 1 .251.47 2.864 2.864 0 0 1 .208 1.049 2.77 2.77 0 0 1-.8 1.934 4.139 4.139 0 0 1-.415.339 2.722 2.722 0 0 1-1.519.459m21.855-1.366a2.789 2.789 0 0 1-1.935-.8 4.162 4.162 0 0 1-.338-.415 2.7 2.7 0 0 1-.459-1.519 2.789 2.789 0 0 1 .8-1.934 4.139 4.139 0 0 1 .415-.339 2.838 2.838 0 0 1 .471-.251 2.752 2.752 0 0 1 .514-.153 2.527 2.527 0 0 1 1.071 0 2.654 2.654 0 0 1 .983.4 4.139 4.139 0 0 1 .415.339 2.79 2.79 0 0 1 .8 1.934 3.069 3.069 0 0 1-.055.535 2.779 2.779 0 0 1-.153.514 3.885 3.885 0 0 1-.251.47 4.02 4.02 0 0 1-.339.415 4.138 4.138 0 0 1-.415.339 2.722 2.722 0 0 1-1.519.459",fillRule:"evenodd"}))))}},8066:(e,a,t)=>{t.d(a,{Z:()=>c});var l,r=t(7294);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...c}=e;return r.createElement("svg",n({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":t},c),void 0===a?r.createElement("title",{id:t},"Powered by React"):a?r.createElement("title",{id:t},a):null,l||(l=r.createElement("g",{"data-name":"Group 24"},r.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},r.createElement("path",{"data-name":"Path 299",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 300",d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z",opacity:.1}),r.createElement("path",{"data-name":"Path 301",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 302",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z",opacity:.2}),r.createElement("path",{"data-name":"Path 303",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 304",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 305",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Rectangle 137",fill:"#3f3d56",d:"M680.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Rectangle 139",fill:"#3f3d56",d:"M678.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Path 306",d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 307",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 308",d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z",opacity:.1}),r.createElement("path",{"data-name":"Path 309",d:"M194.59 319.15h177.5V467.4l-177.5 4Z",fill:"#39374d"}),r.createElement("path",{"data-name":"Path 310",d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z",opacity:.1}),r.createElement("path",{"data-name":"Path 311",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 312",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z",opacity:.1}),r.createElement("path",{"data-name":"Path 313",d:"M775.59 319.15h-177.5V467.4l177.5 4Z",fill:"#39374d"}),r.createElement("path",{"data-name":"Path 314",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 315",d:"M397.09 319.15h177.5V467.4l-177.5 4Z",fill:"#4267b2"}),r.createElement("path",{"data-name":"Path 316",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z",opacity:.1}),r.createElement("circle",{"data-name":"Ellipse 111",cx:51.33,cy:51.33,r:51.33,transform:"translate(435.93 246.82)",fill:"#fbbebe"}),r.createElement("path",{"data-name":"Path 317",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z",fill:"#fbbebe"}),r.createElement("path",{"data-name":"Path 318",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z",fill:"#ff6584"}),r.createElement("path",{"data-name":"Path 319",d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 320",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 321",d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z",opacity:.1}),r.createElement("path",{"data-name":"Path 322",d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z",opacity:.1}),r.createElement("path",{"data-name":"Path 323",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 324",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z",opacity:.1}),r.createElement("path",{"data-name":"Path 325",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 326",d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z",opacity:.1}),r.createElement("path",{"data-name":"Path 327",d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z",opacity:.1}),r.createElement("path",{"data-name":"Path 328",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 329",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z",fill:"#3f3d56"})),r.createElement("path",{"data-name":"Path 40",d:"M280.139 370.832h43.635v17.662h-43.635Z",fill:"#fff",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 41",d:"M240.66 428.493a10.377 10.377 0 0 1-8.989-5.195 10.377 10.377 0 0 0 8.988 15.584h10.391v-10.389Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 42",d:"m287.402 373.625 36.373-2.273v-5.195a10.389 10.389 0 0 0-10.39-10.389h-46.75l-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249h-.034l-2.152-2.151a1.5 1.5 0 0 0-2.508.672l-.696 2.653-2.7-.723a1.5 1.5 0 0 0-1.836 1.837l.722 2.7-2.65.71a1.5 1.5 0 0 0-.673 2.509l2.152 2.152v.033l-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.25 1.282-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3a10.389 10.389 0 0 0 10.389 10.34h62.335a10.389 10.389 0 0 0 10.39-10.39v-41.557l-36.373-2.273a5.53 5.53 0 0 1 0-11.038",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 43",d:"M302.996 438.882h15.584v-20.779h-15.584Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 44",d:"M328.97 425.895a2.582 2.582 0 0 0-.332.033c-.02-.078-.038-.156-.06-.234a2.594 2.594 0 1 0-2.567-4.455q-.086-.088-.174-.175a2.593 2.593 0 1 0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6 2.6 0 1 0-5.128 0c-.077.02-.154.038-.231.06a2.594 2.594 0 1 0-4.461 2.569 10.384 10.384 0 1 0 17.314 9.992 2.592 2.592 0 1 0 .332-5.161",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 45",d:"M308.191 407.713h15.584v-10.389h-15.584Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 46",d:"M328.969 403.818a1.3 1.3 0 1 0 0-2.6 1.336 1.336 0 0 0-.166.017l-.03-.117a1.3 1.3 0 0 0-.5-2.5 1.285 1.285 0 0 0-.783.269l-.087-.087a1.285 1.285 0 0 0 .263-.776 1.3 1.3 0 0 0-2.493-.509 5.195 5.195 0 1 0 0 10 1.3 1.3 0 0 0 2.493-.509 1.285 1.285 0 0 0-.263-.776l.087-.087a1.285 1.285 0 0 0 .783.269 1.3 1.3 0 0 0 .5-2.5c.011-.038.02-.078.03-.117a1.337 1.337 0 0 0 .166.017",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 47",d:"M261.439 372.65a1.3 1.3 0 0 1-1.3-1.3 3.9 3.9 0 0 0-7.792 0 1.3 1.3 0 1 1-2.6 0 6.494 6.494 0 0 1 12.987 0 1.3 1.3 0 0 1-1.3 1.3",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 48",d:"M282.217 438.882h31.168a10.389 10.389 0 0 0 10.389-10.389V392.13h-31.168a10.389 10.389 0 0 0-10.389 10.389Z",fill:"#ffff50",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 49",d:"M315.993 408.233h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0-25.877h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.293h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m7.782-47.993h-.018c-1.605.055-2.365 1.66-3.035 3.077-.7 1.48-1.24 2.443-2.126 2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344 1.451-3.017 2.684-.715 1.313-1.2 2.112-2.141 2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319 1.239-2.994 2.286-.713 1.106-1.213 1.781-2.164 1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815 3.815 0 0 0-2.959 1.879c-.64.812-1.14 1.456-2.2 1.415a.52.52 0 0 0-.037 1.039 3.588 3.588 0 0 0 3.05-1.811c.611-.777 1.139-1.448 2.178-1.483 1-.043 1.47.579 2.179 1.582.674.953 1.438 2.033 2.977 2.089 1.612.054 2.387-1.151 3.074-2.217.614-.953 1.144-1.775 2.156-1.81.931-.035 1.438.7 2.153 1.912.674 1.141 1.437 2.434 3.006 2.491 1.623.056 2.407-1.361 3.09-2.616.592-1.085 1.15-2.109 2.14-2.143.931-.022 1.417.829 2.135 2.249.671 1.326 1.432 2.828 3.026 2.886h.088c1.592 0 2.347-1.6 3.015-3.01.592-1.252 1.152-2.431 2.113-2.479Z",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 50",d:"M271.828 438.882h20.779v-20.779h-20.779Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 8",transform:"rotate(-14.98 1643.944 -873.93)"},r.createElement("rect",{"data-name":"Rectangle 3",width:43.906,height:17.333,rx:2,fill:"#d8d8d8"}),r.createElement("g",{"data-name":"Group 2",transform:"translate(.728 10.948)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 4",width:2.537,height:2.537,rx:1,transform:"translate(7.985)"}),r.createElement("rect",{"data-name":"Rectangle 5",width:2.537,height:2.537,rx:1,transform:"translate(10.991)"}),r.createElement("rect",{"data-name":"Rectangle 6",width:2.537,height:2.537,rx:1,transform:"translate(13.997)"}),r.createElement("rect",{"data-name":"Rectangle 7",width:2.537,height:2.537,rx:1,transform:"translate(17.003)"}),r.createElement("rect",{"data-name":"Rectangle 8",width:2.537,height:2.537,rx:1,transform:"translate(20.009)"}),r.createElement("rect",{"data-name":"Rectangle 9",width:2.537,height:2.537,rx:1,transform:"translate(23.015)"}),r.createElement("rect",{"data-name":"Rectangle 10",width:2.537,height:2.537,rx:1,transform:"translate(26.021)"}),r.createElement("rect",{"data-name":"Rectangle 11",width:2.537,height:2.537,rx:1,transform:"translate(29.028)"}),r.createElement("rect",{"data-name":"Rectangle 12",width:2.537,height:2.537,rx:1,transform:"translate(32.034)"}),r.createElement("path",{"data-name":"Path 51",d:"M.519 0H6.9a.519.519 0 0 1 .521.52v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Zm35.134 0h6.383a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-6.384a.519.519 0 0 1-.519-.519v-1.5A.519.519 0 0 1 35.652 0Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 3",transform:"translate(.728 4.878)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 52",d:"M.519 0h2.437a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 13",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 14",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 15",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 16",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 17",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 18",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 19",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 20",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 21",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 22",width:2.537,height:2.537,rx:1,transform:"translate(31)"}),r.createElement("rect",{"data-name":"Rectangle 23",width:2.537,height:2.537,rx:1,transform:"translate(34.006)"}),r.createElement("rect",{"data-name":"Rectangle 24",width:2.537,height:2.537,rx:1,transform:"translate(37.012)"}),r.createElement("rect",{"data-name":"Rectangle 25",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"})),r.createElement("g",{"data-name":"Group 4",transform:"rotate(180 21.642 2.269)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 53",d:"M.519 0h2.437a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 26",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 27",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 28",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 29",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 30",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 31",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 32",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 33",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 34",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 35",width:2.537,height:2.537,rx:1,transform:"translate(31.001)"}),r.createElement("rect",{"data-name":"Rectangle 36",width:2.537,height:2.537,rx:1,transform:"translate(34.007)"}),r.createElement("rect",{"data-name":"Rectangle 37",width:2.537,height:2.537,rx:1,transform:"translate(37.013)"}),r.createElement("rect",{"data-name":"Rectangle 38",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"}),r.createElement("rect",{"data-name":"Rectangle 39",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 40",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 41",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 42",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 43",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 44",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 45",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 46",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 47",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 48",width:2.537,height:2.537,rx:1,transform:"translate(31.001)"}),r.createElement("rect",{"data-name":"Rectangle 49",width:2.537,height:2.537,rx:1,transform:"translate(34.007)"}),r.createElement("rect",{"data-name":"Rectangle 50",width:2.537,height:2.537,rx:1,transform:"translate(37.013)"}),r.createElement("rect",{"data-name":"Rectangle 51",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"})),r.createElement("g",{"data-name":"Group 6",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 54",d:"M1.247 7.883h3.47a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-3.47A.519.519 0 0 1 .728 9.9V8.403a.519.519 0 0 1 .519-.52Z",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 5",transform:"translate(5.801 7.883)"},r.createElement("rect",{"data-name":"Rectangle 52",width:2.537,height:2.537,rx:1}),r.createElement("rect",{"data-name":"Rectangle 53",width:2.537,height:2.537,rx:1,transform:"translate(3.006)"}),r.createElement("rect",{"data-name":"Rectangle 54",width:2.537,height:2.537,rx:1,transform:"translate(6.012)"}),r.createElement("rect",{"data-name":"Rectangle 55",width:2.537,height:2.537,rx:1,transform:"translate(9.018)"}),r.createElement("rect",{"data-name":"Rectangle 56",width:2.537,height:2.537,rx:1,transform:"translate(12.025)"}),r.createElement("rect",{"data-name":"Rectangle 57",width:2.537,height:2.537,rx:1,transform:"translate(15.031)"}),r.createElement("rect",{"data-name":"Rectangle 58",width:2.537,height:2.537,rx:1,transform:"translate(18.037)"}),r.createElement("rect",{"data-name":"Rectangle 59",width:2.537,height:2.537,rx:1,transform:"translate(21.042)"}),r.createElement("rect",{"data-name":"Rectangle 60",width:2.537,height:2.537,rx:1,transform:"translate(24.049)"}),r.createElement("rect",{"data-name":"Rectangle 61",width:2.537,height:2.537,rx:1,transform:"translate(27.055)"}),r.createElement("rect",{"data-name":"Rectangle 62",width:2.537,height:2.537,rx:1,transform:"translate(30.061)"})),r.createElement("path",{"data-name":"Path 55",d:"M39.482 7.883h3.28a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-3.281a.519.519 0 0 1-.519-.521V8.403a.519.519 0 0 1 .519-.52Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 7",transform:"translate(.728 14.084)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 63",width:2.537,height:2.537,rx:1}),r.createElement("rect",{"data-name":"Rectangle 64",width:2.537,height:2.537,rx:1,transform:"translate(3.006)"}),r.createElement("rect",{"data-name":"Rectangle 65",width:2.537,height:2.537,rx:1,transform:"translate(6.012)"}),r.createElement("rect",{"data-name":"Rectangle 66",width:2.537,height:2.537,rx:1,transform:"translate(9.018)"}),r.createElement("path",{"data-name":"Path 56",d:"M12.543 0h14.462a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H12.543a.519.519 0 0 1-.519-.52V.519A.519.519 0 0 1 12.543 0Zm15.97 0h1.874a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-1.874a.519.519 0 0 1-.519-.519v-1.5A.519.519 0 0 1 28.513 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 67",width:2.537,height:2.537,rx:1,transform:"translate(31.376)"}),r.createElement("rect",{"data-name":"Rectangle 68",width:2.537,height:2.537,rx:1,transform:"translate(34.382)"}),r.createElement("rect",{"data-name":"Rectangle 69",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"}),r.createElement("path",{"data-name":"Path 57",d:"M37.199 1.08V.519A.519.519 0 0 1 37.718 0h1.499a.519.519 0 0 1 .519.519v.561Z"}),r.createElement("path",{"data-name":"Path 58",d:"M39.737 1.456v.561a.519.519 0 0 1-.519.519h-1.499a.519.519 0 0 1-.519-.519v-.561Z"})),r.createElement("rect",{"data-name":"Rectangle 70",width:42.273,height:1.127,rx:.564,transform:"translate(.915 .556)",fill:"#4a4a4a"}),r.createElement("rect",{"data-name":"Rectangle 71",width:2.37,height:.752,rx:.376,transform:"translate(1.949 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 72",width:2.37,height:.752,rx:.376,transform:"translate(5.193 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 73",width:2.37,height:.752,rx:.376,transform:"translate(7.688 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 74",width:2.37,height:.752,rx:.376,transform:"translate(10.183 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 75",width:2.37,height:.752,rx:.376,transform:"translate(12.679 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 76",width:2.37,height:.752,rx:.376,transform:"translate(15.797 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 77",width:2.37,height:.752,rx:.376,transform:"translate(18.292 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 78",width:2.37,height:.752,rx:.376,transform:"translate(20.788 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 79",width:2.37,height:.752,rx:.376,transform:"translate(23.283 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 80",width:2.37,height:.752,rx:.376,transform:"translate(26.402 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 81",width:2.37,height:.752,rx:.376,transform:"translate(28.897 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 82",width:2.37,height:.752,rx:.376,transform:"translate(31.393 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 83",width:2.37,height:.752,rx:.376,transform:"translate(34.512 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 84",width:2.37,height:.752,rx:.376,transform:"translate(37.007 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 85",width:2.37,height:.752,rx:.376,transform:"translate(39.502 .744)",fill:"#d8d8d8",opacity:.136})),r.createElement("path",{"data-name":"Path 59",d:"M302.996 425.895a2.583 2.583 0 0 0-.332.033c-.02-.078-.038-.156-.06-.234a2.594 2.594 0 1 0-2.567-4.455q-.086-.088-.174-.175a2.593 2.593 0 1 0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6 2.6 0 1 0-5.128 0c-.077.02-.154.038-.231.06a2.594 2.594 0 1 0-4.461 2.569 10.384 10.384 0 1 0 17.314 9.992 2.592 2.592 0 1 0 .332-5.161",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 60",d:"M271.828 407.713h20.779v-10.389h-20.779Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 61",d:"M297.801 403.818a1.3 1.3 0 1 0 0-2.6 1.338 1.338 0 0 0-.166.017l-.03-.117a1.3 1.3 0 0 0-.5-2.5 1.285 1.285 0 0 0-.783.269l-.087-.087a1.285 1.285 0 0 0 .263-.776 1.3 1.3 0 0 0-2.493-.509 5.195 5.195 0 1 0 0 10 1.3 1.3 0 0 0 2.493-.509 1.285 1.285 0 0 0-.263-.776l.087-.087a1.285 1.285 0 0 0 .783.269 1.3 1.3 0 0 0 .5-2.5c.011-.038.02-.078.03-.117a1.335 1.335 0 0 0 .166.017",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 62",d:"M302.997 365.507a1.41 1.41 0 0 1-.255-.026 1.309 1.309 0 0 1-.244-.073 1.349 1.349 0 0 1-.224-.119 1.967 1.967 0 0 1-.2-.161 1.52 1.52 0 0 1-.161-.2 1.282 1.282 0 0 1-.218-.722 1.41 1.41 0 0 1 .026-.255 1.5 1.5 0 0 1 .072-.244 1.364 1.364 0 0 1 .12-.223 1.252 1.252 0 0 1 .358-.358 1.349 1.349 0 0 1 .224-.119 1.309 1.309 0 0 1 .244-.073 1.2 1.2 0 0 1 .509 0 1.262 1.262 0 0 1 .468.192 1.968 1.968 0 0 1 .2.161 1.908 1.908 0 0 1 .161.2 1.322 1.322 0 0 1 .12.223 1.361 1.361 0 0 1 .1.5 1.317 1.317 0 0 1-.379.919 1.968 1.968 0 0 1-.2.161 1.346 1.346 0 0 1-.223.119 1.332 1.332 0 0 1-.5.1m10.389-.649a1.326 1.326 0 0 1-.92-.379 1.979 1.979 0 0 1-.161-.2 1.282 1.282 0 0 1-.218-.722 1.326 1.326 0 0 1 .379-.919 1.967 1.967 0 0 1 .2-.161 1.351 1.351 0 0 1 .224-.119 1.308 1.308 0 0 1 .244-.073 1.2 1.2 0 0 1 .509 0 1.262 1.262 0 0 1 .468.192 1.967 1.967 0 0 1 .2.161 1.326 1.326 0 0 1 .379.919 1.461 1.461 0 0 1-.026.255 1.323 1.323 0 0 1-.073.244 1.847 1.847 0 0 1-.119.223 1.911 1.911 0 0 1-.161.2 1.967 1.967 0 0 1-.2.161 1.294 1.294 0 0 1-.722.218",fillRule:"evenodd"}),r.createElement("g",{transform:"translate(466.3 278.56)",fill:"#61dafb"},r.createElement("path",{"data-name":"Path 330",d:"M263.668 117.179c0-5.827-7.3-11.35-18.487-14.775 2.582-11.4 1.434-20.477-3.622-23.382a7.861 7.861 0 0 0-4.016-1v4a4.152 4.152 0 0 1 2.044.466c2.439 1.4 3.5 6.724 2.672 13.574-.2 1.685-.52 3.461-.914 5.272a86.9 86.9 0 0 0-11.386-1.954 87.469 87.469 0 0 0-7.459-8.965c5.845-5.433 11.332-8.41 15.062-8.41V78c-4.931 0-11.386 3.514-17.913 9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712 0 9.216 2.959 15.062 8.356a84.687 84.687 0 0 0-7.405 8.947 83.732 83.732 0 0 0-11.4 1.972 54.136 54.136 0 0 1-.932-5.2c-.843-6.85.2-12.175 2.618-13.592a3.991 3.991 0 0 1 2.062-.466v-4a8 8 0 0 0-4.052 1c-5.039 2.9-6.168 11.96-3.568 23.328-11.153 3.443-18.415 8.947-18.415 14.757 0 5.828 7.3 11.35 18.487 14.775-2.582 11.4-1.434 20.477 3.622 23.382a7.882 7.882 0 0 0 4.034 1c4.931 0 11.386-3.514 17.913-9.611 6.527 6.061 12.982 9.539 17.913 9.539a8 8 0 0 0 4.052-1c5.039-2.9 6.168-11.96 3.568-23.328 11.111-3.42 18.373-8.943 18.373-14.752Zm-23.346-11.96a80.235 80.235 0 0 1-2.421 7.083 83.185 83.185 0 0 0-2.349-4.3 96.877 96.877 0 0 0-2.582-4.2c2.547.377 5.004.843 7.353 1.417Zm-8.212 19.1c-1.4 2.421-2.833 4.716-4.321 6.85a93.313 93.313 0 0 1-8.1.359c-2.708 0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136a94.058 94.058 0 0 1 3.712-7.154c1.4-2.421 2.833-4.716 4.321-6.85a93.313 93.313 0 0 1 8.1-.359c2.708 0 5.415.126 8.069.341q2.232 3.2 4.339 6.814 2.044 3.523 3.73 7.136a101.198 101.198 0 0 1-3.712 7.15Zm5.792-2.331a76.525 76.525 0 0 1 2.474 7.136 80.22 80.22 0 0 1-7.387 1.434c.879-1.381 1.757-2.8 2.582-4.25a96.22 96.22 0 0 0 2.329-4.324Zm-18.182 19.128a73.921 73.921 0 0 1-4.985-5.738c1.614.072 3.263.126 4.931.126 1.685 0 3.353-.036 4.985-.126a69.993 69.993 0 0 1-4.931 5.738Zm-13.34-10.561c-2.546-.377-5-.843-7.352-1.417a80.235 80.235 0 0 1 2.421-7.083c.735 1.434 1.506 2.869 2.349 4.3s1.702 2.837 2.582 4.2Zm13.25-37.314a73.924 73.924 0 0 1 4.985 5.738 110.567 110.567 0 0 0-4.931-.126c-1.686 0-3.353.036-4.985.126a69.993 69.993 0 0 1 4.931-5.738ZM206.362 103.8a100.567 100.567 0 0 0-4.913 8.55 76.525 76.525 0 0 1-2.474-7.136 90.158 90.158 0 0 1 7.387-1.414Zm-16.227 22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383 10.454-9.073c1.542-.663 3.228-1.255 4.967-1.811a86.122 86.122 0 0 0 4.034 10.92 84.9 84.9 0 0 0-3.981 10.866 53.804 53.804 0 0 1-5.021-1.826Zm9.647 25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9 86.9 0 0 0 11.386 1.954 87.465 87.465 0 0 0 7.459 8.965c-5.845 5.433-11.332 8.41-15.062 8.41a4.279 4.279 0 0 1-2.026-.48Zm42.532-13.663c.843 6.85-.2 12.175-2.618 13.592a3.99 3.99 0 0 1-2.062.466c-3.712 0-9.216-2.959-15.062-8.356a84.689 84.689 0 0 0 7.405-8.947 83.731 83.731 0 0 0 11.4-1.972 50.194 50.194 0 0 1 .936 5.22Zm6.9-11.96c-1.542.663-3.228 1.255-4.967 1.811a86.12 86.12 0 0 0-4.034-10.92 84.9 84.9 0 0 0 3.981-10.866 56.777 56.777 0 0 1 5.039 1.829c6.348 2.708 10.454 6.258 10.454 9.073-.017 2.818-4.123 6.386-10.471 9.076Z"}),r.createElement("path",{"data-name":"Path 331",d:"M201.718 78.072Z"}),r.createElement("circle",{"data-name":"Ellipse 112",cx:8.194,cy:8.194,r:8.194,transform:"translate(211.472 108.984)"}),r.createElement("path",{"data-name":"Path 332",d:"M237.525 78.018Z"})))))}},4002:(e,a,t)=>{t.d(a,{Z:()=>F});var l,r,n,c,h,d,m,i,s,f,o,g,E,p,v,x,R,w,u,Z,M,y,P,b,S,j,q,V,A,H,G,N,O,C,D,B,_=t(7294);function z(){return z=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...F}=e;return _.createElement("svg",z({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":t},F),void 0===a?_.createElement("title",{id:t},"Focus on What Matters"):a?_.createElement("title",{id:t},a):null,l||(l=_.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),r||(r=_.createElement("ellipse",{cx:559,cy:635.5,rx:514,ry:27.5,fill:"#3f3d56"})),n||(n=_.createElement("ellipse",{cx:558,cy:627,rx:460,ry:22,opacity:.2})),c||(c=_.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),h||(h=_.createElement("path",{d:"M131 608.83a21.67 21.67 0 0 0 21.67 21.67h796.66A21.67 21.67 0 0 0 971 608.83V177.5H131ZM949.33 117.5H152.67A21.67 21.67 0 0 0 131 139.17v38.33h840v-38.33a21.67 21.67 0 0 0-21.67-21.67Z",fill:"#3f3d56"})),d||(d=_.createElement("path",{d:"M949.33 117.5H152.67A21.67 21.67 0 0 0 131 139.17v38.33h840v-38.33a21.67 21.67 0 0 0-21.67-21.67Z",opacity:.2})),m||(m=_.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),i||(i=_.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=_.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=_.createElement("rect",{x:168,y:213.5,width:337,height:386,rx:5.335,fill:"#606060"})),o||(o=_.createElement("rect",{x:603,y:272.5,width:284,height:22,rx:5.476,fill:"#2e8555"})),g||(g=_.createElement("rect",{x:537,y:352.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),E||(E=_.createElement("rect",{x:537,y:396.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),p||(p=_.createElement("rect",{x:537,y:440.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),v||(v=_.createElement("rect",{x:537,y:484.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),x||(x=_.createElement("rect",{x:865,y:552.5,width:88,height:26,rx:7.028,fill:"#3ecc5f"})),R||(R=_.createElement("path",{d:"M1053.103 506.116a30.114 30.114 0 0 0 3.983-15.266c0-13.797-8.544-24.98-19.083-24.98s-19.082 11.183-19.082 24.98a30.114 30.114 0 0 0 3.983 15.266 31.248 31.248 0 0 0 0 30.532 31.248 31.248 0 0 0 0 30.532 31.248 31.248 0 0 0 0 30.532 30.114 30.114 0 0 0-3.983 15.266c0 13.797 8.543 24.981 19.082 24.981s19.083-11.184 19.083-24.98a30.114 30.114 0 0 0-3.983-15.267 31.248 31.248 0 0 0 0-30.532 31.248 31.248 0 0 0 0-30.532 31.248 31.248 0 0 0 0-30.532Z",fill:"#3f3d56"})),w||(w=_.createElement("ellipse",{cx:1038.003,cy:460.318,rx:19.083,ry:24.981,fill:"#3f3d56"})),u||(u=_.createElement("ellipse",{cx:1038.003,cy:429.786,rx:19.083,ry:24.981,fill:"#3f3d56"})),Z||(Z=_.createElement("path",{d:"M1109.439 220.845a91.61 91.61 0 0 0 7.106-10.461l-50.14-8.235 54.228.403a91.566 91.566 0 0 0 1.746-72.426l-72.755 37.742 67.097-49.321A91.413 91.413 0 1 0 965.75 220.845a91.458 91.458 0 0 0-10.425 16.67l65.087 33.814-69.4-23.292a91.46 91.46 0 0 0 14.738 85.837 91.406 91.406 0 1 0 143.689 0 91.418 91.418 0 0 0 0-113.03Z",fill:"#3ecc5f",fillRule:"evenodd"})),M||(M=_.createElement("path",{d:"M946.188 277.36a91.013 91.013 0 0 0 19.562 56.514 91.406 91.406 0 1 0 143.689 0c12.25-15.553-163.25-66.774-163.25-56.515Z",opacity:.1})),y||(y=_.createElement("path",{d:"M330.12 342.936h111.474v45.12H330.12Z",fill:"#fff",fillRule:"evenodd"})),P||(P=_.createElement("path",{d:"M229.263 490.241a26.51 26.51 0 0 1-22.963-13.27 26.51 26.51 0 0 0 22.963 39.812h26.541V490.24Z",fill:"#3ecc5f",fillRule:"evenodd"})),b||(b=_.createElement("path",{d:"m348.672 350.07 92.922-5.807v-13.27a26.54 26.54 0 0 0-26.541-26.542H295.616l-3.318-5.746a3.83 3.83 0 0 0-6.635 0l-3.318 5.746-3.317-5.746a3.83 3.83 0 0 0-6.636 0l-3.317 5.746-3.318-5.746a3.83 3.83 0 0 0-6.635 0l-3.318 5.746c-.03 0-.056.004-.086.004l-5.497-5.495a3.83 3.83 0 0 0-6.407 1.717l-1.817 6.773-6.89-1.847a3.83 3.83 0 0 0-4.691 4.693l1.844 6.891-6.77 1.814a3.832 3.832 0 0 0-1.72 6.41l5.497 5.497c0 .028-.004.055-.004.085l-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318a26.54 26.54 0 0 0 26.541 26.542h159.249a26.54 26.54 0 0 0 26.541-26.542V384.075l-92.922-5.807a14.126 14.126 0 0 1 0-28.197",fill:"#3ecc5f",fillRule:"evenodd"})),S||(S=_.createElement("path",{d:"M388.511 516.783h39.812V463.7h-39.812Z",fill:"#3ecc5f",fillRule:"evenodd"})),j||(j=_.createElement("path",{d:"M454.865 483.606a6.602 6.602 0 0 0-.848.085c-.05-.2-.099-.4-.154-.599a6.627 6.627 0 1 0-6.557-11.382q-.22-.225-.445-.446a6.624 6.624 0 1 0-11.397-6.564c-.196-.055-.394-.102-.59-.152a6.64 6.64 0 1 0-13.101 0c-.197.05-.394.097-.59.152a6.628 6.628 0 1 0-11.398 6.564 26.528 26.528 0 1 0 44.232 25.528 6.621 6.621 0 1 0 .848-13.186",fill:"#44d860",fillRule:"evenodd"})),q||(q=_.createElement("path",{d:"M401.782 437.158h39.812v-26.541h-39.812Z",fill:"#3ecc5f",fillRule:"evenodd"})),V||(V=_.createElement("path",{d:"M454.865 427.205a3.318 3.318 0 0 0 0-6.635 3.411 3.411 0 0 0-.424.042c-.026-.1-.049-.199-.077-.298a3.319 3.319 0 0 0-1.278-6.38 3.282 3.282 0 0 0-2 .688q-.11-.113-.224-.223a3.282 3.282 0 0 0 .672-1.983 3.318 3.318 0 0 0-6.37-1.299 13.27 13.27 0 1 0 0 25.541 3.318 3.318 0 0 0 6.37-1.3 3.282 3.282 0 0 0-.672-1.982q.114-.11.223-.223a3.282 3.282 0 0 0 2.001.688 3.318 3.318 0 0 0 1.278-6.38c.028-.098.05-.199.077-.298a3.413 3.413 0 0 0 .424.042",fill:"#44d860",fillRule:"evenodd"})),A||(A=_.createElement("path",{d:"M282.345 347.581a3.318 3.318 0 0 1-3.317-3.318 9.953 9.953 0 1 0-19.906 0 3.318 3.318 0 1 1-6.636 0 16.588 16.588 0 1 1 33.177 0 3.318 3.318 0 0 1-3.318 3.318",fillRule:"evenodd"})),H||(H=_.createElement("path",{d:"M335.428 516.783h79.625a26.54 26.54 0 0 0 26.541-26.542v-92.895H361.97a26.54 26.54 0 0 0-26.542 26.542Z",fill:"#ffff50",fillRule:"evenodd"})),G||(G=_.createElement("path",{d:"M421.714 438.485h-66.406a1.327 1.327 0 0 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.542h-66.406a1.327 1.327 0 1 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.541h-66.406a1.327 1.327 0 1 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0-66.106h-66.406a1.327 1.327 0 0 1 0-2.655h66.406a1.327 1.327 0 0 1 0 2.655m0 26.294h-66.406a1.327 1.327 0 0 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.542h-66.406a1.327 1.327 0 0 1 0-2.655h66.406a1.327 1.327 0 0 1 0 2.655m19.88-122.607c-.016 0-.03-.008-.045-.007-4.1.14-6.04 4.241-7.753 7.86-1.786 3.783-3.168 6.242-5.432 6.167-2.506-.09-3.94-2.922-5.458-5.918-1.744-3.443-3.734-7.347-7.913-7.201-4.042.138-5.99 3.708-7.706 6.857-1.828 3.355-3.071 5.394-5.47 5.3-2.557-.093-3.916-2.395-5.488-5.06-1.753-2.967-3.78-6.304-7.878-6.19-3.973.137-5.925 3.166-7.648 5.84-1.822 2.826-3.098 4.549-5.527 4.447-2.618-.093-3.97-2.004-5.535-4.216-1.757-2.486-3.737-5.3-7.823-5.163-3.886.133-5.838 2.615-7.56 4.802-1.634 2.075-2.91 3.718-5.611 3.615a1.328 1.328 0 1 0-.096 2.654c4.004.134 6.032-2.389 7.793-4.628 1.562-1.985 2.91-3.698 5.564-3.789 2.556-.108 3.754 1.48 5.567 4.041 1.721 2.434 3.675 5.195 7.606 5.337 4.118.138 6.099-2.94 7.853-5.663 1.569-2.434 2.923-4.535 5.508-4.624 2.38-.088 3.674 1.792 5.5 4.885 1.722 2.916 3.671 6.22 7.68 6.365 4.147.143 6.15-3.477 7.895-6.682 1.511-2.77 2.938-5.388 5.466-5.475 2.38-.056 3.62 2.116 5.456 5.746 1.714 3.388 3.658 7.226 7.73 7.373l.224.004c4.066 0 5.996-4.08 7.704-7.689 1.511-3.198 2.942-6.21 5.397-6.334Z",fillRule:"evenodd"})),N||(N=_.createElement("path",{d:"M308.887 516.783h53.083V463.7h-53.083Z",fill:"#3ecc5f",fillRule:"evenodd"})),O||(O=_.createElement("path",{d:"M388.511 483.606a6.602 6.602 0 0 0-.848.085c-.05-.2-.098-.4-.154-.599a6.627 6.627 0 1 0-6.557-11.382q-.22-.225-.444-.446a6.624 6.624 0 1 0-11.397-6.564c-.197-.055-.394-.102-.59-.152a6.64 6.64 0 1 0-13.102 0c-.196.05-.394.097-.59.152a6.628 6.628 0 1 0-11.397 6.564 26.528 26.528 0 1 0 44.231 25.528 6.621 6.621 0 1 0 .848-13.186",fill:"#44d860",fillRule:"evenodd"})),C||(C=_.createElement("path",{d:"M308.887 437.158h53.083v-26.541h-53.083Z",fill:"#3ecc5f",fillRule:"evenodd"})),D||(D=_.createElement("path",{d:"M375.24 427.205a3.318 3.318 0 1 0 0-6.635 3.411 3.411 0 0 0-.423.042c-.026-.1-.05-.199-.077-.298a3.319 3.319 0 0 0-1.278-6.38 3.282 3.282 0 0 0-2.001.688q-.11-.113-.223-.223a3.282 3.282 0 0 0 .671-1.983 3.318 3.318 0 0 0-6.37-1.299 13.27 13.27 0 1 0 0 25.541 3.318 3.318 0 0 0 6.37-1.3 3.282 3.282 0 0 0-.671-1.982q.113-.11.223-.223a3.282 3.282 0 0 0 2.001.688 3.318 3.318 0 0 0 1.278-6.38c.028-.098.05-.199.077-.298a3.413 3.413 0 0 0 .423.042",fill:"#44d860",fillRule:"evenodd"})),B||(B=_.createElement("path",{d:"M388.511 329.334a3.603 3.603 0 0 1-.65-.067 3.344 3.344 0 0 1-.624-.185 3.447 3.447 0 0 1-.572-.306 5.027 5.027 0 0 1-.504-.411 3.887 3.887 0 0 1-.41-.504 3.275 3.275 0 0 1-.558-1.845 3.602 3.602 0 0 1 .067-.65 3.826 3.826 0 0 1 .184-.624 3.489 3.489 0 0 1 .307-.57 3.197 3.197 0 0 1 .914-.916 3.447 3.447 0 0 1 .572-.305 3.344 3.344 0 0 1 .624-.186 3.07 3.07 0 0 1 1.3 0 3.223 3.223 0 0 1 1.195.49 5.028 5.028 0 0 1 .504.412 4.88 4.88 0 0 1 .411.504 3.382 3.382 0 0 1 .306.571 3.478 3.478 0 0 1 .252 1.274 3.364 3.364 0 0 1-.969 2.349 5.027 5.027 0 0 1-.504.411 3.306 3.306 0 0 1-1.845.558m26.542-1.66a3.388 3.388 0 0 1-2.35-.968 5.042 5.042 0 0 1-.41-.504 3.275 3.275 0 0 1-.558-1.845 3.387 3.387 0 0 1 .967-2.349 5.026 5.026 0 0 1 .505-.411 3.447 3.447 0 0 1 .572-.305 3.343 3.343 0 0 1 .623-.186 3.07 3.07 0 0 1 1.3 0 3.224 3.224 0 0 1 1.195.49 5.026 5.026 0 0 1 .504.412 3.388 3.388 0 0 1 .97 2.35 3.726 3.726 0 0 1-.067.65 3.374 3.374 0 0 1-.186.623 4.715 4.715 0 0 1-.305.57 4.88 4.88 0 0 1-.412.505 5.026 5.026 0 0 1-.504.412 3.305 3.305 0 0 1-1.844.557",fillRule:"evenodd"})))}},4470:(e,a,t)=>{t.r(a),t.d(a,{default:()=>p});var l=t(512),r=t(3692),n=t(2263),c=t(7372),h=t(2503);const d={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var m=t(5893);const i=[{title:"Easy to Use",Svg:t(9722).Z,description:(0,m.jsx)(m.Fragment,{children:"Docusaurus was designed from the ground up to be easily installed and used to get your website up and running quickly."})},{title:"Focus on What Matters",Svg:t(4002).Z,description:(0,m.jsxs)(m.Fragment,{children:["Docusaurus lets you focus on your docs, and we'll do the chores. Go ahead and move your docs into the ",(0,m.jsx)("code",{children:"docs"})," directory."]})},{title:"Powered by React",Svg:t(8066).Z,description:(0,m.jsx)(m.Fragment,{children:"Extend or customize your website layout by reusing React. Docusaurus can be extended while reusing the same header and footer."})}];function s(e){let{title:a,Svg:t,description:r}=e;return(0,m.jsxs)("div",{className:(0,l.Z)("col col--4"),children:[(0,m.jsx)("div",{className:"text--center",children:(0,m.jsx)(t,{className:d.featureSvg,role:"img"})}),(0,m.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,m.jsx)(h.Z,{as:"h3",children:a}),(0,m.jsx)("p",{children:r})]})]})}function f(){return(0,m.jsx)("section",{className:d.features,children:(0,m.jsx)("div",{className:"container",children:(0,m.jsx)("div",{className:"row",children:i.map(((e,a)=>(0,m.jsx)(s,{...e},a)))})})})}const o={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"},g={tutorialSidebar:["Overview",{type:"category",label:"Changelog",items:JSON.parse('{"o":["changelogSplits/5.19","changelogSplits/5.18","changelogSplits/5.17","changelogSplits/5.16","changelogSplits/5.15","changelogSplits/5.14","changelogSplits/5.13","changelogSplits/5.12","changelogSplits/5.11","changelogSplits/5.10","changelogSplits/5.9","changelogSplits/5.8","changelogSplits/5.7","changelogSplits/5.6","changelogSplits/5.5","changelogSplits/5.4","changelogSplits/5.3","changelogSplits/5.2","changelogSplits/5.1","changelogSplits/5.0"]}').o},"Start Developing","Contributor Guide","Technical Details","Detailed Implementation Steps",{type:"category",label:"Charting Concepts",items:[{type:"autogenerated",dirName:"Charting-Concepts"}]},"Debugging","Implementation Best Practices","Accessibility","colors","implementing-2-to-1-spacing","creating-date-objects-for-chart-data","Testing Strategy","TestCoverage",{type:"category",label:"Test Plans",items:[{type:"autogenerated",dirName:"Test Plans"}]},"Testing Unpublished Library Version","BundleSize"]};function E(){const{siteConfig:e}=(0,n.Z)();return(0,m.jsx)("header",{className:(0,l.Z)("hero hero--primary",o.heroBanner),children:(0,m.jsxs)("div",{className:"container",children:[(0,m.jsx)(h.Z,{as:"h1",className:"hero__title",children:e.title}),(0,m.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,m.jsx)("div",{className:o.buttons,children:(0,m.jsx)(r.Z,{className:"button button--secondary button--lg",to:`/docs/${g.tutorialSidebar[0]}`,children:"Getting Started \ud83d\ude88"})})]})})}function p(){const{siteConfig:e}=(0,n.Z)();return(0,m.jsxs)(c.Z,{title:`${e.title}`,description:"Description will go into a meta tag in ",children:[(0,m.jsx)(E,{}),(0,m.jsx)("main",{children:(0,m.jsx)(f,{})})]})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[3237],{9722:(e,a,t)=>{t.d(a,{Z:()=>c});var l,r=t(7294);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...c}=e;return r.createElement("svg",n({xmlns:"http://www.w3.org/2000/svg",width:1088,height:687.962,viewBox:"0 0 1088 687.962","aria-labelledby":t},c),void 0===a?r.createElement("title",{id:t},"Easy to Use"):a?r.createElement("title",{id:t},a):null,l||(l=r.createElement("g",{"data-name":"Group 12"},r.createElement("g",{"data-name":"Group 11"},r.createElement("path",{"data-name":"Path 83",d:"M961.81 454.442c-5.27 45.15-16.22 81.4-31.25 110.31-20 38.52-54.21 54.04-84.77 70.28a193.275 193.275 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.282 657.282 0 0 0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07 5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12 52.29-235.46 134.74-296.47 155.97-115.41 369.76-110.57 523.43 7.88 102.36 78.9 198.2 198.31 179.02 362.74Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 84",d:"M930.56 564.752c-20 38.52-47.21 64.04-77.77 80.28a193.272 193.272 0 0 1-27.46 11.94c-55.61 19.3-117.85 14.18-166.74 3.99a657.3 657.3 0 0 0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25 1.72c-100.17 7.36-253.82-6.43-321.42-143.29L326 177.962l62.95 161.619 20.09 51.59 55.37-75.98L493 275.962l130.2 149.27 36.8-81.27 254.78 207.919 14.21 11.59Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 85",d:"m302 282.962 26-57 36 83-31-60Z",opacity:.1}),r.createElement("path",{"data-name":"Path 86",d:"M554.5 647.802q-14.97-.675-29.97-.67l-115.49-255.96Z",opacity:.1}),r.createElement("path",{"data-name":"Path 87",d:"M464.411 315.191 493 292.962l130 150-132-128Z",opacity:.1}),r.createElement("path",{"data-name":"Path 88",d:"M852.79 645.032a193.265 193.265 0 0 1-27.46 11.94L623.2 425.232Z",opacity:.1}),r.createElement("circle",{"data-name":"Ellipse 11",cx:3,cy:3,r:3,transform:"translate(479 98.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 12",cx:3,cy:3,r:3,transform:"translate(396 201.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 13",cx:2,cy:2,r:2,transform:"translate(600 220.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 14",cx:2,cy:2,r:2,transform:"translate(180 265.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 15",cx:2,cy:2,r:2,transform:"translate(612 96.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 16",cx:2,cy:2,r:2,transform:"translate(736 192.962)",fill:"#f2f2f2"}),r.createElement("circle",{"data-name":"Ellipse 17",cx:2,cy:2,r:2,transform:"translate(858 344.962)",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 89",d:"M306 121.222h-2.76v-2.76h-1.48v2.76H299v1.478h2.76v2.759h1.48V122.7H306Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 90",d:"M848 424.222h-2.76v-2.76h-1.48v2.76H841v1.478h2.76v2.759h1.48V425.7H848Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 91",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 92",d:"M1088 613.962c0 16.569-243.557 74-544 74s-544-57.431-544-74 243.557 14 544 14 544-30.568 544-14Z",opacity:.1}),r.createElement("ellipse",{"data-name":"Ellipse 18",cx:544,cy:30,rx:544,ry:30,transform:"translate(0 583.962)",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 93",d:"M568 571.962c0 33.137-14.775 24-33 24s-33 9.137-33-24 33-96 33-96 33 62.863 33 96Z",fill:"#ff6584"}),r.createElement("path",{"data-name":"Path 94",d:"M550 584.641c0 15.062-6.716 10.909-15 10.909s-15 4.153-15-10.909 15-43.636 15-43.636 15 28.576 15 43.636Z",opacity:.1}),r.createElement("rect",{"data-name":"Rectangle 97",width:92,height:18,rx:9,transform:"translate(489 604.962)",fill:"#2f2e41"}),r.createElement("rect",{"data-name":"Rectangle 98",width:92,height:18,rx:9,transform:"translate(489 586.962)",fill:"#2f2e41"}),r.createElement("path",{"data-name":"Path 95",d:"M137 490.528c0 55.343 34.719 100.126 77.626 100.126",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 96",d:"M214.626 590.654c0-55.965 38.745-101.251 86.626-101.251",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 97",d:"M165.125 495.545c0 52.57 22.14 95.109 49.5 95.109",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 98",d:"M214.626 590.654c0-71.511 44.783-129.377 100.126-129.377",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 99",d:"M198.3 591.36s11.009-.339 14.326-2.7 16.934-5.183 17.757-1.395 16.544 18.844 4.115 18.945-28.879-1.936-32.19-3.953-4.008-10.897-4.008-10.897Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 100",d:"M234.716 604.89c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7 8.879 4.009 10.9 19.761 4.053 32.19 3.953c3.588-.029 4.827-1.305 4.759-3.2-.498 1.142-1.867 1.855-4.537 1.877Z",opacity:.2}),r.createElement("path",{"data-name":"Path 101",d:"M721.429 527.062c0 38.029 23.857 68.8 53.341 68.8",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 102",d:"M774.769 595.863c0-38.456 26.623-69.575 59.525-69.575",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 103",d:"M740.755 530.509c0 36.124 15.213 65.354 34.014 65.354",fill:"#6c63ff"}),r.createElement("path",{"data-name":"Path 104",d:"M774.769 595.863c0-49.139 30.773-88.9 68.8-88.9",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 105",d:"M763.548 596.348s7.565-.233 9.844-1.856 11.636-3.562 12.2-.958 11.368 12.949 2.828 13.018-19.844-1.33-22.119-2.716-2.753-7.488-2.753-7.488Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 106",d:"M788.574 605.645c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479 6.1 2.755 7.487 13.579 2.785 22.119 2.716c2.465-.02 3.317-.9 3.27-2.2-.343.788-1.283 1.278-3.118 1.293Z",opacity:.2}),r.createElement("path",{"data-name":"Path 107",d:"M893.813 618.699s11.36-1.729 14.5-4.591 16.89-7.488 18.217-3.667 19.494 17.447 6.633 19.107-30.153 1.609-33.835-.065-5.515-10.784-5.515-10.784Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 108",d:"M933.228 628.154c-12.86 1.659-30.153 1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833 9.109 5.516 10.783 20.975 1.725 33.835.065c3.712-.479 4.836-1.956 4.529-3.906-.375 1.246-1.703 2.156-4.466 2.512Z",opacity:.2}),r.createElement("path",{"data-name":"Path 109",d:"M614.26 617.881s9.587-1.459 12.237-3.875 14.255-6.32 15.374-3.095 16.452 14.725 5.6 16.125-25.448 1.358-28.555-.055-4.656-9.1-4.656-9.1Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 110",d:"M647.524 625.856c-10.853 1.4-25.448 1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547 7.687 4.655 9.1 17.7 1.456 28.555.055c3.133-.4 4.081-1.651 3.822-3.3-.314 1.057-1.435 1.825-3.767 2.125Z",opacity:.2}),r.createElement("path",{"data-name":"Path 111",d:"M122.389 613.09s7.463-1.136 9.527-3.016 11.1-4.92 11.969-2.409 12.808 11.463 4.358 12.553-19.811 1.057-22.23-.043-3.624-7.085-3.624-7.085Z",fill:"#a8a8a8"}),r.createElement("path",{"data-name":"Path 112",d:"M148.285 619.302c-8.449 1.09-19.811 1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2 5.984 3.624 7.085 13.781 1.133 22.23.043c2.439-.315 3.177-1.285 2.976-2.566-.246.818-1.119 1.416-2.934 1.65Z",opacity:.2}),r.createElement("path",{"data-name":"Path 113",d:"M383.7 601.318c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.118-36.793 93.694-36.793 93.08 6.573 93.08 36.793Z",opacity:.1}),r.createElement("path",{"data-name":"Path 114",d:"M383.7 593.881c0 30.22-42.124 20.873-93.7 20.873s-93.074 9.347-93.074-20.873 42.114-36.8 93.69-36.8 93.084 6.576 93.084 36.8Z",fill:"#3f3d56"})),r.createElement("path",{"data-name":"Path 40",d:"M360.175 475.732h91.791v37.153h-91.791Z",fill:"#fff",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 41",d:"M277.126 597.026a21.828 21.828 0 0 1-18.908-10.927 21.829 21.829 0 0 0 18.908 32.782h21.855v-21.855Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 42",d:"m375.451 481.607 76.514-4.782v-10.928a21.854 21.854 0 0 0-21.855-21.855h-98.347l-2.732-4.735a3.154 3.154 0 0 0-5.464 0l-2.732 4.732-2.732-4.732a3.154 3.154 0 0 0-5.464 0l-2.732 4.732-2.731-4.732a3.154 3.154 0 0 0-5.464 0l-2.732 4.735h-.071l-4.526-4.525a3.153 3.153 0 0 0-5.276 1.414l-1.5 5.577-5.674-1.521a3.154 3.154 0 0 0-3.863 3.864l1.52 5.679-5.575 1.494a3.155 3.155 0 0 0-1.416 5.278l4.526 4.526v.07l-4.735 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.727a3.154 3.154 0 0 0 0 5.464l4.735 2.736-4.735 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.732a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.731a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.735a3.154 3.154 0 0 0 0 5.464l4.732 2.732-4.732 2.728a3.154 3.154 0 0 0 0 5.464l4.732 2.732a21.854 21.854 0 0 0 21.858 21.855h131.13a21.854 21.854 0 0 0 21.855-21.855v-87.42l-76.514-4.782a11.632 11.632 0 0 1 0-23.219",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 43",d:"M408.255 618.882h32.782v-43.71h-32.782Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 44",d:"M462.893 591.563a5.438 5.438 0 0 0-.7.07c-.042-.164-.081-.329-.127-.493a5.457 5.457 0 1 0-5.4-9.372q-.181-.185-.366-.367a5.454 5.454 0 1 0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467 5.467 0 1 0-10.788 0c-.162.042-.325.08-.486.126a5.457 5.457 0 1 0-9.384 5.4 21.843 21.843 0 1 0 36.421 21.02 5.452 5.452 0 1 0 .7-10.858",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 45",d:"M419.183 553.317h32.782v-21.855h-32.782Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 46",d:"M462.893 545.121a2.732 2.732 0 1 0 0-5.464 2.811 2.811 0 0 0-.349.035c-.022-.082-.04-.164-.063-.246a2.733 2.733 0 0 0-1.052-5.253 2.7 2.7 0 0 0-1.648.566q-.09-.093-.184-.184a2.7 2.7 0 0 0 .553-1.633 2.732 2.732 0 0 0-5.245-1.07 10.928 10.928 0 1 0 0 21.031 2.732 2.732 0 0 0 5.245-1.07 2.7 2.7 0 0 0-.553-1.633q.093-.09.184-.184a2.7 2.7 0 0 0 1.648.566 2.732 2.732 0 0 0 1.052-5.253c.023-.081.042-.164.063-.246a2.814 2.814 0 0 0 .349.035",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 47",d:"M320.836 479.556a2.732 2.732 0 0 1-2.732-2.732 8.2 8.2 0 0 0-16.391 0 2.732 2.732 0 0 1-5.464 0 13.66 13.66 0 0 1 27.319 0 2.732 2.732 0 0 1-2.732 2.732",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 48",d:"M364.546 618.881h65.565a21.854 21.854 0 0 0 21.855-21.855v-76.492h-65.565a21.854 21.854 0 0 0-21.855 21.855Z",fill:"#ffff50",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 49",d:"M435.596 554.41h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0-54.434h-54.681a1.093 1.093 0 1 1 0-2.185h54.681a1.093 1.093 0 0 1 0 2.185m0 21.652h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m0 21.855h-54.681a1.093 1.093 0 1 1 0-2.186h54.681a1.093 1.093 0 0 1 0 2.186m16.369-100.959c-.013 0-.024-.007-.037-.005-3.377.115-4.974 3.492-6.384 6.472-1.471 3.114-2.608 5.139-4.473 5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932 3.053-6.346 5.646-1.5 2.762-2.529 4.442-4.5 4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879 2.606-6.3 4.808-1.5 2.328-2.552 3.746-4.551 3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807 2.153-6.224 3.954-1.346 1.709-2.4 3.062-4.621 2.977a1.094 1.094 0 0 0-.079 2.186c3.3.11 4.967-1.967 6.417-3.81 1.286-1.635 2.4-3.045 4.582-3.12 2.1-.09 3.091 1.218 4.584 3.327 1.417 2 3.026 4.277 6.263 4.394 3.391.114 5.022-2.42 6.467-4.663 1.292-2 2.406-3.734 4.535-3.807 1.959-.073 3.026 1.475 4.529 4.022 1.417 2.4 3.023 5.121 6.324 5.241 3.415.118 5.064-2.863 6.5-5.5 1.245-2.282 2.419-4.437 4.5-4.509 1.959-.046 2.981 1.743 4.492 4.732 1.412 2.79 3.013 5.95 6.365 6.071h.185c3.348 0 4.937-3.36 6.343-6.331 1.245-2.634 2.423-5.114 4.444-5.216Z",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 50",d:"M342.691 618.882h43.71v-43.71h-43.71Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 8",transform:"rotate(-14.98 2188.845 -1120.376)"},r.createElement("rect",{"data-name":"Rectangle 3",width:92.361,height:36.462,rx:2,fill:"#d8d8d8"}),r.createElement("g",{"data-name":"Group 2",transform:"translate(1.531 23.03)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 4",width:5.336,height:5.336,rx:1,transform:"translate(16.797)"}),r.createElement("rect",{"data-name":"Rectangle 5",width:5.336,height:5.336,rx:1,transform:"translate(23.12)"}),r.createElement("rect",{"data-name":"Rectangle 6",width:5.336,height:5.336,rx:1,transform:"translate(29.444)"}),r.createElement("rect",{"data-name":"Rectangle 7",width:5.336,height:5.336,rx:1,transform:"translate(35.768)"}),r.createElement("rect",{"data-name":"Rectangle 8",width:5.336,height:5.336,rx:1,transform:"translate(42.091)"}),r.createElement("rect",{"data-name":"Rectangle 9",width:5.336,height:5.336,rx:1,transform:"translate(48.415)"}),r.createElement("rect",{"data-name":"Rectangle 10",width:5.336,height:5.336,rx:1,transform:"translate(54.739)"}),r.createElement("rect",{"data-name":"Rectangle 11",width:5.336,height:5.336,rx:1,transform:"translate(61.063)"}),r.createElement("rect",{"data-name":"Rectangle 12",width:5.336,height:5.336,rx:1,transform:"translate(67.386)"}),r.createElement("path",{"data-name":"Path 51",d:"M1.093 0h13.425a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H1.093A1.093 1.093 0 0 1 0 4.243v-3.15A1.093 1.093 0 0 1 1.093 0ZM75 0h13.426a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H75a1.093 1.093 0 0 1-1.093-1.093v-3.15A1.093 1.093 0 0 1 75 0Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 3",transform:"translate(1.531 10.261)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 52",d:"M1.093 0h5.125A1.093 1.093 0 0 1 7.31 1.093v3.149a1.093 1.093 0 0 1-1.092 1.093H1.093A1.093 1.093 0 0 1 0 4.242V1.093A1.093 1.093 0 0 1 1.093 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 13",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 14",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 15",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 16",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 17",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 18",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 19",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 20",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 21",width:5.336,height:5.336,rx:1,transform:"translate(58.888)"}),r.createElement("rect",{"data-name":"Rectangle 22",width:5.336,height:5.336,rx:1,transform:"translate(65.212)"}),r.createElement("rect",{"data-name":"Rectangle 23",width:5.336,height:5.336,rx:1,transform:"translate(71.536)"}),r.createElement("rect",{"data-name":"Rectangle 24",width:5.336,height:5.336,rx:1,transform:"translate(77.859)"}),r.createElement("rect",{"data-name":"Rectangle 25",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"})),r.createElement("g",{"data-name":"Group 4",transform:"rotate(180 45.525 4.773)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 53",d:"M1.093 0h5.126a1.093 1.093 0 0 1 1.093 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093H1.093A1.093 1.093 0 0 1 0 4.243v-3.15A1.093 1.093 0 0 1 1.093 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 26",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 27",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 28",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 29",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 30",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 31",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 32",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 33",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 34",width:5.336,height:5.336,rx:1,transform:"translate(58.889)"}),r.createElement("rect",{"data-name":"Rectangle 35",width:5.336,height:5.336,rx:1,transform:"translate(65.213)"}),r.createElement("rect",{"data-name":"Rectangle 36",width:5.336,height:5.336,rx:1,transform:"translate(71.537)"}),r.createElement("rect",{"data-name":"Rectangle 37",width:5.336,height:5.336,rx:1,transform:"translate(77.86)"}),r.createElement("rect",{"data-name":"Rectangle 38",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"}),r.createElement("rect",{"data-name":"Rectangle 39",width:5.336,height:5.336,rx:1,transform:"translate(8.299)"}),r.createElement("rect",{"data-name":"Rectangle 40",width:5.336,height:5.336,rx:1,transform:"translate(14.623)"}),r.createElement("rect",{"data-name":"Rectangle 41",width:5.336,height:5.336,rx:1,transform:"translate(20.947)"}),r.createElement("rect",{"data-name":"Rectangle 42",width:5.336,height:5.336,rx:1,transform:"translate(27.271)"}),r.createElement("rect",{"data-name":"Rectangle 43",width:5.336,height:5.336,rx:1,transform:"translate(33.594)"}),r.createElement("rect",{"data-name":"Rectangle 44",width:5.336,height:5.336,rx:1,transform:"translate(39.918)"}),r.createElement("rect",{"data-name":"Rectangle 45",width:5.336,height:5.336,rx:1,transform:"translate(46.242)"}),r.createElement("rect",{"data-name":"Rectangle 46",width:5.336,height:5.336,rx:1,transform:"translate(52.565)"}),r.createElement("rect",{"data-name":"Rectangle 47",width:5.336,height:5.336,rx:1,transform:"translate(58.889)"}),r.createElement("rect",{"data-name":"Rectangle 48",width:5.336,height:5.336,rx:1,transform:"translate(65.213)"}),r.createElement("rect",{"data-name":"Rectangle 49",width:5.336,height:5.336,rx:1,transform:"translate(71.537)"}),r.createElement("rect",{"data-name":"Rectangle 50",width:5.336,height:5.336,rx:1,transform:"translate(77.86)"}),r.createElement("rect",{"data-name":"Rectangle 51",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"})),r.createElement("g",{"data-name":"Group 6",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 54",d:"M2.624 16.584h7.3a1.093 1.093 0 0 1 1.092 1.093v3.15a1.093 1.093 0 0 1-1.093 1.093h-7.3a1.093 1.093 0 0 1-1.092-1.093v-3.149a1.093 1.093 0 0 1 1.093-1.094Z",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 5",transform:"translate(12.202 16.584)"},r.createElement("rect",{"data-name":"Rectangle 52",width:5.336,height:5.336,rx:1}),r.createElement("rect",{"data-name":"Rectangle 53",width:5.336,height:5.336,rx:1,transform:"translate(6.324)"}),r.createElement("rect",{"data-name":"Rectangle 54",width:5.336,height:5.336,rx:1,transform:"translate(12.647)"}),r.createElement("rect",{"data-name":"Rectangle 55",width:5.336,height:5.336,rx:1,transform:"translate(18.971)"}),r.createElement("rect",{"data-name":"Rectangle 56",width:5.336,height:5.336,rx:1,transform:"translate(25.295)"}),r.createElement("rect",{"data-name":"Rectangle 57",width:5.336,height:5.336,rx:1,transform:"translate(31.619)"}),r.createElement("rect",{"data-name":"Rectangle 58",width:5.336,height:5.336,rx:1,transform:"translate(37.942)"}),r.createElement("rect",{"data-name":"Rectangle 59",width:5.336,height:5.336,rx:1,transform:"translate(44.265)"}),r.createElement("rect",{"data-name":"Rectangle 60",width:5.336,height:5.336,rx:1,transform:"translate(50.589)"}),r.createElement("rect",{"data-name":"Rectangle 61",width:5.336,height:5.336,rx:1,transform:"translate(56.912)"}),r.createElement("rect",{"data-name":"Rectangle 62",width:5.336,height:5.336,rx:1,transform:"translate(63.236)"})),r.createElement("path",{"data-name":"Path 55",d:"M83.053 16.584h6.906a1.093 1.093 0 0 1 1.091 1.093v3.15a1.093 1.093 0 0 1-1.091 1.093h-6.907a1.093 1.093 0 0 1-1.093-1.093v-3.149a1.093 1.093 0 0 1 1.093-1.094Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 7",transform:"translate(1.531 29.627)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 63",width:5.336,height:5.336,rx:1}),r.createElement("rect",{"data-name":"Rectangle 64",width:5.336,height:5.336,rx:1,transform:"translate(6.324)"}),r.createElement("rect",{"data-name":"Rectangle 65",width:5.336,height:5.336,rx:1,transform:"translate(12.647)"}),r.createElement("rect",{"data-name":"Rectangle 66",width:5.336,height:5.336,rx:1,transform:"translate(18.971)"}),r.createElement("path",{"data-name":"Path 56",d:"M26.387 0h30.422a1.093 1.093 0 0 1 1.093 1.093v3.151a1.093 1.093 0 0 1-1.093 1.093H26.387a1.093 1.093 0 0 1-1.093-1.093V1.093A1.093 1.093 0 0 1 26.387 0Zm33.594 0h3.942a1.093 1.093 0 0 1 1.093 1.093v3.151a1.093 1.093 0 0 1-1.093 1.093h-3.942a1.093 1.093 0 0 1-1.093-1.093V1.093A1.093 1.093 0 0 1 59.981 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 67",width:5.336,height:5.336,rx:1,transform:"translate(66.003)"}),r.createElement("rect",{"data-name":"Rectangle 68",width:5.336,height:5.336,rx:1,transform:"translate(72.327)"}),r.createElement("rect",{"data-name":"Rectangle 69",width:5.336,height:5.336,rx:1,transform:"translate(84.183)"}),r.createElement("path",{"data-name":"Path 57",d:"M78.254 2.273v-1.18A1.093 1.093 0 0 1 79.347 0h3.15a1.093 1.093 0 0 1 1.093 1.093v1.18Z"}),r.createElement("path",{"data-name":"Path 58",d:"M83.591 3.063v1.18a1.093 1.093 0 0 1-1.093 1.093h-3.15a1.093 1.093 0 0 1-1.093-1.093v-1.18Z"})),r.createElement("rect",{"data-name":"Rectangle 70",width:88.927,height:2.371,rx:1.085,transform:"translate(1.925 1.17)",fill:"#4a4a4a"}),r.createElement("rect",{"data-name":"Rectangle 71",width:4.986,height:1.581,rx:.723,transform:"translate(4.1 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 72",width:4.986,height:1.581,rx:.723,transform:"translate(10.923 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 73",width:4.986,height:1.581,rx:.723,transform:"translate(16.173 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 74",width:4.986,height:1.581,rx:.723,transform:"translate(21.421 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 75",width:4.986,height:1.581,rx:.723,transform:"translate(26.671 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 76",width:4.986,height:1.581,rx:.723,transform:"translate(33.232 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 77",width:4.986,height:1.581,rx:.723,transform:"translate(38.48 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 78",width:4.986,height:1.581,rx:.723,transform:"translate(43.73 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 79",width:4.986,height:1.581,rx:.723,transform:"translate(48.978 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 80",width:4.986,height:1.581,rx:.723,transform:"translate(55.54 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 81",width:4.986,height:1.581,rx:.723,transform:"translate(60.788 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 82",width:4.986,height:1.581,rx:.723,transform:"translate(66.038 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 83",width:4.986,height:1.581,rx:.723,transform:"translate(72.599 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 84",width:4.986,height:1.581,rx:.723,transform:"translate(77.847 1.566)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 85",width:4.986,height:1.581,rx:.723,transform:"translate(83.097 1.566)",fill:"#d8d8d8",opacity:.136})),r.createElement("path",{"data-name":"Path 59",d:"M408.256 591.563a5.439 5.439 0 0 0-.7.07c-.042-.164-.081-.329-.127-.493a5.457 5.457 0 1 0-5.4-9.372q-.181-.185-.366-.367a5.454 5.454 0 1 0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467 5.467 0 1 0-10.788 0c-.162.042-.325.08-.486.126a5.457 5.457 0 1 0-9.384 5.4 21.843 21.843 0 1 0 36.421 21.02 5.452 5.452 0 1 0 .7-10.858",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 60",d:"M342.691 553.317h43.71v-21.855h-43.71Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 61",d:"M397.328 545.121a2.732 2.732 0 1 0 0-5.464 2.811 2.811 0 0 0-.349.035c-.022-.082-.04-.164-.063-.246a2.733 2.733 0 0 0-1.052-5.253 2.7 2.7 0 0 0-1.648.566q-.09-.093-.184-.184a2.7 2.7 0 0 0 .553-1.633 2.732 2.732 0 0 0-5.245-1.07 10.928 10.928 0 1 0 0 21.031 2.732 2.732 0 0 0 5.245-1.07 2.7 2.7 0 0 0-.553-1.633q.093-.09.184-.184a2.7 2.7 0 0 0 1.648.566 2.732 2.732 0 0 0 1.052-5.253c.023-.081.042-.164.063-.246a2.811 2.811 0 0 0 .349.035",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 62",d:"M408.256 464.531a2.967 2.967 0 0 1-.535-.055 2.754 2.754 0 0 1-.514-.153 2.838 2.838 0 0 1-.471-.251 4.139 4.139 0 0 1-.415-.339 3.2 3.2 0 0 1-.338-.415 2.7 2.7 0 0 1-.459-1.517 2.968 2.968 0 0 1 .055-.535 3.152 3.152 0 0 1 .152-.514 2.874 2.874 0 0 1 .252-.47 2.633 2.633 0 0 1 .753-.754 2.837 2.837 0 0 1 .471-.251 2.753 2.753 0 0 1 .514-.153 2.527 2.527 0 0 1 1.071 0 2.654 2.654 0 0 1 .983.4 4.139 4.139 0 0 1 .415.339 4.019 4.019 0 0 1 .339.415 2.786 2.786 0 0 1 .251.47 2.864 2.864 0 0 1 .208 1.049 2.77 2.77 0 0 1-.8 1.934 4.139 4.139 0 0 1-.415.339 2.722 2.722 0 0 1-1.519.459m21.855-1.366a2.789 2.789 0 0 1-1.935-.8 4.162 4.162 0 0 1-.338-.415 2.7 2.7 0 0 1-.459-1.519 2.789 2.789 0 0 1 .8-1.934 4.139 4.139 0 0 1 .415-.339 2.838 2.838 0 0 1 .471-.251 2.752 2.752 0 0 1 .514-.153 2.527 2.527 0 0 1 1.071 0 2.654 2.654 0 0 1 .983.4 4.139 4.139 0 0 1 .415.339 2.79 2.79 0 0 1 .8 1.934 3.069 3.069 0 0 1-.055.535 2.779 2.779 0 0 1-.153.514 3.885 3.885 0 0 1-.251.47 4.02 4.02 0 0 1-.339.415 4.138 4.138 0 0 1-.415.339 2.722 2.722 0 0 1-1.519.459",fillRule:"evenodd"}))))}},8066:(e,a,t)=>{t.d(a,{Z:()=>c});var l,r=t(7294);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...c}=e;return r.createElement("svg",n({xmlns:"http://www.w3.org/2000/svg",width:1041.277,height:554.141,viewBox:"0 0 1041.277 554.141","aria-labelledby":t},c),void 0===a?r.createElement("title",{id:t},"Powered by React"):a?r.createElement("title",{id:t},a):null,l||(l=r.createElement("g",{"data-name":"Group 24"},r.createElement("g",{"data-name":"Group 23",transform:"translate(-.011 -.035)"},r.createElement("path",{"data-name":"Path 299",d:"M961.48 438.21q-1.74 3.75-3.47 7.4-2.7 5.67-5.33 11.12c-.78 1.61-1.56 3.19-2.32 4.77-8.6 17.57-16.63 33.11-23.45 45.89a73.21 73.21 0 0 1-63.81 38.7l-151.65 1.65h-1.6l-13 .14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107 1.16-95.51 1-11.11.12-69 .75h-.08l-44.75.48h-.48l-141.5 1.53-42.33.46a87.991 87.991 0 0 1-10.79-.54c-1.22-.14-2.44-.3-3.65-.49a87.38 87.38 0 0 1-51.29-27.54c-18.21-20.03-31.46-43.4-40.36-68.76q-1.93-5.49-3.6-11.12c-30.81-104.15 6.75-238.52 74.35-328.44q4.25-5.64 8.64-11l.07-.08c20.79-25.52 44.1-46.84 68.93-62 44-26.91 92.75-34.49 140.7-11.9 40.57 19.12 78.45 28.11 115.17 30.55 3.71.24 7.42.42 11.11.53 84.23 2.65 163.17-27.7 255.87-47.29 3.69-.78 7.39-1.55 11.12-2.28C763 .54 836.36-6.4 923.6 8.19a189.089 189.089 0 0 1 26.76 6.4q5.77 1.86 11.12 4c41.64 16.94 64.35 48.24 74 87.46q1.37 5.46 2.37 11.11c17.11 94.34-33 228.16-76.37 321.05Z",fill:"#f2f2f2"}),r.createElement("path",{"data-name":"Path 300",d:"M497.02 445.61a95.21 95.21 0 0 1-1.87 11.12h93.7v-11.12Zm-78.25 62.81 11.11-.09v-27.47c-3.81-.17-7.52-.34-11.11-.52Zm-232.92-62.81v11.12h198.5v-11.12Zm849.68-339.52h-74V18.6q-5.35-2.17-11.12-4v91.49H696.87V13.67c-3.73.73-7.43 1.5-11.12 2.28v90.14H429.88V63.24c-3.69-.11-7.4-.29-11.11-.53v43.38H162.9v-62c-24.83 15.16-48.14 36.48-68.93 62h-.07v.08q-4.4 5.4-8.64 11h8.64v328.44h-83q1.66 5.63 3.6 11.12h79.39v93.62a87 87 0 0 0 12.2 2.79c1.21.19 2.43.35 3.65.49a87.991 87.991 0 0 0 10.79.54l42.33-.46v-97h255.91v94.21l11.11-.12v-94.07h255.87v91.36l11.12-.12v-91.24h253.49v4.77c.76-1.58 1.54-3.16 2.32-4.77q2.63-5.45 5.33-11.12 1.73-3.64 3.47-7.4v-321h76.42q-1.01-5.69-2.37-11.12ZM162.9 445.61V117.17h255.87v328.44Zm267 0V117.17h255.85v328.44Zm520.48 0H696.87V117.17h253.49Z",opacity:.1}),r.createElement("path",{"data-name":"Path 301",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 302",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l46.65-28 93.6-.78 2-.01.66-.01 2-.03 44.94-.37 2.01-.01.64-.01 2-.01 14.41-.12.38-.01 35.55-.3h.29l277.4-2.34 6.79-.05h.68l5.18-.05 37.65-.31 2-.03 1.85-.02h.96l11.71-.09 2.32-.03 3.11-.02 9.75-.09 15.47-.13 2-.02 3.48-.02h.65l74.71-.64Z",opacity:.2}),r.createElement("path",{"data-name":"Path 303",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 304",d:"M296.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 305",d:"M298.1 483.66v24.49a6.13 6.13 0 0 1-3.5 5.54 6 6 0 0 1-2.5.6l-34.9.74a6 6 0 0 1-2.7-.57 6.12 6.12 0 0 1-3.57-5.57v-25.23Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Rectangle 137",fill:"#3f3d56",d:"M680.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Rectangle 138",opacity:.1,d:"M680.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Rectangle 139",fill:"#3f3d56",d:"M678.92 483.65h47.17v31.5h-47.17z"}),r.createElement("path",{"data-name":"Path 306",d:"M298.09 483.65v4.97l-47.17 1.26v-6.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 307",d:"M381.35 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 308",d:"M185.85 308.41v181.2h-.05a4 4 0 0 1-3.95-3.95v-173.3a4 4 0 0 1 3.95-3.95Z",opacity:.1}),r.createElement("path",{"data-name":"Path 309",d:"M194.59 319.15h177.5V467.4l-177.5 4Z",fill:"#39374d"}),r.createElement("path",{"data-name":"Path 310",d:"M726.09 483.65v6.41l-47.17-1.26v-5.15Z",opacity:.1}),r.createElement("path",{"data-name":"Path 311",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95l-191.69-5.1a4 4 0 0 1-3.85-3.95v-168.2a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.99 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 312",d:"M788.35 312.36v173.3a4 4 0 0 1-4 3.95v-181.2a4 4 0 0 1 4 3.95Z",opacity:.1}),r.createElement("path",{"data-name":"Path 313",d:"M775.59 319.15h-177.5V467.4l177.5 4Z",fill:"#39374d"}),r.createElement("path",{"data-name":"Path 314",d:"M583.85 312.36v168.2a4 4 0 0 1-3.85 3.95l-191.65 5.1a4 4 0 0 1-4-3.95v-173.3a4 4 0 0 1 3.95-3.95h191.6a4 4 0 0 1 3.95 3.95Z",fill:"#65617d"}),r.createElement("path",{"data-name":"Path 315",d:"M397.09 319.15h177.5V467.4l-177.5 4Z",fill:"#4267b2"}),r.createElement("path",{"data-name":"Path 316",d:"M863.09 533.65v13l-151.92 1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99-175.61 1.63h-.15l-44.65.42-.48.01-198.4 1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5 4.4-.02.98-.01Z",opacity:.1}),r.createElement("circle",{"data-name":"Ellipse 111",cx:51.33,cy:51.33,r:51.33,transform:"translate(435.93 246.82)",fill:"#fbbebe"}),r.createElement("path",{"data-name":"Path 317",d:"M538.6 377.16s-99.5 12-90 0c3.44-4.34 4.39-17.2 4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41 77-8.5c-4 13.13-2.69 31.57.35 48.88.89 5.05 1.92 10 3 14.7a344.66 344.66 0 0 0 9.65 33.92Z",fill:"#fbbebe"}),r.createElement("path",{"data-name":"Path 318",d:"M506.13 373.09c11.51-2.13 23.7-6 34.53-1.54 2.85 1.17 5.47 2.88 8.39 3.86s6.12 1.22 9.16 1.91c10.68 2.42 19.34 10.55 24.9 20s8.44 20.14 11.26 30.72l6.9 25.83c6 22.45 12 45.09 13.39 68.3a2437.506 2437.506 0 0 1-250.84 1.43c5.44-10.34 11-21.31 10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34 6.57-13.39 9.64-20.22 8.75-19.52 1.94-45.79 17.32-60.65 6.92-6.68 17-9.21 26.63-8.89 12.28.41 24.85 4.24 37 6.11 15.56 2.36 30.26 3.76 45.94.88Z",fill:"#ff6584"}),r.createElement("path",{"data-name":"Path 319",d:"m637.03 484.26-.1 1.43v.1l-.17 2.3-1.33 18.51-1.61 22.3-.46 6.28-1 13.44v.17l-107 1-175.59 1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53 10.53 0 0 1 11.42-10.17c4.72.4 10.85.89 18.18 1.41l3 .22c42.33 2.94 120.56 6.74 199.5 2 1.66-.09 3.33-.19 5-.31 12.24-.77 24.47-1.76 36.58-3a10.53 10.53 0 0 1 11.6 11.23Z",opacity:.1}),r.createElement("path",{"data-name":"Path 320",d:"M349.74 552.53v-.84l175.62-1.91 107-1h.3v-.17l1-13.44.43-6 1.64-22.61 1.29-17.9v-.44a10.617 10.617 0 0 0-.11-2.47.3.3 0 0 0 0-.1 10.391 10.391 0 0 0-2-4.64 10.54 10.54 0 0 0-9.42-4 937.419 937.419 0 0 1-36.58 3c-1.67.12-3.34.22-5 .31-78.94 4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54 10.54 0 0 0-11.24 8.53 11 11 0 0 0-.18 1.64l-.68 22.16-.93 28.07-.44 14.36v1.12Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 321",d:"m637.33 491.27-1.23 15.33-1.83 22.85-.46 5.72-1 12.81-.06.64v.17l-.15 1.48.11-1.48h-.29l-107 1-175.65 1.9v-.28l.49-14.36 1-28.06.64-18.65a6.36 6.36 0 0 1 3.06-5.25 6.25 6.25 0 0 1 3.78-.9c2.1.17 4.68.37 7.69.59 4.89.36 10.92.78 17.94 1.22 13 .82 29.31 1.7 48 2.42 52 2 122.2 2.67 188.88-3.17 3-.26 6.1-.55 9.13-.84a6.26 6.26 0 0 1 3.48.66 5.159 5.159 0 0 1 .86.54 6.14 6.14 0 0 1 2 2.46 3.564 3.564 0 0 1 .25.61 6.279 6.279 0 0 1 .36 2.59Z",opacity:.1}),r.createElement("path",{"data-name":"Path 322",d:"M298.1 504.96v3.19a6.13 6.13 0 0 1-3.5 5.54l-40.1.77a6.12 6.12 0 0 1-3.57-5.57v-3Z",opacity:.1}),r.createElement("path",{"data-name":"Path 323",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 324",d:"m298.59 515.57-52.25 1v-8.67l52.25-1Z",opacity:.1}),r.createElement("path",{"data-name":"Path 325",d:"m300.59 515.57-52.25 1v-8.67l52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 326",d:"M679.22 506.96v3.19a6.13 6.13 0 0 0 3.5 5.54l40.1.77a6.12 6.12 0 0 0 3.57-5.57v-3Z",opacity:.1}),r.createElement("path",{"data-name":"Path 327",d:"m678.72 517.57 52.25 1v-8.67l-52.25-1Z",opacity:.1}),r.createElement("path",{"data-name":"Path 328",d:"m676.72 517.57 52.25 1v-8.67l-52.25-1Z",fill:"#3f3d56"}),r.createElement("path",{"data-name":"Path 329",d:"M454.79 313.88c.08 7-3.16 13.6-5.91 20.07a163.491 163.491 0 0 0-12.66 74.71c.73 11 2.58 22 .73 32.9s-8.43 21.77-19 24.9c17.53 10.45 41.26 9.35 57.76-2.66 8.79-6.4 15.34-15.33 21.75-24.11a97.86 97.86 0 0 1-13.31 44.75 103.43 103.43 0 0 0 73.51-40.82c4.31-5.81 8.06-12.19 9.72-19.23 3.09-13-1.22-26.51-4.51-39.5a266.055 266.055 0 0 1-6.17-33c-.43-3.56-.78-7.22.1-10.7 1-4.07 3.67-7.51 5.64-11.22 5.6-10.54 5.73-23.3 2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47 1.48-16.14 8.32-22 15.34-4.59 5.46-15.81 15.71-16.6 22.86-.72 6.59 5.1 17.63 6.09 24.58 1.3 9 2.22 6 7.3 11.52 3.21 3.42 5.28 7.37 5.34 12.16Z",fill:"#3f3d56"})),r.createElement("path",{"data-name":"Path 40",d:"M280.139 370.832h43.635v17.662h-43.635Z",fill:"#fff",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 41",d:"M240.66 428.493a10.377 10.377 0 0 1-8.989-5.195 10.377 10.377 0 0 0 8.988 15.584h10.391v-10.389Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 42",d:"m287.402 373.625 36.373-2.273v-5.195a10.389 10.389 0 0 0-10.39-10.389h-46.75l-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249-1.3-2.249a1.5 1.5 0 0 0-2.6 0l-1.3 2.249h-.034l-2.152-2.151a1.5 1.5 0 0 0-2.508.672l-.696 2.653-2.7-.723a1.5 1.5 0 0 0-1.836 1.837l.722 2.7-2.65.71a1.5 1.5 0 0 0-.673 2.509l2.152 2.152v.033l-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.25 1.282-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3-2.249 1.3a1.5 1.5 0 0 0 0 2.6l2.249 1.3a10.389 10.389 0 0 0 10.389 10.34h62.335a10.389 10.389 0 0 0 10.39-10.39v-41.557l-36.373-2.273a5.53 5.53 0 0 1 0-11.038",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 43",d:"M302.996 438.882h15.584v-20.779h-15.584Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 44",d:"M328.97 425.895a2.582 2.582 0 0 0-.332.033c-.02-.078-.038-.156-.06-.234a2.594 2.594 0 1 0-2.567-4.455q-.086-.088-.174-.175a2.593 2.593 0 1 0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6 2.6 0 1 0-5.128 0c-.077.02-.154.038-.231.06a2.594 2.594 0 1 0-4.461 2.569 10.384 10.384 0 1 0 17.314 9.992 2.592 2.592 0 1 0 .332-5.161",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 45",d:"M308.191 407.713h15.584v-10.389h-15.584Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 46",d:"M328.969 403.818a1.3 1.3 0 1 0 0-2.6 1.336 1.336 0 0 0-.166.017l-.03-.117a1.3 1.3 0 0 0-.5-2.5 1.285 1.285 0 0 0-.783.269l-.087-.087a1.285 1.285 0 0 0 .263-.776 1.3 1.3 0 0 0-2.493-.509 5.195 5.195 0 1 0 0 10 1.3 1.3 0 0 0 2.493-.509 1.285 1.285 0 0 0-.263-.776l.087-.087a1.285 1.285 0 0 0 .783.269 1.3 1.3 0 0 0 .5-2.5c.011-.038.02-.078.03-.117a1.337 1.337 0 0 0 .166.017",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 47",d:"M261.439 372.65a1.3 1.3 0 0 1-1.3-1.3 3.9 3.9 0 0 0-7.792 0 1.3 1.3 0 1 1-2.6 0 6.494 6.494 0 0 1 12.987 0 1.3 1.3 0 0 1-1.3 1.3",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 48",d:"M282.217 438.882h31.168a10.389 10.389 0 0 0 10.389-10.389V392.13h-31.168a10.389 10.389 0 0 0-10.389 10.389Z",fill:"#ffff50",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 49",d:"M315.993 408.233h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0-25.877h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.293h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m0 10.389h-25.994a.52.52 0 1 1 0-1.039h25.994a.52.52 0 0 1 0 1.039m7.782-47.993h-.018c-1.605.055-2.365 1.66-3.035 3.077-.7 1.48-1.24 2.443-2.126 2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344 1.451-3.017 2.684-.715 1.313-1.2 2.112-2.141 2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319 1.239-2.994 2.286-.713 1.106-1.213 1.781-2.164 1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815 3.815 0 0 0-2.959 1.879c-.64.812-1.14 1.456-2.2 1.415a.52.52 0 0 0-.037 1.039 3.588 3.588 0 0 0 3.05-1.811c.611-.777 1.139-1.448 2.178-1.483 1-.043 1.47.579 2.179 1.582.674.953 1.438 2.033 2.977 2.089 1.612.054 2.387-1.151 3.074-2.217.614-.953 1.144-1.775 2.156-1.81.931-.035 1.438.7 2.153 1.912.674 1.141 1.437 2.434 3.006 2.491 1.623.056 2.407-1.361 3.09-2.616.592-1.085 1.15-2.109 2.14-2.143.931-.022 1.417.829 2.135 2.249.671 1.326 1.432 2.828 3.026 2.886h.088c1.592 0 2.347-1.6 3.015-3.01.592-1.252 1.152-2.431 2.113-2.479Z",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 50",d:"M271.828 438.882h20.779v-20.779h-20.779Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 8",transform:"rotate(-14.98 1643.944 -873.93)"},r.createElement("rect",{"data-name":"Rectangle 3",width:43.906,height:17.333,rx:2,fill:"#d8d8d8"}),r.createElement("g",{"data-name":"Group 2",transform:"translate(.728 10.948)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 4",width:2.537,height:2.537,rx:1,transform:"translate(7.985)"}),r.createElement("rect",{"data-name":"Rectangle 5",width:2.537,height:2.537,rx:1,transform:"translate(10.991)"}),r.createElement("rect",{"data-name":"Rectangle 6",width:2.537,height:2.537,rx:1,transform:"translate(13.997)"}),r.createElement("rect",{"data-name":"Rectangle 7",width:2.537,height:2.537,rx:1,transform:"translate(17.003)"}),r.createElement("rect",{"data-name":"Rectangle 8",width:2.537,height:2.537,rx:1,transform:"translate(20.009)"}),r.createElement("rect",{"data-name":"Rectangle 9",width:2.537,height:2.537,rx:1,transform:"translate(23.015)"}),r.createElement("rect",{"data-name":"Rectangle 10",width:2.537,height:2.537,rx:1,transform:"translate(26.021)"}),r.createElement("rect",{"data-name":"Rectangle 11",width:2.537,height:2.537,rx:1,transform:"translate(29.028)"}),r.createElement("rect",{"data-name":"Rectangle 12",width:2.537,height:2.537,rx:1,transform:"translate(32.034)"}),r.createElement("path",{"data-name":"Path 51",d:"M.519 0H6.9a.519.519 0 0 1 .521.52v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Zm35.134 0h6.383a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-6.384a.519.519 0 0 1-.519-.519v-1.5A.519.519 0 0 1 35.652 0Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 3",transform:"translate(.728 4.878)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 52",d:"M.519 0h2.437a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 13",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 14",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 15",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 16",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 17",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 18",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 19",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 20",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 21",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 22",width:2.537,height:2.537,rx:1,transform:"translate(31)"}),r.createElement("rect",{"data-name":"Rectangle 23",width:2.537,height:2.537,rx:1,transform:"translate(34.006)"}),r.createElement("rect",{"data-name":"Rectangle 24",width:2.537,height:2.537,rx:1,transform:"translate(37.012)"}),r.createElement("rect",{"data-name":"Rectangle 25",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"})),r.createElement("g",{"data-name":"Group 4",transform:"rotate(180 21.642 2.269)",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 53",d:"M.519 0h2.437a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H.519A.519.519 0 0 1 0 2.017V.519A.519.519 0 0 1 .519 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 26",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 27",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 28",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 29",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 30",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 31",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 32",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 33",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 34",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 35",width:2.537,height:2.537,rx:1,transform:"translate(31.001)"}),r.createElement("rect",{"data-name":"Rectangle 36",width:2.537,height:2.537,rx:1,transform:"translate(34.007)"}),r.createElement("rect",{"data-name":"Rectangle 37",width:2.537,height:2.537,rx:1,transform:"translate(37.013)"}),r.createElement("rect",{"data-name":"Rectangle 38",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"}),r.createElement("rect",{"data-name":"Rectangle 39",width:2.537,height:2.537,rx:1,transform:"translate(3.945)"}),r.createElement("rect",{"data-name":"Rectangle 40",width:2.537,height:2.537,rx:1,transform:"translate(6.951)"}),r.createElement("rect",{"data-name":"Rectangle 41",width:2.537,height:2.537,rx:1,transform:"translate(9.958)"}),r.createElement("rect",{"data-name":"Rectangle 42",width:2.537,height:2.537,rx:1,transform:"translate(12.964)"}),r.createElement("rect",{"data-name":"Rectangle 43",width:2.537,height:2.537,rx:1,transform:"translate(15.97)"}),r.createElement("rect",{"data-name":"Rectangle 44",width:2.537,height:2.537,rx:1,transform:"translate(18.976)"}),r.createElement("rect",{"data-name":"Rectangle 45",width:2.537,height:2.537,rx:1,transform:"translate(21.982)"}),r.createElement("rect",{"data-name":"Rectangle 46",width:2.537,height:2.537,rx:1,transform:"translate(24.988)"}),r.createElement("rect",{"data-name":"Rectangle 47",width:2.537,height:2.537,rx:1,transform:"translate(27.994)"}),r.createElement("rect",{"data-name":"Rectangle 48",width:2.537,height:2.537,rx:1,transform:"translate(31.001)"}),r.createElement("rect",{"data-name":"Rectangle 49",width:2.537,height:2.537,rx:1,transform:"translate(34.007)"}),r.createElement("rect",{"data-name":"Rectangle 50",width:2.537,height:2.537,rx:1,transform:"translate(37.013)"}),r.createElement("rect",{"data-name":"Rectangle 51",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"})),r.createElement("g",{"data-name":"Group 6",fill:"#4a4a4a"},r.createElement("path",{"data-name":"Path 54",d:"M1.247 7.883h3.47a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-3.47A.519.519 0 0 1 .728 9.9V8.403a.519.519 0 0 1 .519-.52Z",fillRule:"evenodd"}),r.createElement("g",{"data-name":"Group 5",transform:"translate(5.801 7.883)"},r.createElement("rect",{"data-name":"Rectangle 52",width:2.537,height:2.537,rx:1}),r.createElement("rect",{"data-name":"Rectangle 53",width:2.537,height:2.537,rx:1,transform:"translate(3.006)"}),r.createElement("rect",{"data-name":"Rectangle 54",width:2.537,height:2.537,rx:1,transform:"translate(6.012)"}),r.createElement("rect",{"data-name":"Rectangle 55",width:2.537,height:2.537,rx:1,transform:"translate(9.018)"}),r.createElement("rect",{"data-name":"Rectangle 56",width:2.537,height:2.537,rx:1,transform:"translate(12.025)"}),r.createElement("rect",{"data-name":"Rectangle 57",width:2.537,height:2.537,rx:1,transform:"translate(15.031)"}),r.createElement("rect",{"data-name":"Rectangle 58",width:2.537,height:2.537,rx:1,transform:"translate(18.037)"}),r.createElement("rect",{"data-name":"Rectangle 59",width:2.537,height:2.537,rx:1,transform:"translate(21.042)"}),r.createElement("rect",{"data-name":"Rectangle 60",width:2.537,height:2.537,rx:1,transform:"translate(24.049)"}),r.createElement("rect",{"data-name":"Rectangle 61",width:2.537,height:2.537,rx:1,transform:"translate(27.055)"}),r.createElement("rect",{"data-name":"Rectangle 62",width:2.537,height:2.537,rx:1,transform:"translate(30.061)"})),r.createElement("path",{"data-name":"Path 55",d:"M39.482 7.883h3.28a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-3.281a.519.519 0 0 1-.519-.521V8.403a.519.519 0 0 1 .519-.52Z",fillRule:"evenodd"})),r.createElement("g",{"data-name":"Group 7",transform:"translate(.728 14.084)",fill:"#4a4a4a"},r.createElement("rect",{"data-name":"Rectangle 63",width:2.537,height:2.537,rx:1}),r.createElement("rect",{"data-name":"Rectangle 64",width:2.537,height:2.537,rx:1,transform:"translate(3.006)"}),r.createElement("rect",{"data-name":"Rectangle 65",width:2.537,height:2.537,rx:1,transform:"translate(6.012)"}),r.createElement("rect",{"data-name":"Rectangle 66",width:2.537,height:2.537,rx:1,transform:"translate(9.018)"}),r.createElement("path",{"data-name":"Path 56",d:"M12.543 0h14.462a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519H12.543a.519.519 0 0 1-.519-.52V.519A.519.519 0 0 1 12.543 0Zm15.97 0h1.874a.519.519 0 0 1 .519.519v1.5a.519.519 0 0 1-.519.519h-1.874a.519.519 0 0 1-.519-.519v-1.5A.519.519 0 0 1 28.513 0Z",fillRule:"evenodd"}),r.createElement("rect",{"data-name":"Rectangle 67",width:2.537,height:2.537,rx:1,transform:"translate(31.376)"}),r.createElement("rect",{"data-name":"Rectangle 68",width:2.537,height:2.537,rx:1,transform:"translate(34.382)"}),r.createElement("rect",{"data-name":"Rectangle 69",width:2.537,height:2.537,rx:1,transform:"translate(40.018)"}),r.createElement("path",{"data-name":"Path 57",d:"M37.199 1.08V.519A.519.519 0 0 1 37.718 0h1.499a.519.519 0 0 1 .519.519v.561Z"}),r.createElement("path",{"data-name":"Path 58",d:"M39.737 1.456v.561a.519.519 0 0 1-.519.519h-1.499a.519.519 0 0 1-.519-.519v-.561Z"})),r.createElement("rect",{"data-name":"Rectangle 70",width:42.273,height:1.127,rx:.564,transform:"translate(.915 .556)",fill:"#4a4a4a"}),r.createElement("rect",{"data-name":"Rectangle 71",width:2.37,height:.752,rx:.376,transform:"translate(1.949 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 72",width:2.37,height:.752,rx:.376,transform:"translate(5.193 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 73",width:2.37,height:.752,rx:.376,transform:"translate(7.688 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 74",width:2.37,height:.752,rx:.376,transform:"translate(10.183 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 75",width:2.37,height:.752,rx:.376,transform:"translate(12.679 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 76",width:2.37,height:.752,rx:.376,transform:"translate(15.797 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 77",width:2.37,height:.752,rx:.376,transform:"translate(18.292 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 78",width:2.37,height:.752,rx:.376,transform:"translate(20.788 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 79",width:2.37,height:.752,rx:.376,transform:"translate(23.283 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 80",width:2.37,height:.752,rx:.376,transform:"translate(26.402 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 81",width:2.37,height:.752,rx:.376,transform:"translate(28.897 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 82",width:2.37,height:.752,rx:.376,transform:"translate(31.393 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 83",width:2.37,height:.752,rx:.376,transform:"translate(34.512 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 84",width:2.37,height:.752,rx:.376,transform:"translate(37.007 .744)",fill:"#d8d8d8",opacity:.136}),r.createElement("rect",{"data-name":"Rectangle 85",width:2.37,height:.752,rx:.376,transform:"translate(39.502 .744)",fill:"#d8d8d8",opacity:.136})),r.createElement("path",{"data-name":"Path 59",d:"M302.996 425.895a2.583 2.583 0 0 0-.332.033c-.02-.078-.038-.156-.06-.234a2.594 2.594 0 1 0-2.567-4.455q-.086-.088-.174-.175a2.593 2.593 0 1 0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6 2.6 0 1 0-5.128 0c-.077.02-.154.038-.231.06a2.594 2.594 0 1 0-4.461 2.569 10.384 10.384 0 1 0 17.314 9.992 2.592 2.592 0 1 0 .332-5.161",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 60",d:"M271.828 407.713h20.779v-10.389h-20.779Z",fill:"#3ecc5f",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 61",d:"M297.801 403.818a1.3 1.3 0 1 0 0-2.6 1.338 1.338 0 0 0-.166.017l-.03-.117a1.3 1.3 0 0 0-.5-2.5 1.285 1.285 0 0 0-.783.269l-.087-.087a1.285 1.285 0 0 0 .263-.776 1.3 1.3 0 0 0-2.493-.509 5.195 5.195 0 1 0 0 10 1.3 1.3 0 0 0 2.493-.509 1.285 1.285 0 0 0-.263-.776l.087-.087a1.285 1.285 0 0 0 .783.269 1.3 1.3 0 0 0 .5-2.5c.011-.038.02-.078.03-.117a1.335 1.335 0 0 0 .166.017",fill:"#44d860",fillRule:"evenodd"}),r.createElement("path",{"data-name":"Path 62",d:"M302.997 365.507a1.41 1.41 0 0 1-.255-.026 1.309 1.309 0 0 1-.244-.073 1.349 1.349 0 0 1-.224-.119 1.967 1.967 0 0 1-.2-.161 1.52 1.52 0 0 1-.161-.2 1.282 1.282 0 0 1-.218-.722 1.41 1.41 0 0 1 .026-.255 1.5 1.5 0 0 1 .072-.244 1.364 1.364 0 0 1 .12-.223 1.252 1.252 0 0 1 .358-.358 1.349 1.349 0 0 1 .224-.119 1.309 1.309 0 0 1 .244-.073 1.2 1.2 0 0 1 .509 0 1.262 1.262 0 0 1 .468.192 1.968 1.968 0 0 1 .2.161 1.908 1.908 0 0 1 .161.2 1.322 1.322 0 0 1 .12.223 1.361 1.361 0 0 1 .1.5 1.317 1.317 0 0 1-.379.919 1.968 1.968 0 0 1-.2.161 1.346 1.346 0 0 1-.223.119 1.332 1.332 0 0 1-.5.1m10.389-.649a1.326 1.326 0 0 1-.92-.379 1.979 1.979 0 0 1-.161-.2 1.282 1.282 0 0 1-.218-.722 1.326 1.326 0 0 1 .379-.919 1.967 1.967 0 0 1 .2-.161 1.351 1.351 0 0 1 .224-.119 1.308 1.308 0 0 1 .244-.073 1.2 1.2 0 0 1 .509 0 1.262 1.262 0 0 1 .468.192 1.967 1.967 0 0 1 .2.161 1.326 1.326 0 0 1 .379.919 1.461 1.461 0 0 1-.026.255 1.323 1.323 0 0 1-.073.244 1.847 1.847 0 0 1-.119.223 1.911 1.911 0 0 1-.161.2 1.967 1.967 0 0 1-.2.161 1.294 1.294 0 0 1-.722.218",fillRule:"evenodd"}),r.createElement("g",{transform:"translate(466.3 278.56)",fill:"#61dafb"},r.createElement("path",{"data-name":"Path 330",d:"M263.668 117.179c0-5.827-7.3-11.35-18.487-14.775 2.582-11.4 1.434-20.477-3.622-23.382a7.861 7.861 0 0 0-4.016-1v4a4.152 4.152 0 0 1 2.044.466c2.439 1.4 3.5 6.724 2.672 13.574-.2 1.685-.52 3.461-.914 5.272a86.9 86.9 0 0 0-11.386-1.954 87.469 87.469 0 0 0-7.459-8.965c5.845-5.433 11.332-8.41 15.062-8.41V78c-4.931 0-11.386 3.514-17.913 9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712 0 9.216 2.959 15.062 8.356a84.687 84.687 0 0 0-7.405 8.947 83.732 83.732 0 0 0-11.4 1.972 54.136 54.136 0 0 1-.932-5.2c-.843-6.85.2-12.175 2.618-13.592a3.991 3.991 0 0 1 2.062-.466v-4a8 8 0 0 0-4.052 1c-5.039 2.9-6.168 11.96-3.568 23.328-11.153 3.443-18.415 8.947-18.415 14.757 0 5.828 7.3 11.35 18.487 14.775-2.582 11.4-1.434 20.477 3.622 23.382a7.882 7.882 0 0 0 4.034 1c4.931 0 11.386-3.514 17.913-9.611 6.527 6.061 12.982 9.539 17.913 9.539a8 8 0 0 0 4.052-1c5.039-2.9 6.168-11.96 3.568-23.328 11.111-3.42 18.373-8.943 18.373-14.752Zm-23.346-11.96a80.235 80.235 0 0 1-2.421 7.083 83.185 83.185 0 0 0-2.349-4.3 96.877 96.877 0 0 0-2.582-4.2c2.547.377 5.004.843 7.353 1.417Zm-8.212 19.1c-1.4 2.421-2.833 4.716-4.321 6.85a93.313 93.313 0 0 1-8.1.359c-2.708 0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136a94.058 94.058 0 0 1 3.712-7.154c1.4-2.421 2.833-4.716 4.321-6.85a93.313 93.313 0 0 1 8.1-.359c2.708 0 5.415.126 8.069.341q2.232 3.2 4.339 6.814 2.044 3.523 3.73 7.136a101.198 101.198 0 0 1-3.712 7.15Zm5.792-2.331a76.525 76.525 0 0 1 2.474 7.136 80.22 80.22 0 0 1-7.387 1.434c.879-1.381 1.757-2.8 2.582-4.25a96.22 96.22 0 0 0 2.329-4.324Zm-18.182 19.128a73.921 73.921 0 0 1-4.985-5.738c1.614.072 3.263.126 4.931.126 1.685 0 3.353-.036 4.985-.126a69.993 69.993 0 0 1-4.931 5.738Zm-13.34-10.561c-2.546-.377-5-.843-7.352-1.417a80.235 80.235 0 0 1 2.421-7.083c.735 1.434 1.506 2.869 2.349 4.3s1.702 2.837 2.582 4.2Zm13.25-37.314a73.924 73.924 0 0 1 4.985 5.738 110.567 110.567 0 0 0-4.931-.126c-1.686 0-3.353.036-4.985.126a69.993 69.993 0 0 1 4.931-5.738ZM206.362 103.8a100.567 100.567 0 0 0-4.913 8.55 76.525 76.525 0 0 1-2.474-7.136 90.158 90.158 0 0 1 7.387-1.414Zm-16.227 22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383 10.454-9.073c1.542-.663 3.228-1.255 4.967-1.811a86.122 86.122 0 0 0 4.034 10.92 84.9 84.9 0 0 0-3.981 10.866 53.804 53.804 0 0 1-5.021-1.826Zm9.647 25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9 86.9 0 0 0 11.386 1.954 87.465 87.465 0 0 0 7.459 8.965c-5.845 5.433-11.332 8.41-15.062 8.41a4.279 4.279 0 0 1-2.026-.48Zm42.532-13.663c.843 6.85-.2 12.175-2.618 13.592a3.99 3.99 0 0 1-2.062.466c-3.712 0-9.216-2.959-15.062-8.356a84.689 84.689 0 0 0 7.405-8.947 83.731 83.731 0 0 0 11.4-1.972 50.194 50.194 0 0 1 .936 5.22Zm6.9-11.96c-1.542.663-3.228 1.255-4.967 1.811a86.12 86.12 0 0 0-4.034-10.92 84.9 84.9 0 0 0 3.981-10.866 56.777 56.777 0 0 1 5.039 1.829c6.348 2.708 10.454 6.258 10.454 9.073-.017 2.818-4.123 6.386-10.471 9.076Z"}),r.createElement("path",{"data-name":"Path 331",d:"M201.718 78.072Z"}),r.createElement("circle",{"data-name":"Ellipse 112",cx:8.194,cy:8.194,r:8.194,transform:"translate(211.472 108.984)"}),r.createElement("path",{"data-name":"Path 332",d:"M237.525 78.018Z"})))))}},4002:(e,a,t)=>{t.d(a,{Z:()=>k});var l,r,n,c,h,d,m,i,s,f,o,g,E,p,v,x,R,w,u,Z,M,y,P,b,S,j,q,V,A,H,G,N,O,C,D,B,_=t(7294);function z(){return z=Object.assign?Object.assign.bind():function(e){for(var a=1;a{let{title:a,titleId:t,...k}=e;return _.createElement("svg",z({xmlns:"http://www.w3.org/2000/svg",width:1129,height:663,viewBox:"0 0 1129 663","aria-labelledby":t},k),void 0===a?_.createElement("title",{id:t},"Focus on What Matters"):a?_.createElement("title",{id:t},a):null,l||(l=_.createElement("circle",{cx:321,cy:321,r:321,fill:"#f2f2f2"})),r||(r=_.createElement("ellipse",{cx:559,cy:635.5,rx:514,ry:27.5,fill:"#3f3d56"})),n||(n=_.createElement("ellipse",{cx:558,cy:627,rx:460,ry:22,opacity:.2})),c||(c=_.createElement("path",{fill:"#3f3d56",d:"M131 152.5h840v50H131z"})),h||(h=_.createElement("path",{d:"M131 608.83a21.67 21.67 0 0 0 21.67 21.67h796.66A21.67 21.67 0 0 0 971 608.83V177.5H131ZM949.33 117.5H152.67A21.67 21.67 0 0 0 131 139.17v38.33h840v-38.33a21.67 21.67 0 0 0-21.67-21.67Z",fill:"#3f3d56"})),d||(d=_.createElement("path",{d:"M949.33 117.5H152.67A21.67 21.67 0 0 0 131 139.17v38.33h840v-38.33a21.67 21.67 0 0 0-21.67-21.67Z",opacity:.2})),m||(m=_.createElement("circle",{cx:181,cy:147.5,r:13,fill:"#3f3d56"})),i||(i=_.createElement("circle",{cx:217,cy:147.5,r:13,fill:"#3f3d56"})),s||(s=_.createElement("circle",{cx:253,cy:147.5,r:13,fill:"#3f3d56"})),f||(f=_.createElement("rect",{x:168,y:213.5,width:337,height:386,rx:5.335,fill:"#606060"})),o||(o=_.createElement("rect",{x:603,y:272.5,width:284,height:22,rx:5.476,fill:"#2e8555"})),g||(g=_.createElement("rect",{x:537,y:352.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),E||(E=_.createElement("rect",{x:537,y:396.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),p||(p=_.createElement("rect",{x:537,y:440.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),v||(v=_.createElement("rect",{x:537,y:484.5,width:416,height:15,rx:5.476,fill:"#2e8555"})),x||(x=_.createElement("rect",{x:865,y:552.5,width:88,height:26,rx:7.028,fill:"#3ecc5f"})),R||(R=_.createElement("path",{d:"M1053.103 506.116a30.114 30.114 0 0 0 3.983-15.266c0-13.797-8.544-24.98-19.083-24.98s-19.082 11.183-19.082 24.98a30.114 30.114 0 0 0 3.983 15.266 31.248 31.248 0 0 0 0 30.532 31.248 31.248 0 0 0 0 30.532 31.248 31.248 0 0 0 0 30.532 30.114 30.114 0 0 0-3.983 15.266c0 13.797 8.543 24.981 19.082 24.981s19.083-11.184 19.083-24.98a30.114 30.114 0 0 0-3.983-15.267 31.248 31.248 0 0 0 0-30.532 31.248 31.248 0 0 0 0-30.532 31.248 31.248 0 0 0 0-30.532Z",fill:"#3f3d56"})),w||(w=_.createElement("ellipse",{cx:1038.003,cy:460.318,rx:19.083,ry:24.981,fill:"#3f3d56"})),u||(u=_.createElement("ellipse",{cx:1038.003,cy:429.786,rx:19.083,ry:24.981,fill:"#3f3d56"})),Z||(Z=_.createElement("path",{d:"M1109.439 220.845a91.61 91.61 0 0 0 7.106-10.461l-50.14-8.235 54.228.403a91.566 91.566 0 0 0 1.746-72.426l-72.755 37.742 67.097-49.321A91.413 91.413 0 1 0 965.75 220.845a91.458 91.458 0 0 0-10.425 16.67l65.087 33.814-69.4-23.292a91.46 91.46 0 0 0 14.738 85.837 91.406 91.406 0 1 0 143.689 0 91.418 91.418 0 0 0 0-113.03Z",fill:"#3ecc5f",fillRule:"evenodd"})),M||(M=_.createElement("path",{d:"M946.188 277.36a91.013 91.013 0 0 0 19.562 56.514 91.406 91.406 0 1 0 143.689 0c12.25-15.553-163.25-66.774-163.25-56.515Z",opacity:.1})),y||(y=_.createElement("path",{d:"M330.12 342.936h111.474v45.12H330.12Z",fill:"#fff",fillRule:"evenodd"})),P||(P=_.createElement("path",{d:"M229.263 490.241a26.51 26.51 0 0 1-22.963-13.27 26.51 26.51 0 0 0 22.963 39.812h26.541V490.24Z",fill:"#3ecc5f",fillRule:"evenodd"})),b||(b=_.createElement("path",{d:"m348.672 350.07 92.922-5.807v-13.27a26.54 26.54 0 0 0-26.541-26.542H295.616l-3.318-5.746a3.83 3.83 0 0 0-6.635 0l-3.318 5.746-3.317-5.746a3.83 3.83 0 0 0-6.636 0l-3.317 5.746-3.318-5.746a3.83 3.83 0 0 0-6.635 0l-3.318 5.746c-.03 0-.056.004-.086.004l-5.497-5.495a3.83 3.83 0 0 0-6.407 1.717l-1.817 6.773-6.89-1.847a3.83 3.83 0 0 0-4.691 4.693l1.844 6.891-6.77 1.814a3.832 3.832 0 0 0-1.72 6.41l5.497 5.497c0 .028-.004.055-.004.085l-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318-5.747 3.317a3.83 3.83 0 0 0 0 6.636l5.747 3.317-5.747 3.318a3.83 3.83 0 0 0 0 6.635l5.747 3.318a26.54 26.54 0 0 0 26.541 26.542h159.249a26.54 26.54 0 0 0 26.541-26.542V384.075l-92.922-5.807a14.126 14.126 0 0 1 0-28.197",fill:"#3ecc5f",fillRule:"evenodd"})),S||(S=_.createElement("path",{d:"M388.511 516.783h39.812V463.7h-39.812Z",fill:"#3ecc5f",fillRule:"evenodd"})),j||(j=_.createElement("path",{d:"M454.865 483.606a6.602 6.602 0 0 0-.848.085c-.05-.2-.099-.4-.154-.599a6.627 6.627 0 1 0-6.557-11.382q-.22-.225-.445-.446a6.624 6.624 0 1 0-11.397-6.564c-.196-.055-.394-.102-.59-.152a6.64 6.64 0 1 0-13.101 0c-.197.05-.394.097-.59.152a6.628 6.628 0 1 0-11.398 6.564 26.528 26.528 0 1 0 44.232 25.528 6.621 6.621 0 1 0 .848-13.186",fill:"#44d860",fillRule:"evenodd"})),q||(q=_.createElement("path",{d:"M401.782 437.158h39.812v-26.541h-39.812Z",fill:"#3ecc5f",fillRule:"evenodd"})),V||(V=_.createElement("path",{d:"M454.865 427.205a3.318 3.318 0 0 0 0-6.635 3.411 3.411 0 0 0-.424.042c-.026-.1-.049-.199-.077-.298a3.319 3.319 0 0 0-1.278-6.38 3.282 3.282 0 0 0-2 .688q-.11-.113-.224-.223a3.282 3.282 0 0 0 .672-1.983 3.318 3.318 0 0 0-6.37-1.299 13.27 13.27 0 1 0 0 25.541 3.318 3.318 0 0 0 6.37-1.3 3.282 3.282 0 0 0-.672-1.982q.114-.11.223-.223a3.282 3.282 0 0 0 2.001.688 3.318 3.318 0 0 0 1.278-6.38c.028-.098.05-.199.077-.298a3.413 3.413 0 0 0 .424.042",fill:"#44d860",fillRule:"evenodd"})),A||(A=_.createElement("path",{d:"M282.345 347.581a3.318 3.318 0 0 1-3.317-3.318 9.953 9.953 0 1 0-19.906 0 3.318 3.318 0 1 1-6.636 0 16.588 16.588 0 1 1 33.177 0 3.318 3.318 0 0 1-3.318 3.318",fillRule:"evenodd"})),H||(H=_.createElement("path",{d:"M335.428 516.783h79.625a26.54 26.54 0 0 0 26.541-26.542v-92.895H361.97a26.54 26.54 0 0 0-26.542 26.542Z",fill:"#ffff50",fillRule:"evenodd"})),G||(G=_.createElement("path",{d:"M421.714 438.485h-66.406a1.327 1.327 0 0 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.542h-66.406a1.327 1.327 0 1 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.541h-66.406a1.327 1.327 0 1 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0-66.106h-66.406a1.327 1.327 0 0 1 0-2.655h66.406a1.327 1.327 0 0 1 0 2.655m0 26.294h-66.406a1.327 1.327 0 0 1 0-2.654h66.406a1.327 1.327 0 0 1 0 2.654m0 26.542h-66.406a1.327 1.327 0 0 1 0-2.655h66.406a1.327 1.327 0 0 1 0 2.655m19.88-122.607c-.016 0-.03-.008-.045-.007-4.1.14-6.04 4.241-7.753 7.86-1.786 3.783-3.168 6.242-5.432 6.167-2.506-.09-3.94-2.922-5.458-5.918-1.744-3.443-3.734-7.347-7.913-7.201-4.042.138-5.99 3.708-7.706 6.857-1.828 3.355-3.071 5.394-5.47 5.3-2.557-.093-3.916-2.395-5.488-5.06-1.753-2.967-3.78-6.304-7.878-6.19-3.973.137-5.925 3.166-7.648 5.84-1.822 2.826-3.098 4.549-5.527 4.447-2.618-.093-3.97-2.004-5.535-4.216-1.757-2.486-3.737-5.3-7.823-5.163-3.886.133-5.838 2.615-7.56 4.802-1.634 2.075-2.91 3.718-5.611 3.615a1.328 1.328 0 1 0-.096 2.654c4.004.134 6.032-2.389 7.793-4.628 1.562-1.985 2.91-3.698 5.564-3.789 2.556-.108 3.754 1.48 5.567 4.041 1.721 2.434 3.675 5.195 7.606 5.337 4.118.138 6.099-2.94 7.853-5.663 1.569-2.434 2.923-4.535 5.508-4.624 2.38-.088 3.674 1.792 5.5 4.885 1.722 2.916 3.671 6.22 7.68 6.365 4.147.143 6.15-3.477 7.895-6.682 1.511-2.77 2.938-5.388 5.466-5.475 2.38-.056 3.62 2.116 5.456 5.746 1.714 3.388 3.658 7.226 7.73 7.373l.224.004c4.066 0 5.996-4.08 7.704-7.689 1.511-3.198 2.942-6.21 5.397-6.334Z",fillRule:"evenodd"})),N||(N=_.createElement("path",{d:"M308.887 516.783h53.083V463.7h-53.083Z",fill:"#3ecc5f",fillRule:"evenodd"})),O||(O=_.createElement("path",{d:"M388.511 483.606a6.602 6.602 0 0 0-.848.085c-.05-.2-.098-.4-.154-.599a6.627 6.627 0 1 0-6.557-11.382q-.22-.225-.444-.446a6.624 6.624 0 1 0-11.397-6.564c-.197-.055-.394-.102-.59-.152a6.64 6.64 0 1 0-13.102 0c-.196.05-.394.097-.59.152a6.628 6.628 0 1 0-11.397 6.564 26.528 26.528 0 1 0 44.231 25.528 6.621 6.621 0 1 0 .848-13.186",fill:"#44d860",fillRule:"evenodd"})),C||(C=_.createElement("path",{d:"M308.887 437.158h53.083v-26.541h-53.083Z",fill:"#3ecc5f",fillRule:"evenodd"})),D||(D=_.createElement("path",{d:"M375.24 427.205a3.318 3.318 0 1 0 0-6.635 3.411 3.411 0 0 0-.423.042c-.026-.1-.05-.199-.077-.298a3.319 3.319 0 0 0-1.278-6.38 3.282 3.282 0 0 0-2.001.688q-.11-.113-.223-.223a3.282 3.282 0 0 0 .671-1.983 3.318 3.318 0 0 0-6.37-1.299 13.27 13.27 0 1 0 0 25.541 3.318 3.318 0 0 0 6.37-1.3 3.282 3.282 0 0 0-.671-1.982q.113-.11.223-.223a3.282 3.282 0 0 0 2.001.688 3.318 3.318 0 0 0 1.278-6.38c.028-.098.05-.199.077-.298a3.413 3.413 0 0 0 .423.042",fill:"#44d860",fillRule:"evenodd"})),B||(B=_.createElement("path",{d:"M388.511 329.334a3.603 3.603 0 0 1-.65-.067 3.344 3.344 0 0 1-.624-.185 3.447 3.447 0 0 1-.572-.306 5.027 5.027 0 0 1-.504-.411 3.887 3.887 0 0 1-.41-.504 3.275 3.275 0 0 1-.558-1.845 3.602 3.602 0 0 1 .067-.65 3.826 3.826 0 0 1 .184-.624 3.489 3.489 0 0 1 .307-.57 3.197 3.197 0 0 1 .914-.916 3.447 3.447 0 0 1 .572-.305 3.344 3.344 0 0 1 .624-.186 3.07 3.07 0 0 1 1.3 0 3.223 3.223 0 0 1 1.195.49 5.028 5.028 0 0 1 .504.412 4.88 4.88 0 0 1 .411.504 3.382 3.382 0 0 1 .306.571 3.478 3.478 0 0 1 .252 1.274 3.364 3.364 0 0 1-.969 2.349 5.027 5.027 0 0 1-.504.411 3.306 3.306 0 0 1-1.845.558m26.542-1.66a3.388 3.388 0 0 1-2.35-.968 5.042 5.042 0 0 1-.41-.504 3.275 3.275 0 0 1-.558-1.845 3.387 3.387 0 0 1 .967-2.349 5.026 5.026 0 0 1 .505-.411 3.447 3.447 0 0 1 .572-.305 3.343 3.343 0 0 1 .623-.186 3.07 3.07 0 0 1 1.3 0 3.224 3.224 0 0 1 1.195.49 5.026 5.026 0 0 1 .504.412 3.388 3.388 0 0 1 .97 2.35 3.726 3.726 0 0 1-.067.65 3.374 3.374 0 0 1-.186.623 4.715 4.715 0 0 1-.305.57 4.88 4.88 0 0 1-.412.505 5.026 5.026 0 0 1-.504.412 3.305 3.305 0 0 1-1.844.557",fillRule:"evenodd"})))}},4470:(e,a,t)=>{t.r(a),t.d(a,{default:()=>p});var l=t(512),r=t(3692),n=t(2263),c=t(7372),h=t(2503);const d={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var m=t(5893);const i=[{title:"Easy to Use",Svg:t(9722).Z,description:(0,m.jsx)(m.Fragment,{children:"Docusaurus was designed from the ground up to be easily installed and used to get your website up and running quickly."})},{title:"Focus on What Matters",Svg:t(4002).Z,description:(0,m.jsxs)(m.Fragment,{children:["Docusaurus lets you focus on your docs, and we'll do the chores. Go ahead and move your docs into the ",(0,m.jsx)("code",{children:"docs"})," directory."]})},{title:"Powered by React",Svg:t(8066).Z,description:(0,m.jsx)(m.Fragment,{children:"Extend or customize your website layout by reusing React. Docusaurus can be extended while reusing the same header and footer."})}];function s(e){let{title:a,Svg:t,description:r}=e;return(0,m.jsxs)("div",{className:(0,l.Z)("col col--4"),children:[(0,m.jsx)("div",{className:"text--center",children:(0,m.jsx)(t,{className:d.featureSvg,role:"img"})}),(0,m.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,m.jsx)(h.Z,{as:"h3",children:a}),(0,m.jsx)("p",{children:r})]})]})}function f(){return(0,m.jsx)("section",{className:d.features,children:(0,m.jsx)("div",{className:"container",children:(0,m.jsx)("div",{className:"row",children:i.map(((e,a)=>(0,m.jsx)(s,{...e},a)))})})})}const o={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"},g={tutorialSidebar:["Overview",{type:"category",label:"Changelog",items:JSON.parse('{"o":["changelogSplits/5.19","changelogSplits/5.18","changelogSplits/5.17","changelogSplits/5.16","changelogSplits/5.15","changelogSplits/5.14","changelogSplits/5.13","changelogSplits/5.12","changelogSplits/5.11","changelogSplits/5.10","changelogSplits/5.9","changelogSplits/5.8","changelogSplits/5.7","changelogSplits/5.6","changelogSplits/5.5","changelogSplits/5.4","changelogSplits/5.3","changelogSplits/5.2","changelogSplits/5.1","changelogSplits/5.0"]}').o},"Start Developing",{type:"category",label:"Contributor Guide",link:{type:"doc",id:"Contributor Guide"},items:[{type:"autogenerated",dirName:"Charting-Concepts"}]},"Technical Details","Detailed Implementation Steps","Debugging","Implementation Best Practices","Accessibility","colors","implementing-2-to-1-spacing","creating-date-objects-for-chart-data","Testing Strategy","TestCoverage",{type:"category",label:"Test Plans",items:[{type:"autogenerated",dirName:"Test Plans"}]},"Testing Unpublished Library Version","BundleSize"]};function E(){const{siteConfig:e}=(0,n.Z)();return(0,m.jsx)("header",{className:(0,l.Z)("hero hero--primary",o.heroBanner),children:(0,m.jsxs)("div",{className:"container",children:[(0,m.jsx)(h.Z,{as:"h1",className:"hero__title",children:e.title}),(0,m.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,m.jsx)("div",{className:o.buttons,children:(0,m.jsx)(r.Z,{className:"button button--secondary button--lg",to:`/docs/${g.tutorialSidebar[0]}`,children:"Getting Started \ud83d\ude88"})})]})})}function p(){const{siteConfig:e}=(0,n.Z)();return(0,m.jsxs)(c.Z,{title:`${e.title}`,description:"Description will go into a meta tag in ",children:[(0,m.jsx)(E,{}),(0,m.jsx)("main",{children:(0,m.jsx)(f,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/1ff5abae.3774152c.js b/assets/js/1ff5abae.3774152c.js new file mode 100644 index 0000000000..6cdc274391 --- /dev/null +++ b/assets/js/1ff5abae.3774152c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[5671],{2972:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>h,toc:()=>l});var a=n(5893),i=n(1151);const s={},r="Grouped Vertical Bar Chart",h={id:"Charting-Concepts/GroupedVerticalBarChart",title:"Grouped Vertical Bar Chart",description:"GroupedVerticalBarChart1.png",source:"@site/../../docs/Charting-Concepts/GroupedVerticalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/GroupedVerticalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/GroupedVerticalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Gauge Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/GaugeChart"},next:{title:"Heatmap Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HeatMapChart"}},o={},l=[];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"grouped-vertical-bar-chart",children:"Grouped Vertical Bar Chart"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart1.png",src:n(1075).Z+"",width:"1011",height:"748"})}),"\n",(0,a.jsx)(t.p,{children:"A grouped vertical bar chart is a type of chart that displays multiple series of data as groups of bars, with each bar representing a category. The bars are grouped together side by side, with each group representing a different series."}),"\n",(0,a.jsx)(t.p,{children:"In a grouped vertical bar chart, the x-axis represents the categories, while the y-axis represents the values of the series. Each bar in a group is colored differently to differentiate between the series."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Use cases"}),"\nSome common use cases for a Grouped Vertical Bar Chart are as follows:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Comparing the values of multiple series across categories"}),"\n",(0,a.jsx)(t.li,{children:"Displaying financial data, such as revenue and expenses, for different products or services"}),"\n",(0,a.jsx)(t.li,{children:"Displaying scientific research data for different treatments or conditions"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the performance of different teams or departments in a company"}),"\n",(0,a.jsx)(t.li,{children:"Showing the distribution of different types of crimes in a city"}),"\n",(0,a.jsx)(t.li,{children:"Displaying the results of a survey for different age groups or genders"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the sales of different products in a store"}),"\n",(0,a.jsx)(t.li,{children:"Showing the number of students enrolled in different courses in a school"}),"\n",(0,a.jsx)(t.li,{children:"Displaying the number of employees in different departments of a company"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the number of visitors to different tourist attractions in a city"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"Mathematical/Geometrical concepts"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart2.png",src:n(1030).Z+"",width:"1121",height:"636"})}),"\n",(0,a.jsx)(t.p,{children:"The major D3 functions that are involved in the creation of Vertical bar charts are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-scale:"}),"\nThe\xa0d3-scale\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, which are used to map data values to visual properties, such as\xa0position, size, and color."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module includes several scale types, including linear, logarithmic, power, and time scales. These scales are used to map continuous data values to a continuous range of visual properties. The module also includes ordinal and band scales, which are used to map categorical data values to a discrete range of visual properties."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, including\xa0scaleLinear, scaleLog, scalePow, scaleTime, scaleOrdinal, and scaleBand. These functions take one or more arguments that define the domain and range of the scale, as well as any additional properties, such as the number of ticks or the padding between bands."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"}),"\nGrouped vertical bar chart uses the\xa0d3-scale\xa0module to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.scaleLinear()"}),": The\xa0d3.scaleLinear\xa0is a function from the\xa0d3-scale\xa0module that is used to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height. The\xa0d3ScaleLinear\xa0function takes no arguments and returns a new linear scale. The scale can be customized using several methods, including\xa0domain, range, clamp, and nice. The\xa0domain\xa0method sets the domain of the scale, which is the range of data values that the scale maps to the range of visual properties. The\xa0range\xa0method sets the range of the scale, which is the range of visual properties that the scale maps to the domain of data values."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3.scaleLinear\xa0function from the\xa0d3-scale\xa0module is used to create a new linear scale for the y-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function takes no arguments and returns a new linear scale. The scale maps a continuous input domain to a continuous output range. In this case, the input domain is the range of values for the y-axis data, while the output range is the range of pixel values for the y-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to generate the y-axis scale for the chart. The\xa0yAxisScale\xa0property of the component is set to a new instance of the\xa0d3.scaleLinear\xa0function. The\xa0domain\xa0property of the\xa0yAxisScale\xa0object is set to an array of the minimum and maximum values of the y-axis data. The\xa0range\xa0property of the\xa0yAxisScale\xa0object is set to an array of the minimum and maximum pixel values for the y-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function is used to generate a linear scale that maps the y-axis data to the pixel values on the chart. This allows the y-axis data to be displayed in a way that is visually meaningful and easy to interpret."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.scaleBand():"}),"\xa0The\xa0d3.scaleBand\xa0is a function from the\xa0d3-scale\xa0module that is used to create a band scale for the x-axis of the chart. The band scale maps a discrete domain of data values to a discrete range of visual properties, such as\xa0position or width. The\xa0d3ScaleBand\xa0function takes no arguments and returns a new band scale. The scale can be customized using several methods, including\xa0domain, range, padding, and align. The\xa0domain\xa0method sets the domain of the scale, which is the range of data values that the scale maps to the range of visual properties. The\xa0range\xa0method sets the range of the scale, which is the range of visual properties that the scale maps to the domain of data values. The\xa0padding\xa0method sets the padding between the bands of the scale, which determines the width of the bands. The\xa0align\xa0method sets the alignment of the bands within the range of the scale."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- x0_inner_padding = space_between_groups /(space_between_groups + group_width)\n\n- space_between_groups = 2 * bar_width\n\n- group_width = this._keys.length * bar_width + (this._keys.length - 1) * space_between_bars\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3.scaleBand\xa0function from the\xa0d3-scale\xa0module is used to create a new band scale for the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function takes no arguments and returns a new band scale. The scale maps a discrete input domain to a continuous output range. In this case, the input domain is an array of categories for the x-axis, while the output range is the range of pixel values for the x-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to generate the x-axis scale for the chart. The\xa0xAxisScale\xa0property of the component is set to a new instance of the\xa0d3.scaleBand\xa0function. The\xa0domain\xa0property of the\xa0xAxisScale\xa0object is set to an array of the categories for the x-axis. The\xa0range\xa0property of the\xa0xAxisScale\xa0object is set to an array of the minimum and maximum pixel values for the x-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function is used to generate a band scale that maps the categories for the x-axis to the pixel values on the chart. This allows the categories to be displayed in a way that is visually meaningful and easy to interpret. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0properties of the\xa0xAxisScale\xa0object can be used to adjust the spacing between the bars and groups of bars on the chart."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3.scaleBand\xa0function is used to generate a band scale that maps the categories for the x-axis to the pixel values on the chart, allowing the categories to be displayed in a way that is visually meaningful and easy to interpret."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-selection:"}),"\xa0The\xa0d3-selection\xa0is a module from the d3 library that is used to select and manipulate DOM elements in the chart component. The\xa0d3-selection\xa0module provides several functions for selecting and manipulating DOM elements, including\xa0select, selectAll, append, attr, and style. The select function is used to select a single DOM element that matches a given selector. The\xa0selectAll\xa0function is used to select multiple DOM elements that match a given selector. The\xa0append\xa0function is used to append a new DOM element to a selected element. The\xa0attr\xa0function is used to set or get an attribute of a selected element. The\xa0style\xa0function is used to set or get a style property of a selected element."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3Select\xa0function from the\xa0d3-selection\xa0module is used to select an element from the DOM."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3Select\xa0function takes one argument, which is a SVG node element for the element to be selected. The function returns a new selection object that represents the selected element."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3Select\xa0function from the\xa0d3-selection\xa0module is used to select an element from the DOM, which allows the\xa0GroupedVerticalBarChart\xa0component to interact with and modify the chart elements."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-array:"}),"\xa0The\xa0d3-array\xa0is a module from the d3 library that is used to manipulate arrays of data in the chart component. The\xa0d3-array\xa0module provides several functions for manipulating arrays of data, including\xa0max, min, extent, sum, and mean. The\xa0max\xa0function is used to find the maximum value in an array of data. The\xa0min\xa0function is used to find the minimum value in an array of data. The\xa0extent\xa0function is used to find the minimum and maximum values in an array of data. The\xa0sum\xa0function is used to find the sum of the values in an array of data. The\xa0mean\xa0function is used to find the mean (average) of the values in an array of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3Max\xa0function from the\xa0d3-array\xa0module is used to find the maximum value in an array of numbers."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3Max\xa0function takes two arguments: the first argument is the array of numbers to be searched, and the second argument is an optional function that specifies how to extract the numeric value from each element in the array. If the second argument is not provided, the\xa0d3Max\xa0function assumes that the array contains only numeric values."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3Max\xa0function from the\xa0d3-array\xa0module is used to find the maximum value in an array of numbers, which allows the\xa0GroupedVerticalBarChart\xa0component to set the y-axis scale domain based on the maximum value of the y-axis data."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-format:"}),"\xa0The\xa0d3-format\xa0is a module from the d3 library that is used to format numbers and strings in the chart component. The\xa0d3-format\xa0module provides several functions for formatting numbers and strings, including\xa0format, formatPrefix, precisionFixed, and precisionRound."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0format\xa0function is used to format a number or string using a specified format string. The format string can include placeholders for the value, such as\xa0%\xa0for a percentage or\xa0,\xa0for a comma-separated number. The\xa0formatPrefix\xa0function is used to format a number using a prefix notation that rounds the value to a specified precision and appends a prefix, such as\xa0K\xa0for thousands or\xa0M\xa0for millions. The\xa0precisionFixed\xa0function is used to format a number using a fixed number of decimal places. The\xa0precisionRound\xa0function is used to format a number using a variable number of decimal places that is determined by the magnitude of the value."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module is used to format numbers with SI-prefixes."}),"\n",(0,a.jsx)(t.li,{children:'The\xa0d3FormatPrefix\xa0function takes one argument, which is a numeric value. The function returns a string that represents the value with an SI-prefix, such as "K" for thousands or "M" for millions.'}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3FormatPrefix\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to format the bar labels for groups."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module is used to format numbers, which allows the component to display the bar labels in a way that is visually meaningful and easy to interpret."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-axis:"}),"\xa0The\xa0d3-axis\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-axis\xa0module provides several functions for creating and manipulating axes, which are used to display the scales of a chart component."]}),"\n",(0,a.jsx)(t.p,{children:"In data visualization, axes are used to display the scales of a chart component, such as the x-axis and y-axis of a bar chart. Axes provide visual cues to help readers interpret the data values of a chart component, such as the range and domain of the data values."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0module provides several types of axes, including\xa0bottom, top, left, and right axes. Each type of axis has its own set of methods for customizing the axis and displaying the tick values."}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3-axis\xa0module is an essential part of data visualization, as it provides a powerful and flexible way to display the scales of a chart component and help readers interpret the data values of the chart."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"}),"\nIn the Vertical stacked bar chart,\xa0d3-axis\xa0is used to create and render the x and y axes of the chart."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0d3-axis\xa0library provides various methods for creating and rendering axes, such as\xa0axisBottom(),\xa0axisLeft(), and\xa0tickFormat(). In this case, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart."}),"\n",(0,a.jsx)(t.li,{children:"To create the x and y axes, the\xa0d3-axis\xa0library's\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods are used, respectively. These methods take a scale function as an argument and return a new axis function that can be used to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"The resulting x and y axis functions are then used to render the x and y axes of the chart. The\xa0call()\xa0method of the selection object is used to call the axis function and render the axis."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0tickFormat()\xa0method of the y-axis scale is also used to set the tick format function for the y-axis. This method takes the format function created using the\xa0d3-format\xa0library as an argument and sets it as the tick format function for the y-axis."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart by using the\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods to create the axis functions and the\xa0call()\xa0method to render the axes. The\xa0tickFormat()\xa0method is also used to set the tick format function for the y-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Dev Deisgn Details:"}),"\nFollowing are the major components that contribute towards creating a complete grouped vertical bar chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Axes:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createX0Scale():"}),"\xa0This method is responsible for generating the x and y scales that are used to map the data points to the chart dimensions. The scales are generated using the\xa0d3-scale\xa0library, which provides several scale types for different types of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth: It is a number representing the width of the container element for the chart. This argument is used to calculate the range of the x-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createX0Scale\xa0method first creates a new\xa0d3ScaleBand\xa0object called\xa0x0Axis. The\xa0domain\xa0property of the\xa0x0Axis\xa0object is set to the\xa0_xAxisLabels\xa0array, which contains the labels for the main x-axis of the chart. The\xa0range\xa0property of the\xa0x0Axis\xa0object is set to an array that defines the range of the main x-axis scale. The range is calculated based on the\xa0containerWidth, the\xa0margins\xa0of the chart, and the\xa0_domainMargin\xa0property, which is the margin between the edge of the chart and the first and last bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0paddingInner\xa0property of the\xa0x0Axis\xa0object is set to a value that defines the inner padding between groups of bars in the chart. The value is calculated based on the number of keys in the chart, which is the number of series in each data point, and the\xa0BAR_GAP_RATE\xa0property, which is the ratio of the space between bars to the width of a bar."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_createX0Scale\xa0method returns the\xa0x0Axis\xa0object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createX1Scale():"}),"\xa0This method generates the grouped x-axis scale for the chart. The method creates a new\xa0d3ScaleBand\xa0object and sets its\xa0domain, range, and paddingInner\xa0properties based on the\xa0_keys\xa0array, the\xa0bandwidth\xa0of the main x-axis scale, the\xa0_isRtl\xa0property, and the\xa0X1_INNER_PADDING\xa0and\xa0BAR_GAP_RATE\xa0properties. The method returns the\xa0d3ScaleBand\xa0object."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale0: This argument is a scale function that is used to calculate the width of each bar in the chart. The function returns a new scale function that is used to calculate the position of each bar within a group."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createX1Scale\xa0method first creates a new\xa0d3ScaleBand\xa0object say\xa0x1Axis. The\xa0domain\xa0property of the\xa0x1Axis\xa0object is set to the\xa0_keys\xa0array, which contains the keys for each series in the chart. The\xa0range\xa0property of the\xa0x1Axis\xa0object is set to an array that defines the range of the grouped x-axis scale. The range is calculated based on the\xa0bandwidth\xa0of the main x-axis scale, the\xa0_isRtl\xa0property, which is a\xa0boolean\xa0that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0paddingInner\xa0property of the\xa0x1Axis\xa0object is set to a value that defines the inner padding between groups of bars in the chart. The value is calculated based on the\xa0X1_INNER_PADDING\xa0property whose value is 0.1."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_createX1Scale\xa0method returns the\xa0x1Axis\xa0object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getDomainMargins():"}),"\xa0This method calculates the margins of the chart based on the available width of the chart container and the required width to render the bars in the chart. The method calculates the\xa0barWidth\xa0and\xa0groupWidth\xa0variables based on the\xa0barwidth\xa0prop, the number of keys in the chart, and the\xa0BAR_GAP_RATE\xa0property. If the available width is greater than or equal to the required width, the method centers the chart by setting equal left and right margins for the domain. If the available width is less than the required width, the method calculates the maximum possible group width to maintain a\xa02:1\xa0spacing between bars and groups of bars and recalculates the\xa0barWidth\xa0variable. The method returns an object that represents the margins of the chart."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth: It is a number representing the width of the container in which the chart is being rendered."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Formulae:"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x1_inner_padding = space_between_bars / (space_between_bars + bar_width)\n\n=> space_between_bars = (x1_inner_padding / (1 - x1_inner_padding)) \\* bar_width\n\nBAR_GAP_RATE = Rate at which the space between the bars in a group changes wrt the bar width\n\nBAR_GAP_RATE = X1_INNER_PADDING / (1 - X1_INNER_PADDING)\n\nX1_INNER_PADDING = 0.1\n\nMaximum possible group width to maintain 2:1 spacing:\n\nInitialBarWidth = Math.min(props.barwidth || 16, 24);\n\n(i) InitialGroupWidth = _keys.length * InitialBarWidth+ (_keys.length - 1) * BAR_GAP_RATE * InitialBarWidth\n\nTotal width required to render the bars. Directly proportional to bar width:\n\n(ii) ReqWidth = _xAxisLabels.length * InitialGroupWidth + (_xAxisLabels.length - 1) * 2 * InitialBarWidth\n\nFrom (i) and (ii)\n\nMaximum possible group width to maintain 2:1 spacing\n\nMaxBandwidth = totalWidth / (_xAxisLabels.length +\n\n(_xAxisLabels.length - 1) \\* (2 / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)))\n\nFinalGroupWidth = MaxBandwidth;\n\nFrom (i)\n\nFinalBarWidth = FinalGroupWidth / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getDomainMargins\xa0method first calculates the total width available to render the bars in the chart. The total width is calculated based on the\xa0containerWidth, the\xa0margins\xa0of the chart, and the\xa0MIN_DOMAIN_MARGIN\xa0property, which is the minimum margin between the edge of the chart and the first and last bars. The method then sets the\xa0barWidth\xa0variable to the minimum of the\xa0barwidth\xa0prop or 16, and the\xa0groupWidth\xa0variable to the product of the number of keys in the chart, the\xa0barWidth, and the\xa0BAR_GAP_RATE\xa0property, which is the ratio of the space between bars to the width of a bar, plus the space between groups of bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then calculates the total width required to render the bars in the chart. The total width is calculated based on the length of the\xa0_xAxisLabels\xa0array, the\xa0groupWidth, the\xa0barWidth, and the space between groups of bars. If the total width available to render the bars is greater than or equal to the total width required to render the bars, the method sets the\xa0_domainMargin\xa0property to half of the difference between the total width available and the total width required. This centers the chart by setting equal left and right margins for the domain."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the total width available to render the bars is less than the total width required to render the bars, the method calculates the maximum possible group width to maintain a 2:1 spacing between bars and groups of bars. The method then sets the\xa0groupWidth\xa0variable to the maximum possible group width and recalculates the\xa0barWidth\xa0variable based on the\xa0groupWidth\xa0and the\xa0BAR_GAP_RATE\xa0property. The\xa0_domainMargin\xa0property is set to the\xa0MIN_DOMAIN_MARGIN."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_getDomainMargins\xa0method returns an object that represents the margins of the chart. The left and right margins of the chart are updated to include the\xa0_domainMargin."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createNumericXAxis():"}),"\xa0The code above is a function called\xa0createNumericXAxis\xa0in the\xa0utilities.ts\xa0file. This function is responsible for creating a numeric x-axis for a chart component. The function takes two arguments:\xa0xAxisParams\xa0and\xa0chartType.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0showRoundOffXTickValues,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisCount, and\xa0xAxisElement.\xa0chartType\xa0is an enumeration that specifies the type of chart component."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["xAxisParams\xa0of type\xa0IXAxisParams\xa0which is an object containing the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"domainNRangeValues\xa0of type\xa0IDomainNRange\xa0which is an object containing the domain and range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"showRoundOffXTickValues\xa0of type\xa0boolean\xa0which is an optional property that determines whether to round off the x-axis tick values."}),"\n",(0,a.jsx)(t.li,{children:"xAxistickSize\xa0of type\xa0number\xa0which is an optional property that determines the size of the x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding\xa0of type\xa0number\xa0which is an optional property that determines the padding between the x-axis ticks and the x-axis labels."}),"\n",(0,a.jsx)(t.li,{children:"xAxisCount\xa0of type\xa0number\xa0which is an optional property that determines the number of x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"xAxisElement\xa0of type\xa0SVGElement | null\xa0which is an optional property that represents the x-axis element."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"chartType\xa0of type\xa0ChartTypes\xa0which is an enum that represents the type of chart."}),"\n",(0,a.jsx)(t.li,{children:"culture\xa0of type string which is an optional paramter represents the locale into which the numeric x-axis labels will be localized."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0showRoundOffXTickValues\xa0property is a boolean that specifies whether to round off the tick values of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxisElement\xa0property is a reference to the DOM node that contains the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a linear scale for the x-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. If the\xa0showRoundOffXTickValues\xa0property is\xa0true, the\xa0nice\xa0method is called on the scale to round off the tick values of the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0ticks\xa0and\xa0tickFormat\xa0methods of the scale, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0createNumericXAxis\xa0function is responsible for creating a numeric x-axis for a chart component. The function creates a linear scale for the x-axis and a bottom axis for the x-axis using the\xa0d3-scale\xa0and\xa0d3-axis\xa0modules, respectively. The function customizes the scale and axis using several methods, including\xa0domain,\xa0range,\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat. The function also renders the axis on the DOM node and computes the tick values of the x-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"createStringXAxis():"}),"\xa0This function is responsible for creating a string x-axis for a chart component. The function takes four arguments:\xa0xAxisParams,\xa0tickParams,\xa0dataset, and\xa0culture.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0xAxisCount,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisPadding,\xa0xAxisInnerPadding, and\xa0xAxisOuterPadding.\xa0tickParams\xa0is an object that contains several properties, including\xa0tickValues\xa0and\xa0tickFormat.\xa0dataset\xa0is an array of strings that contains the values of the x-axis.\xa0culture\xa0is a string that specifies the locale into which the x-axis labels can be localized."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function Arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xAxisParams: An object containing the parameters for the x-axis, including the domain and range values, tick size, tick padding, number of ticks, padding for the inner and outer edges of the axis, and the element to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"tickParams: An object containing the parameters for the ticks on the x-axis, including the tick values and tick format."}),"\n",(0,a.jsx)(t.li,{children:"dataset: An array of strings representing the data points for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"culture: An optional string representing the culture to use for formatting the tick labels on the x-axis. However, the localization works only if the string can be converted to a numeric value. Otherwise, the x-axis labels remain unlocalized."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisPadding\xa0property is a number that specifies the padding between the bars of the chart. The\xa0xAxisInnerPadding\xa0property is a number that specifies the inner padding between the bars of the chart. The\xa0xAxisOuterPadding\xa0property is a number that specifies the outer padding between the bars of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a band scale for the x-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0methods are used to set the inner and outer padding between the bars of the chart, respectively."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisParams.xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0tickFormat\xa0method of the axis, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0createStringXAxis\xa0function is responsible for creating a string x-axis for a chart component. The function creates a band scale for the x-axis and a bottom axis for the x-axis using the\xa0d3-scale\xa0and\xa0d3-axis\xa0modules, respectively. The function customizes the scale and axis using several methods, including\xa0domain,\xa0range,\xa0paddingInner,\xa0paddingOuter,\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat. The function also renders the axis on the DOM node and computes the tick values of the x-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createYAxis\xa0function is responsible for creating the y-axis using the\xa0createYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams,\xa0isRtl,\xa0axisData, and\xa0useSecondaryYScale. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["yAxisParams: An object that contains various parameters related to the y-axis of the chart. It has the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yMinMaxValues: An object that contains the start and end values of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yAxisElement: The DOM element that represents the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMaxValue: The maximum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMinValue: The minimum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"margins: An object that contains the margins of the chart."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding: The padding between the ticks and the axis line."}),"\n",(0,a.jsx)(t.li,{children:"maxOfYVal: The maximum value of the y-axis for area chart and Grouped vertical bar chart."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickFormat: The format of the y-axis tick labels."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickCount: The number of ticks on the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"eventAnnotationProps: An object that contains the properties of the event annotation."}),"\n",(0,a.jsx)(t.li,{children:"eventLabelHeight: The height of the event label."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n",(0,a.jsx)(t.li,{children:"axisData: An object that contains the data related to the axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"useSecondaryYScale: A boolean value that indicates whether to use a secondary y-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0yMinMaxValues, yAxisElement, containerHeight, and containerWidth. It then calculates the final maximum and minimum values for the y-axis, based on the\xa0maxOfYVal, yMaxValue, and yMinValue\xa0parameters."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then prepares the datapoints for the y-axis using the\xa0prepareDatapoints\xa0function, which calculates the tick values based on the maximum and minimum values of the y-axis. It then creates a linear scale for the y-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0library."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl and useSecondaryYScale\xa0parameters. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function uses the d3Select function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the call method. It also sets the aria-hidden attribute of the y-axis text elements to true to improve accessibility."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createStringYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createStringYAxis\xa0function is responsible for creating the y-axis that use string values for the y-axis using the\xa0createStringYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams, dataPoints, and isRtl. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yAxisParams: An object that contains the parameters for the y-axis, including\xa0containerHeight,\xa0tickPadding,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding."}),"\n",(0,a.jsx)(t.li,{children:"dataPoints: An array of strings that represent the data points for the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0containerHeight,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding. It then creates a band scale for the y-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0library."}),"\n",(0,a.jsx)(t.li,{children:"The band scale is defined using the\xa0dataPoints\xa0array as the domain, and the\xa0containerHeight\xa0and\xa0margins\xa0parameters as the range. The\xa0padding\xa0method is used to set the padding between the bands in the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl\xa0parameter. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function uses the\xa0d3Select\xa0function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the\xa0call\xa0method. It also selects all the text elements of the y-axis and returns the y-axis scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bars:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getGraphData():"}),"\xa0This method generates the set of bars for each data point in the chart. The method creates two new x-axis scales, iterates over the\xa0_datasetForBars\xa0array, and calls the\xa0_buildGraph\xa0method to generate a set of bars for each data point. The sets of bars are added to an array, which is then assigned to the\xa0_groupedVerticalBarGraph\xa0variable."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale: A\xa0StringAxis\xa0or\xa0NumericAxis\xa0object that represents the x-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"yScale: A\xa0NumericAxis\xa0object that represents the y-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: A number that represents the height of the chart container."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: A number that represents the width of the chart container."}),"\n",(0,a.jsx)(t.li,{children:"xElement: An optional\xa0SVGElement\xa0or\xa0null\xa0that represents the x-axis element of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getGraphData\xa0method first creates two new x-axis scales using the\xa0_createX0Scale\xa0and\xa0_createX1Scale\xa0methods. The\xa0_createX0Scale\xa0method creates a new x-axis scale for the main x-axis of the chart, while the\xa0_createX1Scale\xa0method creates a new x-axis scale for the grouped bars in the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then creates an empty array called\xa0allGroupsBars. The\xa0_datasetForBars\xa0array is then iterated over, and for each data point in the array, the\xa0_buildGraph\xa0method is called to generate a set of bars for the data point. The\xa0_buildGraph\xa0method takes the current data point, the two x-axis scales, the container height, and the optional x-axis element as arguments and returns a set of bars as a JSX element."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The set of bars for each data point is added to the\xa0allGroupsBars\xa0array. Finally, the\xa0_groupedVerticalBarGraph\xa0variable is set to the\xa0allGroupsBars\xa0array."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_buildGraph():"}),"\xa0The method generates a set of bars for a single data point in the chart. The method iterates over each series in the data point and creates a\xa0rect\xa0element for each series. If the data property of the series is not\xa0null, the method also creates a text element to display the value of the data point above the bar. If the\xa0wrapXAxisLables\xa0prop is false and the\xa0showXAxisLablesTooltip\xa0prop is true, the method also displays a tooltip at the x-axis label. The method returns a\xa0g\xa0element that contains the set of bars and labels."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"singleSet: This is an object that contains the data for a single set of bars."}),"\n",(0,a.jsx)(t.li,{children:"xScale0: This is a scale function that maps the domain values to the range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"xScale1: This is a scale function that maps the domain values to the range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: This is the height of the container that holds the chart. It is of type\xa0number."}),"\n",(0,a.jsx)(t.li,{children:"xElement: This is the SVG element that represents the x-axis. It is of type\xa0SVGElement."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_buildGraph\xa0method first creates two empty arrays called\xa0singleGroup\xa0and\xa0barLabelsForGroup. The\xa0yBarScale\xa0variable is then set to a new\xa0d3ScaleLinear\xa0object that represents the y-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each series in the current data point. For each series, the method calculates the x and y coordinates of the bar using the\xa0xScale1\xa0and\xa0yBarScale\xa0scales, respectively. If the\xa0data\xa0property of the series is not\xa0null, the method creates a new\xa0rect\xa0element and adds it to the\xa0singleGroup\xa0array. The\xa0rect\xa0element has properties that define its position, size, color, and event handlers. If the\xa0data\xa0property of the series is not\xa0null\xa0and the\xa0hideLabels\xa0prop is\xa0false\xa0and the\xa0_barWidth\xa0property is greater than or equal to 16, the method creates a new\xa0text\xa0element and adds it to the\xa0barLabelsForGroup\xa0array. The\xa0text\xa0element displays the value of the data point above the bar."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0wrapXAxisLables\xa0prop is\xa0false\xa0and the\xa0showXAxisLablesTooltip\xa0prop is\xa0true, the method creates a new\xa0tooltipProps\xa0object and calls the\xa0tooltipOfXAxislabels\xa0function to display a tooltip at the x-axis label."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0g\xa0element that contains the\xa0singleGroup\xa0and\xa0barLabelsForGroup\xa0arrays. The\xa0g\xa0element is translated to the x-coordinate of the current data point on the main x-axis using the\xa0xScale0\xa0scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Legends:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getLegendData():"}),"\xa0The method generates the legend for the chart. The method iterates over each data point and series in the chart and creates a legend object for each unique series. The method returns a Legends component that renders the legend using the legend objects."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"points: An array of\xa0IGroupedVerticalBarChartData\xa0objects, which contain the data points for the chart."}),"\n",(0,a.jsx)(t.li,{children:"palette: An object of type\xa0IPalette, which contains the color palette for the chart.\nThe function returns a JSX element that renders the legend for the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getLegendData\xa0method starts by defining some variables. The data variable is set to the points argument. The\xa0defaultPalette\xa0variable is set to an array of colors to use for the legend. The actions variable is set to an empty array."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the data array. For each data point, the method iterates over each series in the data point. For each series, the method checks if a similar legend has already been added to the actions array. If a similar legend exists, the method skips to the next series. If a similar legend does not exist, the method creates a new legend object and adds it to the actions array. The\xa0legend\xa0object contains a title property, which is set to the legend property of the current series, a color property, which is set to a random color from the\xa0defaultPalette\xa0array if the\xa0color\xa0property of the current series is not defined, and\xa0action, hoverAction, and onMouseOutAction\xa0properties, which are functions that handle\xa0click, hover, and mouse out\xa0events for the legend."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0Legends\xa0component that renders the legend for the chart. The\xa0legends\xa0prop is set to the actions array. The\xa0overflowProps, enabledWrapLines, focusZonePropsInHoverCard, and legendProps\xa0props are set to values from the props object."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Callouts:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"_getCustomizedCallout():"}),"\xa0The method returns a customized callout for a data point in the chart. The callout is rendered using the\xa0onRenderCalloutPerDataPoint\xa0prop, which is a function that takes a\xa0dataPointCalloutProps\xa0object as an argument and returns a React element."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getCustomizedCallout\xa0method first checks if the\xa0onRenderCalloutPerDataPoint\xa0prop is defined. If it is, the method calls the\xa0onRenderCalloutPerDataPoint\xa0function and passes in the\xa0dataPointCalloutProps\xa0object as an argument. The\xa0dataPointCalloutProps\xa0object contains information about the current data point, including its\xa0x\xa0and\xa0y\xa0values, as well as its\xa0color\xa0and\xa0data\xa0properties."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0onRenderCalloutPerDataPoint\xa0prop is not defined, the\xa0_getCustomizedCallout\xa0method returns\xa0null."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Rendering details"}),"\nThe Grouped vertical bar chart uses d3 SVG based rendering, which follows the following render cycles:","\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- Invocation cycle: Grouped Vertical bar Chart -> Cartesian base chart -> X-axis -> X-axis labels -> Y-axis -> Y-axis labels -> bars, legends, callouts\n- Rendering cycle: Grouped vertical bar chart <- Bars (rect), Legends, Callouts <- Axes (d3.axis, d3.scale)\n"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Following are the detailed steps:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The rendering of the grouped vertical bar chart is done using SVG elements. The chart is rendered inside a\xa0svg\xa0element that is created using the\xa0React.createElement()\xa0method."}),"\n",(0,a.jsx)(t.li,{children:"The chart is divided into two main sections: the x-axis and the bars. The x-axis is created using the\xa0d3.axis()\xa0function and is rendered as a\xa0g\xa0element inside the\xa0svg\xa0element. The bars are created using the\xa0rect\xa0element and are rendered as a\xa0g\xa0element inside the\xa0svg\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0rect\xa0elements are created using the\xa0datasetForBars\xa0array that is created using the\xa0_createDataset()\xa0method. The\xa0datasetForBars\xa0array contains an array of objects, where each object represents a group of bars. Each group of bars is rendered as a\xa0g\xa0element inside the\xa0svg\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"Inside each group of bars, the\xa0rect\xa0elements are created using the\xa0map()\xa0method on the\xa0data\xa0array. The\xa0map()\xa0method creates a new array of\xa0rect\xa0elements, where each\xa0rect\xa0element represents a bar in the group. The\xa0rect\xa0elements are positioned using the\xa0x\xa0and\xa0y\xa0attributes, which are calculated based on the data and the scales that were created earlier in the file."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0rect\xa0elements are also styled using various attributes such as\xa0fill,\xa0stroke, and\xa0strokeWidth. The\xa0fill\xa0attribute is set to a color that is based on the index of the\xa0rect\xa0element in the group. The\xa0stroke\xa0and\xa0strokeWidth\xa0attributes are used to create a border around each\xa0rect\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0_onBarHover()\xa0method is used to handle the hover event on the bars. This method is called when the user hovers over a bar in the chart. The method updates the state of the component to show the callout for the hovered bar."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the grouped vertical bar chart is rendered using\xa0SVG\xa0elements that are created using the\xa0React.createElement()\xa0method. The chart is divided into two main sections: the x-axis and the bars. The bars are created using the\xa0rect\xa0element and are positioned and styled based on the data and the scales that were created earlier in the file. The\xa0_onBarHover()\xa0method is used to handle the hover event on the bars and show the callout for the hovered bar."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Error scenarios"}),"\nThe Grouped Vertical bar chart handles the following error scenario:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Empty data: If the data passed to the chart component is empty, the chart will not render and a message will be narrated to the user.\xa0_isChartEmpty\xa0functions handles that scenario."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Localization aspects"}),"\nCurrently, although the component has a support for\xa0culture\xa0prop, but it does not support localization yet."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Testing"}),"\nThe testing for Grouped Vertical bar chart have not been started. The document will be updated as and when the tests are completed.\n",(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart3.png",src:n(6569).Z+"",width:"2475",height:"542"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Component Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7411",children:"7411"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Unit Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7412",children:"7412"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Manual Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/8605",children:"8605"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Accessibility Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7410",children:"7410"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Accessibility"}),"\nFAST pass checks resulted in no error for Grouped Vertical bar chart. Link to the ",(0,a.jsx)(t.a,{href:"https://accessibilityinsights.io/docs/web/getstarted/fastpass/",children:"FAST pass tool"}),"\nOur charts have elaborate accessibility support. The charts are WCAG 2.1 MAS C compliant for accessibility.\nConsumers can define their own aria labels for each point by setting the\xa0callOutAccessibilityData\xa0property."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Theming"}),'\nThe palette for vertical bar chart is set from the "theme" prop as passed to the component during rendering. Both light and dark themes are supported and users can create there own theme too.\xa0',(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Ref6"}),"\xa0\xa0and\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"Ref7"}),"\xa0\xa0explains theming in detail."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Debugging"}),"\nThe detailed steps on debugging has been given in\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui-charting-contrib/blob/main/docs/Debugging.md",children:"Debugging"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Variants"}),"\nFollowing are the variants of vertical bar chart:\xa0",(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart/grouped",children:"Ref8"}),"\xa0","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Basic Grouped Vertical bar Chart"}),": Only basic props are provided."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Accessibility"}),": Providing custom aria labels."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Styled"}),": Can show bars with increased bar width."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Tooltip"}),": Can show tooltip over x-axis ticks when the ticks are truncated."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Interaction"}),"\nFollowing are the interactions that are allowed for donut chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Mouse Events"}),":\na. Hover mouse over a bar, should call the corresponding handler and show the callout over that bar.\nb. On mouse move on Bar 1 (step 1) -> mouse leave (step 2) -> mouse move on Bar 2 (step 3), should render the callout of the Bar 2.\nc. On mouse over, callout should be defined, on mouse leave, callout should disappear.\nd. On mouse over on legends, should highlight the corresponding bar.\nf. On click on Bar, should highlight the corresponding bar.\ng. On mouse out after mouse over on first legend, should have opacity 0.1 for second bar initially (during mouseOver on first legend) and opacity set to 1 for both the bars on mouse out."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Keyboard Events"}),":\na. On focus on a bar, should render the corresponding callout."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Some notable PRs and their brief description"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/12687",children:"Adding the Grouped Vertical bar chart main component"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/15838",children:"Refactoring Grouped Vertical Bar Chart via implementation of Cartesian charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/18880",children:"Custom Accessibility Change for Grouped Vertical Bar Chart"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/20347",children:"Number localization in charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/16914",children:"Narrator issues fixed in bar charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/17571",children:"Callout accessibility issue fixed for bar charts"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Learnings"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"While implementing the tests using react testing library, it was found that certain browser functions like\xa0getComputedTextLength()\xa0cannot be unit tested and needs to be tested End-to-End only."}),"\n",(0,a.jsx)(t.li,{children:"Order of imports are important.\nFor example: for Vertical bar charts tests, improper sequencing of the imports (data first and then render) results in incorrect and incopmlete rendering of charts:"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:" - import { chartPoints } from '../VerticalBarChart/VerticalBarChart.test';\n - import { render, screen, queryAllByAttribute, fireEvent, act } from '@testing-library/react';\n"})}),"\n",(0,a.jsx)(t.p,{children:"However, the following results in correct rendering:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"import { render, screen, queryAllByAttribute } from '@testing-library/react';\n\nimport { chartPoints } from './VerticalBarChart.test';\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Certain props need async await structure (waitFor in react testing library) for different props or nested SVGs to render."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Known issues"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Setting the margins externally via the props may cut the x and y ticks if the margins provided are very less. Setting a minimum margin would prevent any such distortions."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Future improvements"})}),"\n",(0,a.jsx)(t.p,{children:"Following are the list of future improvements for the vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Improved accessibility: While the component already provides accessibility data for screen readers, there is always room for improvement in this area. Adding support for keyboard navigation and improving the accessibility of the callout would make the component more accessible to users with disabilities."}),"\n",(0,a.jsx)(t.li,{children:"Support for animations: Adding support for animations, such as transitions between data updates or hover effects, would make the component more visually appealing and engaging for users."}),"\n",(0,a.jsxs)(t.li,{children:["Following error handling scenarios can be improved:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Invalid or missing chart dimensions: If the dimensions of the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing axis parameters: If the parameters for the x-axis or y-axis are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing legends: If the legends for the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid bar width: If the bar width for the chart is invalid, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing data for callout: If the data for the callout is invalid or missing, the callout will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing accessibility data: If the accessibility data for the chart is invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"Localization support can be improved for all strings and numbers."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Design figma"}),"\nVertical bar Chart Figma:\xa0",(0,a.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-80245&mode=design&t=eFKlPGUixdgy9xRs-0",children:"Link"}),"\xa0"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Performance"})}),"\n",(0,a.jsx)(t.p,{children:"The performance aspect of a donut chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a line chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Data Visualization Efficiency"}),"\n",(0,a.jsx)(t.li,{children:"Clarity and Simplicity"}),"\n",(0,a.jsx)(t.li,{children:"Responsiveness"}),"\n",(0,a.jsx)(t.li,{children:"Handling Large Datasets"}),"\n",(0,a.jsx)(t.li,{children:"Interactive Features"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Following are few of the scenarios for which we measure the performance score for vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"References"})}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-scale/blob/main/README.md",children:"D3-scale"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-selection/blob/main/README.md",children:"D3-selection"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-array/blob/main/README.md",children:"D3-array"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-axis/blob/main/README.md",children:"D3-axis"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"How to apply theme"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Theming"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart/grouped",children:"Grouped Vertical Bar Chart"})}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Appendix"}),"\nThe mathematical formulae used in the Grouped vertical bar chart component are as follows:"]}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the\xa0x0\xa0scale using\xa0d3ScaleBand:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x0 = d3ScaleBand()\n\n.domain(data.map(d => d.category))\n\n.range([0, width])\n\n.paddingInner(x0_inner_padding)\n\n- x0_inner_padding = space_between_groups/(space_between_groups + group_width)\n\n- space_between_groups = 2 * bar_width\n\n- group_width = this._keys.length * bar_width + (this._keys.length - 1) * space_between_bars\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the maximum value of the y-axis data using\xa0d3Max:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"const maxYValue = d3Max(data, d => d3Max(\\_keys, key => d[key]))\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"3",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the\xa0y\xa0scale using\xa0d3ScaleLinear:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"y = d3ScaleLinear()\n\n.domain([0, maxYValue])\n\n.range([0, height])\n\nheight = containerHeight - marginsBottom - marginsTop\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"4",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the bar gap rate:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x1_inner_padding = space_between_bars / (space_between_bars + bar_width)\n\n=> space_between_bars = (x1_inner_padding / (1 - x1_inner_padding)) * bar_width\n\nRate at which the space between the bars in a group changes wrt the bar width\n\nBAR_GAP_RATE = X1_INNER_PADDING / (1 - X1_INNER_PADDING)\n\nX1_INNER_PADDING = 0.1\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"5",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the group width and bar width:"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Maximum possible group width to maintain 2:1 spacing:"}),"\n",(0,a.jsx)(t.p,{children:"InitialBarWidth = Math.min(props.barwidth || 16, 24);"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"(i) InitialGroupWidth = _keys.length * InitialBarWidth+ (_keys.length - 1) * BAR_GAP_RATE * InitialBarWidth\n"})}),"\n",(0,a.jsx)(t.p,{children:"Total width required to render the bars. Directly proportional to bar width:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"(ii) ReqWidth = _xAxisLabels.length * InitialGroupWidth + (_xAxisLabels.length - 1) * 2 * InitialBarWidth\n\nFrom (i) and (ii)\n\nMaximum possible group width to maintain 2:1 spacing\n\nMaxBandwidth = totalWidth / (_xAxisLabels.length +\n\n(_xAxisLabels.length - 1) * (2 / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)))\n\nFinalGroupWidth = MaxBandwidth;\n\nFrom (i)\n\nFinalBarWidth = FinalGroupWidth / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"6",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the width of each bar:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"barWidth = (x0.bandwidth() - spaceBetweenBars) / this._keys.length\n"})})]})}function d(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1075:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC1-bfb960362b8a441805cd138056a2f8f6.png"},1030:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC2-d4cbda92ad72f6f1a2f85f9e2341b6e0.png"},6569:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC3-15789353c5cef662c6d0f971540ad844.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var a=n(7294);const i={},s=a.createContext(i);function r(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ff5abae.b0c49283.js b/assets/js/1ff5abae.b0c49283.js deleted file mode 100644 index c8b33884cb..0000000000 --- a/assets/js/1ff5abae.b0c49283.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[5671],{2972:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>h,toc:()=>l});var a=n(5893),i=n(1151);const s={},r="Contributor guide: Grouped Vertical Bar Chart",h={id:"Charting-Concepts/GroupedVerticalBarChart",title:"Contributor guide: Grouped Vertical Bar Chart",description:"GroupedVerticalBarChart1.png",source:"@site/../../docs/Charting-Concepts/GroupedVerticalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/GroupedVerticalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/GroupedVerticalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributor guide: Gauge Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/GaugeChart"},next:{title:"Contributor guide: Heatmap Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HeatMapChart"}},o={},l=[];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"contributor-guide-grouped-vertical-bar-chart",children:"Contributor guide: Grouped Vertical Bar Chart"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart1.png",src:n(1075).Z+"",width:"1011",height:"748"})}),"\n",(0,a.jsx)(t.p,{children:"A grouped vertical bar chart is a type of chart that displays multiple series of data as groups of bars, with each bar representing a category. The bars are grouped together side by side, with each group representing a different series."}),"\n",(0,a.jsx)(t.p,{children:"In a grouped vertical bar chart, the x-axis represents the categories, while the y-axis represents the values of the series. Each bar in a group is colored differently to differentiate between the series."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Use cases"}),"\nSome common use cases for a Grouped Vertical Bar Chart are as follows:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Comparing the values of multiple series across categories"}),"\n",(0,a.jsx)(t.li,{children:"Displaying financial data, such as revenue and expenses, for different products or services"}),"\n",(0,a.jsx)(t.li,{children:"Displaying scientific research data for different treatments or conditions"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the performance of different teams or departments in a company"}),"\n",(0,a.jsx)(t.li,{children:"Showing the distribution of different types of crimes in a city"}),"\n",(0,a.jsx)(t.li,{children:"Displaying the results of a survey for different age groups or genders"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the sales of different products in a store"}),"\n",(0,a.jsx)(t.li,{children:"Showing the number of students enrolled in different courses in a school"}),"\n",(0,a.jsx)(t.li,{children:"Displaying the number of employees in different departments of a company"}),"\n",(0,a.jsx)(t.li,{children:"Comparing the number of visitors to different tourist attractions in a city"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"Mathematical/Geometrical concepts"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart2.png",src:n(1030).Z+"",width:"1121",height:"636"})}),"\n",(0,a.jsx)(t.p,{children:"The major D3 functions that are involved in the creation of Vertical bar charts are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-scale:"}),"\nThe\xa0d3-scale\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, which are used to map data values to visual properties, such as\xa0position, size, and color."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module includes several scale types, including linear, logarithmic, power, and time scales. These scales are used to map continuous data values to a continuous range of visual properties. The module also includes ordinal and band scales, which are used to map categorical data values to a discrete range of visual properties."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, including\xa0scaleLinear, scaleLog, scalePow, scaleTime, scaleOrdinal, and scaleBand. These functions take one or more arguments that define the domain and range of the scale, as well as any additional properties, such as the number of ticks or the padding between bands."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"}),"\nGrouped vertical bar chart uses the\xa0d3-scale\xa0module to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.scaleLinear()"}),": The\xa0d3.scaleLinear\xa0is a function from the\xa0d3-scale\xa0module that is used to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height. The\xa0d3ScaleLinear\xa0function takes no arguments and returns a new linear scale. The scale can be customized using several methods, including\xa0domain, range, clamp, and nice. The\xa0domain\xa0method sets the domain of the scale, which is the range of data values that the scale maps to the range of visual properties. The\xa0range\xa0method sets the range of the scale, which is the range of visual properties that the scale maps to the domain of data values."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3.scaleLinear\xa0function from the\xa0d3-scale\xa0module is used to create a new linear scale for the y-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function takes no arguments and returns a new linear scale. The scale maps a continuous input domain to a continuous output range. In this case, the input domain is the range of values for the y-axis data, while the output range is the range of pixel values for the y-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to generate the y-axis scale for the chart. The\xa0yAxisScale\xa0property of the component is set to a new instance of the\xa0d3.scaleLinear\xa0function. The\xa0domain\xa0property of the\xa0yAxisScale\xa0object is set to an array of the minimum and maximum values of the y-axis data. The\xa0range\xa0property of the\xa0yAxisScale\xa0object is set to an array of the minimum and maximum pixel values for the y-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleLinear\xa0function is used to generate a linear scale that maps the y-axis data to the pixel values on the chart. This allows the y-axis data to be displayed in a way that is visually meaningful and easy to interpret."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.scaleBand():"}),"\xa0The\xa0d3.scaleBand\xa0is a function from the\xa0d3-scale\xa0module that is used to create a band scale for the x-axis of the chart. The band scale maps a discrete domain of data values to a discrete range of visual properties, such as\xa0position or width. The\xa0d3ScaleBand\xa0function takes no arguments and returns a new band scale. The scale can be customized using several methods, including\xa0domain, range, padding, and align. The\xa0domain\xa0method sets the domain of the scale, which is the range of data values that the scale maps to the range of visual properties. The\xa0range\xa0method sets the range of the scale, which is the range of visual properties that the scale maps to the domain of data values. The\xa0padding\xa0method sets the padding between the bands of the scale, which determines the width of the bands. The\xa0align\xa0method sets the alignment of the bands within the range of the scale."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- x0_inner_padding = space_between_groups /(space_between_groups + group_width)\n\n- space_between_groups = 2 * bar_width\n\n- group_width = this._keys.length * bar_width + (this._keys.length - 1) * space_between_bars\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3.scaleBand\xa0function from the\xa0d3-scale\xa0module is used to create a new band scale for the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function takes no arguments and returns a new band scale. The scale maps a discrete input domain to a continuous output range. In this case, the input domain is an array of categories for the x-axis, while the output range is the range of pixel values for the x-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to generate the x-axis scale for the chart. The\xa0xAxisScale\xa0property of the component is set to a new instance of the\xa0d3.scaleBand\xa0function. The\xa0domain\xa0property of the\xa0xAxisScale\xa0object is set to an array of the categories for the x-axis. The\xa0range\xa0property of the\xa0xAxisScale\xa0object is set to an array of the minimum and maximum pixel values for the x-axis on the chart."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3.scaleBand\xa0function is used to generate a band scale that maps the categories for the x-axis to the pixel values on the chart. This allows the categories to be displayed in a way that is visually meaningful and easy to interpret. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0properties of the\xa0xAxisScale\xa0object can be used to adjust the spacing between the bars and groups of bars on the chart."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3.scaleBand\xa0function is used to generate a band scale that maps the categories for the x-axis to the pixel values on the chart, allowing the categories to be displayed in a way that is visually meaningful and easy to interpret."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-selection:"}),"\xa0The\xa0d3-selection\xa0is a module from the d3 library that is used to select and manipulate DOM elements in the chart component. The\xa0d3-selection\xa0module provides several functions for selecting and manipulating DOM elements, including\xa0select, selectAll, append, attr, and style. The select function is used to select a single DOM element that matches a given selector. The\xa0selectAll\xa0function is used to select multiple DOM elements that match a given selector. The\xa0append\xa0function is used to append a new DOM element to a selected element. The\xa0attr\xa0function is used to set or get an attribute of a selected element. The\xa0style\xa0function is used to set or get a style property of a selected element."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3Select\xa0function from the\xa0d3-selection\xa0module is used to select an element from the DOM."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3Select\xa0function takes one argument, which is a SVG node element for the element to be selected. The function returns a new selection object that represents the selected element."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3Select\xa0function from the\xa0d3-selection\xa0module is used to select an element from the DOM, which allows the\xa0GroupedVerticalBarChart\xa0component to interact with and modify the chart elements."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-array:"}),"\xa0The\xa0d3-array\xa0is a module from the d3 library that is used to manipulate arrays of data in the chart component. The\xa0d3-array\xa0module provides several functions for manipulating arrays of data, including\xa0max, min, extent, sum, and mean. The\xa0max\xa0function is used to find the maximum value in an array of data. The\xa0min\xa0function is used to find the minimum value in an array of data. The\xa0extent\xa0function is used to find the minimum and maximum values in an array of data. The\xa0sum\xa0function is used to find the sum of the values in an array of data. The\xa0mean\xa0function is used to find the mean (average) of the values in an array of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3Max\xa0function from the\xa0d3-array\xa0module is used to find the maximum value in an array of numbers."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3Max\xa0function takes two arguments: the first argument is the array of numbers to be searched, and the second argument is an optional function that specifies how to extract the numeric value from each element in the array. If the second argument is not provided, the\xa0d3Max\xa0function assumes that the array contains only numeric values."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3Max\xa0function from the\xa0d3-array\xa0module is used to find the maximum value in an array of numbers, which allows the\xa0GroupedVerticalBarChart\xa0component to set the y-axis scale domain based on the maximum value of the y-axis data."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-format:"}),"\xa0The\xa0d3-format\xa0is a module from the d3 library that is used to format numbers and strings in the chart component. The\xa0d3-format\xa0module provides several functions for formatting numbers and strings, including\xa0format, formatPrefix, precisionFixed, and precisionRound."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0format\xa0function is used to format a number or string using a specified format string. The format string can include placeholders for the value, such as\xa0%\xa0for a percentage or\xa0,\xa0for a comma-separated number. The\xa0formatPrefix\xa0function is used to format a number using a prefix notation that rounds the value to a specified precision and appends a prefix, such as\xa0K\xa0for thousands or\xa0M\xa0for millions. The\xa0precisionFixed\xa0function is used to format a number using a fixed number of decimal places. The\xa0precisionRound\xa0function is used to format a number using a variable number of decimal places that is determined by the magnitude of the value."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"In the Grouped Vertical Bar chart component, the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module is used to format numbers with SI-prefixes."}),"\n",(0,a.jsx)(t.li,{children:'The\xa0d3FormatPrefix\xa0function takes one argument, which is a numeric value. The function returns a string that represents the value with an SI-prefix, such as "K" for thousands or "M" for millions.'}),"\n",(0,a.jsx)(t.li,{children:"The\xa0d3FormatPrefix\xa0function is used in the\xa0GroupedVerticalBarChart\xa0component to format the bar labels for groups."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module is used to format numbers, which allows the component to display the bar labels in a way that is visually meaningful and easy to interpret."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-axis:"}),"\xa0The\xa0d3-axis\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-axis\xa0module provides several functions for creating and manipulating axes, which are used to display the scales of a chart component."]}),"\n",(0,a.jsx)(t.p,{children:"In data visualization, axes are used to display the scales of a chart component, such as the x-axis and y-axis of a bar chart. Axes provide visual cues to help readers interpret the data values of a chart component, such as the range and domain of the data values."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0module provides several types of axes, including\xa0bottom, top, left, and right axes. Each type of axis has its own set of methods for customizing the axis and displaying the tick values."}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3-axis\xa0module is an essential part of data visualization, as it provides a powerful and flexible way to display the scales of a chart component and help readers interpret the data values of the chart."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Grouped Vertical bar chart:"}),"\nIn the Vertical stacked bar chart,\xa0d3-axis\xa0is used to create and render the x and y axes of the chart."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0d3-axis\xa0library provides various methods for creating and rendering axes, such as\xa0axisBottom(),\xa0axisLeft(), and\xa0tickFormat(). In this case, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart."}),"\n",(0,a.jsx)(t.li,{children:"To create the x and y axes, the\xa0d3-axis\xa0library's\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods are used, respectively. These methods take a scale function as an argument and return a new axis function that can be used to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"The resulting x and y axis functions are then used to render the x and y axes of the chart. The\xa0call()\xa0method of the selection object is used to call the axis function and render the axis."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0tickFormat()\xa0method of the y-axis scale is also used to set the tick format function for the y-axis. This method takes the format function created using the\xa0d3-format\xa0library as an argument and sets it as the tick format function for the y-axis."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart by using the\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods to create the axis functions and the\xa0call()\xa0method to render the axes. The\xa0tickFormat()\xa0method is also used to set the tick format function for the y-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Dev Deisgn Details:"}),"\nFollowing are the major components that contribute towards creating a complete grouped vertical bar chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Axes:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createX0Scale():"}),"\xa0This method is responsible for generating the x and y scales that are used to map the data points to the chart dimensions. The scales are generated using the\xa0d3-scale\xa0library, which provides several scale types for different types of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth: It is a number representing the width of the container element for the chart. This argument is used to calculate the range of the x-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createX0Scale\xa0method first creates a new\xa0d3ScaleBand\xa0object called\xa0x0Axis. The\xa0domain\xa0property of the\xa0x0Axis\xa0object is set to the\xa0_xAxisLabels\xa0array, which contains the labels for the main x-axis of the chart. The\xa0range\xa0property of the\xa0x0Axis\xa0object is set to an array that defines the range of the main x-axis scale. The range is calculated based on the\xa0containerWidth, the\xa0margins\xa0of the chart, and the\xa0_domainMargin\xa0property, which is the margin between the edge of the chart and the first and last bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0paddingInner\xa0property of the\xa0x0Axis\xa0object is set to a value that defines the inner padding between groups of bars in the chart. The value is calculated based on the number of keys in the chart, which is the number of series in each data point, and the\xa0BAR_GAP_RATE\xa0property, which is the ratio of the space between bars to the width of a bar."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_createX0Scale\xa0method returns the\xa0x0Axis\xa0object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createX1Scale():"}),"\xa0This method generates the grouped x-axis scale for the chart. The method creates a new\xa0d3ScaleBand\xa0object and sets its\xa0domain, range, and paddingInner\xa0properties based on the\xa0_keys\xa0array, the\xa0bandwidth\xa0of the main x-axis scale, the\xa0_isRtl\xa0property, and the\xa0X1_INNER_PADDING\xa0and\xa0BAR_GAP_RATE\xa0properties. The method returns the\xa0d3ScaleBand\xa0object."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale0: This argument is a scale function that is used to calculate the width of each bar in the chart. The function returns a new scale function that is used to calculate the position of each bar within a group."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createX1Scale\xa0method first creates a new\xa0d3ScaleBand\xa0object say\xa0x1Axis. The\xa0domain\xa0property of the\xa0x1Axis\xa0object is set to the\xa0_keys\xa0array, which contains the keys for each series in the chart. The\xa0range\xa0property of the\xa0x1Axis\xa0object is set to an array that defines the range of the grouped x-axis scale. The range is calculated based on the\xa0bandwidth\xa0of the main x-axis scale, the\xa0_isRtl\xa0property, which is a\xa0boolean\xa0that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0paddingInner\xa0property of the\xa0x1Axis\xa0object is set to a value that defines the inner padding between groups of bars in the chart. The value is calculated based on the\xa0X1_INNER_PADDING\xa0property whose value is 0.1."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_createX1Scale\xa0method returns the\xa0x1Axis\xa0object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getDomainMargins():"}),"\xa0This method calculates the margins of the chart based on the available width of the chart container and the required width to render the bars in the chart. The method calculates the\xa0barWidth\xa0and\xa0groupWidth\xa0variables based on the\xa0barwidth\xa0prop, the number of keys in the chart, and the\xa0BAR_GAP_RATE\xa0property. If the available width is greater than or equal to the required width, the method centers the chart by setting equal left and right margins for the domain. If the available width is less than the required width, the method calculates the maximum possible group width to maintain a\xa02:1\xa0spacing between bars and groups of bars and recalculates the\xa0barWidth\xa0variable. The method returns an object that represents the margins of the chart."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth: It is a number representing the width of the container in which the chart is being rendered."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Formulae:"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x1_inner_padding = space_between_bars / (space_between_bars + bar_width)\n\n=> space_between_bars = (x1_inner_padding / (1 - x1_inner_padding)) \\* bar_width\n\nBAR_GAP_RATE = Rate at which the space between the bars in a group changes wrt the bar width\n\nBAR_GAP_RATE = X1_INNER_PADDING / (1 - X1_INNER_PADDING)\n\nX1_INNER_PADDING = 0.1\n\nMaximum possible group width to maintain 2:1 spacing:\n\nInitialBarWidth = Math.min(props.barwidth || 16, 24);\n\n(i) InitialGroupWidth = _keys.length * InitialBarWidth+ (_keys.length - 1) * BAR_GAP_RATE * InitialBarWidth\n\nTotal width required to render the bars. Directly proportional to bar width:\n\n(ii) ReqWidth = _xAxisLabels.length * InitialGroupWidth + (_xAxisLabels.length - 1) * 2 * InitialBarWidth\n\nFrom (i) and (ii)\n\nMaximum possible group width to maintain 2:1 spacing\n\nMaxBandwidth = totalWidth / (_xAxisLabels.length +\n\n(_xAxisLabels.length - 1) \\* (2 / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)))\n\nFinalGroupWidth = MaxBandwidth;\n\nFrom (i)\n\nFinalBarWidth = FinalGroupWidth / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)\n"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getDomainMargins\xa0method first calculates the total width available to render the bars in the chart. The total width is calculated based on the\xa0containerWidth, the\xa0margins\xa0of the chart, and the\xa0MIN_DOMAIN_MARGIN\xa0property, which is the minimum margin between the edge of the chart and the first and last bars. The method then sets the\xa0barWidth\xa0variable to the minimum of the\xa0barwidth\xa0prop or 16, and the\xa0groupWidth\xa0variable to the product of the number of keys in the chart, the\xa0barWidth, and the\xa0BAR_GAP_RATE\xa0property, which is the ratio of the space between bars to the width of a bar, plus the space between groups of bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then calculates the total width required to render the bars in the chart. The total width is calculated based on the length of the\xa0_xAxisLabels\xa0array, the\xa0groupWidth, the\xa0barWidth, and the space between groups of bars. If the total width available to render the bars is greater than or equal to the total width required to render the bars, the method sets the\xa0_domainMargin\xa0property to half of the difference between the total width available and the total width required. This centers the chart by setting equal left and right margins for the domain."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the total width available to render the bars is less than the total width required to render the bars, the method calculates the maximum possible group width to maintain a 2:1 spacing between bars and groups of bars. The method then sets the\xa0groupWidth\xa0variable to the maximum possible group width and recalculates the\xa0barWidth\xa0variable based on the\xa0groupWidth\xa0and the\xa0BAR_GAP_RATE\xa0property. The\xa0_domainMargin\xa0property is set to the\xa0MIN_DOMAIN_MARGIN."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the\xa0_getDomainMargins\xa0method returns an object that represents the margins of the chart. The left and right margins of the chart are updated to include the\xa0_domainMargin."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createNumericXAxis():"}),"\xa0The code above is a function called\xa0createNumericXAxis\xa0in the\xa0utilities.ts\xa0file. This function is responsible for creating a numeric x-axis for a chart component. The function takes two arguments:\xa0xAxisParams\xa0and\xa0chartType.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0showRoundOffXTickValues,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisCount, and\xa0xAxisElement.\xa0chartType\xa0is an enumeration that specifies the type of chart component."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["xAxisParams\xa0of type\xa0IXAxisParams\xa0which is an object containing the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"domainNRangeValues\xa0of type\xa0IDomainNRange\xa0which is an object containing the domain and range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"showRoundOffXTickValues\xa0of type\xa0boolean\xa0which is an optional property that determines whether to round off the x-axis tick values."}),"\n",(0,a.jsx)(t.li,{children:"xAxistickSize\xa0of type\xa0number\xa0which is an optional property that determines the size of the x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding\xa0of type\xa0number\xa0which is an optional property that determines the padding between the x-axis ticks and the x-axis labels."}),"\n",(0,a.jsx)(t.li,{children:"xAxisCount\xa0of type\xa0number\xa0which is an optional property that determines the number of x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"xAxisElement\xa0of type\xa0SVGElement | null\xa0which is an optional property that represents the x-axis element."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"chartType\xa0of type\xa0ChartTypes\xa0which is an enum that represents the type of chart."}),"\n",(0,a.jsx)(t.li,{children:"culture\xa0of type string which is an optional paramter represents the locale into which the numeric x-axis labels will be localized."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0showRoundOffXTickValues\xa0property is a boolean that specifies whether to round off the tick values of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxisElement\xa0property is a reference to the DOM node that contains the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a linear scale for the x-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. If the\xa0showRoundOffXTickValues\xa0property is\xa0true, the\xa0nice\xa0method is called on the scale to round off the tick values of the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0ticks\xa0and\xa0tickFormat\xa0methods of the scale, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0createNumericXAxis\xa0function is responsible for creating a numeric x-axis for a chart component. The function creates a linear scale for the x-axis and a bottom axis for the x-axis using the\xa0d3-scale\xa0and\xa0d3-axis\xa0modules, respectively. The function customizes the scale and axis using several methods, including\xa0domain,\xa0range,\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat. The function also renders the axis on the DOM node and computes the tick values of the x-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"createStringXAxis():"}),"\xa0This function is responsible for creating a string x-axis for a chart component. The function takes four arguments:\xa0xAxisParams,\xa0tickParams,\xa0dataset, and\xa0culture.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0xAxisCount,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisPadding,\xa0xAxisInnerPadding, and\xa0xAxisOuterPadding.\xa0tickParams\xa0is an object that contains several properties, including\xa0tickValues\xa0and\xa0tickFormat.\xa0dataset\xa0is an array of strings that contains the values of the x-axis.\xa0culture\xa0is a string that specifies the locale into which the x-axis labels can be localized."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function Arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xAxisParams: An object containing the parameters for the x-axis, including the domain and range values, tick size, tick padding, number of ticks, padding for the inner and outer edges of the axis, and the element to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"tickParams: An object containing the parameters for the ticks on the x-axis, including the tick values and tick format."}),"\n",(0,a.jsx)(t.li,{children:"dataset: An array of strings representing the data points for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"culture: An optional string representing the culture to use for formatting the tick labels on the x-axis. However, the localization works only if the string can be converted to a numeric value. Otherwise, the x-axis labels remain unlocalized."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisPadding\xa0property is a number that specifies the padding between the bars of the chart. The\xa0xAxisInnerPadding\xa0property is a number that specifies the inner padding between the bars of the chart. The\xa0xAxisOuterPadding\xa0property is a number that specifies the outer padding between the bars of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a band scale for the x-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0methods are used to set the inner and outer padding between the bars of the chart, respectively."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisParams.xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0tickFormat\xa0method of the axis, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the\xa0createStringXAxis\xa0function is responsible for creating a string x-axis for a chart component. The function creates a band scale for the x-axis and a bottom axis for the x-axis using the\xa0d3-scale\xa0and\xa0d3-axis\xa0modules, respectively. The function customizes the scale and axis using several methods, including\xa0domain,\xa0range,\xa0paddingInner,\xa0paddingOuter,\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat. The function also renders the axis on the DOM node and computes the tick values of the x-axis."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createYAxis\xa0function is responsible for creating the y-axis using the\xa0createYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams,\xa0isRtl,\xa0axisData, and\xa0useSecondaryYScale. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["yAxisParams: An object that contains various parameters related to the y-axis of the chart. It has the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yMinMaxValues: An object that contains the start and end values of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yAxisElement: The DOM element that represents the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMaxValue: The maximum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMinValue: The minimum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"margins: An object that contains the margins of the chart."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding: The padding between the ticks and the axis line."}),"\n",(0,a.jsx)(t.li,{children:"maxOfYVal: The maximum value of the y-axis for area chart and Grouped vertical bar chart."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickFormat: The format of the y-axis tick labels."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickCount: The number of ticks on the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"eventAnnotationProps: An object that contains the properties of the event annotation."}),"\n",(0,a.jsx)(t.li,{children:"eventLabelHeight: The height of the event label."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n",(0,a.jsx)(t.li,{children:"axisData: An object that contains the data related to the axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"useSecondaryYScale: A boolean value that indicates whether to use a secondary y-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0yMinMaxValues, yAxisElement, containerHeight, and containerWidth. It then calculates the final maximum and minimum values for the y-axis, based on the\xa0maxOfYVal, yMaxValue, and yMinValue\xa0parameters."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then prepares the datapoints for the y-axis using the\xa0prepareDatapoints\xa0function, which calculates the tick values based on the maximum and minimum values of the y-axis. It then creates a linear scale for the y-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0library."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl and useSecondaryYScale\xa0parameters. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function uses the d3Select function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the call method. It also sets the aria-hidden attribute of the y-axis text elements to true to improve accessibility."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createStringYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createStringYAxis\xa0function is responsible for creating the y-axis that use string values for the y-axis using the\xa0createStringYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams, dataPoints, and isRtl. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yAxisParams: An object that contains the parameters for the y-axis, including\xa0containerHeight,\xa0tickPadding,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding."}),"\n",(0,a.jsx)(t.li,{children:"dataPoints: An array of strings that represent the data points for the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0containerHeight,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding. It then creates a band scale for the y-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0library."}),"\n",(0,a.jsx)(t.li,{children:"The band scale is defined using the\xa0dataPoints\xa0array as the domain, and the\xa0containerHeight\xa0and\xa0margins\xa0parameters as the range. The\xa0padding\xa0method is used to set the padding between the bands in the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl\xa0parameter. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function uses the\xa0d3Select\xa0function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the\xa0call\xa0method. It also selects all the text elements of the y-axis and returns the y-axis scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bars:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getGraphData():"}),"\xa0This method generates the set of bars for each data point in the chart. The method creates two new x-axis scales, iterates over the\xa0_datasetForBars\xa0array, and calls the\xa0_buildGraph\xa0method to generate a set of bars for each data point. The sets of bars are added to an array, which is then assigned to the\xa0_groupedVerticalBarGraph\xa0variable."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale: A\xa0StringAxis\xa0or\xa0NumericAxis\xa0object that represents the x-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"yScale: A\xa0NumericAxis\xa0object that represents the y-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: A number that represents the height of the chart container."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: A number that represents the width of the chart container."}),"\n",(0,a.jsx)(t.li,{children:"xElement: An optional\xa0SVGElement\xa0or\xa0null\xa0that represents the x-axis element of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getGraphData\xa0method first creates two new x-axis scales using the\xa0_createX0Scale\xa0and\xa0_createX1Scale\xa0methods. The\xa0_createX0Scale\xa0method creates a new x-axis scale for the main x-axis of the chart, while the\xa0_createX1Scale\xa0method creates a new x-axis scale for the grouped bars in the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then creates an empty array called\xa0allGroupsBars. The\xa0_datasetForBars\xa0array is then iterated over, and for each data point in the array, the\xa0_buildGraph\xa0method is called to generate a set of bars for the data point. The\xa0_buildGraph\xa0method takes the current data point, the two x-axis scales, the container height, and the optional x-axis element as arguments and returns a set of bars as a JSX element."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The set of bars for each data point is added to the\xa0allGroupsBars\xa0array. Finally, the\xa0_groupedVerticalBarGraph\xa0variable is set to the\xa0allGroupsBars\xa0array."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_buildGraph():"}),"\xa0The method generates a set of bars for a single data point in the chart. The method iterates over each series in the data point and creates a\xa0rect\xa0element for each series. If the data property of the series is not\xa0null, the method also creates a text element to display the value of the data point above the bar. If the\xa0wrapXAxisLables\xa0prop is false and the\xa0showXAxisLablesTooltip\xa0prop is true, the method also displays a tooltip at the x-axis label. The method returns a\xa0g\xa0element that contains the set of bars and labels."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"singleSet: This is an object that contains the data for a single set of bars."}),"\n",(0,a.jsx)(t.li,{children:"xScale0: This is a scale function that maps the domain values to the range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"xScale1: This is a scale function that maps the domain values to the range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: This is the height of the container that holds the chart. It is of type\xa0number."}),"\n",(0,a.jsx)(t.li,{children:"xElement: This is the SVG element that represents the x-axis. It is of type\xa0SVGElement."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_buildGraph\xa0method first creates two empty arrays called\xa0singleGroup\xa0and\xa0barLabelsForGroup. The\xa0yBarScale\xa0variable is then set to a new\xa0d3ScaleLinear\xa0object that represents the y-axis scale of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each series in the current data point. For each series, the method calculates the x and y coordinates of the bar using the\xa0xScale1\xa0and\xa0yBarScale\xa0scales, respectively. If the\xa0data\xa0property of the series is not\xa0null, the method creates a new\xa0rect\xa0element and adds it to the\xa0singleGroup\xa0array. The\xa0rect\xa0element has properties that define its position, size, color, and event handlers. If the\xa0data\xa0property of the series is not\xa0null\xa0and the\xa0hideLabels\xa0prop is\xa0false\xa0and the\xa0_barWidth\xa0property is greater than or equal to 16, the method creates a new\xa0text\xa0element and adds it to the\xa0barLabelsForGroup\xa0array. The\xa0text\xa0element displays the value of the data point above the bar."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0wrapXAxisLables\xa0prop is\xa0false\xa0and the\xa0showXAxisLablesTooltip\xa0prop is\xa0true, the method creates a new\xa0tooltipProps\xa0object and calls the\xa0tooltipOfXAxislabels\xa0function to display a tooltip at the x-axis label."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0g\xa0element that contains the\xa0singleGroup\xa0and\xa0barLabelsForGroup\xa0arrays. The\xa0g\xa0element is translated to the x-coordinate of the current data point on the main x-axis using the\xa0xScale0\xa0scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Legends:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getLegendData():"}),"\xa0The method generates the legend for the chart. The method iterates over each data point and series in the chart and creates a legend object for each unique series. The method returns a Legends component that renders the legend using the legend objects."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"points: An array of\xa0IGroupedVerticalBarChartData\xa0objects, which contain the data points for the chart."}),"\n",(0,a.jsx)(t.li,{children:"palette: An object of type\xa0IPalette, which contains the color palette for the chart.\nThe function returns a JSX element that renders the legend for the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getLegendData\xa0method starts by defining some variables. The data variable is set to the points argument. The\xa0defaultPalette\xa0variable is set to an array of colors to use for the legend. The actions variable is set to an empty array."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the data array. For each data point, the method iterates over each series in the data point. For each series, the method checks if a similar legend has already been added to the actions array. If a similar legend exists, the method skips to the next series. If a similar legend does not exist, the method creates a new legend object and adds it to the actions array. The\xa0legend\xa0object contains a title property, which is set to the legend property of the current series, a color property, which is set to a random color from the\xa0defaultPalette\xa0array if the\xa0color\xa0property of the current series is not defined, and\xa0action, hoverAction, and onMouseOutAction\xa0properties, which are functions that handle\xa0click, hover, and mouse out\xa0events for the legend."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0Legends\xa0component that renders the legend for the chart. The\xa0legends\xa0prop is set to the actions array. The\xa0overflowProps, enabledWrapLines, focusZonePropsInHoverCard, and legendProps\xa0props are set to values from the props object."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Callouts:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"_getCustomizedCallout():"}),"\xa0The method returns a customized callout for a data point in the chart. The callout is rendered using the\xa0onRenderCalloutPerDataPoint\xa0prop, which is a function that takes a\xa0dataPointCalloutProps\xa0object as an argument and returns a React element."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getCustomizedCallout\xa0method first checks if the\xa0onRenderCalloutPerDataPoint\xa0prop is defined. If it is, the method calls the\xa0onRenderCalloutPerDataPoint\xa0function and passes in the\xa0dataPointCalloutProps\xa0object as an argument. The\xa0dataPointCalloutProps\xa0object contains information about the current data point, including its\xa0x\xa0and\xa0y\xa0values, as well as its\xa0color\xa0and\xa0data\xa0properties."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0onRenderCalloutPerDataPoint\xa0prop is not defined, the\xa0_getCustomizedCallout\xa0method returns\xa0null."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Rendering details"}),"\nThe Grouped vertical bar chart uses d3 SVG based rendering, which follows the following render cycles:","\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- Invocation cycle: Grouped Vertical bar Chart -> Cartesian base chart -> X-axis -> X-axis labels -> Y-axis -> Y-axis labels -> bars, legends, callouts\n- Rendering cycle: Grouped vertical bar chart <- Bars (rect), Legends, Callouts <- Axes (d3.axis, d3.scale)\n"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Following are the detailed steps:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The rendering of the grouped vertical bar chart is done using SVG elements. The chart is rendered inside a\xa0svg\xa0element that is created using the\xa0React.createElement()\xa0method."}),"\n",(0,a.jsx)(t.li,{children:"The chart is divided into two main sections: the x-axis and the bars. The x-axis is created using the\xa0d3.axis()\xa0function and is rendered as a\xa0g\xa0element inside the\xa0svg\xa0element. The bars are created using the\xa0rect\xa0element and are rendered as a\xa0g\xa0element inside the\xa0svg\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0rect\xa0elements are created using the\xa0datasetForBars\xa0array that is created using the\xa0_createDataset()\xa0method. The\xa0datasetForBars\xa0array contains an array of objects, where each object represents a group of bars. Each group of bars is rendered as a\xa0g\xa0element inside the\xa0svg\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"Inside each group of bars, the\xa0rect\xa0elements are created using the\xa0map()\xa0method on the\xa0data\xa0array. The\xa0map()\xa0method creates a new array of\xa0rect\xa0elements, where each\xa0rect\xa0element represents a bar in the group. The\xa0rect\xa0elements are positioned using the\xa0x\xa0and\xa0y\xa0attributes, which are calculated based on the data and the scales that were created earlier in the file."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0rect\xa0elements are also styled using various attributes such as\xa0fill,\xa0stroke, and\xa0strokeWidth. The\xa0fill\xa0attribute is set to a color that is based on the index of the\xa0rect\xa0element in the group. The\xa0stroke\xa0and\xa0strokeWidth\xa0attributes are used to create a border around each\xa0rect\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The\xa0_onBarHover()\xa0method is used to handle the hover event on the bars. This method is called when the user hovers over a bar in the chart. The method updates the state of the component to show the callout for the hovered bar."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Overall, the grouped vertical bar chart is rendered using\xa0SVG\xa0elements that are created using the\xa0React.createElement()\xa0method. The chart is divided into two main sections: the x-axis and the bars. The bars are created using the\xa0rect\xa0element and are positioned and styled based on the data and the scales that were created earlier in the file. The\xa0_onBarHover()\xa0method is used to handle the hover event on the bars and show the callout for the hovered bar."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Error scenarios"}),"\nThe Grouped Vertical bar chart handles the following error scenario:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Empty data: If the data passed to the chart component is empty, the chart will not render and a message will be narrated to the user.\xa0_isChartEmpty\xa0functions handles that scenario."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Localization aspects"}),"\nCurrently, although the component has a support for\xa0culture\xa0prop, but it does not support localization yet."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Testing"}),"\nThe testing for Grouped Vertical bar chart have not been started. The document will be updated as and when the tests are completed.\n",(0,a.jsx)(t.img,{alt:"GroupedVerticalBarChart3.png",src:n(6569).Z+"",width:"2475",height:"542"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Component Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7411",children:"7411"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Unit Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7412",children:"7412"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Manual Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/8605",children:"8605"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Accessibility Tests:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7410",children:"7410"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Accessibility"}),"\nFAST pass checks resulted in no error for Grouped Vertical bar chart. Link to the ",(0,a.jsx)(t.a,{href:"https://accessibilityinsights.io/docs/web/getstarted/fastpass/",children:"FAST pass tool"}),"\nOur charts have elaborate accessibility support. The charts are WCAG 2.1 MAS C compliant for accessibility.\nConsumers can define their own aria labels for each point by setting the\xa0callOutAccessibilityData\xa0property."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Theming"}),'\nThe palette for vertical bar chart is set from the "theme" prop as passed to the component during rendering. Both light and dark themes are supported and users can create there own theme too.\xa0',(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Ref6"}),"\xa0\xa0and\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"Ref7"}),"\xa0\xa0explains theming in detail."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Debugging"}),"\nThe detailed steps on debugging has been given in\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui-charting-contrib/blob/main/docs/Debugging.md",children:"Debugging"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Variants"}),"\nFollowing are the variants of vertical bar chart:\xa0",(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart/grouped",children:"Ref8"}),"\xa0","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Basic Grouped Vertical bar Chart"}),": Only basic props are provided."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Accessibility"}),": Providing custom aria labels."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Styled"}),": Can show bars with increased bar width."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Tooltip"}),": Can show tooltip over x-axis ticks when the ticks are truncated."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Interaction"}),"\nFollowing are the interactions that are allowed for donut chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Mouse Events"}),":\na. Hover mouse over a bar, should call the corresponding handler and show the callout over that bar.\nb. On mouse move on Bar 1 (step 1) -> mouse leave (step 2) -> mouse move on Bar 2 (step 3), should render the callout of the Bar 2.\nc. On mouse over, callout should be defined, on mouse leave, callout should disappear.\nd. On mouse over on legends, should highlight the corresponding bar.\nf. On click on Bar, should highlight the corresponding bar.\ng. On mouse out after mouse over on first legend, should have opacity 0.1 for second bar initially (during mouseOver on first legend) and opacity set to 1 for both the bars on mouse out."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Keyboard Events"}),":\na. On focus on a bar, should render the corresponding callout."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Some notable PRs and their brief description"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/12687",children:"Adding the Grouped Vertical bar chart main component"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/15838",children:"Refactoring Grouped Vertical Bar Chart via implementation of Cartesian charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/18880",children:"Custom Accessibility Change for Grouped Vertical Bar Chart"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/20347",children:"Number localization in charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/16914",children:"Narrator issues fixed in bar charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/17571",children:"Callout accessibility issue fixed for bar charts"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Learnings"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"While implementing the tests using react testing library, it was found that certain browser functions like\xa0getComputedTextLength()\xa0cannot be unit tested and needs to be tested End-to-End only."}),"\n",(0,a.jsx)(t.li,{children:"Order of imports are important.\nFor example: for Vertical bar charts tests, improper sequencing of the imports (data first and then render) results in incorrect and incopmlete rendering of charts:"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:" - import { chartPoints } from '../VerticalBarChart/VerticalBarChart.test';\n - import { render, screen, queryAllByAttribute, fireEvent, act } from '@testing-library/react';\n"})}),"\n",(0,a.jsx)(t.p,{children:"However, the following results in correct rendering:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"import { render, screen, queryAllByAttribute } from '@testing-library/react';\n\nimport { chartPoints } from './VerticalBarChart.test';\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Certain props need async await structure (waitFor in react testing library) for different props or nested SVGs to render."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Known issues"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Setting the margins externally via the props may cut the x and y ticks if the margins provided are very less. Setting a minimum margin would prevent any such distortions."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Future improvements"})}),"\n",(0,a.jsx)(t.p,{children:"Following are the list of future improvements for the vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Improved accessibility: While the component already provides accessibility data for screen readers, there is always room for improvement in this area. Adding support for keyboard navigation and improving the accessibility of the callout would make the component more accessible to users with disabilities."}),"\n",(0,a.jsx)(t.li,{children:"Support for animations: Adding support for animations, such as transitions between data updates or hover effects, would make the component more visually appealing and engaging for users."}),"\n",(0,a.jsxs)(t.li,{children:["Following error handling scenarios can be improved:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Invalid or missing chart dimensions: If the dimensions of the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing axis parameters: If the parameters for the x-axis or y-axis are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing legends: If the legends for the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid bar width: If the bar width for the chart is invalid, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing data for callout: If the data for the callout is invalid or missing, the callout will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing accessibility data: If the accessibility data for the chart is invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"Localization support can be improved for all strings and numbers."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Design figma"}),"\nVertical bar Chart Figma:\xa0",(0,a.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-80245&mode=design&t=eFKlPGUixdgy9xRs-0",children:"Link"}),"\xa0"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Performance"})}),"\n",(0,a.jsx)(t.p,{children:"The performance aspect of a donut chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a line chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Data Visualization Efficiency"}),"\n",(0,a.jsx)(t.li,{children:"Clarity and Simplicity"}),"\n",(0,a.jsx)(t.li,{children:"Responsiveness"}),"\n",(0,a.jsx)(t.li,{children:"Handling Large Datasets"}),"\n",(0,a.jsx)(t.li,{children:"Interactive Features"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Following are few of the scenarios for which we measure the performance score for vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"References"})}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-scale/blob/main/README.md",children:"D3-scale"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-selection/blob/main/README.md",children:"D3-selection"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-array/blob/main/README.md",children:"D3-array"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-axis/blob/main/README.md",children:"D3-axis"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"How to apply theme"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Theming"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart/grouped",children:"Grouped Vertical Bar Chart"})}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Appendix"}),"\nThe mathematical formulae used in the Grouped vertical bar chart component are as follows:"]}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the\xa0x0\xa0scale using\xa0d3ScaleBand:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x0 = d3ScaleBand()\n\n.domain(data.map(d => d.category))\n\n.range([0, width])\n\n.paddingInner(x0_inner_padding)\n\n- x0_inner_padding = space_between_groups/(space_between_groups + group_width)\n\n- space_between_groups = 2 * bar_width\n\n- group_width = this._keys.length * bar_width + (this._keys.length - 1) * space_between_bars\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the maximum value of the y-axis data using\xa0d3Max:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"const maxYValue = d3Max(data, d => d3Max(\\_keys, key => d[key]))\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"3",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the\xa0y\xa0scale using\xa0d3ScaleLinear:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"y = d3ScaleLinear()\n\n.domain([0, maxYValue])\n\n.range([0, height])\n\nheight = containerHeight - marginsBottom - marginsTop\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"4",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the bar gap rate:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"x1_inner_padding = space_between_bars / (space_between_bars + bar_width)\n\n=> space_between_bars = (x1_inner_padding / (1 - x1_inner_padding)) * bar_width\n\nRate at which the space between the bars in a group changes wrt the bar width\n\nBAR_GAP_RATE = X1_INNER_PADDING / (1 - X1_INNER_PADDING)\n\nX1_INNER_PADDING = 0.1\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"5",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the group width and bar width:"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Maximum possible group width to maintain 2:1 spacing:"}),"\n",(0,a.jsx)(t.p,{children:"InitialBarWidth = Math.min(props.barwidth || 16, 24);"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"(i) InitialGroupWidth = _keys.length * InitialBarWidth+ (_keys.length - 1) * BAR_GAP_RATE * InitialBarWidth\n"})}),"\n",(0,a.jsx)(t.p,{children:"Total width required to render the bars. Directly proportional to bar width:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"(ii) ReqWidth = _xAxisLabels.length * InitialGroupWidth + (_xAxisLabels.length - 1) * 2 * InitialBarWidth\n\nFrom (i) and (ii)\n\nMaximum possible group width to maintain 2:1 spacing\n\nMaxBandwidth = totalWidth / (_xAxisLabels.length +\n\n(_xAxisLabels.length - 1) * (2 / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)))\n\nFinalGroupWidth = MaxBandwidth;\n\nFrom (i)\n\nFinalBarWidth = FinalGroupWidth / (_keys.length + (_keys.length - 1) * BAR_GAP_RATE)\n"})}),"\n",(0,a.jsxs)(t.ol,{start:"6",children:["\n",(0,a.jsx)(t.li,{children:"Formula for calculating the width of each bar:"}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"barWidth = (x0.bandwidth() - spaceBetweenBars) / this._keys.length\n"})})]})}function d(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},1075:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC1-bfb960362b8a441805cd138056a2f8f6.png"},1030:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC2-d4cbda92ad72f6f1a2f85f9e2341b6e0.png"},6569:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GVBC3-15789353c5cef662c6d0f971540ad844.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var a=n(7294);const i={},s=a.createContext(i);function r(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44a464d7.bfee92aa.js b/assets/js/44a464d7.bfee92aa.js new file mode 100644 index 0000000000..70c6b332d6 --- /dev/null +++ b/assets/js/44a464d7.bfee92aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[6662],{1826:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>h,toc:()=>l});var a=n(5893),i=n(1151);const s={},r="Vertical Bar Chart",h={id:"Charting-Concepts/VerticalBarChart",title:"Vertical Bar Chart",description:"VerticalBarChart1.png",source:"@site/../../docs/Charting-Concepts/VerticalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/VerticalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/VerticalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Stacked Bar Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/StackedBarChart"},next:{title:"Vertical Stacked Bar Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/VerticalStackedBarChart"}},o={},l=[];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"vertical-bar-chart",children:"Vertical Bar Chart"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart1.png",src:n(5387).Z+"",width:"1059",height:"761"})}),"\n",(0,a.jsx)(t.p,{children:"A vertical bar chart is a type of chart that displays data as a series of vertical bars, with each bar representing a category and the height of the bar representing the value of that category. It is commonly used to compare the values of different categories. In addition, it can also include a line chart that displays a trend line or a target line. This type of chart is commonly used to show the relationship between the actual values and the target values or to show the trend of the data over time."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Use cases"}),"\nSome common use cases of vertical bar charts are as follows:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Comparing values of different categories"}),"\n",(0,a.jsx)(t.li,{children:"Showing changes in data over time"}),"\n",(0,a.jsx)(t.li,{children:"Displaying data that can be easily divided into categories"}),"\n",(0,a.jsx)(t.li,{children:"Highlighting the highest or lowest values in a dataset"}),"\n",(0,a.jsx)(t.li,{children:"Showing the distribution of data across categories"}),"\n",(0,a.jsx)(t.li,{children:"Displaying survey results or feedback data"}),"\n",(0,a.jsx)(t.li,{children:"Comparing performance metrics of different products or services"}),"\n",(0,a.jsx)(t.li,{children:"Analyzing sales data by region or product category"}),"\n",(0,a.jsx)(t.li,{children:"Displaying financial data such as revenue or profit by quarter or year"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"Mathematical/Geometrical concepts"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart2.png",src:n(2362).Z+"",width:"1110",height:"642"})}),"\n",(0,a.jsx)(t.p,{children:"The major D3 functions that are involved in the creation of Vertical bar charts are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-scale:"}),"\nThe\xa0d3-scale\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, which are used to map data values to visual properties, such as\xa0position, size, and color."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module includes several scale types, including linear, logarithmic, power, and time scales. These scales are used to map continuous data values to a continuous range of visual properties. The module also includes ordinal and band scales, which are used to map categorical data values to a discrete range of visual properties."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, including\xa0scaleLinear, scaleLog, scalePow, scaleTime, scaleOrdinal, and scaleBand. These functions take one or more arguments that define the domain and range of the scale, as well as any additional properties, such as the number of ticks or the padding between bands."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nVertical bar chart uses the\xa0d3-scale\xa0module to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height."]}),"\n",(0,a.jsx)(t.p,{children:"In Vertical bar chart, the\xa0d3ScaleLinear\xa0function is used to create the\xa0xBarScale,\xa0yBarScale\xa0and\xa0colorScale\xa0properties of the component."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"xBarScale:"})," It is a function that can be used to map input values to positions on the x-axis of the chart. When an input value is passed to the\xa0xBarScale\xa0function, it will return a position value that corresponds to the input value based on the specified domain and range.\xa0d3.scaleLinear()\xa0is used to create\xa0xBarScale\xa0for Numeric scales. Otherwise,\xa0d3.scaleBand()\xa0is used."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"yBarScale:"})," It is a function that can be used to map input values to positions on the y-axis of the chart. When an input value is passed to the\xa0yBarScale\xa0function, it will return a position value that corresponds to the input value based on the specified domain and range."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"colorScale:"})," It is a function that can be used to map input values to colors. When an input value is passed to the\xa0colorScale\xa0function, it will return a color value that corresponds to the input value based on the specified domain and range."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-shape:"}),"\xa0The\xa0d3-shape\xa0library provides various functions for creating and manipulating shapes such as\xa0arcs, lines, and areas. Following are the main mathematical/geometrical concepts that are used while drawing a vertical bar chart."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart,\xa0d3.line()\xa0is a function from the\xa0d3-shape\xa0module that is used to create a line generator for the line chart in the chart component. The line generator is used to generate a path element that represents the line chart based on the data points and the x and y scales."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.line():"}),"\xa0The\xa0d3Line\xa0function takes no arguments and returns a new line generator. The line generator can be customized using several methods, including\xa0x, y, defined, and curve. The\xa0x\xa0and\xa0y\xa0methods set the x and y accessors for the line generator, which define how the x and y values of the data points are mapped to the x and y positions of the line. The\xa0defined\xa0method sets a function that determines whether a data point is defined or not, which can be used to handle missing or invalid data. The\xa0curve\xa0method sets the curve interpolation for the line, which determines how the line is smoothed between the data points."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3Line\xa0function is used to create the\xa0linePath\xa0of the component, which is the line generator for the line chart on top of the vertical bar chart. The\xa0linePath\xa0variable is created using the\xa0d3Line\xa0function and is customized using the\xa0x and y\xa0methods."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0x\xa0method uses a ternary operator to check if the x-axis is a numeric axis or not. If the x-axis is not a numeric axis, the function uses the\xa0xBarScale\xa0function to calculate the x-coordinate of the line chart. The\xa0xBarScale\xa0function is a scale function that maps the x-axis values to the x-coordinates of the vertical bars in the chart. If the x-axis is a numeric axis, the function uses the\xa0xScale\xa0function to calculate the x-coordinate of the line chart. The\xa0xScale\xa0function is a scale function that maps the x-axis values to the x-coordinates of the chart."}),"\n",(0,a.jsx)(t.p,{children:"The\xa0y\xa0method uses a ternary operator to check if the data point should use the secondary y-axis or not. If the data point should use the secondary y-axis, the function uses the\xa0yScaleSecondary\xa0function to calculate the y-coordinate of the line chart. The\xa0yScaleSecondary\xa0function is a scale function that maps the y-axis values to the y-coordinates of the secondary y-axis. If the data point should not use the secondary y-axis, the function uses the\xa0yScale\xa0function to calculate the y-coordinate of the line chart. The\xa0yScale\xa0function is a scale function that maps the y-axis values to the y-coordinates of the chart."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-selection:"}),"\xa0The\xa0d3-selection\xa0is a module from the d3 library that is used to select and manipulate DOM elements in the chart component. The\xa0d3-selection\xa0module provides several functions for selecting and manipulating DOM elements, including\xa0select, selectAll, append, attr, and style. The select function is used to select a single DOM element that matches a given selector. The\xa0selectAll\xa0function is used to select multiple DOM elements that match a given selector. The\xa0append\xa0function is used to append a new DOM element to a selected element. The\xa0attr\xa0function is used to set or get an attribute of a selected element. The\xa0style\xa0function is used to set or get a style property of a selected element."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-selection\xa0module is used to select and manipulate several DOM elements in the chart component. For example, the\xa0d3Selection.select\xa0function is used to select the\xa0xElement\xa0element, which is a reference to the SVG element that contains the x-axis."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-array:"}),"\xa0The\xa0d3-array\xa0is a module from the d3 library that is used to manipulate arrays of data in the chart component. The\xa0d3-array\xa0module provides several functions for manipulating arrays of data, including\xa0max, min, extent, sum, and mean. The\xa0max\xa0function is used to find the maximum value in an array of data. The\xa0min\xa0function is used to find the minimum value in an array of data. The\xa0extent\xa0function is used to find the minimum and maximum values in an array of data. The\xa0sum\xa0function is used to find the sum of the values in an array of data. The\xa0mean\xa0function is used to find the mean (average) of the values in an array of data."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-array\xa0module is used to manipulate the data array that represents the data points in the chart component. For example, the\xa0d3Array.max\xa0function is used to find the maximum value of the y-values in the data array, which is used to set the domain of the y-axis scale. The\xa0d3Array.min\xa0function is used to find the minimum value of the y-values in the data array, which is also used to set the domain of the y-axis scale."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-format:"}),"\xa0The\xa0d3-format\xa0is a module from the d3 library that is used to format numbers and strings in the chart component. The\xa0d3-format\xa0module provides several functions for formatting numbers and strings, including\xa0format, formatPrefix, precisionFixed, and precisionRound."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0format\xa0function is used to format a number or string using a specified format string. The format string can include placeholders for the value, such as\xa0%\xa0for a percentage or\xa0,\xa0for a comma-separated number. The\xa0formatPrefix\xa0function is used to format a number using a prefix notation that rounds the value to a specified precision and appends a prefix, such as k for thousands or M for millions. The\xa0precisionFixed\xa0function is used to format a number using a fixed number of decimal places. The\xa0precisionRound\xa0function is used to format a number using a variable number of decimal places that is determined by the magnitude of the value."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-format\xa0module is used to format the labels for the bars in the chart component. For example, the\xa0_renderBarLabel\xa0method uses the\xa0d3FormatPrefix\xa0function to format the value of the bar using a prefix notation that rounds the value to two decimal places if the value is less than\xa01000, or to one decimal place if the value is greater than or equal to\xa01000. The formatted value is then appended to the text element as its content."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-axis:"}),"\xa0The\xa0d3-axis\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-axis\xa0module provides several functions for creating and manipulating axes, which are used to display the scales of a chart component."]}),"\n",(0,a.jsx)(t.p,{children:"In data visualization, axes are used to display the scales of a chart component, such as the x-axis and y-axis of a bar chart. Axes provide visual cues to help readers interpret the data values of a chart component, such as the range and domain of the data values."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0module provides several types of axes, including\xa0bottom, top, left, and right axes. Each type of axis has its own set of methods for customizing the axis and displaying the tick values."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn the Vertical stacked bar chart,\xa0d3-axis\xa0is used to create and render the x and y axes of the chart."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0library provides various methods for creating and rendering axes, such as\xa0axisBottom(),\xa0axisLeft(), and\xa0tickFormat(). In this case, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"To create the x and y axes, the\xa0d3-axis\xa0library's\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods are used, respectively. These methods take a scale function as an argument and return a new axis function that can be used to render the axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The resulting x and y axis functions are then used to render the x and y axes of the chart. The\xa0call()\xa0method of the selection object is used to call the axis function and render the axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0tickFormat()\xa0method of the y-axis scale is also used to set the tick format function for the y-axis. This method takes the format function created using the\xa0d3-format\xa0library as an argument and sets it as the tick format function for the y-axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Dev Deisgn Details:"}),"\nFollowing are the major components that contribute towards creating a complete vertical bar chart:"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Axes:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getScales():"}),"\xa0This method is responsible for generating the x and y scales that are used to map the data points to the chart dimensions. The scales are generated using the\xa0d3-scale\xa0library, which provides several scale types for different types of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight: a number representing the height of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: a number representing the width of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"isNumericScale: a boolean value indicating whether the x-axis scale is numeric or not."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getScales\xa0method takes several arguments, including\xa0containerHeight,\xa0containerWidth, and\xa0isNumericScale. These arguments are used to define the dimensions of the chart and to determine whether the x-axis is a numeric or categorical axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a numeric axis, the method uses the\xa0d3ScaleLinear\xa0function to create a linear scale for the x-axis. It first calculates the maximum and minimum x-values in the data using the\xa0d3Max\xa0and\xa0d3Min\xa0functions, respectively. It then creates a linear scale that maps the x-values to the chart dimensions using the domain and range methods. The nice method is also called on the x-axis scale to ensure that the tick values are rounded to the nearest integer."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a categorical axis, the method uses the\xa0d3ScaleBand\xa0function to create a band scale for the x-axis. It first extracts the x-axis labels from the data and uses them to define the domain of the scale. It then creates a band scale that maps the x-axis labels to the chart dimensions using the domain and range methods. The\xa0paddingInner\xa0method is also called on the x-axis scale to ensure that there is some space between the bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"For the y-axis, the method always uses the\xa0d3ScaleLinear\xa0function to create a linear scale that maps the y-values to the chart dimensions. It first defines the domain of the scale as\xa0[0, this._yMax], where\xa0_yMax\xa0is the maximum y-value in the data. It then defines the range of the scale as\xa0[0, containerHeight - this.margins.bottom! - this.margins.top!], where\xa0containerHeight\xa0is the height of the chart container and\xa0this.margins.bottom!\xa0and\xa0this.margins.top!\xa0are the bottom and top margins of the chart, respectively."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the method returns an object that contains the x and y scales for the chart. The x and y scales are returned as separate properties of the object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getDomainMargins():"}),"\xa0This method is responsible for calculating the margins for the chart based on the available container width and the number of x-axis labels. The margins are used to center the chart and to ensure that the bars are evenly spaced."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0which is a number representing the width of the container in which the chart is being rendered."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getDomainMargins\xa0method takes one argument,\xa0containerWidth, which is the width of the container that the chart is rendered in. It first checks whether the x-axis is a numeric axis or a categorical axis. If the x-axis is a categorical axis, the method returns the margins defined in the margins prop."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a numeric axis, the method calculates the total width available to render the bars by subtracting the left and right margins and the minimum domain margin from the container width. It then calculates the required width to render the bars based on the number of x-axis labels and the bar width. If the total width is greater than or equal to the required width, the method centers the chart by setting equal left and right margins for the domain. If the total width is less than the required width, the method calculates the maximum possible bar width to maintain a 2:1 spacing between the bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then sets the\xa0_domainMargin\xa0and\xa0_barWidth\xa0properties of the component based on the calculated margins and bar width. It returns an object that contains the updated margins, with the left and right margins increased by the\xa0_domainMargin\xa0value."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createNumericXAxis():"}),"\xa0This function is responsible for creating a numeric x-axis for a chart component. The function takes two arguments:\xa0xAxisParams\xa0and\xa0chartType.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0showRoundOffXTickValues,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisCount, and\xa0xAxisElement.\xa0chartType\xa0is an enumeration that specifies the type of chart component."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["xAxisParams\xa0of type\xa0IXAxisParams\xa0which is an object containing the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"domainNRangeValues\xa0of type\xa0IDomainNRange\xa0which is an object containing the domain and range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"showRoundOffXTickValues\xa0of type\xa0boolean\xa0which is an optional property that determines whether to round off the x-axis tick values."}),"\n",(0,a.jsx)(t.li,{children:"xAxistickSize\xa0of type\xa0number\xa0which is an optional property that determines the size of the x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding\xa0of type\xa0number\xa0which is an optional property that determines the padding between the x-axis ticks and the x-axis labels."}),"\n",(0,a.jsx)(t.li,{children:"xAxisCount\xa0of type\xa0number\xa0which is an optional property that determines the number of x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"xAxisElement\xa0of type\xa0SVGElement | null\xa0which is an optional property that represents the x-axis element."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"chartType\xa0of type\xa0ChartTypes\xa0which is an enum that represents the type of chart."}),"\n",(0,a.jsx)(t.li,{children:"culture\xa0of type string which is an optional paramter represents the locale into which the numeric x-axis labels will be localized."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0showRoundOffXTickValues\xa0property is a boolean that specifies whether to round off the tick values of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxisElement\xa0property is a reference to the DOM node that contains the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a linear scale for the x-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. If the\xa0showRoundOffXTickValues\xa0property is\xa0true, the\xa0nice\xa0method is called on the scale to round off the tick values of the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0ticks\xa0and\xa0tickFormat\xa0methods of the scale, and returns an object that contains the x-axis scale and the tick values."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"createStringXAxis():"}),"\xa0This function is responsible for creating a string x-axis for a chart component. The function takes four arguments:\xa0xAxisParams,\xa0tickParams,\xa0dataset, and\xa0culture.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0xAxisCount,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisPadding,\xa0xAxisInnerPadding, and\xa0xAxisOuterPadding.\xa0tickParams\xa0is an object that contains several properties, including\xa0tickValues\xa0and\xa0tickFormat.\xa0dataset\xa0is an array of strings that contains the values of the x-axis.\xa0culture\xa0is a string that specifies the locale into which the x-axis labels can be localized."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function Arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xAxisParams: An object containing the parameters for the x-axis, including the domain and range values, tick size, tick padding, number of ticks, padding for the inner and outer edges of the axis, and the element to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"tickParams: An object containing the parameters for the ticks on the x-axis, including the tick values and tick format."}),"\n",(0,a.jsx)(t.li,{children:"dataset: An array of strings representing the data points for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"culture: An optional string representing the culture to use for formatting the tick labels on the x-axis. However, the localization works only if the string can be converted to a numeric value. Otherwise, the x-axis labels remain unlocalized."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisPadding\xa0property is a number that specifies the padding between the bars of the chart. The\xa0xAxisInnerPadding\xa0property is a number that specifies the inner padding between the bars of the chart. The\xa0xAxisOuterPadding\xa0property is a number that specifies the outer padding between the bars of the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates a band scale for the x-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0methods are used to set the inner and outer padding between the bars of the chart, respectively."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the\xa0xAxisParams.xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function computes the tick values of the x-axis using the\xa0tickFormat\xa0method of the axis, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createYAxis\xa0function is responsible for creating the y-axis using the\xa0createYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams,\xa0isRtl,\xa0axisData, and\xa0useSecondaryYScale. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["yAxisParams: An object that contains various parameters related to the y-axis of the chart. It has the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yMinMaxValues: An object that contains the start and end values of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yAxisElement: The DOM element that represents the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMaxValue: The maximum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMinValue: The minimum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"margins: An object that contains the margins of the chart."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding: The padding between the ticks and the axis line."}),"\n",(0,a.jsx)(t.li,{children:"maxOfYVal: The maximum value of the y-axis for area chart and Grouped vertical bar chart."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickFormat: The format of the y-axis tick labels."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickCount: The number of ticks on the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"eventAnnotationProps: An object that contains the properties of the event annotation."}),"\n",(0,a.jsx)(t.li,{children:"eventLabelHeight: The height of the event label."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n",(0,a.jsx)(t.li,{children:"axisData: An object that contains the data related to the axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"useSecondaryYScale: A boolean value that indicates whether to use a secondary y-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0yMinMaxValues, yAxisElement, containerHeight, and containerWidth. It then calculates the final maximum and minimum values for the y-axis, based on the\xa0maxOfYVal, yMaxValue, and yMinValue\xa0parameters."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then prepares the datapoints for the y-axis using the\xa0prepareDatapoints\xa0function, which calculates the tick values based on the maximum and minimum values of the y-axis. It then creates a linear scale for the y-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0library."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl and useSecondaryYScale\xa0parameters. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function uses the d3Select function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the call method. It also sets the aria-hidden attribute of the y-axis text elements to true to improve accessibility."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createStringYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createStringYAxis\xa0function is responsible for creating the y-axis that use string values for the y-axis using the\xa0createStringYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams, dataPoints, and isRtl. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yAxisParams: An object that contains the parameters for the y-axis, including\xa0containerHeight,\xa0tickPadding,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding."}),"\n",(0,a.jsx)(t.li,{children:"dataPoints: An array of strings that represent the data points for the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0containerHeight,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding. It then creates a band scale for the y-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0library."}),"\n",(0,a.jsx)(t.li,{children:"The band scale is defined using the\xa0dataPoints\xa0array as the domain, and the\xa0containerHeight\xa0and\xa0margins\xa0parameters as the range. The\xa0padding\xa0method is used to set the padding between the bands in the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl\xa0parameter. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function uses the\xa0d3Select\xa0function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the\xa0call\xa0method. It also selects all the text elements of the y-axis and returns the y-axis scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bars:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Numeric bars (_createNumericBars()):"}),"\xa0This method is responsible for generating the vertical bars for the chart when the x-axis is a numeric axis. The bars are generated using the d3 library, which provides several functions for creating and manipulating SVG elements."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight\xa0- a number representing the height of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0- a number representing the width of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"xElement\xa0- an SVGElement representing the x-axis element of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createNumericBars\xa0method takes several arguments, including\xa0containerHeight, containerWidth, and xElement. These arguments are used to define the dimensions of the chart and to create the x-axis scale."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method first extracts several props from the props object, including\xa0useSingleColor, which determines whether all bars should be the same color, and\xa0xBarScale\xa0and\xa0yBarScale, which are the x and y scales for the chart. It also creates a color scale using the\xa0_createColors\xa0method, which generates a range of colors based on the number of data points."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then iterates over each data point in the\xa0_points\xa0array and generates a vertical bar for each point. It first checks whether the bar should be highlighted based on the legend or whether any legend is highlighted. It then generates a class name for the bar using the\xa0getClassNames\xa0function, which applies styles based on the theme and whether the bar should be highlighted."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The height of the bar is determined by the\xa0yBarScale\xa0function, which maps the y-value of the data point to the chart dimensions. If the height of the bar is less than 1, the method returns an empty\xa0React.Fragment\xa0element."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then calculates the x and y positions of the bar using the\xa0xBarScale\xa0and\xa0yBarScale\xa0functions, respectively. It generates a rect element for the bar and sets its attributes, including the\xa0x, y, width, height, and fill\xa0attributes. It also sets several event handlers for the bar, including\xa0onClick, onMouseOver, onMouseLeave, onFocus, and onBlur, which are used to display the callout and tooltip for the bar."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the method returns an array of\xa0g\xa0elements that contain the\xa0rect\xa0elements for each bar. It also removes any unwanted tooltip\xa0divs\xa0from the DOM and displays the tooltip at the x-axis labels if the\xa0showXAxisLablesTooltip\xa0prop is set to\xa0true."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"String bars (_createStringBars()):"}),"\xa0This method is responsible for generating the vertical bars for the chart when the x-axis is a categorical axis. The bars are generated using the d3 library, which provides several functions for creating and manipulating SVG elements."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight\xa0(number): The height of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0(number): The width of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"xElement\xa0(SVGElement): The SVG element that represents the x-axis of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_createStringBars\xa0method takes several arguments, including\xa0containerHeight, containerWidth, and xElement. These arguments are used to define the dimensions of the chart and to create the x-axis scale."}),"\n",(0,a.jsx)(t.li,{children:"The method first extracts several props from the props object, including\xa0xBarScale\xa0and\xa0yBarScale, which are the x and y scales for the chart, and\xa0colorScale, which is a color scale generated using the\xa0_createColors\xa0method. It also generates a\xa0React.Fragment\xa0element for any bars that have a height less than 1."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the\xa0_points\xa0array and generates a vertical bar for each point. It first calculates the height of the bar using the\xa0yBarScale\xa0function, which maps the y-value of the data point to the chart dimensions. If the height of the bar is less than 1, the method returns an empty\xa0React.Fragment\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The method then calculates the x and y positions of the bar using the\xa0xBarScale\xa0and\xa0yBarScale\xa0functions, respectively. It generates a rect element for the bar and sets its attributes, including the\xa0x, y, width, height, and fill\xa0attributes. It also sets several event handlers for the bar, including\xa0onClick, onMouseOver, onMouseLeave, onFocus, and onBlur, which are used to display the callout and tooltip for the bar."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns an array of\xa0g\xa0elements that contain the\xa0rect\xa0elements for each bar. It also removes any unwanted tooltip\xa0divs\xa0from the DOM and displays the tooltip at the x-axis labels if the\xa0showXAxisLablesTooltip\xa0prop is set to\xa0true."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Lines:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createLine():"}),"\xa0This method is responsible for creating a line chart that can be overlaid on top of the vertical bar chart. The line chart is created using the\xa0d3.line\xa0function, which generates a path element based on an array of data points."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale: A scale function that maps values from the x domain to the x range."}),"\n",(0,a.jsx)(t.li,{children:"yScale: A scale function that maps values from the y domain to the y range."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"yScaleSecondary: An optional scale function that maps values from the secondary y domain to the secondary y range. This is used when the chart has a secondary y axis."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_createLine\xa0method takes several arguments, including\xa0xScale, yScale, containerHeight, containerWidth, and yScaleSecondary. These arguments are used to define the scales and dimensions of the chart, as well as to extract the data needed to create the line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method first checks whether the x-axis is a numeric axis or a categorical axis, and then creates the necessary scales and color scales based on this information. It then extracts the data points from the data prop that have a\xa0lineData\xa0property, which contains the y-value for each point on the line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then creates a\xa0linePath\xa0function using the\xa0d3.line\xa0function, which maps the x and y values of each data point to the chart dimensions using the\xa0xScale\xa0and\xa0yScale\xa0functions. If a\xa0yScaleSecondary\xa0function is provided, it is used instead of\xa0yScale\xa0for data points that have a\xa0useSecondaryYScale\xa0property set to true."}),"\n",(0,a.jsx)(t.li,{children:"The method then creates a line array that contains two path elements: one for the line itself, and one for the line border. The line element has a stroke color that is set to the\xa0lineLegendColor\xa0prop, which defaults to yellow. The\xa0lineBorder\xa0element has a white stroke color and a width that is determined by the\xa0lineBorderWidth\xa0prop."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method creates a dots array that contains a circle element for each data point on the line chart. These circles have a white fill color and a stroke color that matches the\xa0lineLegendColor\xa0prop. They also have a visibility property that is set to show if the data point is currently active and hide otherwise."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Legends:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getLegendData():"}),"\xa0This method is responsible for generating the legend for the chart, which displays the color and label for each data point on the chart. The legend is generated using the Legends component, which is a reusable component that displays a list of legends with customizable styles and behaviors."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"data: an array of\xa0IVerticalBarChartDataPoint\xa0objects, which contain the data points for the chart."}),"\n",(0,a.jsx)(t.li,{children:"palette: an object of type\xa0IPalette, which contains the color palette to be used for the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getLegendData\xa0method takes two arguments,\xa0data and palette, which are arrays of data points and a color palette, respectively. It also extracts several props from the props object, including\xa0theme, useSingleColor, lineLegendText, and lineLegendColor. These props are used to determine the color and label for each legend item."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the data array and generates a legend item for each point. It first calculates the color of the legend item using the color property of the data point, or by generating a new color using the\xa0_createColors\xa0method if no color is defined. It then creates a new object called legend that contains the title, color, and several event handlers for the legend item. These event handlers are used to handle mouse events on the legend item, such as clicking, hovering, and leaving."}),"\n",(0,a.jsx)(t.li,{children:"The method then adds the legend object to an array called actions, which is used to store all of the legend items for the chart. If the chart includes a line chart and the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props are defined, the method adds a new legend item to the beginning of the actions array that represents the line chart. This legend item includes the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props, as well as an additional property called\xa0isLineLegendInBarChart, which is used to style the legend item differently from the other legend items."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0Legends\xa0component that displays the legend items in a list. The\xa0Legends\xa0component takes several props that are used to customize the styles and behaviors of the legend items, including\xa0enabledWrapLines, overflowProps, focusZonePropsInHoverCard, and overflowText."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Callouts:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"_getCalloutContentForLineAndBar():"}),"\xa0This method is responsible for generating the content that is displayed in the callout when the user hovers over a data point on the chart. The callout content includes the y-values for both the vertical bar and the line chart, as well as any associated callout data."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getCalloutContentForLineAndBar\xa0method takes a single argument, point, which is an object that contains the x and y values for the data point that the user is hovering over. The method first initializes an empty array called\xa0YValueHover, which will be used to store the y-values and callout data for the vertical bar and line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then extracts several props from the props object, including data,\xa0lineLegendText, and\xa0lineLegendColor. It uses these props to filter the data array and find the data point that matches the x-value of the hovered point. If the chart includes a line chart and the selected data point has a\xa0lineData\xa0property with a defined y-value, the method adds a new object to the\xa0YValueHover\xa0array that contains the y-value and callout data for the line chart. This object also includes the legend text and color for the line chart, which are defined by the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props."}),"\n",(0,a.jsx)(t.li,{children:"The method then adds a second object to the\xa0YValueHover\xa0array that contains the y-value and callout data for the vertical bar. This object includes the legend text, y-value, and color for the vertical bar, as well as any associated callout data. The color of the vertical bar is determined by the color property of the selected data point, or by generating a new color using the\xa0_createColors\xa0method if no color is defined."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns an object that contains the\xa0YValueHover\xa0array and the x-value of the hovered point. The x-value is determined by the\xa0xAxisCalloutData\xa0property of the selected data point, or by using the x-value of the point if no\xa0xAxisCalloutData\xa0is defined."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bar labels:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_renderBarLabel():"}),"\xa0This method is responsible for rendering the labels for the bars in the chart component. The method takes three arguments:\xa0xPoint, yPoint, and barValue.\xa0xPoint\xa0and\xa0yPoint\xa0are the x and y positions of the bar, respectively, and\xa0barValue\xa0is the value of the bar."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The method first checks if the\xa0hideLabels\xa0prop is set to true or if the width of the bar is less than\xa016 pixels. If either of these conditions is\xa0true, the method returns\xa0null, which means that no label is rendered for the bar."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0hideLabels\xa0prop is false and the width of the bar is greater than or equal to\xa016 pixels, the method returns a text element that represents the label for the bar. The\xa0text\xa0element is positioned at the center of the bar using the\xa0xPoint\xa0and\xa0yPoint\xa0arguments. The\xa0textAnchor\xa0attribute is set to middle, which centers the text horizontally. The\xa0className\xa0attribute is set to a CSS class that is used to style the label. The\xa0aria-hidden\xa0attribute is set to true, which means that the label is hidden from screen readers."}),"\n",(0,a.jsx)(t.li,{children:"The content of the\xa0text\xa0element is generated using the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module. The\xa0d3FormatPrefix\xa0function formats the\xa0barValue\xa0argument using a prefix notation that rounds the value to two decimal places if the value is less than\xa01000, or to one decimal place if the value is greater than or equal to\xa01000. The formatted value is then appended to the text element as its content."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Ticks:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Rotated x-axis ticks (rotateXAxisLabels()):"}),"\xa0This function is responsible for rotating the labels of the x-axis of a chart component. The function takes an object called\xa0rotateLabelProps\xa0as an argument, which contains two properties:\xa0node\xa0and\xa0xAxis.\xa0node\xa0is a reference to the DOM node that contains the chart component, and\xa0xAxis\xa0is a reference to the x-axis of the chart."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first checks if either\xa0node\xa0or\xa0xAxis\xa0is\xa0null."}),"\n",(0,a.jsx)(t.li,{children:"If either of these values is\xa0null, the function returns\xa0undefined, which means that no rotation is performed."}),"\n",(0,a.jsx)(t.li,{children:"The function then initializes a variable called\xa0maxHeight\xa0to 0 and an array called\xa0xAxisTranslations\xa0to store the x-axis translations. It uses\xa0d3Select\xa0to select the chart node and call the x-axis function. It then selects all the tick elements and loops through them. For each tick element, the function checks whether it has already been rotated. If it hasn't, the function extracts the x-axis translation value and pushes it to the\xa0xAxisTranslations\xa0array. The function then sets the\xa0transform\xa0attribute of the tick element to translate it by the x-axis translation value and rotate it by\xa0-45\xa0degrees. The function also computes the height of the tick element and stores it in the\xa0maxHeight\xa0variable if it's greater than the current\xa0maxHeight."}),"\n",(0,a.jsx)(t.li,{children:"The function then loops through the tick elements again and sets their\xa0transform\xa0attribute to translate them by the corresponding x-axis translation value, translate them vertically by half of the\xa0maxHeight, and rotate them by\xa0-45\xa0degrees."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function returns the vertical height of the labels by computing\xa0maxHeight/tanInverse(45)."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Rendering details"}),"\nThe Vertical bar chart uses d3 SVG based rendering, which follows the following render cycles:","\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- Invocation cycle: Vertical bar Chart -> Cartesian base chart -> X-axis -> X-axis labels -> Y-axis -> Y-axis labels -> bars, legends, callouts\n- Rendering cycle: Vertical bar chart <- Bars (rect), lines (d3.line), Legends, Callouts <- Axes (d3.axis, d3.scale)\n"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Following are the detailed steps:"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0VerticalBarChart\xa0component renders a vertical bar chart with optional line chart overlay. The chart is rendered using D3.js and SVG elements. The chart can be customized with various props, including data points, axis labels, legend, colors, and more."}),"\n",(0,a.jsx)(t.li,{children:"The chart is rendered within an SVG element with a specified width and height. The chart is composed of several elements, including the x-axis, y-axis, bars, and line chart. The x-axis and y-axis are rendered using D3.js axis functions, and the bars and line chart are rendered using D3.js scales and data binding."}),"\n",(0,a.jsx)(t.li,{children:"The chart data is passed in as an array of\xa0IVerticalBarChartDataPoint\xa0objects, which contain x and y values, a legend label, and an optional color. The chart can also display a line chart overlay, which is passed in as an array of\xa0IVerticalBarChartDataPoint\xa0objects with an additional\xa0lineData\xa0property."}),"\n",(0,a.jsx)(t.li,{children:"The legend is rendered using the\xa0Legends\xa0component, which is passed an array of\xa0ILegend\xa0objects. The chart can also display callout labels for each bar, which are rendered using SVG\xa0text\xa0elements."}),"\n",(0,a.jsx)(t.li,{children:"The chart can be customized with various props, including\xa0barWidth,\xa0colors,\xa0theme,\xa0lineLegendText,\xa0yAxisTickCount, and more. The chart also supports accessibility features, including aria labels and keyboard navigation."}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Error scenarios"}),"\nThe Vertical bar chart handles the following error scenario:"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Empty data: If the data passed to the chart component is empty, the chart will not render and a message will be narrated to the user.\xa0_isChartEmpty\xa0functions handles that scenario."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Localization aspects"}),"\nThe component has a\xa0culture\xa0prop, which is used to set the culture for the chart. This prop is used to format the x-axis labels and the callout values based on the specified culture. Currently, vertical bar chart provides localization only for the x-axis ticks if they are numbers."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Testing"}),"\nThe manual and component tests for Vertical bar chart has been completed and unit testing are in progress. Following is the current code coverage for Vertical bar chart:"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart3.png",src:n(2521).Z+"",width:"2475",height:"537"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Component Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7435",children:"7435"})]}),"\n",(0,a.jsxs)(t.li,{children:["Test plan:\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/blob/master/packages/react-charting/docs/TestPlans/VerticalBarChart/ComponentTests.md",children:"https://github.com/microsoft/fluentui/blob/master/packages/react-charting/docs/TestPlans/VerticalBarChart/ComponentTests.md"}),"\xa0"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Unit Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7436",children:"7436"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Manual Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/8604",children:"8604"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Accessibility Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7434",children:"7434"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Accessibility"}),"\nVertical bar chart is tested for fast pass accessibility.\nLink to the ",(0,a.jsx)(t.a,{href:"https://accessibilityinsights.io/docs/web/getstarted/fastpass/",children:"FAST pass tool"}),"\nOur charts have elaborate accessibility support. The charts are WCAG 2.1 MAS C compliant for accessibility.\nConsumers can define their own aria labels for each point by setting the\xa0callOutAccessibilityData\xa0property."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Theming"}),'\nThe palette for vertical bar chart is set from the "theme" prop as passed to the component during rendering. Both light and dark themes are supported and users can create there own theme too.\xa0',(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Ref6"}),"\xa0\xa0and\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"Ref7"}),"\xa0\xa0explains theming in detail."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Debugging"}),"\nThe detailed steps on debugging has been given in\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui-charting-contrib/blob/main/docs/Debugging.md",children:"Debugging"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Variants"}),"\nFollowing are the variants of vertical bar chart:\xa0",(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart",children:"Ref8"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Basic Vertical bar Chart"}),": Only basic props are provided."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Dynamic Vertical bar Chart"}),": The data and bar colors can change."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Callout"}),": Can show customized callout data."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Accessibility"}),": Providing custom aria labels."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Styled"}),": Can show bars with a single color w/o line."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Rotated labels"}),": Can show labels rotated in -45 degrees."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Tooltip"}),": Can show tooltip over x-axis ticks when the ticks are truncated."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Interaction"}),"\nFollowing are the interactions that are allowed for vertical bar chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Mouse Events"}),":\na. Hover mouse over a bar, should call the corresponding handler and show the callout over that bar.\nb. On mouse move on Bar 1 (step 1) -> mouse leave (step 2) -> mouse move on Bar 2 (step 3), should render the callout of the Bar 2.\nc. On mouse over, callout should be defined, on mouse leave, callout should disappear.\nd. On mouse over on legends, should highlight the corresponding bar/line.\nf. On click on Bar, should highlight the corresponding bar.\ng. On mouse out after mouse over on first legend, should have opacity 0.1 for second bar initially (during mouseOver on first legend) and opacity set to 1 for both the bars on mouse out."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Keyboard Events"}),":\na. On focus on a bar, should render the corresponding callout.\nb. On focus on a line, should highlight the corresponding line and its legend."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Some notable PRs and their brief description"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/4954",children:"Adding the Vertical bar chart main component"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/commit/562ce21022cb4b5b33309a37712965909c7d15bd",children:"Refactoring Vertical Bar Chart via implementation of Cartesian charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/28013",children:"Adding Tests for Vertical Bar Chart using React Testing Library"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/19074",children:"Accessibility change for Vertical Bar Chart"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Learnings"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"While implementing the tests using react testing library, it was found that certain browser functions like\xa0getComputedTextLength()\xa0cannot be unit tested and needs to be tested End-to-End only."}),"\n",(0,a.jsx)(t.li,{children:"Order of imports are important.\nFor example: for Vertical bar charts tests, improper sequencing of the imports (data first and then render) results in incorrect and incopmlete rendering of charts:"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:" - import { chartPoints } from '../VerticalBarChart/VerticalBarChart.test';\n - import { render, screen, queryAllByAttribute, fireEvent, act } from '@testing- \n - library/react';\n"})}),"\n",(0,a.jsx)(t.p,{children:"However, the following results in correct rendering:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"import { render, screen, queryAllByAttribute } from '@testing-library/react';\n\nimport { chartPoints } from './VerticalBarChart.test';\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Certain props need async await structure (waitFor in react testing library) for different props or nested SVGs to render."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Known issues"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Setting the margins externally via the props may cut the x and y ticks if the margins provided are very less. Setting a minimum margin would prevent any such distortions."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Future improvements"})}),"\n",(0,a.jsx)(t.p,{children:"Following are the list of future improvements for the vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Improved accessibility: While the component already provides accessibility data for screen readers, there is always room for improvement in this area. Adding support for keyboard navigation and improving the accessibility of the callout would make the component more accessible to users with disabilities."}),"\n",(0,a.jsx)(t.li,{children:"Support for animations: Adding support for animations, such as transitions between data updates or hover effects, would make the component more visually appealing and engaging for users."}),"\n",(0,a.jsxs)(t.li,{children:["Following error handling scenarios can be improved:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Invalid or missing chart dimensions: If the dimensions of the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing axis parameters: If the parameters for the x-axis or y-axis are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing legends: If the legends for the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid bar width: If the bar width for the chart is invalid, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing data for callout: If the data for the callout is invalid or missing, the callout will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing accessibility data: If the accessibility data for the chart is invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"Localization support can be improved for all strings and numbers."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Design figma"}),"\nVertical bar Chart Figma:\xa0",(0,a.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-80245&mode=design&t=eFKlPGUixdgy9xRs-0",children:"Link"}),"\xa0"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Performance"})}),"\n",(0,a.jsx)(t.p,{children:"The performance aspect of a donut chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a line chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Data Visualization Efficiency"}),"\n",(0,a.jsx)(t.li,{children:"Clarity and Simplicity"}),"\n",(0,a.jsx)(t.li,{children:"Responsiveness"}),"\n",(0,a.jsx)(t.li,{children:"Handling Large Datasets"}),"\n",(0,a.jsx)(t.li,{children:"Interactive Features"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Following are few of the scenarios for which we measure the performance score for vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"References"})}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["D3-scale:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-scale/blob/main/README.md",children:"Link 1"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://d3js.org/d3-scale",children:"Link 2"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-shape/blob/main/README.md",children:"D3-shape"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-selection/blob/main/README.md",children:"D3-selection"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-array/blob/main/README.md",children:"D3-array"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-axis/blob/main/README.md",children:"D3-axis"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"How to apply theme"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Theming"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart",children:"Vertical Bar Chart"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Appendix:"})}),"\n",(0,a.jsx)(t.p,{children:"The mathematical formulae used in the Vertical bar chart component are as follows:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the y scale using d3ScaleLinear:\n",(0,a.jsx)(t.img,{alt:"VBC_f1.png",src:n(8395).Z+"",width:"1566",height:"146"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Formula for calculating the x scale using d3ScaleBand:"}),"\n",(0,a.jsxs)(t.p,{children:["Numeric scale:\n",(0,a.jsx)(t.img,{alt:"VBC_f2.png",src:n(2055).Z+"",width:"1683",height:"353"})]}),"\n",(0,a.jsxs)(t.p,{children:["String scale:\n",(0,a.jsx)(t.img,{alt:"VBC_f3.png",src:n(7493).Z+"",width:"1827",height:"353"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the width of each bar:\n",(0,a.jsx)(t.img,{alt:"VBC_f4.png",src:n(2624).Z+"",width:"1154",height:"58"})]}),"\n",(0,a.jsx)(t.p,{children:"In order to maintain 2:1 spacing barWidth is replaced by the maxBandWidth."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the total width required to render the bars:\n",(0,a.jsx)(t.img,{alt:"VBC_f5.png",src:n(8874).Z+"",width:"1730",height:"122"})]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"MIN_DOMAIN_MARGIN = 8\n"})}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the maximum possible bar width to maintain 2:1 spacing:\n",(0,a.jsx)(t.img,{alt:"VBC_f6.png",src:n(3443).Z+"",width:"1832",height:"81"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the domain margin\n",(0,a.jsx)(t.img,{alt:"VBC_f7.png",src:n(5e3).Z+"",width:"1454",height:"111"})]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"_domainMarging = MIN_DOMAIN_MARGIN\nMIN_DOMAIN_MARGIN = 8\n\nTo center align the chart by setting equal left and right margins for domain:\n"})}),"\n"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},5387:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC1-bb6595c22f4de60c6aebc16359482663.png"},2362:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC2-8ab8b2b71a752a09e6160710baaab17a.png"},2521:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC3-0446d2d3c1c321827e398d8ecd1c9057.png"},8395:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f1-86ad6759ab4ed50b9f22c761d9645973.png"},2055:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f2-2d56c3cf1651669a96c6ba1570f477df.png"},7493:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f3-30c3db0ac6ae137e267c52d6b3a43746.png"},2624:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f4-ffb3da2424b492b04995aab01fb70afa.png"},8874:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f5-5815e87496c11f471d243c808a86a082.png"},3443:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f6-12092fc4a1cd14cd8196d102472960ab.png"},5e3:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f7-78ec7172b86cb7cd832f6025adad8fef.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var a=n(7294);const i={},s=a.createContext(i);function r(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44a464d7.ef547f4b.js b/assets/js/44a464d7.ef547f4b.js deleted file mode 100644 index 0ecaa9d66e..0000000000 --- a/assets/js/44a464d7.ef547f4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[6662],{1826:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>h,toc:()=>l});var a=n(5893),i=n(1151);const s={},r="Contributor guide: Vertical Bar Chart",h={id:"Charting-Concepts/VerticalBarChart",title:"Contributor guide: Vertical Bar Chart",description:"VerticalBarChart1.png",source:"@site/../../docs/Charting-Concepts/VerticalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/VerticalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/VerticalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributor guide: Stacked Bar Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/StackedBarChart"},next:{title:"Contributor guide: Vertical Stacked Bar Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/VerticalStackedBarChart"}},o={},l=[];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"contributor-guide-vertical-bar-chart",children:"Contributor guide: Vertical Bar Chart"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart1.png",src:n(5387).Z+"",width:"1059",height:"761"})}),"\n",(0,a.jsx)(t.p,{children:"A vertical bar chart is a type of chart that displays data as a series of vertical bars, with each bar representing a category and the height of the bar representing the value of that category. It is commonly used to compare the values of different categories. In addition, it can also include a line chart that displays a trend line or a target line. This type of chart is commonly used to show the relationship between the actual values and the target values or to show the trend of the data over time."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Use cases"}),"\nSome common use cases of vertical bar charts are as follows:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Comparing values of different categories"}),"\n",(0,a.jsx)(t.li,{children:"Showing changes in data over time"}),"\n",(0,a.jsx)(t.li,{children:"Displaying data that can be easily divided into categories"}),"\n",(0,a.jsx)(t.li,{children:"Highlighting the highest or lowest values in a dataset"}),"\n",(0,a.jsx)(t.li,{children:"Showing the distribution of data across categories"}),"\n",(0,a.jsx)(t.li,{children:"Displaying survey results or feedback data"}),"\n",(0,a.jsx)(t.li,{children:"Comparing performance metrics of different products or services"}),"\n",(0,a.jsx)(t.li,{children:"Analyzing sales data by region or product category"}),"\n",(0,a.jsx)(t.li,{children:"Displaying financial data such as revenue or profit by quarter or year"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"Mathematical/Geometrical concepts"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart2.png",src:n(2362).Z+"",width:"1110",height:"642"})}),"\n",(0,a.jsx)(t.p,{children:"The major D3 functions that are involved in the creation of Vertical bar charts are:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-scale:"}),"\nThe\xa0d3-scale\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, which are used to map data values to visual properties, such as\xa0position, size, and color."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module includes several scale types, including linear, logarithmic, power, and time scales. These scales are used to map continuous data values to a continuous range of visual properties. The module also includes ordinal and band scales, which are used to map categorical data values to a discrete range of visual properties."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-scale\xa0module provides several functions for creating and manipulating scales, including\xa0scaleLinear, scaleLog, scalePow, scaleTime, scaleOrdinal, and scaleBand. These functions take one or more arguments that define the domain and range of the scale, as well as any additional properties, such as the number of ticks or the padding between bands."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nVertical bar chart uses the\xa0d3-scale\xa0module to create a linear scale for the y-axis of the chart. The linear scale maps a continuous domain of data values to a continuous range of visual properties, such as position or height."]}),"\n",(0,a.jsx)(t.p,{children:"In Vertical bar chart, the\xa0d3ScaleLinear\xa0function is used to create the\xa0xBarScale,\xa0yBarScale\xa0and\xa0colorScale\xa0properties of the component."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"xBarScale:"})," It is a function that can be used to map input values to positions on the x-axis of the chart. When an input value is passed to the\xa0xBarScale\xa0function, it will return a position value that corresponds to the input value based on the specified domain and range.\xa0d3.scaleLinear()\xa0is used to create\xa0xBarScale\xa0for Numeric scales. Otherwise,\xa0d3.scaleBand()\xa0is used."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"yBarScale:"})," It is a function that can be used to map input values to positions on the y-axis of the chart. When an input value is passed to the\xa0yBarScale\xa0function, it will return a position value that corresponds to the input value based on the specified domain and range."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"colorScale:"})," It is a function that can be used to map input values to colors. When an input value is passed to the\xa0colorScale\xa0function, it will return a color value that corresponds to the input value based on the specified domain and range."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-shape:"}),"\xa0The\xa0d3-shape\xa0library provides various functions for creating and manipulating shapes such as\xa0arcs, lines, and areas. Following are the main mathematical/geometrical concepts that are used while drawing a vertical bar chart."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart,\xa0d3.line()\xa0is a function from the\xa0d3-shape\xa0module that is used to create a line generator for the line chart in the chart component. The line generator is used to generate a path element that represents the line chart based on the data points and the x and y scales."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3.line():"}),"\xa0The\xa0d3Line\xa0function takes no arguments and returns a new line generator. The line generator can be customized using several methods, including\xa0x, y, defined, and curve. The\xa0x\xa0and\xa0y\xa0methods set the x and y accessors for the line generator, which define how the x and y values of the data points are mapped to the x and y positions of the line. The\xa0defined\xa0method sets a function that determines whether a data point is defined or not, which can be used to handle missing or invalid data. The\xa0curve\xa0method sets the curve interpolation for the line, which determines how the line is smoothed between the data points."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3Line\xa0function is used to create the\xa0linePath\xa0of the component, which is the line generator for the line chart on top of the vertical bar chart. The\xa0linePath\xa0variable is created using the\xa0d3Line\xa0function and is customized using the\xa0x and y\xa0methods."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0x\xa0method uses a ternary operator to check if the x-axis is a numeric axis or not. If the x-axis is not a numeric axis, the function uses the\xa0xBarScale\xa0function to calculate the x-coordinate of the line chart. The\xa0xBarScale\xa0function is a scale function that maps the x-axis values to the x-coordinates of the vertical bars in the chart. If the x-axis is a numeric axis, the function uses the\xa0xScale\xa0function to calculate the x-coordinate of the line chart. The\xa0xScale\xa0function is a scale function that maps the x-axis values to the x-coordinates of the chart."}),"\n",(0,a.jsx)(t.p,{children:"The\xa0y\xa0method uses a ternary operator to check if the data point should use the secondary y-axis or not. If the data point should use the secondary y-axis, the function uses the\xa0yScaleSecondary\xa0function to calculate the y-coordinate of the line chart. The\xa0yScaleSecondary\xa0function is a scale function that maps the y-axis values to the y-coordinates of the secondary y-axis. If the data point should not use the secondary y-axis, the function uses the\xa0yScale\xa0function to calculate the y-coordinate of the line chart. The\xa0yScale\xa0function is a scale function that maps the y-axis values to the y-coordinates of the chart."}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-selection:"}),"\xa0The\xa0d3-selection\xa0is a module from the d3 library that is used to select and manipulate DOM elements in the chart component. The\xa0d3-selection\xa0module provides several functions for selecting and manipulating DOM elements, including\xa0select, selectAll, append, attr, and style. The select function is used to select a single DOM element that matches a given selector. The\xa0selectAll\xa0function is used to select multiple DOM elements that match a given selector. The\xa0append\xa0function is used to append a new DOM element to a selected element. The\xa0attr\xa0function is used to set or get an attribute of a selected element. The\xa0style\xa0function is used to set or get a style property of a selected element."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-selection\xa0module is used to select and manipulate several DOM elements in the chart component. For example, the\xa0d3Selection.select\xa0function is used to select the\xa0xElement\xa0element, which is a reference to the SVG element that contains the x-axis."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-array:"}),"\xa0The\xa0d3-array\xa0is a module from the d3 library that is used to manipulate arrays of data in the chart component. The\xa0d3-array\xa0module provides several functions for manipulating arrays of data, including\xa0max, min, extent, sum, and mean. The\xa0max\xa0function is used to find the maximum value in an array of data. The\xa0min\xa0function is used to find the minimum value in an array of data. The\xa0extent\xa0function is used to find the minimum and maximum values in an array of data. The\xa0sum\xa0function is used to find the sum of the values in an array of data. The\xa0mean\xa0function is used to find the mean (average) of the values in an array of data."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-array\xa0module is used to manipulate the data array that represents the data points in the chart component. For example, the\xa0d3Array.max\xa0function is used to find the maximum value of the y-values in the data array, which is used to set the domain of the y-axis scale. The\xa0d3Array.min\xa0function is used to find the minimum value of the y-values in the data array, which is also used to set the domain of the y-axis scale."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-format:"}),"\xa0The\xa0d3-format\xa0is a module from the d3 library that is used to format numbers and strings in the chart component. The\xa0d3-format\xa0module provides several functions for formatting numbers and strings, including\xa0format, formatPrefix, precisionFixed, and precisionRound."]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0format\xa0function is used to format a number or string using a specified format string. The format string can include placeholders for the value, such as\xa0%\xa0for a percentage or\xa0,\xa0for a comma-separated number. The\xa0formatPrefix\xa0function is used to format a number using a prefix notation that rounds the value to a specified precision and appends a prefix, such as k for thousands or M for millions. The\xa0precisionFixed\xa0function is used to format a number using a fixed number of decimal places. The\xa0precisionRound\xa0function is used to format a number using a variable number of decimal places that is determined by the magnitude of the value."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn Vertical bar chart, the\xa0d3-format\xa0module is used to format the labels for the bars in the chart component. For example, the\xa0_renderBarLabel\xa0method uses the\xa0d3FormatPrefix\xa0function to format the value of the bar using a prefix notation that rounds the value to two decimal places if the value is less than\xa01000, or to one decimal place if the value is greater than or equal to\xa01000. The formatted value is then appended to the text element as its content."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"d3-axis:"}),"\xa0The\xa0d3-axis\xa0module is a part of the d3 library, which is a collection of JavaScript functions that are used for data visualization. The\xa0d3-axis\xa0module provides several functions for creating and manipulating axes, which are used to display the scales of a chart component."]}),"\n",(0,a.jsx)(t.p,{children:"In data visualization, axes are used to display the scales of a chart component, such as the x-axis and y-axis of a bar chart. Axes provide visual cues to help readers interpret the data values of a chart component, such as the range and domain of the data values."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0module provides several types of axes, including\xa0bottom, top, left, and right axes. Each type of axis has its own set of methods for customizing the axis and displaying the tick values."}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Application in Vertical bar chart:"}),"\nIn the Vertical stacked bar chart,\xa0d3-axis\xa0is used to create and render the x and y axes of the chart."]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0d3-axis\xa0library provides various methods for creating and rendering axes, such as\xa0axisBottom(),\xa0axisLeft(), and\xa0tickFormat(). In this case, the\xa0d3-axis\xa0library is used to create and render the x and y axes of the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"To create the x and y axes, the\xa0d3-axis\xa0library's\xa0axisBottom()\xa0and\xa0axisLeft()\xa0methods are used, respectively. These methods take a scale function as an argument and return a new axis function that can be used to render the axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The resulting x and y axis functions are then used to render the x and y axes of the chart. The\xa0call()\xa0method of the selection object is used to call the axis function and render the axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0tickFormat()\xa0method of the y-axis scale is also used to set the tick format function for the y-axis. This method takes the format function created using the\xa0d3-format\xa0library as an argument and sets it as the tick format function for the y-axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Dev Deisgn Details:"}),"\nFollowing are the major components that contribute towards creating a complete vertical bar chart:"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Axes:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getScales():"}),"\xa0This method is responsible for generating the x and y scales that are used to map the data points to the chart dimensions. The scales are generated using the\xa0d3-scale\xa0library, which provides several scale types for different types of data."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight: a number representing the height of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: a number representing the width of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"isNumericScale: a boolean value indicating whether the x-axis scale is numeric or not."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getScales\xa0method takes several arguments, including\xa0containerHeight,\xa0containerWidth, and\xa0isNumericScale. These arguments are used to define the dimensions of the chart and to determine whether the x-axis is a numeric or categorical axis."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a numeric axis, the method uses the\xa0d3ScaleLinear\xa0function to create a linear scale for the x-axis. It first calculates the maximum and minimum x-values in the data using the\xa0d3Max\xa0and\xa0d3Min\xa0functions, respectively. It then creates a linear scale that maps the x-values to the chart dimensions using the domain and range methods. The nice method is also called on the x-axis scale to ensure that the tick values are rounded to the nearest integer."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a categorical axis, the method uses the\xa0d3ScaleBand\xa0function to create a band scale for the x-axis. It first extracts the x-axis labels from the data and uses them to define the domain of the scale. It then creates a band scale that maps the x-axis labels to the chart dimensions using the domain and range methods. The\xa0paddingInner\xa0method is also called on the x-axis scale to ensure that there is some space between the bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"For the y-axis, the method always uses the\xa0d3ScaleLinear\xa0function to create a linear scale that maps the y-values to the chart dimensions. It first defines the domain of the scale as\xa0[0, this._yMax], where\xa0_yMax\xa0is the maximum y-value in the data. It then defines the range of the scale as\xa0[0, containerHeight - this.margins.bottom! - this.margins.top!], where\xa0containerHeight\xa0is the height of the chart container and\xa0this.margins.bottom!\xa0and\xa0this.margins.top!\xa0are the bottom and top margins of the chart, respectively."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the method returns an object that contains the x and y scales for the chart. The x and y scales are returned as separate properties of the object."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getDomainMargins():"}),"\xa0This method is responsible for calculating the margins for the chart based on the available container width and the number of x-axis labels. The margins are used to center the chart and to ensure that the bars are evenly spaced."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0which is a number representing the width of the container in which the chart is being rendered."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_getDomainMargins\xa0method takes one argument,\xa0containerWidth, which is the width of the container that the chart is rendered in. It first checks whether the x-axis is a numeric axis or a categorical axis. If the x-axis is a categorical axis, the method returns the margins defined in the margins prop."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the x-axis is a numeric axis, the method calculates the total width available to render the bars by subtracting the left and right margins and the minimum domain margin from the container width. It then calculates the required width to render the bars based on the number of x-axis labels and the bar width. If the total width is greater than or equal to the required width, the method centers the chart by setting equal left and right margins for the domain. If the total width is less than the required width, the method calculates the maximum possible bar width to maintain a 2:1 spacing between the bars."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then sets the\xa0_domainMargin\xa0and\xa0_barWidth\xa0properties of the component based on the calculated margins and bar width. It returns an object that contains the updated margins, with the left and right margins increased by the\xa0_domainMargin\xa0value."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createNumericXAxis():"}),"\xa0This function is responsible for creating a numeric x-axis for a chart component. The function takes two arguments:\xa0xAxisParams\xa0and\xa0chartType.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0showRoundOffXTickValues,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisCount, and\xa0xAxisElement.\xa0chartType\xa0is an enumeration that specifies the type of chart component."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["xAxisParams\xa0of type\xa0IXAxisParams\xa0which is an object containing the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"domainNRangeValues\xa0of type\xa0IDomainNRange\xa0which is an object containing the domain and range values for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"showRoundOffXTickValues\xa0of type\xa0boolean\xa0which is an optional property that determines whether to round off the x-axis tick values."}),"\n",(0,a.jsx)(t.li,{children:"xAxistickSize\xa0of type\xa0number\xa0which is an optional property that determines the size of the x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding\xa0of type\xa0number\xa0which is an optional property that determines the padding between the x-axis ticks and the x-axis labels."}),"\n",(0,a.jsx)(t.li,{children:"xAxisCount\xa0of type\xa0number\xa0which is an optional property that determines the number of x-axis ticks."}),"\n",(0,a.jsx)(t.li,{children:"xAxisElement\xa0of type\xa0SVGElement | null\xa0which is an optional property that represents the x-axis element."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"chartType\xa0of type\xa0ChartTypes\xa0which is an enum that represents the type of chart."}),"\n",(0,a.jsx)(t.li,{children:"culture\xa0of type string which is an optional paramter represents the locale into which the numeric x-axis labels will be localized."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0showRoundOffXTickValues\xa0property is a boolean that specifies whether to round off the tick values of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxisElement\xa0property is a reference to the DOM node that contains the x-axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a linear scale for the x-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. If the\xa0showRoundOffXTickValues\xa0property is\xa0true, the\xa0nice\xa0method is called on the scale to round off the tick values of the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function computes the tick values of the x-axis using the\xa0ticks\xa0and\xa0tickFormat\xa0methods of the scale, and returns an object that contains the x-axis scale and the tick values."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"createStringXAxis():"}),"\xa0This function is responsible for creating a string x-axis for a chart component. The function takes four arguments:\xa0xAxisParams,\xa0tickParams,\xa0dataset, and\xa0culture.\xa0xAxisParams\xa0is an object that contains several properties, including\xa0domainNRangeValues,\xa0xAxisCount,\xa0xAxistickSize,\xa0tickPadding,\xa0xAxisPadding,\xa0xAxisInnerPadding, and\xa0xAxisOuterPadding.\xa0tickParams\xa0is an object that contains several properties, including\xa0tickValues\xa0and\xa0tickFormat.\xa0dataset\xa0is an array of strings that contains the values of the x-axis.\xa0culture\xa0is a string that specifies the locale into which the x-axis labels can be localized."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function Arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xAxisParams: An object containing the parameters for the x-axis, including the domain and range values, tick size, tick padding, number of ticks, padding for the inner and outer edges of the axis, and the element to render the axis."}),"\n",(0,a.jsx)(t.li,{children:"tickParams: An object containing the parameters for the ticks on the x-axis, including the tick values and tick format."}),"\n",(0,a.jsx)(t.li,{children:"dataset: An array of strings representing the data points for the x-axis."}),"\n",(0,a.jsx)(t.li,{children:"culture: An optional string representing the culture to use for formatting the tick labels on the x-axis. However, the localization works only if the string can be converted to a numeric value. Otherwise, the x-axis labels remain unlocalized."}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the properties of the\xa0xAxisParams\xa0object using destructuring. The\xa0domainNRangeValues\xa0property is an object that contains the start and end values of the domain and range of the x-axis. The\xa0xAxisCount\xa0property is a number that specifies the number of ticks of the x-axis. The\xa0xAxistickSize\xa0property is a number that specifies the size of the ticks of the x-axis. The\xa0tickPadding\xa0property is a number that specifies the padding between the ticks and the labels of the x-axis. The\xa0xAxisPadding\xa0property is a number that specifies the padding between the bars of the chart. The\xa0xAxisInnerPadding\xa0property is a number that specifies the inner padding between the bars of the chart. The\xa0xAxisOuterPadding\xa0property is a number that specifies the outer padding between the bars of the chart."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates a band scale for the x-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0module. The scale is customized using the\xa0domain\xa0and\xa0range\xa0methods, which set the domain and range of the scale, respectively. The\xa0paddingInner\xa0and\xa0paddingOuter\xa0methods are used to set the inner and outer padding between the bars of the chart, respectively."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates a bottom axis for the x-axis using the\xa0d3AxisBottom\xa0function from the\xa0d3-axis\xa0module. The axis is customized using the\xa0tickSize,\xa0tickPadding,\xa0ticks, and\xa0tickFormat\xa0methods. The\xa0tickSize\xa0method sets the size of the ticks of the x-axis. The\xa0tickPadding\xa0method sets the padding between the ticks and the labels of the x-axis. The\xa0ticks\xa0method sets the number of ticks of the x-axis. The\xa0tickFormat\xa0method formats the tick values of the x-axis using the\xa0convertToLocaleString\xa0function and the\xa0culture\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"If the\xa0xAxisParams.xAxisElement\xa0property is not\xa0null, the axis is rendered on the DOM node using the\xa0call\xa0method of the\xa0d3-selection\xa0module. The\xa0selectAll\xa0method is called on the axis to select all the text elements of the x-axis, and the\xa0attr\xa0method is called to set the\xa0aria-hidden\xa0attribute of the text elements to\xa0true."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function computes the tick values of the x-axis using the\xa0tickFormat\xa0method of the axis, and returns an object that contains the x-axis scale and the tick values."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createYAxis\xa0function is responsible for creating the y-axis using the\xa0createYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams,\xa0isRtl,\xa0axisData, and\xa0useSecondaryYScale. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["yAxisParams: An object that contains various parameters related to the y-axis of the chart. It has the following properties:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yMinMaxValues: An object that contains the start and end values of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yAxisElement: The DOM element that represents the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMaxValue: The maximum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"yMinValue: The minimum value of the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container that holds the chart."}),"\n",(0,a.jsx)(t.li,{children:"margins: An object that contains the margins of the chart."}),"\n",(0,a.jsx)(t.li,{children:"tickPadding: The padding between the ticks and the axis line."}),"\n",(0,a.jsx)(t.li,{children:"maxOfYVal: The maximum value of the y-axis for area chart and Grouped vertical bar chart."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickFormat: The format of the y-axis tick labels."}),"\n",(0,a.jsx)(t.li,{children:"yAxisTickCount: The number of ticks on the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"eventAnnotationProps: An object that contains the properties of the event annotation."}),"\n",(0,a.jsx)(t.li,{children:"eventLabelHeight: The height of the event label."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n",(0,a.jsx)(t.li,{children:"axisData: An object that contains the data related to the axis of the chart."}),"\n",(0,a.jsx)(t.li,{children:"useSecondaryYScale: A boolean value that indicates whether to use a secondary y-axis scale."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0yMinMaxValues, yAxisElement, containerHeight, and containerWidth. It then calculates the final maximum and minimum values for the y-axis, based on the\xa0maxOfYVal, yMaxValue, and yMinValue\xa0parameters."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then prepares the datapoints for the y-axis using the\xa0prepareDatapoints\xa0function, which calculates the tick values based on the maximum and minimum values of the y-axis. It then creates a linear scale for the y-axis using the\xa0d3ScaleLinear\xa0function from the\xa0d3-scale\xa0library."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl and useSecondaryYScale\xa0parameters. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the function uses the d3Select function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the call method. It also sets the aria-hidden attribute of the y-axis text elements to true to improve accessibility."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"createStringYAxis():"}),"\xa0In the Vertical bar chart component, the\xa0d3-axis\xa0module is used to create and customize the y-axis of a vertical bar chart. The\xa0createStringYAxis\xa0function is responsible for creating the y-axis that use string values for the y-axis using the\xa0createStringYAxisForOtherCharts\xa0function. The function takes in several parameters, including\xa0yAxisParams, dataPoints, and isRtl. These parameters are used to customize the y-axis, such as setting the tick values, tick format, and tick padding."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"yAxisParams: An object that contains the parameters for the y-axis, including\xa0containerHeight,\xa0tickPadding,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding."}),"\n",(0,a.jsx)(t.li,{children:"dataPoints: An array of strings that represent the data points for the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"isRtl: A boolean value that indicates whether the chart is in right-to-left mode."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first extracts the necessary parameters from the\xa0yAxisParams\xa0object, such as the\xa0containerHeight,\xa0margins,\xa0yAxisTickFormat,\xa0yAxisElement, and\xa0yAxisPadding. It then creates a band scale for the y-axis using the\xa0d3ScaleBand\xa0function from the\xa0d3-scale\xa0library."}),"\n",(0,a.jsx)(t.li,{children:"The band scale is defined using the\xa0dataPoints\xa0array as the domain, and the\xa0containerHeight\xa0and\xa0margins\xa0parameters as the range. The\xa0padding\xa0method is used to set the padding between the bands in the y-axis."}),"\n",(0,a.jsx)(t.li,{children:"The function then creates the y-axis using the\xa0d3AxisLeft\xa0or\xa0d3AxisRight\xa0function from the\xa0d3-axis\xa0library, depending on the\xa0isRtl\xa0parameter. It sets the tick padding, tick values, and tick size for the y-axis, and formats the tick labels using the\xa0yAxisTickFormat\xa0parameter."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function uses the\xa0d3Select\xa0function to select the\xa0yAxisElement\xa0and apply the y-axis to it using the\xa0call\xa0method. It also selects all the text elements of the y-axis and returns the y-axis scale."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bars:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Numeric bars (_createNumericBars()):"}),"\xa0This method is responsible for generating the vertical bars for the chart when the x-axis is a numeric axis. The bars are generated using the d3 library, which provides several functions for creating and manipulating SVG elements."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight\xa0- a number representing the height of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0- a number representing the width of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"xElement\xa0- an SVGElement representing the x-axis element of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The\xa0_createNumericBars\xa0method takes several arguments, including\xa0containerHeight, containerWidth, and xElement. These arguments are used to define the dimensions of the chart and to create the x-axis scale."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method first extracts several props from the props object, including\xa0useSingleColor, which determines whether all bars should be the same color, and\xa0xBarScale\xa0and\xa0yBarScale, which are the x and y scales for the chart. It also creates a color scale using the\xa0_createColors\xa0method, which generates a range of colors based on the number of data points."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then iterates over each data point in the\xa0_points\xa0array and generates a vertical bar for each point. It first checks whether the bar should be highlighted based on the legend or whether any legend is highlighted. It then generates a class name for the bar using the\xa0getClassNames\xa0function, which applies styles based on the theme and whether the bar should be highlighted."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The height of the bar is determined by the\xa0yBarScale\xa0function, which maps the y-value of the data point to the chart dimensions. If the height of the bar is less than 1, the method returns an empty\xa0React.Fragment\xa0element."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"The method then calculates the x and y positions of the bar using the\xa0xBarScale\xa0and\xa0yBarScale\xa0functions, respectively. It generates a rect element for the bar and sets its attributes, including the\xa0x, y, width, height, and fill\xa0attributes. It also sets several event handlers for the bar, including\xa0onClick, onMouseOver, onMouseLeave, onFocus, and onBlur, which are used to display the callout and tooltip for the bar."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Finally, the method returns an array of\xa0g\xa0elements that contain the\xa0rect\xa0elements for each bar. It also removes any unwanted tooltip\xa0divs\xa0from the DOM and displays the tooltip at the x-axis labels if the\xa0showXAxisLablesTooltip\xa0prop is set to\xa0true."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"String bars (_createStringBars()):"}),"\xa0This method is responsible for generating the vertical bars for the chart when the x-axis is a categorical axis. The bars are generated using the d3 library, which provides several functions for creating and manipulating SVG elements."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"containerHeight\xa0(number): The height of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth\xa0(number): The width of the container in which the chart is rendered."}),"\n",(0,a.jsx)(t.li,{children:"xElement\xa0(SVGElement): The SVG element that represents the x-axis of the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_createStringBars\xa0method takes several arguments, including\xa0containerHeight, containerWidth, and xElement. These arguments are used to define the dimensions of the chart and to create the x-axis scale."}),"\n",(0,a.jsx)(t.li,{children:"The method first extracts several props from the props object, including\xa0xBarScale\xa0and\xa0yBarScale, which are the x and y scales for the chart, and\xa0colorScale, which is a color scale generated using the\xa0_createColors\xa0method. It also generates a\xa0React.Fragment\xa0element for any bars that have a height less than 1."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the\xa0_points\xa0array and generates a vertical bar for each point. It first calculates the height of the bar using the\xa0yBarScale\xa0function, which maps the y-value of the data point to the chart dimensions. If the height of the bar is less than 1, the method returns an empty\xa0React.Fragment\xa0element."}),"\n",(0,a.jsx)(t.li,{children:"The method then calculates the x and y positions of the bar using the\xa0xBarScale\xa0and\xa0yBarScale\xa0functions, respectively. It generates a rect element for the bar and sets its attributes, including the\xa0x, y, width, height, and fill\xa0attributes. It also sets several event handlers for the bar, including\xa0onClick, onMouseOver, onMouseLeave, onFocus, and onBlur, which are used to display the callout and tooltip for the bar."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns an array of\xa0g\xa0elements that contain the\xa0rect\xa0elements for each bar. It also removes any unwanted tooltip\xa0divs\xa0from the DOM and displays the tooltip at the x-axis labels if the\xa0showXAxisLablesTooltip\xa0prop is set to\xa0true."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Lines:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_createLine():"}),"\xa0This method is responsible for creating a line chart that can be overlaid on top of the vertical bar chart. The line chart is created using the\xa0d3.line\xa0function, which generates a path element based on an array of data points."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"xScale: A scale function that maps values from the x domain to the x range."}),"\n",(0,a.jsx)(t.li,{children:"yScale: A scale function that maps values from the y domain to the y range."}),"\n",(0,a.jsx)(t.li,{children:"containerHeight: The height of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"containerWidth: The width of the container element that the chart is rendered in."}),"\n",(0,a.jsx)(t.li,{children:"yScaleSecondary: An optional scale function that maps values from the secondary y domain to the secondary y range. This is used when the chart has a secondary y axis."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_createLine\xa0method takes several arguments, including\xa0xScale, yScale, containerHeight, containerWidth, and yScaleSecondary. These arguments are used to define the scales and dimensions of the chart, as well as to extract the data needed to create the line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method first checks whether the x-axis is a numeric axis or a categorical axis, and then creates the necessary scales and color scales based on this information. It then extracts the data points from the data prop that have a\xa0lineData\xa0property, which contains the y-value for each point on the line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then creates a\xa0linePath\xa0function using the\xa0d3.line\xa0function, which maps the x and y values of each data point to the chart dimensions using the\xa0xScale\xa0and\xa0yScale\xa0functions. If a\xa0yScaleSecondary\xa0function is provided, it is used instead of\xa0yScale\xa0for data points that have a\xa0useSecondaryYScale\xa0property set to true."}),"\n",(0,a.jsx)(t.li,{children:"The method then creates a line array that contains two path elements: one for the line itself, and one for the line border. The line element has a stroke color that is set to the\xa0lineLegendColor\xa0prop, which defaults to yellow. The\xa0lineBorder\xa0element has a white stroke color and a width that is determined by the\xa0lineBorderWidth\xa0prop."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method creates a dots array that contains a circle element for each data point on the line chart. These circles have a white fill color and a stroke color that matches the\xa0lineLegendColor\xa0prop. They also have a visibility property that is set to show if the data point is currently active and hide otherwise."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Legends:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_getLegendData():"}),"\xa0This method is responsible for generating the legend for the chart, which displays the color and label for each data point on the chart. The legend is generated using the Legends component, which is a reusable component that displays a list of legends with customizable styles and behaviors."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Function arguments:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"data: an array of\xa0IVerticalBarChartDataPoint\xa0objects, which contain the data points for the chart."}),"\n",(0,a.jsx)(t.li,{children:"palette: an object of type\xa0IPalette, which contains the color palette to be used for the chart."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getLegendData\xa0method takes two arguments,\xa0data and palette, which are arrays of data points and a color palette, respectively. It also extracts several props from the props object, including\xa0theme, useSingleColor, lineLegendText, and lineLegendColor. These props are used to determine the color and label for each legend item."}),"\n",(0,a.jsx)(t.li,{children:"The method then iterates over each data point in the data array and generates a legend item for each point. It first calculates the color of the legend item using the color property of the data point, or by generating a new color using the\xa0_createColors\xa0method if no color is defined. It then creates a new object called legend that contains the title, color, and several event handlers for the legend item. These event handlers are used to handle mouse events on the legend item, such as clicking, hovering, and leaving."}),"\n",(0,a.jsx)(t.li,{children:"The method then adds the legend object to an array called actions, which is used to store all of the legend items for the chart. If the chart includes a line chart and the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props are defined, the method adds a new legend item to the beginning of the actions array that represents the line chart. This legend item includes the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props, as well as an additional property called\xa0isLineLegendInBarChart, which is used to style the legend item differently from the other legend items."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns a\xa0Legends\xa0component that displays the legend items in a list. The\xa0Legends\xa0component takes several props that are used to customize the styles and behaviors of the legend items, including\xa0enabledWrapLines, overflowProps, focusZonePropsInHoverCard, and overflowText."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Callouts:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"_getCalloutContentForLineAndBar():"}),"\xa0This method is responsible for generating the content that is displayed in the callout when the user hovers over a data point on the chart. The callout content includes the y-values for both the vertical bar and the line chart, as well as any associated callout data."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0_getCalloutContentForLineAndBar\xa0method takes a single argument, point, which is an object that contains the x and y values for the data point that the user is hovering over. The method first initializes an empty array called\xa0YValueHover, which will be used to store the y-values and callout data for the vertical bar and line chart."}),"\n",(0,a.jsx)(t.li,{children:"The method then extracts several props from the props object, including data,\xa0lineLegendText, and\xa0lineLegendColor. It uses these props to filter the data array and find the data point that matches the x-value of the hovered point. If the chart includes a line chart and the selected data point has a\xa0lineData\xa0property with a defined y-value, the method adds a new object to the\xa0YValueHover\xa0array that contains the y-value and callout data for the line chart. This object also includes the legend text and color for the line chart, which are defined by the\xa0lineLegendText\xa0and\xa0lineLegendColor\xa0props."}),"\n",(0,a.jsx)(t.li,{children:"The method then adds a second object to the\xa0YValueHover\xa0array that contains the y-value and callout data for the vertical bar. This object includes the legend text, y-value, and color for the vertical bar, as well as any associated callout data. The color of the vertical bar is determined by the color property of the selected data point, or by generating a new color using the\xa0_createColors\xa0method if no color is defined."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the method returns an object that contains the\xa0YValueHover\xa0array and the x-value of the hovered point. The x-value is determined by the\xa0xAxisCalloutData\xa0property of the selected data point, or by using the x-value of the point if no\xa0xAxisCalloutData\xa0is defined."}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Bar labels:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"_renderBarLabel():"}),"\xa0This method is responsible for rendering the labels for the bars in the chart component. The method takes three arguments:\xa0xPoint, yPoint, and barValue.\xa0xPoint\xa0and\xa0yPoint\xa0are the x and y positions of the bar, respectively, and\xa0barValue\xa0is the value of the bar."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The method first checks if the\xa0hideLabels\xa0prop is set to true or if the width of the bar is less than\xa016 pixels. If either of these conditions is\xa0true, the method returns\xa0null, which means that no label is rendered for the bar."}),"\n",(0,a.jsx)(t.li,{children:"If the\xa0hideLabels\xa0prop is false and the width of the bar is greater than or equal to\xa016 pixels, the method returns a text element that represents the label for the bar. The\xa0text\xa0element is positioned at the center of the bar using the\xa0xPoint\xa0and\xa0yPoint\xa0arguments. The\xa0textAnchor\xa0attribute is set to middle, which centers the text horizontally. The\xa0className\xa0attribute is set to a CSS class that is used to style the label. The\xa0aria-hidden\xa0attribute is set to true, which means that the label is hidden from screen readers."}),"\n",(0,a.jsx)(t.li,{children:"The content of the\xa0text\xa0element is generated using the\xa0d3FormatPrefix\xa0function from the\xa0d3-format\xa0module. The\xa0d3FormatPrefix\xa0function formats the\xa0barValue\xa0argument using a prefix notation that rounds the value to two decimal places if the value is less than\xa01000, or to one decimal place if the value is greater than or equal to\xa01000. The formatted value is then appended to the text element as its content."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Ticks:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Rotated x-axis ticks (rotateXAxisLabels()):"}),"\xa0This function is responsible for rotating the labels of the x-axis of a chart component. The function takes an object called\xa0rotateLabelProps\xa0as an argument, which contains two properties:\xa0node\xa0and\xa0xAxis.\xa0node\xa0is a reference to the DOM node that contains the chart component, and\xa0xAxis\xa0is a reference to the x-axis of the chart."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Working algorithm:"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"The function first checks if either\xa0node\xa0or\xa0xAxis\xa0is\xa0null."}),"\n",(0,a.jsx)(t.li,{children:"If either of these values is\xa0null, the function returns\xa0undefined, which means that no rotation is performed."}),"\n",(0,a.jsx)(t.li,{children:"The function then initializes a variable called\xa0maxHeight\xa0to 0 and an array called\xa0xAxisTranslations\xa0to store the x-axis translations. It uses\xa0d3Select\xa0to select the chart node and call the x-axis function. It then selects all the tick elements and loops through them. For each tick element, the function checks whether it has already been rotated. If it hasn't, the function extracts the x-axis translation value and pushes it to the\xa0xAxisTranslations\xa0array. The function then sets the\xa0transform\xa0attribute of the tick element to translate it by the x-axis translation value and rotate it by\xa0-45\xa0degrees. The function also computes the height of the tick element and stores it in the\xa0maxHeight\xa0variable if it's greater than the current\xa0maxHeight."}),"\n",(0,a.jsx)(t.li,{children:"The function then loops through the tick elements again and sets their\xa0transform\xa0attribute to translate them by the corresponding x-axis translation value, translate them vertically by half of the\xa0maxHeight, and rotate them by\xa0-45\xa0degrees."}),"\n",(0,a.jsx)(t.li,{children:"Finally, the function returns the vertical height of the labels by computing\xa0maxHeight/tanInverse(45)."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Rendering details"}),"\nThe Vertical bar chart uses d3 SVG based rendering, which follows the following render cycles:","\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"- Invocation cycle: Vertical bar Chart -> Cartesian base chart -> X-axis -> X-axis labels -> Y-axis -> Y-axis labels -> bars, legends, callouts\n- Rendering cycle: Vertical bar chart <- Bars (rect), lines (d3.line), Legends, Callouts <- Axes (d3.axis, d3.scale)\n"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Following are the detailed steps:"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"The\xa0VerticalBarChart\xa0component renders a vertical bar chart with optional line chart overlay. The chart is rendered using D3.js and SVG elements. The chart can be customized with various props, including data points, axis labels, legend, colors, and more."}),"\n",(0,a.jsx)(t.li,{children:"The chart is rendered within an SVG element with a specified width and height. The chart is composed of several elements, including the x-axis, y-axis, bars, and line chart. The x-axis and y-axis are rendered using D3.js axis functions, and the bars and line chart are rendered using D3.js scales and data binding."}),"\n",(0,a.jsx)(t.li,{children:"The chart data is passed in as an array of\xa0IVerticalBarChartDataPoint\xa0objects, which contain x and y values, a legend label, and an optional color. The chart can also display a line chart overlay, which is passed in as an array of\xa0IVerticalBarChartDataPoint\xa0objects with an additional\xa0lineData\xa0property."}),"\n",(0,a.jsx)(t.li,{children:"The legend is rendered using the\xa0Legends\xa0component, which is passed an array of\xa0ILegend\xa0objects. The chart can also display callout labels for each bar, which are rendered using SVG\xa0text\xa0elements."}),"\n",(0,a.jsx)(t.li,{children:"The chart can be customized with various props, including\xa0barWidth,\xa0colors,\xa0theme,\xa0lineLegendText,\xa0yAxisTickCount, and more. The chart also supports accessibility features, including aria labels and keyboard navigation."}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Error scenarios"}),"\nThe Vertical bar chart handles the following error scenario:"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Empty data: If the data passed to the chart component is empty, the chart will not render and a message will be narrated to the user.\xa0_isChartEmpty\xa0functions handles that scenario."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Localization aspects"}),"\nThe component has a\xa0culture\xa0prop, which is used to set the culture for the chart. This prop is used to format the x-axis labels and the callout values based on the specified culture. Currently, vertical bar chart provides localization only for the x-axis ticks if they are numbers."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Testing"}),"\nThe manual and component tests for Vertical bar chart has been completed and unit testing are in progress. Following is the current code coverage for Vertical bar chart:"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"VerticalBarChart3.png",src:n(2521).Z+"",width:"2475",height:"537"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Component Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7435",children:"7435"})]}),"\n",(0,a.jsxs)(t.li,{children:["Test plan:\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/blob/master/packages/react-charting/docs/TestPlans/VerticalBarChart/ComponentTests.md",children:"https://github.com/microsoft/fluentui/blob/master/packages/react-charting/docs/TestPlans/VerticalBarChart/ComponentTests.md"}),"\xa0"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Unit Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7436",children:"7436"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Manual Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/8604",children:"8604"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["Accessibility Tests:","\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Work item ",(0,a.jsx)(t.a,{href:"https://uifabric.visualstudio.com/iss/_workitems/edit/7434",children:"7434"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Accessibility"}),"\nVertical bar chart is tested for fast pass accessibility.\nLink to the ",(0,a.jsx)(t.a,{href:"https://accessibilityinsights.io/docs/web/getstarted/fastpass/",children:"FAST pass tool"}),"\nOur charts have elaborate accessibility support. The charts are WCAG 2.1 MAS C compliant for accessibility.\nConsumers can define their own aria labels for each point by setting the\xa0callOutAccessibilityData\xa0property."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Theming"}),'\nThe palette for vertical bar chart is set from the "theme" prop as passed to the component during rendering. Both light and dark themes are supported and users can create there own theme too.\xa0',(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Ref6"}),"\xa0\xa0and\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"Ref7"}),"\xa0\xa0explains theming in detail."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Debugging"}),"\nThe detailed steps on debugging has been given in\xa0",(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui-charting-contrib/blob/main/docs/Debugging.md",children:"Debugging"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Variants"}),"\nFollowing are the variants of vertical bar chart:\xa0",(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart",children:"Ref8"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Basic Vertical bar Chart"}),": Only basic props are provided."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Dynamic Vertical bar Chart"}),": The data and bar colors can change."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Callout"}),": Can show customized callout data."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Custom Accessibility"}),": Providing custom aria labels."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Styled"}),": Can show bars with a single color w/o line."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Rotated labels"}),": Can show labels rotated in -45 degrees."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Tooltip"}),": Can show tooltip over x-axis ticks when the ticks are truncated."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Interaction"}),"\nFollowing are the interactions that are allowed for vertical bar chart:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Mouse Events"}),":\na. Hover mouse over a bar, should call the corresponding handler and show the callout over that bar.\nb. On mouse move on Bar 1 (step 1) -> mouse leave (step 2) -> mouse move on Bar 2 (step 3), should render the callout of the Bar 2.\nc. On mouse over, callout should be defined, on mouse leave, callout should disappear.\nd. On mouse over on legends, should highlight the corresponding bar/line.\nf. On click on Bar, should highlight the corresponding bar.\ng. On mouse out after mouse over on first legend, should have opacity 0.1 for second bar initially (during mouseOver on first legend) and opacity set to 1 for both the bars on mouse out."]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.em,{children:"Keyboard Events"}),":\na. On focus on a bar, should render the corresponding callout.\nb. On focus on a line, should highlight the corresponding line and its legend."]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Some notable PRs and their brief description"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/4954",children:"Adding the Vertical bar chart main component"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/commit/562ce21022cb4b5b33309a37712965909c7d15bd",children:"Refactoring Vertical Bar Chart via implementation of Cartesian charts"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/28013",children:"Adding Tests for Vertical Bar Chart using React Testing Library"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/19074",children:"Accessibility change for Vertical Bar Chart"})}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.strong,{children:"Learnings"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"While implementing the tests using react testing library, it was found that certain browser functions like\xa0getComputedTextLength()\xa0cannot be unit tested and needs to be tested End-to-End only."}),"\n",(0,a.jsx)(t.li,{children:"Order of imports are important.\nFor example: for Vertical bar charts tests, improper sequencing of the imports (data first and then render) results in incorrect and incopmlete rendering of charts:"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:" - import { chartPoints } from '../VerticalBarChart/VerticalBarChart.test';\n - import { render, screen, queryAllByAttribute, fireEvent, act } from '@testing- \n - library/react';\n"})}),"\n",(0,a.jsx)(t.p,{children:"However, the following results in correct rendering:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"import { render, screen, queryAllByAttribute } from '@testing-library/react';\n\nimport { chartPoints } from './VerticalBarChart.test';\n"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Certain props need async await structure (waitFor in react testing library) for different props or nested SVGs to render."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Known issues"})}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Setting the margins externally via the props may cut the x and y ticks if the margins provided are very less. Setting a minimum margin would prevent any such distortions."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Future improvements"})}),"\n",(0,a.jsx)(t.p,{children:"Following are the list of future improvements for the vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Improved accessibility: While the component already provides accessibility data for screen readers, there is always room for improvement in this area. Adding support for keyboard navigation and improving the accessibility of the callout would make the component more accessible to users with disabilities."}),"\n",(0,a.jsx)(t.li,{children:"Support for animations: Adding support for animations, such as transitions between data updates or hover effects, would make the component more visually appealing and engaging for users."}),"\n",(0,a.jsxs)(t.li,{children:["Following error handling scenarios can be improved:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Invalid or missing chart dimensions: If the dimensions of the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing axis parameters: If the parameters for the x-axis or y-axis are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing legends: If the legends for the chart are invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid bar width: If the bar width for the chart is invalid, the chart will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing data for callout: If the data for the callout is invalid or missing, the callout will not render and a message will be displayed to the user."}),"\n",(0,a.jsx)(t.li,{children:"Invalid or missing accessibility data: If the accessibility data for the chart is invalid or missing, the chart will not render and a message will be displayed to the user."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:"Localization support can be improved for all strings and numbers."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Design figma"}),"\nVertical bar Chart Figma:\xa0",(0,a.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-80245&mode=design&t=eFKlPGUixdgy9xRs-0",children:"Link"}),"\xa0"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Performance"})}),"\n",(0,a.jsx)(t.p,{children:"The performance aspect of a donut chart refers to how efficiently and effectively it conveys information to the viewer. Here are some key considerations regarding the performance of a line chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Data Visualization Efficiency"}),"\n",(0,a.jsx)(t.li,{children:"Clarity and Simplicity"}),"\n",(0,a.jsx)(t.li,{children:"Responsiveness"}),"\n",(0,a.jsx)(t.li,{children:"Handling Large Datasets"}),"\n",(0,a.jsx)(t.li,{children:"Interactive Features"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"We use Lighthouse tool for measuring the performance of our charts. Following are few of the scenarios for which we measure the performance score for vertical bar chart:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.strong,{children:"References"})}),"\n"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["D3-scale:","\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-scale/blob/main/README.md",children:"Link 1"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://d3js.org/d3-scale",children:"Link 2"})}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-shape/blob/main/README.md",children:"D3-shape"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-selection/blob/main/README.md",children:"D3-selection"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-array/blob/main/README.md",children:"D3-array"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/d3/d3-axis/blob/main/README.md",children:"D3-axis"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/How-to-apply-theme-to-Fluent-UI-React-components",children:"How to apply theme"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Theming",children:"Theming"})}),"\n",(0,a.jsx)(t.li,{children:(0,a.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/verticalbarchart",children:"Vertical Bar Chart"})}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Appendix:"})}),"\n",(0,a.jsx)(t.p,{children:"The mathematical formulae used in the Vertical bar chart component are as follows:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the y scale using d3ScaleLinear:\n",(0,a.jsx)(t.img,{alt:"VBC_f1.png",src:n(8395).Z+"",width:"1566",height:"146"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Formula for calculating the x scale using d3ScaleBand:"}),"\n",(0,a.jsxs)(t.p,{children:["Numeric scale:\n",(0,a.jsx)(t.img,{alt:"VBC_f2.png",src:n(2055).Z+"",width:"1683",height:"353"})]}),"\n",(0,a.jsxs)(t.p,{children:["String scale:\n",(0,a.jsx)(t.img,{alt:"VBC_f3.png",src:n(7493).Z+"",width:"1827",height:"353"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the width of each bar:\n",(0,a.jsx)(t.img,{alt:"VBC_f4.png",src:n(2624).Z+"",width:"1154",height:"58"})]}),"\n",(0,a.jsx)(t.p,{children:"In order to maintain 2:1 spacing barWidth is replaced by the maxBandWidth."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the total width required to render the bars:\n",(0,a.jsx)(t.img,{alt:"VBC_f5.png",src:n(8874).Z+"",width:"1730",height:"122"})]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"MIN_DOMAIN_MARGIN = 8\n"})}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the maximum possible bar width to maintain 2:1 spacing:\n",(0,a.jsx)(t.img,{alt:"VBC_f6.png",src:n(3443).Z+"",width:"1832",height:"81"})]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Formula for calculating the domain margin\n",(0,a.jsx)(t.img,{alt:"VBC_f7.png",src:n(5e3).Z+"",width:"1454",height:"111"})]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"_domainMarging = MIN_DOMAIN_MARGIN\nMIN_DOMAIN_MARGIN = 8\n\nTo center align the chart by setting equal left and right margins for domain:\n"})}),"\n"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},5387:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC1-bb6595c22f4de60c6aebc16359482663.png"},2362:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC2-8ab8b2b71a752a09e6160710baaab17a.png"},2521:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC3-0446d2d3c1c321827e398d8ecd1c9057.png"},8395:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f1-86ad6759ab4ed50b9f22c761d9645973.png"},2055:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f2-2d56c3cf1651669a96c6ba1570f477df.png"},7493:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f3-30c3db0ac6ae137e267c52d6b3a43746.png"},2624:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f4-ffb3da2424b492b04995aab01fb70afa.png"},8874:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f5-5815e87496c11f471d243c808a86a082.png"},3443:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f6-12092fc4a1cd14cd8196d102472960ab.png"},5e3:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/VBC_f7-78ec7172b86cb7cd832f6025adad8fef.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>h,a:()=>r});var a=n(7294);const i={},s=a.createContext(i);function r(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c3c7f6c.4099e1b2.js b/assets/js/4c3c7f6c.4099e1b2.js new file mode 100644 index 0000000000..49753b41c2 --- /dev/null +++ b/assets/js/4c3c7f6c.4099e1b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[9368],{7812:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>h});var s=n(5893),i=n(1151);const r={},a="Horizontal Bar Chart",o={id:"Charting-Concepts/HorizontalBarChart",title:"Horizontal Bar Chart",description:"A horizontal bar chart is a chart that presents categorical data with rectangular bars with lengths proportional to the values they represent. This type of chart is particularly useful when the intention is to show comparisons among different categories and the labels for those categories are long.",source:"@site/../../docs/Charting-Concepts/HorizontalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/HorizontalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HorizontalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Heatmap Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HeatMapChart"},next:{title:"Line Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/LineChart"}},l={},h=[{value:"Use cases",id:"use-cases",level:2},{value:"Dev Design details",id:"dev-design-details",level:2},{value:"Mathematical/Geometrical concepts",id:"mathematicalgeometrical-concepts",level:2},{value:"Performance",id:"performance",level:2},{value:"Accessibility",id:"accessibility",level:2},{value:"Testing",id:"testing",level:2},{value:"Variants",id:"variants",level:2},{value:"Theming",id:"theming",level:2},{value:"Debugging",id:"debugging",level:2},{value:"Error scenarios",id:"error-scenarios",level:2},{value:"Localization aspects",id:"localization-aspects",level:2},{value:"Some notable PRs and their brief description",id:"some-notable-prs-and-their-brief-description",level:2},{value:"Future improvements",id:"future-improvements",level:2},{value:"Rendering details",id:"rendering-details",level:2},{value:"Interactions",id:"interactions",level:2},{value:"Known issues",id:"known-issues",level:2},{value:"Design figma",id:"design-figma",level:2},{value:"Learnings",id:"learnings",level:2},{value:"Extensions",id:"extensions",level:2}];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"horizontal-bar-chart",children:"Horizontal Bar Chart"}),"\n",(0,s.jsx)(t.p,{children:"A horizontal bar chart is a chart that presents categorical data with rectangular bars with lengths proportional to the values they represent. This type of chart is particularly useful when the intention is to show comparisons among different categories and the labels for those categories are long."}),"\n",(0,s.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,s.jsx)(t.p,{children:"Here are some common use cases for horizontal bar charts:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Comparative Analysis: Display and compare quantities, such as sales figures, across different products, regions, or time periods."}),"\n",(0,s.jsx)(t.li,{children:"Ranking: Show the ranking of items, like top-selling products or highest-performing employees, in a visually impactful manner."}),"\n",(0,s.jsx)(t.li,{children:"Survey Results: Present survey responses for multiple options to help visualize the popularity or preference of each choice."}),"\n",(0,s.jsx)(t.li,{children:"Part-to-Whole Relationships: Display composition within a category, like expense types in a budget or age groups in a population."}),"\n",(0,s.jsx)(t.li,{children:"Benchmark Comparison: Compare data to benchmarks or goals, like industry standards or set targets."}),"\n",(0,s.jsx)(t.li,{children:"Progress Tracking: Track the progress of various goals, objectives, or metrics over time or across different units."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"dev-design-details",children:"Dev Design details"}),"\n",(0,s.jsx)(t.p,{children:"The horizontal bar chart comprises the following components and subcomponents:"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"HorizontalBarChart"}),": This is the main component responsible for rendering and managing subcomponents such as bar titles, bars themselves, bar values, benchmark triangles, and other components. It handles user interactions and provides the overall functionality of the chart."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"FocusZone"}),": This component facilitates focus navigation within the chart. It allows users to navigate between bars using the tab key."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"FocusableTooltipText"}),": This component is used to render a bar title with an optional tooltip. The tooltip is triggered when the content overflows and is truncated due to the CSS text-overflow property. Users can access the tooltip by hovering over or focusing on the respective element."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Callout"}),": This component functions as an anchored tip, offering additional information about the bar that is currently hovered over or focused without blocking the user."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"ChartHoverCard"}),": This component acts as the body of the callout, presenting relevant details in a well-organized manner."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Benchmark Triangle"}),": It is displayed above a bar to indicate benchmark data. It acts as a visual reference point, making it easier for users to compare bar values to the benchmark value."]}),"\n",(0,s.jsx)(t.h2,{id:"mathematicalgeometrical-concepts",children:"Mathematical/Geometrical concepts"}),"\n",(0,s.jsx)(t.p,{children:"All calculations are performed in percentages to ensure the responsiveness of the chart."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"First, the spacing between bar segments is determined as a percentage of the chart's width when the component mounts."}),"\n",(0,s.jsx)(t.li,{children:"The total width required for all the gaps between segments is calculated by multiplying the number of gaps (which is one less than the number of segments) by the width of a single gap, as calculated previously."}),"\n",(0,s.jsx)(t.li,{children:"The sum of widths for each segment is computed, ensuring that even segments with very small values remain visible and accessible to users. This sum is always equal to or greater than 100."}),"\n",(0,s.jsx)(t.li,{children:"The total width required for rendering all the segments without any gaps is derived by subtracting the total width of all the gaps from 100. A scale factor is then obtained by dividing the real length (the total width of all segments without gaps) by the scale length (the sum of segment widths). This scale factor is used to calculate the precise width of each segment."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"performance",children:"Performance"}),"\n",(0,s.jsx)(t.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,s.jsx)(t.p,{children:"The following subcomponents are accessible using a screen reader:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart title
"}),": This is already accessible to screen readers."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart data text
"}),": This is already accessible to screen readers."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart "}),": The following attributes provide an accessible label for the bar."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"aria-label"})," = the bar title, which is referred to as chartTitle in the component"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Bar "}),": The following attributes provide an accessible description for the bar."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"role"}),' = "img"']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"aria-label"}),' = "{barTitle}, {barValue}."']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Users can customize this description using the xAxisCalloutData, yAxisCalloutData and callOutAccessibilityData props."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Test coverage report",src:n(2811).Z+"",width:"3679",height:"1168"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"/fluentui-charting-contrib/docs/Test%20Plans/HorizontalBarChart/ComponentTests",children:"HorizontalBarChart test plan"})}),"\n",(0,s.jsx)(t.h2,{id:"variants",children:"Variants"}),"\n",(0,s.jsx)(t.p,{children:"Here are the props available for customizing the horizontal bar chart:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"data"}),": Use this prop to provide a series of bar data, including colors and values, to populate the chart."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"width"}),": Use this prop to set the width of the chart. If not provided, the chart will occupy the total available width."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"barHeight"}),": Use this prop to set the height of the bars in the chart. If not provided, a default bar height of 12px is used."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"chartDataMode"}),": Choose from the following options to format how bar values are displayed in the chart:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"default"}),": Renders the bar value as a numeric string."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"fraction"}),": Renders the bar value as a fraction of the total."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"percentage"}),": Renders the bar value as a percentage of the total."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"barChartCustomData"}),": Use this prop to render a custom string as the bar value."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"variant"}),": Select the presentation style of the horizontal bar chart from the following options:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"HorizontalBarChartVariant.PartToWhole"})," (default): In this variant, each bar represents a part or segment of a whole. It is excellent for showing how each category or segment contributes to the total or whole."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"HorizontalBarChartVariant.AbsoluteScale"}),": In this variant, each bar's length is directly proportional to its absolute value or quantity. It is useful for comparing magnitudes across different categories."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"hideLabels"}),": Use this prop to hide bar labels when using the AbsoluteScale variant."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For more details, see ",(0,s.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/horizontalbarchart",children:"Fluent UI - Controls - React - HorizontalBarChart"})]}),"\n",(0,s.jsx)(t.h2,{id:"theming",children:"Theming"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The styles file contains a function called getHorizontalBarChartStyles, which returns styles for different areas or subcomponents of the chart based on the props passed to it. The base component is wrapped with the styled HOC, which passes the theme (set by the user) and the concatenated styles (obtained from the styling function and any additional styles provided by the user) as props to the base component. Within the base component, the styles are applied to corresponding elements after converting them into class names. This conversion is done by passing theme and other style props as arguments to the function returned by the classNamesFunction utility. To learn more about component styling, refer ",(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Component-Styling",children:"this"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"debugging",children:"Debugging"}),"\n",(0,s.jsx)(t.h2,{id:"error-scenarios",children:"Error scenarios"}),"\n",(0,s.jsx)(t.h2,{id:"localization-aspects",children:"Localization aspects"}),"\n",(0,s.jsx)(t.p,{children:"Currently, the chart supports localization only for the chart data texts and the callout content."}),"\n",(0,s.jsx)(t.h2,{id:"some-notable-prs-and-their-brief-description",children:"Some notable PRs and their brief description"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/28414",children:"Focus indicator bug in bar charts by yush-singla \xb7 Pull Request #28414 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/26082",children:"Add new variant to horizontal bar chart by krkshitij \xb7 Pull Request #26082 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/25268",children:"Adjust horizontal bar chart styles as per design by krkshitij \xb7 Pull Request #25268 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/27580",children:"Disable focus on non-interactive elements by krkshitij \xb7 Pull Request #27580 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/24631",children:"Fix min width of bars as 1% for horizontal bar charts by AtishayMsft \xb7 Pull Request #24631 \xb7 microsoft/fluentui (github.com)"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"future-improvements",children:"Future improvements"}),"\n",(0,s.jsx)(t.h2,{id:"rendering-details",children:"Rendering details"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"When no data is provided by the user, an empty div is rendered in place of the chart."}),"\n",(0,s.jsx)(t.li,{children:"The horizontal bar chart data comprises two values: a total (y) and a portion of that total (x). The primary bar, colored as per user preference, represents this portion (x). The remaining portion (y-x) is represented by a placeholder bar in the default part-to-whole variant."}),"\n",(0,s.jsx)(t.li,{children:"The FocusableTooltipText component renders text with a tooltip. It monitors the size of the container to detect if the text content overflows. If it does, it truncates the text with ellipsis and enables users to view the tooltip with complete content by focusing or hovering over the element."}),"\n",(0,s.jsx)(t.li,{children:"In the part-to-whole variant, the bar value is displayed above the bar as a number, fraction, or percentage based on the chartDataMode prop. In the absolute-scale variant, the bar value is displayed as a number beside the primary bar, replacing the placeholder bar."}),"\n",(0,s.jsx)(t.li,{children:"Changes in layout direction do not affect the stacking order of the bars but rather the text anchor. Therefore, the stacking order of the bars is reversed by adjusting the x attribute according to the layout direction, making it easier for the respective users to read the chart."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"interactions",children:"Interactions"}),"\n",(0,s.jsx)(t.p,{children:"The chart is wrapped with a FocusZone component to allow focus on its interactive subcomponents. The following subcomponents are accessible using the keyboard:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Bar "})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data-is-focusable"}),": True"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onFocus"}),": Shows a callout near the element containing the bar details."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onBlur"}),": Does nothing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Chart title "})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data-is-focusable"}),": True if the text content overflows and is truncated due to the CSS text-overflow property."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onFocus"}),": Shows a tooltip with complete content."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onBlur"}),": Hides the tooltip if it is visible."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Users can interact with the following subcomponents using the mouse:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Bar "})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onMouseOver"}),": Shows a callout near the element containing the bar details."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onMouseLeave"}),": Does nothing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Chart title
"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onMouseEnter"}),": Shows a tooltip with complete content if the text content overflows and is truncated due to the CSS text-overflow property."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onMouseLeave"}),": Hides the tooltip if it is visible."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Root
"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onMouseLeave"}),": Hides the callout if it is visible."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"known-issues",children:"Known issues"}),"\n",(0,s.jsx)(t.h2,{id:"design-figma",children:"Design figma"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-107659&mode=design&t=z2rzYs6YG3VbbVoG-4",children:"Horizontal bar chart \u2013 Figma"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=18708-74877&mode=design&t=z2rzYs6YG3VbbVoG-4",children:"Horizontal bar chart: Part to whole \u2013 Figma"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"learnings",children:"Learnings"}),"\n",(0,s.jsx)(t.h2,{id:"extensions",children:"Extensions"})]})}function d(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},2811:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/horizontalbarchart-test-coverage-debe6586d4011ebdc19688eff29c2135.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>o,a:()=>a});var s=n(7294);const i={},r=s.createContext(i);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c3c7f6c.a4278219.js b/assets/js/4c3c7f6c.a4278219.js deleted file mode 100644 index c946675a1d..0000000000 --- a/assets/js/4c3c7f6c.a4278219.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[9368],{7812:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>h});var i=n(5893),s=n(1151);const r={},o="Contributor guide: Horizontal Bar Chart",a={id:"Charting-Concepts/HorizontalBarChart",title:"Contributor guide: Horizontal Bar Chart",description:"A horizontal bar chart is a chart that presents categorical data with rectangular bars with lengths proportional to the values they represent. This type of chart is particularly useful when the intention is to show comparisons among different categories and the labels for those categories are long.",source:"@site/../../docs/Charting-Concepts/HorizontalBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/HorizontalBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HorizontalBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contributor guide: Heatmap Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/HeatMapChart"},next:{title:"Contributor guide: Line Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/LineChart"}},l={},h=[{value:"Use cases",id:"use-cases",level:2},{value:"Dev Design details",id:"dev-design-details",level:2},{value:"Mathematical/Geometrical concepts",id:"mathematicalgeometrical-concepts",level:2},{value:"Performance",id:"performance",level:2},{value:"Accessibility",id:"accessibility",level:2},{value:"Testing",id:"testing",level:2},{value:"Variants",id:"variants",level:2},{value:"Theming",id:"theming",level:2},{value:"Debugging",id:"debugging",level:2},{value:"Error scenarios",id:"error-scenarios",level:2},{value:"Localization aspects",id:"localization-aspects",level:2},{value:"Some notable PRs and their brief description",id:"some-notable-prs-and-their-brief-description",level:2},{value:"Future improvements",id:"future-improvements",level:2},{value:"Rendering details",id:"rendering-details",level:2},{value:"Interactions",id:"interactions",level:2},{value:"Known issues",id:"known-issues",level:2},{value:"Design figma",id:"design-figma",level:2},{value:"Learnings",id:"learnings",level:2},{value:"Extensions",id:"extensions",level:2}];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"contributor-guide-horizontal-bar-chart",children:"Contributor guide: Horizontal Bar Chart"}),"\n",(0,i.jsx)(t.p,{children:"A horizontal bar chart is a chart that presents categorical data with rectangular bars with lengths proportional to the values they represent. This type of chart is particularly useful when the intention is to show comparisons among different categories and the labels for those categories are long."}),"\n",(0,i.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,i.jsx)(t.p,{children:"Here are some common use cases for horizontal bar charts:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Comparative Analysis: Display and compare quantities, such as sales figures, across different products, regions, or time periods."}),"\n",(0,i.jsx)(t.li,{children:"Ranking: Show the ranking of items, like top-selling products or highest-performing employees, in a visually impactful manner."}),"\n",(0,i.jsx)(t.li,{children:"Survey Results: Present survey responses for multiple options to help visualize the popularity or preference of each choice."}),"\n",(0,i.jsx)(t.li,{children:"Part-to-Whole Relationships: Display composition within a category, like expense types in a budget or age groups in a population."}),"\n",(0,i.jsx)(t.li,{children:"Benchmark Comparison: Compare data to benchmarks or goals, like industry standards or set targets."}),"\n",(0,i.jsx)(t.li,{children:"Progress Tracking: Track the progress of various goals, objectives, or metrics over time or across different units."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"dev-design-details",children:"Dev Design details"}),"\n",(0,i.jsx)(t.p,{children:"The horizontal bar chart comprises the following components and subcomponents:"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"HorizontalBarChart"}),": This is the main component responsible for rendering and managing subcomponents such as bar titles, bars themselves, bar values, benchmark triangles, and other components. It handles user interactions and provides the overall functionality of the chart."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"FocusZone"}),": This component facilitates focus navigation within the chart. It allows users to navigate between bars using the tab key."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"FocusableTooltipText"}),": This component is used to render a bar title with an optional tooltip. The tooltip is triggered when the content overflows and is truncated due to the CSS text-overflow property. Users can access the tooltip by hovering over or focusing on the respective element."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Callout"}),": This component functions as an anchored tip, offering additional information about the bar that is currently hovered over or focused without blocking the user."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"ChartHoverCard"}),": This component acts as the body of the callout, presenting relevant details in a well-organized manner."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Benchmark Triangle"}),": It is displayed above a bar to indicate benchmark data. It acts as a visual reference point, making it easier for users to compare bar values to the benchmark value."]}),"\n",(0,i.jsx)(t.h2,{id:"mathematicalgeometrical-concepts",children:"Mathematical/Geometrical concepts"}),"\n",(0,i.jsx)(t.p,{children:"All calculations are performed in percentages to ensure the responsiveness of the chart."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"First, the spacing between bar segments is determined as a percentage of the chart's width when the component mounts."}),"\n",(0,i.jsx)(t.li,{children:"The total width required for all the gaps between segments is calculated by multiplying the number of gaps (which is one less than the number of segments) by the width of a single gap, as calculated previously."}),"\n",(0,i.jsx)(t.li,{children:"The sum of widths for each segment is computed, ensuring that even segments with very small values remain visible and accessible to users. This sum is always equal to or greater than 100."}),"\n",(0,i.jsx)(t.li,{children:"The total width required for rendering all the segments without any gaps is derived by subtracting the total width of all the gaps from 100. A scale factor is then obtained by dividing the real length (the total width of all segments without gaps) by the scale length (the sum of segment widths). This scale factor is used to calculate the precise width of each segment."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"performance",children:"Performance"}),"\n",(0,i.jsx)(t.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,i.jsx)(t.p,{children:"The following subcomponents are accessible using a screen reader:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Chart title
"}),": This is already accessible to screen readers."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Chart data text
"}),": This is already accessible to screen readers."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Chart "}),": The following attributes provide an accessible label for the bar."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"aria-label"})," = the bar title, which is referred to as chartTitle in the component"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Bar "}),": The following attributes provide an accessible description for the bar."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"role"}),' = "img"']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"aria-label"}),' = "{barTitle}, {barValue}."']}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Users can customize this description using the xAxisCalloutData, yAxisCalloutData and callOutAccessibilityData props."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"testing",children:"Testing"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Test coverage report",src:n(2811).Z+"",width:"3679",height:"1168"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"/fluentui-charting-contrib/docs/Test%20Plans/HorizontalBarChart/ComponentTests",children:"HorizontalBarChart test plan"})}),"\n",(0,i.jsx)(t.h2,{id:"variants",children:"Variants"}),"\n",(0,i.jsx)(t.p,{children:"Here are the props available for customizing the horizontal bar chart:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"data"}),": Use this prop to provide a series of bar data, including colors and values, to populate the chart."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"width"}),": Use this prop to set the width of the chart. If not provided, the chart will occupy the total available width."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"barHeight"}),": Use this prop to set the height of the bars in the chart. If not provided, a default bar height of 12px is used."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"chartDataMode"}),": Choose from the following options to format how bar values are displayed in the chart:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.em,{children:"default"}),": Renders the bar value as a numeric string."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.em,{children:"fraction"}),": Renders the bar value as a fraction of the total."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.em,{children:"percentage"}),": Renders the bar value as a percentage of the total."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"barChartCustomData"}),": Use this prop to render a custom string as the bar value."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"variant"}),": Select the presentation style of the horizontal bar chart from the following options:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.em,{children:"HorizontalBarChartVariant.PartToWhole"})," (default): In this variant, each bar represents a part or segment of a whole. It is excellent for showing how each category or segment contributes to the total or whole."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.em,{children:"HorizontalBarChartVariant.AbsoluteScale"}),": In this variant, each bar's length is directly proportional to its absolute value or quantity. It is useful for comparing magnitudes across different categories."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"hideLabels"}),": Use this prop to hide bar labels when using the AbsoluteScale variant."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["For more details, see ",(0,i.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/horizontalbarchart",children:"Fluent UI - Controls - React - HorizontalBarChart"})]}),"\n",(0,i.jsx)(t.h2,{id:"theming",children:"Theming"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["The styles file contains a function called getHorizontalBarChartStyles, which returns styles for different areas or subcomponents of the chart based on the props passed to it. The base component is wrapped with the styled HOC, which passes the theme (set by the user) and the concatenated styles (obtained from the styling function and any additional styles provided by the user) as props to the base component. Within the base component, the styles are applied to corresponding elements after converting them into class names. This conversion is done by passing theme and other style props as arguments to the function returned by the classNamesFunction utility. To learn more about component styling, refer ",(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Component-Styling",children:"this"}),"."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"debugging",children:"Debugging"}),"\n",(0,i.jsx)(t.h2,{id:"error-scenarios",children:"Error scenarios"}),"\n",(0,i.jsx)(t.h2,{id:"localization-aspects",children:"Localization aspects"}),"\n",(0,i.jsx)(t.p,{children:"Currently, the chart supports localization only for the chart data texts and the callout content."}),"\n",(0,i.jsx)(t.h2,{id:"some-notable-prs-and-their-brief-description",children:"Some notable PRs and their brief description"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/28414",children:"Focus indicator bug in bar charts by yush-singla \xb7 Pull Request #28414 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/26082",children:"Add new variant to horizontal bar chart by krkshitij \xb7 Pull Request #26082 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/25268",children:"Adjust horizontal bar chart styles as per design by krkshitij \xb7 Pull Request #25268 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/27580",children:"Disable focus on non-interactive elements by krkshitij \xb7 Pull Request #27580 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/24631",children:"Fix min width of bars as 1% for horizontal bar charts by AtishayMsft \xb7 Pull Request #24631 \xb7 microsoft/fluentui (github.com)"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"future-improvements",children:"Future improvements"}),"\n",(0,i.jsx)(t.h2,{id:"rendering-details",children:"Rendering details"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"When no data is provided by the user, an empty div is rendered in place of the chart."}),"\n",(0,i.jsx)(t.li,{children:"The horizontal bar chart data comprises two values: a total (y) and a portion of that total (x). The primary bar, colored as per user preference, represents this portion (x). The remaining portion (y-x) is represented by a placeholder bar in the default part-to-whole variant."}),"\n",(0,i.jsx)(t.li,{children:"The FocusableTooltipText component renders text with a tooltip. It monitors the size of the container to detect if the text content overflows. If it does, it truncates the text with ellipsis and enables users to view the tooltip with complete content by focusing or hovering over the element."}),"\n",(0,i.jsx)(t.li,{children:"In the part-to-whole variant, the bar value is displayed above the bar as a number, fraction, or percentage based on the chartDataMode prop. In the absolute-scale variant, the bar value is displayed as a number beside the primary bar, replacing the placeholder bar."}),"\n",(0,i.jsx)(t.li,{children:"Changes in layout direction do not affect the stacking order of the bars but rather the text anchor. Therefore, the stacking order of the bars is reversed by adjusting the x attribute according to the layout direction, making it easier for the respective users to read the chart."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"interactions",children:"Interactions"}),"\n",(0,i.jsx)(t.p,{children:"The chart is wrapped with a FocusZone component to allow focus on its interactive subcomponents. The following subcomponents are accessible using the keyboard:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Bar "})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"data-is-focusable"}),": True"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onFocus"}),": Shows a callout near the element containing the bar details."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onBlur"}),": Does nothing."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Chart title "})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"data-is-focusable"}),": True if the text content overflows and is truncated due to the CSS text-overflow property."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onFocus"}),": Shows a tooltip with complete content."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onBlur"}),": Hides the tooltip if it is visible."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Users can interact with the following subcomponents using the mouse:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Bar "})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onMouseOver"}),": Shows a callout near the element containing the bar details."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onMouseLeave"}),": Does nothing."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Chart title
"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onMouseEnter"}),": Shows a tooltip with complete content if the text content overflows and is truncated due to the CSS text-overflow property."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onMouseLeave"}),": Hides the tooltip if it is visible."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Root
"})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"onMouseLeave"}),": Hides the callout if it is visible."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"known-issues",children:"Known issues"}),"\n",(0,i.jsx)(t.h2,{id:"design-figma",children:"Design figma"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=21153-107659&mode=design&t=z2rzYs6YG3VbbVoG-4",children:"Horizontal bar chart \u2013 Figma"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://www.figma.com/file/WOoCs0CmNYZhYl9xXeCGpi/Data-viz-(Archive)?type=design&node-id=18708-74877&mode=design&t=z2rzYs6YG3VbbVoG-4",children:"Horizontal bar chart: Part to whole \u2013 Figma"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"learnings",children:"Learnings"}),"\n",(0,i.jsx)(t.h2,{id:"extensions",children:"Extensions"})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},2811:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/horizontalbarchart-test-coverage-debe6586d4011ebdc19688eff29c2135.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>o});var i=n(7294);const s={},r=i.createContext(s);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5181bfc2.1cd0a538.js b/assets/js/5181bfc2.1cd0a538.js new file mode 100644 index 0000000000..bb0db0f7b1 --- /dev/null +++ b/assets/js/5181bfc2.1cd0a538.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocsite=self.webpackChunkdocsite||[]).push([[7659],{5417:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>h});var s=n(5893),i=n(1151);const r={},a="Stacked Bar Chart",o={id:"Charting-Concepts/StackedBarChart",title:"Stacked Bar Chart",description:"A stacked bar chart is a type of data visualization that represents data using rectangular bars with lengths proportional to the values they represent. In a stacked bar chart, each bar is divided into segments, and the segments represent different categories or components. The segments are stacked next to each other to show the total value of each bar.",source:"@site/../../docs/Charting-Concepts/StackedBarChart.md",sourceDirName:"Charting-Concepts",slug:"/Charting-Concepts/StackedBarChart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/StackedBarChart",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sparkline Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/SparklineChart"},next:{title:"Vertical Bar Chart",permalink:"/fluentui-charting-contrib/docs/Charting-Concepts/VerticalBarChart"}},l={},h=[{value:"Use cases",id:"use-cases",level:2},{value:"Dev Design details",id:"dev-design-details",level:2},{value:"Mathematical/Geometrical concepts",id:"mathematicalgeometrical-concepts",level:2},{value:"Performance",id:"performance",level:2},{value:"Accessibility",id:"accessibility",level:2},{value:"Testing",id:"testing",level:2},{value:"Variants",id:"variants",level:2},{value:"Theming",id:"theming",level:2},{value:"Debugging",id:"debugging",level:2},{value:"Error scenarios",id:"error-scenarios",level:2},{value:"Localization aspects",id:"localization-aspects",level:2},{value:"Some notable PRs and their brief description",id:"some-notable-prs-and-their-brief-description",level:2},{value:"Future improvements",id:"future-improvements",level:2},{value:"Rendering details",id:"rendering-details",level:2},{value:"Interactions",id:"interactions",level:2},{value:"Known issues",id:"known-issues",level:2},{value:"Design figma",id:"design-figma",level:2},{value:"Learnings",id:"learnings",level:2},{value:"Extensions",id:"extensions",level:2}];function c(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"stacked-bar-chart",children:"Stacked Bar Chart"}),"\n",(0,s.jsx)(t.p,{children:"A stacked bar chart is a type of data visualization that represents data using rectangular bars with lengths proportional to the values they represent. In a stacked bar chart, each bar is divided into segments, and the segments represent different categories or components. The segments are stacked next to each other to show the total value of each bar."}),"\n",(0,s.jsx)(t.h2,{id:"use-cases",children:"Use cases"}),"\n",(0,s.jsx)(t.p,{children:"Here are some common use cases for stacked bar charts:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Tracking Trends Over Time: Show changes in category proportions over time, allowing you to analyze how the distribution of data points evolves."}),"\n",(0,s.jsx)(t.li,{children:"Highlighting Part-to-Whole Relationships: Emphasize the contribution of individual categories to the whole, helping viewers understand the significance of each component."}),"\n",(0,s.jsx)(t.li,{children:"Visualizing Survey Data: Present the distribution of responses in a survey across various answer choices for different questions, providing insights into the survey's results."}),"\n",(0,s.jsx)(t.li,{children:"Resource Allocation: Show how resources, such as budget or time, are allocated among various tasks, projects, or departments within an organization."}),"\n",(0,s.jsx)(t.li,{children:"Market Share Analysis: Illustrate the market share of different companies or products within a specific industry, helping in competitive analysis."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"dev-design-details",children:"Dev Design details"}),"\n",(0,s.jsx)(t.p,{children:"The stacked bar chart comprises the following components and subcomponents:"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"StackedBarChart"}),": This is the main component responsible for rendering and managing subcomponents, such as bar titles, bars, bar labels, benchmark and triangle indicators, and other components. It handles user interactions and provides the overall functionality of the chart."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"FocusZone"}),": This component facilitates focus navigation within the chart. It allows users to navigate between focusable subcomponents, such as bars and bar segments, using the tab and arrow keys."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"FocusableTooltipText"}),": This component is used to render a bar title with a tooltip. It monitors the size of the container to detect if the text content overflows. If it does, it truncates the text with ellipsis and enables users to view the tooltip with complete content by focusing or hovering over the element."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Legends"}),": Legends are a unique list of strings that identify each bar segment in the chart. The Legends component renders a button for each legend, enabling users to highlight the corresponding segment by hovering over or selecting the legend."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Callout"}),": This component functions as an anchored tip, offering additional information about the bar segment that is currently hovered over or focused without blocking the user."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"ChartHoverCard"}),": This component acts as the body of the callout, presenting relevant details in a well-organized manner."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Benchmark & Target indicators"}),": Currently, these indicators are only supported by the stacked bar chart and not the multi-stacked bar chart. They act as visual reference points, making it easier for users to compare bar values to the benchmark/target value."]}),"\n",(0,s.jsx)(t.h2,{id:"mathematicalgeometrical-concepts",children:"Mathematical/Geometrical concepts"}),"\n",(0,s.jsx)(t.p,{children:"All calculations are performed in percentages to ensure the responsiveness of the chart."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"First, the spacing between bar segments is determined as a percentage of the chart's width when the component mounts."}),"\n",(0,s.jsx)(t.li,{children:"The total width required for all the gaps between segments is calculated by multiplying the number of gaps (which is one less than the number of segments) by the width of a single gap, as calculated previously."}),"\n",(0,s.jsx)(t.li,{children:"The sum of widths for each segment is computed, ensuring that even segments with very small values remain visible and accessible to users. This sum is always equal to or greater than 100. In the absolute-scale variant of the multi-stacked bar chart, the width percentage of each segment is calculated against the total value of the longest bar."}),"\n",(0,s.jsx)(t.li,{children:"The total width required for rendering all the segments without any gaps is derived by subtracting the total width of all the gaps from 100. A scale factor is then obtained by dividing the real length (the total width of all segments without gaps) by the scale length (the sum of segment widths). This scale factor is used to calculate the precise width of each segment."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"performance",children:"Performance"}),"\n",(0,s.jsx)(t.h2,{id:"accessibility",children:"Accessibility"}),"\n",(0,s.jsx)(t.p,{children:"The following subcomponents are accessible using a screen reader:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart title
"}),": It is already accessible to screen readers."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart data
"}),": It is already accessible to screen readers. Users can provide a custom accessible name or description for it using the chartDataAccessibilityData prop."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Chart "}),": The following attributes provide an accessible label for the bar."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"aria-label"})," = the bar title, which is referred to as chartTitle in the component"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Bar segment "}),": The following attributes provide an accessible description for the bar segment."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"role"}),' = "img"']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"aria-label"}),' = "{legend}, {segmentValue}."']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Users can customize this description using the xAxisCalloutData, yAxisCalloutData and callOutAccessibilityData props."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Bar label "}),": The bar labels are limited to the absolute-scale variant of the multi-stacked bar chart. It is already accessible to screen readers, but the content doesn\u2019t convey complete information. The following attributes specify a different accessible name for the bar label."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"role"}),' = "img"']}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"aria-label"}),' = "Total: {barTotalValue}"']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Test coverage report",src:n(1968).Z+"",width:"3679",height:"1505"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"/fluentui-charting-contrib/docs/Test%20Plans/StackedBarChart/ComponentTests",children:"StackedBarChart test plan"})}),"\n",(0,s.jsx)(t.h2,{id:"variants",children:"Variants"}),"\n",(0,s.jsx)(t.p,{children:"Here are the props available for customizing the stacked bar chart:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"data"}),": Use this prop to provide a series of bar data, including colors and values, to populate the chart."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"width"}),": Use this prop to set the width of the chart. If not provided, the chart will occupy the total available width."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"barHeight"}),": Use this prop to set the height of the bars in the chart. If not provided, a default bar height of 12px is used."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"hideDenominator"}),": Use this prop to hide the denominator of the chart data when it is displayed as a fraction/ratio. In the case of the multi-stacked bar chart, it takes an array of booleans with length equal to the number of bars in the chart, where each element determines whether to hide the denominator for the corresponding bar."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"benchmarkData"})," (Stacked): Use this prop to show a benchmark indicator/triangle above the bar."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"targetData"})," (Stacked): Use this prop to show a target indicator/triangle above the bar."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"hideNumberDisplay"})," (Stacked): Use this prop to hide the chart data from above the bar."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"ignoreFixStyle"})," (Stacked): By default, the chart data with a length of 1 is displayed as a number, and a length of 2 is displayed as a fraction/ratio. Use this prop to ignore the default display pattern and hide the chart data, irrespective of its length."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"hideRatio"})," (Multi-Stacked): This prop takes an array of booleans with length equal to the number of bars in the chart, where each element determines whether to hide the chart data for the corresponding bar."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"variant"})," (Multi-Stacked): Select the presentation style of the multi-stacked bar chart from the following options:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"MultiStackedBarChartVariant.PartToWhole"})," (default): In this variant, each bar represents a part or segment of a whole. It is excellent for showing how each category or segment contributes to the total or whole."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.em,{children:"MultiStackedBarChartVariant.AbsoluteScale"}),": In this variant, each bar's length is directly proportional to its absolute value or quantity. It is useful for comparing magnitudes across different categories."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"hideLabels"})," (Multi-Stacked): Use this prop to hide bar labels when using the AbsoluteScale variant."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For more details, see ",(0,s.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/horizontalbarchart/stackedbarchart",children:"Fluent UI - Controls - React - HorizontalBarChart - Stacked"})," and ",(0,s.jsx)(t.a,{href:"https://developer.microsoft.com/en-us/fluentui#/controls/web/horizontalbarchart/multistackedbarchart",children:"Fluent UI - Controls - React - HorizontalBarChart - Multi Stacked"})]}),"\n",(0,s.jsx)(t.h2,{id:"theming",children:"Theming"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The styles file contains a function called getStyles, which returns styles for different areas or subcomponents of the chart based on the props passed to it. The base component is wrapped with the styled HOC, which passes the theme (set by the user) and the concatenated styles (obtained from the styling function and any additional styles provided by the user) as props to the base component. Within the base component, the styles are applied to corresponding elements after converting them into class names. This conversion is done by passing theme and other style props as arguments to the function returned by the classNamesFunction utility. To learn more about component styling, refer ",(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/wiki/Component-Styling",children:"this"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"debugging",children:"Debugging"}),"\n",(0,s.jsx)(t.h2,{id:"error-scenarios",children:"Error scenarios"}),"\n",(0,s.jsx)(t.h2,{id:"localization-aspects",children:"Localization aspects"}),"\n",(0,s.jsx)(t.p,{children:"Currently, the chart supports localization only for the chart data texts and the callout content."}),"\n",(0,s.jsx)(t.h2,{id:"some-notable-prs-and-their-brief-description",children:"Some notable PRs and their brief description"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/28414",children:"Focus indicator bug in bar charts by yush-singla \xb7 Pull Request #28414 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/27580",children:"Disable focus on non-interactive elements by krkshitij \xb7 Pull Request #27580 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/26082",children:"Add new variant to horizontal bar chart by krkshitij \xb7 Pull Request #26082 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/24563",children:"Fix legends selection bugs by krkshitij \xb7 Pull Request #24563 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/24835",children:"Set minimum width of 1% for multi stacked horizontal bar chart by AtishayMsft \xb7 Pull Request #24835 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/24631",children:"Fix min width of bars as 1% for horizontal bar charts by AtishayMsft \xb7 Pull Request #24631 \xb7 microsoft/fluentui (github.com)"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/microsoft/fluentui/pull/21750",children:"Fix charting callout not hoverable using mouse and callout flickering by AtishayMsft \xb7 Pull Request #21750 \xb7 microsoft/fluentui (github.com)"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"future-improvements",children:"Future improvements"}),"\n",(0,s.jsx)(t.h2,{id:"rendering-details",children:"Rendering details"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"When no data is provided by the user, an empty div is rendered in place of the chart."}),"\n",(0,s.jsx)(t.li,{children:"By default, chart data with a length of 1 is displayed as a number, and data with a length of 2 is displayed as a fraction/ratio above the bar. However, in the absolute-scale variant of the multi-stacked bar chart, the sum of the values of all highlighted bar segments is displayed as a number beside the bar."}),"\n",(0,s.jsx)(t.li,{children:"Changes in layout direction do not affect the stacking order of the bars but rather the text anchor. Therefore, the stacking order of the bars is reversed by adjusting the x attribute according to the layout direction, making it easier for the respective users to read the chart."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"interactions",children:"Interactions"}),"\n",(0,s.jsx)(t.p,{children:"The chart is wrapped with a FocusZone component to allow focus on its interactive subcomponents. The following subcomponents are accessible using the keyboard:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Bar segment "})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data-is-focusable"}),": True if the hideTooltip prop is falsy."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onFocus"}),": Shows a callout near the element containing the segment details."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onBlur"}),": Does nothing."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Chart title "})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data-is-focusable"}),": True if the text content overflows and is truncated."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onFocus"}),": Shows a tooltip with complete content."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"onBlur"}),": Hides the tooltip if it is visible."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Legend FluentUI ChartingDocs

Accessibility

The react charting library is accessibility MAS C compliant. +

Accessibility

The react charting library is accessibility MAS C compliant. We satisfy accessibility requirements for the following aspects (and more).

+
\ No newline at end of file diff --git a/docs/Charting-Concepts/GaugeChart.html b/docs/Charting-Concepts/GaugeChart.html index fb72fe6af6..64b6cfa593 100644 --- a/docs/Charting-Concepts/GaugeChart.html +++ b/docs/Charting-Concepts/GaugeChart.html @@ -3,13 +3,13 @@ -Contributor guide: Gauge Chart | FluentUI Charting Contrib Docsite +Gauge Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Gauge Chart

+
+

Extensions

\ No newline at end of file diff --git a/docs/Charting-Concepts/GroupedVerticalBarChart.html b/docs/Charting-Concepts/GroupedVerticalBarChart.html index 7ff0dadf70..854de65fe0 100644 --- a/docs/Charting-Concepts/GroupedVerticalBarChart.html +++ b/docs/Charting-Concepts/GroupedVerticalBarChart.html @@ -3,13 +3,13 @@ -Contributor guide: Grouped Vertical Bar Chart | FluentUI Charting Contrib Docsite +Grouped Vertical Bar Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Grouped Vertical Bar Chart

+

Grouped Vertical Bar Chart

GroupedVerticalBarChart1.png

A grouped vertical bar chart is a type of chart that displays multiple series of data as groups of bars, with each bar representing a category. The bars are grouped together side by side, with each group representing a different series.

In a grouped vertical bar chart, the x-axis represents the categories, while the y-axis represents the values of the series. Each bar in a group is colored differently to differentiate between the series.

@@ -561,6 +561,6 @@
  1. Formula for calculating the width of each bar:
-
barWidth = (x0.bandwidth() - spaceBetweenBars) / this._keys.length
+
barWidth = (x0.bandwidth() - spaceBetweenBars) / this._keys.length
\ No newline at end of file diff --git a/docs/Charting-Concepts/HeatMapChart.html b/docs/Charting-Concepts/HeatMapChart.html index 27c7a947fa..446ae5556d 100644 --- a/docs/Charting-Concepts/HeatMapChart.html +++ b/docs/Charting-Concepts/HeatMapChart.html @@ -3,13 +3,13 @@ -Contributor guide: Heatmap Chart | FluentUI Charting Contrib Docsite +Heatmap Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Heatmap Chart

+ +

Extensions

\ No newline at end of file diff --git a/docs/Charting-Concepts/HorizontalBarChart.html b/docs/Charting-Concepts/HorizontalBarChart.html index 5eb9a729af..cc22864830 100644 --- a/docs/Charting-Concepts/HorizontalBarChart.html +++ b/docs/Charting-Concepts/HorizontalBarChart.html @@ -3,13 +3,13 @@ -Contributor guide: Horizontal Bar Chart | FluentUI Charting Contrib Docsite +Horizontal Bar Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Horizontal Bar Chart

+
+

Extensions

\ No newline at end of file diff --git a/docs/Charting-Concepts/LineChart.html b/docs/Charting-Concepts/LineChart.html index 5a111e6d2f..9b72b6fc9e 100644 --- a/docs/Charting-Concepts/LineChart.html +++ b/docs/Charting-Concepts/LineChart.html @@ -3,13 +3,13 @@ -Contributor guide: Line Chart | FluentUI Charting Contrib Docsite +Line Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Line Chart

+

Line Chart

Line charts are a versatile type of graph used to visualize data trends over time. They are commonly used in various fields and industries for different purposes.

Use cases:

Line charts are used for various use cases which involve Trend Analysis, Performance Monitoring , Comparisions , Forecasting , Monitoring Changes , Communicating Data etc.

@@ -161,6 +161,6 @@
+fluentui/packages/react-charting/src/components/CommonComponents at master · microsoft/fluentui · GitHub

\ No newline at end of file diff --git a/docs/Charting-Concepts/SankeyChart.html b/docs/Charting-Concepts/SankeyChart.html index 580f3fc204..142f78af64 100644 --- a/docs/Charting-Concepts/SankeyChart.html +++ b/docs/Charting-Concepts/SankeyChart.html @@ -3,13 +3,13 @@ -Contributor Guide: Sankey Chart | FluentUI Charting Contrib Docsite +Sankey Chart | FluentUI Charting Contrib Docsite - + -

Contributor Guide: Sankey Chart

+

Sankey Chart

Sankey charts are a type of data visualization that are particularly useful for showing the flow of resources, energy, or information through a system. They are characterized by their flowing, interconnected arrows that represent the quantity or value of something as it moves from one stage or category to another.

Use cases:

Sankey charts are used for various use cases which involve Energy Flows, Material Flow Analysis, Website User Flow, Customer Journey Mapping, Water Usage and Conservation, Financial Flows, Environmental Impact, Project Management etc.

@@ -116,6 +116,6 @@

Hover Over

Hovering on the node with height less than 24px will display a callout with details of node name and weight.

When the user hovers over a link, the entire flow will be highlighted. All nodes will retain their original colors, while the links themselves will adopt a gradient color derived from the source and target nodes. Additionally, a callout will appear, displaying details about the link, such as the source node's name, weight, and the target node's name. To enhance the visual appeal, the link border will also transition into a gradient when the link is hovered over. Below is an example of a link being hovered over, in this case, between node 4 and node 12.

-

image.png

+

image.png

\ No newline at end of file diff --git a/docs/Charting-Concepts/SparklineChart.html b/docs/Charting-Concepts/SparklineChart.html index 9b106824b5..2b8565ecad 100644 --- a/docs/Charting-Concepts/SparklineChart.html +++ b/docs/Charting-Concepts/SparklineChart.html @@ -3,13 +3,13 @@ -Contributor guide: Sparkline Chart | FluentUI Charting Contrib Docsite +Sparkline Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Sparkline Chart

+

Sparkline Chart

Sparkline1.png

A Sparkline chart is a small, simple chart that is used to display trends over time or changes in data. It is typically used in dashboards or reports where space is limited. The chart consists of a line that shows the trend over time, and an area that shows the range of the data. The chart is designed to be small and compact, so it can be used in dashboards or reports where space is limited.

+
\ No newline at end of file diff --git a/docs/Charting-Concepts/StackedBarChart.html b/docs/Charting-Concepts/StackedBarChart.html index 8a7d3928a8..82bfaf116f 100644 --- a/docs/Charting-Concepts/StackedBarChart.html +++ b/docs/Charting-Concepts/StackedBarChart.html @@ -3,13 +3,13 @@ -Contributor guide: Stacked Bar Chart | FluentUI Charting Contrib Docsite +Stacked Bar Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Stacked Bar Chart

+
+

Extensions

\ No newline at end of file diff --git a/docs/Charting-Concepts/VerticalBarChart.html b/docs/Charting-Concepts/VerticalBarChart.html index f2f772f1ac..c5a72cbef1 100644 --- a/docs/Charting-Concepts/VerticalBarChart.html +++ b/docs/Charting-Concepts/VerticalBarChart.html @@ -3,13 +3,13 @@ -Contributor guide: Vertical Bar Chart | FluentUI Charting Contrib Docsite +Vertical Bar Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Vertical Bar Chart

+

Vertical Bar Chart

VerticalBarChart1.png

A vertical bar chart is a type of chart that displays data as a series of vertical bars, with each bar representing a category and the height of the bar representing the value of that category. It is commonly used to compare the values of different categories. In addition, it can also include a line chart that displays a trend line or a target line. This type of chart is commonly used to show the relationship between the actual values and the target values or to show the trend of the data over time.

    @@ -53,7 +53,7 @@

    colorScale: It is a function that can be used to map input values to colors. When an input value is passed to the colorScale function, it will return a color value that corresponds to the input value based on the specified domain and range.

  • -

    d3-shape: The d3-shape library provides various functions for creating and manipulating shapes such as arcs, lines, and areas. Following are the main mathematical/geometrical concepts that are used while drawing a vertical bar chart.

    +

    d3-shape: The d3-shape library provides various functions for creating and manipulating shapes such as arcs, lines, and areas. Following are the main mathematical/geometrical concepts that are used while drawing a vertical bar chart.

    Application in Vertical bar chart: In Vertical bar chart, d3.line() is a function from the d3-shape module that is used to create a line generator for the line chart in the chart component. The line generator is used to generate a path element that represents the line chart based on the data points and the x and y scales.

      @@ -612,6 +612,6 @@ VBC_f7.png

      _domainMarging = MIN_DOMAIN_MARGIN
      MIN_DOMAIN_MARGIN = 8

      To center align the chart by setting equal left and right margins for domain:
      -
+
\ No newline at end of file diff --git a/docs/Charting-Concepts/VerticalStackedBarChart.html b/docs/Charting-Concepts/VerticalStackedBarChart.html index f753c47d18..86fbbecb55 100644 --- a/docs/Charting-Concepts/VerticalStackedBarChart.html +++ b/docs/Charting-Concepts/VerticalStackedBarChart.html @@ -3,13 +3,13 @@ -Contributor guide: Vertical Stacked Bar Chart | FluentUI Charting Contrib Docsite +Vertical Stacked Bar Chart | FluentUI Charting Contrib Docsite - + -

Contributor guide: Vertical Stacked Bar Chart

+

Vertical Stacked Bar Chart

VerticalStackedBarChart1.png

A vertical stacked bar chart is a type of chart that displays multiple series of data as stacked bars, with each bar representing a category. The bars are stacked on top of each other, with the height of each bar representing the total value of the series at that category.

In a vertical stacked bar chart, the x-axis represents the categories, while the y-axis represents the values of the series. Each bar is divided into segments, with each segment representing a different series. The segments are colored differently to differentiate between the series.

@@ -622,6 +622,6 @@
  • Formula for calculating the x position of each bar in the chart:
  • x = xBarScale(bar.category) + (this.\_barWidth / 2)
    -
    +
    \ No newline at end of file diff --git a/docs/Contributor Guide.html b/docs/Contributor Guide.html index 19b4dd9f4b..cb53d06ecb 100644 --- a/docs/Contributor Guide.html +++ b/docs/Contributor Guide.html @@ -5,11 +5,11 @@ Contributor Guide | FluentUI Charting Contrib Docsite - + -

    Contributor Guide

    Fluent charting library is a collection of individual charts like LineChart, AreaChart, Horizontal bar chart, vertical bar chart. +

    Contributor Guide

    Fluent charting library is a collection of individual charts like LineChart, AreaChart, Horizontal bar chart, vertical bar chart. Charting components are built as production-ready, generalized, documented, and reusable components to be used in Microsoft products. This enables us and our partners to easily build great applications without spending a ton of time implementing the same controls over and over. Each component is designed to be RTL-friendly, keyboard accessible, screen reader-friendly, themable, and generalized. TypeScript definition files are also included, so if you use TypeScript (which isn't a requirement), you will get compiler validation and using an editor like VS Code, you'll get intellisense. Each component is exported as a named module that can be easily imported in your code, allowing your external bundler to create small bundles that include just what you need.

    Contribution process @@ -52,6 +52,6 @@

  • Works with RTL languages
  • Measuring the impact of your contribution -The charting team is working to define datapoints to measure the usage of different charts and their functionalities. We will soon publish metrics with quantitative impact of your contribution across the organization.

    +The charting team is working to define datapoints to measure the usage of different charts and their functionalities. We will soon publish metrics with quantitative impact of your contribution across the organization.

    \ No newline at end of file diff --git a/docs/Debugging.html b/docs/Debugging.html index d48b46631b..8e90f35d94 100644 --- a/docs/Debugging.html +++ b/docs/Debugging.html @@ -5,11 +5,11 @@ Debugging | FluentUI Charting Contrib Docsite - + -

    Debugging

    The chart components can be debugged using few techniques.

    +

    Debugging

    The chart components can be debugged using few techniques.

    1. Using browser developer tools.

      @@ -35,6 +35,6 @@ Note that this option renders the components under a headless browser. So some actual rendering dependent functions like getBoundingClientRect will not work and will need to be mocked.
    -
    +
    \ No newline at end of file diff --git a/docs/Detailed Implementation Steps.html b/docs/Detailed Implementation Steps.html index 7882d7f266..e56f5868b8 100644 --- a/docs/Detailed Implementation Steps.html +++ b/docs/Detailed Implementation Steps.html @@ -5,11 +5,11 @@ Detailed Implementation Steps | FluentUI Charting Contrib Docsite - + -

    Detailed Implementation Steps

    If you are planning to contribute a major chart, follow the below steps to align the component with fluent charting design, principles, style and standards.

    +

    Detailed Implementation Steps

    If you are planning to contribute a major chart, follow the below steps to align the component with fluent charting design, principles, style and standards.

    Step 1: Background research. Is there any existing work that has already happened (either on the dev side or on the design side) or in the backlog. Any planned feature can be found in our roadmap here along with high level timelines and current status. Also look for any discussions about the feature in our discord channel. @@ -61,6 +61,6 @@

    Step 7: Stable release. Once the component has been released as stable, it can no longer have any breaking changes before the next major release of the library.

    -

    If the proposed changes are bugfixes, minor enhancements or extension then steps 1-4, 5 and 6 can be brief or skipped. But make sure to capture any relevant information in PR description or supporting documents.

    +

    If the proposed changes are bugfixes, minor enhancements or extension then steps 1-4, 5 and 6 can be brief or skipped. But make sure to capture any relevant information in PR description or supporting documents.

    \ No newline at end of file diff --git a/docs/Implementation Best Practices.html b/docs/Implementation Best Practices.html index 7d7c1de9bc..e047c50254 100644 --- a/docs/Implementation Best Practices.html +++ b/docs/Implementation Best Practices.html @@ -5,11 +5,11 @@ Implementation Best Practices | FluentUI Charting Contrib Docsite - + -

    Implementation Best Practices

    Component Props

    +

    Implementation Best Practices

    Component Props

    Prefer property names consistent with other components

    Consistent property names across the component library help developers understand how to use your component more quickly because the names are familiar. When there aren't good examples, check out open-ui.org to see what names are commonly used across UI component libraries and frameworks.

    For example, a property that controls the overall layout and style of a component is most commonly named appearance. Avoid naming your property display, look, etc.

    diff --git a/docs/Overview.html b/docs/Overview.html index eaa97902d9..eea2d2d355 100644 --- a/docs/Overview.html +++ b/docs/Overview.html @@ -5,11 +5,11 @@ Overview | FluentUI Charting Contrib Docsite - + -

    Overview

    Fluent UI React (formerly Office UI Fabric React) charts is a set of modern, accessible, interactive, lightweight and highly customizable visualization library representing the Microsoft design system. The charts are used across 100+ projects inside Microsoft including Microsoft 365 and Azure.

    +

    Overview

    Fluent UI React (formerly Office UI Fabric React) charts is a set of modern, accessible, interactive, lightweight and highly customizable visualization library representing the Microsoft design system. The charts are used across 100+ projects inside Microsoft including Microsoft 365 and Azure.

    The library is built using D3 (Data Driven Documents) and other fluent UI controls.

    Contact

    The charting project is actively funded by a small feature team. The team responds within 1-2 business days for any queries or doubts. diff --git a/docs/Start Developing.html b/docs/Start Developing.html index e010cc467c..4433e3e669 100644 --- a/docs/Start Developing.html +++ b/docs/Start Developing.html @@ -5,11 +5,11 @@ Start Developing | FluentUI Charting Contrib Docsite - + -

    Start Developing

    This page will help you get familiar with the react charting controls, how the code and documents are organized.

    +

    Start Developing

    This page will help you get familiar with the react charting controls, how the code and documents are organized.

    Follow fluent setup guide to get started.

    Folder structure. The charting library is located within package/react-charting.

    diff --git a/docs/Technical Details.html b/docs/Technical Details.html index e2d39fc6d8..0e4470e02d 100644 --- a/docs/Technical Details.html +++ b/docs/Technical Details.html @@ -5,11 +5,11 @@ Technical details | FluentUI Charting Contrib Docsite - + -

    Technical details

    +

    Technical details

    Overview

    This document describes different chart components in detail.

    This can be used as a guide to use the charts and contribute new functionalities or improvements to the library.

    @@ -111,6 +111,6 @@ Tickcount works for numeric and date axis. Doesn't work for string (scaleBand) axis. -
    +
    \ No newline at end of file diff --git a/docs/Test Plans/AreaChart/ComponentTests.html b/docs/Test Plans/AreaChart/ComponentTests.html index bb0273417e..beeac397b1 100644 --- a/docs/Test Plans/AreaChart/ComponentTests.html +++ b/docs/Test Plans/AreaChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

    ComponentTests

    Area Chart – Component test plan

    +

    ComponentTests

    Area Chart – Component test plan

    Sub-components: Area, x-axis, y-axis and Legend

    1. Line: Area data, Area color (multi colors), Area label (show/hide)
    2. diff --git a/docs/Test Plans/DonutChart/ComponentTests.html b/docs/Test Plans/DonutChart/ComponentTests.html index 5fecf5abc4..b5ce941ed4 100644 --- a/docs/Test Plans/DonutChart/ComponentTests.html +++ b/docs/Test Plans/DonutChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

      Component testing - Donut chart test plan

      Alt text

      Subcomponents: Pie and Legend

      Library used: jest and (enzyme or react testing library)

      +

      Component testing - Donut chart test plan

      Alt text

      Subcomponents: Pie and Legend

      Library used: jest and (enzyme or react testing library)

      Test caseExecution stepsValidation stepsLibrary used
      Test case 1: [Snapshot testing] [Component]
      • Renders donut chart with data.
      Donut chart renders correctlyEnzyme
      Test case 2: [Snapshot testing] [Individual Props]Renders donut chart with:
      • HideTooltip prop set to “true”.
      Donut chart renders correctlyEnzyme
      • HideLegend prop set to “true”.
      Donut chart renders correctlyEnzyme
      • EnabledLegendsWrapLines prop set to “true”.
      Donut chart renders correctlyEnzyme
      • ValueInsideDonut set to a string / number.
      Donut chart renders correctlyEnzyme
      • HideLabels prop set to "false".
      Donut chart renders correctlyEnzyme
      • HideLabels prop set to "false" and ShowLabelsInPercent prop set to "true".
      Donut chart renders correctlyEnzyme
      Test case 3: [Specific DOM elements] Renders individual elements on a prop change:
      • HideLegend prop is set to “false”.
      Legend mounts correctlyEnzyme
      • HideTootip prop is set to “false”.
      Callout mounts correctlyEnzyme
      • onRenderCalloutPerStack prop is not given.
      Should not render onRenderCalloutPerStackEnzyme
      • onRenderCalloutPerDataPoint prop is given.
      Should render onRenderCalloutPerDataPoint correctlyEnzyme
      Test case 4: [Mouse events – Donut chart] Renders individual elements on mouse events:
      • On mouse over on the donut chart.
      Should render calloutEnzyme
      • On mouse move on Pie 1 (step 1) -> mouse leave (step 2) -> mouse move on Pie 2 (step 3).
      Html in step 1 should not be the same as in step 3Enzyme
      • On mouse over with onRenderCalloutPerDataPoint prop provided.
      Should render the custom calloutEnzyme
      • On mouse over, followed by mouse leave on callout.
      On mouse over, callout should be defined, on mouse leave, callout should disappear.Enzyme
      Test case 5: [Mouse events – Legends] Renders individual elements on mouse events:
      • On mouse over on legends.
      Should highlight the corresponding pieRTL
      • On mouse over on legends.
      Should change the value inside donut with the legend valueEnzyme
      • On click on Pie.
      Should highlight the corresponding pie with aria-selected set to “true” and tabIndex set to 0.RTL
      • On mouse out after mouse over on first legend.
      Should have opacity 0.1 for second Pie initially (during mouseOver on first legend) and opacity set to 1 for both the Pies on mouse out.RTL
      Test case 6: [Keyboard events – Donut chart] Renders individual elements on keyboard events:
      • On focus on a Pie.
      Should render the corresponding calloutRTL
      • On blur on a Pie.
      Should remove focus from the corresponding PieRTL
      \ No newline at end of file diff --git a/docs/Test Plans/GaugeChart/ComponentTests.html b/docs/Test Plans/GaugeChart/ComponentTests.html index 56fbe3addd..6267a9973e 100644 --- a/docs/Test Plans/GaugeChart/ComponentTests.html +++ b/docs/Test Plans/GaugeChart/ComponentTests.html @@ -5,11 +5,11 @@ Component testing - Gauge chart test plan | FluentUI Charting Contrib Docsite - + -

      Component testing - Gauge chart test plan

      +

      Component testing - Gauge chart test plan

      Snapshot testing

      Test caseValidationTool used
      When only segments and chartValue props are setShould render gauge chart correctlyEnzyme
      When hideMinMax prop is set to trueShould not render the min and max values of the gaugeEnzyme
      When chartTitle prop is setShould render the chart title correctlyEnzyme
      When sublabel prop is setShould render the sublabel correctlyEnzyme
      When the layout direction is RTLShould render gauge chart correctlyEnzyme
      When hideLegend prop is set to trueShould not render the legendsEnzyme
      When chartValueFormat is set to ‘fraction’Should render the chart value in fraction formatEnzyme
      When a segment has no colorShould render a color from DataVizPalette for the segmentEnzyme
      When the total size of the segments is less than the difference between maxValue and minValue propsShould render a placeholder segmentEnzyme
      When the theme is darkShould render gauge chart correctlyEnzyme

      Testing event listeners

      diff --git a/docs/Test Plans/GroupedVerticalBarChart/ComponentTests.html b/docs/Test Plans/GroupedVerticalBarChart/ComponentTests.html index 258a26a826..cf9a495147 100644 --- a/docs/Test Plans/GroupedVerticalBarChart/ComponentTests.html +++ b/docs/Test Plans/GroupedVerticalBarChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

      ComponentTests

      Grouped Vertical Bar Chart – Component test plan

      +

      ComponentTests

      Grouped Vertical Bar Chart – Component test plan

      Sub-components: Bar, Legends, Callout, Labels

      1. Bar: Bar data, Bar color, bar label
      2. diff --git a/docs/Test Plans/HeatMapChart/ComponentTests.html b/docs/Test Plans/HeatMapChart/ComponentTests.html index 534c8aa8f8..f19168f374 100644 --- a/docs/Test Plans/HeatMapChart/ComponentTests.html +++ b/docs/Test Plans/HeatMapChart/ComponentTests.html @@ -5,11 +5,11 @@ Heatmap Chart - Component test plan | FluentUI Charting Contrib Docsite - + -

        Heatmap Chart - Component test plan

        +

        Heatmap Chart - Component test plan

        Snapshot tests

        Test caseValidationTool used
        With only data, domainValuesForColorScale and rangeValuesForColorScale propsShould render heatmap chart correctlyEnzyme
        When data is not present for some groupShould render heatmap chart correctlyEnzyme
        When hideLegend prop is set to trueShould not render legendsEnzyme
        When yAxisTickFormat prop is setShould render y axis labels correctlyEnzyme
        When the layout direction is RTLShould render heatmap chart correctlyEnzyme
        When the theme is darkShould render heatmap chart correctlyEnzyme
        When custom formatter functions are set for x and y axis stringsShould render axis labels correctlyRTL
        With numeric datapointsShould render heatmap chart correctlyRTL

        Rendering and behavior tests

        diff --git a/docs/Test Plans/HorizontalBarChart/ComponentTests.html b/docs/Test Plans/HorizontalBarChart/ComponentTests.html index 5321dc7c34..09d316c245 100644 --- a/docs/Test Plans/HorizontalBarChart/ComponentTests.html +++ b/docs/Test Plans/HorizontalBarChart/ComponentTests.html @@ -5,17 +5,17 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

        ComponentTests

        Horizontal Bar Chart – Component test plan

        +

        ComponentTests

        Horizontal Bar Chart – Component test plan

        Sub-components: Bar, Callout, Labels, Benchmark

        1. Bar: Bar data, Bar color (single), bar label(left and right)
        2. Callout: Default/custom callout
        3. Labels: Default/Custom labels
        -
        Test stepsValidationTool used
        Test 1: [Snapshot testing]
        - With only data prop, string data on x-axis.Should render horizontal bar chart legend with string dataRTL
        - With variant set to “absolute scale”Should render absolute scale variant correctlyEnzyme
        - With variant set to “absolute scale” and hide labels set to “true”Should not render bar labels in absolute scale variantEnzyme
        Test 2: Basic props testing
        - HideTooltip prop set to “true”Should not mount callout when hideTootip is trueEnzyme
        - HideTooltip prop set to “false”Should mount callout when hideTootip is falseEnzyme
        - onRenderCalloutPerHorizantalBar prop is not givenShould not render onRenderCalloutPerHorizantalBarEnzyme
        - onRenderCalloutPerHorizantalBar is givenShould render onRenderCalloutPerHorizantalBarEnzyme
        - HideLabels prop set to “true”Should not render bar labels when hideLabels is trueRTL
        - Legend value set to “x”Should display legend/left side label with specified dataRTL
        Test 3: Render calling with respective to props
        - No prop changes: Mount HorizontalBarChart and then set the same props againRender function should have been called twiceEnzyme
        - Prop changes: Mount HorizontalBarChart chart and then set some other propRender function should have been called twiceEnzyme
        Test 4: Mouse events
        - Mouse over on a barShould render callout correctly on mouseoverEnzyme
        - Mouse move from one bar to other barShould render callout correctly on mouse moveRTL
        - Mouse over on a bar with customized calloutShould render customized callout on mouseoverRTL
        Test 5: [Sub-Component]: Bar
        - Specify bar colorShould render bar with the specified colorRTL
        - setbarHeight to “x”Should render bars with specified heightRTL
        - set variant to “absolute scale”Should render bars right side label inline with barRTL
        - set variant to “part to whole”Should render bars right side label on top of barRTL
        - set chartDataMode to “fraction”Should render bar right side label value as a fractional oneRTL
        - set chartDataMode to “percentage”Should render bar right side label value as a percentage valueRTL
        - set barChartCustomData to “x”Should show custom data on bar right side labelRTL
        Test 6: [Sub-Component]: Benchmark
        - Specify benchmark dataShould render bars with benchmark symbolRTL
        Test 7: [Sub-Component]: Callout
        - Hover mouse over a barShould call the handler on mouse over barRTL
        - Hover mouse over a bar to display calloutShould show the default callout over that barRTL
        - Specify custom callout and hover mouse over a barShould show the custom callout over that barRTL
        Test 8: [Sub-Component]: Screen resolution
        - Increase the screen resolution (zoom in)Should remain unchanged on zoom inRTL
        - Decrease the screen resolution (zoom out)Should remain unchanged on zoom outRTL
        Test 9: Theme changed to Dark ThemeShould reflect theme changeRTL
        Test 10: Horizontal bar chart re-rendering
        - Update chart dataShould re-render chart when data is updatedRTL
        Test 11: Horizontal bar chart with empty data
        - Chart with Empty dataShould render chart with Empty chart are labelEnzyme
        - Chart with proper dataShould not render chart with empty chart are labelEnzyme
        +
        Test stepsValidationTool used
        Test 1: [Snapshot testing]
        - With only data prop, string data on x-axis.Should render horizontal bar chart legend with string dataRTL
        - With variant set to “absolute scale”Should render absolute scale variant correctlyEnzyme
        - With variant set to “absolute scale” and hide labels set to “true”Should not render bar labels in absolute scale variantEnzyme
        Test 2: Basic props testing
        - HideTooltip prop set to “true”Should not mount callout when hideTootip is trueEnzyme
        - HideTooltip prop set to “false”Should mount callout when hideTootip is falseEnzyme
        - onRenderCalloutPerHorizantalBar prop is not givenShould not render onRenderCalloutPerHorizantalBarEnzyme
        - onRenderCalloutPerHorizantalBar is givenShould render onRenderCalloutPerHorizantalBarEnzyme
        - HideLabels prop set to “true”Should not render bar labels when hideLabels is trueRTL
        - Legend value set to “x”Should display legend/left side label with specified dataRTL
        Test 3: Render calling with respective to props
        - No prop changes: Mount HorizontalBarChart and then set the same props againRender function should have been called twiceEnzyme
        - Prop changes: Mount HorizontalBarChart chart and then set some other propRender function should have been called twiceEnzyme
        Test 4: Mouse events
        - Mouse over on a barShould render callout correctly on mouseoverEnzyme
        - Mouse move from one bar to other barShould render callout correctly on mouse moveRTL
        - Mouse over on a bar with customized calloutShould render customized callout on mouseoverRTL
        Test 5: [Sub-Component]: Bar
        - Specify bar colorShould render bar with the specified colorRTL
        - setbarHeight to “x”Should render bars with specified heightRTL
        - set variant to “absolute scale”Should render bars right side label inline with barRTL
        - set variant to “part to whole”Should render bars right side label on top of barRTL
        - set chartDataMode to “fraction”Should render bar right side label value as a fractional oneRTL
        - set chartDataMode to “percentage”Should render bar right side label value as a percentage valueRTL
        - set barChartCustomData to “x”Should show custom data on bar right side labelRTL
        Test 6: [Sub-Component]: Benchmark
        - Specify benchmark dataShould render bars with benchmark symbolRTL
        Test 7: [Sub-Component]: Callout
        - Hover mouse over a barShould call the handler on mouse over barRTL
        - Hover mouse over a bar to display calloutShould show the default callout over that barRTL
        - Specify custom callout and hover mouse over a barShould show the custom callout over that barRTL
        Test 8: [Sub-Component]: Screen resolution
        - Increase the screen resolution (zoom in)Should remain unchanged on zoom inRTL
        - Decrease the screen resolution (zoom out)Should remain unchanged on zoom outRTL
        Test 9: Theme changed to Dark ThemeShould reflect theme changeRTL
        Test 10: Horizontal bar chart re-rendering
        - Update chart dataShould re-render chart when data is updatedRTL
        Test 11: Horizontal bar chart with empty data
        - Chart with Empty dataShould render chart with Empty chart are labelEnzyme
        - Chart with proper dataShould not render chart with empty chart are labelEnzyme
        \ No newline at end of file diff --git a/docs/Test Plans/HorizontalBarChart/UnitTests.html b/docs/Test Plans/HorizontalBarChart/UnitTests.html index baf0b61676..d7b9e1405b 100644 --- a/docs/Test Plans/HorizontalBarChart/UnitTests.html +++ b/docs/Test Plans/HorizontalBarChart/UnitTests.html @@ -5,11 +5,11 @@ UnitTests | FluentUI Charting Contrib Docsite - + -

        UnitTests

        Unit Test Plan - Horizontal Bar Chart

        +

        UnitTests

        Unit Test Plan - Horizontal Bar Chart

        Test stepsValidationTool used
        Test 1:Get Default Text Data
        - Without chartDataModeShould return proper axis data without chartDataMode definedRTL
        - With default chartDataModeShould return proper axis data with default chartDataModeRTL
        - With fraction chartDataModeShould return proper axis data with fraction chartDataModeRTL
        - With percentage chartDataModeShould return proper axis data with percentage chartDataModeRTL
        Test 2: Get chart Data Text
        - With default chart dataShould return proper text data with default chart dataRTL
        - With custom chart dataShould return proper text data with custom chart dataRTL
        Test 3: Create Benchmark
        - Without benchmark dataShould return proper benchmark data without any benchmark data in inputRTL
        - With benchmark dataShould return proper benchmark data with proper benchmark data in inputRTL
        Test 4: Create Bars
        - With proper chart dataShould return bar count properlyRTL
        - With horizontalbarchart dataShould return bar width properlyRTL
        - With barHeight as “x”Should return bar heigh properlyRTL
        Test 5: Get Aria-Label
        - With empty chart dataShould return bar aria-label as 0 when there is no chart dataRTL
        - With proper chart dataShould return bar aria-label properly when proper chart data is thereRTL
        - Without yAxisCalloutDataShould return bar aria-label properly when there is no yAxisCalloutDataRTL
        - Without xAxisCalloutDataShould return bar aria-label properly when there is no xAxisCalloutDataRTL
        - Without xAxisCalloutData and yAxisCalloutDataShould return bar aria- label properly when there is no xAxisCalloutData and yAxisCalloutDataRTL
        - Without xAxisCalloutData, yAxisCalloutData and horizontalBarChartdataShould return bar aria-label properly when there is no xAxisCalloutData, yAxisCalloutData and horizontalBarChartdataRTL
        - With callOutAccessibilityDataShould return bar aria-label properly when we have callOutAccessibilityDataRTL
        - With callOutAccessibilityData and chart dataShould return bar aria-label properly when we have callOutAccessibilityData and other propertiesRTL
        \ No newline at end of file diff --git a/docs/Test Plans/HorizontalBarChartWithAxis/ComponentTests.html b/docs/Test Plans/HorizontalBarChartWithAxis/ComponentTests.html index f5f727b127..ca6e5ea682 100644 --- a/docs/Test Plans/HorizontalBarChartWithAxis/ComponentTests.html +++ b/docs/Test Plans/HorizontalBarChartWithAxis/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

        ComponentTests

        Horizontal Bar Chart With Axis – Component test plan

        +

        ComponentTests

        Horizontal Bar Chart With Axis – Component test plan

        Sub-components: Bar, Callout, Labels, Legend

        1. Bar: Bar data, Bar color, bar label
        2. diff --git a/docs/Test Plans/HorizontalBarChartWithAxis/UnitTests.html b/docs/Test Plans/HorizontalBarChartWithAxis/UnitTests.html index f3848d3b9e..19f49ae11c 100644 --- a/docs/Test Plans/HorizontalBarChartWithAxis/UnitTests.html +++ b/docs/Test Plans/HorizontalBarChartWithAxis/UnitTests.html @@ -5,11 +5,11 @@ UnitTests | FluentUI Charting Contrib Docsite - + -

          UnitTests

          Unit Test Plan – Horizontal Bar Chart with axiss

          +

          UnitTests

          Unit Test Plan – Horizontal Bar Chart with axiss

          Test stepsValidationTool used
          Test 1: Render content for only bars
          - With all propertiesShould return proper bar dataRTL
          - Without xAxisCalloutDataShould return proper bar data without xAxisCalloutDataRTL
          - Without yAxisCalloutDataShould return proper bar data without yAxisCalloutDataRTL
          - Without xAxisCalloutData and yAxisCalloutDataShould return proper bar data without xAxisCalloutData and yAxisCalloutDataRTL
          - Without legend, xAxisCalloutData and yAxisCalloutDataShould return proper bar data without legend, xAxisCalloutData and yAxisCalloutDataRTL
          Test 2: Get scales
          - With numeric axisShould return scales for numeric axisRTL
          - With string axisShould return scales for non-numeric axisRTL
          - With numeric axis - RTLShould return scales for numeric axis - RTL
          Test 3: Create numeric bars
          - With numeric axisShould return proper bar data with numeric axis dataRTL
          - Width as 0Should return proper bar width when container width is 0RTL
          Test 4: get callout content for bar
          - Non Empty DataShould return proper callout data for respective barRTL
          Test 5: Create colors
          - useSingleColor as trueshould return the color scale - using single colorRTL
          - userSingleColor as falseshould return the color scale - using multiple colorRTL
          Test 6: Get Legend data
          - Empty dataShould return empty legends data when there is no chart dataRTL
          - With numeric axis dataShould return proper legends data with numaric yAxis dataRTL
          - With string axis dataShould return proper legends data with string yAxis dataRTL
          Test 7: Get Aria-Label
          - With all properties

          Should return proper aria label

          RTL
          - Without xAxisCalloutData

          Should return proper aria label without xAxisCalloutData

          RTL
          - Without yAxisCalloutData

          Should return proper aria label without yAxisCalloutData

          RTL
          - Without xAxisCalloutData and yAxisCalloutData

          Should return proper aria label without xAxisCalloutData and yAxisCalloutData

          RTL
          - With callOutAccessibilityData

          Should return bar aria-label properly when we have callOutAccessibilityData

          RTL
          - With callOutAccessibilityData and other properties

          Should return bar aria-label properly when we have callOutAccessibilityData and other properties

          RTL
          \ No newline at end of file diff --git a/docs/Test Plans/LineChart/ComponentTests.html b/docs/Test Plans/LineChart/ComponentTests.html index f2a8455884..bb0a170e02 100644 --- a/docs/Test Plans/LineChart/ComponentTests.html +++ b/docs/Test Plans/LineChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

          ComponentTests

          Line Chart – Component test plan

          +

          ComponentTests

          Line Chart – Component test plan

          Sub-components: Line, x-axis, y-axis, Event, Time Range, Callout, Drop down and Legend

          1. Line: Line data, Line color (multi colors), Line label (show/hide)
          2. diff --git a/docs/Test Plans/MultiStackedBarChart/componentTests.html b/docs/Test Plans/MultiStackedBarChart/componentTests.html index 9e519761ae..547e12d5cd 100644 --- a/docs/Test Plans/MultiStackedBarChart/componentTests.html +++ b/docs/Test Plans/MultiStackedBarChart/componentTests.html @@ -5,11 +5,11 @@ componentTests | FluentUI Charting Contrib Docsite - + -

            componentTests

            Multi stacked bar Chart – Component test plan

            +

            componentTests

            Multi stacked bar Chart – Component test plan

            Sub-components: Bar, Legends, Callout

            1. Bar: bar data, bar variants like ‘part-to-whole’ and ‘absolute-scale’
            2. diff --git a/docs/Test Plans/SankeyChart/ComponentTests.html b/docs/Test Plans/SankeyChart/ComponentTests.html index 88882650ec..b0a5f970d7 100644 --- a/docs/Test Plans/SankeyChart/ComponentTests.html +++ b/docs/Test Plans/SankeyChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

              ComponentTests

              Sankey Chart – Component test plan

              +

              ComponentTests

              Sankey Chart – Component test plan

              Sub-components: Node, Callout, Labels,

              1. Node: Node data, Node color, Node label
              2. diff --git a/docs/Test Plans/StackedBarChart/ComponentTests.html b/docs/Test Plans/StackedBarChart/ComponentTests.html index 4a0143b8f1..e75cb5c1b8 100644 --- a/docs/Test Plans/StackedBarChart/ComponentTests.html +++ b/docs/Test Plans/StackedBarChart/ComponentTests.html @@ -5,11 +5,11 @@ ComponentTests | FluentUI Charting Contrib Docsite - + -

                ComponentTests

                Stacked Bar Chart – Component test plan

                +

                ComponentTests

                Stacked Bar Chart – Component test plan

                Sub-components: Bar, Legends, Callout, Benchmark

                1. Bar: bar data, bar background color
                2. diff --git a/docs/Test Plans/TestingGuide.html b/docs/Test Plans/TestingGuide.html index 309a0ddded..2782ac2a2c 100644 --- a/docs/Test Plans/TestingGuide.html +++ b/docs/Test Plans/TestingGuide.html @@ -5,11 +5,11 @@ TestingGuide | FluentUI Charting Contrib Docsite - + -

                  TestingGuide

                  This document highlights few common testing practices for any new tests that are being added to the charting library.

                  +

                  TestingGuide

                  This document highlights few common testing practices for any new tests that are being added to the charting library.

                  1. Any new test should always be added using React Testing Library.
                  2. The utility functions like testWithoutWait, testWithWait and testScreenResolutionChanges can be used in writing the component tests which will reduce the number of lines of code.
                  3. diff --git a/docs/Test Plans/Utilities/UnitTests.html b/docs/Test Plans/Utilities/UnitTests.html index 742c545cac..e5291400ef 100644 --- a/docs/Test Plans/Utilities/UnitTests.html +++ b/docs/Test Plans/Utilities/UnitTests.html @@ -5,11 +5,11 @@ Unit test plan for Donut Chart | FluentUI Charting Contrib Docsite - + -

                    Unit test plan for Donut Chart

                    +

                    Unit test plan for Donut Chart

                    This test plan contains the list of unit testable functions which are used as a part of the Donut Chart component.

                    Identify the functions that can be unit tested (example, functions having calculations or getting values from Utils, etc).