@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,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
|
|
4
|
+
import { Check, ChevronRight, Circle } from "lucide-react";
|
|
5
|
+
import { forwardRef, } from "react";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
/** Non-modal by default — same scroll-lock trap as {@link DropdownMenu}. */
|
|
8
|
+
export function ContextMenu({ modal = false, ...props }) {
|
|
9
|
+
return _jsx(ContextMenuPrimitive.Root, { modal: modal, ...props });
|
|
10
|
+
}
|
|
11
|
+
export const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
|
|
12
|
+
export const ContextMenuGroup = ContextMenuPrimitive.Group;
|
|
13
|
+
export const ContextMenuPortal = ContextMenuPrimitive.Portal;
|
|
14
|
+
export const ContextMenuSub = ContextMenuPrimitive.Sub;
|
|
15
|
+
export const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
|
|
16
|
+
export const ContextMenuSubTrigger = forwardRef(({ className, inset, children, ...props }, ref) => {
|
|
17
|
+
return (_jsxs(ContextMenuPrimitive.SubTrigger, { ref: ref, "data-slot": "context-menu-sub-trigger", className: cn("relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none transition-colors focus:bg-surface-overlay focus:text-fg data-[state=open]:bg-surface-overlay data-[disabled]:opacity-50 data-[disabled]:pointer-events-none [&_svg]:size-4", inset && "ps-8", className), ...props, children: [children, _jsx(ChevronRight, { className: "ms-auto" })] }));
|
|
18
|
+
});
|
|
19
|
+
ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
|
|
20
|
+
export const ContextMenuSubContent = forwardRef(({ className, ...props }, ref) => {
|
|
21
|
+
return (_jsx(ContextMenuPrimitive.SubContent, { ref: ref, "data-slot": "context-menu-sub-content", className: cn("z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border bg-surface-floating p-1 text-fg shadow-lg data-[state=open]:animate-[cronus-pop-in_180ms_var(--ease-out-quart)_both] data-[state=closed]:animate-[cronus-pop-out_140ms_var(--ease-out-quart)_both]", className), ...props }));
|
|
22
|
+
});
|
|
23
|
+
ContextMenuSubContent.displayName = "ContextMenuSubContent";
|
|
24
|
+
export const ContextMenuContent = forwardRef(({ className, ...props }, ref) => {
|
|
25
|
+
return (_jsx(ContextMenuPrimitive.Portal, { children: _jsx(ContextMenuPrimitive.Content, { ref: ref, "data-slot": "context-menu-content", className: cn("z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border bg-surface-floating p-1 text-fg shadow-lg data-[state=open]:animate-[cronus-pop-in_180ms_var(--ease-out-quart)_both] data-[state=closed]:animate-[cronus-pop-out_140ms_var(--ease-out-quart)_both]", className), ...props }) }));
|
|
26
|
+
});
|
|
27
|
+
ContextMenuContent.displayName = "ContextMenuContent";
|
|
28
|
+
export const ContextMenuItem = forwardRef(({ className, inset, ...props }, ref) => {
|
|
29
|
+
return (_jsx(ContextMenuPrimitive.Item, { ref: ref, "data-slot": "context-menu-item", className: cn("relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none transition-colors focus:bg-surface-overlay focus:text-fg data-[disabled]:opacity-50 data-[disabled]:pointer-events-none [&_svg]:size-4", inset && "ps-8", className), ...props }));
|
|
30
|
+
});
|
|
31
|
+
ContextMenuItem.displayName = "ContextMenuItem";
|
|
32
|
+
export const ContextMenuCheckboxItem = forwardRef(({ className, children, checked, ...props }, ref) => {
|
|
33
|
+
return (_jsxs(ContextMenuPrimitive.CheckboxItem, { ref: ref, "data-slot": "context-menu-checkbox-item", checked: checked, className: cn("relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pe-2 ps-8 text-sm outline-none transition-colors focus:bg-surface-overlay focus:text-fg data-[disabled]:opacity-50 data-[disabled]:pointer-events-none [&_svg]:size-4", className), ...props, children: [_jsx("span", { className: "absolute start-2 flex size-4 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(Check, { className: "size-4" }) }) }), children] }));
|
|
34
|
+
});
|
|
35
|
+
ContextMenuCheckboxItem.displayName = "ContextMenuCheckboxItem";
|
|
36
|
+
export const ContextMenuRadioItem = forwardRef(({ className, children, ...props }, ref) => {
|
|
37
|
+
return (_jsxs(ContextMenuPrimitive.RadioItem, { ref: ref, "data-slot": "context-menu-radio-item", className: cn("relative flex cursor-default select-none items-center gap-2 rounded-md py-1.5 pe-2 ps-8 text-sm outline-none transition-colors focus:bg-surface-overlay focus:text-fg data-[disabled]:opacity-50 data-[disabled]:pointer-events-none [&_svg]:size-4", className), ...props, children: [_jsx("span", { className: "absolute start-2 flex size-4 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(Circle, { className: "size-2 fill-current" }) }) }), children] }));
|
|
38
|
+
});
|
|
39
|
+
ContextMenuRadioItem.displayName = "ContextMenuRadioItem";
|
|
40
|
+
export const ContextMenuLabel = forwardRef(({ className, inset, ...props }, ref) => {
|
|
41
|
+
return (_jsx(ContextMenuPrimitive.Label, { ref: ref, "data-slot": "context-menu-label", className: cn("px-2 py-1.5 text-xs text-fg-tertiary", inset && "ps-8", className), ...props }));
|
|
42
|
+
});
|
|
43
|
+
ContextMenuLabel.displayName = "ContextMenuLabel";
|
|
44
|
+
export const ContextMenuSeparator = forwardRef(({ className, ...props }, ref) => {
|
|
45
|
+
return (_jsx(ContextMenuPrimitive.Separator, { ref: ref, "data-slot": "context-menu-separator", className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
|
|
46
|
+
});
|
|
47
|
+
ContextMenuSeparator.displayName = "ContextMenuSeparator";
|
|
48
|
+
export const ContextMenuShortcut = ({ className, ...props }) => {
|
|
49
|
+
return (_jsx("span", { "data-slot": "context-menu-shortcut", className: cn("ms-auto text-xs tracking-widest text-fg-tertiary", className), ...props }));
|
|
50
|
+
};
|
|
51
|
+
ContextMenuShortcut.displayName = "ContextMenuShortcut";
|
|
52
|
+
//# sourceMappingURL=context-menu.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ButtonProps } from "./button.js";
|
|
2
|
+
export interface CopyButtonProps extends Omit<ButtonProps, "value" | "children"> {
|
|
3
|
+
/** Text written to the clipboard when the button is pressed. */
|
|
4
|
+
value: string;
|
|
5
|
+
/** Milliseconds the "copied" state stays visible before reverting. Defaults to 1500. */
|
|
6
|
+
timeout?: number;
|
|
7
|
+
/** Accessible label shown to assistive tech in the idle state. Defaults to "Copy". */
|
|
8
|
+
copyLabel?: string;
|
|
9
|
+
/** Accessible label announced after a successful copy. Defaults to "Copied". */
|
|
10
|
+
copiedLabel?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const CopyButton: import("react").ForwardRefExoticComponent<CopyButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
13
|
+
//# sourceMappingURL=copy-button.d.ts.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, Copy } from "lucide-react";
|
|
4
|
+
import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { Button } from "./button.js";
|
|
7
|
+
/**
|
|
8
|
+
* Write `text` to the clipboard, returning whether it succeeded. Prefers the
|
|
9
|
+
* async Clipboard API and falls back to a temporary textarea + `execCommand`
|
|
10
|
+
* for insecure (http) contexts or browsers without `navigator.clipboard`.
|
|
11
|
+
*/
|
|
12
|
+
async function copyToClipboard(text) {
|
|
13
|
+
if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
|
|
14
|
+
try {
|
|
15
|
+
await navigator.clipboard.writeText(text);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Permission denied or insecure context — fall through to execCommand.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (typeof document === "undefined")
|
|
23
|
+
return false;
|
|
24
|
+
try {
|
|
25
|
+
const textarea = document.createElement("textarea");
|
|
26
|
+
textarea.value = text;
|
|
27
|
+
// Keep it out of view and out of the layout/scroll flow.
|
|
28
|
+
textarea.setAttribute("readonly", "");
|
|
29
|
+
textarea.style.position = "fixed";
|
|
30
|
+
textarea.style.top = "0";
|
|
31
|
+
textarea.style.left = "0";
|
|
32
|
+
textarea.style.opacity = "0";
|
|
33
|
+
textarea.style.pointerEvents = "none";
|
|
34
|
+
document.body.appendChild(textarea);
|
|
35
|
+
textarea.focus();
|
|
36
|
+
textarea.select();
|
|
37
|
+
const ok = document.execCommand("copy");
|
|
38
|
+
document.body.removeChild(textarea);
|
|
39
|
+
return ok;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const CopyButton = forwardRef(({ value, timeout = 1500, copyLabel = "Copy", copiedLabel = "Copied", variant = "ghost", size = "icon", className, onClick, "aria-label": ariaLabel, ...props }, ref) => {
|
|
46
|
+
const [copied, setCopied] = useState(false);
|
|
47
|
+
const timerRef = useRef(null);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
return () => {
|
|
50
|
+
if (timerRef.current)
|
|
51
|
+
clearTimeout(timerRef.current);
|
|
52
|
+
};
|
|
53
|
+
}, []);
|
|
54
|
+
const handleClick = useCallback(async (event) => {
|
|
55
|
+
onClick?.(event);
|
|
56
|
+
if (event.defaultPrevented)
|
|
57
|
+
return;
|
|
58
|
+
const ok = await copyToClipboard(value);
|
|
59
|
+
// Only enter the "copied" state when the write actually succeeded, so we
|
|
60
|
+
// never announce success in an insecure context or when the API is
|
|
61
|
+
// missing and the fallback also fails.
|
|
62
|
+
if (!ok)
|
|
63
|
+
return;
|
|
64
|
+
setCopied(true);
|
|
65
|
+
if (timerRef.current)
|
|
66
|
+
clearTimeout(timerRef.current);
|
|
67
|
+
timerRef.current = setTimeout(() => setCopied(false), timeout);
|
|
68
|
+
}, [onClick, value, timeout]);
|
|
69
|
+
return (_jsxs(Button, { ref: ref, type: "button", "data-slot": "copy-button", "data-copied": copied || undefined, variant: variant, size: size, "aria-label": ariaLabel ?? copyLabel, className: cn(className), onClick: handleClick, ...props, children: [copied ? (_jsx(Check, { className: "text-success", "aria-hidden": "true" })) : (_jsx(Copy, { "aria-hidden": "true" })), _jsx("span", { "aria-live": "polite", className: "sr-only", children: copied ? copiedLabel : "" })] }));
|
|
70
|
+
});
|
|
71
|
+
CopyButton.displayName = "CopyButton";
|
|
72
|
+
//# sourceMappingURL=copy-button.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type HTMLAttributes } from "react";
|
|
2
|
+
/** Visible caption under each unit tile. Override any subset to localize. */
|
|
3
|
+
export interface CountdownLabels {
|
|
4
|
+
days: string;
|
|
5
|
+
hours: string;
|
|
6
|
+
minutes: string;
|
|
7
|
+
seconds: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CountdownProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
|
|
10
|
+
/**
|
|
11
|
+
* The moment the countdown reaches zero: a `Date`, an ISO-8601 string, or an
|
|
12
|
+
* epoch-ms number. An unparsable target keeps the `--` placeholder and never
|
|
13
|
+
* ticks or completes.
|
|
14
|
+
*/
|
|
15
|
+
target: Date | string | number;
|
|
16
|
+
/**
|
|
17
|
+
* Fired exactly once when the countdown reaches zero (immediately after
|
|
18
|
+
* mount when the target is already in the past). Re-arms if `target` later
|
|
19
|
+
* changes to a new future moment.
|
|
20
|
+
*/
|
|
21
|
+
onComplete?: () => void;
|
|
22
|
+
/** Smaller tiles + type for tight spots (toolbars, banners, table cells). */
|
|
23
|
+
compact?: boolean;
|
|
24
|
+
/** Override any subset of the unit captions, e.g. `{ days: "dias" }`. */
|
|
25
|
+
labels?: Partial<CountdownLabels>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A countdown to a target moment, rendered as four `tabular-nums` tiles
|
|
29
|
+
* (days / hours / minutes / seconds) on `bg-surface-raised` with
|
|
30
|
+
* `text-fg-tertiary` captions.
|
|
31
|
+
*
|
|
32
|
+
* How it works: the remaining time is re-derived from `Date.now()` on every
|
|
33
|
+
* tick, and the next tick is scheduled with a `setTimeout` aligned to the next
|
|
34
|
+
* whole-second boundary (`remaining % 1000`), so the display never drifts and
|
|
35
|
+
* wakes up only once per second. State stores whole seconds — sub-second
|
|
36
|
+
* re-computations that land on the same second are free (React bails out of
|
|
37
|
+
* identical state). At zero the timer stops scheduling and `onComplete` fires
|
|
38
|
+
* exactly once (guarded by a ref).
|
|
39
|
+
*
|
|
40
|
+
* Digit motion: each cell's value lives in a span keyed by its text, so a
|
|
41
|
+
* change remounts the span and a `starting:` (`@starting-style`) CSS
|
|
42
|
+
* transition slides it in with a subtle vertical drift + fade — no JS
|
|
43
|
+
* animation, no re-render churn beyond the one-per-second state update.
|
|
44
|
+
* Under `prefers-reduced-motion` the transition is disabled and digits swap
|
|
45
|
+
* instantly.
|
|
46
|
+
*
|
|
47
|
+
* SSR-safe: the server (and the first client paint) renders a stable `--`
|
|
48
|
+
* placeholder in every cell; the real values only appear after mount, so
|
|
49
|
+
* hydration never mismatches on wall-clock time.
|
|
50
|
+
*
|
|
51
|
+
* Accessibility: the root is `role="timer"` with `aria-live="off"` (per the
|
|
52
|
+
* ARIA timer pattern — ticking values should not be announced every second),
|
|
53
|
+
* and the once-a-second remounting tiles are `aria-hidden`. A visually hidden
|
|
54
|
+
* summary sentence built from the same labels gives screen readers a stable,
|
|
55
|
+
* readable value on focus.
|
|
56
|
+
*/
|
|
57
|
+
export declare const Countdown: import("react").ForwardRefExoticComponent<CountdownProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
58
|
+
//# sourceMappingURL=countdown.d.ts.map
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
const DEFAULT_LABELS = {
|
|
6
|
+
days: "days",
|
|
7
|
+
hours: "hours",
|
|
8
|
+
minutes: "min",
|
|
9
|
+
seconds: "sec",
|
|
10
|
+
};
|
|
11
|
+
const UNITS = ["days", "hours", "minutes", "seconds"];
|
|
12
|
+
const SECONDS_PER_MINUTE = 60;
|
|
13
|
+
const SECONDS_PER_HOUR = 3_600;
|
|
14
|
+
const SECONDS_PER_DAY = 86_400;
|
|
15
|
+
/** Shown in every cell until the client clock is known (SSR + first paint). */
|
|
16
|
+
const PLACEHOLDER = "--";
|
|
17
|
+
/** Normalize the accepted target shapes to an epoch-ms number (NaN when unparsable). */
|
|
18
|
+
function toTimestamp(target) {
|
|
19
|
+
return target instanceof Date ? target.getTime() : new Date(target).getTime();
|
|
20
|
+
}
|
|
21
|
+
function splitSeconds(totalSeconds) {
|
|
22
|
+
return {
|
|
23
|
+
days: Math.floor(totalSeconds / SECONDS_PER_DAY),
|
|
24
|
+
hours: Math.floor(totalSeconds / SECONDS_PER_HOUR) % 24,
|
|
25
|
+
minutes: Math.floor(totalSeconds / SECONDS_PER_MINUTE) % 60,
|
|
26
|
+
seconds: totalSeconds % SECONDS_PER_MINUTE,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function pad(value) {
|
|
30
|
+
return String(value).padStart(2, "0");
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A countdown to a target moment, rendered as four `tabular-nums` tiles
|
|
34
|
+
* (days / hours / minutes / seconds) on `bg-surface-raised` with
|
|
35
|
+
* `text-fg-tertiary` captions.
|
|
36
|
+
*
|
|
37
|
+
* How it works: the remaining time is re-derived from `Date.now()` on every
|
|
38
|
+
* tick, and the next tick is scheduled with a `setTimeout` aligned to the next
|
|
39
|
+
* whole-second boundary (`remaining % 1000`), so the display never drifts and
|
|
40
|
+
* wakes up only once per second. State stores whole seconds — sub-second
|
|
41
|
+
* re-computations that land on the same second are free (React bails out of
|
|
42
|
+
* identical state). At zero the timer stops scheduling and `onComplete` fires
|
|
43
|
+
* exactly once (guarded by a ref).
|
|
44
|
+
*
|
|
45
|
+
* Digit motion: each cell's value lives in a span keyed by its text, so a
|
|
46
|
+
* change remounts the span and a `starting:` (`@starting-style`) CSS
|
|
47
|
+
* transition slides it in with a subtle vertical drift + fade — no JS
|
|
48
|
+
* animation, no re-render churn beyond the one-per-second state update.
|
|
49
|
+
* Under `prefers-reduced-motion` the transition is disabled and digits swap
|
|
50
|
+
* instantly.
|
|
51
|
+
*
|
|
52
|
+
* SSR-safe: the server (and the first client paint) renders a stable `--`
|
|
53
|
+
* placeholder in every cell; the real values only appear after mount, so
|
|
54
|
+
* hydration never mismatches on wall-clock time.
|
|
55
|
+
*
|
|
56
|
+
* Accessibility: the root is `role="timer"` with `aria-live="off"` (per the
|
|
57
|
+
* ARIA timer pattern — ticking values should not be announced every second),
|
|
58
|
+
* and the once-a-second remounting tiles are `aria-hidden`. A visually hidden
|
|
59
|
+
* summary sentence built from the same labels gives screen readers a stable,
|
|
60
|
+
* readable value on focus.
|
|
61
|
+
*/
|
|
62
|
+
export const Countdown = forwardRef(({ target, onComplete, compact = false, labels, className, ...props }, ref) => {
|
|
63
|
+
const targetMs = toTimestamp(target);
|
|
64
|
+
// `null` = clock not known yet (server render / first client paint).
|
|
65
|
+
const [remainingSeconds, setRemainingSeconds] = useState(null);
|
|
66
|
+
// Latest callback in a ref so a new inline `onComplete` never restarts the timer.
|
|
67
|
+
const onCompleteRef = useRef(onComplete);
|
|
68
|
+
onCompleteRef.current = onComplete;
|
|
69
|
+
const completedRef = useRef(false);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (Number.isNaN(targetMs)) {
|
|
72
|
+
setRemainingSeconds(null);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// A new target re-arms completion (e.g. extending a sale deadline).
|
|
76
|
+
completedRef.current = false;
|
|
77
|
+
let timeoutId;
|
|
78
|
+
const tick = () => {
|
|
79
|
+
const remaining = Math.max(0, targetMs - Date.now());
|
|
80
|
+
// Ceil so the display reads "1" until the second truly elapses.
|
|
81
|
+
setRemainingSeconds(Math.ceil(remaining / 1_000));
|
|
82
|
+
if (remaining <= 0) {
|
|
83
|
+
if (!completedRef.current) {
|
|
84
|
+
completedRef.current = true;
|
|
85
|
+
onCompleteRef.current?.();
|
|
86
|
+
}
|
|
87
|
+
return; // Stop scheduling — the countdown is over.
|
|
88
|
+
}
|
|
89
|
+
// Wake exactly at the next whole-second boundary (drift-free).
|
|
90
|
+
timeoutId = window.setTimeout(tick, remaining % 1_000 || 1_000);
|
|
91
|
+
};
|
|
92
|
+
tick();
|
|
93
|
+
return () => window.clearTimeout(timeoutId);
|
|
94
|
+
}, [targetMs]);
|
|
95
|
+
const parts = remainingSeconds === null ? null : splitSeconds(remainingSeconds);
|
|
96
|
+
const mergedLabels = { ...DEFAULT_LABELS, ...labels };
|
|
97
|
+
const summary = parts
|
|
98
|
+
? UNITS.map((unit) => `${parts[unit]} ${mergedLabels[unit]}`).join(", ")
|
|
99
|
+
: "Counting down";
|
|
100
|
+
return (_jsxs("div", { ref: ref, "data-slot": "countdown", role: "timer", "aria-live": "off", "data-compact": compact ? "" : undefined, className: cn("inline-flex items-start", compact ? "gap-1" : "gap-1.5", className), ...props, children: [_jsx("span", { className: "sr-only", children: summary }), UNITS.map((unit) => {
|
|
101
|
+
const value = parts ? pad(parts[unit]) : PLACEHOLDER;
|
|
102
|
+
return (_jsxs("div", { "aria-hidden": "true", "data-slot": "countdown-unit", "data-unit": unit, className: cn("flex flex-col items-center rounded-lg border border-border bg-surface-raised shadow-xs", compact ? "min-w-9 px-1.5 py-1" : "min-w-14 gap-0.5 px-2.5 py-2"), children: [_jsx("span", { "data-slot": "countdown-value", className: cn("block overflow-hidden font-semibold text-fg tabular-nums", compact ? "text-sm leading-5" : "text-2xl leading-8"), children: _jsx("span", { className: "block transition-[transform,opacity] duration-300 ease-[var(--ease-out-quart)] starting:-translate-y-1.5 starting:opacity-0 motion-reduce:transition-none motion-reduce:starting:translate-y-0 motion-reduce:starting:opacity-100", children: value }, value) }), _jsx("span", { "data-slot": "countdown-label", className: cn("font-medium uppercase tracking-[0.08em] text-fg-tertiary", compact ? "text-[0.5625rem]" : "text-[0.6875rem]"), children: mergedLabels[unit] })] }, unit));
|
|
103
|
+
})] }));
|
|
104
|
+
});
|
|
105
|
+
Countdown.displayName = "Countdown";
|
|
106
|
+
//# sourceMappingURL=countdown.js.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type HTMLAttributes } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* A single, unified card-entry field group — card number (auto-spaced with live
|
|
4
|
+
* brand detection from the IIN/prefix), expiry (MM/YY auto-slash), and CVC
|
|
5
|
+
* (3–4 digits depending on brand). Values are validated with the Luhn algorithm,
|
|
6
|
+
* a not-in-the-past expiry check, and a brand-correct CVC length, then surfaced
|
|
7
|
+
* through a single `onChange({ number, expiry, cvc, brand, complete, valid })`.
|
|
8
|
+
*
|
|
9
|
+
* Behaviour:
|
|
10
|
+
* - Brand is detected as the user types and rendered as a monochrome glyph; the
|
|
11
|
+
* detected brand is announced to assistive tech via a polite live region.
|
|
12
|
+
* - Focus auto-advances number → expiry → CVC once each field is complete/valid.
|
|
13
|
+
* - CVC is clamped to the brand's length when the brand narrows (Amex → Visa).
|
|
14
|
+
*
|
|
15
|
+
* Performance / a11y:
|
|
16
|
+
* - Brand detection and validation are pure and memoised; no timers, intervals,
|
|
17
|
+
* or RAF are used, so there is nothing to leak on unmount.
|
|
18
|
+
* - The group is labelled; each field carries its own `aria-label`, and the
|
|
19
|
+
* valid-state check icon transition is disabled under `prefers-reduced-motion`.
|
|
20
|
+
*
|
|
21
|
+
* @remarks SECURITY: this is a **display-side formatter/validator only** — it is
|
|
22
|
+
* NOT a PCI vault. It never stores, logs, autofill-persists, or transmits the
|
|
23
|
+
* PAN/CVC. Autocomplete is disabled and no `name` attributes are emitted. Send
|
|
24
|
+
* card data straight to a compliant tokenizer (e.g. a payment iframe/SDK); do
|
|
25
|
+
* not read it back out of `onChange` into your own persistence or telemetry.
|
|
26
|
+
*/
|
|
27
|
+
/** A payment network detected from the card's IIN/prefix. */
|
|
28
|
+
export type CardBrand = "visa" | "mastercard" | "amex" | "elo" | "discover" | "unknown";
|
|
29
|
+
/** The parsed, validated snapshot emitted by {@link CreditCardInput} `onChange`. */
|
|
30
|
+
export interface CreditCardValue {
|
|
31
|
+
/** Digits only, no spaces (the raw PAN — treat as sensitive). */
|
|
32
|
+
number: string;
|
|
33
|
+
/** Expiry formatted as `MM/YY` (or a partial as typed). */
|
|
34
|
+
expiry: string;
|
|
35
|
+
/** The security code digits. */
|
|
36
|
+
cvc: string;
|
|
37
|
+
/** Payment network inferred from the prefix, or `"unknown"`. */
|
|
38
|
+
brand: CardBrand;
|
|
39
|
+
/** All three fields have a plausible, complete length for the brand. */
|
|
40
|
+
complete: boolean;
|
|
41
|
+
/** Passes Luhn + non-past expiry + brand-correct CVC length. */
|
|
42
|
+
valid: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface CreditCardInputProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
45
|
+
/** Accessible group label announced to assistive tech. @default "Credit card" */
|
|
46
|
+
label?: string;
|
|
47
|
+
/** Uncontrolled initial card number (digits or already-spaced). */
|
|
48
|
+
defaultNumber?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Fires on every keystroke with the parsed, validated card value.
|
|
51
|
+
* Display-side only — do not persist, log, or transmit the raw PAN/CVC.
|
|
52
|
+
*/
|
|
53
|
+
onChange?: (value: CreditCardValue) => void;
|
|
54
|
+
/** Forces the invalid styling and sets `aria-invalid` on every field. */
|
|
55
|
+
invalid?: boolean;
|
|
56
|
+
/** Disables all three fields. */
|
|
57
|
+
disabled?: boolean;
|
|
58
|
+
/** Optional error message rendered under the group with `role="alert"`. */
|
|
59
|
+
error?: string;
|
|
60
|
+
}
|
|
61
|
+
export declare const CreditCardInput: import("react").ForwardRefExoticComponent<CreditCardInputProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
62
|
+
//# sourceMappingURL=credit-card-input.d.ts.map
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, CreditCard } from "lucide-react";
|
|
4
|
+
import { forwardRef, useEffect, useId, useMemo, useRef, useState, } from "react";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
// Order matters — the first matching pattern wins. Elo (Brazilian) borrows ranges
|
|
7
|
+
// from Visa/Discover, so it must be tested before them.
|
|
8
|
+
const CARD_TYPES = [
|
|
9
|
+
{
|
|
10
|
+
brand: "elo",
|
|
11
|
+
label: "Elo",
|
|
12
|
+
pattern: /^(4011|4312|4389|4514|4576|5041|5066|5067|509|6277|6362|6363|650|651|655)/,
|
|
13
|
+
lengths: [16],
|
|
14
|
+
cvc: [3],
|
|
15
|
+
gaps: [4, 8, 12],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
brand: "amex",
|
|
19
|
+
label: "American Express",
|
|
20
|
+
pattern: /^3[47]/,
|
|
21
|
+
lengths: [15],
|
|
22
|
+
cvc: [4],
|
|
23
|
+
gaps: [4, 10],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
brand: "mastercard",
|
|
27
|
+
label: "Mastercard",
|
|
28
|
+
pattern: /^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)/,
|
|
29
|
+
lengths: [16],
|
|
30
|
+
cvc: [3],
|
|
31
|
+
gaps: [4, 8, 12],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
brand: "visa",
|
|
35
|
+
label: "Visa",
|
|
36
|
+
pattern: /^4/,
|
|
37
|
+
lengths: [16, 19],
|
|
38
|
+
cvc: [3],
|
|
39
|
+
gaps: [4, 8, 12],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
brand: "discover",
|
|
43
|
+
label: "Discover",
|
|
44
|
+
pattern: /^(6011|64[4-9]|65|622)/,
|
|
45
|
+
lengths: [16, 19],
|
|
46
|
+
cvc: [3],
|
|
47
|
+
gaps: [4, 8, 12],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
const UNKNOWN_CARD = {
|
|
51
|
+
brand: "unknown",
|
|
52
|
+
label: "Card",
|
|
53
|
+
pattern: /.*/,
|
|
54
|
+
lengths: [16, 19],
|
|
55
|
+
cvc: [3, 4],
|
|
56
|
+
gaps: [4, 8, 12],
|
|
57
|
+
};
|
|
58
|
+
function getCardType(digits) {
|
|
59
|
+
if (!digits)
|
|
60
|
+
return UNKNOWN_CARD;
|
|
61
|
+
for (const type of CARD_TYPES) {
|
|
62
|
+
if (type.pattern.test(digits))
|
|
63
|
+
return type;
|
|
64
|
+
}
|
|
65
|
+
return UNKNOWN_CARD;
|
|
66
|
+
}
|
|
67
|
+
/** Standard Luhn checksum over a digit string. */
|
|
68
|
+
function luhnValid(digits) {
|
|
69
|
+
if (digits.length < 12)
|
|
70
|
+
return false;
|
|
71
|
+
let sum = 0;
|
|
72
|
+
let double = false;
|
|
73
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
74
|
+
let d = digits.charCodeAt(i) - 48;
|
|
75
|
+
if (double) {
|
|
76
|
+
d *= 2;
|
|
77
|
+
if (d > 9)
|
|
78
|
+
d -= 9;
|
|
79
|
+
}
|
|
80
|
+
sum += d;
|
|
81
|
+
double = !double;
|
|
82
|
+
}
|
|
83
|
+
return sum % 10 === 0;
|
|
84
|
+
}
|
|
85
|
+
function formatNumber(digits, gaps) {
|
|
86
|
+
let out = "";
|
|
87
|
+
for (let i = 0; i < digits.length; i++) {
|
|
88
|
+
if (i > 0 && gaps.includes(i))
|
|
89
|
+
out += " ";
|
|
90
|
+
out += digits[i];
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
function formatExpiry(digits) {
|
|
95
|
+
if (digits.length >= 2)
|
|
96
|
+
return `${digits.slice(0, 2)}/${digits.slice(2, 4)}`;
|
|
97
|
+
return digits;
|
|
98
|
+
}
|
|
99
|
+
/** True when a 4-digit `MMYY` string is a real month and not in the past. */
|
|
100
|
+
function expiryNotPast(digits) {
|
|
101
|
+
if (digits.length !== 4)
|
|
102
|
+
return false;
|
|
103
|
+
const mm = Number(digits.slice(0, 2));
|
|
104
|
+
const yy = Number(digits.slice(2, 4));
|
|
105
|
+
if (mm < 1 || mm > 12)
|
|
106
|
+
return false;
|
|
107
|
+
const now = new Date();
|
|
108
|
+
const curYY = now.getFullYear() % 100;
|
|
109
|
+
const curMM = now.getMonth() + 1;
|
|
110
|
+
if (yy < curYY)
|
|
111
|
+
return false;
|
|
112
|
+
if (yy === curYY && mm < curMM)
|
|
113
|
+
return false;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
function BrandGlyph({ brand }) {
|
|
117
|
+
const box = "h-5 w-8 shrink-0 text-fg-secondary transition-opacity duration-200 ease-[var(--ease-out-quart)] motion-reduce:transition-none";
|
|
118
|
+
switch (brand) {
|
|
119
|
+
case "visa":
|
|
120
|
+
return (_jsx("svg", { viewBox: "0 0 32 20", "aria-hidden": "true", className: cn(box, "font-display"), children: _jsx("text", { x: "16", y: "15", textAnchor: "middle", fontSize: "10", fontStyle: "italic", fontWeight: "800", letterSpacing: "0.4", fill: "currentColor", children: "VISA" }) }));
|
|
121
|
+
case "mastercard":
|
|
122
|
+
return (_jsxs("svg", { viewBox: "0 0 32 20", "aria-hidden": "true", className: box, children: [_jsx("circle", { cx: "12", cy: "10", r: "6.5", fill: "currentColor", opacity: "0.9" }), _jsx("circle", { cx: "20", cy: "10", r: "6.5", fill: "currentColor", opacity: "0.45" })] }));
|
|
123
|
+
case "amex":
|
|
124
|
+
return (_jsx("svg", { viewBox: "0 0 32 20", "aria-hidden": "true", className: cn(box, "font-display"), children: _jsx("text", { x: "16", y: "14", textAnchor: "middle", fontSize: "8", fontWeight: "800", letterSpacing: "0.3", fill: "currentColor", children: "AMEX" }) }));
|
|
125
|
+
case "elo":
|
|
126
|
+
return (_jsx("svg", { viewBox: "0 0 32 20", "aria-hidden": "true", className: cn(box, "font-display"), children: _jsx("text", { x: "16", y: "15", textAnchor: "middle", fontSize: "11", fontWeight: "800", letterSpacing: "0.2", fill: "currentColor", children: "elo" }) }));
|
|
127
|
+
case "discover":
|
|
128
|
+
return (_jsxs("svg", { viewBox: "0 0 32 20", "aria-hidden": "true", className: cn(box, "font-display"), children: [_jsx("text", { x: "12", y: "14", textAnchor: "middle", fontSize: "8", fontWeight: "800", fill: "currentColor", children: "DISC" }), _jsx("circle", { cx: "26", cy: "10", r: "3.2", fill: "currentColor" })] }));
|
|
129
|
+
default:
|
|
130
|
+
return _jsx(CreditCard, { "aria-hidden": true, className: cn(box, "p-0.5") });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export const CreditCardInput = forwardRef(({ className, label = "Credit card", defaultNumber, onChange, invalid = false, disabled = false, error, ...props }, ref) => {
|
|
134
|
+
const [numberDigits, setNumberDigits] = useState(() => (defaultNumber ?? "").replace(/\D/g, "").slice(0, 19));
|
|
135
|
+
const [expiryDigits, setExpiryDigits] = useState("");
|
|
136
|
+
const [cvcDigits, setCvcDigits] = useState("");
|
|
137
|
+
const expiryInputRef = useRef(null);
|
|
138
|
+
const cvcInputRef = useRef(null);
|
|
139
|
+
const numberInputRef = useRef(null);
|
|
140
|
+
const prevExpiry = useRef("");
|
|
141
|
+
const onChangeRef = useRef(onChange);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
onChangeRef.current = onChange;
|
|
144
|
+
});
|
|
145
|
+
const errorId = useId();
|
|
146
|
+
const isInvalid = invalid || Boolean(error);
|
|
147
|
+
const cardType = useMemo(() => getCardType(numberDigits), [numberDigits]);
|
|
148
|
+
const maxCvc = Math.max(...cardType.cvc);
|
|
149
|
+
// Narrow the CVC to the brand's length when the brand changes (e.g. Amex→Visa).
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
setCvcDigits((c) => (c.length > maxCvc ? c.slice(0, maxCvc) : c));
|
|
152
|
+
}, [maxCvc]);
|
|
153
|
+
const value = useMemo(() => {
|
|
154
|
+
const numberComplete = cardType.lengths.includes(numberDigits.length);
|
|
155
|
+
const cvcComplete = cardType.cvc.includes(cvcDigits.length);
|
|
156
|
+
const expiryComplete = expiryDigits.length === 4;
|
|
157
|
+
const complete = numberComplete && cvcComplete && expiryComplete;
|
|
158
|
+
const valid = complete && luhnValid(numberDigits) && expiryNotPast(expiryDigits) && cvcComplete;
|
|
159
|
+
return {
|
|
160
|
+
number: numberDigits,
|
|
161
|
+
expiry: formatExpiry(expiryDigits),
|
|
162
|
+
cvc: cvcDigits,
|
|
163
|
+
brand: cardType.brand,
|
|
164
|
+
complete,
|
|
165
|
+
valid,
|
|
166
|
+
};
|
|
167
|
+
}, [numberDigits, expiryDigits, cvcDigits, cardType]);
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
onChangeRef.current?.(value);
|
|
170
|
+
}, [value]);
|
|
171
|
+
const handleNumberChange = (event) => {
|
|
172
|
+
let digits = event.target.value.replace(/\D/g, "");
|
|
173
|
+
const type = getCardType(digits);
|
|
174
|
+
digits = digits.slice(0, Math.max(...type.lengths));
|
|
175
|
+
setNumberDigits(digits);
|
|
176
|
+
if (type.lengths.includes(digits.length) && luhnValid(digits)) {
|
|
177
|
+
expiryInputRef.current?.focus();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const handleExpiryChange = (event) => {
|
|
181
|
+
let raw = event.target.value;
|
|
182
|
+
// Break the auto-slash backspace trap: if the previously rendered value ended
|
|
183
|
+
// in "/" and the user deleted a char landing on the month, drop a month digit
|
|
184
|
+
// instead of re-inserting the separator.
|
|
185
|
+
if (prevExpiry.current.endsWith("/") && raw === prevExpiry.current.slice(0, -1)) {
|
|
186
|
+
raw = raw.slice(0, -1);
|
|
187
|
+
}
|
|
188
|
+
let digits = raw.replace(/\D/g, "").slice(0, 4);
|
|
189
|
+
if (digits.length === 1 && Number(digits) > 1)
|
|
190
|
+
digits = `0${digits}`;
|
|
191
|
+
prevExpiry.current = formatExpiry(digits);
|
|
192
|
+
setExpiryDigits(digits);
|
|
193
|
+
if (expiryNotPast(digits)) {
|
|
194
|
+
cvcInputRef.current?.focus();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
const handleCvcChange = (event) => {
|
|
198
|
+
setCvcDigits(event.target.value.replace(/\D/g, "").slice(0, maxCvc));
|
|
199
|
+
};
|
|
200
|
+
const focusNumberOnPadding = (event) => {
|
|
201
|
+
if (event.target === event.currentTarget) {
|
|
202
|
+
event.preventDefault();
|
|
203
|
+
numberInputRef.current?.focus();
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const fieldClass = "bg-transparent tabular-nums text-fg outline-none placeholder:text-fg-tertiary disabled:cursor-not-allowed";
|
|
207
|
+
const brandAnnounce = cardType.brand === "unknown" ? "" : `${cardType.label} card`;
|
|
208
|
+
return (_jsxs("div", { ref: ref, "data-slot": "credit-card-input", className: cn("flex w-full flex-col gap-1.5", className), ...props, children: [_jsxs("fieldset", { disabled: disabled, "data-invalid": isInvalid || undefined, "data-brand": cardType.brand, onMouseDown: disabled ? undefined : focusNumberOnPadding, className: cn("m-0 flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 rounded-xl border border-border bg-surface-inset px-3.5 py-2.5 text-sm text-fg shadow-xs", "transition-[border-color,box-shadow] duration-150 ease-[var(--ease-out-quart)]", "focus-within:border-primary focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-surface-base", "data-[invalid=true]:border-error data-[invalid=true]:focus-within:ring-error/30", "disabled:opacity-60"), children: [_jsx("legend", { className: "sr-only", children: label }), _jsx("span", { className: "sr-only", "aria-live": "polite", children: brandAnnounce }), _jsx(BrandGlyph, { brand: cardType.brand }), _jsx("input", { ref: numberInputRef, type: "text", inputMode: "numeric", autoComplete: "off", autoCorrect: "off", spellCheck: false, "aria-label": "Card number", "aria-invalid": isInvalid || undefined, "aria-describedby": error ? errorId : undefined, placeholder: cardType.brand === "amex" ? "0000 000000 00000" : "0000 0000 0000 0000", value: formatNumber(numberDigits, cardType.gaps), onChange: handleNumberChange, className: cn(fieldClass, "min-w-[11ch] flex-1 tracking-[0.02em]") }), _jsx("input", { ref: expiryInputRef, type: "text", inputMode: "numeric", autoComplete: "off", autoCorrect: "off", spellCheck: false, "aria-label": "Expiration date, M M slash Y Y", "aria-invalid": isInvalid || undefined, placeholder: "MM/YY", value: formatExpiry(expiryDigits), onChange: handleExpiryChange, className: cn(fieldClass, "w-[3.25rem] shrink-0") }), _jsx("input", { ref: cvcInputRef, type: "text", inputMode: "numeric", autoComplete: "off", autoCorrect: "off", spellCheck: false, "aria-label": `Security code, ${maxCvc} digits`, "aria-invalid": isInvalid || undefined, placeholder: maxCvc === 4 ? "CVV" : "CVC", value: cvcDigits, onChange: handleCvcChange, className: cn(fieldClass, "w-[3rem] shrink-0") }), _jsx(Check, { "aria-hidden": true, className: cn("size-4 shrink-0 text-success transition-[opacity,transform] duration-200 ease-[var(--ease-out-quart)] motion-reduce:transition-none", value.valid ? "scale-100 opacity-100" : "scale-75 opacity-0") })] }), error ? (_jsx("p", { id: errorId, role: "alert", className: "text-xs text-error-strong", children: error })) : null] }));
|
|
209
|
+
});
|
|
210
|
+
CreditCardInput.displayName = "CreditCardInput";
|
|
211
|
+
//# sourceMappingURL=credit-card-input.js.map
|