@cronus-ui/ui 0.6.0
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/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/charts/animation.d.ts +11 -0
- package/dist/charts/animation.js +29 -0
- package/dist/charts/area-chart-loading.d.ts +34 -0
- package/dist/charts/area-chart-loading.js +22 -0
- package/dist/charts/area-chart.d.ts +48 -0
- package/dist/charts/area-chart.js +57 -0
- package/dist/charts/area-gradient-defs.d.ts +20 -0
- package/dist/charts/area-gradient-defs.js +15 -0
- package/dist/charts/area.d.ts +76 -0
- package/dist/charts/area.js +104 -0
- package/dist/charts/background.d.ts +27 -0
- package/dist/charts/background.js +68 -0
- package/dist/charts/bar-chart-loading.d.ts +17 -0
- package/dist/charts/bar-chart-loading.js +14 -0
- package/dist/charts/bar-chart.d.ts +55 -0
- package/dist/charts/bar-chart.js +432 -0
- package/dist/charts/bar-depth-geometry.d.ts +33 -0
- package/dist/charts/bar-depth-geometry.js +38 -0
- package/dist/charts/bar-depth.d.ts +157 -0
- package/dist/charts/bar-depth.js +586 -0
- package/dist/charts/bar-squares-layout.d.ts +28 -0
- package/dist/charts/bar-squares-layout.js +47 -0
- package/dist/charts/bar-squares.d.ts +49 -0
- package/dist/charts/bar-squares.js +207 -0
- package/dist/charts/bar-x-axis.d.ts +14 -0
- package/dist/charts/bar-x-axis.js +73 -0
- package/dist/charts/bar-y-axis.d.ts +12 -0
- package/dist/charts/bar-y-axis.js +64 -0
- package/dist/charts/bar.d.ts +41 -0
- package/dist/charts/bar.js +208 -0
- package/dist/charts/candlestick-chart.d.ts +46 -0
- package/dist/charts/candlestick-chart.js +203 -0
- package/dist/charts/candlestick.d.ts +24 -0
- package/dist/charts/candlestick.js +139 -0
- package/dist/charts/chart-brush-handle.d.ts +15 -0
- package/dist/charts/chart-brush-handle.js +47 -0
- package/dist/charts/chart-brush-layout.d.ts +27 -0
- package/dist/charts/chart-brush-layout.js +42 -0
- package/dist/charts/chart-brush-selection-overlay.d.ts +19 -0
- package/dist/charts/chart-brush-selection-overlay.js +44 -0
- package/dist/charts/chart-brush-track-overlay.d.ts +23 -0
- package/dist/charts/chart-brush-track-overlay.js +65 -0
- package/dist/charts/chart-brush.d.ts +32 -0
- package/dist/charts/chart-brush.js +116 -0
- package/dist/charts/chart-center-typography.d.ts +12 -0
- package/dist/charts/chart-center-typography.js +12 -0
- package/dist/charts/chart-child-passthrough.d.ts +17 -0
- package/dist/charts/chart-child-passthrough.js +74 -0
- package/dist/charts/chart-config-context.d.ts +26 -0
- package/dist/charts/chart-config-context.js +47 -0
- package/dist/charts/chart-context.d.ts +199 -0
- package/dist/charts/chart-context.js +201 -0
- package/dist/charts/chart-defs.d.ts +13 -0
- package/dist/charts/chart-defs.js +49 -0
- package/dist/charts/chart-formatters.d.ts +10 -0
- package/dist/charts/chart-formatters.js +28 -0
- package/dist/charts/chart-legend-hover.d.ts +13 -0
- package/dist/charts/chart-legend-hover.js +18 -0
- package/dist/charts/chart-legend.d.ts +55 -0
- package/dist/charts/chart-legend.js +30 -0
- package/dist/charts/chart-loading-label.d.ts +10 -0
- package/dist/charts/chart-loading-label.js +21 -0
- package/dist/charts/chart-phase.d.ts +31 -0
- package/dist/charts/chart-phase.js +21 -0
- package/dist/charts/chart-reveal-clip.d.ts +24 -0
- package/dist/charts/chart-reveal-clip.js +24 -0
- package/dist/charts/chart-scale.d.ts +12 -0
- package/dist/charts/chart-scale.js +17 -0
- package/dist/charts/chart-stat-flow.d.ts +36 -0
- package/dist/charts/chart-stat-flow.js +23 -0
- package/dist/charts/choropleth/choropleth-chart.d.ts +43 -0
- package/dist/charts/choropleth/choropleth-chart.js +218 -0
- package/dist/charts/choropleth/choropleth-context.d.ts +86 -0
- package/dist/charts/choropleth/choropleth-context.js +106 -0
- package/dist/charts/choropleth/choropleth-feature.d.ts +13 -0
- package/dist/charts/choropleth/choropleth-feature.js +125 -0
- package/dist/charts/choropleth/choropleth-graticule.d.ts +11 -0
- package/dist/charts/choropleth/choropleth-graticule.js +12 -0
- package/dist/charts/choropleth/choropleth-tooltip.d.ts +31 -0
- package/dist/charts/choropleth/choropleth-tooltip.js +50 -0
- package/dist/charts/choropleth/index.d.ts +7 -0
- package/dist/charts/choropleth/index.js +6 -0
- package/dist/charts/composed-chart.d.ts +36 -0
- package/dist/charts/composed-chart.js +152 -0
- package/dist/charts/dash-tail-stroke.d.ts +18 -0
- package/dist/charts/dash-tail-stroke.js +13 -0
- package/dist/charts/decimate-time-series.d.ts +10 -0
- package/dist/charts/decimate-time-series.js +112 -0
- package/dist/charts/fade-edges.d.ts +34 -0
- package/dist/charts/fade-edges.js +35 -0
- package/dist/charts/filter-data-by-x-domain.d.ts +5 -0
- package/dist/charts/filter-data-by-x-domain.js +42 -0
- package/dist/charts/funnel-chart.d.ts +91 -0
- package/dist/charts/funnel-chart.js +302 -0
- package/dist/charts/gauge-label-layout.d.ts +22 -0
- package/dist/charts/gauge-label-layout.js +44 -0
- package/dist/charts/gauge.d.ts +56 -0
- package/dist/charts/gauge.js +307 -0
- package/dist/charts/generate-chart-skeleton-data.d.ts +16 -0
- package/dist/charts/generate-chart-skeleton-data.js +25 -0
- package/dist/charts/grid.d.ts +58 -0
- package/dist/charts/grid.js +80 -0
- package/dist/charts/heatmap/generate-heatmap-skeleton-data.d.ts +4 -0
- package/dist/charts/heatmap/generate-heatmap-skeleton-data.js +12 -0
- package/dist/charts/heatmap/heatmap-animation.d.ts +41 -0
- package/dist/charts/heatmap/heatmap-animation.js +85 -0
- package/dist/charts/heatmap/heatmap-cells.d.ts +21 -0
- package/dist/charts/heatmap/heatmap-cells.js +265 -0
- package/dist/charts/heatmap/heatmap-chart-loading.d.ts +21 -0
- package/dist/charts/heatmap/heatmap-chart-loading.js +14 -0
- package/dist/charts/heatmap/heatmap-chart.d.ts +80 -0
- package/dist/charts/heatmap/heatmap-chart.js +275 -0
- package/dist/charts/heatmap/heatmap-colors.d.ts +70 -0
- package/dist/charts/heatmap/heatmap-colors.js +113 -0
- package/dist/charts/heatmap/heatmap-context.d.ts +109 -0
- package/dist/charts/heatmap/heatmap-context.js +69 -0
- package/dist/charts/heatmap/heatmap-legend-gradient.d.ts +20 -0
- package/dist/charts/heatmap/heatmap-legend-gradient.js +44 -0
- package/dist/charts/heatmap/heatmap-legend-swatch.d.ts +8 -0
- package/dist/charts/heatmap/heatmap-legend-swatch.js +26 -0
- package/dist/charts/heatmap/heatmap-legend.d.ts +41 -0
- package/dist/charts/heatmap/heatmap-legend.js +68 -0
- package/dist/charts/heatmap/heatmap-pattern-defs.d.ts +5 -0
- package/dist/charts/heatmap/heatmap-pattern-defs.js +25 -0
- package/dist/charts/heatmap/heatmap-resolve-separator.d.ts +8 -0
- package/dist/charts/heatmap/heatmap-resolve-separator.js +82 -0
- package/dist/charts/heatmap/heatmap-separator.d.ts +63 -0
- package/dist/charts/heatmap/heatmap-separator.js +71 -0
- package/dist/charts/heatmap/heatmap-tooltip.d.ts +30 -0
- package/dist/charts/heatmap/heatmap-tooltip.js +20 -0
- package/dist/charts/heatmap/heatmap-utils.d.ts +175 -0
- package/dist/charts/heatmap/heatmap-utils.js +595 -0
- package/dist/charts/heatmap/heatmap-x-axis.d.ts +7 -0
- package/dist/charts/heatmap/heatmap-x-axis.js +54 -0
- package/dist/charts/heatmap/heatmap-y-axis.d.ts +14 -0
- package/dist/charts/heatmap/heatmap-y-axis.js +37 -0
- package/dist/charts/heatmap/index.d.ts +15 -0
- package/dist/charts/heatmap/index.js +15 -0
- package/dist/charts/heatmap/use-delayed-tooltip-data.d.ts +3 -0
- package/dist/charts/heatmap/use-delayed-tooltip-data.js +53 -0
- package/dist/charts/highlight-segment-bounds.d.ts +18 -0
- package/dist/charts/highlight-segment-bounds.js +36 -0
- package/dist/charts/highlight-segment.d.ts +22 -0
- package/dist/charts/highlight-segment.js +14 -0
- package/dist/charts/index.d.ts +106 -0
- package/dist/charts/index.js +133 -0
- package/dist/charts/indicator-fade.d.ts +15 -0
- package/dist/charts/indicator-fade.js +42 -0
- package/dist/charts/legend/index.d.ts +8 -0
- package/dist/charts/legend/index.js +10 -0
- package/dist/charts/legend/legend-context.d.ts +48 -0
- package/dist/charts/legend/legend-context.js +34 -0
- package/dist/charts/legend/legend-item.d.ts +12 -0
- package/dist/charts/legend/legend-item.js +11 -0
- package/dist/charts/legend/legend-label.d.ts +9 -0
- package/dist/charts/legend/legend-label.js +10 -0
- package/dist/charts/legend/legend-marker.d.ts +9 -0
- package/dist/charts/legend/legend-marker.js +11 -0
- package/dist/charts/legend/legend-progress.d.ts +13 -0
- package/dist/charts/legend/legend-progress.js +15 -0
- package/dist/charts/legend/legend-value.d.ts +17 -0
- package/dist/charts/legend/legend-value.js +11 -0
- package/dist/charts/legend/legend.d.ts +23 -0
- package/dist/charts/legend/legend.js +43 -0
- package/dist/charts/line-chart-loading.d.ts +34 -0
- package/dist/charts/line-chart-loading.js +22 -0
- package/dist/charts/line-chart.d.ts +46 -0
- package/dist/charts/line-chart.js +91 -0
- package/dist/charts/line-loading-pulse.d.ts +20 -0
- package/dist/charts/line-loading-pulse.js +124 -0
- package/dist/charts/line-loading-timing.d.ts +10 -0
- package/dist/charts/line-loading-timing.js +10 -0
- package/dist/charts/line-series-terminal-marker.d.ts +16 -0
- package/dist/charts/line-series-terminal-marker.js +46 -0
- package/dist/charts/line.d.ts +64 -0
- package/dist/charts/line.js +96 -0
- package/dist/charts/live-line-chart.d.ts +35 -0
- package/dist/charts/live-line-chart.js +374 -0
- package/dist/charts/live-line.d.ts +39 -0
- package/dist/charts/live-line.js +78 -0
- package/dist/charts/live-x-axis.d.ts +12 -0
- package/dist/charts/live-x-axis.js +85 -0
- package/dist/charts/live-y-axis.d.ts +16 -0
- package/dist/charts/live-y-axis.js +137 -0
- package/dist/charts/loading-sweep.d.ts +66 -0
- package/dist/charts/loading-sweep.js +174 -0
- package/dist/charts/markers/chart-markers.d.ts +25 -0
- package/dist/charts/markers/chart-markers.js +87 -0
- package/dist/charts/markers/index.d.ts +3 -0
- package/dist/charts/markers/index.js +3 -0
- package/dist/charts/markers/marker-group.d.ts +88 -0
- package/dist/charts/markers/marker-group.js +171 -0
- package/dist/charts/motion-utils.d.ts +9 -0
- package/dist/charts/motion-utils.js +28 -0
- package/dist/charts/notch-gauge-shared.d.ts +49 -0
- package/dist/charts/notch-gauge-shared.js +103 -0
- package/dist/charts/path-stroke-utils.d.ts +20 -0
- package/dist/charts/path-stroke-utils.js +55 -0
- package/dist/charts/pattern-area.d.ts +21 -0
- package/dist/charts/pattern-area.js +19 -0
- package/dist/charts/pattern-preset.d.ts +26 -0
- package/dist/charts/pattern-preset.js +83 -0
- package/dist/charts/pie-center-shell.d.ts +24 -0
- package/dist/charts/pie-center-shell.js +109 -0
- package/dist/charts/pie-center.d.ts +46 -0
- package/dist/charts/pie-center.js +46 -0
- package/dist/charts/pie-chart.d.ts +50 -0
- package/dist/charts/pie-chart.js +248 -0
- package/dist/charts/pie-context.d.ts +74 -0
- package/dist/charts/pie-context.js +95 -0
- package/dist/charts/pie-slice.d.ts +28 -0
- package/dist/charts/pie-slice.js +180 -0
- package/dist/charts/profit-loss-legend-hover.d.ts +11 -0
- package/dist/charts/profit-loss-legend-hover.js +12 -0
- package/dist/charts/profit-loss-legend.d.ts +17 -0
- package/dist/charts/profit-loss-legend.js +18 -0
- package/dist/charts/profit-loss-line.d.ts +27 -0
- package/dist/charts/profit-loss-line.js +77 -0
- package/dist/charts/profit-loss-segments.d.ts +12 -0
- package/dist/charts/profit-loss-segments.js +86 -0
- package/dist/charts/projection-config.d.ts +11 -0
- package/dist/charts/projection-config.js +80 -0
- package/dist/charts/projection-line-end-marker.d.ts +15 -0
- package/dist/charts/projection-line-end-marker.js +27 -0
- package/dist/charts/projection-line.d.ts +40 -0
- package/dist/charts/projection-line.js +79 -0
- package/dist/charts/projection-utils.d.ts +46 -0
- package/dist/charts/projection-utils.js +253 -0
- package/dist/charts/radar-area.d.ts +17 -0
- package/dist/charts/radar-area.js +84 -0
- package/dist/charts/radar-axis.d.ts +14 -0
- package/dist/charts/radar-axis.js +24 -0
- package/dist/charts/radar-chart.d.ts +36 -0
- package/dist/charts/radar-chart.js +89 -0
- package/dist/charts/radar-context.d.ts +68 -0
- package/dist/charts/radar-context.js +87 -0
- package/dist/charts/radar-grid.d.ts +16 -0
- package/dist/charts/radar-grid.js +40 -0
- package/dist/charts/radar-labels.d.ts +16 -0
- package/dist/charts/radar-labels.js +29 -0
- package/dist/charts/reference-area-config.d.ts +10 -0
- package/dist/charts/reference-area-config.js +39 -0
- package/dist/charts/reference-area-geometry.d.ts +23 -0
- package/dist/charts/reference-area-geometry.js +68 -0
- package/dist/charts/reference-area-registration-context.d.ts +8 -0
- package/dist/charts/reference-area-registration-context.js +7 -0
- package/dist/charts/reference-area.d.ts +52 -0
- package/dist/charts/reference-area.js +101 -0
- package/dist/charts/ring-center.d.ts +46 -0
- package/dist/charts/ring-center.js +41 -0
- package/dist/charts/ring-chart.d.ts +41 -0
- package/dist/charts/ring-chart.js +212 -0
- package/dist/charts/ring-context.d.ts +66 -0
- package/dist/charts/ring-context.js +92 -0
- package/dist/charts/ring.d.ts +11 -0
- package/dist/charts/ring.js +104 -0
- package/dist/charts/sankey/index.d.ts +6 -0
- package/dist/charts/sankey/index.js +6 -0
- package/dist/charts/sankey/sankey-chart.d.ts +39 -0
- package/dist/charts/sankey/sankey-chart.js +117 -0
- package/dist/charts/sankey/sankey-context.d.ts +69 -0
- package/dist/charts/sankey/sankey-context.js +23 -0
- package/dist/charts/sankey/sankey-link.d.ts +26 -0
- package/dist/charts/sankey/sankey-link.js +155 -0
- package/dist/charts/sankey/sankey-node.d.ts +29 -0
- package/dist/charts/sankey/sankey-node.js +200 -0
- package/dist/charts/sankey/sankey-tooltip.d.ts +24 -0
- package/dist/charts/sankey/sankey-tooltip.js +70 -0
- package/dist/charts/scatter-chart-shell.d.ts +21 -0
- package/dist/charts/scatter-chart-shell.js +152 -0
- package/dist/charts/scatter-chart.d.ts +32 -0
- package/dist/charts/scatter-chart.js +56 -0
- package/dist/charts/scatter-svg.d.ts +6 -0
- package/dist/charts/scatter-svg.js +16 -0
- package/dist/charts/scatter.d.ts +21 -0
- package/dist/charts/scatter.js +30 -0
- package/dist/charts/segment.d.ts +26 -0
- package/dist/charts/segment.js +42 -0
- package/dist/charts/series-bar-layout.d.ts +18 -0
- package/dist/charts/series-bar-layout.js +31 -0
- package/dist/charts/series-bar.d.ts +20 -0
- package/dist/charts/series-bar.js +120 -0
- package/dist/charts/series-dash-tail-overlay.d.ts +17 -0
- package/dist/charts/series-dash-tail-overlay.js +39 -0
- package/dist/charts/series-highlight-layer.d.ts +23 -0
- package/dist/charts/series-highlight-layer.js +21 -0
- package/dist/charts/series-hover-dim.d.ts +29 -0
- package/dist/charts/series-hover-dim.js +26 -0
- package/dist/charts/series-markers.d.ts +14 -0
- package/dist/charts/series-markers.js +98 -0
- package/dist/charts/series-path-utils.d.ts +19 -0
- package/dist/charts/series-path-utils.js +60 -0
- package/dist/charts/series-point-marker.d.ts +48 -0
- package/dist/charts/series-point-marker.js +48 -0
- package/dist/charts/shimmering-text.d.ts +23 -0
- package/dist/charts/shimmering-text.js +31 -0
- package/dist/charts/static-chart-preview-context.d.ts +7 -0
- package/dist/charts/static-chart-preview-context.js +12 -0
- package/dist/charts/sunburst-breadcrumb.d.ts +16 -0
- package/dist/charts/sunburst-breadcrumb.js +26 -0
- package/dist/charts/sunburst-center.d.ts +5 -0
- package/dist/charts/sunburst-center.js +17 -0
- package/dist/charts/sunburst-chart.d.ts +30 -0
- package/dist/charts/sunburst-chart.js +263 -0
- package/dist/charts/sunburst-context.d.ts +61 -0
- package/dist/charts/sunburst-context.js +112 -0
- package/dist/charts/sunburst-data.d.ts +9 -0
- package/dist/charts/sunburst-data.js +2 -0
- package/dist/charts/sunburst-hint.d.ts +13 -0
- package/dist/charts/sunburst-hint.js +31 -0
- package/dist/charts/sunburst-labels.d.ts +9 -0
- package/dist/charts/sunburst-labels.js +63 -0
- package/dist/charts/sunburst-segment.d.ts +11 -0
- package/dist/charts/sunburst-segment.js +78 -0
- package/dist/charts/sunburst.d.ts +101 -0
- package/dist/charts/sunburst.js +396 -0
- package/dist/charts/time-series-chart-shell.d.ts +47 -0
- package/dist/charts/time-series-chart-shell.js +390 -0
- package/dist/charts/tooltip/chart-tooltip.d.ts +76 -0
- package/dist/charts/tooltip/chart-tooltip.js +150 -0
- package/dist/charts/tooltip/date-ticker.d.ts +11 -0
- package/dist/charts/tooltip/date-ticker.js +77 -0
- package/dist/charts/tooltip/index.d.ts +7 -0
- package/dist/charts/tooltip/index.js +7 -0
- package/dist/charts/tooltip/tooltip-box.d.ts +48 -0
- package/dist/charts/tooltip/tooltip-box.js +114 -0
- package/dist/charts/tooltip/tooltip-content.d.ts +18 -0
- package/dist/charts/tooltip/tooltip-content.js +9 -0
- package/dist/charts/tooltip/tooltip-dot.d.ts +28 -0
- package/dist/charts/tooltip/tooltip-dot.js +54 -0
- package/dist/charts/tooltip/tooltip-indicator.d.ts +45 -0
- package/dist/charts/tooltip/tooltip-indicator.js +65 -0
- package/dist/charts/use-animated-series-path.d.ts +19 -0
- package/dist/charts/use-animated-series-path.js +93 -0
- package/dist/charts/use-animated-y-domains.d.ts +14 -0
- package/dist/charts/use-animated-y-domains.js +150 -0
- package/dist/charts/use-chart-interaction.d.ts +41 -0
- package/dist/charts/use-chart-interaction.js +244 -0
- package/dist/charts/use-chart-phase-orchestrator.d.ts +23 -0
- package/dist/charts/use-chart-phase-orchestrator.js +139 -0
- package/dist/charts/use-enter-complete.d.ts +8 -0
- package/dist/charts/use-enter-complete.js +23 -0
- package/dist/charts/use-grid-shimmer.d.ts +16 -0
- package/dist/charts/use-grid-shimmer.js +63 -0
- package/dist/charts/use-highlight-segment.d.ts +14 -0
- package/dist/charts/use-highlight-segment.js +34 -0
- package/dist/charts/use-mount-progress.d.ts +4 -0
- package/dist/charts/use-mount-progress.js +22 -0
- package/dist/charts/use-scatter-chart-interaction.d.ts +35 -0
- package/dist/charts/use-scatter-chart-interaction.js +228 -0
- package/dist/charts/use-scheduled-tooltip.d.ts +9 -0
- package/dist/charts/use-scheduled-tooltip.js +76 -0
- package/dist/charts/visx-pattern.d.ts +19 -0
- package/dist/charts/visx-pattern.js +20 -0
- package/dist/charts/x-axis.d.ts +27 -0
- package/dist/charts/x-axis.js +415 -0
- package/dist/charts/y-axis-scales.d.ts +26 -0
- package/dist/charts/y-axis-scales.js +72 -0
- package/dist/charts/y-axis-ticks.d.ts +12 -0
- package/dist/charts/y-axis-ticks.js +24 -0
- package/dist/charts/y-axis.d.ts +22 -0
- package/dist/charts/y-axis.js +80 -0
- package/dist/charts/y-domain-utils.d.ts +27 -0
- package/dist/charts/y-domain-utils.js +88 -0
- package/dist/components/accordion.d.ts +6 -0
- package/dist/components/accordion.js +20 -0
- package/dist/components/alert-dialog.d.ts +18 -0
- package/dist/components/alert-dialog.js +41 -0
- package/dist/components/alert.d.ts +24 -0
- package/dist/components/alert.js +46 -0
- package/dist/components/animated-button.d.ts +5 -0
- package/dist/components/animated-button.js +16 -0
- package/dist/components/animated-list.d.ts +26 -0
- package/dist/components/animated-list.js +25 -0
- package/dist/components/animated-number.d.ts +67 -0
- package/dist/components/animated-number.js +131 -0
- package/dist/components/app-shell.d.ts +27 -0
- package/dist/components/app-shell.js +18 -0
- package/dist/components/area-chart.d.ts +11 -0
- package/dist/components/area-chart.js +12 -0
- package/dist/components/aspect-ratio.d.ts +16 -0
- package/dist/components/aspect-ratio.js +14 -0
- package/dist/components/aurora-background.d.ts +3 -0
- package/dist/components/aurora-background.js +8 -0
- package/dist/components/autocomplete.d.ts +55 -0
- package/dist/components/autocomplete.js +279 -0
- package/dist/components/avatar-group.d.ts +39 -0
- package/dist/components/avatar-group.js +50 -0
- package/dist/components/avatar.d.ts +5 -0
- package/dist/components/avatar.js +17 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.js +35 -0
- package/dist/components/banner.d.ts +45 -0
- package/dist/components/banner.js +80 -0
- package/dist/components/bar-chart.d.ts +11 -0
- package/dist/components/bar-chart.js +9 -0
- package/dist/components/border-beam.d.ts +45 -0
- package/dist/components/border-beam.js +48 -0
- package/dist/components/breadcrumb.d.ts +12 -0
- package/dist/components/breadcrumb.js +35 -0
- package/dist/components/button-group.d.ts +7 -0
- package/dist/components/button-group.js +10 -0
- package/dist/components/button.d.ts +12 -0
- package/dist/components/button.js +39 -0
- package/dist/components/calendar.d.ts +7 -0
- package/dist/components/calendar.js +71 -0
- package/dist/components/candlestick-chart.d.ts +13 -0
- package/dist/components/candlestick-chart.js +66 -0
- package/dist/components/card-stack.d.ts +28 -0
- package/dist/components/card-stack.js +47 -0
- package/dist/components/card.d.ts +9 -0
- package/dist/components/card.js +32 -0
- package/dist/components/carousel.d.ts +82 -0
- package/dist/components/carousel.js +310 -0
- package/dist/components/chart.d.ts +100 -0
- package/dist/components/chart.js +210 -0
- package/dist/components/checkbox.d.ts +3 -0
- package/dist/components/checkbox.js +11 -0
- package/dist/components/chip.d.ts +80 -0
- package/dist/components/chip.js +186 -0
- package/dist/components/choropleth-chart.d.ts +12 -0
- package/dist/components/choropleth-chart.js +31 -0
- package/dist/components/click-spark.d.ts +19 -0
- package/dist/components/click-spark.js +51 -0
- package/dist/components/code-block.d.ts +13 -0
- package/dist/components/code-block.js +20 -0
- package/dist/components/code-tabs.d.ts +51 -0
- package/dist/components/code-tabs.js +150 -0
- package/dist/components/collapsible.d.ts +5 -0
- package/dist/components/collapsible.js +12 -0
- package/dist/components/color-picker.d.ts +30 -0
- package/dist/components/color-picker.js +300 -0
- package/dist/components/combobox.d.ts +33 -0
- package/dist/components/combobox.js +32 -0
- package/dist/components/command.d.ts +87 -0
- package/dist/components/command.js +44 -0
- package/dist/components/comparison-slider.d.ts +17 -0
- package/dist/components/comparison-slider.js +81 -0
- package/dist/components/composed-chart.d.ts +13 -0
- package/dist/components/composed-chart.js +22 -0
- package/dist/components/confetti.d.ts +21 -0
- package/dist/components/confetti.js +111 -0
- package/dist/components/confirmation-dialog.d.ts +46 -0
- package/dist/components/confirmation-dialog.js +102 -0
- package/dist/components/context-menu.d.ts +28 -0
- package/dist/components/context-menu.js +52 -0
- package/dist/components/copy-button.d.ts +13 -0
- package/dist/components/copy-button.js +72 -0
- package/dist/components/countdown.d.ts +58 -0
- package/dist/components/countdown.js +106 -0
- package/dist/components/credit-card-input.d.ts +62 -0
- package/dist/components/credit-card-input.js +211 -0
- package/dist/components/currency-input.d.ts +86 -0
- package/dist/components/currency-input.js +215 -0
- package/dist/components/data-table.d.ts +232 -0
- package/dist/components/data-table.js +359 -0
- package/dist/components/date-picker.d.ts +66 -0
- package/dist/components/date-picker.js +55 -0
- package/dist/components/date-range-picker.d.ts +59 -0
- package/dist/components/date-range-picker.js +59 -0
- package/dist/components/description-list.d.ts +84 -0
- package/dist/components/description-list.js +138 -0
- package/dist/components/dialog.d.ts +26 -0
- package/dist/components/dialog.js +35 -0
- package/dist/components/dock.d.ts +34 -0
- package/dist/components/dock.js +61 -0
- package/dist/components/dot-pattern.d.ts +24 -0
- package/dist/components/dot-pattern.js +19 -0
- package/dist/components/drawer.d.ts +22 -0
- package/dist/components/drawer.js +37 -0
- package/dist/components/dropdown-menu.d.ts +32 -0
- package/dist/components/dropdown-menu.js +56 -0
- package/dist/components/dynamic-island.d.ts +26 -0
- package/dist/components/dynamic-island.js +31 -0
- package/dist/components/empty.d.ts +7 -0
- package/dist/components/empty.js +24 -0
- package/dist/components/expandable-tabs.d.ts +24 -0
- package/dist/components/expandable-tabs.js +30 -0
- package/dist/components/fab.d.ts +35 -0
- package/dist/components/fab.js +36 -0
- package/dist/components/field.d.ts +6 -0
- package/dist/components/field.js +22 -0
- package/dist/components/file-dropzone.d.ts +28 -0
- package/dist/components/file-dropzone.js +59 -0
- package/dist/components/flickering-grid.d.ts +25 -0
- package/dist/components/flickering-grid.js +30 -0
- package/dist/components/flip-card.d.ts +70 -0
- package/dist/components/flip-card.js +117 -0
- package/dist/components/floating-label-input.d.ts +34 -0
- package/dist/components/floating-label-input.js +25 -0
- package/dist/components/form.d.ts +25 -0
- package/dist/components/form.js +68 -0
- package/dist/components/frame.d.ts +12 -0
- package/dist/components/frame.js +10 -0
- package/dist/components/funnel-chart.d.ts +11 -0
- package/dist/components/funnel-chart.js +16 -0
- package/dist/components/gauge-chart.d.ts +8 -0
- package/dist/components/gauge-chart.js +10 -0
- package/dist/components/glare-hover.d.ts +15 -0
- package/dist/components/glare-hover.js +64 -0
- package/dist/components/glass-card.d.ts +3 -0
- package/dist/components/glass-card.js +8 -0
- package/dist/components/gradient-border.d.ts +7 -0
- package/dist/components/gradient-border.js +8 -0
- package/dist/components/gradient-text.d.ts +6 -0
- package/dist/components/gradient-text.js +10 -0
- package/dist/components/grid-pattern.d.ts +23 -0
- package/dist/components/grid-pattern.js +18 -0
- package/dist/components/heatmap-chart.d.ts +6 -0
- package/dist/components/heatmap-chart.js +8 -0
- package/dist/components/heatmap.d.ts +28 -0
- package/dist/components/heatmap.js +41 -0
- package/dist/components/highlighter.d.ts +20 -0
- package/dist/components/highlighter.js +19 -0
- package/dist/components/hover-card.d.ts +5 -0
- package/dist/components/hover-card.js +12 -0
- package/dist/components/image-zoom.d.ts +47 -0
- package/dist/components/image-zoom.js +125 -0
- package/dist/components/input-group.d.ts +10 -0
- package/dist/components/input-group.js +12 -0
- package/dist/components/input-otp.d.ts +18 -0
- package/dist/components/input-otp.js +38 -0
- package/dist/components/input.d.ts +6 -0
- package/dist/components/input.js +8 -0
- package/dist/components/json-viewer.d.ts +43 -0
- package/dist/components/json-viewer.js +313 -0
- package/dist/components/kanban.d.ts +31 -0
- package/dist/components/kanban.js +143 -0
- package/dist/components/kbd.d.ts +3 -0
- package/dist/components/kbd.js +8 -0
- package/dist/components/label.d.ts +3 -0
- package/dist/components/label.js +9 -0
- package/dist/components/light-rays.d.ts +19 -0
- package/dist/components/light-rays.js +20 -0
- package/dist/components/lightbox.d.ts +24 -0
- package/dist/components/lightbox.js +68 -0
- package/dist/components/line-chart.d.ts +10 -0
- package/dist/components/line-chart.js +9 -0
- package/dist/components/live-line-chart.d.ts +12 -0
- package/dist/components/live-line-chart.js +42 -0
- package/dist/components/logo-carousel.d.ts +27 -0
- package/dist/components/logo-carousel.js +101 -0
- package/dist/components/magnetic.d.ts +44 -0
- package/dist/components/magnetic.js +172 -0
- package/dist/components/marquee.d.ts +71 -0
- package/dist/components/marquee.js +141 -0
- package/dist/components/masonry.d.ts +16 -0
- package/dist/components/masonry.js +84 -0
- package/dist/components/menubar.d.ts +33 -0
- package/dist/components/menubar.js +56 -0
- package/dist/components/meteors.d.ts +20 -0
- package/dist/components/meteors.js +39 -0
- package/dist/components/metric.d.ts +9 -0
- package/dist/components/metric.js +35 -0
- package/dist/components/mode-toggle.d.ts +32 -0
- package/dist/components/mode-toggle.js +40 -0
- package/dist/components/morphing-popover.d.ts +91 -0
- package/dist/components/morphing-popover.js +194 -0
- package/dist/components/motion-presets.d.ts +9 -0
- package/dist/components/motion-presets.js +20 -0
- package/dist/components/multi-select.d.ts +54 -0
- package/dist/components/multi-select.js +0 -0
- package/dist/components/navigation-menu.d.ts +12 -0
- package/dist/components/navigation-menu.js +42 -0
- package/dist/components/noise.d.ts +19 -0
- package/dist/components/noise.js +18 -0
- package/dist/components/notification-center.d.ts +68 -0
- package/dist/components/notification-center.js +57 -0
- package/dist/components/number-input.d.ts +45 -0
- package/dist/components/number-input.js +148 -0
- package/dist/components/orbit.d.ts +77 -0
- package/dist/components/orbit.js +100 -0
- package/dist/components/pagination.d.ts +16 -0
- package/dist/components/pagination.js +34 -0
- package/dist/components/particles.d.ts +18 -0
- package/dist/components/particles.js +92 -0
- package/dist/components/password-input.d.ts +16 -0
- package/dist/components/password-input.js +49 -0
- package/dist/components/phone-input.d.ts +67 -0
- package/dist/components/phone-input.js +225 -0
- package/dist/components/pie-chart.d.ts +12 -0
- package/dist/components/pie-chart.js +13 -0
- package/dist/components/pill-nav.d.ts +25 -0
- package/dist/components/pill-nav.js +66 -0
- package/dist/components/popover.d.ts +7 -0
- package/dist/components/popover.js +15 -0
- package/dist/components/profit-loss-chart.d.ts +10 -0
- package/dist/components/profit-loss-chart.js +8 -0
- package/dist/components/progress.d.ts +10 -0
- package/dist/components/progress.js +17 -0
- package/dist/components/progressive-blur.d.ts +24 -0
- package/dist/components/progressive-blur.js +43 -0
- package/dist/components/radar-chart.d.ts +9 -0
- package/dist/components/radar-chart.js +9 -0
- package/dist/components/radio-group.d.ts +4 -0
- package/dist/components/radio-group.js +15 -0
- package/dist/components/rating.d.ts +29 -0
- package/dist/components/rating.js +94 -0
- package/dist/components/resizable.d.ts +57 -0
- package/dist/components/resizable.js +73 -0
- package/dist/components/retro-grid.d.ts +25 -0
- package/dist/components/retro-grid.js +26 -0
- package/dist/components/reveal.d.ts +9 -0
- package/dist/components/reveal.js +14 -0
- package/dist/components/rich-text-editor.d.ts +28 -0
- package/dist/components/rich-text-editor.js +83 -0
- package/dist/components/ring-chart.d.ts +13 -0
- package/dist/components/ring-chart.js +16 -0
- package/dist/components/ripple.d.ts +25 -0
- package/dist/components/ripple.js +26 -0
- package/dist/components/sankey-chart.d.ts +16 -0
- package/dist/components/sankey-chart.js +8 -0
- package/dist/components/scatter-chart.d.ts +12 -0
- package/dist/components/scatter-chart.js +9 -0
- package/dist/components/scheduler.d.ts +50 -0
- package/dist/components/scheduler.js +93 -0
- package/dist/components/scramble-text.d.ts +39 -0
- package/dist/components/scramble-text.js +78 -0
- package/dist/components/scroll-area.d.ts +13 -0
- package/dist/components/scroll-area.js +14 -0
- package/dist/components/scroll-progress.d.ts +19 -0
- package/dist/components/scroll-progress.js +67 -0
- package/dist/components/segmented-control.d.ts +48 -0
- package/dist/components/segmented-control.js +222 -0
- package/dist/components/select.d.ts +12 -0
- package/dist/components/select.js +43 -0
- package/dist/components/separator.d.ts +3 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/sheet.d.ts +25 -0
- package/dist/components/sheet.js +47 -0
- package/dist/components/shimmer.d.ts +3 -0
- package/dist/components/shimmer.js +8 -0
- package/dist/components/shiny-text.d.ts +20 -0
- package/dist/components/shiny-text.js +24 -0
- package/dist/components/sidebar.d.ts +92 -0
- package/dist/components/sidebar.js +290 -0
- package/dist/components/signature-pad.d.ts +44 -0
- package/dist/components/signature-pad.js +317 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.js +8 -0
- package/dist/components/slider.d.ts +10 -0
- package/dist/components/slider.js +27 -0
- package/dist/components/sonner.d.ts +9 -0
- package/dist/components/sonner.js +17 -0
- package/dist/components/sparkles-text.d.ts +19 -0
- package/dist/components/sparkles-text.js +36 -0
- package/dist/components/sparkline.d.ts +22 -0
- package/dist/components/sparkline.js +100 -0
- package/dist/components/spinner.d.ts +10 -0
- package/dist/components/spinner.js +20 -0
- package/dist/components/spinning-text.d.ts +29 -0
- package/dist/components/spinning-text.js +40 -0
- package/dist/components/split-button.d.ts +71 -0
- package/dist/components/split-button.js +30 -0
- package/dist/components/spotlight-card.d.ts +11 -0
- package/dist/components/spotlight-card.js +63 -0
- package/dist/components/star-border.d.ts +19 -0
- package/dist/components/star-border.js +18 -0
- package/dist/components/status-dot.d.ts +60 -0
- package/dist/components/status-dot.js +76 -0
- package/dist/components/stepper.d.ts +98 -0
- package/dist/components/stepper.js +164 -0
- package/dist/components/sunburst-chart.d.ts +11 -0
- package/dist/components/sunburst-chart.js +45 -0
- package/dist/components/switch.d.ts +3 -0
- package/dist/components/switch.js +10 -0
- package/dist/components/table-of-contents.d.ts +64 -0
- package/dist/components/table-of-contents.js +0 -0
- package/dist/components/table.d.ts +10 -0
- package/dist/components/table.js +38 -0
- package/dist/components/tabs.d.ts +6 -0
- package/dist/components/tabs.js +22 -0
- package/dist/components/tags-input.d.ts +39 -0
- package/dist/components/tags-input.js +86 -0
- package/dist/components/terminal.d.ts +86 -0
- package/dist/components/terminal.js +182 -0
- package/dist/components/text-effect.d.ts +71 -0
- package/dist/components/text-effect.js +166 -0
- package/dist/components/textarea.d.ts +6 -0
- package/dist/components/textarea.js +8 -0
- package/dist/components/tilt-card.d.ts +30 -0
- package/dist/components/tilt-card.js +84 -0
- package/dist/components/time-picker.d.ts +58 -0
- package/dist/components/time-picker.js +245 -0
- package/dist/components/timeline.d.ts +81 -0
- package/dist/components/timeline.js +165 -0
- package/dist/components/toggle-group.d.ts +12 -0
- package/dist/components/toggle-group.js +23 -0
- package/dist/components/toggle.d.ts +12 -0
- package/dist/components/toggle.js +25 -0
- package/dist/components/toolbar.d.ts +14 -0
- package/dist/components/toolbar.js +89 -0
- package/dist/components/tooltip.d.ts +29 -0
- package/dist/components/tooltip.js +48 -0
- package/dist/components/tree-view.d.ts +45 -0
- package/dist/components/tree-view.js +197 -0
- package/dist/components/typing-text.d.ts +49 -0
- package/dist/components/typing-text.js +90 -0
- package/dist/components/usage-meter.d.ts +30 -0
- package/dist/components/usage-meter.js +90 -0
- package/dist/components/video-player.d.ts +48 -0
- package/dist/components/video-player.js +216 -0
- package/dist/components/word-rotate.d.ts +40 -0
- package/dist/components/word-rotate.js +34 -0
- package/dist/index.d.ts +306 -0
- package/dist/index.js +179 -0
- package/dist/lib/cn.d.ts +7 -0
- package/dist/lib/cn.js +10 -0
- package/dist/lib/demo-saas.d.ts +171 -0
- package/dist/lib/demo-saas.js +210 -0
- package/dist/lib/demo-store.d.ts +157 -0
- package/dist/lib/demo-store.js +353 -0
- package/dist/testing/index.d.ts +76 -0
- package/dist/testing/index.js +116 -0
- package/package.json +941 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Bar 3D depth + glass surfaces — drop-in layers for `<BarChart>`.
|
|
5
|
+
*
|
|
6
|
+
* Adds a head-on perspective and a glossy glass-block sheen to the bars in
|
|
7
|
+
* any `<BarChart>`. Bars left of chart center expose their RIGHT side face;
|
|
8
|
+
* bars right of center expose their LEFT — the vanishing point sits at the
|
|
9
|
+
* chart's horizontal middle, so the row reads like vertical glass blocks
|
|
10
|
+
* viewed straight on.
|
|
11
|
+
*
|
|
12
|
+
* Three surfaces per bar:
|
|
13
|
+
* 1. Side face — a parallelogram on the depth side, lit at the front edge
|
|
14
|
+
* with a horizontal black gradient and shaded toward the back.
|
|
15
|
+
* 2. Top face — a parallelogram lid above the bar's top edge, with a
|
|
16
|
+
* bright catch at the front lip fading to soft white at the back.
|
|
17
|
+
* 3. Glass overlay — a vertical white-to-dark gradient on the bar's front
|
|
18
|
+
* face (sharp top reflection, transparent middle, faint bottom shadow).
|
|
19
|
+
*
|
|
20
|
+
* Usage (purely additive — no changes to `<Bar>`):
|
|
21
|
+
*
|
|
22
|
+
* <BarChart data={data} xDataKey="month">
|
|
23
|
+
* <Grid horizontal />
|
|
24
|
+
* <BarDepthBack dataKey="value" color="var(--chart-1)" /> // before <Bar>
|
|
25
|
+
* <Bar dataKey="value" fill="var(--chart-1)" />
|
|
26
|
+
* <BarDepthFront dataKey="value" /> // after <Bar>
|
|
27
|
+
* </BarChart>
|
|
28
|
+
*
|
|
29
|
+
* Both depth layers read geometry from `useChart()` and figure out the
|
|
30
|
+
* perspective themselves. The only configuration is the bar color
|
|
31
|
+
* (`color` / `colorAccessor`) and, for stacked bars, a `segmentsAccessor`
|
|
32
|
+
* supplied via `<BarDepthProvider>`.
|
|
33
|
+
*
|
|
34
|
+
* An optional `<BarPulse>` paints a looping vertical sweep over a single
|
|
35
|
+
* "active" bar (selected by `activeIndex`) — useful for highlighting a live
|
|
36
|
+
* or in-progress value. Render it AFTER `<BarDepthFront>`.
|
|
37
|
+
*
|
|
38
|
+
* Behavior notes:
|
|
39
|
+
* - Negative values are supported: a bar whose value is below zero grows
|
|
40
|
+
* downward from the baseline, with the lid sitting on the baseline.
|
|
41
|
+
* (This requires the host `<BarChart>` to use a value scale whose
|
|
42
|
+
* domain includes negatives.)
|
|
43
|
+
* - Zero-value bars are skipped by default; set `minBarHeight` on
|
|
44
|
+
* `<BarDepthProvider>` (and `<Bar>`) to floor them to a short visible bar.
|
|
45
|
+
*
|
|
46
|
+
* Performance:
|
|
47
|
+
* - Three shared SVG gradients per layer instance (ID-collision-safe via
|
|
48
|
+
* `useId()`).
|
|
49
|
+
* - A per-bar `<clipPath>` for the side face animates from the baseline so
|
|
50
|
+
* the static side path is revealed bottom-up in lockstep with the bar.
|
|
51
|
+
* Only used where depth ≥ 0.5px.
|
|
52
|
+
* - At high bar density the column gap clamps depth below the 0.5px
|
|
53
|
+
* threshold; the back surfaces skip rendering and only the cheap glass
|
|
54
|
+
* rect remains.
|
|
55
|
+
* - `useBarDepthEntries` is memoized, so the Back/Front/Pulse layers
|
|
56
|
+
* compute geometry at most once per render between them.
|
|
57
|
+
*/
|
|
58
|
+
import { motion } from "motion/react";
|
|
59
|
+
import { createContext, useContext, useId, useMemo } from "react";
|
|
60
|
+
import { barDepthAndRise, barDepthMaxDepth } from "./bar-depth-geometry.js";
|
|
61
|
+
import { useChartHover, useChartStable } from "./chart-context.js";
|
|
62
|
+
import { transitionWithDelay } from "./motion-utils.js";
|
|
63
|
+
// ─── Constants ───────────────────────────────────────────────────────
|
|
64
|
+
/** Below this depth the back surfaces don't render — saves elements for
|
|
65
|
+
* dead-center bars and dense charts where perspective is sub-pixel. */
|
|
66
|
+
const BAR_DEPTH_MIN_PX = 0.5;
|
|
67
|
+
/** Mirrors `Bar`'s default `fadedOpacity` so depth/glass dim in step with
|
|
68
|
+
* their bar when a sibling bar is hovered. */
|
|
69
|
+
const BAR_FADED_OPACITY = 0.3;
|
|
70
|
+
/** Default bar color when neither `color` nor `colorAccessor` is provided. */
|
|
71
|
+
const DEFAULT_BAR_COLOR = "var(--chart-line-primary)";
|
|
72
|
+
/** Default opacity of the baseline "contact shadow" that grounds each bar at
|
|
73
|
+
* the zero line. Configurable via `<BarDepthProvider groundShadow>`. */
|
|
74
|
+
const DEFAULT_GROUND_SHADOW = 0.26;
|
|
75
|
+
/** Peak opacity of the white reflection catch at each bar's tip. Kept here so
|
|
76
|
+
* the front/side glass and the solid lid highlight all use the same value. */
|
|
77
|
+
const GLASS_TIP_OPACITY = 0.2;
|
|
78
|
+
// `BarPulse` — vertical sweep wave constants. The wave is a tall translucent
|
|
79
|
+
// rect with a centered bright band; it translates from below the bar's bottom
|
|
80
|
+
// edge to above the lid's back edge on a loop, clipped to the bar's full 3D
|
|
81
|
+
// silhouette.
|
|
82
|
+
/** Wave height = max(barHeight × this, PULSE_WAVE_HEIGHT_MIN_PX). 0.55 puts
|
|
83
|
+
* the bright band's peak in the middle of the bar at mid-travel. */
|
|
84
|
+
const PULSE_WAVE_HEIGHT_RATIO = 0.55;
|
|
85
|
+
/** Minimum wave height in px so short bars still pulse on a steady cadence —
|
|
86
|
+
* the wave is taller than the bar so the bright band sweeps through cleanly
|
|
87
|
+
* instead of flashing for one frame. */
|
|
88
|
+
const PULSE_WAVE_HEIGHT_MIN_PX = 36;
|
|
89
|
+
/** Seconds per sweep (bottom → above the lid). 2.4s reads as a deliberate
|
|
90
|
+
* heartbeat; faster feels frantic, slower feels laggy. */
|
|
91
|
+
const PULSE_WAVE_DURATION_S = 2.4;
|
|
92
|
+
/** Peak opacity of the wave's brightest gradient stop. White at 0.85 is
|
|
93
|
+
* bright enough to register over saturated bar colors while the bell-curve
|
|
94
|
+
* stops around it keep the falloff soft so the bar's hue still dominates. */
|
|
95
|
+
const PULSE_WAVE_PEAK_OPACITY = 0.85;
|
|
96
|
+
const BAR_HOVER_TRANSITION = { duration: 0.15, ease: "easeOut" };
|
|
97
|
+
function resolveColor(datum, index, color, colorAccessor) {
|
|
98
|
+
return colorAccessor?.(datum, index) ?? color;
|
|
99
|
+
}
|
|
100
|
+
/** Side-face parallelogram between two screen-Y edges, on the depth side of
|
|
101
|
+
* the bar (left of the bar for right-of-center bars, right for left-of). */
|
|
102
|
+
function sideFacePath(e, topEdge, bottomEdge) {
|
|
103
|
+
const rise = e.perspectiveRise;
|
|
104
|
+
if (e.isRightOfCenter) {
|
|
105
|
+
const x = e.bandX;
|
|
106
|
+
return `M ${x} ${topEdge} L ${x - e.depth} ${topEdge - rise} L ${x - e.depth} ${bottomEdge - rise} L ${x} ${bottomEdge} Z`;
|
|
107
|
+
}
|
|
108
|
+
const x = e.bandX + e.bandWidth;
|
|
109
|
+
return `M ${x} ${topEdge} L ${x + e.depth} ${topEdge - rise} L ${x + e.depth} ${bottomEdge - rise} L ${x} ${bottomEdge} Z`;
|
|
110
|
+
}
|
|
111
|
+
/** Lid (top face) parallelogram above the bar's top edge. */
|
|
112
|
+
function lidFacePath(e) {
|
|
113
|
+
const rise = e.perspectiveRise;
|
|
114
|
+
const left = e.bandX;
|
|
115
|
+
const right = e.bandX + e.bandWidth;
|
|
116
|
+
if (e.isRightOfCenter) {
|
|
117
|
+
return `M ${left} ${e.topY} L ${right} ${e.topY} L ${right - e.depth} ${e.topY - rise} L ${left - e.depth} ${e.topY - rise} Z`;
|
|
118
|
+
}
|
|
119
|
+
return `M ${left} ${e.topY} L ${right} ${e.topY} L ${right + e.depth} ${e.topY - rise} L ${left + e.depth} ${e.topY - rise} Z`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build the side-face parallelograms for a bar. Without segments it's a single
|
|
123
|
+
* piece in `baseColor`; with segments each gets its natural scaled height
|
|
124
|
+
* `(seg.value/total) * naturalHeight` and only the topmost has `topYTrim`
|
|
125
|
+
* removed — matching exactly how `<Bar>` stacks segments, so the side seams
|
|
126
|
+
* line up with the front face.
|
|
127
|
+
*/
|
|
128
|
+
function buildSidePieces(e, visibleSegments, baseColor) {
|
|
129
|
+
if (!(visibleSegments && visibleSegments.length > 0)) {
|
|
130
|
+
return [{ path: sideFacePath(e, e.topY, e.bottomY), color: baseColor }];
|
|
131
|
+
}
|
|
132
|
+
const totalValue = visibleSegments.reduce((sum, s) => sum + s.value, 0);
|
|
133
|
+
const pieces = [];
|
|
134
|
+
let cursorY = e.bottomY;
|
|
135
|
+
for (let i = 0; i < visibleSegments.length; i++) {
|
|
136
|
+
const seg = visibleSegments[i];
|
|
137
|
+
if (!seg) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const isTopmost = i === visibleSegments.length - 1;
|
|
141
|
+
const segScaledHeight = (seg.value / totalValue) * e.naturalHeight;
|
|
142
|
+
const segHeight = isTopmost ? Math.max(0, segScaledHeight - e.topYTrim) : segScaledHeight;
|
|
143
|
+
const segBottomY = cursorY;
|
|
144
|
+
const segTopY = cursorY - segHeight;
|
|
145
|
+
cursorY = segTopY;
|
|
146
|
+
pieces.push({
|
|
147
|
+
path: sideFacePath(e, segTopY, segBottomY),
|
|
148
|
+
color: seg.color,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return pieces;
|
|
152
|
+
}
|
|
153
|
+
const BarDepthContext = createContext({});
|
|
154
|
+
/**
|
|
155
|
+
* Provides shared bar-depth configuration to every depth surface beneath it.
|
|
156
|
+
* Wrap a `<BarChart>` whose children include `<BarDepthBack>` /
|
|
157
|
+
* `<BarDepthFront>` / `<BarPulse>` with this provider to:
|
|
158
|
+
* - split stacked bars into per-segment side faces (`segmentsAccessor`),
|
|
159
|
+
* - tune the baseline contact shadow (`groundShadow`, default 0.26; 0 = off),
|
|
160
|
+
* - floor short/zero bars so they stay visible (`minBarHeight`; pair with the
|
|
161
|
+
* same value on `<Bar minBarHeight>`).
|
|
162
|
+
*
|
|
163
|
+
* Because the glass gradient is chart-wide (one Y-anchored ramp shared by the
|
|
164
|
+
* front face and the side glass), the provider is the single source of truth —
|
|
165
|
+
* so the surfaces can never disagree.
|
|
166
|
+
*/
|
|
167
|
+
export function BarDepthProvider({ segmentsAccessor, groundShadow, minBarHeight, children, }) {
|
|
168
|
+
// Memoize so consumers don't re-render when the config is stable.
|
|
169
|
+
const value = useMemo(() => ({ segmentsAccessor, groundShadow, minBarHeight }), [segmentsAccessor, groundShadow, minBarHeight]);
|
|
170
|
+
return _jsx(BarDepthContext.Provider, { value: value, children: children });
|
|
171
|
+
}
|
|
172
|
+
BarDepthProvider.displayName = "BarDepthProvider";
|
|
173
|
+
/**
|
|
174
|
+
* Stop list for a POSITIVE bar's glass (0% = tip, 100% = baseline): a sharp
|
|
175
|
+
* white reflection catch at the tip falling off fast to transparent, then the
|
|
176
|
+
* contact shadow at the base.
|
|
177
|
+
*/
|
|
178
|
+
function buildPosBarStops(groundShadow) {
|
|
179
|
+
return [
|
|
180
|
+
{ offset: "0%", color: "white", opacity: String(GLASS_TIP_OPACITY) },
|
|
181
|
+
{ offset: "3%", color: "white", opacity: "0.09" },
|
|
182
|
+
{ offset: "8%", color: "white", opacity: "0.02" },
|
|
183
|
+
{ offset: "55%", color: "white", opacity: "0" },
|
|
184
|
+
{ offset: "100%", color: "black", opacity: String(groundShadow) },
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Mirror of `buildPosBarStops` for NEGATIVE bars (which grow downward): the
|
|
189
|
+
* contact shadow sits at the top (the baseline) and the reflection catch at
|
|
190
|
+
* the bottom (the bar's tip).
|
|
191
|
+
*/
|
|
192
|
+
function buildNegBarStops(groundShadow) {
|
|
193
|
+
return [
|
|
194
|
+
{ offset: "0%", color: "black", opacity: String(groundShadow) },
|
|
195
|
+
{ offset: "45%", color: "white", opacity: "0" },
|
|
196
|
+
{ offset: "92%", color: "white", opacity: "0.02" },
|
|
197
|
+
{ offset: "97%", color: "white", opacity: "0.09" },
|
|
198
|
+
{ offset: "100%", color: "white", opacity: String(GLASS_TIP_OPACITY) },
|
|
199
|
+
];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Build both per-bar glass stop lists from the current `groundShadow`. Each
|
|
203
|
+
* depth surface picks `posStops` or `negStops` by the bar's direction and
|
|
204
|
+
* paints it objectBoundingBox, so the gloss is identical across bar heights.
|
|
205
|
+
*/
|
|
206
|
+
function useGlassStops() {
|
|
207
|
+
const { groundShadow = DEFAULT_GROUND_SHADOW } = useContext(BarDepthContext);
|
|
208
|
+
return useMemo(() => ({
|
|
209
|
+
posStops: buildPosBarStops(groundShadow),
|
|
210
|
+
negStops: buildNegBarStops(groundShadow),
|
|
211
|
+
}), [groundShadow]);
|
|
212
|
+
}
|
|
213
|
+
function readBarValue(d, key) {
|
|
214
|
+
const v = key ? d[key] : undefined;
|
|
215
|
+
return typeof v === "number" ? v : 0;
|
|
216
|
+
}
|
|
217
|
+
// ─── Hooks ───────────────────────────────────────────────────────────
|
|
218
|
+
/**
|
|
219
|
+
* Compute per-bar 3D depth geometry from chart context.
|
|
220
|
+
*
|
|
221
|
+
* Memoized on the chart's scales + data, so calling this from sibling layers
|
|
222
|
+
* within the same chart is essentially free after the first settles. Returns
|
|
223
|
+
* one entry per renderable bar; bars with no resolvable height are excluded.
|
|
224
|
+
*
|
|
225
|
+
* Negative-value bars are kept — `isNegative` flips the entry's geometry so
|
|
226
|
+
* the side parallelogram and lid render in the correct direction.
|
|
227
|
+
*
|
|
228
|
+
* Exported for advanced consumers that want to render custom layers aligned
|
|
229
|
+
* with the same geometry (e.g. labels above each bar's top face).
|
|
230
|
+
*/
|
|
231
|
+
export function useBarDepthEntries(dataKey, activeIndex) {
|
|
232
|
+
const { data, barScale, bandWidth, yScale, innerHeight, innerWidth, barXAccessor } = useChartStable();
|
|
233
|
+
// Read shared config from `<BarDepthProvider>`. Outside a provider these are
|
|
234
|
+
// the defaults (no segmentation, no floor) — correct for simple charts.
|
|
235
|
+
const { segmentsAccessor, minBarHeight = 0 } = useContext(BarDepthContext);
|
|
236
|
+
return useMemo(() => {
|
|
237
|
+
if (!(barScale && bandWidth && barXAccessor)) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
const centerX = innerWidth / 2;
|
|
241
|
+
const zeroY = yScale(0) ?? innerHeight;
|
|
242
|
+
// d3-scaleBand exposes step() (= bandwidth + gap); the shared helper caps
|
|
243
|
+
// depth below the gap so a side face never spills past the next bar.
|
|
244
|
+
const step = barScale.step?.() ?? bandWidth;
|
|
245
|
+
const maxDepth = barDepthMaxDepth(step, bandWidth);
|
|
246
|
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: per-bar 3D geometry (direction, perspective trim, segment scaling) reads clearest as one pass
|
|
247
|
+
return data.flatMap((d, dataIndex) => {
|
|
248
|
+
// Stacked bars: the bar's value is the SUM of its segments (so the depth
|
|
249
|
+
// height matches the host BarChart's stacked total). Single bars: the
|
|
250
|
+
// `dataKey` column. `segmentsAccessor` comes from `<BarDepthProvider>`.
|
|
251
|
+
const visibleSegs = segmentsAccessor?.(d)?.filter((s) => s.value > 0) ?? null;
|
|
252
|
+
const value = visibleSegs && visibleSegs.length > 0
|
|
253
|
+
? visibleSegs.reduce((sum, s) => sum + s.value, 0)
|
|
254
|
+
: readBarValue(d, dataKey);
|
|
255
|
+
const isActive = activeIndex != null && dataIndex === activeIndex;
|
|
256
|
+
const isNegative = value < 0;
|
|
257
|
+
const label = barXAccessor(d);
|
|
258
|
+
const bandX = barScale(label) ?? 0;
|
|
259
|
+
const cx = bandX + bandWidth / 2;
|
|
260
|
+
// `Math.abs` so negative bars produce a positive height — direction is
|
|
261
|
+
// captured by `isNegative`. Non-negative bars are floored to
|
|
262
|
+
// `minBarHeight` so short/zero values stay visible (mirrors
|
|
263
|
+
// `<Bar minBarHeight>`); a floored bar skips the perspective trim so its
|
|
264
|
+
// tiny front face and lid stay aligned. With the default floor of 0,
|
|
265
|
+
// zero-value bars produce no height and are skipped.
|
|
266
|
+
const valuePos = yScale(value) ?? innerHeight;
|
|
267
|
+
const rawHeight = Math.abs(zeroY - valuePos);
|
|
268
|
+
const naturalHeight = isNegative ? rawHeight : Math.max(rawHeight, minBarHeight);
|
|
269
|
+
if (naturalHeight <= 0) {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
const isFloored = !isNegative && rawHeight < naturalHeight;
|
|
273
|
+
const offsetFromCenter = centerX > 0 ? (cx - centerX) / centerX : 0;
|
|
274
|
+
const isRightOfCenter = offsetFromCenter > 0;
|
|
275
|
+
const absOffset = Math.min(1, Math.abs(offsetFromCenter));
|
|
276
|
+
const { depth, perspectiveRise: rawRise } = barDepthAndRise(absOffset, naturalHeight, maxDepth);
|
|
277
|
+
// Perspective lift applies only to positive bars. For negative bars a
|
|
278
|
+
// lift would raise the lid's back edge above the baseline (a visible
|
|
279
|
+
// "lip" at the chart edges), so it's forced to 0 — degenerating the lid
|
|
280
|
+
// and flattening the side into a rectangle flush with the baseline.
|
|
281
|
+
const perspectiveRise = isNegative ? 0 : rawRise;
|
|
282
|
+
// Perspective trim — positive value-bearing bars only. The lid's back
|
|
283
|
+
// edge sits `perspectiveRise` above `topY`. Without trim the silhouette
|
|
284
|
+
// top would vary with depth (bars further from center look taller).
|
|
285
|
+
// Trim shifts `topY` DOWN by `perspectiveRise` so the lid's back edge
|
|
286
|
+
// lands on `yScale(value)` regardless of depth. The clamp denominator
|
|
287
|
+
// is the topmost segment's scaled height (for stacked bars) or the whole
|
|
288
|
+
// bar's natural height, matching how `<Bar>` stacks segments.
|
|
289
|
+
let trimClampReference = naturalHeight;
|
|
290
|
+
if (visibleSegs && visibleSegs.length > 0) {
|
|
291
|
+
const segTotal = visibleSegs.reduce((sum, s) => sum + s.value, 0);
|
|
292
|
+
const topmost = visibleSegs.at(-1);
|
|
293
|
+
if (segTotal > 0 && topmost) {
|
|
294
|
+
trimClampReference = (topmost.value / segTotal) * naturalHeight;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const isValueBar = naturalHeight > 0 && !isNegative && !isFloored;
|
|
298
|
+
const topYTrim = isValueBar
|
|
299
|
+
? Math.min(perspectiveRise, Math.max(0, trimClampReference - 1))
|
|
300
|
+
: 0;
|
|
301
|
+
// Direction-aware top/bottom: positive bars hang ABOVE the baseline;
|
|
302
|
+
// negative bars hang BELOW it. The lid always lives at `topY` so for
|
|
303
|
+
// negative bars it sits on the baseline.
|
|
304
|
+
const topY = isNegative ? zeroY : zeroY - naturalHeight + topYTrim;
|
|
305
|
+
const bottomY = isNegative ? zeroY + naturalHeight : zeroY;
|
|
306
|
+
const barHeight = bottomY - topY;
|
|
307
|
+
return [
|
|
308
|
+
{
|
|
309
|
+
label,
|
|
310
|
+
dataIndex,
|
|
311
|
+
datum: d,
|
|
312
|
+
isActive,
|
|
313
|
+
isNegative,
|
|
314
|
+
baselineY: zeroY,
|
|
315
|
+
bandX,
|
|
316
|
+
bandWidth,
|
|
317
|
+
topY,
|
|
318
|
+
bottomY,
|
|
319
|
+
barHeight,
|
|
320
|
+
naturalHeight,
|
|
321
|
+
topYTrim,
|
|
322
|
+
depth,
|
|
323
|
+
perspectiveRise,
|
|
324
|
+
isRightOfCenter,
|
|
325
|
+
},
|
|
326
|
+
];
|
|
327
|
+
});
|
|
328
|
+
}, [
|
|
329
|
+
data,
|
|
330
|
+
barScale,
|
|
331
|
+
bandWidth,
|
|
332
|
+
yScale,
|
|
333
|
+
innerHeight,
|
|
334
|
+
innerWidth,
|
|
335
|
+
barXAccessor,
|
|
336
|
+
segmentsAccessor,
|
|
337
|
+
minBarHeight,
|
|
338
|
+
dataKey,
|
|
339
|
+
activeIndex,
|
|
340
|
+
]);
|
|
341
|
+
}
|
|
342
|
+
function useBarDepthStagger() {
|
|
343
|
+
const { data, animationDuration } = useChartStable();
|
|
344
|
+
// Mirror `Bar`'s stagger formula so each depth surface enters in lockstep
|
|
345
|
+
// with its front face (`Bar` uses `animationDuration * 0.4 / count`).
|
|
346
|
+
const total = animationDuration || 1100;
|
|
347
|
+
return data.length > 1 ? (total * 0.4) / 1000 / data.length : 0;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Renders the back surfaces (side + top faces) of the 3D bar effect.
|
|
351
|
+
*
|
|
352
|
+
* Place BEFORE the `<Bar>` elements in `<BarChart>` children so the bar's
|
|
353
|
+
* solid front face occludes any depth that would extend into an adjacent
|
|
354
|
+
* column. Skips bars at chart center (depth ≈ 0) and dense charts.
|
|
355
|
+
*
|
|
356
|
+
* For stacked bars, wrap the `<BarChart>` in a
|
|
357
|
+
* `<BarDepthProvider segmentsAccessor={...}>` so the side face splits into
|
|
358
|
+
* per-segment parallelograms and the lid color matches the topmost segment.
|
|
359
|
+
*/
|
|
360
|
+
export function BarDepthBack({ dataKey, color = DEFAULT_BAR_COLOR, colorAccessor, }) {
|
|
361
|
+
const { isLoaded, enterTransition, revealEpoch = 0 } = useChartStable();
|
|
362
|
+
const { hoveredBarIndex } = useChartHover();
|
|
363
|
+
const { segmentsAccessor } = useContext(BarDepthContext);
|
|
364
|
+
const entries = useBarDepthEntries(dataKey);
|
|
365
|
+
const stagger = useBarDepthStagger();
|
|
366
|
+
const { posStops: glassStops, negStops: glassNegStops } = useGlassStops();
|
|
367
|
+
const idPrefix = useId().replace(/[^a-z0-9]/gi, "_");
|
|
368
|
+
// Two horizontal black gradients (one per depth direction) shade the side
|
|
369
|
+
// from front-edge (lit) to back-edge (in shadow). A single vertical white
|
|
370
|
+
// gradient on the lid: bright catch at the front lip → soft white at the
|
|
371
|
+
// back. The vertical glass gradient layered on top of the side adds the same
|
|
372
|
+
// bright-tip / dark-baseline curve as the front face for continuity.
|
|
373
|
+
const sideShadeRtl = `bdb-side-rtl-${idPrefix}`;
|
|
374
|
+
const sideShadeLtr = `bdb-side-ltr-${idPrefix}`;
|
|
375
|
+
const topShade = `bdb-top-${idPrefix}`;
|
|
376
|
+
const sideGlass = `bdb-glass-${idPrefix}`;
|
|
377
|
+
// Per-bar bbox variant used only for bars that extend below the baseline.
|
|
378
|
+
const sideGlassNeg = `bdb-glass-neg-${idPrefix}`;
|
|
379
|
+
return (_jsxs("g", { className: "bar-depth-back", pointerEvents: "none", children: [_jsxs("defs", { children: [_jsxs("linearGradient", { id: sideShadeRtl, x1: "1", x2: "0", y1: "0", y2: "1", children: [_jsx("stop", { offset: "0%", stopColor: "black", stopOpacity: "0.05" }), _jsx("stop", { offset: "100%", stopColor: "black", stopOpacity: "0.55" })] }), _jsxs("linearGradient", { id: sideShadeLtr, x1: "0", x2: "1", y1: "0", y2: "1", children: [_jsx("stop", { offset: "0%", stopColor: "black", stopOpacity: "0.05" }), _jsx("stop", { offset: "100%", stopColor: "black", stopOpacity: "0.55" })] }), _jsxs("linearGradient", { id: topShade, x1: "0", x2: "0", y1: "1", y2: "0", children: [_jsx("stop", { offset: "0%", stopColor: "black", stopOpacity: "0" }), _jsx("stop", { offset: "100%", stopColor: "black", stopOpacity: "0.18" })] }), _jsx("linearGradient", { id: sideGlass, x1: "0", x2: "0", y1: "0", y2: "1", children: glassStops.map((stop) => (_jsx("stop", { offset: stop.offset, stopColor: stop.color, stopOpacity: stop.opacity }, `${stop.offset}-${stop.opacity}`))) }), _jsx("linearGradient", { id: sideGlassNeg, x1: "0", x2: "0", y1: "0", y2: "1", children: glassNegStops.map((stop) => (_jsx("stop", { offset: stop.offset, stopColor: stop.color, stopOpacity: stop.opacity }, `${stop.offset}-${stop.opacity}`))) })] }), entries.map((e) => {
|
|
380
|
+
if (e.depth < BAR_DEPTH_MIN_PX) {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
// Resolve stacked segments for this bar. Filter to non-zero so a
|
|
384
|
+
// missing segment doesn't paint an invisible 0-height piece or quietly
|
|
385
|
+
// become the lid color.
|
|
386
|
+
const rawSegments = segmentsAccessor?.(e.datum);
|
|
387
|
+
const visibleSegments = rawSegments?.filter((s) => s.value > 0) ?? null;
|
|
388
|
+
const baseColor = resolveColor(e.datum, e.dataIndex, color, colorAccessor);
|
|
389
|
+
const sidePieces = buildSidePieces(e, visibleSegments, baseColor);
|
|
390
|
+
// Full-side path for the vertical glass overlay — drawn once per bar
|
|
391
|
+
// so the brightness curve sweeps across the entire side as one layer.
|
|
392
|
+
const fullSidePath = sideFacePath(e, e.topY, e.bottomY);
|
|
393
|
+
// Lid is one parallelogram regardless of segmentation — colored by the
|
|
394
|
+
// topmost visible segment so it matches the front face's top section.
|
|
395
|
+
const topPath = lidFacePath(e);
|
|
396
|
+
const topColor = visibleSegments?.at(-1)?.color ?? baseColor;
|
|
397
|
+
const delay = e.dataIndex * stagger;
|
|
398
|
+
// Grow uses the SAME enter transition + stagger as `<Bar>` so the side
|
|
399
|
+
// and lid rise at the exact speed of the front face. Post-load geometry
|
|
400
|
+
// changes get a quick settle instead.
|
|
401
|
+
const growTransition = isLoaded
|
|
402
|
+
? { duration: 0.3, ease: "easeOut" }
|
|
403
|
+
: transitionWithDelay(enterTransition, delay);
|
|
404
|
+
const isFaded = hoveredBarIndex != null && hoveredBarIndex !== e.dataIndex;
|
|
405
|
+
const sideShadeId = e.isRightOfCenter ? sideShadeRtl : sideShadeLtr;
|
|
406
|
+
const safeId = e.label.replace(/[^a-z0-9]/gi, "_");
|
|
407
|
+
const clipId = `bdb-clip-${idPrefix}-${safeId}`;
|
|
408
|
+
// Lid ENTRANCE only (hover-dim is owned by the wrapping group below, so
|
|
409
|
+
// the lid can never dim differently from the side). Positive lids
|
|
410
|
+
// translate up from the baseline riding the growing top edge; negative
|
|
411
|
+
// lids already sit at the baseline, so they fade in instead.
|
|
412
|
+
let lidEntrance = {
|
|
413
|
+
initial: false,
|
|
414
|
+
animate: { y: 0 },
|
|
415
|
+
transition: { y: growTransition },
|
|
416
|
+
};
|
|
417
|
+
if (!isLoaded && e.isNegative) {
|
|
418
|
+
lidEntrance = {
|
|
419
|
+
initial: { y: 0, opacity: 0 },
|
|
420
|
+
animate: { y: 0, opacity: 1 },
|
|
421
|
+
transition: { y: growTransition, opacity: growTransition },
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
else if (!isLoaded) {
|
|
425
|
+
lidEntrance = {
|
|
426
|
+
initial: { y: e.barHeight },
|
|
427
|
+
animate: { y: 0 },
|
|
428
|
+
transition: { y: growTransition },
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
return (_jsxs(motion.g, { animate: { opacity: isFaded ? BAR_FADED_OPACITY : 1 }, initial: false, transition: BAR_HOVER_TRANSITION, children: [_jsx("defs", { children: _jsx("clipPath", { id: clipId, children: _jsx(motion.rect, { animate: {
|
|
432
|
+
y: e.topY - e.perspectiveRise,
|
|
433
|
+
height: e.barHeight + e.perspectiveRise,
|
|
434
|
+
}, initial: isLoaded ? false : { y: e.baselineY, height: 0 }, transition: growTransition, width: e.bandWidth + 2 * e.depth + 2, x: e.bandX - e.depth - 1 }, `${clipId}-${revealEpoch}-${isLoaded}`) }) }), _jsxs("g", { clipPath: `url(#${clipId})`, children: [sidePieces.map((piece) => (_jsx("path", { d: piece.path, fill: piece.color }, piece.path))), _jsx("path", { d: fullSidePath, fill: `url(#${sideShadeId})` }), _jsx("path", { d: fullSidePath, fill: `url(#${e.isNegative ? sideGlassNeg : sideGlass})` })] }), _jsxs(motion.g, { animate: lidEntrance.animate, initial: lidEntrance.initial, transition: lidEntrance.transition, children: [_jsx("path", { d: topPath, fill: topColor }), _jsx("path", { d: topPath, fill: "white", fillOpacity: GLASS_TIP_OPACITY }), _jsx("path", { d: topPath, fill: `url(#${topShade})` })] }, `lid-${safeId}-${revealEpoch}-${isLoaded}`)] }, e.label));
|
|
435
|
+
})] }));
|
|
436
|
+
}
|
|
437
|
+
BarDepthBack.displayName = "BarDepthBack";
|
|
438
|
+
// Mark as a non-series layer so `BarChart` doesn't count it as a bar (it
|
|
439
|
+
// carries a `dataKey` to pair with a Bar). Mirrors `ChartMarkers`'
|
|
440
|
+
// `__isChartMarkers` flag — a static property is minification-safe, unlike
|
|
441
|
+
// matching on `displayName`.
|
|
442
|
+
BarDepthBack.__isBarDepthLayer = true;
|
|
443
|
+
/**
|
|
444
|
+
* Renders the front surface: a glossy glass sheen over the bar's solid fill.
|
|
445
|
+
* Place AFTER the `<Bar>` elements in `<BarChart>` children so the gradient
|
|
446
|
+
* sits on top of the bar.
|
|
447
|
+
*
|
|
448
|
+
* Reads `segmentsAccessor` from the surrounding `<BarDepthProvider>` (if any)
|
|
449
|
+
* via `useBarDepthEntries`, so the glass rectangle's `topY` automatically
|
|
450
|
+
* matches the lid+side's trim. No prop wiring required.
|
|
451
|
+
*/
|
|
452
|
+
export function BarDepthFront({ dataKey }) {
|
|
453
|
+
const { isLoaded, enterTransition, revealEpoch = 0 } = useChartStable();
|
|
454
|
+
const { hoveredBarIndex } = useChartHover();
|
|
455
|
+
const entries = useBarDepthEntries(dataKey);
|
|
456
|
+
const stagger = useBarDepthStagger();
|
|
457
|
+
const { posStops: glassStops, negStops: glassNegStops } = useGlassStops();
|
|
458
|
+
const idPrefix = useId().replace(/[^a-z0-9]/gi, "_");
|
|
459
|
+
const glassId = `bdf-glass-${idPrefix}`;
|
|
460
|
+
const glassIdNeg = `bdf-glass-neg-${idPrefix}`;
|
|
461
|
+
return (_jsxs("g", { className: "bar-depth-front", pointerEvents: "none", children: [_jsxs("defs", { children: [_jsx("linearGradient", { id: glassId, x1: "0", x2: "0", y1: "0", y2: "1", children: glassStops.map((stop) => (_jsx("stop", { offset: stop.offset, stopColor: stop.color, stopOpacity: stop.opacity }, `${stop.offset}-${stop.opacity}`))) }), _jsx("linearGradient", { id: glassIdNeg, x1: "0", x2: "0", y1: "0", y2: "1", children: glassNegStops.map((stop) => (_jsx("stop", { offset: stop.offset, stopColor: stop.color, stopOpacity: stop.opacity }, `${stop.offset}-${stop.opacity}`))) })] }), entries.map((e) => {
|
|
462
|
+
const delay = e.dataIndex * stagger;
|
|
463
|
+
// Same enter transition + stagger as `<Bar>` so the glass rises in
|
|
464
|
+
// lockstep with the front face.
|
|
465
|
+
const baseTransition = isLoaded
|
|
466
|
+
? { duration: 0.3, ease: "easeOut" }
|
|
467
|
+
: transitionWithDelay(enterTransition, delay);
|
|
468
|
+
const isFaded = hoveredBarIndex != null && hoveredBarIndex !== e.dataIndex;
|
|
469
|
+
return (_jsx(motion.rect, { animate: {
|
|
470
|
+
y: e.topY,
|
|
471
|
+
height: e.barHeight,
|
|
472
|
+
opacity: isFaded ? BAR_FADED_OPACITY : 1,
|
|
473
|
+
}, fill: `url(#${e.isNegative ? glassIdNeg : glassId})`,
|
|
474
|
+
// Anchor the grow at the baseline (not bottomY) so the glass grows
|
|
475
|
+
// outward in whichever direction the bar extends. Keyed on
|
|
476
|
+
// revealEpoch so it replays the grow on every reveal, like `<Bar>`.
|
|
477
|
+
initial: isLoaded ? false : { y: e.baselineY, height: 0 }, transition: { ...baseTransition, opacity: BAR_HOVER_TRANSITION }, width: e.bandWidth, x: e.bandX }, `${e.label}-${revealEpoch}-${isLoaded}`));
|
|
478
|
+
})] }));
|
|
479
|
+
}
|
|
480
|
+
BarDepthFront.displayName = "BarDepthFront";
|
|
481
|
+
BarDepthFront.__isBarDepthLayer = true;
|
|
482
|
+
// ─── BarPulse ─────────────────────────────────────────────────────────
|
|
483
|
+
/**
|
|
484
|
+
* Builds the SVG path tracing the silhouette of a 3D bar — the unioned
|
|
485
|
+
* outline of front face + visible side parallelogram + lid parallelogram.
|
|
486
|
+
* Used as the clip region for `BarPulse`'s wave so the gradient only paints
|
|
487
|
+
* inside the bar's visible 3D shape. For dead-center bars (`depth <= 0`) the
|
|
488
|
+
* silhouette degenerates to just the front rectangle.
|
|
489
|
+
*/
|
|
490
|
+
function buildBarSilhouettePath(e) {
|
|
491
|
+
const { bandX, bandWidth, topY, bottomY, depth, perspectiveRise, isRightOfCenter } = e;
|
|
492
|
+
if (depth <= 0) {
|
|
493
|
+
return [
|
|
494
|
+
`M ${bandX} ${topY}`,
|
|
495
|
+
`L ${bandX + bandWidth} ${topY}`,
|
|
496
|
+
`L ${bandX + bandWidth} ${bottomY}`,
|
|
497
|
+
`L ${bandX} ${bottomY}`,
|
|
498
|
+
"Z",
|
|
499
|
+
].join(" ");
|
|
500
|
+
}
|
|
501
|
+
if (isRightOfCenter) {
|
|
502
|
+
// Side face on LEFT — back shifted (-depth, -perspectiveRise).
|
|
503
|
+
return [
|
|
504
|
+
`M ${bandX - depth} ${topY - perspectiveRise}`,
|
|
505
|
+
`L ${bandX + bandWidth - depth} ${topY - perspectiveRise}`,
|
|
506
|
+
`L ${bandX + bandWidth} ${topY}`,
|
|
507
|
+
`L ${bandX + bandWidth} ${bottomY}`,
|
|
508
|
+
`L ${bandX} ${bottomY}`,
|
|
509
|
+
`L ${bandX - depth} ${bottomY - perspectiveRise}`,
|
|
510
|
+
"Z",
|
|
511
|
+
].join(" ");
|
|
512
|
+
}
|
|
513
|
+
// Side face on RIGHT — back shifted (+depth, -perspectiveRise).
|
|
514
|
+
return [
|
|
515
|
+
`M ${bandX} ${topY}`,
|
|
516
|
+
`L ${bandX + depth} ${topY - perspectiveRise}`,
|
|
517
|
+
`L ${bandX + bandWidth + depth} ${topY - perspectiveRise}`,
|
|
518
|
+
`L ${bandX + bandWidth + depth} ${bottomY - perspectiveRise}`,
|
|
519
|
+
`L ${bandX + bandWidth} ${bottomY}`,
|
|
520
|
+
`L ${bandX} ${bottomY}`,
|
|
521
|
+
"Z",
|
|
522
|
+
].join(" ");
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Vertical wave that sweeps from a bar's root (baseline) toward its tip on a
|
|
526
|
+
* continuous loop, painted across the bar's full 3D silhouette (front face +
|
|
527
|
+
* lid + visible side). Reads as a heartbeat pulse flowing up the column for
|
|
528
|
+
* positive bars and down for negative bars — useful for marking a live or
|
|
529
|
+
* in-progress value without adding any fixed element.
|
|
530
|
+
*
|
|
531
|
+
* Select the bar via `activeIndex`. Set `pulsePaused` to freeze it. Place
|
|
532
|
+
* AFTER `<BarDepthFront />` so the wave brightens on top of the glass.
|
|
533
|
+
*
|
|
534
|
+
* Performance: at most one clipped `<motion.rect>` with a single Y translate
|
|
535
|
+
* per frame (no per-frame paint of gradient stops, no SVG filters).
|
|
536
|
+
*/
|
|
537
|
+
export function BarPulse({ dataKey, activeIndex, pulsePaused }) {
|
|
538
|
+
const { isLoaded } = useChartStable();
|
|
539
|
+
const { hoveredBarIndex } = useChartHover();
|
|
540
|
+
const entries = useBarDepthEntries(dataKey, activeIndex);
|
|
541
|
+
const idPrefix = useId().replace(/[^a-z0-9]/gi, "_");
|
|
542
|
+
const activeEntries = useMemo(() => entries.filter((e) => e.isActive), [entries]);
|
|
543
|
+
if (activeEntries.length === 0 || pulsePaused) {
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
// Hold the wave until bars finish growing — the silhouette clip is computed
|
|
547
|
+
// at the final geometry, so painting it mid-grow would reveal a wave inside
|
|
548
|
+
// an area the bar hasn't reached yet.
|
|
549
|
+
if (!isLoaded) {
|
|
550
|
+
return null;
|
|
551
|
+
}
|
|
552
|
+
return (_jsxs("g", { className: "bar-pulse", pointerEvents: "none", children: [_jsx("defs", { children: activeEntries.flatMap((e) => {
|
|
553
|
+
const safeId = e.label.replace(/[^a-z0-9]/gi, "_");
|
|
554
|
+
const clipId = `bar-pulse-clip-${idPrefix}-${safeId}`;
|
|
555
|
+
const gradId = `bar-pulse-grad-${idPrefix}-${safeId}`;
|
|
556
|
+
return [
|
|
557
|
+
_jsx("clipPath", { id: clipId, children: _jsx("path", { d: buildBarSilhouettePath(e) }) }, `clip-${safeId}`),
|
|
558
|
+
_jsxs("linearGradient", { id: gradId, x1: "0", x2: "0", y1: "1", y2: "0", children: [_jsx("stop", { offset: "0%", stopColor: "white", stopOpacity: "0" }), _jsx("stop", { offset: "10%", stopColor: "white", stopOpacity: "0" }), _jsx("stop", { offset: "22%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.18 }), _jsx("stop", { offset: "34%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.5 }), _jsx("stop", { offset: "44%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.85 }), _jsx("stop", { offset: "50%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY }), _jsx("stop", { offset: "56%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.85 }), _jsx("stop", { offset: "66%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.5 }), _jsx("stop", { offset: "78%", stopColor: "white", stopOpacity: PULSE_WAVE_PEAK_OPACITY * 0.18 }), _jsx("stop", { offset: "90%", stopColor: "white", stopOpacity: "0" }), _jsx("stop", { offset: "100%", stopColor: "white", stopOpacity: "0" })] }, `grad-${safeId}`),
|
|
559
|
+
];
|
|
560
|
+
}) }), activeEntries.map((e) => {
|
|
561
|
+
const safeId = e.label.replace(/[^a-z0-9]/gi, "_");
|
|
562
|
+
const clipId = `bar-pulse-clip-${idPrefix}-${safeId}`;
|
|
563
|
+
const gradId = `bar-pulse-grad-${idPrefix}-${safeId}`;
|
|
564
|
+
const waveHeight = Math.max(e.barHeight * PULSE_WAVE_HEIGHT_RATIO, PULSE_WAVE_HEIGHT_MIN_PX);
|
|
565
|
+
// Travel always flows root → tip. Positive bars sweep up (root =
|
|
566
|
+
// bottomY); negative bars sweep down (root = topY, the baseline). The
|
|
567
|
+
// gradient is symmetric, so reversing the endpoints reverses direction.
|
|
568
|
+
const yAboveLid = e.topY - e.perspectiveRise - waveHeight;
|
|
569
|
+
const yBelowFloor = e.bottomY;
|
|
570
|
+
const yStart = e.isNegative ? yAboveLid : yBelowFloor;
|
|
571
|
+
const yEnd = e.isNegative ? yBelowFloor : yAboveLid;
|
|
572
|
+
const isFaded = hoveredBarIndex != null && hoveredBarIndex !== e.dataIndex;
|
|
573
|
+
return (_jsx(motion.g, { animate: { opacity: isFaded ? BAR_FADED_OPACITY : 1 }, clipPath: `url(#${clipId})`, initial: false, transition: BAR_HOVER_TRANSITION, children: _jsx(motion.rect, { animate: { y: yEnd }, fill: `url(#${gradId})`, height: waveHeight, initial: { y: yStart }, transition: {
|
|
574
|
+
duration: PULSE_WAVE_DURATION_S,
|
|
575
|
+
ease: "easeInOut",
|
|
576
|
+
repeat: Number.POSITIVE_INFINITY,
|
|
577
|
+
repeatType: "loop",
|
|
578
|
+
},
|
|
579
|
+
// Span wide enough to cover the bar plus its depth on either
|
|
580
|
+
// side; the clipPath crops anything outside the silhouette.
|
|
581
|
+
width: e.bandWidth + 2 * e.depth + 2, x: e.bandX - e.depth - 1 }) }, e.label));
|
|
582
|
+
})] }));
|
|
583
|
+
}
|
|
584
|
+
BarPulse.displayName = "BarPulse";
|
|
585
|
+
BarPulse.__isBarDepthLayer = true;
|
|
586
|
+
//# sourceMappingURL=bar-depth.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface SquareColumnLayout {
|
|
2
|
+
/** Number of squares in the column */
|
|
3
|
+
count: number;
|
|
4
|
+
/** Top-left Y of each square, bottom square first (relative to bar top at 0) */
|
|
5
|
+
positions: number[];
|
|
6
|
+
/** Quantized column height in pixels */
|
|
7
|
+
columnHeight: number;
|
|
8
|
+
squareSize: number;
|
|
9
|
+
/** Effective gap between squares (may differ when fit mode redistributes) */
|
|
10
|
+
gap: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SquareColumnInput {
|
|
13
|
+
/** Raw bar length in pixels (baseline − value) */
|
|
14
|
+
barLengthPx: number;
|
|
15
|
+
/** Square width/height — typically equals bar width */
|
|
16
|
+
squareSize: number;
|
|
17
|
+
/** Gap between stacked squares in pixels */
|
|
18
|
+
gap: number;
|
|
19
|
+
/** When true, redistribute gap so column height matches barLengthPx exactly */
|
|
20
|
+
fit?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Quantize bar length into a stack of square cells. */
|
|
23
|
+
export declare function computeSquareColumn({ barLengthPx, squareSize, gap, fit, }: SquareColumnInput): SquareColumnLayout;
|
|
24
|
+
/** Y center of the topmost square in a vertical column. */
|
|
25
|
+
export declare function topSquareCenterY({ baselineY, barLengthPx, squareSize, gap, fit, }: SquareColumnInput & {
|
|
26
|
+
baselineY: number;
|
|
27
|
+
}): number;
|
|
28
|
+
//# sourceMappingURL=bar-squares-layout.d.ts.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Quantize bar length into a stack of square cells. */
|
|
2
|
+
export function computeSquareColumn({ barLengthPx, squareSize, gap, fit = false, }) {
|
|
3
|
+
if (barLengthPx <= 0 || squareSize <= 0) {
|
|
4
|
+
return { count: 0, positions: [], columnHeight: 0, squareSize, gap };
|
|
5
|
+
}
|
|
6
|
+
if (fit) {
|
|
7
|
+
const count = Math.max(1, Math.floor((barLengthPx + gap) / (squareSize + gap)));
|
|
8
|
+
const effectiveGap = count > 1 ? Math.max(0, (barLengthPx - count * squareSize) / (count - 1)) : 0;
|
|
9
|
+
const step = squareSize + effectiveGap;
|
|
10
|
+
const columnHeight = barLengthPx;
|
|
11
|
+
const positions = [];
|
|
12
|
+
for (let i = 0; i < count; i++) {
|
|
13
|
+
positions.push(columnHeight - squareSize - i * step);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
count,
|
|
17
|
+
positions,
|
|
18
|
+
columnHeight,
|
|
19
|
+
squareSize,
|
|
20
|
+
gap: effectiveGap,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const step = squareSize + gap;
|
|
24
|
+
const count = Math.max(1, Math.round(barLengthPx / step));
|
|
25
|
+
const columnHeight = count * squareSize + Math.max(0, count - 1) * gap;
|
|
26
|
+
const positions = [];
|
|
27
|
+
for (let i = 0; i < count; i++) {
|
|
28
|
+
const offsetFromBottom = i * step;
|
|
29
|
+
positions.push(columnHeight - squareSize - offsetFromBottom);
|
|
30
|
+
}
|
|
31
|
+
return { count, positions, columnHeight, squareSize, gap };
|
|
32
|
+
}
|
|
33
|
+
/** Y center of the topmost square in a vertical column. */
|
|
34
|
+
export function topSquareCenterY({ baselineY, barLengthPx, squareSize, gap, fit = false, }) {
|
|
35
|
+
const { count, squareSize: size, columnHeight, } = computeSquareColumn({
|
|
36
|
+
barLengthPx,
|
|
37
|
+
squareSize,
|
|
38
|
+
gap,
|
|
39
|
+
fit,
|
|
40
|
+
});
|
|
41
|
+
if (count === 0) {
|
|
42
|
+
return baselineY;
|
|
43
|
+
}
|
|
44
|
+
const topY = baselineY - columnHeight;
|
|
45
|
+
return topY + size / 2;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=bar-squares-layout.js.map
|