@torpor/ui 0.4.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -7
- package/dist/Accordion/Accordion.torp +42 -165
- package/dist/Accordion/AccordionContent.torp +6 -6
- package/dist/Accordion/AccordionHeader.torp +7 -11
- package/dist/Accordion/AccordionItem.torp +24 -24
- package/dist/Accordion/AccordionTrigger.torp +17 -8
- package/dist/Accordion/AccordionTypes.ts +1 -1
- package/dist/Accordion/index.d.ts +23 -25
- package/dist/Accordion/index.js +6 -22
- package/dist/Breadcrumb/Breadcrumb.torp +12 -10
- package/dist/Breadcrumb/BreadcrumbItem.torp +6 -6
- package/dist/Breadcrumb/BreadcrumbList.torp +21 -0
- package/dist/Breadcrumb/BreadcrumbSeparator.torp +4 -4
- package/dist/Breadcrumb/index.d.ts +39 -15
- package/dist/Breadcrumb/index.js +5 -14
- package/dist/Calendar/Calendar.torp +163 -156
- package/dist/Calendar/CalendarDay.torp +91 -45
- package/dist/Calendar/CalendarDayHeader.torp +36 -0
- package/dist/Calendar/CalendarGrid.torp +104 -0
- package/dist/Calendar/CalendarGridHeader.torp +43 -0
- package/dist/Calendar/CalendarHeader.torp +48 -0
- package/dist/Calendar/CalendarHeaderTrigger.torp +54 -0
- package/dist/Calendar/CalendarTypes.ts +24 -3
- package/dist/Calendar/buildDays.ts +54 -0
- package/dist/Calendar/index.d.ts +191 -5
- package/dist/Calendar/index.js +8 -10
- package/dist/Carousel/Carousel.torp +180 -0
- package/dist/Carousel/CarouselIndicators.torp +65 -0
- package/dist/Carousel/CarouselNext.torp +43 -0
- package/dist/Carousel/CarouselPrevious.torp +44 -0
- package/dist/Carousel/CarouselSlide.torp +57 -0
- package/dist/Carousel/CarouselTypes.ts +28 -0
- package/dist/Carousel/index.d.ts +147 -0
- package/dist/Carousel/index.js +6 -0
- package/dist/Charts/BarChart.torp +55 -144
- package/dist/Charts/Chart.torp +120 -0
- package/dist/Charts/ChartBars.torp +78 -0
- package/dist/Charts/ChartColumns.torp +66 -0
- package/dist/Charts/ChartGrid.torp +54 -0
- package/dist/Charts/ChartLines.torp +60 -0
- package/dist/Charts/ChartTypes.ts +25 -0
- package/dist/Charts/ChartXAxis.torp +85 -0
- package/dist/Charts/ChartYAxis.torp +107 -0
- package/dist/Charts/ColumnChart.torp +70 -0
- package/dist/Charts/GridLines.torp +4 -4
- package/dist/Charts/LineChart.torp +55 -178
- package/dist/Charts/PieChart.torp +14 -20
- package/dist/Charts/ScatterChart.torp +45 -38
- package/dist/Charts/SparkLine.torp +16 -19
- package/dist/Charts/XAxis.torp +14 -11
- package/dist/Charts/YAxis.torp +10 -8
- package/dist/Charts/index.d.ts +328 -79
- package/dist/Charts/index.js +17 -34
- package/dist/ColorPicker/ColorPalette.torp +154 -0
- package/dist/ColorPicker/ColorPicker.torp +157 -0
- package/dist/ColorPicker/index.d.ts +85 -0
- package/dist/ColorPicker/index.js +3 -0
- package/dist/ComboBox/ComboBox.torp +205 -0
- package/dist/ComboBox/ComboBoxContent.torp +120 -0
- package/dist/ComboBox/ComboBoxInput.torp +161 -0
- package/dist/ComboBox/ComboBoxTrigger.torp +49 -0
- package/dist/ComboBox/ComboBoxTypes.ts +39 -0
- package/dist/ComboBox/index.d.ts +154 -0
- package/dist/ComboBox/index.js +6 -0
- package/dist/CommandPalette/CommandPalette.torp +223 -0
- package/dist/CommandPalette/CommandTypes.ts +14 -0
- package/dist/CommandPalette/index.d.ts +45 -0
- package/dist/CommandPalette/index.js +2 -0
- package/dist/Contextual/Contextual.torp +32 -50
- package/dist/Contextual/ContextualContent.torp +29 -73
- package/dist/Contextual/ContextualHover.torp +112 -0
- package/dist/Contextual/ContextualTrigger.torp +31 -42
- package/dist/Contextual/ContextualTypes.ts +4 -17
- package/dist/Contextual/index.d.ts +44 -27
- package/dist/Contextual/index.js +5 -14
- package/dist/DataGrid/DataGrid.torp +496 -0
- package/dist/DataGrid/DataGridTypes.ts +25 -0
- package/dist/DataGrid/index.d.ts +90 -0
- package/dist/DataGrid/index.js +3 -0
- package/dist/DataGrid/sortRows.ts +32 -0
- package/dist/DatePicker/DatePicker.torp +222 -0
- package/dist/DatePicker/DatePickerHeader.torp +20 -0
- package/dist/DatePicker/index.d.ts +55 -0
- package/dist/DatePicker/index.js +2 -0
- package/dist/DateRangePicker/DateRangePicker.torp +315 -0
- package/dist/DateRangePicker/DateRangePickerDay.torp +137 -0
- package/dist/DateRangePicker/DateRangePickerTypes.ts +21 -0
- package/dist/DateRangePicker/index.d.ts +76 -0
- package/dist/DateRangePicker/index.js +3 -0
- package/dist/Dialog/Dialog.torp +24 -17
- package/dist/Dialog/DialogBody.torp +5 -9
- package/dist/Dialog/DialogButton.torp +12 -12
- package/dist/Dialog/DialogFooter.torp +3 -7
- package/dist/Dialog/DialogHeader.torp +6 -10
- package/dist/Dialog/index.d.ts +27 -27
- package/dist/Dialog/index.js +6 -22
- package/dist/Disclosure/Disclosure.torp +18 -18
- package/dist/Disclosure/DisclosureContent.torp +5 -6
- package/dist/Disclosure/DisclosureHeader.torp +7 -11
- package/dist/Disclosure/DisclosureTrigger.torp +4 -5
- package/dist/Disclosure/index.d.ts +14 -16
- package/dist/Disclosure/index.js +5 -18
- package/dist/Drawer/Drawer.torp +19 -49
- package/dist/Drawer/DrawerContent.torp +70 -13
- package/dist/Drawer/DrawerOverlay.torp +4 -4
- package/dist/Drawer/DrawerTrigger.torp +16 -4
- package/dist/Drawer/DrawerTypes.ts +3 -0
- package/dist/Drawer/index.d.ts +16 -20
- package/dist/Drawer/index.js +5 -18
- package/dist/FocusGroup/FocusGroup.torp +70 -0
- package/dist/FocusGroup/FocusGroupButton.torp +59 -0
- package/dist/FocusGroup/FocusGroupTypes.ts +14 -0
- package/dist/FocusGroup/index.d.ts +44 -0
- package/dist/FocusGroup/index.js +3 -0
- package/dist/Form/CheckBox.torp +27 -18
- package/dist/Form/Field.torp +17 -17
- package/dist/Form/File.torp +31 -22
- package/dist/Form/FileDrop.torp +187 -0
- package/dist/Form/Form.torp +24 -22
- package/dist/Form/FormTypes.ts +2 -0
- package/dist/Form/FormValues.torp +37 -0
- package/dist/Form/Hidden.torp +4 -12
- package/dist/Form/Input.torp +38 -32
- package/dist/Form/Label.torp +3 -3
- package/dist/Form/Message.torp +13 -5
- package/dist/Form/MessageSummary.torp +5 -4
- package/dist/Form/Option.torp +11 -7
- package/dist/Form/Select.torp +32 -28
- package/dist/Form/TextArea.torp +35 -31
- package/dist/Form/Toggle.torp +109 -0
- package/dist/Form/index.d.ts +178 -79
- package/dist/Form/index.js +16 -50
- package/dist/ListBox/ListBox.torp +253 -150
- package/dist/ListBox/ListBoxItem.torp +54 -30
- package/dist/ListBox/ListBoxSeparator.torp +5 -2
- package/dist/ListBox/ListBoxTypes.ts +23 -5
- package/dist/ListBox/LoadedListBoxItems.torp +41 -0
- package/dist/ListBox/index.d.ts +56 -17
- package/dist/ListBox/index.js +4 -14
- package/dist/MaskedInput/MaskedInput.torp +143 -0
- package/dist/MaskedInput/index.d.ts +52 -0
- package/dist/MaskedInput/index.js +2 -0
- package/dist/Menu/Menu.torp +86 -71
- package/dist/Menu/MenuButton.torp +17 -10
- package/dist/Menu/MenuCheck.torp +22 -18
- package/dist/Menu/MenuGroup.torp +4 -4
- package/dist/Menu/MenuIndicator.torp +5 -13
- package/dist/Menu/MenuPopout.torp +20 -50
- package/dist/Menu/MenuPopoutContent.torp +15 -66
- package/dist/Menu/MenuPopoutTrigger.torp +19 -100
- package/dist/Menu/MenuRadio.torp +25 -26
- package/dist/Menu/MenuRadioGroup.torp +25 -68
- package/dist/Menu/MenuSeparator.torp +3 -2
- package/dist/Menu/MenuTypes.ts +9 -19
- package/dist/Menu/index.d.ts +45 -51
- package/dist/Menu/index.js +12 -46
- package/dist/MenuBar/MenuBar.torp +31 -83
- package/dist/MenuBar/MenuBarItem.torp +33 -51
- package/dist/MenuBar/MenuBarItemContent.torp +15 -101
- package/dist/MenuBar/MenuBarItemTrigger.torp +20 -55
- package/dist/MenuBar/MenuBarTypes.ts +11 -10
- package/dist/MenuBar/index.d.ts +17 -19
- package/dist/MenuBar/index.js +5 -18
- package/dist/Modal/Modal.torp +22 -47
- package/dist/Modal/ModalContent.torp +21 -44
- package/dist/Modal/ModalOverlay.torp +4 -4
- package/dist/Modal/ModalTrigger.torp +16 -32
- package/dist/Modal/ModalTypes.ts +5 -16
- package/dist/Modal/index.d.ts +17 -29
- package/dist/Modal/index.js +29 -28
- package/dist/Modal/index.js.map +1 -1
- package/dist/Modal/showPrompt.ts +2 -2
- package/dist/NavMenu/NavMenu.torp +22 -111
- package/dist/NavMenu/NavMenuButton.torp +7 -8
- package/dist/NavMenu/NavMenuElement.torp +6 -7
- package/dist/NavMenu/NavMenuGroup.torp +5 -5
- package/dist/NavMenu/NavMenuGroupHeader.torp +5 -8
- package/dist/NavMenu/NavMenuLink.torp +7 -10
- package/dist/NavMenu/NavMenuPopout.torp +15 -60
- package/dist/NavMenu/NavMenuPopoutContent.torp +14 -73
- package/dist/NavMenu/NavMenuPopoutTrigger.torp +17 -99
- package/dist/NavMenu/NavMenuSeparator.torp +3 -7
- package/dist/NavMenu/NavMenuTypes.ts +4 -14
- package/dist/NavMenu/index.d.ts +40 -44
- package/dist/NavMenu/index.js +11 -42
- package/dist/Notification/Notification.torp +12 -24
- package/dist/Notification/NotificationClose.torp +6 -3
- package/dist/Notification/NotificationContainer.torp +3 -7
- package/dist/Notification/NotificationContent.torp +3 -7
- package/dist/Notification/NotificationTypes.ts +1 -1
- package/dist/Notification/index.d.ts +15 -12
- package/dist/Notification/index.js +22 -32
- package/dist/Notification/index.js.map +1 -1
- package/dist/NumberInput/NumberInput.torp +255 -0
- package/dist/NumberInput/index.d.ts +44 -0
- package/dist/NumberInput/index.js +2 -0
- package/dist/Pagination/Pagination.torp +41 -34
- package/dist/Pagination/PaginationItem.torp +50 -13
- package/dist/Pagination/PaginationTypes.ts +3 -6
- package/dist/Pagination/buildPages.ts +9 -5
- package/dist/Pagination/index.d.ts +19 -9
- package/dist/Pagination/index.js +3 -40
- package/dist/Popover/Popover.torp +32 -50
- package/dist/Popover/PopoverContent.torp +27 -76
- package/dist/Popover/PopoverHover.torp +90 -0
- package/dist/Popover/PopoverTrigger.torp +17 -40
- package/dist/Popover/PopoverTypes.ts +4 -17
- package/dist/Popover/index.d.ts +40 -25
- package/dist/Popover/index.js +18 -18
- package/dist/Popover/index.js.map +1 -1
- package/dist/Progress/Progress.torp +88 -0
- package/dist/Progress/index.d.ts +37 -0
- package/dist/Progress/index.js +2 -0
- package/dist/Rating/Rating.torp +225 -0
- package/dist/Rating/index.d.ts +44 -0
- package/dist/Rating/index.js +2 -0
- package/dist/SegmentedControl/SegmentedControl.torp +233 -0
- package/dist/SegmentedControl/SegmentedControlTypes.ts +26 -0
- package/dist/SegmentedControl/SegmentedItem.torp +78 -0
- package/dist/SegmentedControl/index.d.ts +74 -0
- package/dist/SegmentedControl/index.js +3 -0
- package/dist/SelectBox/SelectBox.torp +107 -53
- package/dist/SelectBox/SelectBoxContent.torp +49 -19
- package/dist/SelectBox/SelectBoxTrigger.torp +108 -8
- package/dist/SelectBox/SelectBoxTypes.ts +26 -11
- package/dist/SelectBox/index.d.ts +39 -54
- package/dist/SelectBox/index.js +5 -18
- package/dist/Slider/Slider.torp +245 -0
- package/dist/Slider/index.d.ts +45 -0
- package/dist/Slider/index.js +2 -0
- package/dist/Splitter/Splitter.torp +156 -0
- package/dist/Splitter/SplitterHandle.torp +161 -0
- package/dist/Splitter/SplitterPane.torp +63 -0
- package/dist/Splitter/SplitterTypes.ts +31 -0
- package/dist/Splitter/index.d.ts +103 -0
- package/dist/Splitter/index.js +4 -0
- package/dist/Stepper/Stepper.torp +146 -0
- package/dist/Stepper/StepperMarker.torp +24 -0
- package/dist/Stepper/StepperNext.torp +44 -0
- package/dist/Stepper/StepperPrevious.torp +44 -0
- package/dist/Stepper/StepperStep.torp +90 -0
- package/dist/Stepper/StepperTypes.ts +30 -0
- package/dist/Stepper/index.d.ts +149 -0
- package/dist/Stepper/index.js +6 -0
- package/dist/TabGroup/TabContent.torp +6 -6
- package/dist/TabGroup/TabGroup.torp +97 -113
- package/dist/TabGroup/TabGroupTypes.ts +1 -1
- package/dist/TabGroup/TabHeader.torp +23 -19
- package/dist/TabGroup/TabList.torp +8 -21
- package/dist/TabGroup/TabTrigger.torp +6 -7
- package/dist/TabGroup/index.d.ts +26 -26
- package/dist/TabGroup/index.js +6 -22
- package/dist/TagInput/TagInput.torp +378 -0
- package/dist/TagInput/index.d.ts +48 -0
- package/dist/TagInput/index.js +2 -0
- package/dist/TimePicker/TimePicker.torp +462 -0
- package/dist/TimePicker/index.d.ts +53 -0
- package/dist/TimePicker/index.js +2 -0
- package/dist/ToolBar/ToolBar.torp +29 -110
- package/dist/ToolBar/ToolBarButton.torp +7 -8
- package/dist/ToolBar/ToolBarElement.torp +7 -11
- package/dist/ToolBar/ToolBarPopout.torp +16 -68
- package/dist/ToolBar/ToolBarPopoutContent.torp +15 -73
- package/dist/ToolBar/ToolBarPopoutTrigger.torp +19 -110
- package/dist/ToolBar/ToolBarSeparator.torp +3 -7
- package/dist/ToolBar/ToolBarTypes.ts +7 -14
- package/dist/ToolBar/index.d.ts +30 -32
- package/dist/ToolBar/index.js +8 -30
- package/dist/Tree/Tree.torp +395 -0
- package/dist/Tree/TreeItem.torp +176 -0
- package/dist/Tree/TreeItemChildren.torp +60 -0
- package/dist/Tree/TreeItemContent.torp +46 -0
- package/dist/Tree/TreeItemLabel.torp +94 -0
- package/dist/Tree/TreeItemTrigger.torp +78 -0
- package/dist/Tree/TreeLoadedChildren.torp +122 -0
- package/dist/Tree/TreeTypes.ts +63 -0
- package/dist/Tree/index.d.ts +262 -0
- package/dist/Tree/index.js +7 -0
- package/dist/icons/ChevronDoubleLeft.torp +19 -0
- package/dist/icons/ChevronDoubleRight.torp +19 -0
- package/dist/icons/index.d.ts +61 -1
- package/dist/icons/index.js +17 -58
- package/dist/loader-DEeG5vFY.js +44 -0
- package/dist/loader-DEeG5vFY.js.map +1 -0
- package/dist/motion/index.d.ts +12 -8
- package/dist/motion/index.d.ts.map +1 -0
- package/dist/motion/index.js +70 -88
- package/dist/motion/index.js.map +1 -1
- package/dist/mount/draggable.ts +63 -0
- package/dist/mount/dropTarget.ts +108 -0
- package/dist/mount/hoverTrigger.ts +1 -1
- package/dist/utils/$handle.ts +23 -0
- package/dist/utils/LoadedItems.torp +47 -0
- package/dist/utils/PopoutClickTrigger.torp +99 -0
- package/dist/utils/PopoutTypes.ts +59 -12
- package/dist/utils/SubmenuPopout.torp +89 -0
- package/dist/utils/SubmenuPopoutContent.torp +87 -0
- package/dist/utils/SubmenuPopoutTrigger.torp +160 -0
- package/dist/utils/chartColors.ts +13 -13
- package/dist/utils/chartLayout.ts +143 -0
- package/dist/utils/colorUtils.ts +103 -0
- package/dist/utils/createItemGroup.ts +152 -0
- package/dist/utils/dateUtils.ts +8 -7
- package/dist/utils/documentEvents.ts +4 -4
- package/dist/utils/dragState.ts +86 -0
- package/dist/utils/focusGroup.ts +204 -0
- package/dist/utils/focusItem.ts +44 -0
- package/dist/utils/formField.ts +70 -0
- package/dist/utils/hoverOpen.ts +50 -0
- package/dist/utils/hoverReveal.ts +194 -0
- package/dist/utils/loader.ts +113 -0
- package/dist/utils/maskUtils.ts +98 -0
- package/dist/utils/popoutContent.ts +137 -0
- package/dist/utils/reorderList.ts +52 -0
- package/package.json +97 -22
- package/dist/Accordion/index.js.map +0 -1
- package/dist/Breadcrumb/index.js.map +0 -1
- package/dist/Calendar/index.js.map +0 -1
- package/dist/Charts/index.js.map +0 -1
- package/dist/Contextual/index.js.map +0 -1
- package/dist/Dialog/index.js.map +0 -1
- package/dist/Disclosure/index.js.map +0 -1
- package/dist/Drawer/index.js.map +0 -1
- package/dist/Form/index.js.map +0 -1
- package/dist/ListBox/index.js.map +0 -1
- package/dist/Menu/index.js.map +0 -1
- package/dist/MenuBar/index.js.map +0 -1
- package/dist/NavMenu/index.js.map +0 -1
- package/dist/Pagination/index.js.map +0 -1
- package/dist/SelectBox/SelectBoxInput.torp +0 -95
- package/dist/SelectBox/index.js.map +0 -1
- package/dist/TabGroup/index.js.map +0 -1
- package/dist/ToolBar/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/index.d.ts +0 -19
- package/dist/metafile-esm.json +0 -1
- package/dist/motion/fade.ts +0 -16
- package/dist/motion/grow.ts +0 -23
- package/dist/motion/measure.ts +0 -28
- package/dist/motion/slide.ts +0 -45
- package/dist/mount/index.d.ts +0 -2
- package/dist/utils/index.d.ts +0 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { type ChartContext, ChartContextName } from "./ChartTypes";
|
|
2
|
+
|
|
3
|
+
interface ChartXAxisProps {
|
|
4
|
+
/** Whether to draw the axis line itself (default true) */
|
|
5
|
+
showAxis?: boolean;
|
|
6
|
+
/** An axis title, overriding the Chart's x label */
|
|
7
|
+
label?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The x axis for a chart. For vertical marks (columns, lines) it runs along
|
|
12
|
+
* the bottom with each series' label centered under its slot; for
|
|
13
|
+
* horizontal marks (bars) it becomes the value scale, with a tick for each
|
|
14
|
+
* step along the bottom.
|
|
15
|
+
*/
|
|
16
|
+
export default function ChartXAxis($props?: ChartXAxisProps) {
|
|
17
|
+
const context = $context[ChartContextName] as ChartContext;
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error("ChartXAxis must be contained within a Chart");
|
|
20
|
+
}
|
|
21
|
+
const { layout, xLabel, horizontal } = context;
|
|
22
|
+
|
|
23
|
+
function showAxis(): boolean {
|
|
24
|
+
return $props?.showAxis !== false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function title(): string {
|
|
28
|
+
if ($props?.label !== undefined) return $props.label;
|
|
29
|
+
return xLabel();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function plotWidth(): number {
|
|
33
|
+
return layout.calculatedWidth - layout.chartLeft;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function unitWidth(): number {
|
|
37
|
+
return plotWidth() / Math.max(1, layout.maxValue);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function tickX(i: number): number {
|
|
41
|
+
return layout.chartLeft + i * layout.stepValue * unitWidth();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function tickY(): number {
|
|
45
|
+
return layout.calculatedHeight - layout.textHeight / 3;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@render {
|
|
49
|
+
<svg>
|
|
50
|
+
@if (showAxis()) {
|
|
51
|
+
<line x1={layout.chartLeft} y1={layout.chartBottom} x2={layout.calculatedWidth} y2={layout.chartBottom} stroke="currentcolor" />
|
|
52
|
+
}
|
|
53
|
+
@if (!horizontal()) {
|
|
54
|
+
@if (title()) {
|
|
55
|
+
<text
|
|
56
|
+
fill="currentcolor"
|
|
57
|
+
text-anchor="middle"
|
|
58
|
+
dominant-baseline="text-after-edge"
|
|
59
|
+
x={layout.calculatedWidth - (layout.calculatedWidth - layout.chartLeft) / 2}
|
|
60
|
+
y={layout.calculatedHeight}
|
|
61
|
+
>
|
|
62
|
+
{title()}
|
|
63
|
+
</text>
|
|
64
|
+
}
|
|
65
|
+
@for (let [i, label] of layout.labels.entries()) {
|
|
66
|
+
<text
|
|
67
|
+
fill="currentcolor"
|
|
68
|
+
text-anchor="middle"
|
|
69
|
+
dominant-baseline="text-after-edge"
|
|
70
|
+
x={layout.chartLeft + layout.itemWidth * i + layout.itemWidth / 2}
|
|
71
|
+
y={tickY()}
|
|
72
|
+
>
|
|
73
|
+
{label}
|
|
74
|
+
</text>
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
@for (let [i, label] of layout.stepLabels.entries()) {
|
|
78
|
+
<text text-anchor="middle" dominant-baseline="text-after-edge" x={tickX(i)} y={tickY()}>
|
|
79
|
+
{label}
|
|
80
|
+
</text>
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
</svg>
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type ChartContext, ChartContextName } from "./ChartTypes";
|
|
2
|
+
|
|
3
|
+
interface ChartYAxisProps {
|
|
4
|
+
/** Whether to draw the axis line itself (default true) */
|
|
5
|
+
showAxis?: boolean;
|
|
6
|
+
/** Which side of the plot the value scale runs on (default "left") */
|
|
7
|
+
side?: "left" | "right";
|
|
8
|
+
/** An axis title, overriding the Chart's y label */
|
|
9
|
+
label?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The y axis for a chart. For vertical marks (columns, lines) it is the
|
|
14
|
+
* value scale -- a line down the `side` edge with a tick for each step
|
|
15
|
+
* between 0 and the maximum value. For horizontal marks (bars) it carries
|
|
16
|
+
* the category labels, one per band down the left.
|
|
17
|
+
*
|
|
18
|
+
* Drawing it on either side does not change the plot geometry; overlaying
|
|
19
|
+
* an axis is purely presentational.
|
|
20
|
+
*/
|
|
21
|
+
export default function ChartYAxis($props?: ChartYAxisProps) {
|
|
22
|
+
const context = $context[ChartContextName] as ChartContext;
|
|
23
|
+
if (!context) {
|
|
24
|
+
throw new Error("ChartYAxis must be contained within a Chart");
|
|
25
|
+
}
|
|
26
|
+
const { layout, yLabel, horizontal } = context;
|
|
27
|
+
|
|
28
|
+
function showAxis(): boolean {
|
|
29
|
+
return $props?.showAxis !== false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function side(): "left" | "right" {
|
|
33
|
+
return $props?.side ?? "left";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function title(): string {
|
|
37
|
+
if ($props?.label !== undefined) return $props.label;
|
|
38
|
+
return yLabel();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function bandHeight(): number {
|
|
42
|
+
const count = Math.max(1, layout.labels.length);
|
|
43
|
+
return (layout.chartBottom - topPad()) / count;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function topPad(): number {
|
|
47
|
+
return layout.textHeight / 3;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function bandCenter(i: number): number {
|
|
51
|
+
return topPad() + i * bandHeight() + bandHeight() / 2;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function axisX(): number {
|
|
55
|
+
return side() === "left" ? layout.chartLeft : layout.calculatedWidth;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function tickX(): number {
|
|
59
|
+
if (side() === "left") {
|
|
60
|
+
return layout.chartLeft - layout.textHeight / 4;
|
|
61
|
+
}
|
|
62
|
+
return layout.calculatedWidth + layout.textHeight / 4;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function anchor(): string {
|
|
66
|
+
return side() === "left" ? "end" : "start";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@render {
|
|
70
|
+
<svg>
|
|
71
|
+
@if (showAxis()) {
|
|
72
|
+
<line x1={axisX()} y1={layout.chartBottom} x2={axisX()} y2={0} stroke="currentcolor" />
|
|
73
|
+
}
|
|
74
|
+
@if (horizontal()) {
|
|
75
|
+
@for (let [i, label] of layout.labels.entries()) {
|
|
76
|
+
<text
|
|
77
|
+
fill="currentcolor"
|
|
78
|
+
text-anchor="end"
|
|
79
|
+
dominant-baseline="middle"
|
|
80
|
+
x={layout.chartLeft - layout.textHeight / 4}
|
|
81
|
+
y={bandCenter(i)}
|
|
82
|
+
>
|
|
83
|
+
{label}
|
|
84
|
+
</text>
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
@if (side() === "left" && title()) {
|
|
88
|
+
<text
|
|
89
|
+
fill="currentcolor"
|
|
90
|
+
text-anchor="middle"
|
|
91
|
+
dominant-baseline="hanging"
|
|
92
|
+
x={0}
|
|
93
|
+
y={layout.chartBottom / 2}
|
|
94
|
+
transform={`rotate(-90, 0, ${layout.chartBottom / 2})`}
|
|
95
|
+
>
|
|
96
|
+
{title()}
|
|
97
|
+
</text>
|
|
98
|
+
}
|
|
99
|
+
@for (let [i, label] of layout.stepLabels.entries()) {
|
|
100
|
+
<text text-anchor={anchor()} dominant-baseline="middle" x={tickX()} y={layout.chartBottom - i * layout.stepValue * layout.valueHeight}>
|
|
101
|
+
{label}
|
|
102
|
+
</text>
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
</svg>
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
+
import Chart from "./Chart.torp";
|
|
3
|
+
import ChartXAxis from "./ChartXAxis.torp";
|
|
4
|
+
import ChartColumns from "./ChartColumns.torp";
|
|
5
|
+
import ChartGrid from "./ChartGrid.torp";
|
|
6
|
+
import ChartYAxis from "./ChartYAxis.torp";
|
|
7
|
+
import type DataSeries from "./DataSeries";
|
|
8
|
+
|
|
9
|
+
interface ColumnChartProps {
|
|
10
|
+
/** An ID for the root element */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Classes for the root element */
|
|
13
|
+
class?: ClassValue;
|
|
14
|
+
/** Styles for the root element */
|
|
15
|
+
style?: StyleValue;
|
|
16
|
+
/** An ARIA label describing the chart for screen readers */
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
series: DataSeries[];
|
|
19
|
+
height?: number;
|
|
20
|
+
width?: number;
|
|
21
|
+
xLabel?: string;
|
|
22
|
+
yLabel?: string;
|
|
23
|
+
maxValue?: number;
|
|
24
|
+
stepCount?: number;
|
|
25
|
+
stepValue?: number;
|
|
26
|
+
showHLines?: boolean;
|
|
27
|
+
showVLines?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A column chart: each value in each series is drawn as a vertical column,
|
|
32
|
+
* grouped under the series' label along the bottom axis.
|
|
33
|
+
*
|
|
34
|
+
* This is a preset over the layered chart components:
|
|
35
|
+
*
|
|
36
|
+
* ```
|
|
37
|
+
* <Chart>
|
|
38
|
+
* <ChartValueAxis />
|
|
39
|
+
* <ChartGrid />
|
|
40
|
+
* <ChartXAxis />
|
|
41
|
+
* <ChartColumns />
|
|
42
|
+
* </Chart>
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* Compose those directly to customize -- e.g. the value axis on the right,
|
|
46
|
+
* or a line overlaid with ChartLines.
|
|
47
|
+
*/
|
|
48
|
+
export default function ColumnChart($props: ColumnChartProps) {
|
|
49
|
+
@render {
|
|
50
|
+
<Chart
|
|
51
|
+
{$props?.id}
|
|
52
|
+
class={["torp-column-chart", $props?.class]}
|
|
53
|
+
{$props?.style}
|
|
54
|
+
{$props?.ariaLabel}
|
|
55
|
+
{$props?.series}
|
|
56
|
+
{$props?.height}
|
|
57
|
+
{$props?.width}
|
|
58
|
+
{$props?.xLabel}
|
|
59
|
+
{$props?.yLabel}
|
|
60
|
+
{$props?.maxValue}
|
|
61
|
+
{$props?.stepCount}
|
|
62
|
+
{$props?.stepValue}
|
|
63
|
+
>
|
|
64
|
+
<ChartYAxis />
|
|
65
|
+
<ChartGrid hLines={$props.showHLines === true} vLines={$props.showVLines === true} />
|
|
66
|
+
<ChartXAxis />
|
|
67
|
+
<ChartColumns />
|
|
68
|
+
</Chart>
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -4,11 +4,11 @@ interface GridLinesProps {
|
|
|
4
4
|
/** An ID for the root element */
|
|
5
5
|
id?: string;
|
|
6
6
|
/** Classes for the root element */
|
|
7
|
-
class?: ClassValue
|
|
7
|
+
class?: ClassValue;
|
|
8
8
|
/** Styles for the root element */
|
|
9
|
-
style?: StyleValue
|
|
10
|
-
showHLines?: boolean
|
|
11
|
-
showVLines?: boolean
|
|
9
|
+
style?: StyleValue;
|
|
10
|
+
showHLines?: boolean;
|
|
11
|
+
showVLines?: boolean;
|
|
12
12
|
width: number;
|
|
13
13
|
labels: string[];
|
|
14
14
|
xStepValue: number;
|
|
@@ -1,196 +1,73 @@
|
|
|
1
1
|
import type { ClassValue, StyleValue } from "@torpor/view";
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
calculateMaxValue,
|
|
8
|
-
calculateStepValue,
|
|
9
|
-
calculateStepLabels,
|
|
10
|
-
calculateItemWidth,
|
|
11
|
-
calculateValueHeight,
|
|
12
|
-
calculateChartBottom,
|
|
13
|
-
calculateChartLeft
|
|
14
|
-
} from "../utils/chartUtils";
|
|
15
|
-
import { chartColors } from "../utils/chartColors";
|
|
16
|
-
|
|
2
|
+
import Chart from "./Chart.torp";
|
|
3
|
+
import ChartXAxis from "./ChartXAxis.torp";
|
|
4
|
+
import ChartGrid from "./ChartGrid.torp";
|
|
5
|
+
import ChartLines from "./ChartLines.torp";
|
|
6
|
+
import ChartYAxis from "./ChartYAxis.torp";
|
|
17
7
|
import type DataSeries from "./DataSeries";
|
|
18
8
|
|
|
19
9
|
interface LineChartProps {
|
|
20
10
|
/** An ID for the root element */
|
|
21
11
|
id?: string;
|
|
22
12
|
/** Classes for the root element */
|
|
23
|
-
class?: ClassValue
|
|
13
|
+
class?: ClassValue;
|
|
24
14
|
/** Styles for the root element */
|
|
25
|
-
style?: StyleValue
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
showHLines?: boolean
|
|
38
|
-
showVLines?: boolean
|
|
15
|
+
style?: StyleValue;
|
|
16
|
+
/** An ARIA label describing the chart for screen readers */
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
series: DataSeries[];
|
|
19
|
+
height?: number;
|
|
20
|
+
width?: number;
|
|
21
|
+
xLabel?: string;
|
|
22
|
+
yLabel?: string;
|
|
23
|
+
maxValue?: number;
|
|
24
|
+
stepCount?: number;
|
|
25
|
+
stepValue?: number;
|
|
26
|
+
showPoints?: boolean;
|
|
27
|
+
showHLines?: boolean;
|
|
28
|
+
showVLines?: boolean;
|
|
39
29
|
}
|
|
40
30
|
|
|
31
|
+
/**
|
|
32
|
+
* A line chart: each series drawn as a connected line across the category
|
|
33
|
+
* slots.
|
|
34
|
+
*
|
|
35
|
+
* This is a preset over the layered chart components:
|
|
36
|
+
*
|
|
37
|
+
* ```
|
|
38
|
+
* <Chart>
|
|
39
|
+
* <ChartValueAxis />
|
|
40
|
+
* <ChartGrid />
|
|
41
|
+
* <ChartXAxis />
|
|
42
|
+
* <ChartLines seriesIndex={0} />
|
|
43
|
+
* </Chart>
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* Compose those directly for overlaid layers (columns plus a line, multiple
|
|
47
|
+
* separately-indexed lines etc).
|
|
48
|
+
*/
|
|
41
49
|
export default function LineChart($props: LineChartProps) {
|
|
42
|
-
const defaultHeight = 200;
|
|
43
|
-
const defaultWidth = 400;
|
|
44
|
-
|
|
45
|
-
let container: HTMLElement;
|
|
46
|
-
let measurer: SVGTextElement;
|
|
47
|
-
|
|
48
|
-
let $state = $watch({
|
|
49
|
-
textWidth: 0,
|
|
50
|
-
textHeight: 0,
|
|
51
|
-
get labels() {
|
|
52
|
-
return $props.series.map((s) => s.name);
|
|
53
|
-
},
|
|
54
|
-
get calculatedHeight() {
|
|
55
|
-
return $props.height || defaultHeight;
|
|
56
|
-
},
|
|
57
|
-
get calculatedWidth() {
|
|
58
|
-
return $props.width || container?.clientWidth || defaultWidth;
|
|
59
|
-
},
|
|
60
|
-
get maxValue() {
|
|
61
|
-
return $props.maxValue || calculateMaxValue($props.series);
|
|
62
|
-
},
|
|
63
|
-
get calculatedStepValue() {
|
|
64
|
-
return $props.stepValue || calculateStepValue($state.maxValue, $props.stepCount);
|
|
65
|
-
},
|
|
66
|
-
get stepLabels() {
|
|
67
|
-
return calculateStepLabels($props.stepCount || 2, $state.calculatedStepValue);
|
|
68
|
-
},
|
|
69
|
-
get itemWidth() {
|
|
70
|
-
return calculateItemWidth($state.calculatedWidth, $state.chartLeft, $state.labels);
|
|
71
|
-
},
|
|
72
|
-
get valueHeight() {
|
|
73
|
-
return calculateValueHeight($state.chartBottom, $state.textHeight, $state.calculatedStepValue, $props.stepCount || 2);
|
|
74
|
-
},
|
|
75
|
-
get chartBottom() {
|
|
76
|
-
return calculateChartBottom($props.xLabel ?? "", $state.calculatedHeight, $state.textHeight);
|
|
77
|
-
},
|
|
78
|
-
get chartLeft() {
|
|
79
|
-
return calculateChartLeft($state.stepLabels, $props.yLabel ?? "", $state.textHeight, $state.textWidth);
|
|
80
|
-
},
|
|
81
|
-
get pointSeries() {
|
|
82
|
-
return buildPointSeries(
|
|
83
|
-
$props.series,
|
|
84
|
-
$state.chartLeft,
|
|
85
|
-
$state.chartBottom,
|
|
86
|
-
$state.itemWidth,
|
|
87
|
-
$state.valueHeight
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
$mount(() => {
|
|
93
|
-
// HACK: Wait until the measurer is really available
|
|
94
|
-
setTimeout(() => {
|
|
95
|
-
const bbox = measurer.getBBox();
|
|
96
|
-
$state.textWidth = bbox.width;
|
|
97
|
-
$state.textHeight = bbox.height * 1.5;
|
|
98
|
-
measurer.remove();
|
|
99
|
-
}, 1);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
function buildPointSeries(
|
|
103
|
-
theSeries: DataSeries[],
|
|
104
|
-
theChartLeft: number,
|
|
105
|
-
theChartBottom: number,
|
|
106
|
-
theItemWidth: number,
|
|
107
|
-
theValueHeight: number
|
|
108
|
-
): { x: number; y: number }[][] {
|
|
109
|
-
return theSeries.map((series) => {
|
|
110
|
-
return series.data.map((value, i) => {
|
|
111
|
-
const x = +(theChartLeft + i * theItemWidth + theItemWidth / 2).toFixed(2);
|
|
112
|
-
const y = +(theChartBottom - value * theValueHeight).toFixed(2);
|
|
113
|
-
return { x, y };
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
50
|
@render {
|
|
119
|
-
<
|
|
51
|
+
<Chart
|
|
120
52
|
{$props?.id}
|
|
121
53
|
class={["torp-line-chart", $props?.class]}
|
|
122
54
|
{$props?.style}
|
|
123
|
-
|
|
55
|
+
{$props?.ariaLabel}
|
|
56
|
+
{$props?.series}
|
|
57
|
+
{$props?.height}
|
|
58
|
+
{$props?.width}
|
|
59
|
+
{$props?.xLabel}
|
|
60
|
+
{$props?.yLabel}
|
|
61
|
+
{$props?.maxValue}
|
|
62
|
+
{$props?.stepCount}
|
|
63
|
+
{$props?.stepValue}
|
|
124
64
|
>
|
|
125
|
-
<
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
height={$state.calculatedHeight}
|
|
133
|
-
width={$state.calculatedWidth}
|
|
134
|
-
{$state.itemWidth}
|
|
135
|
-
{$state.textHeight}
|
|
136
|
-
xLabel={$props.xLabel ?? ""}
|
|
137
|
-
{$state.labels}
|
|
138
|
-
stepLabels={[]}
|
|
139
|
-
stepValue={0}
|
|
140
|
-
{$state.chartLeft}
|
|
141
|
-
{$state.chartBottom}
|
|
142
|
-
/>
|
|
143
|
-
<YAxis
|
|
144
|
-
showAxis={!$props.hideYAxis}
|
|
145
|
-
{$state.valueHeight}
|
|
146
|
-
{$state.textHeight}
|
|
147
|
-
yLabel={$props.yLabel ?? ""}
|
|
148
|
-
{$state.stepLabels}
|
|
149
|
-
stepValue={$state.calculatedStepValue}
|
|
150
|
-
{$state.chartLeft}
|
|
151
|
-
{$state.chartBottom}
|
|
152
|
-
/>
|
|
153
|
-
<GridLines
|
|
154
|
-
{$props.showHLines}
|
|
155
|
-
{$props.showVLines}
|
|
156
|
-
width={$state.calculatedWidth}
|
|
157
|
-
{$state.labels}
|
|
158
|
-
xStepValue={0}
|
|
159
|
-
xStepLabels={[]}
|
|
160
|
-
yStepValue={$state.calculatedStepValue}
|
|
161
|
-
yStepLabels={[]}
|
|
162
|
-
{$state.stepLabels}
|
|
163
|
-
{$state.itemWidth}
|
|
164
|
-
{$state.valueHeight}
|
|
165
|
-
{$state.chartLeft}
|
|
166
|
-
{$state.chartBottom}
|
|
167
|
-
type="line"
|
|
168
|
-
/>
|
|
169
|
-
@for (let [i, series] of $props.series.entries()) {
|
|
170
|
-
<polyline
|
|
171
|
-
points={$state.pointSeries[i].map((p) => `${p.x},${p.y}`).join(" ")}
|
|
172
|
-
stroke={series.color || chartColors[i % chartColors.length]}
|
|
173
|
-
stroke-width="2"
|
|
174
|
-
fill="none"
|
|
175
|
-
/>
|
|
176
|
-
@if ($props.showPoints) {
|
|
177
|
-
@for (let [j, point] of $state.pointSeries[i].entries()) {
|
|
178
|
-
<circle
|
|
179
|
-
cx={point.x}
|
|
180
|
-
cy={point.y}
|
|
181
|
-
r="4"
|
|
182
|
-
stroke={series.color || chartColors[i % chartColors.length]}
|
|
183
|
-
stroke-width="2"
|
|
184
|
-
fill="white"
|
|
185
|
-
>
|
|
186
|
-
<title>{`${[series.name, $state.labels[j], series.data[j]].filter(Boolean).join("\n")}`}</title>
|
|
187
|
-
</circle>
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
</g>
|
|
193
|
-
</svg>
|
|
194
|
-
</div>
|
|
65
|
+
<ChartYAxis />
|
|
66
|
+
<ChartGrid hLines={$props.showHLines === true} vLines={$props.showVLines === true} />
|
|
67
|
+
<ChartXAxis />
|
|
68
|
+
@for (let i of $props.series.map((_, i) => i)) {
|
|
69
|
+
<ChartLines seriesIndex={i} showPoints={$props.showPoints} />
|
|
70
|
+
}
|
|
71
|
+
</Chart>
|
|
195
72
|
}
|
|
196
73
|
}
|
|
@@ -18,13 +18,15 @@ interface PieChartProps {
|
|
|
18
18
|
/** An ID for the root element */
|
|
19
19
|
id?: string;
|
|
20
20
|
/** Classes for the root element */
|
|
21
|
-
class?: ClassValue
|
|
21
|
+
class?: ClassValue;
|
|
22
22
|
/** Styles for the root element */
|
|
23
|
-
style?: StyleValue
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
style?: StyleValue;
|
|
24
|
+
/** An ARIA label describing the chart for screen readers */
|
|
25
|
+
ariaLabel?: string;
|
|
26
|
+
data: PieData[];
|
|
27
|
+
size?: number;
|
|
28
|
+
radius?: number;
|
|
29
|
+
cutout?: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export default function PieChart($props: PieChartProps) {
|
|
@@ -42,14 +44,14 @@ export default function PieChart($props: PieChartProps) {
|
|
|
42
44
|
},
|
|
43
45
|
get segments() {
|
|
44
46
|
return buildSegments($props.size!, $props.data, $props.radius!, $props.cutout!);
|
|
45
|
-
}
|
|
47
|
+
},
|
|
46
48
|
});
|
|
47
49
|
|
|
48
50
|
function buildSegments(
|
|
49
51
|
theSize: number,
|
|
50
52
|
theData: PieData[],
|
|
51
53
|
theRadiusSize: number,
|
|
52
|
-
theCutoutSize: number
|
|
54
|
+
theCutoutSize: number,
|
|
53
55
|
): SegmentData[] {
|
|
54
56
|
const segments = [];
|
|
55
57
|
const x = theSize / 2;
|
|
@@ -67,7 +69,7 @@ export default function PieChart($props: PieChartProps) {
|
|
|
67
69
|
name: theData[i].name,
|
|
68
70
|
value: theData[i].value,
|
|
69
71
|
color: theData[i].color,
|
|
70
|
-
path: buildPath(x, y, theRadiusSize, theCutoutSize, startAngle, endAngle, largeArc)
|
|
72
|
+
path: buildPath(x, y, theRadiusSize, theCutoutSize, startAngle, endAngle, largeArc),
|
|
71
73
|
});
|
|
72
74
|
startAngle = endAngle;
|
|
73
75
|
}
|
|
@@ -81,7 +83,7 @@ export default function PieChart($props: PieChartProps) {
|
|
|
81
83
|
theCutoutSize: number,
|
|
82
84
|
startAngle: number,
|
|
83
85
|
endAngle: number,
|
|
84
|
-
largeArc: number
|
|
86
|
+
largeArc: number,
|
|
85
87
|
): string {
|
|
86
88
|
// HACK: Drawing an arc of 360 degrees doesn't work
|
|
87
89
|
if (startAngle - endAngle === 360) {
|
|
@@ -122,16 +124,8 @@ A${theCutoutSize},${theCutoutSize} 0 ${largeArc} 0 ${cutoutstartx},${cutoutstart
|
|
|
122
124
|
}
|
|
123
125
|
|
|
124
126
|
@render {
|
|
125
|
-
<div
|
|
126
|
-
{$props?.
|
|
127
|
-
class={["torp-pie-chart", $props?.class]}
|
|
128
|
-
{$props?.style}
|
|
129
|
-
>
|
|
130
|
-
<svg
|
|
131
|
-
version="1.1"
|
|
132
|
-
width={$props.size}
|
|
133
|
-
height={$props.size}
|
|
134
|
-
>
|
|
127
|
+
<div {$props?.id} class={["torp-pie-chart", $props?.class]} {$props?.style}>
|
|
128
|
+
<svg role={$props?.ariaLabel ? "img" : undefined} aria-label={$props?.ariaLabel} version="1.1" width={$props.size} height={$props.size}>
|
|
135
129
|
<g>
|
|
136
130
|
@for (let [i, segment] of $state.segments.entries()) {
|
|
137
131
|
<path d={segment.path} fill={segment.color || chartColors[i % chartColors.length]}>
|