Pricing

GaugeChart handbook

v1.7.5 · @snowui-design-system/components

License: Before reading component documentation, source, or npm usage instructions for the first time, read the full LICENSE. Reuse that review for the same task and version. Public API configuration and internal implementation changes have different license implications. All components use the unified runtime package; source rights remain governed by the license.

Overview

Show several proportions in a semicircle or half-pie, with segments, gradients, ring thickness, and appearance motion.

When to use it

Use GaugeChart for semicircular proportional data. Like CircularChart, its current data model divides each value by the sum of items. Use Progress for task completion.

  • At present, the component displays semi-ring proportional data, which is not a min/max single indicator instrument; each item of data uses name and positive value, and the proportion is calculated according to the sum of the valid display items.

  • Omitting data will display sample data, and empty arrays will show empty diagrams; central copy and content will be configured with centerTitle, centerSubtitle or public role configuration.

  • The default root accessible name follows LocaleProvider through gaugeChart.name; an explicit aria-label takes priority. Business names, data values, and numeric formatting remain controlled by the caller.

Quick start

This example shows the recommended basic composition. See the sections below for more cases and composition limits.

<script lang="ts">	import { Button, Frame, Icon, Text } from '@snowui-design-system/components';	import { DotCircle } from '@snowui-design-system/resource-svelte';	import { GaugeChart } from '@snowui-design-system/components';	// Sample data for this week’s documentation review.	const channels = [	    { name: 'Ready', value: 72, color: 'var(--primary)' },	    { name: 'Review', value: 18, color: 'var(--secondary-purple)' },	    { name: 'Planned', value: 10, color: 'var(--secondary-orange)' }	];	let trafficChart: { replay: () => void; reverseAppearance: () => void } | undefined;</script> <div style="display: flex; flex-direction: column; align-items: center; width: var(--size-full); gap: var(--gap-4) var(--gap-3);">    <GaugeChart bind:this={trafficChart} data={channels} width={360} height={180} ringThickness={32}        centerTitle="Docs" centerSubtitle="This week" appearOnView defaultAppearanceProgress={0}        aria-label="Sample weekly documentation review" />    <div style="display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--gap-4) var(--gap-3);" aria-label="Review status legend">        {#each channels as item}            <Frame singleLine gap={0}><Icon as="leading" size={12} style={`color: ${item.color};`}><DotCircle weight="fill" /></Icon><Text lines={1} style="font-size: var(--text-14); line-height: var(--leading-14); color: var(--black-100);">{item.name}</Text></Frame>        {/each}    </div>    <div style="display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--gap-4) var(--gap-3);">        <Button onclick={() => trafficChart?.replay()}>Replay animation</Button>        <Button onclick={() => trafficChart?.reverseAppearance()}>Reverse animation</Button>    </div></div>

API

Keyword Type Default Description
data GaugeChartItem[] DEFAULT_DATA Proportional data array; each item must be filled in name and value, and color and percentFormat are optional. Filter non-positive numbers and illegal values in the input order, and then take the previous maxItems item; the percentage denominator is the sum of the actual display items. Use the built-in sample data when omitting data; keep the final size and render the empty chart when the explicit empty array or all are invalid. Default behavior: Built-in 5 sample data.
width number | string 320 Overall width, positive number is recommended (px design value to rem); string is directly used as CSS length, but SVG geometry only extracts values with parseFloat, does not convert units, and does not support reliable percentage, calc() or CSS variable geometry.
minWidth number | string `${SECTOR_CHART_MIN_WIDTH}px` The responsive minimum display width; numbers and width use the same px design value to rem rules, and the string is directly used as the CSS length. The default is fixed 40 CSS px; setting it to the same as width can prevent automatic shrinking, and setting a smaller value allows shrinking to the lower limit. It only takes effect when enableResponsive=true.
height number | string 160 The overall height, the recommended positive number (px design value to rem), is usually half of the width; changing the height will change the center of the circle and the available radius. The string resolution limit is the same as the width.
ringThickness number | string 32 Ring thickness, recommended non-negative number (px design value); inner radius is max(0, outer radius - ring thickness). The outer radius is max(1, min(width / 2, height) − hoverThicknessGrowth − 1), and a solid half-pie chart is formed when the ring thickness reaches it. Strings only extract values and do not convert units.
cornerRadius number | string | "auto" "auto" Rounded corners at the end of the sector; non-negative values or digital strings represent the px design value of the 320px width benchmark, scaled by width / 320; auto uses the baseline value 4. Finally, it is limited by the ring thickness and sector angle; 0 is a right angle.
separatorWidth number | string | "auto" "auto" Fan interval transparent partition; non-negative values or digital strings represent the px design value of the 320px width benchmark, scaled by width / 320; auto uses the benchmark value 2, 0 to close the interval. Leave the real background through the path geometry.
colors (GaugeChartColor | undefined)[] — After filtering, the index overlay color is displayed; each item supports semantic color, CSS color/variable, linear-gradient string or { type?, angle?, stop } gradient object. Undefined empty space back to the current colorMode; the data item color takes precedence over the color palette. Background utility class names are not supported.
colorMode GaugeChartColorMode "sequence" The sequence is cycled by Primary and 9 Secondary color sequences; monochromeFade uses the same main color from 100% uniformity of the first item to 20% of the last item (100% for a single item); all items of monochrome use the same color. All three modes allow data items and color palettes to be overwritten one by one.
color GaugeChartColor — Override the fallback main color for both monochromeFade and monochrome, taking priority over monochromeColor and mutedMonochromeColor. sequence ignores this prop. Accepts solid CSS colors, semantic colors, and gradients like item color.
monochromeColor GaugeChartColor "Primary" The fallback main color is only used when monochromeFade and color is not transmitted; solid colors and gradients are supported. The transparency is reduced from 100% in the first item to 20% in the last item, and the data items color and colors still take precedence.
mutedMonochromeColor GaugeChartColor "Black4" The fallback color is only used when it is monochrome and does not transmit color; the default Black4 is a low-contrast color adapted to the theme, and the sector filling itself no longer reduces the transparency. The data items color and colors still take precedence.
hoverThicknessGrowth number | string 4 The non-negative px design value of outward thickening when hover / focus; the inner radius and the center of the circle remain unchanged, 0 closes the geometric thickening but retains the data prompt. Strings only extract values and do not scale by width / 320; there is no hoverScaleSize alias.
startDirection StartDirection "left" Left is revealed to the right from the left end, and right is revealed to the left from the right end; only change the order of appearance and the direction of scanning, and do not rotate the data layout.
showBaseLayer boolean false Whether to display the bottom layer of the same color 4% transparency of the final geometry; no rendering by default. After opening, the bottom layer does not participate in the appearance of motions and hits, which is convenient for observing the filling progress; it does not change the real sector and data.
appearMotion boolean true Whether to enable graphics to appear motion effects; when false, the full fill is directly displayed, and replay / reverseAppearance is not played. This switch does not turn off the independent hover thickening feedback.
appearOnView boolean true In the uncontrolled mode, the anchor point is automatically played once when it reaches the specified viewport position; in the same source iframe, it is judged according to the real position of the outermost source page. False can be played with the instance method instead. appearanceProgress is preferred; scrollAppearance is driven by scrolling when it is turned on.
appearanceProgress number — The controlled filling progress is limited to 0–1; after provision, the display is decided by the caller, and the automatic playback and instance playback methods do not change the controlled screen. appearMotion=false is still displayed directly and completely; external progress changes will not trigger onAppearanceProgressChange.
defaultAppearanceProgress number 0 The progress of the first initialization of uncontrolled mode is limited to 0.1, and only read once; subsequent changes to this attribute do not reset the animation. When there is appearanceProgress, it does not determine the picture; the default 0 is the stroke state.
appearanceDuration number — The total duration of instance playback and automatic appearance, in ms; fixed at 1000 when not transmitted, does not change with the number of sectors. Non-positive numbers go directly to the end point in the next animation frame; do not change the scrolling or controlled progress mapping.
appearAnchorId string — The id of the anchor element is triggered in the page; the chart root element is used when it is not transmitted, and the non-existent id is not returned to the root element. It is only used for automatic appearance or scrolling timeline, and does not change the position of the chart.
appearAnchorPoint AnchorPoint "top" The top (top), center (vertical center) or bottom (bottom) of the anchor point is compared with the viewport trigger line; it does not affect the direction of sector drawing.
appearViewportPoint number | "top" | "center" | "bottom" 0.7 Viewport trigger line: the number is limited to 0–1, or use top=0, center=0.5, bottom=1. The default 0.7 is 70% of the viewport height; cooperate with appearAnchorPoint to determine the trigger/rolling starting point.
scrollAppearance boolean | { distance?: number | string } false True turns on the uncontrolled timeline of window scrolling driver; the same source iframe responds to the outer page scrolling at the same time. The object can cover the scrolling distance with distance. After the anchor point crosses the trigger line, the progress is determined by the distance, and the backward scrolling will be restored in reverse. Do not monitor the nested ScrollArea; appearanceProgress / appearMotion=false is preferred.
scrollAppearanceDistance number | string 320 The CSS px distance required for the scrolling progress from 0 to 1; numbers or number strings, processed as a minimum of 1. scrollAppearance.distance is preferred; it only takes effect when the rolling timeline is opened, and the string unit is not converted.
onAppearanceProgressChange (progress: number) => void — Receive progress (0..1) when writing internal progress, including direct completion in initialization, automatic playback, instance method and rolling update; external progress readings can be synchronized. The default value initialization itself is not notified; it is not used to listen to external appearanceProgress, the return value is ignored, and the update cannot be canceled.
maxItems number 10 The number of the first N items retained after filtering, not sorted, not automatically merged Other; round and limited to 1..28, 0 / NaN back 10. The percentage is only based on reserved items. Business with more than 28 categories should first aggregate small categories to retain the total amount; render an empty chart when all are invalid.
showCenterLabel boolean true Whether to render the center content area; false hides the default dynamic label, segment-value / segment-name template and static center-label at the same time. Hide the center does not turn off the explicitly enabled HoverPanel.
centerTitle string "" The center title displayed when there is no hover / focus item is reused for the default numerical line layout; when hovering or focusing on the sector, it is replaced by the first line of percentage or labelFormatter, and it is restored after leaving. Empty strings do not occupy the title line; showCenterLabel=false is hidden, and static center-label is preferred.
centerSubtitle string "" The central subtitle displayed when there is no hover / focus item is reused with the default name line layout; when hovering or focusing, it is replaced by the current item name or the second line of labelFormatter, and it will be restored after leaving. It can be set separately; HoverPanel data is not generated.
hoverMode ChartHoverMode "cell" Cell hits according to the angle of the ring band, crossing the transparent partition and still maintains the sector it belongs to, excluding the central void and outside the picture; item only responds to the sector path hit. Both modes retain sector keyboard focus prompts.
showHoverPanel boolean true By default, the structured panel is displayed according to the current hover / focus sector, while retaining the dynamic center label. False Close the panel; but when there is a visible static center-label, the component automatically enables the panel to carry sector information.
hoverPanelVariant ChartHoverPanelVariant "light" Panel vision: light is the default light glass style, dark is the dark style, and surface is the theme surface style; only change the appearance of the panel, do not change the data and hit.
hoverPanelPlacement ChartHoverPanelPlacement "pointer" Panel position: pointer follows the pointer; anchor-top / anchor-side relative to the current pointer point positioning (keyboard focus uses the center of the picture); pin-top-left / pin-top / pin-top-right / pin-right / pin-bottom-right / pin-bottom / pin-bottom-left / pin-left / pin-center fixed in the corresponding position of the chart, the edge is kept 8px and participates in the viewport collision processing.
showHoverPanelLabel boolean false Whether to display the current sector name additionally above the panel row data; false only displays the data row. There is a visible effect only when the panel is open and there is a current item.
percentFormat NumberFormatOptions — The number format of center percentage, panel percentage and sector aria-label; support fractionDigits, locale and other NumberFormatOptions. The priority is the data item percentFormat → this property → NumberFormatContext → default one decimal place; labelFormatter only covers the central text. Default behavior: NumberFormats percentage default.
labelFormatter (item: GaugeChartItem, percent: number) => string — When hover / focus, receive item (currently valid data item) and percent (0..100 percentage), and return the central text; split into numerical lines and name lines with a new line, and use up to two lines. Do not call when static center-label or showCenterLabel=false; do not change the percentage of panel and sector aria-label.
loading boolean — Data waiting status. Keep the final place and center content corresponding to width / height, fix the sector at the starting point of the motion and suspend the interaction; after changing to false, play the motion according to the current viewport conditions. The chart does not render Skeleton, and also reads the loading context of the upper Frame; the explicit empty data={[]} does not return the default demonstration data.
children Snippet — No parameter Snippet, rendered in the central area of showCenterLabel=true. The direct Text as="segment-value" / "segment-name" is a dynamic label template, which is written to the current two lines of text by the component; the direct Frame as="center-label" provides resident content and automatically enables the panel. Static content does not automatically use the default central typesetting; there is no need to send children when only the default text is required. The center is used for display, not for interactive toolbars.
class string "" The class string added to the root Frame of the chart; it is empty when not passed. Only express the public root style of the caller, and do not penetrate the internal SVG and tag structure.
style string "" The inline style string added to the root Frame is merged after the variable injected by the component. It can express the external layout; chart geometry gives priority to width, height, ringThickness and other public Props.
enableResponsive boolean true By default, the chart body is reduced proportionally when the container cannot be placed, and flex shrinks side by side. The minimum display width is determined by minWidth (default 40px), and does not shrink when it is the same as the chart width; HoverPanel does not scale; false retains the declaration size. It is also transmitted to Frame.
enableContext boolean true The context ability switch of the transmission Frame; the current component's own width, height, color and appearance progress are still determined by the corresponding Props.
enableScaleObserver boolean false The size observation compatibility ability of the old version of the transmission Frame is turned off by default; it is not equivalent to the size of the percentage chart, and it is not recommended for the new example to rely on this migration period entrance.
enableDefaultMotion boolean true The default outer dynamic performance of the frame; do not take over the timeline and sector hover thickening inside the chart, which is controlled by appearMotion / appearanceProgress and hoverThicknessGrowth respectively.

See the base component documentation for inherited capabilities not redeclared here. This table lists only named public Props declared by this component.

Usage boundaries and details

HoverPanel shares a three-column layout. The dot-to-name gap prefers --gap-1 and the name-to-value gap prefers --gap-2; both retain a 4 CSS px floor in LTR and RTL. At a 16px root font size the defaults remain 4px / 8px, and larger tokens are preserved. This floor does not apply to vertical panel sections or chart center annotations.

Design principle

  • Professional chart components: The current maintenance location is components/src/components/; this directory is the technical location during the migration period. THE USE OF THE RUNNING PACKAGE AND THE DELIVERY OF THE ORIGINAL SOURCE CODE ARE EXECUTED ACCORDING TO LICENSE, AND THE PAID OPERATION RIGHTS AND INTERESTS ARE NO LONGER DIVIDED BY ADVANCED FUNCTIONS.

  • Default 10 items, up to 28 items: Default maxItems=10. When explicitly increasing maxItems, up to 28 items are displayed. The color sequence is exactly the same as the CircularChart, and it still loops in order after 10 items.

  • Color priority: data[i].color → colors[i] → colorMode corresponds to the fallback color. The single color only affects the current sector and will not be passed to the subsequent sector.

  • Size benchmark: cornerRadius and separatorWidth both represent the design benchmark under the 320px wide instrument chart. The internal scale of the component is uniformly scaled according to width / 320, and both numbers and string numbers are understood according to the reference value.

  • Transparent interval: The sector interval is generated by padAngle + padRadius in the path geometry stage, which runs through the inner and outer arcs and shows the real background; no fixed white stroke is drawn, and the back gap mask is not used.

  • Layer structure: The base layer is controlled by showBaseLayer, which is closed by default, and the 4% placeholder layer is drawn when it is turned on; the fill layer is responsible for the real filling and motion; the hit layer uses the complete sector path to be responsible for hover / focus / aria.

  • Hover emphasis: Each sector immediately turns from the current geometry to the latest hover/focus target, cancels the unfinished old animation, and does not replay the backlog; when hover/focus, the sector is not displaced, and only the outer radius slows down to increase hoverThicknessGrowth; the percentage is displayed above the center label, and the current item name is displayed below.

Shared pure logic is located at components/src/lib/chart/: color, gradient, geometric reference scaling, ring sector path and appearance timeline. GaugeChart itself retains the semicircle center, starting direction, center label and hover status management.


2.1 Props

Other undeclared attributes pass through to the root Frame. The root uses role="group" and a locale-aware default accessible name ("Gauge chart" in en-US); an explicit aria-label takes priority. The SVG keeps focusable segments exposed; each hit target uses role="button" and its own accessible name containing the business name and formatted percentage.

2.2 Method

Way Description
replay() Uncontrolled motion effect is replayed from 0 to 1
resetAppearance() Uncontrolled motion effect is immediately reset to 0
reverseAppearance() The uncontrolled motion first enters the completion state, and then reverses from 1 to 0 along the same timeline.

2.3 Data structure

type GaugeChartColor = string | GaugeChartGradient; interface GaugeChartGradient {  type?: "linear";  angle?: number;  stops: (string | { color: string; offset?: number | string; opacity?: number })[];} interface GaugeChartItem {  name: string;  value: number;  color?: GaugeChartColor;  percentFormat?: NumberFormatOptions;}

Percentage number format priority: labelFormatter (center label) → item.percentFormat → component percentFormat → NumberFormatContext → NumberFormats default value. Sector hit layer aria-label does not use labelFormatter, but consumes percentFormat.

value <= 0 or non-numeric items will be filtered; empty charts are rendered when explicit empty arrays or all are invalid, and data is omitted to use the built-in sample data. It is not supported to directly input background tool class names such as .bg-gradient-blue, because SVG path consumes fill.


Layout model

Main layout model: internal atomic layout.

  • The root layer is Frame, and the internal chart body uniformly carries the SVG drawing area and the center label, and is responsible for the equal scaling; HoverPanel is side by side with the chart body to maintain the original size.

  • The size of the chart is determined by width / height and SVG geometric algorithm; it is expressed as Hug as an external layout sub-item.

  • It does not access the three-slot protocol and does not undertake the arrangement of general sub-elements.

  • The root layer explicitly inputs enableResponsive / enableContext / enableScaleObserver / enableDefaultMotion, and transmits class, style and undeclared attributes.

For details, please refer to LayoutProtocol.md §12.7 (source code reference: specs/maintainers/LayoutProtocol.md).


Motion

Scene Realize Bridge variable
Appear in order Consistent with CircularChart, the default total duration is fixed at 1000ms, which does not change with the number of sectors; the whole chart uses the chart-level slow-out time allocation: the duration of the front section is close, and the longer the duration of the back section; the internal linear filling of a single segment; transparency follows the filling progress is completed; the reverse progress goes back along the same formula Internal determinism timeline of components
Scroll to appear scrollAppearance maps the distance between the anchor point and the viewport trigger line to appearanceProgress Internal scrolling monitoring of components
Sector hover emphasis Each sector immediately turns to the latest hover / focus target from the current geometry, cancels the unfinished old animation, and does not backlog replay; when entering, the outer radius slows from R to R + hoverThicknessGrowth, and slows back to R when leaving; the inner radius remains unchanged, and the sector does not shift. Component internal requestAnimationFrame + cubicOut, 300ms; directly reach the final state when reducing the motion
Sector brightness feedback filter: brightness(1.04) --snowui-frame-color-motion-*
Enter the center label opacity + scale --snowui-frame-appear-motion-* / --snowui-frame-control-motion-*

Usage examples

<GaugeChart centerTitle="Docs" centerSubtitle="This week"  data={[{ name: "Ready", value: 72 }, { name: "Review", value: 18 }, { name: "Plan", value: 10 }]} />
<GaugeChart  data={[    { name: "Primary", value: 32 },    { name: "Growth", value: 24 },    { name: "Support", value: 18 },    { name: "Explore", value: 14 },    { name: "Other", value: 12 }  ]}/>
<GaugeChart  colors={[undefined, "var(--secondary-blue)", "linear-gradient(135deg, var(--black-100) 0%, var(--secondary-blue) 100%)"]}  data={[    { name: "Done", value: 62, color: "var(--secondary-mint)" },    { name: "Doing", value: 24 },    { name: "Remain", value: 14 }  ]}/>
<script lang="ts">  let chart: { replay: () => void; reverseAppearance: () => void } | undefined;</script> <Button onclick={() => chart?.replay?.()}>Replay fill</Button><Button onclick={() => chart?.reverseAppearance?.()}>Reverse appearance</Button><GaugeChart bind:this={chart} startDirection="right" appearOnView={false} defaultAppearanceProgress={1} />
<GaugeChart  width={320}  height={160}  data={[    { name: "Growth", value: 24 },    { name: "Support", value: 18 }  ]}>  <Text as="segment-value" />  <Text as="segment-name" /></GaugeChart>

GaugeChart style overlay

Read the full LICENSE first; reuse that review for the same task, version, and scope.

First use public component Props to match the desired appearance, preserving the existing look where possible. If changes are necessary, follow the style selection and override order: use your own class (including Tailwind already in the project) or an instance style. The names below are public overrides actually consumed by source; check their scope and do not modify private DOM. Choose the correct SnowUI token family. External apps need not install SnowUI website utilities.

Variable Purpose and default reference
--snowui-gauge-chart-height-override Overall height (default 160px)
--snowui-gauge-chart-label-color-override The main color of the center label (default var(--black-100))
--snowui-gauge-chart-label-font-size-override Center label numerical font size (320 wide benchmark default 18px, scaled with the chart)
--snowui-gauge-chart-label-font-weight-override The main line of the center label is heavy (default 700)
--snowui-gauge-chart-label-muted-color-override Central label secondary color (default var(--black-40))
--snowui-gauge-chart-label-muted-font-weight-override Center label sub-line word weight (default 400)
--snowui-gauge-chart-width-override Overall width (default 320px)

Design Guide · Token · Combination boundary

GaugeChart type and status

Required Props: no named required Props.

Bindable Props: this component declares no named two-way binding; handle state updates through public callbacks or its host.

Inheritance statement: no interface inheritance. The inheritance ability is subject to the public document of the base class; the fields in Omit have been excluded and cannot be used as they are according to the base class.

Share Frame API · Return API

The following type declarations are actually referenced by public Props and come from source. A Svelte Snippet denotes a content fragment; ComponentProps denotes the Props of the corresponding component.

GaugeChartItem

Source: components/src/components/GaugeChart.svelte

export interface GaugeChartItem {        name: string;        value: number;        color?: GaugeChartColor;        percentFormat?: NumberFormatOptions;    }

GaugeChartColor

Source: components/src/components/GaugeChart.svelte

export type GaugeChartColor = ChartColor;

ChartColor

Source: components/src/lib/chart/colors.ts

export type ChartColor = SnowUIColor | string | ChartGradient;

SnowUIColor

Source: components/src/lib/color.ts

export type SnowUIColor = keyof typeof SNOWUI_COLOR_TOKENS;

ChartGradient

Source: components/src/lib/chart/colors.ts

export interface ChartGradient {    type?: "linear";    angle?: number;    stops: (string | ChartGradientStop)[];}

ChartGradientStop

Source: components/src/lib/chart/colors.ts

export interface ChartGradientStop {    color: SnowUIColor | string;    offset?: number | string;    opacity?: number;}

NumberFormatOptions

Source: components/src/lib/number-format.ts

export interface NumberFormatOptions {    fractionDigits?: number;    valueLabelFractionDigits?: number;    percentFractionDigits?: number;    preserveTrailingZeros?: boolean;    useGrouping?: boolean;    emptyValue?: string;    locale?: string;    notation?: NumberNotation;    compactThreshold?: number;    compactFractionDigits?: number;}

NumberNotation

Source: components/src/lib/number-format.ts

export type NumberNotation = "standard" | "compact" | "auto";

GaugeChartColorMode

Source: components/src/components/GaugeChart.svelte

export type GaugeChartColorMode = ChartColorMode;

ChartColorMode

Source: components/src/lib/chart/colors.ts

export type ChartColorMode = "sequence" | "monochromeFade" | "monochrome";

StartDirection

Source: components/src/components/GaugeChart.svelte

type StartDirection = "left" | "right";

AnchorPoint

Source: components/src/components/GaugeChart.svelte

type AnchorPoint = "top" | "center" | "bottom";

ChartHoverMode

Source: components/src/components/GaugeChart.svelte

type ChartHoverMode = "item" | "cell";

ChartHoverPanelVariant

Source: components/src/lib/chart/hover-panel.ts

export type ChartHoverPanelVariant = "dark" | "light" | "surface";

ChartHoverPanelPlacement

Source: components/src/lib/chart/hover-panel.ts

export type ChartHoverPanelPlacement =    | "anchor-top"    | "anchor-side"    | "pointer"    | "pin-top-left"    | "pin-top"    | "pin-top-right"    | "pin-right"    | "pin-bottom-right"    | "pin-bottom"    | "pin-bottom-left"    | "pin-left"    | "pin-center";