flikkui 0.1.0-beta.4 → 0.1.0-beta.5

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.
Files changed (146) hide show
  1. package/dist/components/charts/AreaChart/AreaChart.js +434 -0
  2. package/dist/components/charts/AreaChart/AreaChart.types.js +7 -0
  3. package/dist/components/charts/BarChart/BarChart.js +402 -0
  4. package/dist/components/charts/BarChart/BarChart.types.js +7 -0
  5. package/dist/components/charts/ChartContainer.js +38 -0
  6. package/dist/components/charts/Heatmap/Heatmap.js +153 -0
  7. package/dist/components/charts/Heatmap/HeatmapCell.js +100 -0
  8. package/dist/components/charts/Heatmap/HeatmapLegend.js +20 -0
  9. package/dist/components/charts/Heatmap/utils/heatmapUtils.js +174 -0
  10. package/dist/components/charts/LineChart/LineChart.js +396 -0
  11. package/dist/components/charts/LineChart/LineChart.types.js +7 -0
  12. package/dist/components/charts/hooks/useChartAccessibility.js +127 -0
  13. package/dist/components/charts/hooks/useChartTheme.js +86 -0
  14. package/dist/components/charts/hooks/useChartValidation.js +59 -0
  15. package/dist/components/charts/hooks/useTooltipPosition.js +292 -0
  16. package/dist/components/charts/shared/ChartAxis/XAxis.js +30 -0
  17. package/dist/components/charts/shared/ChartAxis/YAxis.js +97 -0
  18. package/dist/components/charts/shared/ChartCrosshair/ChartCrosshair.js +35 -0
  19. package/dist/components/charts/shared/ChartCrosshair/ChartCrosshair.theme.js +11 -0
  20. package/dist/components/charts/shared/ChartErrorBoundary/ChartErrorBoundary.js +66 -0
  21. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +22 -0
  22. package/dist/components/charts/shared/ChartLegend/ChartLegend.js +30 -0
  23. package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +22 -0
  24. package/dist/components/charts/shared/ChartMarker/ChartMarker.js +25 -0
  25. package/dist/components/charts/shared/ChartMarker/ChartMarker.theme.js +9 -0
  26. package/dist/components/charts/shared/ChartText/ChartText.js +33 -0
  27. package/dist/components/charts/shared/ChartText/ChartText.theme.js +9 -0
  28. package/dist/components/charts/shared/ChartTooltip/ChartTooltip.js +62 -0
  29. package/dist/components/charts/theme/chart.theme.js +73 -0
  30. package/dist/components/charts/types/chart.types.js +29 -0
  31. package/dist/components/charts/utils/chart-validation.js +292 -0
  32. package/dist/components/charts/utils/color-utils.js +175 -0
  33. package/dist/components/core/Accordion/Accordion.animations.js +45 -0
  34. package/dist/components/core/Accordion/Accordion.js +52 -0
  35. package/dist/components/core/Accordion/Accordion.theme.js +8 -0
  36. package/dist/components/core/Accordion/AccordionContent.js +25 -0
  37. package/dist/components/core/Accordion/AccordionItem.js +56 -0
  38. package/dist/components/core/Accordion/AccordionTrigger.js +32 -0
  39. package/dist/components/core/Accordion/index.js +5 -0
  40. package/dist/components/core/Avatar/Avatar.js +94 -0
  41. package/dist/components/core/Avatar/Avatar.theme.js +25 -0
  42. package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +79 -0
  43. package/dist/components/core/AvatarGroup/AvatarGroup.js +67 -0
  44. package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +23 -0
  45. package/dist/components/core/Badge/Badge.animations.js +109 -0
  46. package/dist/components/core/Badge/Badge.js +101 -0
  47. package/dist/components/core/Badge/Badge.theme.js +41 -0
  48. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +8 -8
  49. package/dist/components/core/Button/Button.theme.js +5 -5
  50. package/dist/components/core/Card/Card.js +46 -0
  51. package/dist/components/core/Card/Card.theme.js +5 -0
  52. package/dist/components/core/Divider/Divider.js +21 -0
  53. package/dist/components/core/Divider/Divider.theme.js +19 -0
  54. package/dist/components/core/Pagination/Pagination.js +113 -0
  55. package/dist/components/core/Pagination/Pagination.theme.js +27 -0
  56. package/dist/components/core/Segmented/Segmented.js +69 -0
  57. package/dist/components/core/Segmented/Segmented.theme.js +40 -0
  58. package/dist/components/core/Segmented/SegmentedContext.js +8 -0
  59. package/dist/components/core/Segmented/SegmentedItem.js +30 -0
  60. package/dist/components/core/Stepper/Stepper.js +57 -0
  61. package/dist/components/core/Stepper/Stepper.theme.js +9 -0
  62. package/dist/components/core/Stepper/components/ConnectorLine.js +42 -0
  63. package/dist/components/core/Stepper/components/IconCircle.js +44 -0
  64. package/dist/components/core/Stepper/components/ProgressIndicator.js +12 -0
  65. package/dist/components/core/Stepper/components/StepContent.js +36 -0
  66. package/dist/components/core/Stepper/components/StepperItem.js +22 -0
  67. package/dist/components/core/Tabs/Tabs.theme.js +2 -2
  68. package/dist/components/core/Tooltip/Tooltip.animations.js +46 -0
  69. package/dist/components/core/Tooltip/Tooltip.js +85 -0
  70. package/dist/components/core/Tooltip/Tooltip.theme.js +11 -0
  71. package/dist/components/core/Tooltip/useTooltipPositioning.js +59 -0
  72. package/dist/components/core/Tree/Tree.animations.js +38 -0
  73. package/dist/components/core/Tree/Tree.js +177 -0
  74. package/dist/components/core/Tree/Tree.theme.js +11 -0
  75. package/dist/components/data-display/Table/Table.js +177 -0
  76. package/dist/components/data-display/Table/Table.theme.js +28 -0
  77. package/dist/components/data-display/Table/Table.utils.js +28 -0
  78. package/dist/components/data-display/Table/components/DeclarativeComponents.js +123 -0
  79. package/dist/components/data-display/Table/components/TableActions/TableActions.js +56 -0
  80. package/dist/components/data-display/Table/components/TableActions/TableActionsMenu.js +29 -0
  81. package/dist/components/data-display/Table/components/TableColumnManager/TableColumnManager.js +85 -0
  82. package/dist/components/data-display/Table/components/TableColumnManager/TableColumnManager.theme.js +21 -0
  83. package/dist/components/data-display/Table/components/TablePagination/TablePagination.js +51 -0
  84. package/dist/components/data-display/Table/components/TableSelectionHeader/TableSelectionHeader.js +29 -0
  85. package/dist/components/data-display/Table/components/core/TableBody.js +32 -0
  86. package/dist/components/data-display/Table/components/core/TableCell.js +47 -0
  87. package/dist/components/data-display/Table/components/core/TableHeader.js +77 -0
  88. package/dist/components/data-display/Table/components/core/TableRow.js +46 -0
  89. package/dist/components/data-display/Table/index.js +20 -0
  90. package/dist/components/feedback/Alert/Alert.js +36 -0
  91. package/dist/components/feedback/Alert/Alert.theme.js +17 -0
  92. package/dist/components/feedback/ChatMessage/ChatMessage.js +26 -0
  93. package/dist/components/feedback/ChatMessage/ChatMessage.theme.js +16 -0
  94. package/dist/components/feedback/Empty/Empty.js +26 -0
  95. package/dist/components/feedback/Empty/Empty.theme.js +13 -0
  96. package/dist/components/feedback/Notification/Notification.js +41 -0
  97. package/dist/components/feedback/Notification/Notification.theme.js +49 -0
  98. package/dist/components/feedback/Spinner/Spinner.theme.js +3 -3
  99. package/dist/components/feedback/Toast/Toast.animations.js +58 -0
  100. package/dist/components/feedback/Toast/Toast.js +67 -0
  101. package/dist/components/feedback/Toast/Toast.theme.js +18 -0
  102. package/dist/components/feedback/Toast/ToastProvider.js +73 -0
  103. package/dist/components/feedback/Toast/useToast.js +91 -0
  104. package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
  105. package/dist/components/forms/FormLabel/FormLabel.theme.js +2 -2
  106. package/dist/components/forms/Input/Input.theme.js +4 -4
  107. package/dist/components/forms/Radio/Radio.theme.js +2 -2
  108. package/dist/components/forms/Select/Select.js +1 -1
  109. package/dist/components/forms/Select/Select.theme.js +5 -5
  110. package/dist/components/forms/Switch/Switch.theme.js +1 -1
  111. package/dist/components/forms/TimePicker/TimePicker.theme.js +19 -19
  112. package/dist/components/forms/forms.theme.js +8 -8
  113. package/dist/components/navigation/NavItem/NavItem.js +93 -0
  114. package/dist/components/navigation/NavItem/NavItem.theme.js +27 -0
  115. package/dist/components/navigation/Sidebar/Sidebar.js +28 -0
  116. package/dist/components/navigation/Sidebar/Sidebar.theme.js +16 -0
  117. package/dist/components/navigation/Sidebar/SidebarContent.js +12 -0
  118. package/dist/components/navigation/Sidebar/SidebarContext.js +38 -0
  119. package/dist/components/navigation/Sidebar/SidebarFooter.js +11 -0
  120. package/dist/components/navigation/Sidebar/SidebarHeader.js +22 -0
  121. package/dist/components/navigation/Sidebar/SidebarNav.js +11 -0
  122. package/dist/components/navigation/Sidebar/SidebarNavGroup.js +19 -0
  123. package/dist/components/navigation/Sidebar/SidebarToggle.js +26 -0
  124. package/dist/icons/core/TickIcon.js +3 -1
  125. package/dist/index.d.ts +29 -4
  126. package/dist/index.js +64 -4
  127. package/dist/node_modules/@heroicons/react/20/solid/esm/ChevronDownIcon.js +26 -0
  128. package/dist/node_modules/@heroicons/react/24/outline/esm/ChevronDoubleLeftIcon.js +28 -0
  129. package/dist/node_modules/@heroicons/react/24/outline/esm/ChevronDoubleRightIcon.js +28 -0
  130. package/dist/node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js +28 -0
  131. package/dist/node_modules/@heroicons/react/24/outline/esm/Cog6ToothIcon.js +32 -0
  132. package/dist/node_modules/@heroicons/react/24/outline/esm/DocumentIcon.js +28 -0
  133. package/dist/node_modules/@heroicons/react/24/outline/esm/EllipsisVerticalIcon.js +28 -0
  134. package/dist/node_modules/@heroicons/react/24/outline/esm/PlusIcon.js +28 -0
  135. package/dist/node_modules/@heroicons/react/24/solid/esm/ArrowPathIcon.js +26 -0
  136. package/dist/node_modules/@heroicons/react/24/solid/esm/BellIcon.js +26 -0
  137. package/dist/node_modules/@heroicons/react/24/solid/esm/CheckCircleIcon.js +26 -0
  138. package/dist/node_modules/@heroicons/react/24/solid/esm/ExclamationTriangleIcon.js +26 -0
  139. package/dist/node_modules/@heroicons/react/24/solid/esm/InformationCircleIcon.js +26 -0
  140. package/dist/node_modules/@heroicons/react/24/solid/esm/XCircleIcon.js +26 -0
  141. package/dist/node_modules/@heroicons/react/24/solid/esm/XMarkIcon.js +26 -0
  142. package/dist/node_modules/tslib/tslib.es6.js +15 -1
  143. package/dist/utils/dateUtils.js +32 -0
  144. package/dist/utils/debounce.js +21 -0
  145. package/package.json +1 -1
  146. package/dist/styles.css +0 -2
@@ -0,0 +1,434 @@
1
+ import { __rest, __assign, __spreadArray } from '../../../node_modules/tslib/tslib.es6.js';
2
+ import React__default, { useRef, useState, useEffect } from 'react';
3
+ import { cn } from '../../../utils/cn.js';
4
+ import { useChartTheme } from '../hooks/useChartTheme.js';
5
+ import { useTooltipPosition } from '../hooks/useTooltipPosition.js';
6
+ import { useChartAccessibility } from '../hooks/useChartAccessibility.js';
7
+ import { XAxis } from '../shared/ChartAxis/XAxis.js';
8
+ import { YAxis } from '../shared/ChartAxis/YAxis.js';
9
+ import { HorizontalGrid } from '../shared/ChartGrid/HorizontalGrid.js';
10
+ import { ChartTooltip } from '../shared/ChartTooltip/ChartTooltip.js';
11
+ import { ChartMarker } from '../shared/ChartMarker/ChartMarker.js';
12
+ import { ChartCrosshair } from '../shared/ChartCrosshair/ChartCrosshair.js';
13
+ import { getColorValue } from '../utils/color-utils.js';
14
+ import { AREA_CHART_DEFAULTS } from './AreaChart.types.js';
15
+
16
+ // Color configuration for data series
17
+ var getSeriesColorClass = function (index) {
18
+ var colors = [
19
+ "stroke-primary-base fill-primary-base",
20
+ "stroke-warning-base fill-warning-base",
21
+ "stroke-success-base fill-success-base",
22
+ "stroke-error-base fill-error-base",
23
+ ];
24
+ return colors[index % colors.length];
25
+ };
26
+ // Get fill color for gradients - now using comprehensive color mapping
27
+ var getSeriesFillColor = function (index) {
28
+ var colorClasses = [
29
+ "fill-primary-base",
30
+ "fill-warning-base",
31
+ "fill-success-base",
32
+ "fill-error-base",
33
+ ];
34
+ var colorClass = colorClasses[index % colorClasses.length];
35
+ return getColorValue(colorClass);
36
+ };
37
+ // Simplified curve generation
38
+ var generateMonotonePath = function (points) {
39
+ if (points.length === 0)
40
+ return "";
41
+ if (points.length === 1)
42
+ return "M ".concat(points[0].x, " ").concat(points[0].y);
43
+ var path = "M ".concat(points[0].x, " ").concat(points[0].y);
44
+ for (var i = 1; i < points.length; i++) {
45
+ var prev = points[i - 1];
46
+ var curr = points[i];
47
+ // Calculate control points for smooth curve
48
+ var dx = curr.x - prev.x;
49
+ var controlDistance = dx * 0.3;
50
+ var cp1x = prev.x + controlDistance;
51
+ var cp1y = prev.y;
52
+ var cp2x = curr.x - controlDistance;
53
+ var cp2y = curr.y;
54
+ path += " C ".concat(cp1x, " ").concat(cp1y, ", ").concat(cp2x, " ").concat(cp2y, ", ").concat(curr.x, " ").concat(curr.y);
55
+ }
56
+ return path;
57
+ };
58
+ var generateLinearPath = function (points) {
59
+ if (points.length === 0)
60
+ return "";
61
+ var path = "M ".concat(points[0].x, " ").concat(points[0].y);
62
+ for (var i = 1; i < points.length; i++) {
63
+ path += " L ".concat(points[i].x, " ").concat(points[i].y);
64
+ }
65
+ return path;
66
+ };
67
+ // Simple curve implementation
68
+ var generateCurvePath = function (points, curveType) {
69
+ if (curveType === void 0) { curveType = "monotone"; }
70
+ if (points.length === 0)
71
+ return "";
72
+ if (points.length === 1)
73
+ return "M ".concat(points[0].x, " ").concat(points[0].y);
74
+ switch (curveType) {
75
+ case "monotone":
76
+ return generateMonotonePath(points);
77
+ case "linear":
78
+ default:
79
+ return generateLinearPath(points);
80
+ }
81
+ };
82
+ var AreaChart = function (_a) {
83
+ var data = _a.data, config = _a.config,
84
+ // Standardized display props with defaults
85
+ _b = _a.showGrid,
86
+ // Standardized display props with defaults
87
+ showGrid = _b === void 0 ? AREA_CHART_DEFAULTS.showGrid : _b, _c = _a.showXAxis, showXAxis = _c === void 0 ? AREA_CHART_DEFAULTS.showXAxis : _c, _d = _a.showYAxis, showYAxis = _d === void 0 ? AREA_CHART_DEFAULTS.showYAxis : _d, _e = _a.showNullValues, showNullValues = _e === void 0 ? AREA_CHART_DEFAULTS.showNullValues : _e, // NEW!
88
+ propMinValue = _a.minValue, propMaxValue = _a.maxValue, _f = _a.variant, variant = _f === void 0 ? AREA_CHART_DEFAULTS.variant : _f, theme = _a.theme,
89
+ // Standardized visual props with defaults (renamed from area-specific names)
90
+ _g = _a.radius,
91
+ // Standardized visual props with defaults (renamed from area-specific names)
92
+ radius = _g === void 0 ? AREA_CHART_DEFAULTS.radius : _g, // Was dotRadius
93
+ _h = _a.strokeWidth, // Was dotRadius
94
+ strokeWidth = _h === void 0 ? AREA_CHART_DEFAULTS.strokeWidth : _h, _j = _a.curved, curved = _j === void 0 ? AREA_CHART_DEFAULTS.curved : _j, _k = _a.curveType, curveType = _k === void 0 ? AREA_CHART_DEFAULTS.curveType : _k, _l = _a.showDots, showDots = _l === void 0 ? AREA_CHART_DEFAULTS.showDots : _l, _m = _a.fillOpacity, fillOpacity = _m === void 0 ? AREA_CHART_DEFAULTS.fillOpacity : _m, _o = _a.showStroke, showStroke = _o === void 0 ? AREA_CHART_DEFAULTS.showStroke : _o, _p = _a.stacked, stacked = _p === void 0 ? AREA_CHART_DEFAULTS.stacked : _p,
95
+ // Base props
96
+ className = _a.className, title = _a.title, description = _a.description, _q = _a.enableKeyboardNavigation, enableKeyboardNavigation = _q === void 0 ? AREA_CHART_DEFAULTS.enableKeyboardNavigation : _q, children = _a.children, props = __rest(_a, ["data", "config", "showGrid", "showXAxis", "showYAxis", "showNullValues", "minValue", "maxValue", "variant", "theme", "radius", "strokeWidth", "curved", "curveType", "showDots", "fillOpacity", "showStroke", "stacked", "className", "title", "description", "enableKeyboardNavigation", "children"]);
97
+ // Use the new theme system
98
+ var _r = useChartTheme({ config: config, variant: variant, theme: theme }); _r.getSeriesColor; _r.getColorClass; _r.getOpacityClass; _r.getTransitionClass;
99
+ // Legacy support
100
+ _r.getThemeValue;
101
+ var containerRef = useRef(null);
102
+ var _s = useState({ width: 600, height: 400 }), dimensions = _s[0], setDimensions = _s[1];
103
+ var _t = useState(null), hoveredPoint = _t[0], setHoveredPoint = _t[1];
104
+ // Detect if device is mobile/touch
105
+ var isMobile = typeof window !== 'undefined' &&
106
+ ('ontouchstart' in window || navigator.maxTouchPoints > 0);
107
+ // Use the new tooltip positioning hook
108
+ var _u = useTooltipPosition({
109
+ containerRef: containerRef,
110
+ isMobile: isMobile,
111
+ }), tooltipData = _u.tooltipData, tooltipRef = _u.tooltipRef, handleMouseEnter = _u.handleMouseEnter, handleMouseMove = _u.handleMouseMove, handleMouseLeave = _u.handleMouseLeave;
112
+ // Use accessibility hook
113
+ var _v = useChartAccessibility({
114
+ chartType: 'area',
115
+ data: data,
116
+ config: config,
117
+ title: title,
118
+ description: description,
119
+ enableKeyboardNavigation: enableKeyboardNavigation,
120
+ }), chartAccessibilityProps = _v.chartAccessibilityProps, descriptionProps = _v.descriptionProps; _v.focusedElementIndex; _v.isKeyboardMode; var handleMouseInteraction = _v.handleMouseInteraction;
121
+ // Measure container dimensions
122
+ useEffect(function () {
123
+ var updateDimensions = function () {
124
+ if (containerRef.current) {
125
+ var _a = containerRef.current.getBoundingClientRect(), width = _a.width, height = _a.height;
126
+ setDimensions({
127
+ width: width || 600,
128
+ height: height || 400,
129
+ });
130
+ }
131
+ };
132
+ updateDimensions();
133
+ var resizeObserver = new ResizeObserver(updateDimensions);
134
+ if (containerRef.current) {
135
+ resizeObserver.observe(containerRef.current);
136
+ }
137
+ return function () {
138
+ resizeObserver.disconnect();
139
+ };
140
+ }, []);
141
+ // Early return if no data
142
+ if (!data || data.length === 0) {
143
+ return (React__default.createElement("div", __assign({ className: cn("chart-container flex items-center justify-center text-neutral-500", className), role: "img", "aria-label": "Empty area chart" }, props),
144
+ React__default.createElement("span", null, "No data available")));
145
+ }
146
+ // Calculate dimensions
147
+ var margin = {
148
+ top: 0,
149
+ right: 0,
150
+ bottom: showXAxis ? 40 : 0,
151
+ left: showYAxis ? 60 : 0,
152
+ };
153
+ var innerWidth = dimensions.width - margin.left - margin.right;
154
+ var innerHeight = dimensions.height - margin.top - margin.bottom;
155
+ // Get all data keys from config
156
+ var dataKeys = Object.keys(config);
157
+ // Calculate scales
158
+ var rawMaxValue = Math.max.apply(Math, data.map(function (item) {
159
+ return stacked
160
+ ? dataKeys.reduce(function (sum, key) {
161
+ var value = item[key];
162
+ return sum + (typeof value === "number" ? value : 0);
163
+ }, 0)
164
+ : Math.max.apply(Math, dataKeys.map(function (key) {
165
+ var value = item[key];
166
+ return typeof value === "number" ? value : 0;
167
+ }));
168
+ }));
169
+ var minValue = propMinValue !== null && propMinValue !== void 0 ? propMinValue : 0;
170
+ var maxValue = propMaxValue !== null && propMaxValue !== void 0 ? propMaxValue : (function () {
171
+ if (rawMaxValue <= 10)
172
+ return Math.ceil(rawMaxValue);
173
+ if (rawMaxValue <= 100)
174
+ return Math.ceil(rawMaxValue / 5) * 5;
175
+ if (rawMaxValue <= 1000)
176
+ return Math.ceil(rawMaxValue / 50) * 50;
177
+ if (rawMaxValue <= 10000)
178
+ return Math.ceil(rawMaxValue / 500) * 500;
179
+ return Math.ceil(rawMaxValue / 1000) * 1000;
180
+ })();
181
+ // Calculate point position
182
+ var getPointPosition = function (dataIndex, value) {
183
+ // Spread points evenly across the full width
184
+ // First point at left edge (margin.left), last point at right edge (margin.left + innerWidth)
185
+ var x = data.length === 1
186
+ ? margin.left + innerWidth / 2 // Center single point
187
+ : margin.left + (dataIndex / (data.length - 1)) * innerWidth;
188
+ var y = margin.top +
189
+ innerHeight -
190
+ ((value - minValue) / (maxValue - minValue)) * innerHeight;
191
+ return { x: x, y: y };
192
+ };
193
+ // Generate area path with null value handling
194
+ var generateAreaPath = function (key, stackedValues) {
195
+ if (!showNullValues) {
196
+ // Original behavior: skip null values entirely
197
+ var points_1 = [];
198
+ var baselinePoints_1 = [];
199
+ data.forEach(function (item, index) {
200
+ var rawValue = item[key];
201
+ var isNull = rawValue === null || rawValue === undefined;
202
+ var value = isNull ? 0 : typeof rawValue === "number" ? rawValue : 0;
203
+ if (!isNull) {
204
+ var baselineValue = stacked && stackedValues ? stackedValues[index] : minValue;
205
+ var topValue = stacked && stackedValues ? stackedValues[index] + value : value;
206
+ var topPoint = getPointPosition(index, topValue);
207
+ var baselinePoint = getPointPosition(index, baselineValue);
208
+ points_1.push(topPoint);
209
+ baselinePoints_1.push(baselinePoint);
210
+ }
211
+ });
212
+ if (points_1.length === 0)
213
+ return null;
214
+ // Generate the top curve
215
+ var topPath = generateCurvePath(points_1, curved ? curveType : "linear");
216
+ // Generate the baseline (reverse order for proper area closure)
217
+ var reversedBaselinePoints = __spreadArray([], baselinePoints_1, true).reverse();
218
+ var baselinePath = generateCurvePath(reversedBaselinePoints, curved ? curveType : "linear");
219
+ // Create closed area path
220
+ var areaPath = "".concat(topPath, " L ").concat(baselinePoints_1[baselinePoints_1.length - 1].x, " ").concat(baselinePoints_1[baselinePoints_1.length - 1].y, " ").concat(baselinePath.replace('M', 'L'), " Z");
221
+ return {
222
+ areaPath: areaPath,
223
+ linePath: topPath
224
+ };
225
+ }
226
+ else {
227
+ // New behavior: break areas at null values
228
+ var segments_1 = [];
229
+ var currentSegment_1 = { points: [], baselinePoints: [] };
230
+ data.forEach(function (item, index) {
231
+ var rawValue = item[key];
232
+ var isNull = rawValue === null || rawValue === undefined;
233
+ if (isNull) {
234
+ // End current segment and start a new one
235
+ if (currentSegment_1.points.length > 0) {
236
+ segments_1.push(currentSegment_1);
237
+ currentSegment_1 = { points: [], baselinePoints: [] };
238
+ }
239
+ }
240
+ else {
241
+ var value = typeof rawValue === "number" ? rawValue : 0;
242
+ var baselineValue = stacked && stackedValues ? stackedValues[index] : minValue;
243
+ var topValue = stacked && stackedValues ? stackedValues[index] + value : value;
244
+ var topPoint = getPointPosition(index, topValue);
245
+ var baselinePoint = getPointPosition(index, baselineValue);
246
+ currentSegment_1.points.push(topPoint);
247
+ currentSegment_1.baselinePoints.push(baselinePoint);
248
+ }
249
+ });
250
+ // Add the last segment if it has points
251
+ if (currentSegment_1.points.length > 0) {
252
+ segments_1.push(currentSegment_1);
253
+ }
254
+ if (segments_1.length === 0)
255
+ return null;
256
+ // Generate paths for each segment
257
+ var areaPaths_1 = [];
258
+ var linePaths_1 = [];
259
+ segments_1.forEach(function (segment) {
260
+ if (segment.points.length > 0) {
261
+ // Generate the top curve
262
+ var topPath = generateCurvePath(segment.points, curved ? curveType : "linear");
263
+ // Generate the baseline (reverse order for proper area closure)
264
+ var reversedBaselinePoints = __spreadArray([], segment.baselinePoints, true).reverse();
265
+ var baselinePath = generateCurvePath(reversedBaselinePoints, curved ? curveType : "linear");
266
+ // Create closed area path
267
+ var areaPath = "".concat(topPath, " L ").concat(segment.baselinePoints[segment.baselinePoints.length - 1].x, " ").concat(segment.baselinePoints[segment.baselinePoints.length - 1].y, " ").concat(baselinePath.replace('M', 'L'), " Z");
268
+ areaPaths_1.push(areaPath);
269
+ linePaths_1.push(topPath);
270
+ }
271
+ });
272
+ return {
273
+ areaPath: areaPaths_1.join(" "),
274
+ linePath: linePaths_1.join(" ")
275
+ };
276
+ }
277
+ };
278
+ // Calculate stacked values for each data point
279
+ var getStackedValues = function () {
280
+ if (!stacked)
281
+ return {};
282
+ var stackedData = {};
283
+ var cumulativeValues = new Array(data.length).fill(0);
284
+ dataKeys.forEach(function (key) {
285
+ stackedData[key] = __spreadArray([], cumulativeValues, true);
286
+ data.forEach(function (item, index) {
287
+ var rawValue = item[key];
288
+ var value = typeof rawValue === "number" ? rawValue : 0;
289
+ cumulativeValues[index] += value;
290
+ });
291
+ });
292
+ return stackedData;
293
+ };
294
+ var stackedValues = getStackedValues();
295
+ return (React__default.createElement("div", __assign({ ref: containerRef, className: cn("chart-container w-full h-full", className) }, chartAccessibilityProps, { onMouseEnter: handleMouseInteraction, onMouseMove: handleMouseInteraction }, props),
296
+ descriptionProps && React__default.createElement("div", __assign({}, descriptionProps)),
297
+ React__default.createElement("svg", { width: "100%", height: "100%", viewBox: "0 0 ".concat(dimensions.width, " ").concat(dimensions.height), className: "overflow-visible", role: "presentation" },
298
+ React__default.createElement("defs", null,
299
+ React__default.createElement("filter", { id: "area-shadow", x: "-20%", y: "-20%", width: "140%", height: "140%" },
300
+ React__default.createElement("feDropShadow", { dx: "4", dy: "4", stdDeviation: "6", floodOpacity: "0.1", floodColor: "#000000" })),
301
+ dataKeys.map(function (key, keyIndex) {
302
+ var fillColor = getSeriesFillColor(keyIndex);
303
+ return (React__default.createElement("linearGradient", { key: "gradient-".concat(key), id: "area-gradient-".concat(key), x1: "0%", y1: "0%", x2: "0%", y2: "100%" },
304
+ React__default.createElement("stop", { offset: "0%", stopColor: fillColor, stopOpacity: fillOpacity * 0.8 }),
305
+ React__default.createElement("stop", { offset: "100%", stopColor: fillColor, stopOpacity: fillOpacity * 0.05 })));
306
+ }),
307
+ React__default.createElement("linearGradient", { id: "vertical-fade", x1: "0%", y1: "0%", x2: "0%", y2: "100%" },
308
+ React__default.createElement("stop", { offset: "0%", stopColor: "#6b7280", stopOpacity: "0" }),
309
+ React__default.createElement("stop", { offset: "40%", stopColor: "#6b7280", stopOpacity: "0.3" }),
310
+ React__default.createElement("stop", { offset: "50%", stopColor: "#6b7280", stopOpacity: "0.5" }),
311
+ React__default.createElement("stop", { offset: "60%", stopColor: "#6b7280", stopOpacity: "0.3" }),
312
+ React__default.createElement("stop", { offset: "100%", stopColor: "#6b7280", stopOpacity: "0" })),
313
+ React__default.createElement("linearGradient", { id: "horizontal-fade", x1: "0%", y1: "0%", x2: "100%", y2: "0%" },
314
+ React__default.createElement("stop", { offset: "0%", stopColor: "#6b7280", stopOpacity: "0" }),
315
+ React__default.createElement("stop", { offset: "40%", stopColor: "#6b7280", stopOpacity: "0.3" }),
316
+ React__default.createElement("stop", { offset: "50%", stopColor: "#6b7280", stopOpacity: "0.5" }),
317
+ React__default.createElement("stop", { offset: "60%", stopColor: "#6b7280", stopOpacity: "0.3" }),
318
+ React__default.createElement("stop", { offset: "100%", stopColor: "#6b7280", stopOpacity: "0" }))),
319
+ React__default.createElement(HorizontalGrid, { show: showGrid, x: margin.left, y: margin.top, width: innerWidth, height: innerHeight, lineCount: 5 }),
320
+ React__default.createElement(ChartCrosshair, { show: hoveredPoint !== null, x: hoveredPoint !== null ? (data.length === 1
321
+ ? margin.left + innerWidth / 2
322
+ : margin.left + (hoveredPoint.index / (data.length - 1)) * innerWidth) : 0, y: hoveredPoint !== null && dataKeys.length === 1 ? (function () {
323
+ var item = data[hoveredPoint.index];
324
+ var singleKey = dataKeys[0];
325
+ var singleValue = item[singleKey];
326
+ var numValue = typeof singleValue === 'number' ? singleValue : 0;
327
+ return margin.top + innerHeight - ((numValue - minValue) / (maxValue - minValue)) * innerHeight;
328
+ })() : undefined, margin: margin, innerWidth: innerWidth, innerHeight: innerHeight, showHorizontal: dataKeys.length === 1 }),
329
+ React__default.createElement(YAxis, { show: showYAxis, min: minValue, max: maxValue, x: margin.left, y: margin.top, height: innerHeight, showGrid: false, gridWidth: innerWidth, tickFormatter: function (value) {
330
+ if (value >= 1000)
331
+ return "".concat((value / 1000).toFixed(0), "k");
332
+ return value.toString();
333
+ } }),
334
+ React__default.createElement("g", { className: "chart-areas" }, dataKeys.map(function (key, keyIndex) {
335
+ var paths = generateAreaPath(key, stackedValues[key]);
336
+ var colorClass = getSeriesColorClass(keyIndex);
337
+ if (!paths)
338
+ return null;
339
+ return (React__default.createElement("g", { key: key },
340
+ React__default.createElement("path", { d: paths.areaPath, fill: "url(#area-gradient-".concat(key, ")"), className: "transition-all duration-200", filter: "url(#area-shadow)" }),
341
+ showStroke && (React__default.createElement("path", { d: paths.linePath, fill: "none", strokeWidth: strokeWidth, strokeLinecap: "round", className: cn("transition-all duration-200", colorClass.split(' ').find(function (cls) { return cls.startsWith('stroke-'); }) || '') })),
342
+ showDots &&
343
+ data.map(function (item, dataIndex) {
344
+ var rawValue = item[key];
345
+ var isNull = rawValue === null || rawValue === undefined;
346
+ var value = isNull
347
+ ? 0
348
+ : typeof rawValue === "number"
349
+ ? rawValue
350
+ : 0;
351
+ // Don't render dots for null values regardless of showNullValues
352
+ if (isNull)
353
+ return null;
354
+ stacked && stackedValues[key] ? stackedValues[key][dataIndex] : minValue;
355
+ var topValue = stacked && stackedValues[key] ? stackedValues[key][dataIndex] + value : value;
356
+ var _a = getPointPosition(dataIndex, topValue), x = _a.x, y = _a.y;
357
+ (hoveredPoint === null || hoveredPoint === void 0 ? void 0 : hoveredPoint.index) === dataIndex && hoveredPoint.key === key;
358
+ return (React__default.createElement("g", { key: "".concat(key, "-").concat(dataIndex) },
359
+ React__default.createElement(ChartMarker, { cx: x, cy: y, radius: radius, colorClass: colorClass })));
360
+ })));
361
+ })),
362
+ !showDots && hoveredPoint !== null && (React__default.createElement("g", { className: "chart-hover-markers" }, dataKeys.map(function (key, keyIndex) {
363
+ var item = data[hoveredPoint.index];
364
+ var rawValue = item[key];
365
+ var isNull = rawValue === null || rawValue === undefined;
366
+ var value = isNull
367
+ ? 0
368
+ : typeof rawValue === "number"
369
+ ? rawValue
370
+ : 0;
371
+ // Don't render hover markers for null values
372
+ if (isNull)
373
+ return null;
374
+ stacked && stackedValues[key] ? stackedValues[key][hoveredPoint.index] : minValue;
375
+ var topValue = stacked && stackedValues[key] ? stackedValues[key][hoveredPoint.index] + value : value;
376
+ var _a = getPointPosition(hoveredPoint.index, topValue), x = _a.x, y = _a.y;
377
+ var colorClass = getSeriesColorClass(keyIndex);
378
+ return (React__default.createElement(ChartMarker, { key: "hover-".concat(key, "-").concat(hoveredPoint.index), cx: x, cy: y, radius: radius, colorClass: colorClass }));
379
+ }))),
380
+ React__default.createElement("g", { className: "chart-hover-areas" }, data.map(function (item, dataIndex) {
381
+ // Calculate hover area based on new point positioning
382
+ var pointX = data.length === 1
383
+ ? margin.left + innerWidth / 2
384
+ : margin.left + (dataIndex / (data.length - 1)) * innerWidth;
385
+ // Create hover area around each point
386
+ var hoverWidth = data.length === 1 ? innerWidth : innerWidth / (data.length - 1);
387
+ var hoverX = data.length === 1
388
+ ? margin.left
389
+ : Math.max(margin.left, pointX - hoverWidth / 2);
390
+ // Ensure hover area doesn't exceed chart bounds
391
+ var adjustedWidth = data.length === 1
392
+ ? innerWidth
393
+ : Math.min(hoverWidth, margin.left + innerWidth - hoverX);
394
+ return (React__default.createElement("rect", { key: "hover-".concat(dataIndex), x: hoverX, y: margin.top, width: adjustedWidth, height: innerHeight, fill: "transparent", className: "cursor-pointer", onMouseEnter: function (e) {
395
+ setHoveredPoint({ index: dataIndex, key: dataKeys[0] });
396
+ // Create multi-series tooltip data
397
+ var seriesData = dataKeys.map(function (seriesKey, keyIndex) {
398
+ var _a, _b;
399
+ var seriesValue = item[seriesKey];
400
+ var numValue = typeof seriesValue === 'number' ? seriesValue : 0;
401
+ return {
402
+ key: seriesKey,
403
+ label: ((_a = config[seriesKey]) === null || _a === void 0 ? void 0 : _a.label) || seriesKey,
404
+ value: numValue,
405
+ color: ((_b = config[seriesKey]) === null || _b === void 0 ? void 0 : _b.color) || getSeriesFillColor(keyIndex)
406
+ };
407
+ });
408
+ var content = {
409
+ category: item.name || "Category ".concat(dataIndex + 1),
410
+ series: seriesData
411
+ };
412
+ var svgCoordinates = {
413
+ x: pointX,
414
+ y: margin.top + innerHeight / 2,
415
+ dimensions: dimensions
416
+ };
417
+ handleMouseEnter(e, content, svgCoordinates);
418
+ }, onMouseMove: function (e) {
419
+ if ((hoveredPoint === null || hoveredPoint === void 0 ? void 0 : hoveredPoint.index) === dataIndex) {
420
+ var svgCoordinates = {
421
+ x: pointX,
422
+ y: margin.top + innerHeight / 2,
423
+ dimensions: dimensions
424
+ };
425
+ handleMouseMove(e, svgCoordinates);
426
+ }
427
+ }, onMouseLeave: handleMouseLeave }));
428
+ })),
429
+ React__default.createElement(XAxis, { show: showXAxis, data: data, x: margin.left, y: margin.top + innerHeight, width: innerWidth, categoryWidth: innerWidth / data.length, categoryGap: 0 })),
430
+ React__default.createElement(ChartTooltip, { active: !!tooltipData, position: tooltipData ? { x: tooltipData.x, y: tooltipData.y } : { x: 0, y: 0 }, tooltipRef: tooltipRef, content: tooltipData === null || tooltipData === void 0 ? void 0 : tooltipData.content, chartType: "area" }),
431
+ children));
432
+ };
433
+
434
+ export { AreaChart };
@@ -0,0 +1,7 @@
1
+ import { __assign } from '../../../node_modules/tslib/tslib.es6.js';
2
+ import { CHART_DEFAULTS } from '../types/chart.types.js';
3
+
4
+ // Default values using centralized defaults
5
+ var AREA_CHART_DEFAULTS = __assign(__assign({}, CHART_DEFAULTS), { radius: CHART_DEFAULTS.radius, strokeWidth: CHART_DEFAULTS.strokeWidth, curved: CHART_DEFAULTS.curved, curveType: CHART_DEFAULTS.curveType, showDots: CHART_DEFAULTS.showDots, fillOpacity: CHART_DEFAULTS.fillOpacity, showStroke: CHART_DEFAULTS.showStroke, stacked: CHART_DEFAULTS.stacked });
6
+
7
+ export { AREA_CHART_DEFAULTS };