@plenustech/design-system 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/actions/ButtonTile/ButtonTile.cjs +2 -0
- package/dist/components/actions/ButtonTile/ButtonTile.cjs.map +1 -0
- package/dist/components/actions/ButtonTile/ButtonTile.js +23 -0
- package/dist/components/actions/ButtonTile/ButtonTile.js.map +1 -0
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs +2 -0
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs.map +1 -0
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.js +16 -0
- package/dist/components/actions/ButtonTile/ButtonTile.module.css.js.map +1 -0
- package/dist/components/actions/Toolbar/Toolbar.cjs +2 -0
- package/dist/components/actions/Toolbar/Toolbar.cjs.map +1 -0
- package/dist/components/actions/Toolbar/Toolbar.js +118 -0
- package/dist/components/actions/Toolbar/Toolbar.js.map +1 -0
- package/dist/components/actions/Toolbar/Toolbar.module.css.cjs +2 -0
- package/dist/components/actions/Toolbar/Toolbar.module.css.cjs.map +1 -0
- package/dist/components/actions/Toolbar/Toolbar.module.css.js +20 -0
- package/dist/components/actions/Toolbar/Toolbar.module.css.js.map +1 -0
- package/dist/components/charts/ChartArea/ChartArea.cjs +1 -1
- package/dist/components/charts/ChartArea/ChartArea.cjs.map +1 -1
- package/dist/components/charts/ChartArea/ChartArea.js +196 -148
- package/dist/components/charts/ChartArea/ChartArea.js.map +1 -1
- package/dist/components/charts/ChartArea/ChartArea.module.css.cjs +1 -1
- package/dist/components/charts/ChartArea/ChartArea.module.css.js +12 -10
- package/dist/components/charts/ChartArea/ChartArea.module.css.js.map +1 -1
- package/dist/components/charts/ChartBar/ChartBar.cjs +1 -1
- package/dist/components/charts/ChartBar/ChartBar.cjs.map +1 -1
- package/dist/components/charts/ChartBar/ChartBar.js +168 -145
- package/dist/components/charts/ChartBar/ChartBar.js.map +1 -1
- package/dist/components/charts/ChartBar/ChartBar.module.css.cjs +1 -1
- package/dist/components/charts/ChartBar/ChartBar.module.css.js +12 -10
- package/dist/components/charts/ChartBar/ChartBar.module.css.js.map +1 -1
- package/dist/components/charts/ChartCombo/ChartCombo.cjs +1 -1
- package/dist/components/charts/ChartCombo/ChartCombo.cjs.map +1 -1
- package/dist/components/charts/ChartCombo/ChartCombo.js +179 -154
- package/dist/components/charts/ChartCombo/ChartCombo.js.map +1 -1
- package/dist/components/charts/ChartCombo/ChartCombo.module.css.cjs +1 -1
- package/dist/components/charts/ChartCombo/ChartCombo.module.css.js +16 -14
- package/dist/components/charts/ChartCombo/ChartCombo.module.css.js.map +1 -1
- package/dist/components/charts/ChartDonut/ChartDonut.cjs +1 -1
- package/dist/components/charts/ChartDonut/ChartDonut.cjs.map +1 -1
- package/dist/components/charts/ChartDonut/ChartDonut.js +72 -61
- package/dist/components/charts/ChartDonut/ChartDonut.js.map +1 -1
- package/dist/components/charts/ChartGauge/ChartGauge.cjs +2 -0
- package/dist/components/charts/ChartGauge/ChartGauge.cjs.map +1 -0
- package/dist/components/charts/ChartGauge/ChartGauge.js +307 -0
- package/dist/components/charts/ChartGauge/ChartGauge.js.map +1 -0
- package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs +2 -0
- package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs.map +1 -0
- package/dist/components/charts/ChartGauge/ChartGauge.module.css.js +76 -0
- package/dist/components/charts/ChartGauge/ChartGauge.module.css.js.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeLayout.cjs +2 -0
- package/dist/components/charts/ChartGauge/gaugeLayout.cjs.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeLayout.js +107 -0
- package/dist/components/charts/ChartGauge/gaugeLayout.js.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeReading.cjs +2 -0
- package/dist/components/charts/ChartGauge/gaugeReading.cjs.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeReading.js +112 -0
- package/dist/components/charts/ChartGauge/gaugeReading.js.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeScale.cjs +2 -0
- package/dist/components/charts/ChartGauge/gaugeScale.cjs.map +1 -0
- package/dist/components/charts/ChartGauge/gaugeScale.js +57 -0
- package/dist/components/charts/ChartGauge/gaugeScale.js.map +1 -0
- package/dist/components/charts/ChartLine/ChartLine.cjs +1 -1
- package/dist/components/charts/ChartLine/ChartLine.cjs.map +1 -1
- package/dist/components/charts/ChartLine/ChartLine.js +196 -143
- package/dist/components/charts/ChartLine/ChartLine.js.map +1 -1
- package/dist/components/charts/ChartLine/ChartLine.module.css.cjs +1 -1
- package/dist/components/charts/ChartLine/ChartLine.module.css.js +16 -14
- package/dist/components/charts/ChartLine/ChartLine.module.css.js.map +1 -1
- package/dist/components/charts/ChartMap/ChartMap.cjs +2 -0
- package/dist/components/charts/ChartMap/ChartMap.cjs.map +1 -0
- package/dist/components/charts/ChartMap/ChartMap.js +523 -0
- package/dist/components/charts/ChartMap/ChartMap.js.map +1 -0
- package/dist/components/charts/ChartMap/ChartMap.module.css.cjs +2 -0
- package/dist/components/charts/ChartMap/ChartMap.module.css.cjs.map +1 -0
- package/dist/components/charts/ChartMap/ChartMap.module.css.js +124 -0
- package/dist/components/charts/ChartMap/ChartMap.module.css.js.map +1 -0
- package/dist/components/charts/ChartMap/ChartMapLegend.cjs +2 -0
- package/dist/components/charts/ChartMap/ChartMapLegend.cjs.map +1 -0
- package/dist/components/charts/ChartMap/ChartMapLegend.js +102 -0
- package/dist/components/charts/ChartMap/ChartMapLegend.js.map +1 -0
- package/dist/components/charts/ChartMap/ChartMapTable.cjs +2 -0
- package/dist/components/charts/ChartMap/ChartMapTable.cjs.map +1 -0
- package/dist/components/charts/ChartMap/ChartMapTable.js +118 -0
- package/dist/components/charts/ChartMap/ChartMapTable.js.map +1 -0
- package/dist/components/charts/ChartMap/mapGeometry.cjs +2 -0
- package/dist/components/charts/ChartMap/mapGeometry.cjs.map +1 -0
- package/dist/components/charts/ChartMap/mapGeometry.js +113 -0
- package/dist/components/charts/ChartMap/mapGeometry.js.map +1 -0
- package/dist/components/charts/ChartMap/mapLabels.cjs +2 -0
- package/dist/components/charts/ChartMap/mapLabels.cjs.map +1 -0
- package/dist/components/charts/ChartMap/mapLabels.js +80 -0
- package/dist/components/charts/ChartMap/mapLabels.js.map +1 -0
- package/dist/components/charts/ChartMap/mapScales.cjs +2 -0
- package/dist/components/charts/ChartMap/mapScales.cjs.map +1 -0
- package/dist/components/charts/ChartMap/mapScales.js +131 -0
- package/dist/components/charts/ChartMap/mapScales.js.map +1 -0
- package/dist/components/charts/ChartMap/polylabel.cjs +2 -0
- package/dist/components/charts/ChartMap/polylabel.cjs.map +1 -0
- package/dist/components/charts/ChartMap/polylabel.js +50 -0
- package/dist/components/charts/ChartMap/polylabel.js.map +1 -0
- package/dist/components/charts/ChartPie/ChartPie.cjs +1 -1
- package/dist/components/charts/ChartPie/ChartPie.cjs.map +1 -1
- package/dist/components/charts/ChartPie/ChartPie.js +71 -60
- package/dist/components/charts/ChartPie/ChartPie.js.map +1 -1
- package/dist/components/charts/ChartRadial/ChartRadial.cjs +1 -1
- package/dist/components/charts/ChartRadial/ChartRadial.cjs.map +1 -1
- package/dist/components/charts/ChartRadial/ChartRadial.js +101 -84
- package/dist/components/charts/ChartRadial/ChartRadial.js.map +1 -1
- package/dist/components/charts/ChartSankey/ChartSankey.cjs +1 -1
- package/dist/components/charts/ChartSankey/ChartSankey.cjs.map +1 -1
- package/dist/components/charts/ChartSankey/ChartSankey.js +148 -125
- package/dist/components/charts/ChartSankey/ChartSankey.js.map +1 -1
- package/dist/components/charts/ChartScatter/ChartScatter.cjs +1 -1
- package/dist/components/charts/ChartScatter/ChartScatter.cjs.map +1 -1
- package/dist/components/charts/ChartScatter/ChartScatter.js +138 -106
- package/dist/components/charts/ChartScatter/ChartScatter.js.map +1 -1
- package/dist/components/charts/ChartScatter/ChartScatter.module.css.cjs +1 -1
- package/dist/components/charts/ChartScatter/ChartScatter.module.css.js +3 -3
- package/dist/components/charts/ChartSunburst/ChartSunburst.cjs +1 -1
- package/dist/components/charts/ChartSunburst/ChartSunburst.cjs.map +1 -1
- package/dist/components/charts/ChartSunburst/ChartSunburst.js +115 -100
- package/dist/components/charts/ChartSunburst/ChartSunburst.js.map +1 -1
- package/dist/components/charts/ChartTimeline/ChartTimeline.cjs +2 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.js +703 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.js.map +1 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs +2 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js +124 -0
- package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js.map +1 -0
- package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs +2 -0
- package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/ChartTimelineTable.js +42 -0
- package/dist/components/charts/ChartTimeline/ChartTimelineTable.js.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineLayout.cjs +2 -0
- package/dist/components/charts/ChartTimeline/timelineLayout.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineLayout.js +109 -0
- package/dist/components/charts/ChartTimeline/timelineLayout.js.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineTime.cjs +2 -0
- package/dist/components/charts/ChartTimeline/timelineTime.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineTime.js +91 -0
- package/dist/components/charts/ChartTimeline/timelineTime.js.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineTooltip.cjs +2 -0
- package/dist/components/charts/ChartTimeline/timelineTooltip.cjs.map +1 -0
- package/dist/components/charts/ChartTimeline/timelineTooltip.js +77 -0
- package/dist/components/charts/ChartTimeline/timelineTooltip.js.map +1 -0
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.js +1 -1
- package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
- package/dist/components/charts/ChartTreemap/ChartTreemap.cjs +1 -1
- package/dist/components/charts/ChartTreemap/ChartTreemap.cjs.map +1 -1
- package/dist/components/charts/ChartTreemap/ChartTreemap.js +100 -89
- package/dist/components/charts/ChartTreemap/ChartTreemap.js.map +1 -1
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs +1 -1
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs.map +1 -1
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.js +125 -105
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.js.map +1 -1
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.cjs +1 -1
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js +8 -6
- package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js.map +1 -1
- package/dist/components/charts/core/CartesianFrame.cjs +1 -1
- package/dist/components/charts/core/CartesianFrame.cjs.map +1 -1
- package/dist/components/charts/core/CartesianFrame.js +61 -96
- package/dist/components/charts/core/CartesianFrame.js.map +1 -1
- package/dist/components/charts/core/Chart.module.css.cjs +1 -1
- package/dist/components/charts/core/Chart.module.css.js +52 -54
- package/dist/components/charts/core/Chart.module.css.js.map +1 -1
- package/dist/components/charts/core/ChartFrame.cjs +1 -1
- package/dist/components/charts/core/ChartFrame.cjs.map +1 -1
- package/dist/components/charts/core/ChartFrame.js +53 -47
- package/dist/components/charts/core/ChartFrame.js.map +1 -1
- package/dist/components/charts/core/ChartLegend.cjs +1 -1
- package/dist/components/charts/core/ChartLegend.cjs.map +1 -1
- package/dist/components/charts/core/ChartLegend.js +37 -25
- package/dist/components/charts/core/ChartLegend.js.map +1 -1
- package/dist/components/charts/core/PointBands.cjs +2 -0
- package/dist/components/charts/core/PointBands.cjs.map +1 -0
- package/dist/components/charts/core/PointBands.js +41 -0
- package/dist/components/charts/core/PointBands.js.map +1 -0
- package/dist/components/charts/core/cartesianLayout.cjs +1 -1
- package/dist/components/charts/core/cartesianLayout.cjs.map +1 -1
- package/dist/components/charts/core/cartesianLayout.js +49 -41
- package/dist/components/charts/core/cartesianLayout.js.map +1 -1
- package/dist/components/charts/core/hoverPath.cjs +2 -0
- package/dist/components/charts/core/hoverPath.cjs.map +1 -0
- package/dist/components/charts/core/hoverPath.js +7 -0
- package/dist/components/charts/core/hoverPath.js.map +1 -0
- package/dist/components/charts/core/pointLabels.cjs +2 -0
- package/dist/components/charts/core/pointLabels.cjs.map +1 -0
- package/dist/components/charts/core/pointLabels.js +12 -0
- package/dist/components/charts/core/pointLabels.js.map +1 -0
- package/dist/components/charts/core/tooltips.cjs +2 -0
- package/dist/components/charts/core/tooltips.cjs.map +1 -0
- package/dist/components/charts/core/tooltips.js +48 -0
- package/dist/components/charts/core/tooltips.js.map +1 -0
- package/dist/components/charts/core/useCartesianLayout.cjs +2 -0
- package/dist/components/charts/core/useCartesianLayout.cjs.map +1 -0
- package/dist/components/charts/core/useCartesianLayout.js +38 -0
- package/dist/components/charts/core/useCartesianLayout.js.map +1 -0
- package/dist/components/charts/core/useChartMetrics.cjs +1 -1
- package/dist/components/charts/core/useChartMetrics.cjs.map +1 -1
- package/dist/components/charts/core/useChartMetrics.js +20 -25
- package/dist/components/charts/core/useChartMetrics.js.map +1 -1
- package/dist/components/charts/core/useSeriesToggle.cjs +1 -1
- package/dist/components/charts/core/useSeriesToggle.cjs.map +1 -1
- package/dist/components/charts/core/useSeriesToggle.js +19 -12
- package/dist/components/charts/core/useSeriesToggle.js.map +1 -1
- package/dist/components/data-display/Accordion/Accordion.cjs +1 -1
- package/dist/components/data-display/Accordion/Accordion.cjs.map +1 -1
- package/dist/components/data-display/Accordion/Accordion.js +56 -46
- package/dist/components/data-display/Accordion/Accordion.js.map +1 -1
- package/dist/components/data-display/Accordion/Accordion.module.css.cjs +1 -1
- package/dist/components/data-display/Accordion/Accordion.module.css.js +16 -16
- package/dist/components/data-display/List/List.cjs.map +1 -1
- package/dist/components/data-display/List/List.js.map +1 -1
- package/dist/components/data-display/List/List.module.css.cjs +1 -1
- package/dist/components/data-display/List/List.module.css.js +34 -24
- package/dist/components/data-display/List/List.module.css.js.map +1 -1
- package/dist/components/data-display/List/ListingOptions.cjs +1 -1
- package/dist/components/data-display/List/ListingOptions.cjs.map +1 -1
- package/dist/components/data-display/List/ListingOptions.js +98 -74
- package/dist/components/data-display/List/ListingOptions.js.map +1 -1
- package/dist/components/data-display/List/useListing.cjs.map +1 -1
- package/dist/components/data-display/List/useListing.js.map +1 -1
- package/dist/components/data-display/SortableList/SortableList.cjs +2 -0
- package/dist/components/data-display/SortableList/SortableList.cjs.map +1 -0
- package/dist/components/data-display/SortableList/SortableList.js +168 -0
- package/dist/components/data-display/SortableList/SortableList.js.map +1 -0
- package/dist/components/data-display/SortableList/SortableList.module.css.cjs +2 -0
- package/dist/components/data-display/SortableList/SortableList.module.css.cjs.map +1 -0
- package/dist/components/data-display/SortableList/SortableList.module.css.js +34 -0
- package/dist/components/data-display/SortableList/SortableList.module.css.js.map +1 -0
- package/dist/components/data-display/Table/Table.cjs +1 -1
- package/dist/components/data-display/Table/Table.cjs.map +1 -1
- package/dist/components/data-display/Table/Table.js +86 -85
- package/dist/components/data-display/Table/Table.js.map +1 -1
- package/dist/components/data-display/Table/Table.module.css.cjs +1 -1
- package/dist/components/data-display/Table/Table.module.css.js +50 -51
- package/dist/components/data-display/Table/Table.module.css.js.map +1 -1
- package/dist/components/data-display/Tag/Tag.cjs +2 -0
- package/dist/components/data-display/Tag/Tag.cjs.map +1 -0
- package/dist/components/data-display/Tag/Tag.js +50 -0
- package/dist/components/data-display/Tag/Tag.js.map +1 -0
- package/dist/components/data-display/Tag/Tag.module.css.cjs +2 -0
- package/dist/components/data-display/Tag/Tag.module.css.cjs.map +1 -0
- package/dist/components/data-display/Tag/Tag.module.css.js +22 -0
- package/dist/components/data-display/Tag/Tag.module.css.js.map +1 -0
- package/dist/components/data-display/Timeline/Timeline.cjs +2 -0
- package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -0
- package/dist/components/data-display/Timeline/Timeline.js +31 -0
- package/dist/components/data-display/Timeline/Timeline.js.map +1 -0
- package/dist/components/data-display/Timeline/Timeline.module.css.cjs +2 -0
- package/dist/components/data-display/Timeline/Timeline.module.css.cjs.map +1 -0
- package/dist/components/data-display/Timeline/Timeline.module.css.js +30 -0
- package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -0
- package/dist/components/feedback/Skeleton/Skeleton.cjs +2 -0
- package/dist/components/feedback/Skeleton/Skeleton.cjs.map +1 -0
- package/dist/components/feedback/Skeleton/Skeleton.js +17 -0
- package/dist/components/feedback/Skeleton/Skeleton.js.map +1 -0
- package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs +2 -0
- package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs.map +1 -0
- package/dist/components/feedback/Skeleton/Skeleton.module.css.js +15 -0
- package/dist/components/feedback/Skeleton/Skeleton.module.css.js.map +1 -0
- package/dist/components/feedback/Toast/Toast.module.css.cjs +2 -0
- package/dist/components/feedback/Toast/Toast.module.css.cjs.map +1 -0
- package/dist/components/feedback/Toast/Toast.module.css.js +31 -0
- package/dist/components/feedback/Toast/Toast.module.css.js.map +1 -0
- package/dist/components/feedback/Toast/ToastRegion.cjs +2 -0
- package/dist/components/feedback/Toast/ToastRegion.cjs.map +1 -0
- package/dist/components/feedback/Toast/ToastRegion.js +62 -0
- package/dist/components/feedback/Toast/ToastRegion.js.map +1 -0
- package/dist/components/feedback/Toast/toastStore.cjs +2 -0
- package/dist/components/feedback/Toast/toastStore.cjs.map +1 -0
- package/dist/components/feedback/Toast/toastStore.js +33 -0
- package/dist/components/feedback/Toast/toastStore.js.map +1 -0
- package/dist/components/forms/Checkbox/Checkbox.cjs +1 -1
- package/dist/components/forms/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/forms/Checkbox/Checkbox.js +43 -31
- package/dist/components/forms/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
- package/dist/components/forms/Checkbox/Checkbox.module.css.js +1 -1
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs +2 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs.map +1 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.js +54 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.js.map +1 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +2 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs.map +1 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +22 -0
- package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js.map +1 -0
- package/dist/components/forms/ColorPicker/ColorPicker.cjs +2 -0
- package/dist/components/forms/ColorPicker/ColorPicker.cjs.map +1 -0
- package/dist/components/forms/ColorPicker/ColorPicker.js +57 -0
- package/dist/components/forms/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs +2 -0
- package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs.map +1 -0
- package/dist/components/forms/ColorPicker/ColorPicker.module.css.js +22 -0
- package/dist/components/forms/ColorPicker/ColorPicker.module.css.js.map +1 -0
- package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -1
- package/dist/components/forms/ComboBox/ComboBox.js.map +1 -1
- package/dist/components/forms/ComboBox/ComboBox.module.css.cjs +1 -1
- package/dist/components/forms/ComboBox/ComboBox.module.css.js +20 -20
- package/dist/components/forms/Field/Field.cjs +1 -1
- package/dist/components/forms/Field/Field.cjs.map +1 -1
- package/dist/components/forms/Field/Field.js +21 -20
- package/dist/components/forms/Field/Field.js.map +1 -1
- package/dist/components/forms/Field/Field.module.css.cjs +1 -1
- package/dist/components/forms/Field/Field.module.css.js +18 -12
- package/dist/components/forms/Field/Field.module.css.js.map +1 -1
- package/dist/components/forms/FileUpload/FileUpload.cjs +2 -0
- package/dist/components/forms/FileUpload/FileUpload.cjs.map +1 -0
- package/dist/components/forms/FileUpload/FileUpload.js +142 -0
- package/dist/components/forms/FileUpload/FileUpload.js.map +1 -0
- package/dist/components/forms/FileUpload/FileUpload.module.css.cjs +2 -0
- package/dist/components/forms/FileUpload/FileUpload.module.css.cjs.map +1 -0
- package/dist/components/forms/FileUpload/FileUpload.module.css.js +46 -0
- package/dist/components/forms/FileUpload/FileUpload.module.css.js.map +1 -0
- package/dist/components/forms/InputPassword/InputPassword.module.css.cjs +1 -1
- package/dist/components/forms/InputPassword/InputPassword.module.css.js +12 -12
- package/dist/components/forms/InputText/InputText.cjs +1 -1
- package/dist/components/forms/InputText/InputText.cjs.map +1 -1
- package/dist/components/forms/InputText/InputText.js +55 -47
- package/dist/components/forms/InputText/InputText.js.map +1 -1
- package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
- package/dist/components/forms/InputText/InputText.module.css.js +10 -10
- package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
- package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
- package/dist/components/forms/SegmentedControl/SegmentedControl.cjs +2 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.cjs.map +1 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.js +52 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs +2 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs.map +1 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js +22 -0
- package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js.map +1 -0
- package/dist/components/forms/Select/Select.module.css.cjs +1 -1
- package/dist/components/forms/Select/Select.module.css.js +13 -13
- package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
- package/dist/components/forms/Switch/Switch.module.css.js +2 -2
- package/dist/components/icons/icons.cjs +1 -1
- package/dist/components/icons/icons.cjs.map +1 -1
- package/dist/components/icons/icons.js +198 -40
- package/dist/components/icons/icons.js.map +1 -1
- package/dist/components/navigation/SkipLink/SkipLink.cjs +2 -0
- package/dist/components/navigation/SkipLink/SkipLink.cjs.map +1 -0
- package/dist/components/navigation/SkipLink/SkipLink.js +9 -0
- package/dist/components/navigation/SkipLink/SkipLink.js.map +1 -0
- package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs +2 -0
- package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs.map +1 -0
- package/dist/components/navigation/SkipLink/SkipLink.module.css.js +8 -0
- package/dist/components/navigation/SkipLink/SkipLink.module.css.js.map +1 -0
- package/dist/components/navigation/Steps/Steps.cjs +2 -0
- package/dist/components/navigation/Steps/Steps.cjs.map +1 -0
- package/dist/components/navigation/Steps/Steps.js +30 -0
- package/dist/components/navigation/Steps/Steps.js.map +1 -0
- package/dist/components/navigation/Steps/Steps.module.css.cjs +2 -0
- package/dist/components/navigation/Steps/Steps.module.css.cjs.map +1 -0
- package/dist/components/navigation/Steps/Steps.module.css.js +26 -0
- package/dist/components/navigation/Steps/Steps.module.css.js.map +1 -0
- package/dist/components/navigation/Tabs/Tabs.cjs +1 -1
- package/dist/components/navigation/Tabs/Tabs.cjs.map +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +88 -79
- package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
- package/dist/components/navigation/Tabs/Tabs.module.css.cjs +1 -1
- package/dist/components/navigation/Tabs/Tabs.module.css.js +18 -14
- package/dist/components/navigation/Tabs/Tabs.module.css.js.map +1 -1
- package/dist/components/navigation/TabsNav/TabsNav.cjs +2 -0
- package/dist/components/navigation/TabsNav/TabsNav.cjs.map +1 -0
- package/dist/components/navigation/TabsNav/TabsNav.js +21 -0
- package/dist/components/navigation/TabsNav/TabsNav.js.map +1 -0
- package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs +2 -0
- package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs.map +1 -0
- package/dist/components/navigation/TabsNav/TabsNav.module.css.js +18 -0
- package/dist/components/navigation/TabsNav/TabsNav.module.css.js.map +1 -0
- package/dist/components/overlays/Dialog/Dialog.cjs +1 -1
- package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +11 -58
- package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
- package/dist/components/overlays/Dialog/DialogFrame.cjs +2 -0
- package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -0
- package/dist/components/overlays/Dialog/DialogFrame.js +65 -0
- package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -0
- package/dist/components/overlays/Drawer/Drawer.cjs +2 -0
- package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -0
- package/dist/components/overlays/Drawer/Drawer.js +17 -0
- package/dist/components/overlays/Drawer/Drawer.js.map +1 -0
- package/dist/components/overlays/Drawer/Drawer.module.css.cjs +2 -0
- package/dist/components/overlays/Drawer/Drawer.module.css.cjs.map +1 -0
- package/dist/components/overlays/Drawer/Drawer.module.css.js +23 -0
- package/dist/components/overlays/Drawer/Drawer.module.css.js.map +1 -0
- package/dist/components/overlays/Menu/Menu.cjs +1 -1
- package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
- package/dist/components/overlays/Menu/Menu.js +105 -86
- package/dist/components/overlays/Menu/Menu.js.map +1 -1
- package/dist/components/overlays/Menu/Menu.module.css.cjs +1 -1
- package/dist/components/overlays/Menu/Menu.module.css.js +24 -6
- package/dist/components/overlays/Menu/Menu.module.css.js.map +1 -1
- package/dist/design-system.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +190 -118
- package/dist/index.js.map +1 -1
- package/dist/types/components/actions/ButtonTile/ButtonTile.d.ts +14 -0
- package/dist/types/components/actions/ButtonTile/index.d.ts +2 -0
- package/dist/types/components/actions/Toolbar/Toolbar.d.ts +27 -0
- package/dist/types/components/actions/Toolbar/index.d.ts +2 -0
- package/dist/types/components/charts/ChartArea/ChartArea.d.ts +15 -4
- package/dist/types/components/charts/ChartBar/ChartBar.d.ts +11 -4
- package/dist/types/components/charts/ChartCombo/ChartCombo.d.ts +16 -4
- package/dist/types/components/charts/ChartDonut/ChartDonut.d.ts +5 -1
- package/dist/types/components/charts/ChartGauge/ChartGauge.d.ts +83 -0
- package/dist/types/components/charts/ChartGauge/gaugeLayout.d.ts +64 -0
- package/dist/types/components/charts/ChartGauge/gaugeReading.d.ts +97 -0
- package/dist/types/components/charts/ChartGauge/gaugeScale.d.ts +38 -0
- package/dist/types/components/charts/ChartGauge/index.d.ts +2 -0
- package/dist/types/components/charts/ChartLine/ChartLine.d.ts +15 -4
- package/dist/types/components/charts/ChartMap/ChartMap.d.ts +104 -0
- package/dist/types/components/charts/ChartMap/ChartMapLegend.d.ts +44 -0
- package/dist/types/components/charts/ChartMap/ChartMapTable.d.ts +38 -0
- package/dist/types/components/charts/ChartMap/index.d.ts +4 -0
- package/dist/types/components/charts/ChartMap/mapGeometry.d.ts +56 -0
- package/dist/types/components/charts/ChartMap/mapLabels.d.ts +51 -0
- package/dist/types/components/charts/ChartMap/mapScales.d.ts +76 -0
- package/dist/types/components/charts/ChartMap/polylabel.d.ts +9 -0
- package/dist/types/components/charts/ChartPie/ChartPie.d.ts +5 -1
- package/dist/types/components/charts/ChartRadial/ChartRadial.d.ts +5 -1
- package/dist/types/components/charts/ChartSankey/ChartSankey.d.ts +5 -1
- package/dist/types/components/charts/ChartScatter/ChartScatter.d.ts +7 -1
- package/dist/types/components/charts/ChartSunburst/ChartSunburst.d.ts +11 -2
- package/dist/types/components/charts/ChartTimeline/ChartTimeline.d.ts +137 -0
- package/dist/types/components/charts/ChartTimeline/ChartTimelineTable.d.ts +25 -0
- package/dist/types/components/charts/ChartTimeline/index.d.ts +2 -0
- package/dist/types/components/charts/ChartTimeline/timelineLayout.d.ts +70 -0
- package/dist/types/components/charts/ChartTimeline/timelineTime.d.ts +16 -0
- package/dist/types/components/charts/ChartTimeline/timelineTooltip.d.ts +45 -0
- package/dist/types/components/charts/ChartTooltip/ChartTooltip.d.ts +2 -0
- package/dist/types/components/charts/ChartTreemap/ChartTreemap.d.ts +11 -2
- package/dist/types/components/charts/ChartWaterfall/ChartWaterfall.d.ts +8 -3
- package/dist/types/components/charts/core/CartesianFrame.d.ts +6 -1
- package/dist/types/components/charts/core/ChartFrame.d.ts +7 -1
- package/dist/types/components/charts/core/ChartLegend.d.ts +3 -1
- package/dist/types/components/charts/core/PointBands.d.ts +22 -0
- package/dist/types/components/charts/core/cartesianLayout.d.ts +10 -4
- package/dist/types/components/charts/core/hoverPath.d.ts +10 -0
- package/dist/types/components/charts/core/index.d.ts +13 -3
- package/dist/types/components/charts/core/pointLabels.d.ts +13 -0
- package/dist/types/components/charts/core/tooltips.d.ts +49 -0
- package/dist/types/components/charts/core/useCartesianLayout.d.ts +20 -0
- package/dist/types/components/charts/core/useSeriesToggle.d.ts +15 -1
- package/dist/types/components/data-display/Accordion/Accordion.d.ts +6 -1
- package/dist/types/components/data-display/Accordion/index.d.ts +1 -1
- package/dist/types/components/data-display/List/List.d.ts +1 -1
- package/dist/types/components/data-display/List/useListing.d.ts +7 -1
- package/dist/types/components/data-display/SortableList/SortableList.d.ts +22 -0
- package/dist/types/components/data-display/SortableList/index.d.ts +2 -0
- package/dist/types/components/data-display/Tag/Tag.d.ts +13 -0
- package/dist/types/components/data-display/Tag/index.d.ts +2 -0
- package/dist/types/components/data-display/Timeline/Timeline.d.ts +15 -0
- package/dist/types/components/data-display/Timeline/index.d.ts +2 -0
- package/dist/types/components/feedback/Skeleton/Skeleton.d.ts +13 -0
- package/dist/types/components/feedback/Skeleton/index.d.ts +2 -0
- package/dist/types/components/feedback/Toast/ToastRegion.d.ts +2 -0
- package/dist/types/components/feedback/Toast/index.d.ts +3 -0
- package/dist/types/components/feedback/Toast/toastStore.d.ts +24 -0
- package/dist/types/components/forms/CheckboxGroup/CheckboxGroup.d.ts +28 -0
- package/dist/types/components/forms/CheckboxGroup/index.d.ts +2 -0
- package/dist/types/components/forms/ColorPicker/ColorPicker.d.ts +26 -0
- package/dist/types/components/forms/ColorPicker/index.d.ts +2 -0
- package/dist/types/components/forms/ComboBox/ComboBox.d.ts +7 -1
- package/dist/types/components/forms/Field/Field.d.ts +6 -2
- package/dist/types/components/forms/Field/index.d.ts +1 -1
- package/dist/types/components/forms/FileUpload/FileUpload.d.ts +37 -0
- package/dist/types/components/forms/FileUpload/index.d.ts +2 -0
- package/dist/types/components/forms/InputText/InputText.d.ts +4 -2
- package/dist/types/components/forms/SegmentedControl/SegmentedControl.d.ts +23 -0
- package/dist/types/components/forms/SegmentedControl/index.d.ts +2 -0
- package/dist/types/components/icons/icons.d.ts +29 -0
- package/dist/types/components/icons/index.d.ts +1 -1
- package/dist/types/components/navigation/SkipLink/SkipLink.d.ts +7 -0
- package/dist/types/components/navigation/SkipLink/index.d.ts +2 -0
- package/dist/types/components/navigation/Steps/Steps.d.ts +16 -0
- package/dist/types/components/navigation/Steps/index.d.ts +2 -0
- package/dist/types/components/navigation/Tabs/Tabs.d.ts +5 -1
- package/dist/types/components/navigation/TabsNav/TabsNav.d.ts +20 -0
- package/dist/types/components/navigation/TabsNav/index.d.ts +2 -0
- package/dist/types/components/overlays/Dialog/Dialog.d.ts +21 -9
- package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +13 -0
- package/dist/types/components/overlays/Drawer/Drawer.d.ts +9 -0
- package/dist/types/components/overlays/Drawer/index.d.ts +2 -0
- package/dist/types/components/overlays/Menu/Menu.d.ts +16 -2
- package/dist/types/components/overlays/Menu/index.d.ts +1 -1
- package/dist/types/index.d.ts +43 -7
- package/dist/types/utils/formatters/formatarDuracao.d.ts +5 -0
- package/dist/types/utils/formatters/formatarNumero.d.ts +6 -1
- package/dist/types/utils/formatters/formatarTamanhoDeArquivo.d.ts +7 -0
- package/dist/types/utils/formatters/index.d.ts +4 -1
- package/dist/utils/formatters/formatarDuracao.cjs +2 -0
- package/dist/utils/formatters/formatarDuracao.cjs.map +1 -0
- package/dist/utils/formatters/formatarDuracao.js +10 -0
- package/dist/utils/formatters/formatarDuracao.js.map +1 -0
- package/dist/utils/formatters/formatarNumero.cjs +1 -1
- package/dist/utils/formatters/formatarNumero.cjs.map +1 -1
- package/dist/utils/formatters/formatarNumero.js +42 -17
- package/dist/utils/formatters/formatarNumero.js.map +1 -1
- package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs +2 -0
- package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs.map +1 -0
- package/dist/utils/formatters/formatarTamanhoDeArquivo.js +17 -0
- package/dist/utils/formatters/formatarTamanhoDeArquivo.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTime.cjs","sources":["../../../../src/components/charts/ChartTimeline/timelineTime.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { ChartTimelineScale, ChartTimelineTime } from './ChartTimeline';\n\nexport const HOUR_MS = 3_600_000;\nconst HOURS_IN_DAY = 24;\nconst DAY_MS = HOURS_IN_DAY * HOUR_MS;\nconst WEEKDAYS = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'];\n\n/** Menor distancia entre duas marcas do eixo, e a partir de quanto a marca diaria leva o dia da semana. */\nconst MIN_TICK_GAP = 40;\nconst MIN_DAY_TICK_GAP = 44;\nconst WEEKDAY_TICK_GAP = 70;\nconst HOUR_STEPS = [1, 3, 6, 12];\n\nexport interface TimeTick {\n label: string;\n position: number;\n}\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\n/** Posicao no eixo: em `calendar`, milissegundos desde a epoca; em `dayHours`, a hora decimal do dia. */\nexport function toPosition(time: ChartTimelineTime, scale: ChartTimelineScale) {\n if (!(time instanceof Date)) {\n return time;\n }\n\n if (scale === 'calendar') {\n return time.getTime();\n }\n\n return time.getHours() + time.getMinutes() / 60 + time.getSeconds() / 3600 + time.getMilliseconds() / HOUR_MS;\n}\n\n/** A posicao como `Date`, para os formatadores do consumidor. Em `dayHours` a data e indiferente: vale a hora. */\nexport function toDate(position: number, scale: ChartTimelineScale) {\n return scale === 'calendar' ? new Date(position) : new Date(1970, 0, 1, 0, 0, 0, Math.round(position * HOUR_MS));\n}\n\nexport function durationMs(start: number, end: number, scale: ChartTimelineScale) {\n return Math.round((end - start) * (scale === 'dayHours' ? HOUR_MS : 1));\n}\n\nfunction startOfDay(time: number) {\n const date = new Date(time);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/** Dias somados pelo calendario, e nao por 24 horas: o dia de mudanca de horario nao tem 24. */\nfunction addDays(day: number, days: number) {\n const date = new Date(day);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days).getTime();\n}\n\n/** Faixa automatica: do primeiro ao ultimo instante, arredondada a hora ou ao dia, com uma unidade no minimo. */\nexport function autoDomain(positions: readonly number[], scale: ChartTimelineScale): [number, number] {\n const [min, max] = extent(positions.filter(Number.isFinite));\n\n if (scale === 'dayHours') {\n if (min === undefined || max === undefined) {\n return [0, HOURS_IN_DAY];\n }\n\n const start = Math.min(Math.max(Math.floor(min), 0), HOURS_IN_DAY - 1);\n return [start, Math.min(Math.max(Math.ceil(max), start + 1), HOURS_IN_DAY)];\n }\n\n if (min === undefined || max === undefined) {\n const today = startOfDay(Date.now());\n return [today, addDays(today, 1)];\n }\n\n const start = startOfDay(min);\n const lastDay = startOfDay(max);\n\n return [start, Math.max(lastDay === max ? max : addDays(lastDay, 1), addDays(start, 1))];\n}\n\nfunction dayMonth(date: Date) {\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}`;\n}\n\n/** Instante no balao e na tabela: `07:12` em horas do dia; `05/10 14:00`, ou so `05/10` a meia-noite, em datas. */\nexport function formatPosition(position: number, scale: ChartTimelineScale) {\n if (scale === 'dayHours') {\n const minutes = Math.round(position * 60);\n return `${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;\n }\n\n const date = new Date(position);\n const time = date.getHours() || date.getMinutes() ? ` ${pad(date.getHours())}:${pad(date.getMinutes())}` : '';\n\n return `${dayMonth(date)}${time}`;\n}\n\nfunction hourTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerHour = width / Math.max(end - start, Number.EPSILON);\n const step = HOUR_STEPS.find((hours) => hours * pixelsPerHour >= MIN_TICK_GAP) ?? HOURS_IN_DAY;\n const ticks: number[] = [];\n\n for (let hour = Math.ceil(start / step) * step; hour <= end; hour += step) {\n ticks.push(hour);\n }\n\n return ticks;\n}\n\n/** Marcas em datas: um dia por marca enquanto cabe, depois as segundas-feiras, depois o primeiro de cada mes. */\nfunction dateTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerDay = (width * DAY_MS) / Math.max(end - start, 1);\n const firstDay = startOfDay(start) < start ? addDays(startOfDay(start), 1) : startOfDay(start);\n const ticks: number[] = [];\n\n if (pixelsPerDay >= MIN_DAY_TICK_GAP || pixelsPerDay * 7 >= MIN_DAY_TICK_GAP) {\n const daily = pixelsPerDay >= MIN_DAY_TICK_GAP;\n const firstMonday = addDays(firstDay, (8 - new Date(firstDay).getDay()) % 7);\n\n for (let day = daily ? firstDay : firstMonday; day <= end; day = addDays(day, daily ? 1 : 7)) {\n ticks.push(day);\n }\n\n return ticks;\n }\n\n const first = new Date(firstDay);\n\n for (let month = 0; ; month += 1) {\n const day = new Date(first.getFullYear(), first.getMonth() + month, 1).getTime();\n\n if (day > end) {\n return ticks;\n }\n\n if (day >= start) {\n ticks.push(day);\n }\n }\n}\n\nexport function timeTicks(\n domain: readonly [number, number],\n scale: ChartTimelineScale,\n width: number,\n formatTick?: (time: Date) => string,\n): TimeTick[] {\n if (!domain.every(Number.isFinite) || width <= 0) {\n return [];\n }\n\n if (scale === 'dayHours') {\n return hourTicks(domain, width).map((hour) => ({\n label: formatTick ? formatTick(toDate(hour, scale)) : `${hour}h`,\n position: hour,\n }));\n }\n\n const withWeekday = (width * DAY_MS) / Math.max(domain[1] - domain[0], 1) >= WEEKDAY_TICK_GAP;\n\n return dateTicks(domain, width).map((day) => {\n const date = new Date(day);\n const label = withWeekday ? `${WEEKDAYS[date.getDay()]} ${dayMonth(date)}` : dayMonth(date);\n\n return { label: formatTick ? formatTick(date) : label, position: day };\n });\n}\n"],"names":["HOUR_MS","HOURS_IN_DAY","DAY_MS","WEEKDAYS","MIN_TICK_GAP","MIN_DAY_TICK_GAP","WEEKDAY_TICK_GAP","HOUR_STEPS","pad","value","toPosition","time","scale","toDate","position","durationMs","start","end","startOfDay","date","addDays","day","days","autoDomain","positions","min","max","extent","today","lastDay","dayMonth","formatPosition","minutes","hourTicks","width","pixelsPerHour","step","hours","ticks","hour","dateTicks","pixelsPerDay","firstDay","daily","firstMonday","first","month","timeTicks","domain","formatTick","withWeekday","label"],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { extent as m } from "d3-array";
|
|
2
|
+
const g = 36e5, M = 24, y = M * g, S = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], p = 40, h = 44, x = 70, _ = [1, 3, 6, 12], i = (t) => String(t).padStart(2, "0");
|
|
3
|
+
function T(t, e) {
|
|
4
|
+
return t instanceof Date ? e === "calendar" ? t.getTime() : t.getHours() + t.getMinutes() / 60 + t.getSeconds() / 3600 + t.getMilliseconds() / g : t;
|
|
5
|
+
}
|
|
6
|
+
function H(t, e) {
|
|
7
|
+
return e === "calendar" ? new Date(t) : new Date(1970, 0, 1, 0, 0, 0, Math.round(t * g));
|
|
8
|
+
}
|
|
9
|
+
function A(t, e, n) {
|
|
10
|
+
return Math.round((e - t) * (n === "dayHours" ? g : 1));
|
|
11
|
+
}
|
|
12
|
+
function c(t) {
|
|
13
|
+
const e = new Date(t);
|
|
14
|
+
return new Date(e.getFullYear(), e.getMonth(), e.getDate()).getTime();
|
|
15
|
+
}
|
|
16
|
+
function f(t, e) {
|
|
17
|
+
const n = new Date(t);
|
|
18
|
+
return new Date(n.getFullYear(), n.getMonth(), n.getDate() + e).getTime();
|
|
19
|
+
}
|
|
20
|
+
function Y(t, e) {
|
|
21
|
+
const [n, o] = m(t.filter(Number.isFinite));
|
|
22
|
+
if (e === "dayHours") {
|
|
23
|
+
if (n === void 0 || o === void 0)
|
|
24
|
+
return [0, M];
|
|
25
|
+
const r = Math.min(Math.max(Math.floor(n), 0), M - 1);
|
|
26
|
+
return [r, Math.min(Math.max(Math.ceil(o), r + 1), M)];
|
|
27
|
+
}
|
|
28
|
+
if (n === void 0 || o === void 0) {
|
|
29
|
+
const r = c(Date.now());
|
|
30
|
+
return [r, f(r, 1)];
|
|
31
|
+
}
|
|
32
|
+
const s = c(n), a = c(o);
|
|
33
|
+
return [s, Math.max(a === o ? o : f(a, 1), f(s, 1))];
|
|
34
|
+
}
|
|
35
|
+
function d(t) {
|
|
36
|
+
return `${i(t.getDate())}/${i(t.getMonth() + 1)}`;
|
|
37
|
+
}
|
|
38
|
+
function b(t, e) {
|
|
39
|
+
if (e === "dayHours") {
|
|
40
|
+
const s = Math.round(t * 60);
|
|
41
|
+
return `${i(Math.floor(s / 60))}:${i(s % 60)}`;
|
|
42
|
+
}
|
|
43
|
+
const n = new Date(t), o = n.getHours() || n.getMinutes() ? ` ${i(n.getHours())}:${i(n.getMinutes())}` : "";
|
|
44
|
+
return `${d(n)}${o}`;
|
|
45
|
+
}
|
|
46
|
+
function $([t, e], n) {
|
|
47
|
+
const o = n / Math.max(e - t, Number.EPSILON), s = _.find((r) => r * o >= p) ?? M, a = [];
|
|
48
|
+
for (let r = Math.ceil(t / s) * s; r <= e; r += s)
|
|
49
|
+
a.push(r);
|
|
50
|
+
return a;
|
|
51
|
+
}
|
|
52
|
+
function w([t, e], n) {
|
|
53
|
+
const o = n * y / Math.max(e - t, 1), s = c(t) < t ? f(c(t), 1) : c(t), a = [];
|
|
54
|
+
if (o >= h || o * 7 >= h) {
|
|
55
|
+
const u = o >= h, D = f(s, (8 - new Date(s).getDay()) % 7);
|
|
56
|
+
for (let l = u ? s : D; l <= e; l = f(l, u ? 1 : 7))
|
|
57
|
+
a.push(l);
|
|
58
|
+
return a;
|
|
59
|
+
}
|
|
60
|
+
const r = new Date(s);
|
|
61
|
+
for (let u = 0; ; u += 1) {
|
|
62
|
+
const D = new Date(r.getFullYear(), r.getMonth() + u, 1).getTime();
|
|
63
|
+
if (D > e)
|
|
64
|
+
return a;
|
|
65
|
+
D >= t && a.push(D);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function I(t, e, n, o) {
|
|
69
|
+
if (!t.every(Number.isFinite) || n <= 0)
|
|
70
|
+
return [];
|
|
71
|
+
if (e === "dayHours")
|
|
72
|
+
return $(t, n).map((a) => ({
|
|
73
|
+
label: o ? o(H(a, e)) : `${a}h`,
|
|
74
|
+
position: a
|
|
75
|
+
}));
|
|
76
|
+
const s = n * y / Math.max(t[1] - t[0], 1) >= x;
|
|
77
|
+
return w(t, n).map((a) => {
|
|
78
|
+
const r = new Date(a), u = s ? `${S[r.getDay()]} ${d(r)}` : d(r);
|
|
79
|
+
return { label: o ? o(r) : u, position: a };
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
g as HOUR_MS,
|
|
84
|
+
Y as autoDomain,
|
|
85
|
+
A as durationMs,
|
|
86
|
+
b as formatPosition,
|
|
87
|
+
I as timeTicks,
|
|
88
|
+
H as toDate,
|
|
89
|
+
T as toPosition
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=timelineTime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTime.js","sources":["../../../../src/components/charts/ChartTimeline/timelineTime.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { ChartTimelineScale, ChartTimelineTime } from './ChartTimeline';\n\nexport const HOUR_MS = 3_600_000;\nconst HOURS_IN_DAY = 24;\nconst DAY_MS = HOURS_IN_DAY * HOUR_MS;\nconst WEEKDAYS = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'];\n\n/** Menor distancia entre duas marcas do eixo, e a partir de quanto a marca diaria leva o dia da semana. */\nconst MIN_TICK_GAP = 40;\nconst MIN_DAY_TICK_GAP = 44;\nconst WEEKDAY_TICK_GAP = 70;\nconst HOUR_STEPS = [1, 3, 6, 12];\n\nexport interface TimeTick {\n label: string;\n position: number;\n}\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\n/** Posicao no eixo: em `calendar`, milissegundos desde a epoca; em `dayHours`, a hora decimal do dia. */\nexport function toPosition(time: ChartTimelineTime, scale: ChartTimelineScale) {\n if (!(time instanceof Date)) {\n return time;\n }\n\n if (scale === 'calendar') {\n return time.getTime();\n }\n\n return time.getHours() + time.getMinutes() / 60 + time.getSeconds() / 3600 + time.getMilliseconds() / HOUR_MS;\n}\n\n/** A posicao como `Date`, para os formatadores do consumidor. Em `dayHours` a data e indiferente: vale a hora. */\nexport function toDate(position: number, scale: ChartTimelineScale) {\n return scale === 'calendar' ? new Date(position) : new Date(1970, 0, 1, 0, 0, 0, Math.round(position * HOUR_MS));\n}\n\nexport function durationMs(start: number, end: number, scale: ChartTimelineScale) {\n return Math.round((end - start) * (scale === 'dayHours' ? HOUR_MS : 1));\n}\n\nfunction startOfDay(time: number) {\n const date = new Date(time);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/** Dias somados pelo calendario, e nao por 24 horas: o dia de mudanca de horario nao tem 24. */\nfunction addDays(day: number, days: number) {\n const date = new Date(day);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days).getTime();\n}\n\n/** Faixa automatica: do primeiro ao ultimo instante, arredondada a hora ou ao dia, com uma unidade no minimo. */\nexport function autoDomain(positions: readonly number[], scale: ChartTimelineScale): [number, number] {\n const [min, max] = extent(positions.filter(Number.isFinite));\n\n if (scale === 'dayHours') {\n if (min === undefined || max === undefined) {\n return [0, HOURS_IN_DAY];\n }\n\n const start = Math.min(Math.max(Math.floor(min), 0), HOURS_IN_DAY - 1);\n return [start, Math.min(Math.max(Math.ceil(max), start + 1), HOURS_IN_DAY)];\n }\n\n if (min === undefined || max === undefined) {\n const today = startOfDay(Date.now());\n return [today, addDays(today, 1)];\n }\n\n const start = startOfDay(min);\n const lastDay = startOfDay(max);\n\n return [start, Math.max(lastDay === max ? max : addDays(lastDay, 1), addDays(start, 1))];\n}\n\nfunction dayMonth(date: Date) {\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}`;\n}\n\n/** Instante no balao e na tabela: `07:12` em horas do dia; `05/10 14:00`, ou so `05/10` a meia-noite, em datas. */\nexport function formatPosition(position: number, scale: ChartTimelineScale) {\n if (scale === 'dayHours') {\n const minutes = Math.round(position * 60);\n return `${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;\n }\n\n const date = new Date(position);\n const time = date.getHours() || date.getMinutes() ? ` ${pad(date.getHours())}:${pad(date.getMinutes())}` : '';\n\n return `${dayMonth(date)}${time}`;\n}\n\nfunction hourTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerHour = width / Math.max(end - start, Number.EPSILON);\n const step = HOUR_STEPS.find((hours) => hours * pixelsPerHour >= MIN_TICK_GAP) ?? HOURS_IN_DAY;\n const ticks: number[] = [];\n\n for (let hour = Math.ceil(start / step) * step; hour <= end; hour += step) {\n ticks.push(hour);\n }\n\n return ticks;\n}\n\n/** Marcas em datas: um dia por marca enquanto cabe, depois as segundas-feiras, depois o primeiro de cada mes. */\nfunction dateTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerDay = (width * DAY_MS) / Math.max(end - start, 1);\n const firstDay = startOfDay(start) < start ? addDays(startOfDay(start), 1) : startOfDay(start);\n const ticks: number[] = [];\n\n if (pixelsPerDay >= MIN_DAY_TICK_GAP || pixelsPerDay * 7 >= MIN_DAY_TICK_GAP) {\n const daily = pixelsPerDay >= MIN_DAY_TICK_GAP;\n const firstMonday = addDays(firstDay, (8 - new Date(firstDay).getDay()) % 7);\n\n for (let day = daily ? firstDay : firstMonday; day <= end; day = addDays(day, daily ? 1 : 7)) {\n ticks.push(day);\n }\n\n return ticks;\n }\n\n const first = new Date(firstDay);\n\n for (let month = 0; ; month += 1) {\n const day = new Date(first.getFullYear(), first.getMonth() + month, 1).getTime();\n\n if (day > end) {\n return ticks;\n }\n\n if (day >= start) {\n ticks.push(day);\n }\n }\n}\n\nexport function timeTicks(\n domain: readonly [number, number],\n scale: ChartTimelineScale,\n width: number,\n formatTick?: (time: Date) => string,\n): TimeTick[] {\n if (!domain.every(Number.isFinite) || width <= 0) {\n return [];\n }\n\n if (scale === 'dayHours') {\n return hourTicks(domain, width).map((hour) => ({\n label: formatTick ? formatTick(toDate(hour, scale)) : `${hour}h`,\n position: hour,\n }));\n }\n\n const withWeekday = (width * DAY_MS) / Math.max(domain[1] - domain[0], 1) >= WEEKDAY_TICK_GAP;\n\n return dateTicks(domain, width).map((day) => {\n const date = new Date(day);\n const label = withWeekday ? `${WEEKDAYS[date.getDay()]} ${dayMonth(date)}` : dayMonth(date);\n\n return { label: formatTick ? formatTick(date) : label, position: day };\n });\n}\n"],"names":["HOUR_MS","HOURS_IN_DAY","DAY_MS","WEEKDAYS","MIN_TICK_GAP","MIN_DAY_TICK_GAP","WEEKDAY_TICK_GAP","HOUR_STEPS","pad","value","toPosition","time","scale","toDate","position","durationMs","start","end","startOfDay","date","addDays","day","days","autoDomain","positions","min","max","extent","today","lastDay","dayMonth","formatPosition","minutes","hourTicks","width","pixelsPerHour","step","hours","ticks","hour","dateTicks","pixelsPerDay","firstDay","daily","firstMonday","first","month","timeTicks","domain","formatTick","withWeekday","label"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("d3-array"),k=require("../../../utils/formatters/formatarNumero.cjs");function f(r){return r.filter(Boolean).join(" · ")||void 0}function y(r,l){if(r===null)return{rows:[]};const{colorOf:t,duration:p,formatDuration:b,formatInstant:n}=l,i=e=>`${n(e.start)}–${n(e.end)}`;if(r.kind==="segment"){const{row:e,segment:o}=r,s=[{color:t(o.series),emphasis:!0,label:o.series,values:[p(o)]}];return l.showProgress&&o.progress!==void 0&&s.push({format:c=>k.formatarPercentual(c),label:"Concluído",values:[o.progress]}),{columns:[{format:b}],computed:"none",rows:s,subtitle:f([i(o),o.label!==o.series?o.label:void 0,e.description,r.clip]),title:e.label}}if(r.kind==="marker"){const{marker:e,row:o}=r;return{computed:"none",rows:[{color:t(e.series),emphasis:!0,format:n,label:e.series,values:[e.position]}],subtitle:e.label,title:o.label}}if(r.kind==="group"){const{segments:e}=r,o=m.min(e,d=>d.start),s=m.max(e,d=>d.end),c=o===void 0||s===void 0?void 0:i({end:s,start:o});return{computed:"none",rows:[{format:String,label:"Linhas",values:[r.rowCount]}],subtitle:f([c,r.collapsed?"Grupo recolhido":void 0]),title:r.group.label}}const{row:a,segments:v}=r,h=l.seriesOrder.flatMap(e=>{const o=r.rowBands.filter(s=>s.series===e);return o.length?[`${e} ${o.map(i).join(" · ")}`]:[]}),w=f([a.description,...h]),u=l.seriesOrder.flatMap(e=>{const o=v.filter(s=>s.series===e);return o.length?[{color:t(e),label:e,values:[m.sum(o,p)]}]:[]});return u.length===0?{computed:"none",rows:[{label:r.empty?l.emptyRowLabel:"Séries desligadas",values:[]}],subtitle:w,title:a.label}:{columns:[{format:b}],computed:"none",rows:u,showTotal:u.length>1,subtitle:w,title:a.label}}exports.timelineTooltip=y;
|
|
2
|
+
//# sourceMappingURL=timelineTooltip.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTooltip.cjs","sources":["../../../../src/components/charts/ChartTimeline/timelineTooltip.ts"],"sourcesContent":["import { max, min, sum } from 'd3-array';\nimport type { ChartTooltipProps, ChartTooltipRow } from '../ChartTooltip';\nimport { formatarPercentual } from '../../../utils/formatters';\nimport type { ChartTimelineGroup, ChartTimelineMarker, ChartTimelineRow } from './ChartTimeline';\nimport type { TimelineRange, TimelineSegment } from './timelineLayout';\n\nexport interface TimelineMarker extends ChartTimelineMarker {\n position: number;\n}\n\nexport interface TimelineRowBand extends TimelineRange {\n row: string;\n series: string;\n}\n\n/** O que esta sob o ponteiro. Cada caso carrega o que o balao dele precisa. */\nexport type TimelineTarget =\n | { clip: string | undefined; kind: 'segment'; row: ChartTimelineRow; segment: TimelineSegment }\n | { kind: 'marker'; marker: TimelineMarker; row: ChartTimelineRow }\n | {\n collapsed: boolean;\n group: ChartTimelineGroup;\n kind: 'group';\n rowCount: number;\n segments: readonly TimelineSegment[];\n }\n | {\n /** A linha nao tem intervalo algum, de nenhuma serie. */\n empty: boolean;\n kind: 'row';\n row: ChartTimelineRow;\n rowBands: readonly TimelineRowBand[];\n segments: readonly TimelineSegment[];\n };\n\nexport interface TimelineTooltipOptions {\n colorOf: (series: string) => string | undefined;\n duration: (range: TimelineRange) => number;\n emptyRowLabel: string;\n formatDuration: (durationMs: number) => string;\n formatInstant: (position: number) => string;\n seriesOrder: readonly string[];\n showProgress: boolean;\n}\n\nexport type TimelineTooltip = Omit<ChartTooltipProps, 'children'>;\n\nfunction joined(parts: readonly (string | undefined)[]) {\n return parts.filter(Boolean).join(' · ') || undefined;\n}\n\nexport function timelineTooltip(target: TimelineTarget | null, options: TimelineTooltipOptions): TimelineTooltip {\n if (target === null) {\n return { rows: [] };\n }\n\n const { colorOf, duration, formatDuration, formatInstant } = options;\n const interval = (range: TimelineRange) => `${formatInstant(range.start)}–${formatInstant(range.end)}`;\n\n if (target.kind === 'segment') {\n const { row, segment } = target;\n const rows: ChartTooltipRow[] = [\n { color: colorOf(segment.series), emphasis: true, label: segment.series, values: [duration(segment)] },\n ];\n\n if (options.showProgress && segment.progress !== undefined) {\n rows.push({ format: (value) => formatarPercentual(value), label: 'Concluído', values: [segment.progress] });\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows,\n subtitle: joined([\n interval(segment),\n segment.label !== segment.series ? segment.label : undefined,\n row.description,\n target.clip,\n ]),\n title: row.label,\n };\n }\n\n if (target.kind === 'marker') {\n const { marker, row } = target;\n\n return {\n computed: 'none',\n rows: [\n {\n color: colorOf(marker.series),\n emphasis: true,\n format: formatInstant,\n label: marker.series,\n values: [marker.position],\n },\n ],\n subtitle: marker.label,\n title: row.label,\n };\n }\n\n if (target.kind === 'group') {\n const { segments } = target;\n const start = min(segments, (segment) => segment.start);\n const end = max(segments, (segment) => segment.end);\n const period = start === undefined || end === undefined ? undefined : interval({ end, start });\n\n return {\n computed: 'none',\n rows: [{ format: String, label: 'Linhas', values: [target.rowCount] }],\n subtitle: joined([period, target.collapsed ? 'Grupo recolhido' : undefined]),\n title: target.group.label,\n };\n }\n\n const { row, segments } = target;\n const scheduled = options.seriesOrder.flatMap((series) => {\n const bands = target.rowBands.filter((band) => band.series === series);\n return bands.length ? [`${series} ${bands.map(interval).join(' · ')}`] : [];\n });\n const subtitle = joined([row.description, ...scheduled]);\n const totals = options.seriesOrder.flatMap((series): ChartTooltipRow[] => {\n const ofSeries = segments.filter((segment) => segment.series === series);\n return ofSeries.length ? [{ color: colorOf(series), label: series, values: [sum(ofSeries, duration)] }] : [];\n });\n\n // Sem coluna declarada o balao nao inventa um valor para a linha que so tem rotulo.\n if (totals.length === 0) {\n return {\n computed: 'none',\n rows: [{ label: target.empty ? options.emptyRowLabel : 'Séries desligadas', values: [] }],\n subtitle,\n title: row.label,\n };\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows: totals,\n showTotal: totals.length > 1,\n subtitle,\n title: row.label,\n };\n}\n"],"names":["joined","parts","timelineTooltip","target","options","colorOf","duration","formatDuration","formatInstant","interval","range","row","segment","rows","value","formatarPercentual","marker","segments","start","min","end","max","period","scheduled","series","bands","band","subtitle","totals","ofSeries","sum"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { min as h, max as k, sum as $ } from "d3-array";
|
|
2
|
+
import { formatarPercentual as j } from "../../../utils/formatters/formatarNumero.js";
|
|
3
|
+
function d(s) {
|
|
4
|
+
return s.filter(Boolean).join(" · ") || void 0;
|
|
5
|
+
}
|
|
6
|
+
function g(s, l) {
|
|
7
|
+
if (s === null)
|
|
8
|
+
return { rows: [] };
|
|
9
|
+
const { colorOf: n, duration: f, formatDuration: p, formatInstant: t } = l, i = (e) => `${t(e.start)}–${t(e.end)}`;
|
|
10
|
+
if (s.kind === "segment") {
|
|
11
|
+
const { row: e, segment: o } = s, r = [
|
|
12
|
+
{ color: n(o.series), emphasis: !0, label: o.series, values: [f(o)] }
|
|
13
|
+
];
|
|
14
|
+
return l.showProgress && o.progress !== void 0 && r.push({ format: (c) => j(c), label: "Concluído", values: [o.progress] }), {
|
|
15
|
+
columns: [{ format: p }],
|
|
16
|
+
computed: "none",
|
|
17
|
+
rows: r,
|
|
18
|
+
subtitle: d([
|
|
19
|
+
i(o),
|
|
20
|
+
o.label !== o.series ? o.label : void 0,
|
|
21
|
+
e.description,
|
|
22
|
+
s.clip
|
|
23
|
+
]),
|
|
24
|
+
title: e.label
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (s.kind === "marker") {
|
|
28
|
+
const { marker: e, row: o } = s;
|
|
29
|
+
return {
|
|
30
|
+
computed: "none",
|
|
31
|
+
rows: [
|
|
32
|
+
{
|
|
33
|
+
color: n(e.series),
|
|
34
|
+
emphasis: !0,
|
|
35
|
+
format: t,
|
|
36
|
+
label: e.series,
|
|
37
|
+
values: [e.position]
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
subtitle: e.label,
|
|
41
|
+
title: o.label
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (s.kind === "group") {
|
|
45
|
+
const { segments: e } = s, o = h(e, (m) => m.start), r = k(e, (m) => m.end), c = o === void 0 || r === void 0 ? void 0 : i({ end: r, start: o });
|
|
46
|
+
return {
|
|
47
|
+
computed: "none",
|
|
48
|
+
rows: [{ format: String, label: "Linhas", values: [s.rowCount] }],
|
|
49
|
+
subtitle: d([c, s.collapsed ? "Grupo recolhido" : void 0]),
|
|
50
|
+
title: s.group.label
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const { row: a, segments: w } = s, v = l.seriesOrder.flatMap((e) => {
|
|
54
|
+
const o = s.rowBands.filter((r) => r.series === e);
|
|
55
|
+
return o.length ? [`${e} ${o.map(i).join(" · ")}`] : [];
|
|
56
|
+
}), b = d([a.description, ...v]), u = l.seriesOrder.flatMap((e) => {
|
|
57
|
+
const o = w.filter((r) => r.series === e);
|
|
58
|
+
return o.length ? [{ color: n(e), label: e, values: [$(o, f)] }] : [];
|
|
59
|
+
});
|
|
60
|
+
return u.length === 0 ? {
|
|
61
|
+
computed: "none",
|
|
62
|
+
rows: [{ label: s.empty ? l.emptyRowLabel : "Séries desligadas", values: [] }],
|
|
63
|
+
subtitle: b,
|
|
64
|
+
title: a.label
|
|
65
|
+
} : {
|
|
66
|
+
columns: [{ format: p }],
|
|
67
|
+
computed: "none",
|
|
68
|
+
rows: u,
|
|
69
|
+
showTotal: u.length > 1,
|
|
70
|
+
subtitle: b,
|
|
71
|
+
title: a.label
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
g as timelineTooltip
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=timelineTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTooltip.js","sources":["../../../../src/components/charts/ChartTimeline/timelineTooltip.ts"],"sourcesContent":["import { max, min, sum } from 'd3-array';\nimport type { ChartTooltipProps, ChartTooltipRow } from '../ChartTooltip';\nimport { formatarPercentual } from '../../../utils/formatters';\nimport type { ChartTimelineGroup, ChartTimelineMarker, ChartTimelineRow } from './ChartTimeline';\nimport type { TimelineRange, TimelineSegment } from './timelineLayout';\n\nexport interface TimelineMarker extends ChartTimelineMarker {\n position: number;\n}\n\nexport interface TimelineRowBand extends TimelineRange {\n row: string;\n series: string;\n}\n\n/** O que esta sob o ponteiro. Cada caso carrega o que o balao dele precisa. */\nexport type TimelineTarget =\n | { clip: string | undefined; kind: 'segment'; row: ChartTimelineRow; segment: TimelineSegment }\n | { kind: 'marker'; marker: TimelineMarker; row: ChartTimelineRow }\n | {\n collapsed: boolean;\n group: ChartTimelineGroup;\n kind: 'group';\n rowCount: number;\n segments: readonly TimelineSegment[];\n }\n | {\n /** A linha nao tem intervalo algum, de nenhuma serie. */\n empty: boolean;\n kind: 'row';\n row: ChartTimelineRow;\n rowBands: readonly TimelineRowBand[];\n segments: readonly TimelineSegment[];\n };\n\nexport interface TimelineTooltipOptions {\n colorOf: (series: string) => string | undefined;\n duration: (range: TimelineRange) => number;\n emptyRowLabel: string;\n formatDuration: (durationMs: number) => string;\n formatInstant: (position: number) => string;\n seriesOrder: readonly string[];\n showProgress: boolean;\n}\n\nexport type TimelineTooltip = Omit<ChartTooltipProps, 'children'>;\n\nfunction joined(parts: readonly (string | undefined)[]) {\n return parts.filter(Boolean).join(' · ') || undefined;\n}\n\nexport function timelineTooltip(target: TimelineTarget | null, options: TimelineTooltipOptions): TimelineTooltip {\n if (target === null) {\n return { rows: [] };\n }\n\n const { colorOf, duration, formatDuration, formatInstant } = options;\n const interval = (range: TimelineRange) => `${formatInstant(range.start)}–${formatInstant(range.end)}`;\n\n if (target.kind === 'segment') {\n const { row, segment } = target;\n const rows: ChartTooltipRow[] = [\n { color: colorOf(segment.series), emphasis: true, label: segment.series, values: [duration(segment)] },\n ];\n\n if (options.showProgress && segment.progress !== undefined) {\n rows.push({ format: (value) => formatarPercentual(value), label: 'Concluído', values: [segment.progress] });\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows,\n subtitle: joined([\n interval(segment),\n segment.label !== segment.series ? segment.label : undefined,\n row.description,\n target.clip,\n ]),\n title: row.label,\n };\n }\n\n if (target.kind === 'marker') {\n const { marker, row } = target;\n\n return {\n computed: 'none',\n rows: [\n {\n color: colorOf(marker.series),\n emphasis: true,\n format: formatInstant,\n label: marker.series,\n values: [marker.position],\n },\n ],\n subtitle: marker.label,\n title: row.label,\n };\n }\n\n if (target.kind === 'group') {\n const { segments } = target;\n const start = min(segments, (segment) => segment.start);\n const end = max(segments, (segment) => segment.end);\n const period = start === undefined || end === undefined ? undefined : interval({ end, start });\n\n return {\n computed: 'none',\n rows: [{ format: String, label: 'Linhas', values: [target.rowCount] }],\n subtitle: joined([period, target.collapsed ? 'Grupo recolhido' : undefined]),\n title: target.group.label,\n };\n }\n\n const { row, segments } = target;\n const scheduled = options.seriesOrder.flatMap((series) => {\n const bands = target.rowBands.filter((band) => band.series === series);\n return bands.length ? [`${series} ${bands.map(interval).join(' · ')}`] : [];\n });\n const subtitle = joined([row.description, ...scheduled]);\n const totals = options.seriesOrder.flatMap((series): ChartTooltipRow[] => {\n const ofSeries = segments.filter((segment) => segment.series === series);\n return ofSeries.length ? [{ color: colorOf(series), label: series, values: [sum(ofSeries, duration)] }] : [];\n });\n\n // Sem coluna declarada o balao nao inventa um valor para a linha que so tem rotulo.\n if (totals.length === 0) {\n return {\n computed: 'none',\n rows: [{ label: target.empty ? options.emptyRowLabel : 'Séries desligadas', values: [] }],\n subtitle,\n title: row.label,\n };\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows: totals,\n showTotal: totals.length > 1,\n subtitle,\n title: row.label,\n };\n}\n"],"names":["joined","parts","timelineTooltip","target","options","colorOf","duration","formatDuration","formatInstant","interval","range","row","segment","rows","value","formatarPercentual","marker","segments","start","min","end","max","period","scheduled","series","bands","band","subtitle","totals","ofSeries","sum"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),h=require("react"),P=require("react-dom"),t=require("./ChartTooltip.module.css.cjs"),b=require("../../../utils/formatters/formatarNumero.cjs"),f=16,j=8;function y(r){return r.reduce((n,i)=>n+i,0)}function D(r,n){return typeof r=="function"?r(n):r==="average"?n.length===0?0:y(n)/n.length:y(n)}function S({x:r,y:n},i,u){const p=r+f+i<=window.innerWidth-j,d=n+f+u<=window.innerHeight-j;return{x:p?r+f:Math.max(r-f-i,j),y:d?n+f:Math.max(n-f-u,j)}}function R({children:r,columns:n,computed:i,rows:u,showTotal:p=!1,subtitle:d,title:x,totalLabel:N="Total"}){const[v,c]=h.useState(null),g=v!==null&&u.length>0;h.useEffect(()=>{if(!g)return;const s=()=>c(null);return window.addEventListener("scroll",s,!0),window.addEventListener("resize",s),window.addEventListener("keydown",s),()=>{window.removeEventListener("scroll",s,!0),window.removeEventListener("resize",s),window.removeEventListener("keydown",s)}},[g]);const w=s=>c({x:s.clientX,y:s.clientY});return a.jsxs("div",{className:t.default.area,onPointerLeave:()=>c(null),onPointerMove:w,children:[r,g&&P.createPortal(a.jsx(k,{columns:n,computed:i,ponteiro:v,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}),document.body)]})}function k({columns:r,computed:n,ponteiro:i,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}){const v=h.useRef(null),[c,g]=h.useState({altura:0,largura:0});h.useLayoutEffect(()=>{const e=v.current;if(!e)return;const{height:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),h=require("react"),P=require("react-dom"),t=require("./ChartTooltip.module.css.cjs"),b=require("../../../utils/formatters/formatarNumero.cjs"),f=16,j=8;function y(r){return r.reduce((n,i)=>n+i,0)}function D(r,n){return typeof r=="function"?r(n):r==="average"?n.length===0?0:y(n)/n.length:y(n)}function S({x:r,y:n},i,u){const p=r+f+i<=window.innerWidth-j,d=n+f+u<=window.innerHeight-j;return{x:p?r+f:Math.max(r-f-i,j),y:d?n+f:Math.max(n-f-u,j)}}function R({children:r,columns:n,computed:i,rows:u,showTotal:p=!1,subtitle:d,title:x,totalLabel:N="Total"}){const[v,c]=h.useState(null),g=v!==null&&u.length>0;h.useEffect(()=>{if(!g)return;const s=()=>c(null);return window.addEventListener("scroll",s,!0),window.addEventListener("resize",s),window.addEventListener("keydown",s),()=>{window.removeEventListener("scroll",s,!0),window.removeEventListener("resize",s),window.removeEventListener("keydown",s)}},[g]);const w=s=>c({x:s.clientX,y:s.clientY});return a.jsxs("div",{className:t.default.area,onPointerLeave:()=>c(null),onPointerMove:w,children:[r,g&&P.createPortal(a.jsx(k,{columns:n,computed:i,ponteiro:v,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}),document.body)]})}function k({columns:r,computed:n,ponteiro:i,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}){const v=h.useRef(null),[c,g]=h.useState({altura:0,largura:0});h.useLayoutEffect(()=>{const e=v.current;if(!e)return;const{height:l,width:m}=e.getBoundingClientRect();(l!==c.altura||m!==c.largura)&&g({altura:l,largura:m})});const w=u.reduce((e,l)=>Math.max(e,l.values.length),0),s=r??Array.from({length:w},()=>({})),o=n==="none"||s.length===0?void 0:n??{},E=(o==null?void 0:o.column)??s.length-1,$=y(u.map(e=>e.values[E]??0)),L=(o==null?void 0:o.compute)??((e,l)=>l===0?0:e/l),M=(o==null?void 0:o.format)??(e=>b.formatarPercentual(e,{casasDecimais:2})),{x:A,y:C}=S(i,c.largura,c.altura),q=`1fr ${"auto ".repeat(s.length+(o?1:0))}`.trim();return a.jsxs("div",{"aria-hidden":"true",className:t.default.tooltip,ref:v,style:{left:A,top:C},children:[x!==void 0&&a.jsx("p",{className:t.default.title,children:x}),d!==void 0&&a.jsx("p",{className:t.default.subtitle,children:d}),a.jsxs("div",{className:t.default.grid,style:{gridTemplateColumns:q},children:[u.map((e,l)=>a.jsxs(h.Fragment,{children:[a.jsxs("span",{className:`${t.default.label} ${e.emphasis?t.default.emphasis:""}`,children:[e.color!==void 0&&a.jsx("span",{className:t.default.swatch,style:{background:e.color}}),e.label]}),s.map((m,T)=>a.jsx("span",{className:`${t.default.value} ${e.emphasis?t.default.emphasis:""}`,children:(e.format??m.format??b.formatarNumero)(e.values[T]??0)},T)),o&&a.jsx("span",{className:`${t.default.computed} ${e.emphasis?t.default.emphasis:""}`,children:M(L(e.values[E]??0,$))})]},l)),p&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:t.default.rule}),a.jsx("span",{className:`${t.default.label} ${t.default.totalLabel}`,children:N}),s.map((e,l)=>a.jsx("span",{className:`${t.default.value} ${t.default.totalValue}`,children:e.total==="none"?"":(e.format??b.formatarNumero)(D(e.total??"sum",u.map(m=>m.values[l]??0)))},l)),o&&a.jsx("span",{className:`${t.default.computed} ${t.default.totalValue}`,children:M(L($,$))})]})]})]})}exports.ChartTooltip=R;
|
|
2
2
|
//# sourceMappingURL=ChartTooltip.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n /** Formato dos valores desta linha, quando difere do da coluna, como a serie do eixo da direita. */\n format?: (value: number) => string;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(linha.format ?? coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
|
|
@@ -93,7 +93,7 @@ function H({
|
|
|
93
93
|
e.color !== void 0 && /* @__PURE__ */ i("span", { className: t.swatch, style: { background: e.color } }),
|
|
94
94
|
e.label
|
|
95
95
|
] }),
|
|
96
|
-
a.map((d, A) => /* @__PURE__ */ i("span", { className: `${t.value} ${e.emphasis ? t.emphasis : ""}`, children: (d.format ?? T)(e.values[A] ?? 0) }, A)),
|
|
96
|
+
a.map((d, A) => /* @__PURE__ */ i("span", { className: `${t.value} ${e.emphasis ? t.emphasis : ""}`, children: (e.format ?? d.format ?? T)(e.values[A] ?? 0) }, A)),
|
|
97
97
|
s && /* @__PURE__ */ i("span", { className: `${t.computed} ${e.emphasis ? t.emphasis : ""}`, children: M(L(e.values[x] ?? 0, b)) })
|
|
98
98
|
] }, o)),
|
|
99
99
|
h && /* @__PURE__ */ f(k, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartTooltip.js","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartTooltip.js","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n /** Formato dos valores desta linha, quando difere do da coluna, como a serie do eixo da direita. */\n format?: (value: number) => string;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(linha.format ?? coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),g=require("react"),F=require("d3-hierarchy"),x=require("./ChartTreemap.module.css.cjs"),X=require("../core/useChartMetrics.cjs"),Y=require("../core/useSeriesToggle.cjs"),o=require("../palette/seriesColor.cjs"),Z=require("../core/ChartFrame.cjs"),s=require("../core/spacing.cjs"),ee=require("../../../utils/formatters/formatarNumero.cjs"),H=require("../core/measureText.cjs"),te=require("../core/tooltips.cjs"),N=require("../core/hoverPath.cjs"),re=require("../core/cartesianLayout.cjs");function M(u){return Number.isFinite(u.value)?Math.max(u.value??0,0):0}function ie({accent:u,defaultHiddenGroups:R,emptyMessage:j="Sem dados no período",formatTooltipValue:B,formatValue:E=ee.formatarNumero,gap:v=5,height:f=280,hiddenGroups:D,intentLabels:p,legend:I="bottom",legendAlign:P,nodes:i,onHiddenGroupsChange:$,onHoverNode:d,showDataLabels:K=!0,showTooltip:_=!0,title:W}){const{font:c,height:w,ref:z,width:m}=X.useChartMetrics(),{fillHeight:G,value:T}=re.chartHeight(f,w),{isHidden:S,toggle:k}=Y.useSeriesToggle({defaultHiddenSeries:R,hiddenSeries:D,onHiddenSeriesChange:$}),y=g.useMemo(()=>o.resolveSeriesColors(i,{accent:u}),[u,i]),J=g.useMemo(()=>!((F.hierarchy({children:i,label:""}).sum(M).value??0)>0),[i]),O=g.useMemo(()=>{const e=i.filter(r=>!S(r.label));if(m===0||T===0||e.length===0)return[];const t=F.hierarchy({children:e,label:""}).sum(M).sort((r,a)=>(a.value??0)-(r.value??0));return F.treemap().size([m,T]).paddingInner(v).round(!0)(t).leaves()},[T,v,S,i,m]),[b,Q]=g.useState(null),h=b&&O.includes(b)?b:null;function L(e){Q(e),d==null||d(e&&N.hoverPath(e))}function q(e){var r;const t=e.data;if(t.color)return t.color;if(t.intent)return o.INTENT_TOKENS[t.intent];const n=(r=e.ancestors().find(a=>a.depth===1))==null?void 0:r.data;return y[i.findIndex(a=>a.label===(n==null?void 0:n.label))]??o.INTENT_TOKENS.neutral}const U=p?Object.entries(p).map(([e,t])=>({color:o.INTENT_TOKENS[e],label:t})):i.map((e,t)=>({color:y[t],hidden:S(e.label),label:e.label}));return l.jsx(Z.ChartFrame,{containerRef:z,empty:i.length===0||J,emptyMessage:j,fillHeight:G,height:T,legend:U,legendAlign:P,legendPosition:I,onToggleSeries:p?void 0:k,title:W,tooltip:_?te.pathTooltip({color:h?q(h):void 0,format:B??E,path:h&&N.hoverPath(h)}):void 0,width:m,children:O.map(e=>{const t=e.x1-e.x0,n=e.y1-e.y0,r=t-s.CHART_LABEL_OFFSET*2,a=K&&r>0&&n>=c.lineHeight+s.CHART_LABEL_OFFSET,V=a&&n>=c.lineHeight*2+s.CHART_LABEL_OFFSET,A=`${e.data.label}: ${E(e.value??0)}`,C=q(e);return l.jsxs("g",{className:x.default.cell,children:[l.jsx("rect",{"aria-label":A,className:x.default.tile,fill:C,height:n,width:t,onMouseEnter:()=>L(e),onMouseLeave:()=>L(null),x:e.x0,y:e.y0,children:!_&&!d&&l.jsx("title",{children:A})}),a&&l.jsx("text",{className:x.default.label,fill:o.textColorOn(C),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+c.lineHeight*.6,children:H.truncateToWidth(e.data.label,c,r)}),V&&l.jsx("text",{className:x.default.value,fill:o.textColorOn(C),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+c.lineHeight*1.6,children:H.truncateToWidth(E(e.value??0),c,r)})]},`${e.data.label}-${e.x0}-${e.y0}`)})})}exports.ChartTreemap=ie;
|
|
2
2
|
//# sourceMappingURL=ChartTreemap.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartTreemap.cjs","sources":["../../../../src/components/charts/ChartTreemap/ChartTreemap.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { hierarchy, treemap } from 'd3-hierarchy';\nimport {\n CHART_LABEL_OFFSET,\n ChartFrame,\n chartHeight,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport {\n INTENT_TOKENS,\n resolveSeriesColors,\n textColorOn,\n type SeriesAppearance,\n type SeriesIntent,\n} from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartTreemap.module.css';\n\nexport interface ChartTreemapNode extends SeriesAppearance {\n children?: readonly ChartTreemapNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartTreemapProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n /** Folga entre dois retangulos vizinhos. */\n gap?: number;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n /**\n * Nome de cada intencao na legenda. Informado, a legenda deixa de listar os\n * grupos e passa a nomear as cores: e o caso do mapa colorido por status,\n * onde o que a legenda explica e o significado da cor, nao a categoria.\n */\n intentLabels?: Partial<Record<SeriesIntent, string>>;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartTreemapNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n showDataLabels?: boolean;\n title: string;\n}\n\n\n/** Area que o no ocupa. Invalido ou negativo nao ocupa nada. */\nfunction ocupacao(no: ChartTreemapNode) {\n return Number.isFinite(no.value) ? Math.max(no.value ?? 0, 0) : 0;\n}\n\nexport function ChartTreemap({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n gap = 5,\n height = 280,\n hiddenGroups,\n intentLabels,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n showDataLabels = true,\n title,\n}: ChartTreemapProps) {\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeGrupo = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n // Sem valor positivo nao ha area a repartir: anuncia vazio. Desligar todos os grupos, nao: a legenda e a volta.\n const semValor = useMemo(\n () => !((hierarchy<ChartTreemapNode>({ children: nodes, label: '' }).sum(ocupacao).value ?? 0) > 0),\n [nodes],\n );\n\n const retangulos = useMemo(() => {\n const visiveis = nodes.filter((grupo) => !isHidden(grupo.label));\n\n if (width === 0 || alturaDoDesenho === 0 || visiveis.length === 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartTreemapNode>({ children: visiveis, label: '' })\n .sum(ocupacao)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const posicionar = treemap<ChartTreemapNode>()\n .size([width, alturaDoDesenho])\n .paddingInner(gap)\n .round(true);\n\n return posicionar(arvore).leaves();\n }, [alturaDoDesenho, gap, isHidden, nodes, width]);\n\n /** A folha herda a cor do grupo, e a intencao propria vence a herdada. */\n function corDa(folha: (typeof retangulos)[number]) {\n const proprio = folha.data;\n\n if (proprio.color) {\n return proprio.color;\n }\n\n if (proprio.intent) {\n return INTENT_TOKENS[proprio.intent];\n }\n\n const grupo = folha.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n\n return coresDeGrupo[nodes.findIndex((no) => no.label === grupo?.label)] ?? INTENT_TOKENS.neutral;\n }\n\n const entradasDaLegenda = intentLabels\n ? (Object.entries(intentLabels) as [SeriesIntent, string][]).map(([intencao, rotulo]) => ({\n color: INTENT_TOKENS[intencao],\n label: rotulo,\n }))\n : nodes.map((grupo, indice) => ({\n color: coresDeGrupo[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }));\n\n return (\n <ChartFrame\n containerRef={ref}\n empty={nodes.length === 0 || semValor}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={entradasDaLegenda}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={intentLabels ? undefined : toggle}\n title={title}\n width={width}\n >\n {retangulos.map((folha) => {\n const largura = folha.x1 - folha.x0;\n const altura = folha.y1 - folha.y0;\n const disponivel = largura - CHART_LABEL_OFFSET * 2;\n const cabeORotulo = showDataLabels && disponivel > 0 && altura >= font.lineHeight + CHART_LABEL_OFFSET;\n const cabeOValor = cabeORotulo && altura >= font.lineHeight * 2 + CHART_LABEL_OFFSET;\n const descricao = `${folha.data.label}: ${formatValue(folha.value ?? 0)}`;\n const cor = corDa(folha);\n\n return (\n <g className={styles.cell} key={`${folha.data.label}-${folha.x0}-${folha.y0}`}>\n <rect\n aria-label={descricao}\n className={styles.tile}\n fill={cor}\n height={altura}\n width={largura}\n x={folha.x0}\n y={folha.y0}\n >\n <title>{descricao}</title>\n </rect>\n\n {cabeORotulo && (\n <text\n className={styles.label}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 0.6}\n >\n {truncateToWidth(folha.data.label, font, disponivel)}\n </text>\n )}\n\n {cabeOValor && (\n <text\n className={styles.value}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 1.6}\n >\n {truncateToWidth(formatValue(folha.value ?? 0), font, disponivel)}\n </text>\n )}\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ocupacao","no","ChartTreemap","accent","defaultHiddenGroups","emptyMessage","formatValue","formatarNumero","gap","height","hiddenGroups","intentLabels","legend","legendAlign","nodes","onHiddenGroupsChange","showDataLabels","title","font","alturaMedida","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","coresDeGrupo","useMemo","resolveSeriesColors","semValor","hierarchy","retangulos","visiveis","grupo","arvore","a","b","treemap","corDa","folha","proprio","INTENT_TOKENS","_a","ancestral","entradasDaLegenda","intencao","rotulo","indice","jsx","ChartFrame","largura","altura","disponivel","CHART_LABEL_OFFSET","cabeORotulo","cabeOValor","descricao","cor","jsxs","styles","textColorOn","truncateToWidth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartTreemap.cjs","sources":["../../../../src/components/charts/ChartTreemap/ChartTreemap.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, treemap } from 'd3-hierarchy';\nimport {\n CHART_LABEL_OFFSET,\n ChartFrame,\n chartHeight,\n hoverPath,\n pathTooltip,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n type ChartHeight,\n type ChartHoveredNode,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport {\n INTENT_TOKENS,\n resolveSeriesColors,\n textColorOn,\n type SeriesAppearance,\n type SeriesIntent,\n} from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartTreemap.module.css';\n\nexport interface ChartTreemapNode extends SeriesAppearance {\n children?: readonly ChartTreemapNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartTreemapProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n /** Formato dos valores no balao. Sem ele, vale o `formatValue`: o eixo pode sair compacto e o balao, exato. */\n formatTooltipValue?: (value: number) => string;\n formatValue?: (value: number) => string;\n /** Folga entre dois retangulos vizinhos. */\n gap?: number;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n /**\n * Nome de cada intencao na legenda. Informado, a legenda deixa de listar os\n * grupos e passa a nomear as cores: e o caso do mapa colorido por status,\n * onde o que a legenda explica e o significado da cor, nao a categoria.\n */\n intentLabels?: Partial<Record<SeriesIntent, string>>;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartTreemapNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Caminho ate o no sob o ponteiro, do grupo ao no, cada nivel com o valor somado, ou `null` ao sair. */\n onHoverNode?: (path: readonly ChartHoveredNode[] | null) => void;\n showDataLabels?: boolean;\n /**\n * Balao com o caminho ate o no sob o ponteiro. Desligue para montar o proprio `ChartTooltip`\n * pela costura; sem balao nem costura, o no volta a ter o `<title>`.\n */\n showTooltip?: boolean;\n title: string;\n}\n\n\n/** Area que o no ocupa. Invalido ou negativo nao ocupa nada. */\nfunction ocupacao(no: ChartTreemapNode) {\n return Number.isFinite(no.value) ? Math.max(no.value ?? 0, 0) : 0;\n}\n\nexport function ChartTreemap({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatTooltipValue,\n formatValue = formatarNumero,\n gap = 5,\n height = 280,\n hiddenGroups,\n intentLabels,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n onHoverNode,\n showDataLabels = true,\n showTooltip = true,\n title,\n}: ChartTreemapProps) {\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeGrupo = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n // Sem valor positivo nao ha area a repartir: anuncia vazio. Desligar todos os grupos, nao: a legenda e a volta.\n const semValor = useMemo(\n () => !((hierarchy<ChartTreemapNode>({ children: nodes, label: '' }).sum(ocupacao).value ?? 0) > 0),\n [nodes],\n );\n\n const retangulos = useMemo(() => {\n const visiveis = nodes.filter((grupo) => !isHidden(grupo.label));\n\n if (width === 0 || alturaDoDesenho === 0 || visiveis.length === 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartTreemapNode>({ children: visiveis, label: '' })\n .sum(ocupacao)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const posicionar = treemap<ChartTreemapNode>()\n .size([width, alturaDoDesenho])\n .paddingInner(gap)\n .round(true);\n\n return posicionar(arvore).leaves();\n }, [alturaDoDesenho, gap, isHidden, nodes, width]);\n\n const [emFoco, setEmFoco] = useState<(typeof retangulos)[number] | null>(null);\n // A folha guardada deixa de existir quando o mapa e remontado; sem conferir, o balao falaria de um no que saiu.\n const foco = emFoco && retangulos.includes(emFoco) ? emFoco : null;\n\n function focar(folha: (typeof retangulos)[number] | null) {\n setEmFoco(folha);\n onHoverNode?.(folha && hoverPath(folha));\n }\n\n /** A folha herda a cor do grupo, e a intencao propria vence a herdada. */\n function corDa(folha: (typeof retangulos)[number]) {\n const proprio = folha.data;\n\n if (proprio.color) {\n return proprio.color;\n }\n\n if (proprio.intent) {\n return INTENT_TOKENS[proprio.intent];\n }\n\n const grupo = folha.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n\n return coresDeGrupo[nodes.findIndex((no) => no.label === grupo?.label)] ?? INTENT_TOKENS.neutral;\n }\n\n const entradasDaLegenda = intentLabels\n ? (Object.entries(intentLabels) as [SeriesIntent, string][]).map(([intencao, rotulo]) => ({\n color: INTENT_TOKENS[intencao],\n label: rotulo,\n }))\n : nodes.map((grupo, indice) => ({\n color: coresDeGrupo[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }));\n\n return (\n <ChartFrame\n containerRef={ref}\n empty={nodes.length === 0 || semValor}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={entradasDaLegenda}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={intentLabels ? undefined : toggle}\n title={title}\n tooltip={\n showTooltip\n ? pathTooltip({ color: foco ? corDa(foco) : undefined, format: formatTooltipValue ?? formatValue, path: foco && hoverPath(foco) })\n : undefined\n }\n width={width}\n >\n {retangulos.map((folha) => {\n const largura = folha.x1 - folha.x0;\n const altura = folha.y1 - folha.y0;\n const disponivel = largura - CHART_LABEL_OFFSET * 2;\n const cabeORotulo = showDataLabels && disponivel > 0 && altura >= font.lineHeight + CHART_LABEL_OFFSET;\n const cabeOValor = cabeORotulo && altura >= font.lineHeight * 2 + CHART_LABEL_OFFSET;\n const descricao = `${folha.data.label}: ${formatValue(folha.value ?? 0)}`;\n const cor = corDa(folha);\n\n return (\n <g className={styles.cell} key={`${folha.data.label}-${folha.x0}-${folha.y0}`}>\n <rect\n aria-label={descricao}\n className={styles.tile}\n fill={cor}\n height={altura}\n width={largura}\n onMouseEnter={() => focar(folha)}\n onMouseLeave={() => focar(null)}\n x={folha.x0}\n y={folha.y0}\n >\n {!showTooltip && !onHoverNode && <title>{descricao}</title>}\n </rect>\n\n {cabeORotulo && (\n <text\n className={styles.label}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 0.6}\n >\n {truncateToWidth(folha.data.label, font, disponivel)}\n </text>\n )}\n\n {cabeOValor && (\n <text\n className={styles.value}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 1.6}\n >\n {truncateToWidth(formatValue(folha.value ?? 0), font, disponivel)}\n </text>\n )}\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ocupacao","no","ChartTreemap","accent","defaultHiddenGroups","emptyMessage","formatTooltipValue","formatValue","formatarNumero","gap","height","hiddenGroups","intentLabels","legend","legendAlign","nodes","onHiddenGroupsChange","onHoverNode","showDataLabels","showTooltip","title","font","alturaMedida","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","coresDeGrupo","useMemo","resolveSeriesColors","semValor","hierarchy","retangulos","visiveis","grupo","arvore","a","b","treemap","emFoco","setEmFoco","useState","foco","focar","folha","hoverPath","corDa","proprio","INTENT_TOKENS","_a","ancestral","entradasDaLegenda","intencao","rotulo","indice","jsx","ChartFrame","pathTooltip","largura","altura","disponivel","CHART_LABEL_OFFSET","cabeORotulo","cabeOValor","descricao","cor","jsxs","styles","textColorOn","truncateToWidth"],"mappings":"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"}
|