@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,208 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "motion/react";
|
|
4
|
+
import { memo, useId, useMemo } from "react";
|
|
5
|
+
import { barDepthAndRise, barDepthMaxDepth } from "./bar-depth-geometry.js";
|
|
6
|
+
import { chartCssVars, useChart, useChartStable, useYScale } from "./chart-context.js";
|
|
7
|
+
import { useChartLegendHover } from "./chart-legend-hover.js";
|
|
8
|
+
import { transitionWithDelay } from "./motion-utils.js";
|
|
9
|
+
// ── Bar-depth perspective trim ───────────────────────────────────────────
|
|
10
|
+
// Uses the SHARED geometry (`bar-depth-geometry.ts`) so a
|
|
11
|
+
// `<Bar perspective>` front face lines up exactly with
|
|
12
|
+
// `<BarDepthBack>`'s lid — the formula lives in one place for both.
|
|
13
|
+
/** perspectiveRise for a positive bar whose visual top sits at `topY`.
|
|
14
|
+
* Returns 0 for a dead-center bar or a dense chart (degenerate depth). */
|
|
15
|
+
function barDepthPerspectiveRise(barScale, bandWidth, barXAccessor, innerWidth, datum, topY, baselineY) {
|
|
16
|
+
const centerX = innerWidth / 2;
|
|
17
|
+
if (centerX <= 0) {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
const step = barScale.step?.() ?? bandWidth;
|
|
21
|
+
const maxDepth = barDepthMaxDepth(step, bandWidth);
|
|
22
|
+
const bandX = barScale(barXAccessor(datum)) ?? 0;
|
|
23
|
+
const cx = bandX + bandWidth / 2;
|
|
24
|
+
const absOffset = Math.min(1, Math.abs((cx - centerX) / centerX));
|
|
25
|
+
const naturalHeight = Math.abs(baselineY - topY);
|
|
26
|
+
return barDepthAndRise(absOffset, naturalHeight, maxDepth).perspectiveRise;
|
|
27
|
+
}
|
|
28
|
+
function AnimatedBar({ x, y, width, height, fill, rx, ry, index, isFaded, animationType, innerHeight, fadedOpacity, staggerDelay, enterTransition, revealEpoch, isHorizontal, }) {
|
|
29
|
+
const enterAnim = transitionWithDelay(enterTransition, index * staggerDelay);
|
|
30
|
+
if (animationType === "fade") {
|
|
31
|
+
return (_jsx(motion.rect, { animate: {
|
|
32
|
+
opacity: isFaded ? fadedOpacity : 1,
|
|
33
|
+
filter: "blur(0px)",
|
|
34
|
+
}, fill: fill, height: height, initial: { opacity: 0, filter: "blur(2px)" }, rx: rx, ry: ry, transition: enterAnim, width: width, x: x, y: y }, `fade-${index}-${revealEpoch}`));
|
|
35
|
+
}
|
|
36
|
+
const initial = isHorizontal
|
|
37
|
+
? { width: 0, height, x: 0, y }
|
|
38
|
+
: { width, height: 0, x, y: innerHeight };
|
|
39
|
+
const target = isHorizontal ? { width, height, x: 0, y } : { width, height, x, y };
|
|
40
|
+
return (_jsx("g", { opacity: isFaded ? fadedOpacity : 1, style: { transition: "opacity 0.15s ease-in-out" }, children: _jsx(motion.rect, { animate: target, fill: fill, initial: initial, rx: rx, ry: ry, transition: enterAnim }, `grow-${index}-${revealEpoch}`) }));
|
|
41
|
+
}
|
|
42
|
+
const BarInner = memo(function BarInner({ dataKey, yAxisId, fill = chartCssVars.linePrimary, lineCap = "round", animate = true, animationType = "grow", fadedOpacity = 0.22, staggerDelay, stackGap = 0, groupGap = 4, perspective = false, minBarHeight = 0, barScale, bandWidth, barXAccessor, }) {
|
|
43
|
+
const { data, yScale: chartYScale, innerHeight, innerWidth, isLoaded, hoveredBarIndex, lines, orientation, stacked, stackOffsets, animationDuration, enterTransition, revealEpoch = 0, } = useChart();
|
|
44
|
+
// Calculate stagger delay automatically if not provided
|
|
45
|
+
// Total animation duration is ~1200ms, with 40% for stagger spread and 60% for bar animation
|
|
46
|
+
const totalAnimDuration = animationDuration || 1100;
|
|
47
|
+
const staggerSpread = totalAnimDuration * 0.4; // 40% of time for stagger spread
|
|
48
|
+
const calculatedStaggerDelay = staggerDelay ?? (data.length > 1 ? staggerSpread / 1000 / data.length : 0);
|
|
49
|
+
const uniqueId = useId();
|
|
50
|
+
const isHorizontal = orientation === "horizontal";
|
|
51
|
+
// Find the index of this bar series among all bar series
|
|
52
|
+
const { hoveredIndex: legendHoveredIndex } = useChartLegendHover();
|
|
53
|
+
const seriesIndex = useMemo(() => {
|
|
54
|
+
const idx = lines.findIndex((l) => l.dataKey === dataKey);
|
|
55
|
+
return idx >= 0 ? idx : 0;
|
|
56
|
+
}, [lines, dataKey]);
|
|
57
|
+
const seriesConfig = lines[seriesIndex];
|
|
58
|
+
const valueScale = useYScale(yAxisId ?? seriesConfig?.yAxisId);
|
|
59
|
+
const isLegendDimmed = legendHoveredIndex !== null && legendHoveredIndex !== seriesIndex;
|
|
60
|
+
const seriesCount = lines.length;
|
|
61
|
+
const isLastSeries = seriesIndex === seriesCount - 1;
|
|
62
|
+
// Calculate the width for each bar within a group (for non-stacked)
|
|
63
|
+
const barWidth = useMemo(() => {
|
|
64
|
+
if (!bandWidth || seriesCount === 0) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
if (stacked) {
|
|
68
|
+
// Stacked bars use full band width
|
|
69
|
+
return bandWidth;
|
|
70
|
+
}
|
|
71
|
+
// Leave a gap between grouped bars (controlled by groupGap prop)
|
|
72
|
+
const effectiveGroupGap = seriesCount > 1 ? groupGap : 0;
|
|
73
|
+
return (bandWidth - effectiveGroupGap * (seriesCount - 1)) / seriesCount;
|
|
74
|
+
}, [bandWidth, seriesCount, stacked, groupGap]);
|
|
75
|
+
// Calculate corner radius based on lineCap. Perspective bars force a flat
|
|
76
|
+
// top (radius 0) so the 3D lid from `<BarDepthBack>` meets the bar with no
|
|
77
|
+
// gap — rounded corners would leave a wedge, so `perspective` overrides it.
|
|
78
|
+
const cornerRadius = useMemo(() => {
|
|
79
|
+
if (perspective) {
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
if (typeof lineCap === "number") {
|
|
83
|
+
return lineCap;
|
|
84
|
+
}
|
|
85
|
+
if (lineCap === "round" && barWidth) {
|
|
86
|
+
return Math.min(barWidth / 2, 8);
|
|
87
|
+
}
|
|
88
|
+
return 0;
|
|
89
|
+
}, [lineCap, barWidth, perspective]);
|
|
90
|
+
return (_jsx("g", { className: `bar-series-${uniqueId}`, children: data.map((d, i) => {
|
|
91
|
+
const value = d[dataKey];
|
|
92
|
+
if (typeof value !== "number") {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const categoryValue = barXAccessor(d);
|
|
96
|
+
const bandPos = barScale(categoryValue) ?? 0;
|
|
97
|
+
let x;
|
|
98
|
+
let y;
|
|
99
|
+
let barHeight;
|
|
100
|
+
let barW;
|
|
101
|
+
const scale = isHorizontal ? chartYScale : valueScale;
|
|
102
|
+
if (isHorizontal) {
|
|
103
|
+
// Horizontal bars: category on y-axis, value on x-axis
|
|
104
|
+
const valuePos = scale(value) ?? 0;
|
|
105
|
+
barW = valuePos; // Width is the value position (grows from left)
|
|
106
|
+
barHeight = barWidth;
|
|
107
|
+
if (stacked && stackOffsets) {
|
|
108
|
+
const offset = stackOffsets.get(i)?.get(dataKey) ?? 0;
|
|
109
|
+
x = scale(offset) ?? 0;
|
|
110
|
+
barW = valuePos - x;
|
|
111
|
+
// Apply stack gap for horizontal: shift right and reduce width
|
|
112
|
+
const gapOffset = seriesIndex * stackGap;
|
|
113
|
+
x += gapOffset;
|
|
114
|
+
if (!isLastSeries && stackGap > 0) {
|
|
115
|
+
barW = Math.max(0, barW - stackGap);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
x = 0;
|
|
120
|
+
// For grouped bars, offset y position
|
|
121
|
+
const effectiveGroupGap = seriesCount > 1 ? groupGap : 0;
|
|
122
|
+
y = bandPos + seriesIndex * (barWidth + effectiveGroupGap);
|
|
123
|
+
}
|
|
124
|
+
y = stacked
|
|
125
|
+
? bandPos
|
|
126
|
+
: bandPos + seriesIndex * (barWidth + (seriesCount > 1 ? groupGap : 0));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Vertical bars: category on x-axis, value on y-axis
|
|
130
|
+
const valuePos = scale(value) ?? 0;
|
|
131
|
+
barHeight = innerHeight - valuePos;
|
|
132
|
+
barW = barWidth;
|
|
133
|
+
if (stacked && stackOffsets) {
|
|
134
|
+
const offset = stackOffsets.get(i)?.get(dataKey) ?? 0;
|
|
135
|
+
const offsetY = scale(offset) ?? innerHeight;
|
|
136
|
+
// Apply stack gap: shift up and reduce height
|
|
137
|
+
const gapOffset = seriesIndex * stackGap;
|
|
138
|
+
y = offsetY - barHeight - gapOffset;
|
|
139
|
+
// Reduce height slightly for non-last bars to create visual gap
|
|
140
|
+
if (!isLastSeries && stackGap > 0) {
|
|
141
|
+
barHeight = Math.max(0, barHeight - stackGap);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
y = valuePos;
|
|
146
|
+
// For grouped bars, offset x position
|
|
147
|
+
const effectiveGroupGap = seriesCount > 1 ? groupGap : 0;
|
|
148
|
+
x = bandPos + seriesIndex * (barWidth + effectiveGroupGap);
|
|
149
|
+
}
|
|
150
|
+
x = stacked
|
|
151
|
+
? bandPos
|
|
152
|
+
: bandPos + seriesIndex * (barWidth + (seriesCount > 1 ? groupGap : 0));
|
|
153
|
+
// Minimum visible height — floor short/zero non-stacked bars so a
|
|
154
|
+
// zero-value data point still reads as a tiny bar instead of
|
|
155
|
+
// vanishing. Grows up from the baseline. Floored bars skip the
|
|
156
|
+
// perspective trim (sub-pixel on a 3px bar; keeps the front aligned
|
|
157
|
+
// with bar-depth, which also skips trim for floored bars).
|
|
158
|
+
let isFloored = false;
|
|
159
|
+
if (!stacked && minBarHeight > 0 && value >= 0 && barHeight < minBarHeight) {
|
|
160
|
+
const baselineY = scale(0) ?? innerHeight;
|
|
161
|
+
barHeight = minBarHeight;
|
|
162
|
+
y = baselineY - minBarHeight;
|
|
163
|
+
isFloored = true;
|
|
164
|
+
}
|
|
165
|
+
// Perspective trim — shrink the topmost positive bar's front-face
|
|
166
|
+
// top down by its perspective rise so it meets `<BarDepthBack>`'s
|
|
167
|
+
// lid back edge. Stacked: only the last (topmost) series; grouped or
|
|
168
|
+
// single: every positive bar. Clamped to `barHeight - 1` so very
|
|
169
|
+
// short bars keep a positive height (matches bar-depth's clamp).
|
|
170
|
+
if (perspective && value > 0 && !isFloored && (!stacked || isLastSeries)) {
|
|
171
|
+
const baselineY = scale(0) ?? innerHeight;
|
|
172
|
+
const rise = barDepthPerspectiveRise(barScale, bandWidth, barXAccessor, innerWidth, d, y, baselineY);
|
|
173
|
+
const trim = Math.min(rise, Math.max(0, barHeight - 1));
|
|
174
|
+
y += trim;
|
|
175
|
+
barHeight -= trim;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const isFaded = (hoveredBarIndex !== null && hoveredBarIndex !== i) || isLegendDimmed;
|
|
179
|
+
// Use categoryValue as key since it's the unique identifier from data
|
|
180
|
+
const barKey = `bar-${dataKey}-${categoryValue}`;
|
|
181
|
+
// Apply rounded corners:
|
|
182
|
+
// - For non-stacked: always apply
|
|
183
|
+
// - For stacked with gap: apply to all bars
|
|
184
|
+
// - For stacked without gap: only apply to the last series
|
|
185
|
+
const applyRounding = !stacked || stackGap > 0 || isLastSeries;
|
|
186
|
+
const effectiveRx = applyRounding ? cornerRadius : 0;
|
|
187
|
+
const effectiveRy = applyRounding ? cornerRadius : 0;
|
|
188
|
+
if (animate && !isLoaded) {
|
|
189
|
+
return (_jsx(AnimatedBar, { animationType: animationType, enterTransition: enterTransition, fadedOpacity: fadedOpacity, fill: fill, height: barHeight, index: i, innerHeight: innerHeight, isFaded: isFaded, isHorizontal: isHorizontal, revealEpoch: revealEpoch, rx: effectiveRx, ry: effectiveRy, staggerDelay: calculatedStaggerDelay, width: barW, x: x, y: y }, barKey));
|
|
190
|
+
}
|
|
191
|
+
// Static bar after animation completes
|
|
192
|
+
return (_jsx("rect", { fill: fill, height: barHeight, opacity: isFaded ? fadedOpacity : 1, rx: effectiveRx, ry: effectiveRy, style: {
|
|
193
|
+
cursor: "default",
|
|
194
|
+
transition: "opacity 0.15s ease-in-out",
|
|
195
|
+
}, width: barW, x: x, y: y }, barKey));
|
|
196
|
+
}) }));
|
|
197
|
+
});
|
|
198
|
+
export function Bar(props) {
|
|
199
|
+
const { barScale, bandWidth, barXAccessor } = useChartStable();
|
|
200
|
+
if (!(barScale && bandWidth && barXAccessor)) {
|
|
201
|
+
console.warn("Bar component must be used within a BarChart");
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
return (_jsx(BarInner, { ...props, bandWidth: bandWidth, barScale: barScale, barXAccessor: barXAccessor }));
|
|
205
|
+
}
|
|
206
|
+
Bar.displayName = "Bar";
|
|
207
|
+
export default Bar;
|
|
208
|
+
//# sourceMappingURL=bar.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Transition } from "motion/react";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
import { type Margin } from "./chart-context.js";
|
|
4
|
+
export interface OHLCDataPoint {
|
|
5
|
+
date: Date;
|
|
6
|
+
open: number;
|
|
7
|
+
high: number;
|
|
8
|
+
low: number;
|
|
9
|
+
close: number;
|
|
10
|
+
}
|
|
11
|
+
export interface CandlestickChartProps {
|
|
12
|
+
/** OHLC data array */
|
|
13
|
+
data: OHLCDataPoint[];
|
|
14
|
+
/** Key in data for the x-axis (date). Default: "date" */
|
|
15
|
+
xDataKey?: string;
|
|
16
|
+
/** Chart margins */
|
|
17
|
+
margin?: Partial<Margin>;
|
|
18
|
+
/** Animation duration in milliseconds. Default: 1500 */
|
|
19
|
+
animationDuration?: number;
|
|
20
|
+
/** Motion enter transition (spring or cubic-bezier tween). */
|
|
21
|
+
enterTransition?: Transition;
|
|
22
|
+
/** Signature of motion URL state — triggers enter replay when it changes. */
|
|
23
|
+
revealSignature?: string;
|
|
24
|
+
/** Aspect ratio as "width / height". Default: "2 / 1" */
|
|
25
|
+
aspectRatio?: string;
|
|
26
|
+
/** Additional class name for the container */
|
|
27
|
+
className?: string;
|
|
28
|
+
/** Inline styles for the container (e.g. { height: 320 }) */
|
|
29
|
+
style?: React.CSSProperties;
|
|
30
|
+
/** Gap between candles as fraction of slot width (0–1). Default: 0.2. Ignored when candleWidth is set. */
|
|
31
|
+
candleGap?: number;
|
|
32
|
+
/** Fixed candle body width in pixels. If set, overrides candleGap. */
|
|
33
|
+
candleWidth?: number;
|
|
34
|
+
/** When set, xScale uses this domain instead of deriving from data. Use with brush so main chart and strip share the same scale. */
|
|
35
|
+
xDomain?: [Date, Date];
|
|
36
|
+
/** When xDomain is set, use this as the number of slots for scale padding (e.g. full data length). */
|
|
37
|
+
xDomainSlotCount?: number;
|
|
38
|
+
/** Child components (Candlestick, Grid, XAxis, YAxis, ChartTooltip, etc.) */
|
|
39
|
+
children: ReactNode;
|
|
40
|
+
}
|
|
41
|
+
export declare function CandlestickChart({ data, xDataKey, margin: marginProp, animationDuration, enterTransition, revealSignature, aspectRatio, className, style, candleGap, candleWidth, xDomain, xDomainSlotCount, children, }: CandlestickChartProps): import("react").JSX.Element;
|
|
42
|
+
export declare namespace CandlestickChart {
|
|
43
|
+
var displayName: string;
|
|
44
|
+
}
|
|
45
|
+
export default CandlestickChart;
|
|
46
|
+
//# sourceMappingURL=candlestick-chart.d.ts.map
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ParentSize } from "@visx/responsive";
|
|
4
|
+
import { scaleLinear, scaleTime } from "@visx/scale";
|
|
5
|
+
import { bisector } from "d3-array";
|
|
6
|
+
import { Children, isValidElement, memo, useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
7
|
+
import { cn } from "../lib/cn.js";
|
|
8
|
+
import { isClipExcludedComponent, isPostOverlayComponent, isUnderlayComponent, } from "./chart-child-passthrough.js";
|
|
9
|
+
import { ChartProvider } from "./chart-context.js";
|
|
10
|
+
import { shortDateFmt } from "./chart-formatters.js";
|
|
11
|
+
import { DEFAULT_CHART_LIFECYCLE } from "./chart-phase.js";
|
|
12
|
+
import { decimateOhlcData, maxRenderPointsForWidth } from "./decimate-time-series.js";
|
|
13
|
+
import { extractReferenceAreaConfigs } from "./reference-area-config.js";
|
|
14
|
+
import { useChartInteraction } from "./use-chart-interaction.js";
|
|
15
|
+
import { wrapSingleYScale } from "./y-axis-scales.js";
|
|
16
|
+
const DEFAULT_MARGIN = { top: 40, right: 40, bottom: 40, left: 40 };
|
|
17
|
+
function ChartInner(props) {
|
|
18
|
+
const { width, height } = props;
|
|
19
|
+
if (width < 10 || height < 10) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return _jsx(ChartCore, { ...props });
|
|
23
|
+
}
|
|
24
|
+
const ChartCore = memo(function ChartCore({ width, height, data, xDataKey, margin, animationDuration, enterTransition, revealSignature = "", candleGap, candleWidthProp, xDomain, xDomainSlotCount, children, containerRef, }) {
|
|
25
|
+
const [isLoaded, setIsLoaded] = useState(false);
|
|
26
|
+
const [revealEpoch, setRevealEpoch] = useState(0);
|
|
27
|
+
const innerWidth = width - margin.left - margin.right;
|
|
28
|
+
const innerHeight = height - margin.top - margin.bottom;
|
|
29
|
+
const xAccessor = useCallback((d) => {
|
|
30
|
+
const value = d[xDataKey];
|
|
31
|
+
return value instanceof Date ? value : new Date(value);
|
|
32
|
+
}, [xDataKey]);
|
|
33
|
+
const bisectDate = useMemo(() => bisector((d) => xAccessor(d)).left, [xAccessor]);
|
|
34
|
+
const slotCount = xDomain && xDomainSlotCount != null ? xDomainSlotCount : data.length;
|
|
35
|
+
const slotWidth = innerWidth / Math.max(slotCount, 1);
|
|
36
|
+
const xScale = useMemo(() => {
|
|
37
|
+
const minTime = xDomain
|
|
38
|
+
? xDomain[0].getTime()
|
|
39
|
+
: Math.min(...data.map((d) => xAccessor(d).getTime()));
|
|
40
|
+
const maxTime = xDomain
|
|
41
|
+
? xDomain[1].getTime()
|
|
42
|
+
: Math.max(...data.map((d) => xAccessor(d).getTime()));
|
|
43
|
+
const padding = slotWidth / 2;
|
|
44
|
+
return scaleTime({
|
|
45
|
+
range: [padding, innerWidth - padding],
|
|
46
|
+
domain: [minTime, maxTime],
|
|
47
|
+
});
|
|
48
|
+
}, [innerWidth, data, xAccessor, slotWidth, xDomain]);
|
|
49
|
+
const yScale = useMemo(() => {
|
|
50
|
+
let minVal = Number.POSITIVE_INFINITY;
|
|
51
|
+
let maxVal = Number.NEGATIVE_INFINITY;
|
|
52
|
+
for (const d of data) {
|
|
53
|
+
const low = d.low;
|
|
54
|
+
const high = d.high;
|
|
55
|
+
if (typeof low === "number" && low < minVal) {
|
|
56
|
+
minVal = low;
|
|
57
|
+
}
|
|
58
|
+
if (typeof high === "number" && high > maxVal) {
|
|
59
|
+
maxVal = high;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (minVal === Number.POSITIVE_INFINITY) {
|
|
63
|
+
minVal = 0;
|
|
64
|
+
}
|
|
65
|
+
if (maxVal === Number.NEGATIVE_INFINITY) {
|
|
66
|
+
maxVal = 100;
|
|
67
|
+
}
|
|
68
|
+
const padding = (maxVal - minVal) * 0.05 || 1;
|
|
69
|
+
return scaleLinear({
|
|
70
|
+
range: [innerHeight, 0],
|
|
71
|
+
domain: [minVal - padding, maxVal + padding],
|
|
72
|
+
nice: true,
|
|
73
|
+
});
|
|
74
|
+
}, [innerHeight, data]);
|
|
75
|
+
const columnWidth = slotWidth;
|
|
76
|
+
const bandWidth = candleWidthProp ?? slotWidth * (1 - candleGap);
|
|
77
|
+
const lines = useMemo(() => [{ dataKey: "close", stroke: "var(--chart-line-primary)", strokeWidth: 0 }], []);
|
|
78
|
+
const renderData = useMemo(() => decimateOhlcData(data, maxRenderPointsForWidth(innerWidth)), [data, innerWidth]);
|
|
79
|
+
const dateLabels = useMemo(() => data.map((d) => shortDateFmt.format(xAccessor(d))), [data, xAccessor]);
|
|
80
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: revealSignature
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
setRevealEpoch((n) => n + 1);
|
|
83
|
+
setIsLoaded(false);
|
|
84
|
+
const timer = setTimeout(() => setIsLoaded(true), animationDuration);
|
|
85
|
+
return () => clearTimeout(timer);
|
|
86
|
+
}, [animationDuration, revealSignature]);
|
|
87
|
+
const { tooltipData, setTooltipData, selection, clearSelection, interactionHandlers, interactionStyle, } = useChartInteraction({
|
|
88
|
+
xScale,
|
|
89
|
+
yScale,
|
|
90
|
+
yScales: wrapSingleYScale(yScale),
|
|
91
|
+
data,
|
|
92
|
+
lines,
|
|
93
|
+
margin,
|
|
94
|
+
xAccessor,
|
|
95
|
+
bisectDate,
|
|
96
|
+
canInteract: isLoaded,
|
|
97
|
+
});
|
|
98
|
+
const hoveredCandleIndex = tooltipData?.index ?? null;
|
|
99
|
+
const isDefsComponent = (child) => {
|
|
100
|
+
const displayName = child.type?.displayName ||
|
|
101
|
+
child.type?.name ||
|
|
102
|
+
"";
|
|
103
|
+
return (displayName.includes("Gradient") ||
|
|
104
|
+
displayName.includes("Pattern") ||
|
|
105
|
+
displayName === "LinearGradient" ||
|
|
106
|
+
displayName === "RadialGradient" ||
|
|
107
|
+
displayName === "Lines" ||
|
|
108
|
+
displayName === "PatternLines");
|
|
109
|
+
};
|
|
110
|
+
const defsChildren = [];
|
|
111
|
+
const clipExcludedChildren = [];
|
|
112
|
+
const underlayChildren = [];
|
|
113
|
+
const preOverlayChildren = [];
|
|
114
|
+
const postOverlayChildren = [];
|
|
115
|
+
Children.forEach(children, (child) => {
|
|
116
|
+
if (!isValidElement(child)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (isDefsComponent(child)) {
|
|
120
|
+
defsChildren.push(child);
|
|
121
|
+
}
|
|
122
|
+
else if (isPostOverlayComponent(child)) {
|
|
123
|
+
postOverlayChildren.push(child);
|
|
124
|
+
}
|
|
125
|
+
else if (isClipExcludedComponent(child)) {
|
|
126
|
+
clipExcludedChildren.push(child);
|
|
127
|
+
}
|
|
128
|
+
else if (isUnderlayComponent(child)) {
|
|
129
|
+
underlayChildren.push(child);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
preOverlayChildren.push(child);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
const referenceAreas = useMemo(() => extractReferenceAreaConfigs(children), [children]);
|
|
136
|
+
const yScales = useMemo(() => wrapSingleYScale(yScale), [yScale]);
|
|
137
|
+
const contextValue = useMemo(() => ({
|
|
138
|
+
...DEFAULT_CHART_LIFECYCLE,
|
|
139
|
+
data,
|
|
140
|
+
renderData,
|
|
141
|
+
xScale,
|
|
142
|
+
yScale,
|
|
143
|
+
yScales,
|
|
144
|
+
width,
|
|
145
|
+
height,
|
|
146
|
+
innerWidth,
|
|
147
|
+
innerHeight,
|
|
148
|
+
margin,
|
|
149
|
+
columnWidth,
|
|
150
|
+
tooltipData,
|
|
151
|
+
setTooltipData,
|
|
152
|
+
containerRef,
|
|
153
|
+
lines,
|
|
154
|
+
referenceAreas,
|
|
155
|
+
isLoaded,
|
|
156
|
+
animationDuration,
|
|
157
|
+
enterTransition,
|
|
158
|
+
revealEpoch,
|
|
159
|
+
xAccessor,
|
|
160
|
+
dateLabels,
|
|
161
|
+
selection: selection ?? null,
|
|
162
|
+
clearSelection,
|
|
163
|
+
bandWidth,
|
|
164
|
+
hoveredCandleIndex,
|
|
165
|
+
}), [
|
|
166
|
+
data,
|
|
167
|
+
renderData,
|
|
168
|
+
xScale,
|
|
169
|
+
yScale,
|
|
170
|
+
yScales,
|
|
171
|
+
width,
|
|
172
|
+
height,
|
|
173
|
+
innerWidth,
|
|
174
|
+
innerHeight,
|
|
175
|
+
margin,
|
|
176
|
+
columnWidth,
|
|
177
|
+
tooltipData,
|
|
178
|
+
setTooltipData,
|
|
179
|
+
containerRef,
|
|
180
|
+
lines,
|
|
181
|
+
referenceAreas,
|
|
182
|
+
isLoaded,
|
|
183
|
+
animationDuration,
|
|
184
|
+
enterTransition,
|
|
185
|
+
revealEpoch,
|
|
186
|
+
xAccessor,
|
|
187
|
+
dateLabels,
|
|
188
|
+
selection,
|
|
189
|
+
clearSelection,
|
|
190
|
+
bandWidth,
|
|
191
|
+
hoveredCandleIndex,
|
|
192
|
+
]);
|
|
193
|
+
return (_jsx(ChartProvider, { value: contextValue, children: _jsxs("svg", { "aria-hidden": "true", height: height, width: width, children: [_jsxs("defs", { children: [_jsxs("linearGradient", { id: "candlestick-positive", x1: "0", x2: "0", y1: "1", y2: "0", children: [_jsx("stop", { offset: "0%", stopColor: "var(--color-emerald-500)" }), _jsx("stop", { offset: "100%", stopColor: "var(--color-emerald-500)" })] }), _jsxs("linearGradient", { id: "candlestick-negative", x1: "0", x2: "0", y1: "1", y2: "0", children: [_jsx("stop", { offset: "0%", stopColor: "var(--color-red-500)" }), _jsx("stop", { offset: "100%", stopColor: "var(--color-red-500)" })] }), defsChildren] }), _jsx("rect", { fill: "transparent", height: height, width: width, x: 0, y: 0 }), _jsxs("g", { ...interactionHandlers, style: interactionStyle, transform: `translate(${margin.left},${margin.top})`, children: [_jsx("rect", { fill: "transparent", height: innerHeight, width: innerWidth, x: 0, y: 0 }), clipExcludedChildren, underlayChildren, preOverlayChildren, postOverlayChildren] })] }) }));
|
|
194
|
+
});
|
|
195
|
+
export function CandlestickChart({ data, xDataKey = "date", margin: marginProp, animationDuration = 1100, enterTransition, revealSignature, aspectRatio = "2 / 1", className = "", style, candleGap = 0.2, candleWidth, xDomain, xDomainSlotCount, children, }) {
|
|
196
|
+
const containerRef = useRef(null);
|
|
197
|
+
const margin = { ...DEFAULT_MARGIN, ...marginProp };
|
|
198
|
+
const dataAsRecords = data;
|
|
199
|
+
return (_jsx("div", { "data-slot": "candlestick-chart", className: cn("relative w-full", className), ref: containerRef, style: { aspectRatio, touchAction: "none", ...style }, children: _jsx(ParentSize, { debounceTime: 10, children: ({ width, height }) => (_jsx(ChartInner, { animationDuration: animationDuration, candleGap: candleGap, candleWidthProp: candleWidth, containerRef: containerRef, data: dataAsRecords, enterTransition: enterTransition, height: height, margin: margin, revealSignature: revealSignature, width: width, xDataKey: xDataKey, xDomain: xDomain, xDomainSlotCount: xDomainSlotCount, children: children })) }) }));
|
|
200
|
+
}
|
|
201
|
+
CandlestickChart.displayName = "CandlestickChart";
|
|
202
|
+
export default CandlestickChart;
|
|
203
|
+
//# sourceMappingURL=candlestick-chart.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface CandlestickProps {
|
|
2
|
+
/** Whether to animate the candlesticks. Default: true */
|
|
3
|
+
animate?: boolean;
|
|
4
|
+
/** Fill for positive (close >= open) candles. Color or url(#gradient). Default: emerald */
|
|
5
|
+
positiveFill?: string;
|
|
6
|
+
/** Fill for negative candles. Color or url(#gradient). Default: red */
|
|
7
|
+
negativeFill?: string;
|
|
8
|
+
/** Optional pattern URL for body only (e.g. url(#pattern)). When set, body is drawn solid first, then pattern overlaid and masked to the body rect. */
|
|
9
|
+
bodyPatternPositive?: string;
|
|
10
|
+
/** Optional pattern URL for negative candle body. */
|
|
11
|
+
bodyPatternNegative?: string;
|
|
12
|
+
/** Inner border width on the body (drawn inside so it does not expand the shape). Default: 0 (off). */
|
|
13
|
+
insideStrokeWidth?: number;
|
|
14
|
+
/** Opacity when another candle is hovered. Default: 0.3 */
|
|
15
|
+
fadedOpacity?: number;
|
|
16
|
+
/** Dim non-hovered candles on hover. Default: true */
|
|
17
|
+
showHoverFade?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function Candlestick({ animate, positiveFill, negativeFill, bodyPatternPositive, bodyPatternNegative, insideStrokeWidth, fadedOpacity, showHoverFade, }: CandlestickProps): import("react").JSX.Element;
|
|
20
|
+
export declare namespace Candlestick {
|
|
21
|
+
var displayName: string;
|
|
22
|
+
}
|
|
23
|
+
export default Candlestick;
|
|
24
|
+
//# sourceMappingURL=candlestick.d.ts.map
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "motion/react";
|
|
4
|
+
import { memo, useMemo } from "react";
|
|
5
|
+
import { useChart } from "./chart-context.js";
|
|
6
|
+
import { useChartLegendHover } from "./chart-legend-hover.js";
|
|
7
|
+
import { transitionWithDelay } from "./motion-utils.js";
|
|
8
|
+
const DEFAULT_POSITIVE = "url(#candlestick-positive)";
|
|
9
|
+
const DEFAULT_NEGATIVE = "url(#candlestick-negative)";
|
|
10
|
+
const SOLID_POSITIVE = "var(--color-emerald-500)";
|
|
11
|
+
const SOLID_NEGATIVE = "var(--color-red-500)";
|
|
12
|
+
const WICK_WIDTH = 1.5;
|
|
13
|
+
function getSolidColor(isPositive) {
|
|
14
|
+
return isPositive ? SOLID_POSITIVE : SOLID_NEGATIVE;
|
|
15
|
+
}
|
|
16
|
+
function computeGeometries(renderData, xScale, yScale, xAccessor, candleWidth, positiveFill, negativeFill, bodyPatternPositive, bodyPatternNegative, insideStrokeWidth) {
|
|
17
|
+
return renderData.map((d) => {
|
|
18
|
+
const date = xAccessor(d);
|
|
19
|
+
const open = d.open;
|
|
20
|
+
const high = d.high;
|
|
21
|
+
const low = d.low;
|
|
22
|
+
const close = d.close;
|
|
23
|
+
const centerX = xScale(date) ?? 0;
|
|
24
|
+
const yHigh = yScale(high) ?? 0;
|
|
25
|
+
const yLow = yScale(low) ?? 0;
|
|
26
|
+
const yOpen = yScale(open) ?? 0;
|
|
27
|
+
const yClose = yScale(close) ?? 0;
|
|
28
|
+
const bodyTop = Math.min(yOpen, yClose);
|
|
29
|
+
const bodyHeight = Math.abs(yClose - yOpen) || 1;
|
|
30
|
+
const bodyLeft = centerX - candleWidth / 2;
|
|
31
|
+
const wickTop = Math.min(yHigh, yLow);
|
|
32
|
+
const wickHeight = Math.abs(yLow - yHigh) || 1;
|
|
33
|
+
const isPositive = close >= open;
|
|
34
|
+
const fill = isPositive ? positiveFill : negativeFill;
|
|
35
|
+
const bodyPattern = isPositive ? bodyPatternPositive : bodyPatternNegative;
|
|
36
|
+
const hasPatternOverlay = Boolean(bodyPattern);
|
|
37
|
+
const bodySolidFill = hasPatternOverlay ? getSolidColor(isPositive) : fill;
|
|
38
|
+
return {
|
|
39
|
+
time: date.getTime(),
|
|
40
|
+
centerX,
|
|
41
|
+
bodyTop,
|
|
42
|
+
bodyHeight,
|
|
43
|
+
bodyLeft,
|
|
44
|
+
candleWidth,
|
|
45
|
+
wickTop,
|
|
46
|
+
wickHeight,
|
|
47
|
+
wickLeft: centerX - WICK_WIDTH / 2,
|
|
48
|
+
bodySolidFill,
|
|
49
|
+
wickFill: hasPatternOverlay ? bodySolidFill : fill,
|
|
50
|
+
bodyPattern: hasPatternOverlay ? bodyPattern : undefined,
|
|
51
|
+
insideStrokeWidth,
|
|
52
|
+
isPositive,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function geometryDimOpacity(geometry, fadedOpacity, legendHoveredIndex, hoveredTime) {
|
|
57
|
+
if (legendHoveredIndex !== null) {
|
|
58
|
+
const dimFromLegend = (legendHoveredIndex === 0 && !geometry.isPositive) ||
|
|
59
|
+
(legendHoveredIndex === 1 && geometry.isPositive);
|
|
60
|
+
return dimFromLegend ? fadedOpacity : 1;
|
|
61
|
+
}
|
|
62
|
+
if (hoveredTime !== null && geometry.time !== hoveredTime) {
|
|
63
|
+
return fadedOpacity;
|
|
64
|
+
}
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
const CandlestickBody = memo(function CandlestickBody({ geometry }) {
|
|
68
|
+
const { wickLeft, wickTop, wickHeight, wickFill, bodyLeft, bodyTop, bodyHeight, candleWidth, bodySolidFill, bodyPattern, insideStrokeWidth, } = geometry;
|
|
69
|
+
return (_jsxs(_Fragment, { children: [_jsx("rect", { fill: wickFill, height: wickHeight, width: WICK_WIDTH, x: wickLeft, y: wickTop }), _jsx("rect", { fill: bodySolidFill, height: bodyHeight, rx: 1, ry: 1, stroke: bodySolidFill, strokeWidth: 1, width: candleWidth, x: bodyLeft, y: bodyTop }), bodyPattern ? (_jsx("rect", { fill: bodyPattern, height: bodyHeight, rx: 1, ry: 1, width: candleWidth, x: bodyLeft, y: bodyTop })) : null, insideStrokeWidth > 0 ? (_jsx("rect", { fill: "none", height: bodyHeight - insideStrokeWidth, rx: 1, ry: 1, stroke: bodySolidFill, strokeWidth: insideStrokeWidth, width: candleWidth - insideStrokeWidth, x: bodyLeft + insideStrokeWidth / 2, y: bodyTop + insideStrokeWidth / 2 })) : null] }));
|
|
70
|
+
});
|
|
71
|
+
const CandlestickBodies = memo(function CandlestickBodies({ geometries, fadedOpacity, legendHoveredIndex, hoveredTime, }) {
|
|
72
|
+
return (_jsx(_Fragment, { children: geometries.map((geometry) => (_jsx("g", { opacity: geometryDimOpacity(geometry, fadedOpacity, legendHoveredIndex, hoveredTime), style: { transition: "opacity 0.15s ease-in-out" }, children: _jsx(CandlestickBody, { geometry: geometry }) }, geometry.time))) }));
|
|
73
|
+
});
|
|
74
|
+
function AnimatedCandle({ geometry, delay, enterTransition, revealEpoch }) {
|
|
75
|
+
const t = transitionWithDelay(enterTransition, delay);
|
|
76
|
+
const bodyOrigin = `${geometry.centerX}px ${geometry.bodyTop + geometry.bodyHeight / 2}px`;
|
|
77
|
+
const wickCenterY = geometry.wickTop + geometry.wickHeight / 2;
|
|
78
|
+
return (_jsxs(motion.g, { animate: { opacity: 1 }, initial: { opacity: 0 }, style: { transformOrigin: `${geometry.centerX}px ${wickCenterY}px` }, transition: { ...t, opacity: { duration: 0.15 } }, children: [_jsx(motion.rect, { animate: { scaleY: 1 }, fill: geometry.wickFill, height: geometry.wickHeight, initial: { scaleY: 0 }, style: { transformOrigin: `${geometry.centerX}px ${wickCenterY}px` }, transition: t, width: WICK_WIDTH, x: geometry.wickLeft, y: geometry.wickTop }), _jsx(motion.rect, { animate: { scaleY: 1 }, fill: geometry.bodySolidFill, height: geometry.bodyHeight, initial: { scaleY: 0 }, rx: 1, ry: 1, stroke: geometry.bodySolidFill, strokeWidth: 1, style: { transformOrigin: bodyOrigin }, transition: t, width: geometry.candleWidth, x: geometry.bodyLeft, y: geometry.bodyTop }), geometry.bodyPattern ? (_jsx(motion.rect, { animate: { scaleY: 1 }, fill: geometry.bodyPattern, height: geometry.bodyHeight, initial: { scaleY: 0 }, rx: 1, ry: 1, style: { transformOrigin: bodyOrigin }, transition: t, width: geometry.candleWidth, x: geometry.bodyLeft, y: geometry.bodyTop })) : null] }, `candle-enter-${geometry.time}-${revealEpoch}`));
|
|
79
|
+
}
|
|
80
|
+
export function Candlestick({ animate = true, positiveFill = DEFAULT_POSITIVE, negativeFill = DEFAULT_NEGATIVE, bodyPatternPositive, bodyPatternNegative, insideStrokeWidth = 0, fadedOpacity = 0.3, showHoverFade = true, }) {
|
|
81
|
+
const { data, xScale, yScale, xAccessor, animationDuration, enterTransition, revealEpoch = 0, isLoaded, bandWidth, columnWidth, hoveredCandleIndex, } = useChart();
|
|
82
|
+
const { hoveredIndex: legendHoveredIndex } = useChartLegendHover();
|
|
83
|
+
const candleWidth = Math.min(bandWidth ?? columnWidth * 0.8, columnWidth);
|
|
84
|
+
const geometries = useMemo(() => computeGeometries(data, xScale, yScale, xAccessor, candleWidth, positiveFill, negativeFill, bodyPatternPositive, bodyPatternNegative, insideStrokeWidth), [
|
|
85
|
+
data,
|
|
86
|
+
xScale,
|
|
87
|
+
yScale,
|
|
88
|
+
xAccessor,
|
|
89
|
+
candleWidth,
|
|
90
|
+
positiveFill,
|
|
91
|
+
negativeFill,
|
|
92
|
+
bodyPatternPositive,
|
|
93
|
+
bodyPatternNegative,
|
|
94
|
+
insideStrokeWidth,
|
|
95
|
+
]);
|
|
96
|
+
const hoveredTime = useMemo(() => {
|
|
97
|
+
if (hoveredCandleIndex == null) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const point = data[hoveredCandleIndex];
|
|
101
|
+
return point ? xAccessor(point).getTime() : null;
|
|
102
|
+
}, [hoveredCandleIndex, data, xAccessor]);
|
|
103
|
+
const highlightGeometry = useMemo(() => {
|
|
104
|
+
if (hoveredCandleIndex == null) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const point = data[hoveredCandleIndex];
|
|
108
|
+
if (!point) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return (computeGeometries([point], xScale, yScale, xAccessor, candleWidth, positiveFill, negativeFill, bodyPatternPositive, bodyPatternNegative, insideStrokeWidth)[0] ?? null);
|
|
112
|
+
}, [
|
|
113
|
+
hoveredCandleIndex,
|
|
114
|
+
data,
|
|
115
|
+
xScale,
|
|
116
|
+
yScale,
|
|
117
|
+
xAccessor,
|
|
118
|
+
candleWidth,
|
|
119
|
+
positiveFill,
|
|
120
|
+
negativeFill,
|
|
121
|
+
bodyPatternPositive,
|
|
122
|
+
bodyPatternNegative,
|
|
123
|
+
insideStrokeWidth,
|
|
124
|
+
]);
|
|
125
|
+
const defaultEnter = {
|
|
126
|
+
type: "spring",
|
|
127
|
+
duration: 0.8,
|
|
128
|
+
bounce: 0.15,
|
|
129
|
+
};
|
|
130
|
+
const enter = enterTransition ?? defaultEnter;
|
|
131
|
+
const staggerDelayMs = data.length > 0 ? (animationDuration * 0.6) / data.length : 0;
|
|
132
|
+
if (animate && !isLoaded) {
|
|
133
|
+
return (_jsx("g", { className: "chart-candlesticks", children: geometries.map((geometry, index) => (_jsx(AnimatedCandle, { delay: (index * staggerDelayMs) / 1000, enterTransition: enter, geometry: geometry, revealEpoch: revealEpoch }, geometry.time))) }));
|
|
134
|
+
}
|
|
135
|
+
return (_jsxs("g", { className: "chart-candlesticks", children: [_jsx(CandlestickBodies, { fadedOpacity: fadedOpacity, geometries: geometries, hoveredTime: showHoverFade ? hoveredTime : null, legendHoveredIndex: legendHoveredIndex }), highlightGeometry ? (_jsx("g", { children: _jsx(CandlestickBody, { geometry: highlightGeometry }) })) : null] }));
|
|
136
|
+
}
|
|
137
|
+
Candlestick.displayName = "Candlestick";
|
|
138
|
+
export default Candlestick;
|
|
139
|
+
//# sourceMappingURL=candlestick.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BrushHandleRenderProps } from "@visx/brush/lib/BrushHandle";
|
|
2
|
+
import type { ChartBrushOverlayHost } from "./chart-brush-track-overlay.js";
|
|
3
|
+
export declare function renderChartBrushHandle({ x, y, width, height, className }: BrushHandleRenderProps): import("react").JSX.Element;
|
|
4
|
+
export interface ChartBrushHandleOverlayProps {
|
|
5
|
+
innerWidth: number;
|
|
6
|
+
innerHeight: number;
|
|
7
|
+
/** Pixel x of the selection start within the plot area. */
|
|
8
|
+
selectionX0: number;
|
|
9
|
+
/** Pixel x of the selection end within the plot area. */
|
|
10
|
+
selectionX1: number;
|
|
11
|
+
}
|
|
12
|
+
/** Renders brush resize pills above the outside blur portal (`z-[2]`). */
|
|
13
|
+
export declare function ChartBrushHandleOverlayContent({ containerRef, margin, innerWidth, innerHeight, selectionX0, selectionX1, }: ChartBrushHandleOverlayProps & ChartBrushOverlayHost): import("react").ReactPortal | null;
|
|
14
|
+
export declare function ChartBrushHandleOverlay(props: ChartBrushHandleOverlayProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=chart-brush-handle.d.ts.map
|