@flikk/ui 1.0.0-beta.8 → 1.0.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ai/ApprovalCard/ApprovalCard.js +1 -1
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +2 -2
- package/dist/components/ai/PromptInput/PromptInput.js +2 -2
- package/dist/components/ai/PromptInput/PromptInput.theme.js +1 -1
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +1 -1
- package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +6 -6
- package/dist/components/ai/StreamingResponse/StreamingResponse.theme.js +4 -4
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.theme.js +2 -2
- package/dist/components/ai/TokenCounter/TokenCounter.theme.js +6 -6
- package/dist/components/charts/ActivityRings/ActivityRings.js +1 -1
- package/dist/components/charts/ActivityRings/ActivityRings.theme.js +2 -2
- package/dist/components/charts/BarChart/BarChart.js +3 -3
- package/dist/components/charts/ChartContainer.js +1 -1
- package/dist/components/charts/ComboChart/ComboChart.js +2 -2
- package/dist/components/charts/DonutChart/DonutChart.theme.js +1 -1
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +1 -1
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.theme.js +1 -1
- package/dist/components/charts/FunnelChart/FunnelChart.js +7 -7
- package/dist/components/charts/Heatmap/Heatmap.theme.js +1 -1
- package/dist/components/charts/Heatmap/HeatmapCell.js +1 -1
- package/dist/components/charts/Heatmap/HeatmapLegend.js +1 -1
- package/dist/components/charts/RadarChart/RadarChart.theme.js +2 -2
- package/dist/components/charts/ScatterPlot/ScatterPlot.js +1 -1
- package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +2 -2
- package/dist/components/charts/StackedBarChart/StackedBarChart.js +2 -2
- package/dist/components/charts/shared/ChartErrorBoundary/ChartErrorBoundary.js +1 -1
- package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +1 -1
- package/dist/components/charts/shared/ChartText/ChartText.js +1 -1
- package/dist/components/charts/shared/ChartText/ChartText.theme.js +1 -1
- package/dist/components/charts/shared/ChartTooltip/ChartTooltip.theme.js +4 -4
- package/dist/components/core/Alert/Alert.theme.js +1 -1
- package/dist/components/core/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/core/Avatar/Avatar.theme.js +5 -5
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +1 -1
- package/dist/components/core/Badge/Badge.theme.js +2 -2
- package/dist/components/core/Breadcrumbs/Breadcrumbs.js +1 -1
- package/dist/components/core/Button/Button.theme.js +6 -6
- package/dist/components/core/ButtonGroup/ButtonGroup.theme.js +1 -1
- package/dist/components/core/Calendar/Calendar.js +1 -1
- package/dist/components/core/Calendar/Calendar.theme.js +5 -5
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +1 -1
- package/dist/components/core/Card/Card.theme.js +2 -2
- package/dist/components/core/CommandPalette/CommandItem.js +1 -1
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +3 -3
- package/dist/components/core/ContextMenu/ContextMenu.theme.js +3 -3
- package/dist/components/core/ContextMenu/ContextMenuItem.js +1 -1
- package/dist/components/core/Drawer/Drawer.theme.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.theme.js +1 -1
- package/dist/components/core/Empty/Empty.theme.js +2 -2
- package/dist/components/core/Kbd/Kbd.theme.js +3 -3
- package/dist/components/core/Loader/Loader.theme.js +1 -1
- package/dist/components/core/MenuItem/MenuItem.theme.js +2 -2
- package/dist/components/core/Message/Message.js +1 -1
- package/dist/components/core/Message/Message.theme.js +4 -4
- package/dist/components/core/Modal/Modal.theme.js +2 -2
- package/dist/components/core/NavItem/NavItem.js +1 -1
- package/dist/components/core/NavItem/NavItem.theme.js +1 -1
- package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +2 -2
- package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
- package/dist/components/core/Pagination/Pagination.theme.js +2 -2
- package/dist/components/core/Pill/Pill.theme.js +3 -3
- package/dist/components/core/Progress/Progress.theme.js +2 -2
- package/dist/components/core/Segmented/Segmented.theme.js +3 -3
- package/dist/components/core/Sidebar/SidebarNavGroup.js +1 -1
- package/dist/components/core/Tabs/Tabs.theme.js +2 -2
- package/dist/components/core/Tag/Tag.theme.js +2 -2
- package/dist/components/core/Toast/Toast.theme.js +4 -4
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/Tree/Tree.theme.js +1 -1
- package/dist/components/data-display/DescriptionList/DescriptionList.theme.js +2 -2
- package/dist/components/data-display/Feed/Feed.js +1 -1
- package/dist/components/data-display/Feed/Feed.theme.js +2 -2
- package/dist/components/data-display/GanttChart/GanttChart.theme.js +2 -2
- package/dist/components/data-display/GanttChart/GanttChartPanel.js +1 -1
- package/dist/components/data-display/GanttChart/GanttMilestone.js +2 -2
- package/dist/components/data-display/GanttChart/GanttTableGroupRow.js +1 -1
- package/dist/components/data-display/GanttChart/GanttTaskBar.js +2 -2
- package/dist/components/data-display/KPI/KPI.js +1 -1
- package/dist/components/data-display/KPI/KPI.theme.js +7 -7
- package/dist/components/data-display/Metric/Metric.js +1 -1
- package/dist/components/data-display/Metric/Metric.theme.js +7 -7
- package/dist/components/data-display/Table/Table.theme.js +3 -3
- package/dist/components/data-display/Table/TableActionsMenu.js +1 -1
- package/dist/components/data-display/Table/TableColumnManager.js +1 -1
- package/dist/components/data-display/Table/TableFilter.js +3 -3
- package/dist/components/data-display/Table/TableHeader.js +1 -1
- package/dist/components/data-display/Table/TablePagination.js +1 -1
- package/dist/components/data-display/Table/TableSelectionHeader.js +1 -1
- package/dist/components/effects/CustomCursor/CustomCursor.js +1 -1
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +1 -1
- package/dist/components/effects/StickyScroll/StickyScroll.js +1 -1
- package/dist/components/forms/Checkbox/Checkbox.theme.js +3 -3
- package/dist/components/forms/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/forms/ColorPicker/ColorPicker.theme.js +1 -1
- package/dist/components/forms/ColorPicker/ColorPickerInput.js +7 -7
- package/dist/components/forms/CronInput/CronInput.js +1 -1
- package/dist/components/forms/CronInput/CronInput.theme.js +8 -8
- package/dist/components/forms/DatePicker/DatePicker.theme.js +1 -1
- package/dist/components/forms/DatePicker/DatePickerContent.js +1 -1
- package/dist/components/forms/FileUpload/FileUpload.js +2 -2
- package/dist/components/forms/FileUpload/FileUpload.theme.js +4 -4
- package/dist/components/forms/FormLabel/FormLabel.theme.js +1 -1
- package/dist/components/forms/Input/Input.theme.js +1 -1
- package/dist/components/forms/InputCounter/InputCounter.theme.js +1 -1
- package/dist/components/forms/InputOTP/InputOTP.theme.js +1 -1
- package/dist/components/forms/InputTag/InputTag.js +1 -1
- package/dist/components/forms/Mention/Mention.theme.js +3 -3
- package/dist/components/forms/Radio/Radio.theme.js +3 -3
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +2 -2
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +1 -1
- package/dist/components/forms/Select/Select.theme.js +1 -1
- package/dist/components/forms/Signature/Signature.theme.js +1 -1
- package/dist/components/forms/Slider/Slider.theme.js +3 -3
- package/dist/components/forms/Switch/Switch.theme.js +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +2 -2
- package/dist/components/forms/TransferList/TransferList.js +2 -2
- package/dist/components/forms/TransferList/TransferList.theme.js +6 -6
- package/dist/components/forms/forms.theme.js +6 -6
- package/dist/components/layout/FormLayout/FormLayout.theme.js +4 -4
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/styles/theme.css +0 -17
|
@@ -9,7 +9,7 @@ import { cn } from '../../../utils/cn.js';
|
|
|
9
9
|
const ApprovalCard = ({ title, subtitle, variant = "default", riskLevel = "medium", onApprove, onDeny, children, isApproving = false, className, }) => {
|
|
10
10
|
const riskColor = approvalCardTheme.badgeColors[riskLevel];
|
|
11
11
|
const riskIcon = riskLevel === "critical" || riskLevel === "high" ? (jsx(ExclamationTriangleIcon, { className: "" })) : (jsx(CheckCircleIcon, { className: "" }));
|
|
12
|
-
return (jsxs(Card, { className: cn(approvalCardTheme.baseStyle, approvalCardTheme.variants[variant], className), children: [jsx(Card.Header, { children: jsx("div", { className: "flex flex-col items-start", children: jsxs(Badge, { variant: "outline", color: riskColor, size: "sm", iconStart: riskIcon, className: "font-semibold shadow", children: [riskLevel.toUpperCase(), " RISK"] }) }) }), jsxs(Card.Content, { className: "space-y-3", children: [jsxs("div", { className: "space-y-1", children: [jsx(Card.Title, { className: "text-
|
|
12
|
+
return (jsxs(Card, { className: cn(approvalCardTheme.baseStyle, approvalCardTheme.variants[variant], className), children: [jsx(Card.Header, { children: jsx("div", { className: "flex flex-col items-start", children: jsxs(Badge, { variant: "outline", color: riskColor, size: "sm", iconStart: riskIcon, className: "font-semibold shadow", children: [riskLevel.toUpperCase(), " RISK"] }) }) }), jsxs(Card.Content, { className: "space-y-3", children: [jsxs("div", { className: "space-y-1", children: [jsx(Card.Title, { className: "text-lg", children: title }), subtitle && (jsx("p", { className: "text-base text-[var(--color-text-secondary)]", children: subtitle }))] }), children && (jsx("div", { className: "bg-[var(--color-background-secondary)] rounded-md p-3 text-sm font-mono border border-[var(--color-border)] overflow-x-auto", children: children }))] }), jsxs(Card.Footer, { className: "justify-end gap-2 mt-3", children: [jsx(Button, { variant: "outline", color: "neutral", size: "sm", onClick: onDeny, children: "Deny" }), jsx(Button, { color: riskColor, size: "sm", state: isApproving ? "loading" : "default", onClick: onApprove, children: "Approve" })] })] }));
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export { ApprovalCard };
|
|
@@ -3,8 +3,8 @@ const codeBlockTheme = {
|
|
|
3
3
|
header: "flex items-center justify-between px-3 py-1.5 bg-[var(--color-background-secondary)] border-b border-[var(--color-border)]",
|
|
4
4
|
headerLeft: "flex items-center gap-2 min-w-0 flex-1 ",
|
|
5
5
|
headerRight: "flex items-center gap-2 flex-shrink-0",
|
|
6
|
-
filename: "text-
|
|
7
|
-
languageLabel: "text-
|
|
6
|
+
filename: "text-base font-medium text-[var(--color-text-secondary)] truncate",
|
|
7
|
+
languageLabel: "text-sm uppercase tracking-wider font-semibold text-[var(--color-text-muted)]",
|
|
8
8
|
codeWrapper: "overflow-x-auto",
|
|
9
9
|
lineNumber: "text-[var(--color-text-muted)] select-none text-right tabular-nums min-w-[2.5rem] pr-4 opacity-50",
|
|
10
10
|
highlightedLine: " -mx-4 px-4 bg-[var(--color-primary-50)] border-l-2 border-l-[var(--color-primary)] dark:bg-neutral-400/5 dark:border-l-neutral-200",
|
|
@@ -453,7 +453,7 @@ className, textareaClassName, footerClassName, theme = {},
|
|
|
453
453
|
if (e.target.files)
|
|
454
454
|
processFiles(e.target.files);
|
|
455
455
|
e.target.value = "";
|
|
456
|
-
}, className: "sr-only", "aria-label": "Attach files" }), jsxs("div", { className: cn("relative", mergedTheme.baseStyle, mergedTheme.stateStyle, variant === "simple" ? "p-3 rounded-full pl-5" : ""), onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [jsx(AnimatePresence, { children: isDragOver && enableDropzone && (jsxs(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, className: mergedTheme.dropzoneStyle, children: [jsx(CloudArrowUpIcon, { className: "size-8 text-[var(--color-primary)]" }), jsx("p", { className: "text-
|
|
456
|
+
}, className: "sr-only", "aria-label": "Attach files" }), jsxs("div", { className: cn("relative", mergedTheme.baseStyle, mergedTheme.stateStyle, variant === "simple" ? "p-3 rounded-full pl-5" : ""), onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [jsx(AnimatePresence, { children: isDragOver && enableDropzone && (jsxs(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, className: mergedTheme.dropzoneStyle, children: [jsx(CloudArrowUpIcon, { className: "size-8 text-[var(--color-primary)]" }), jsx("p", { className: "text-base font-medium text-[var(--color-primary)]", children: dropzoneText })] })) }), currentAttachments.length > 0 && (jsx("div", { className: "flex flex-wrap gap-2 py-2 px-1", children: currentAttachments.map((attachment) => {
|
|
457
457
|
var _a;
|
|
458
458
|
return (jsxs("div", { className: "relative group rounded-lg border border-[var(--color-border)] bg-white", children: [attachment.type === "image" ? (attachment.isCompressing ? (jsx("div", { className: "size-12 flex items-center justify-center bg-gray-100 rounded-lg", children: jsx("div", { className: "w-4 h-4 border-2 border-gray-300 border-t-[var(--color-primary)] rounded-full animate-spin" }) })) : (jsx("img", { src: attachment.previewUrl, alt: attachment.file.name, className: "size-12 object-cover rounded-lg" }))) : (jsxs("div", { className: "size-12 flex flex-col items-center justify-center text-center p-1 rounded-lg", children: [jsx(DocumentIcon, { className: "w-5 h-5 text-[var(--color-text-muted)]" }), jsx("span", { className: "text-[10px] text-[var(--color-text-secondary)] truncate w-full", children: (_a = attachment.file.name.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toUpperCase() })] })), jsx("button", { onClick: () => removeAttachment(attachment.id), className: "absolute -top-1.5 -right-1.5 size-5 rounded-full bg-[var(--color-danger)] text-[var(--color-danger-contrast)] flex items-center justify-center opacity-0 translate-y-1 group-hover:translate-y-0 group-hover:opacity-100 transition-all duration-300 ease-in-out cursor-pointer shadow-md", "aria-label": `Remove ${attachment.file.name}`, children: jsx(XMarkIcon, { className: "size-3", strokeWidth: 3 }) })] }, attachment.id));
|
|
459
459
|
}) })), jsxs("div", { className: cn("flex gap-2", variant === "simple" ? "items-end" : "items-start"), children: [jsx(Textarea, { ref: textareaRef, id: id, unstyled: true, value: currentValue, onChange: handleChange, onKeyDown: handleKeyDown, onPaste: handlePaste, placeholder: placeholder, disabled: isDisabled, maxLength: maxLength, rows: rows, "aria-label": ariaLabel || "Prompt input", "aria-describedby": helperTextId, "aria-invalid": isInvalid, "aria-disabled": isDisabled, className: cn(mergedTheme.textareaStyle, variant === "simple" && "!w-auto flex-1 min-w-0 justify-center", textareaClassName), style: {
|
|
@@ -478,7 +478,7 @@ className, textareaClassName, footerClassName, theme = {},
|
|
|
478
478
|
fileInputRef.current.click();
|
|
479
479
|
}
|
|
480
480
|
onAttachmentClick === null || onAttachmentClick === void 0 ? void 0 : onAttachmentClick();
|
|
481
|
-
}, children: "Upload PDF" }, "upload-pdf")] })] })), showSettingsButton && (jsx(Button, { iconOnly: true, variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0.5", onClick: onSettingsClick, "aria-label": "Open settings", disabled: isDisabled, children: jsx(AdjustmentsHorizontalIcon, { className: "size-4 text-[var(--color-text-muted)]", strokeWidth: 2 }) })), showVoiceButton && (jsxs(Button, { variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0", onClick: onVoiceClick, "aria-label": "Voice input", disabled: isDisabled, children: [jsx(MicrophoneIcon, { className: "size-4", strokeWidth: 2 }), " Voice"] })), showModelSelector && (jsxs(Dropdown, { selectionMode: "single", selectedKeys: isModelControlled ? [controlledModel] : internalModel, onSelectionChange: handleModelChange, children: [jsx(Dropdown.Trigger, { children: jsxs(Button, { variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0", "aria-label": "Select AI model", disabled: isDisabled, children: [modelMap[currentModel] || "Select Model", jsx(ChevronDownIcon, { className: "size-3 opacity-80", strokeWidth: 2 })] }) }), jsx(Dropdown.Menu, { children: models.map((model) => (jsxs(Dropdown.Item, { itemKey: model.key, children: [model.icon && (jsx("span", { className: "mr-2", children: model.icon })), model.label] }, model.key))) })] }))] }), jsx("div", { children: jsx(Button, { iconOnly: true, className: cn(mergedTheme.submitButtonStyle), size: "sm", variant: "outline", color: "neutral", onClick: handleSubmit, disabled: !canSubmit, state: isLoading ? "loading" : "default", "aria-label": submitButtonLabel, title: submitShortcut ? `Submit (${submitShortcut})` : undefined, children: submitButtonIcon }) })] }))] }), displayHelperText && (jsx("div", { id: helperTextId, className: cn("mt-1 text-
|
|
481
|
+
}, children: "Upload PDF" }, "upload-pdf")] })] })), showSettingsButton && (jsx(Button, { iconOnly: true, variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0.5", onClick: onSettingsClick, "aria-label": "Open settings", disabled: isDisabled, children: jsx(AdjustmentsHorizontalIcon, { className: "size-4 text-[var(--color-text-muted)]", strokeWidth: 2 }) })), showVoiceButton && (jsxs(Button, { variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0", onClick: onVoiceClick, "aria-label": "Voice input", disabled: isDisabled, children: [jsx(MicrophoneIcon, { className: "size-4", strokeWidth: 2 }), " Voice"] })), showModelSelector && (jsxs(Dropdown, { selectionMode: "single", selectedKeys: isModelControlled ? [controlledModel] : internalModel, onSelectionChange: handleModelChange, children: [jsx(Dropdown.Trigger, { children: jsxs(Button, { variant: "outline", color: "neutral", size: "sm", className: "rounded-full !border-0", "aria-label": "Select AI model", disabled: isDisabled, children: [modelMap[currentModel] || "Select Model", jsx(ChevronDownIcon, { className: "size-3 opacity-80", strokeWidth: 2 })] }) }), jsx(Dropdown.Menu, { children: models.map((model) => (jsxs(Dropdown.Item, { itemKey: model.key, children: [model.icon && (jsx("span", { className: "mr-2", children: model.icon })), model.label] }, model.key))) })] }))] }), jsx("div", { children: jsx(Button, { iconOnly: true, className: cn(mergedTheme.submitButtonStyle), size: "sm", variant: "outline", color: "neutral", onClick: handleSubmit, disabled: !canSubmit, state: isLoading ? "loading" : "default", "aria-label": submitButtonLabel, title: submitShortcut ? `Submit (${submitShortcut})` : undefined, children: submitButtonIcon }) })] }))] }), displayHelperText && (jsx("div", { id: helperTextId, className: cn("mt-1 text-sm", isInvalid
|
|
482
482
|
? "text-[var(--color-danger)]"
|
|
483
483
|
: "text-[var(--color-text-muted)]"), role: isInvalid ? "alert" : undefined, "aria-live": isInvalid ? "polite" : undefined, children: displayHelperText }))] }));
|
|
484
484
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const promptInputTheme = {
|
|
2
2
|
baseStyle: "rounded-[var(--card-radius)] border-[1px] border-[var(--color-border)] flex flex-col gap-2 shadow-real-md p-4 outline-2 outline-[var(--color-border)]/30 bg-white dark:bg-[var(--color-background-secondary)] ",
|
|
3
|
-
textareaStyle: "w-full bg-transparent text-
|
|
3
|
+
textareaStyle: "w-full bg-transparent text-base text-[var(--color-text-primary)] placeholder:text-[var(--color-text-placeholder)] focus:outline-none resize-none overflow-y-auto transition-[height] duration-200 ease-in-out",
|
|
4
4
|
footerStyle: "flex justify-between items-end",
|
|
5
5
|
actionsStyle: "flex gap-1",
|
|
6
6
|
submitButtonStyle: "rounded-full",
|
|
@@ -2,7 +2,7 @@ const promptSuggestionTheme = {
|
|
|
2
2
|
baseStyle: "inline-flex items-center gap-2 py-2 px-3.5 rounded-full " +
|
|
3
3
|
"bg-white dark:bg-[var(--color-background)] " +
|
|
4
4
|
"border border-[var(--color-border)] " +
|
|
5
|
-
"text-
|
|
5
|
+
"text-base font-medium text-[var(--color-text-primary)] " +
|
|
6
6
|
"cursor-pointer transition-all duration-300 " +
|
|
7
7
|
"hover:bg-[var(--color-background-secondary)] dark:hover:bg-[var(--color-background-secondary)] " +
|
|
8
8
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
@@ -49,7 +49,7 @@ const MarkdownRenderer = ({ content, options = {}, isStreaming = false, animated
|
|
|
49
49
|
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx(Prism, { style: syntaxTheme === 'dark' ? oneDark : oneLight, language: language, PreTag: "div", className: "rounded-lg my-3", ...props, children: String(children).replace(/\n$/, '') }) }));
|
|
50
50
|
}
|
|
51
51
|
// Inline code
|
|
52
|
-
return (jsx("code", { className: "bg-[var(--color-background-tertiary)] text-[var(--color-primary)] px-1.5 py-0.5 rounded text-
|
|
52
|
+
return (jsx("code", { className: "bg-[var(--color-background-tertiary)] text-[var(--color-primary)] px-1.5 py-0.5 rounded text-base font-mono", ...props, children: children }));
|
|
53
53
|
},
|
|
54
54
|
// Paragraphs
|
|
55
55
|
p({ children }) {
|
|
@@ -60,19 +60,19 @@ const MarkdownRenderer = ({ content, options = {}, isStreaming = false, animated
|
|
|
60
60
|
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h1", { className: "text-2xl font-bold mb-4 text-[var(--color-text-primary)] border-b border-[var(--color-border)] pb-2", children: children }) }));
|
|
61
61
|
},
|
|
62
62
|
h2({ children }) {
|
|
63
|
-
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h2", { className: "text-
|
|
63
|
+
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h2", { className: "text-2xl font-bold mb-3 text-[var(--color-text-primary)] border-b border-[var(--color-border)] pb-2", children: children }) }));
|
|
64
64
|
},
|
|
65
65
|
h3({ children }) {
|
|
66
|
-
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h3", { className: "text-
|
|
66
|
+
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h3", { className: "text-xl font-semibold mb-2 text-[var(--color-text-primary)]", children: children }) }));
|
|
67
67
|
},
|
|
68
68
|
h4({ children }) {
|
|
69
|
-
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h4", { className: "text-
|
|
69
|
+
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h4", { className: "text-lg font-semibold mb-2 text-[var(--color-text-primary)]", children: children }) }));
|
|
70
70
|
},
|
|
71
71
|
h5({ children }) {
|
|
72
|
-
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h5", { className: "text-
|
|
72
|
+
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h5", { className: "text-base font-semibold mb-2 text-[var(--color-text-primary)]", children: children }) }));
|
|
73
73
|
},
|
|
74
74
|
h6({ children }) {
|
|
75
|
-
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h6", { className: "text-
|
|
75
|
+
return (jsx(AnimatedBlock, { animate: shouldAnimate, children: jsx("h6", { className: "text-base font-semibold mb-2 text-[var(--color-text-secondary)]", children: children }) }));
|
|
76
76
|
},
|
|
77
77
|
// Lists
|
|
78
78
|
ul({ children }) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const streamingResponseTheme = {
|
|
2
2
|
errorContainerStyle: "flex items-start gap-3 rounded-[var(--radius-base)] border border-[var(--color-danger-200)] bg-[var(--color-danger-50)] px-4 py-3",
|
|
3
|
-
errorTitleStyle: "text-
|
|
4
|
-
errorMessageStyle: "text-
|
|
5
|
-
errorRetryButtonStyle: "mt-2 text-
|
|
6
|
-
loadingContainerStyle: "flex items-center gap-2 text-[var(--color-text-placeholder)] text-
|
|
3
|
+
errorTitleStyle: "text-base font-medium text-[var(--color-danger)]",
|
|
4
|
+
errorMessageStyle: "text-base text-[var(--color-text-secondary)] mt-1",
|
|
5
|
+
errorRetryButtonStyle: "mt-2 text-base font-medium text-[var(--color-danger)] hover:text-[var(--color-danger-700)] transition-colors",
|
|
6
|
+
loadingContainerStyle: "flex items-center gap-2 text-[var(--color-text-placeholder)] text-base",
|
|
7
7
|
loadingDotStyle: "w-1.5 h-1.5 rounded-full bg-current animate-pulse",
|
|
8
8
|
};
|
|
9
9
|
|
|
@@ -8,19 +8,19 @@ const tokenCounterTheme = {
|
|
|
8
8
|
progressBarStyle: "h-full bg-[var(--color-primary)] transition-all duration-200",
|
|
9
9
|
sizes: {
|
|
10
10
|
sm: {
|
|
11
|
-
container: "text-
|
|
11
|
+
container: "text-sm",
|
|
12
12
|
icon: "size-3",
|
|
13
|
-
text: "text-
|
|
13
|
+
text: "text-sm",
|
|
14
14
|
},
|
|
15
15
|
md: {
|
|
16
|
-
container: "text-
|
|
16
|
+
container: "text-base",
|
|
17
17
|
icon: "size-4",
|
|
18
|
-
text: "text-
|
|
18
|
+
text: "text-base",
|
|
19
19
|
},
|
|
20
20
|
lg: {
|
|
21
|
-
container: "text-
|
|
21
|
+
container: "text-lg",
|
|
22
22
|
icon: "size-5",
|
|
23
|
-
text: "text-
|
|
23
|
+
text: "text-lg",
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
};
|
|
@@ -83,7 +83,7 @@ const ActivityRings = ({ rings, centerLabel, centerSuffix, size = ACTIVITY_RINGS
|
|
|
83
83
|
}
|
|
84
84
|
// Early return for invalid configuration
|
|
85
85
|
if (!Array.isArray(rings) || rings.length === 0) {
|
|
86
|
-
return (jsxs("div", { className: cn("flex items-center justify-center p-6 border border-[var(--color-border)] rounded-lg", className), role: "alert", ...props, children: [jsx(ExclamationTriangleIcon, { className: "size-5 text-[var(--color-danger)] mr-2" }), jsx("span", { className: "text-
|
|
86
|
+
return (jsxs("div", { className: cn("flex items-center justify-center p-6 border border-[var(--color-border)] rounded-lg", className), role: "alert", ...props, children: [jsx(ExclamationTriangleIcon, { className: "size-5 text-[var(--color-danger)] mr-2" }), jsx("span", { className: "text-base text-[var(--color-text-secondary)]", children: "Invalid ActivityRings: rings array is required" })] }));
|
|
87
87
|
}
|
|
88
88
|
// State for controlling initial animation
|
|
89
89
|
const [hasAnimated, setHasAnimated] = useState(false);
|
|
@@ -18,8 +18,8 @@ const activityRingsTheme = {
|
|
|
18
18
|
],
|
|
19
19
|
},
|
|
20
20
|
centerText: {
|
|
21
|
-
label: "text-
|
|
22
|
-
suffix: "text-
|
|
21
|
+
label: "text-2xl font-semibold text-[var(--color-text-primary)]",
|
|
22
|
+
suffix: "text-base font-normal text-[var(--color-text-secondary)]/80",
|
|
23
23
|
},
|
|
24
24
|
};
|
|
25
25
|
|
|
@@ -89,9 +89,9 @@ className, title, description, enableKeyboardNavigation = BAR_CHART_DEFAULTS.ena
|
|
|
89
89
|
});
|
|
90
90
|
// Early return for invalid data with error message
|
|
91
91
|
if (!isValid) {
|
|
92
|
-
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-
|
|
92
|
+
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-2xl", className), role: "alert", "aria-live": "polite", ...props, children: [jsxs("div", { className: "flex flex-col items-center gap-4 mb-1", children: [jsx(ExclamationTriangleIcon, { className: "size-6 text-[var(--color-danger)]" }), jsx("div", { className: "text-base font-semibold text-[var(--color-text-secondary)]", children: "Invalid Chart Data" })] }), jsx("p", { className: "text-base text-[var(--color-text-secondary)]/70 mb-2", children: ((_b = validation.errors[0]) === null || _b === void 0 ? void 0 : _b.message) ||
|
|
93
93
|
"Unable to render chart due to data validation errors" }), process.env.NODE_ENV === "development" &&
|
|
94
|
-
validation.errors.length > 1 && (jsxs("details", { className: "text-
|
|
94
|
+
validation.errors.length > 1 && (jsxs("details", { className: "text-sm text-warning-500", children: [jsxs("summary", { className: "cursor-pointer", children: ["Show all errors (", validation.errors.length, ")"] }), jsx("ul", { className: "mt-2 text-left", children: validation.errors.map((error, index) => (jsxs("li", { children: ["\u2022 ", error.message] }, index))) })] }))] }));
|
|
95
95
|
}
|
|
96
96
|
// Early return for empty data
|
|
97
97
|
if (!sanitizedData || sanitizedData.length === 0) {
|
|
@@ -415,7 +415,7 @@ className, title, description, enableKeyboardNavigation = BAR_CHART_DEFAULTS.ena
|
|
|
415
415
|
}
|
|
416
416
|
: undefined }, keyIndex));
|
|
417
417
|
};
|
|
418
|
-
return (jsx(ChartErrorBoundary, { className: className, showErrorDetails: process.env.NODE_ENV === "development", children: jsxs("div", { ref: containerRef, className: cn("chart-container w-full h-full", darkMode && "dark", className), ...chartAccessibilityProps, onMouseEnter: handleMouseInteraction, onMouseMove: handleMouseInteraction, ...props, children: [descriptionProps && jsx("div", { ...descriptionProps }), showValidationWarnings && hasWarnings && (jsxs("div", { className: "absolute top-2 left-2 right-2 z-10 p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-
|
|
418
|
+
return (jsx(ChartErrorBoundary, { className: className, showErrorDetails: process.env.NODE_ENV === "development", children: jsxs("div", { ref: containerRef, className: cn("chart-container w-full h-full", darkMode && "dark", className), ...chartAccessibilityProps, onMouseEnter: handleMouseInteraction, onMouseMove: handleMouseInteraction, ...props, children: [descriptionProps && jsx("div", { ...descriptionProps }), showValidationWarnings && hasWarnings && (jsxs("div", { className: "absolute top-2 left-2 right-2 z-10 p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-sm text-[var(--color-warning)] shadow-sm", children: [jsx("strong", { children: "Chart Warnings:" }), jsx("ul", { className: "mt-1", children: validation.warnings
|
|
419
419
|
.filter((warning) => !warning.message.includes("has no valid numeric values"))
|
|
420
420
|
.map((warning, index) => (jsxs("li", { children: ["\u2022 ", warning.message] }, index))) }), validation.warnings.some((warning) => warning.message.includes("has no valid numeric values")) && (jsx("div", { className: "mt-2 pt-2 border-t border-[var(--color-warning-200)]", children: jsx("span", { className: "text-[var(--color-warning)]", children: "\u2139\uFE0F Null/undefined values are handled by using averages from other data points" }) }))] })), jsxs("svg", { width: "100%", height: "100%", viewBox: `0 0 ${dimensions.width} ${dimensions.height}`, children: [jsx("defs", { children: jsxs("pattern", { id: "diagonalHatch", patternUnits: "userSpaceOnUse", width: "8", height: "8", children: [jsx("rect", { width: "8", height: "8", fill: "var(--color-neutral-50)" }), jsx("path", { d: "M-2,2 l4,-4\n M0,8 l8,-8\n M6,10 l4,-4", style: { stroke: "black", strokeWidth: 4, opacity: 0.1 } })] }) }), jsx(HorizontalGrid, { show: showGrid, x: margin.left, y: margin.top, width: innerWidth, height: innerHeight, lineCount: 5 }), jsx(YAxis, { show: showYAxis, min: minValue, max: maxValue, x: margin.left, y: margin.top, height: innerHeight, showGrid: false, gridWidth: innerWidth, tickFormatter: (value) => {
|
|
421
421
|
if (Math.abs(value) >= 1000)
|
|
@@ -34,7 +34,7 @@ function ChartContainer({ data, config, className, children, minHeight = 200, wi
|
|
|
34
34
|
minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight
|
|
35
35
|
}),
|
|
36
36
|
};
|
|
37
|
-
return (jsx(ChartContext.Provider, { value: { data: data || [], config: safeConfig }, children: jsx("div", { className: cn("flex aspect-auto justify-center text-
|
|
37
|
+
return (jsx(ChartContext.Provider, { value: { data: data || [], config: safeConfig }, children: jsx("div", { className: cn("flex aspect-auto justify-center text-sm",
|
|
38
38
|
// Add w-full as default if no width class is specified
|
|
39
39
|
!hasWidthClass && "w-full", className), style: inlineStyles, ...props, children: children }) }));
|
|
40
40
|
}
|
|
@@ -129,7 +129,7 @@ className, title, description, enableKeyboardNavigation = COMBO_CHART_DEFAULTS.e
|
|
|
129
129
|
});
|
|
130
130
|
// Early return for invalid data with error message
|
|
131
131
|
if (!isValid) {
|
|
132
|
-
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-
|
|
132
|
+
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-2xl", className), role: "alert", "aria-live": "polite", ...props, children: [jsxs("div", { className: "flex flex-col items-center gap-4 mb-1", children: [jsx(ExclamationTriangleIcon, { className: "size-6 text-[var(--color-danger)]" }), jsx("div", { className: "text-base font-semibold text-[var(--color-text-secondary)]", children: "Invalid Chart Data" })] }), jsx("p", { className: "text-base text-[var(--color-text-secondary)]/70 mb-2", children: "Unable to render chart due to data validation errors" })] }));
|
|
133
133
|
}
|
|
134
134
|
// Early return for empty data
|
|
135
135
|
if (!sanitizedData || sanitizedData.length === 0) {
|
|
@@ -141,7 +141,7 @@ className, title, description, enableKeyboardNavigation = COMBO_CHART_DEFAULTS.e
|
|
|
141
141
|
lineSeries.forEach((key) => {
|
|
142
142
|
config[key];
|
|
143
143
|
});
|
|
144
|
-
return (jsxs(ChartContainer, { data: sanitizedData, config: config, scales: scales, showGrid: showGrid, showXAxis: showXAxis, showYAxis: showYAxis, categoryGap: categoryGap, className: className, title: title, description: description, enableKeyboardNavigation: enableKeyboardNavigation, chartType: "combo", ...props, children: [jsx(ComboChartRenderers, { barKeys: barSeries, lineKeys: lineSeries, stacked: stacked, barRadius: resolvedBarRadius, dotRadius: resolvedDotRadius, gap: gap, categoryGap: categoryGap, strokeWidth: strokeWidth, curved: curved, curveType: curveType, showDots: showDots }), showValidationWarnings && hasWarnings && (jsx("foreignObject", { x: "0", y: "0", width: "100%", height: "50", children: jsxs("div", { className: "p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-
|
|
144
|
+
return (jsxs(ChartContainer, { data: sanitizedData, config: config, scales: scales, showGrid: showGrid, showXAxis: showXAxis, showYAxis: showYAxis, categoryGap: categoryGap, className: className, title: title, description: description, enableKeyboardNavigation: enableKeyboardNavigation, chartType: "combo", ...props, children: [jsx(ComboChartRenderers, { barKeys: barSeries, lineKeys: lineSeries, stacked: stacked, barRadius: resolvedBarRadius, dotRadius: resolvedDotRadius, gap: gap, categoryGap: categoryGap, strokeWidth: strokeWidth, curved: curved, curveType: curveType, showDots: showDots }), showValidationWarnings && hasWarnings && (jsx("foreignObject", { x: "0", y: "0", width: "100%", height: "50", children: jsxs("div", { className: "p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-sm text-[var(--color-warning)] shadow-sm", children: [jsx("strong", { children: "Chart Warnings:" }), " Some data validation warnings occurred."] }) })), children] }));
|
|
145
145
|
};
|
|
146
146
|
|
|
147
147
|
export { ComboChart };
|
|
@@ -11,7 +11,7 @@ const donutChartTheme = {
|
|
|
11
11
|
// Text styling
|
|
12
12
|
text: {
|
|
13
13
|
label: "text-2xl font-bold text-[var(--color-text-primary)] transition-colors duration-300 tracking-tight",
|
|
14
|
-
subtitle: "text-
|
|
14
|
+
subtitle: "text-base text-[var(--color-text-secondary)] mt-1 transition-colors duration-300",
|
|
15
15
|
},
|
|
16
16
|
// Default color palette (CSS variables for dark mode support)
|
|
17
17
|
// Note: These are resolved at runtime via getComputedStyle
|
|
@@ -243,7 +243,7 @@ const MultiSegmentDonutChart = ({ data, size = 200, thickness = 4, segmentGap =
|
|
|
243
243
|
}) }));
|
|
244
244
|
};
|
|
245
245
|
if (!data || data.length === 0) {
|
|
246
|
-
return (jsx("div", { className: cn(theme.baseStyle, className), style: { width: containerSize, height: containerSize }, children: jsx("div", { className: "text-
|
|
246
|
+
return (jsx("div", { className: cn(theme.baseStyle, className), style: { width: containerSize, height: containerSize }, children: jsx("div", { className: "text-base text-[var(--color-text-secondary)]", children: "No data" }) }));
|
|
247
247
|
}
|
|
248
248
|
return (jsxs("div", { className: cn("flex gap-4 items-center", getLayoutClasses(), className), children: [jsxs(motion.div, { className: cn(theme.baseStyle), style: { width: containerSize, height: containerSize }, role: "img", "aria-label": `Donut chart with ${segments.length} segments`, ...restProps, children: [jsxs("svg", { viewBox: `0 0 ${svgSize} ${svgSize}`, width: "100%", height: "100%", className: "overflow-visible relative z-10", children: [jsx("circle", { cx: center, cy: center, r: radius, fill: "none", stroke: "#000000", strokeWidth: strokeWidth > 2 ? strokeWidth - 2 : 1, opacity: 0.03 }), segments.map((segment, index) => roundedCaps ? (jsx(AnimatedStrokeSegment, { center: center, radius: radius, strokeWidth: strokeWidth, startAngle: segment.startAngle, endAngle: segment.endAngle, color: segment.color, delay: segment.animationDelay, shouldAnimate: showAnimation && hasAnimated, shouldReduceMotion: shouldReduceMotion, isHovered: hoveredSegment === index, isFaded: hoveredSegment !== null && hoveredSegment !== index, onMouseEnter: () => handleSegmentMouseEnter(index), onMouseLeave: handleSegmentMouseLeave, onClick: () => handleSegmentClick(index), clickable: !!onSegmentClick }, `segment-${index}`)) : (jsx(AnimatedSegment, { center: center, innerRadius: innerRadius, outerRadius: outerRadius, startAngle: segment.startAngle, endAngle: segment.endAngle, color: segment.color, delay: segment.animationDelay, duration: segment.animationDuration, shouldAnimate: showAnimation && hasAnimated, shouldReduceMotion: shouldReduceMotion, isHovered: hoveredSegment === index, isFaded: hoveredSegment !== null && hoveredSegment !== index, onMouseEnter: () => handleSegmentMouseEnter(index), onMouseLeave: handleSegmentMouseLeave, onClick: () => handleSegmentClick(index), clickable: !!onSegmentClick }, `segment-${index}`)))] }), centerContent && (jsx("div", { className: cn(theme.centerContent), children: centerContent }))] }), renderLegend()] }));
|
|
249
249
|
};
|
|
@@ -8,7 +8,7 @@ const multiSegmentDonutChartTheme = {
|
|
|
8
8
|
track: "text-[var(--color-border)]",
|
|
9
9
|
// Legend styling
|
|
10
10
|
legend: {
|
|
11
|
-
container: "flex flex-col gap-2 text-
|
|
11
|
+
container: "flex flex-col gap-2 text-base",
|
|
12
12
|
item: "flex items-center gap-2 cursor-pointer hover:opacity-80 transition-opacity",
|
|
13
13
|
label: "text-[var(--color-text-primary)] font-medium",
|
|
14
14
|
value: "text-[var(--color-text-secondary)] ml-auto",
|
|
@@ -72,7 +72,7 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
72
72
|
const containerWidth = typeof width === "number" ? `${width}px` : width;
|
|
73
73
|
// Return empty state if no valid data
|
|
74
74
|
if (stages.length === 0) {
|
|
75
|
-
return (jsx("div", { className: cn(theme.baseStyle, className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": "Empty funnel chart - no data available", ...props, children: jsx("div", { className: "flex items-center justify-center h-full text-[var(--color-text-muted)] text-
|
|
75
|
+
return (jsx("div", { className: cn(theme.baseStyle, className), style: { width: containerWidth, height: containerHeight }, role: "img", "aria-label": "Empty funnel chart - no data available", ...props, children: jsx("div", { className: "flex items-center justify-center h-full text-[var(--color-text-muted)] text-base", children: "No data available" }) }));
|
|
76
76
|
}
|
|
77
77
|
const viewBoxWidth = 150;
|
|
78
78
|
const viewBoxHeight = 100;
|
|
@@ -356,9 +356,9 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
356
356
|
animate: "visible",
|
|
357
357
|
custom: index,
|
|
358
358
|
}
|
|
359
|
-
: {}), children: [jsx("div", { className: cn("text-
|
|
359
|
+
: {}), children: [jsx("div", { className: cn("text-base font-semibold whitespace-nowrap", labelPosition === "inside"
|
|
360
360
|
? "text-white drop-shadow-md"
|
|
361
|
-
: "text-[var(--color-text-primary)]"), children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: cn("text-
|
|
361
|
+
: "text-[var(--color-text-primary)]"), children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: cn("text-sm whitespace-nowrap", labelPosition === "inside"
|
|
362
362
|
? "text-white/90 drop-shadow-md"
|
|
363
363
|
: "text-[var(--color-text-secondary)]"), children: [showValues && formatDisplayValue(stage.value), showValues && showPercentages && " • ", showPercentages && `${stage.percentage.toFixed(0)}%`] }))] }, `label-${stage.name}`));
|
|
364
364
|
}), orientation === "vertical" &&
|
|
@@ -376,7 +376,7 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
376
376
|
animate: "visible",
|
|
377
377
|
custom: index,
|
|
378
378
|
}
|
|
379
|
-
: {}), children: [jsx("div", { className: "text-
|
|
379
|
+
: {}), children: [jsx("div", { className: "text-base font-semibold text-white drop-shadow-md whitespace-nowrap text-center", children: stage.name }), (showValues || showPercentages) && (jsxs("div", { className: "text-sm text-white/90 drop-shadow-md whitespace-nowrap text-center", children: [showValues && formatDisplayValue(stage.value), showValues && showPercentages && " • ", showPercentages && `${stage.percentage.toFixed(0)}%`] }))] }, `label-${stage.name}`));
|
|
380
380
|
}), orientation === "horizontal" &&
|
|
381
381
|
showDropoff &&
|
|
382
382
|
stages.map((stage, index) => {
|
|
@@ -394,7 +394,7 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
394
394
|
animate: "visible",
|
|
395
395
|
custom: index,
|
|
396
396
|
}
|
|
397
|
-
: {}), children: jsxs("span", { className: "text-
|
|
397
|
+
: {}), children: jsxs("span", { className: "text-sm text-[var(--color-danger)] font-medium", children: ["-", stage.dropoff.toFixed(1), "%"] }) }, `dropoff-${stage.name}`));
|
|
398
398
|
}), orientation === "vertical" &&
|
|
399
399
|
showDropoff &&
|
|
400
400
|
stages.map((stage, index) => {
|
|
@@ -411,7 +411,7 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
411
411
|
animate: "visible",
|
|
412
412
|
custom: index,
|
|
413
413
|
}
|
|
414
|
-
: {}), children: jsxs("span", { className: "text-
|
|
414
|
+
: {}), children: jsxs("span", { className: "text-sm text-[var(--color-danger)] font-medium", children: ["-", stage.dropoff.toFixed(1), "%"] }) }, `dropoff-${stage.name}`));
|
|
415
415
|
}), orientation === "horizontal" &&
|
|
416
416
|
showConversionRate &&
|
|
417
417
|
stages.map((stage, index) => {
|
|
@@ -455,7 +455,7 @@ const FunnelChart = ({ data, height = 400, width = 600, showPercentages = true,
|
|
|
455
455
|
initial: "hidden",
|
|
456
456
|
animate: "visible",
|
|
457
457
|
}
|
|
458
|
-
: {}), children: [jsx("div", { className: "text-
|
|
458
|
+
: {}), children: [jsx("div", { className: "text-sm text-[var(--color-text-secondary)] mb-1", children: "Overall Conversion" }), jsxs("div", { className: "text-xl font-bold text-[var(--color-text-primary)]", children: [overallConversion, "%"] }), jsxs("div", { className: "text-sm text-[var(--color-text-muted)] mt-1", children: [formatDisplayValue(stages[0].value), " \u2192", " ", formatDisplayValue(stages[stages.length - 1].value)] })] })), jsx(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" })] }));
|
|
459
459
|
};
|
|
460
460
|
FunnelChart.displayName = "FunnelChart";
|
|
461
461
|
|
|
@@ -10,7 +10,7 @@ const heatmapTheme = {
|
|
|
10
10
|
// Base cell styles (individual cells add opacity via inline styles)
|
|
11
11
|
cellBaseStyle: "relative w-full h-full cursor-pointer border border-transparent transition-all duration-500 animate-[flicker_0.6s_ease-out_forwards]",
|
|
12
12
|
// Axis labels using CSS variables for dark mode support
|
|
13
|
-
axisLabelStyle: "text-
|
|
13
|
+
axisLabelStyle: "text-sm text-[var(--color-text-secondary)] font-medium select-none",
|
|
14
14
|
// Legend using correct CSS variables
|
|
15
15
|
legendStyle: "w-full space-y-1.5 mt-3",
|
|
16
16
|
};
|
|
@@ -88,7 +88,7 @@ className, onClick, onHover, onMouseMove, onLeave, children, }) => {
|
|
|
88
88
|
e.preventDefault();
|
|
89
89
|
onClick(data);
|
|
90
90
|
}
|
|
91
|
-
}, children: children && (jsx("div", { className: "absolute inset-0 flex items-center justify-center text-
|
|
91
|
+
}, children: children && (jsx("div", { className: "absolute inset-0 flex items-center justify-center text-sm font-medium text-gray-700 dark:text-gray-300", children: children })) }));
|
|
92
92
|
};
|
|
93
93
|
const HeatmapCell = React__default.memo(HeatmapCellInner);
|
|
94
94
|
|
|
@@ -11,7 +11,7 @@ minValue = 0, maxValue = 100, labels = {
|
|
|
11
11
|
const gradientStyle = {
|
|
12
12
|
background: `linear-gradient(to right, color-mix(in srgb, ${color} 20%, transparent), ${color})`
|
|
13
13
|
};
|
|
14
|
-
return (jsxs("div", { className: cn(heatmapTheme.legendStyle, className), children: [jsx("div", { className: "w-full h-1.5 rounded-full", style: gradientStyle }), jsxs("div", { className: "flex items-center justify-between text-
|
|
14
|
+
return (jsxs("div", { className: cn(heatmapTheme.legendStyle, className), children: [jsx("div", { className: "w-full h-1.5 rounded-full", style: gradientStyle }), jsxs("div", { className: "flex items-center justify-between text-sm font-medium text-[var(--color-text-secondary)]", children: [jsx("div", { children: labels.min }), jsx("div", { children: labels.max })] })] }));
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export { HeatmapLegend };
|
|
@@ -13,11 +13,11 @@ const radarChartTheme = {
|
|
|
13
13
|
// Axis spoke stroke color (gray-300 equivalent)
|
|
14
14
|
axisColor: "#d1d5db",
|
|
15
15
|
// Axis label classes (applied to <text> elements via className)
|
|
16
|
-
labelStyle: "text-
|
|
16
|
+
labelStyle: "text-sm fill-[#6b7280] select-none",
|
|
17
17
|
// Legend container
|
|
18
18
|
legendStyle: "flex flex-wrap items-center justify-center gap-x-6 gap-y-2",
|
|
19
19
|
// Individual legend item
|
|
20
|
-
legendItemStyle: "flex items-center gap-2 text-
|
|
20
|
+
legendItemStyle: "flex items-center gap-2 text-base",
|
|
21
21
|
// Colored dot in legend
|
|
22
22
|
legendDotStyle: "w-2.5 h-2.5 rounded-full shrink-0",
|
|
23
23
|
// Legend label text
|
|
@@ -201,7 +201,7 @@ showGrid = SCATTER_PLOT_DEFAULTS.showGrid, showXAxis = SCATTER_PLOT_DEFAULTS.sho
|
|
|
201
201
|
}
|
|
202
202
|
handleMouseInteraction();
|
|
203
203
|
}, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave }, index));
|
|
204
|
-
}), jsx(XAxis, { show: showXAxis, data: xAxisData, x: margin.left, y: margin.top + innerHeight, width: innerWidth, categoryWidth: innerWidth / (xAxisData.length - 1), categoryGap: 0, alignWithEdge: true, className: cn(axisClassName) }), xLabel && showXAxis && (jsx("text", { x: margin.left + innerWidth / 2, y: dimensions.height - 5, textAnchor: "middle", className: "text-
|
|
204
|
+
}), jsx(XAxis, { show: showXAxis, data: xAxisData, x: margin.left, y: margin.top + innerHeight, width: innerWidth, categoryWidth: innerWidth / (xAxisData.length - 1), categoryGap: 0, alignWithEdge: true, className: cn(axisClassName) }), xLabel && showXAxis && (jsx("text", { x: margin.left + innerWidth / 2, y: dimensions.height - 5, textAnchor: "middle", className: "text-sm fill-[var(--color-text-secondary)]", children: xLabel })), yLabel && showYAxis && (jsx("text", { x: 15, y: margin.top + innerHeight / 2, textAnchor: "middle", className: "text-sm fill-[var(--color-text-secondary)]", transform: `rotate(-90 15 ${margin.top + innerHeight / 2})`, children: yLabel }))] }), categories.length > 0 && (jsx("div", { className: theme.legendContainerStyle, children: categories.map((cat, index) => (jsxs("div", { className: theme.legendItemStyle, children: [jsx("div", { className: theme.legendDotStyle, style: { backgroundColor: getCategoryColor(chartColors, index) } }), jsx("span", { className: theme.legendLabelStyle, children: cat })] }, cat))) })), showTooltip && (jsx(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: "scatter" }))] }));
|
|
205
205
|
};
|
|
206
206
|
ScatterPlot.displayName = 'ScatterPlot';
|
|
207
207
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
const scatterPlotTheme = {
|
|
5
5
|
containerStyle: 'relative inline-flex flex-col items-center w-full',
|
|
6
6
|
svgStyle: 'overflow-visible',
|
|
7
|
-
emptyStateStyle: 'flex items-center justify-center h-full text-[var(--color-text-muted)] text-
|
|
7
|
+
emptyStateStyle: 'flex items-center justify-center h-full text-[var(--color-text-muted)] text-base',
|
|
8
8
|
// Grid styles
|
|
9
9
|
gridLineStyle: 'stroke-[var(--color-border)]',
|
|
10
10
|
// Axis styles
|
|
@@ -17,7 +17,7 @@ const scatterPlotTheme = {
|
|
|
17
17
|
legendContainerStyle: 'flex flex-wrap gap-3 mt-4 justify-center',
|
|
18
18
|
legendItemStyle: 'flex items-center gap-2',
|
|
19
19
|
legendDotStyle: 'w-3 h-3 rounded-full',
|
|
20
|
-
legendLabelStyle: 'text-
|
|
20
|
+
legendLabelStyle: 'text-base text-[var(--color-text-secondary)]',
|
|
21
21
|
// Default category colors using CSS variables
|
|
22
22
|
colors: [
|
|
23
23
|
'var(--color-primary)',
|
|
@@ -65,7 +65,7 @@ className, title, description, enableKeyboardNavigation = STACKED_BAR_CHART_DEFA
|
|
|
65
65
|
});
|
|
66
66
|
// Early return for invalid data
|
|
67
67
|
if (!isValid) {
|
|
68
|
-
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-
|
|
68
|
+
return (jsxs("div", { className: cn("chart-container flex flex-col items-center justify-center p-6 border border-border rounded-lg text-2xl", className), role: "alert", "aria-live": "polite", ...props, children: [jsxs("div", { className: "flex flex-col items-center gap-4 mb-1", children: [jsx(ExclamationTriangleIcon, { className: "size-6 text-[var(--color-danger)]" }), jsx("div", { className: "text-base font-semibold text-[var(--color-text-secondary)]", children: "Invalid Chart Data" })] }), jsx("p", { className: "text-base text-[var(--color-text-secondary)]/70 mb-2", children: ((_a = validation.errors[0]) === null || _a === void 0 ? void 0 : _a.message) ||
|
|
69
69
|
"Unable to render chart due to data validation errors" })] }));
|
|
70
70
|
}
|
|
71
71
|
// Early return for empty data
|
|
@@ -282,7 +282,7 @@ className, title, description, enableKeyboardNavigation = STACKED_BAR_CHART_DEFA
|
|
|
282
282
|
} }, key));
|
|
283
283
|
}) }, categoryIndex));
|
|
284
284
|
};
|
|
285
|
-
return (jsx(ChartErrorBoundary, { className: className, showErrorDetails: process.env.NODE_ENV === "development", children: jsxs("div", { ref: containerRef, className: cn("chart-container w-full h-full", className), ...chartAccessibilityProps, onMouseEnter: handleMouseInteraction, onMouseMove: handleMouseInteraction, ...props, children: [descriptionProps && jsx("div", { ...descriptionProps }), showValidationWarnings && hasWarnings && (jsxs("div", { className: "absolute top-2 left-2 right-2 z-10 p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-
|
|
285
|
+
return (jsx(ChartErrorBoundary, { className: className, showErrorDetails: process.env.NODE_ENV === "development", children: jsxs("div", { ref: containerRef, className: cn("chart-container w-full h-full", className), ...chartAccessibilityProps, onMouseEnter: handleMouseInteraction, onMouseMove: handleMouseInteraction, ...props, children: [descriptionProps && jsx("div", { ...descriptionProps }), showValidationWarnings && hasWarnings && (jsxs("div", { className: "absolute top-2 left-2 right-2 z-10 p-2 bg-[var(--color-warning-50)] border border-[var(--color-warning-200)] rounded text-sm text-[var(--color-warning)] shadow-sm", children: [jsx("strong", { children: "Chart Warnings:" }), jsx("ul", { className: "mt-1", children: validation.warnings.map((warning, index) => (jsxs("li", { children: ["\u2022 ", warning.message] }, index))) })] })), jsxs("svg", { width: "100%", height: "100%", viewBox: `0 0 ${dimensions.width} ${dimensions.height}`, children: [jsx(HorizontalGrid, { show: showGrid, x: margin.left, y: margin.top, width: innerWidth, height: innerHeight, lineCount: 5 }), jsx(YAxis, { show: showYAxis, min: minValue, max: maxValue, x: margin.left, y: margin.top, height: innerHeight, showGrid: false, gridWidth: innerWidth, tickFormatter: (value) => {
|
|
286
286
|
if (stackOffset === "expand")
|
|
287
287
|
return `${value}%`;
|
|
288
288
|
if (Math.abs(value) >= 1000)
|
|
@@ -39,7 +39,7 @@ class ChartErrorBoundary extends Component {
|
|
|
39
39
|
return this.props.fallback;
|
|
40
40
|
}
|
|
41
41
|
// Default error UI
|
|
42
|
-
return (jsxs("div", { className: cn("flex flex-col items-center justify-center p-6 border border-danger-200 bg-danger-50 rounded-lg text-center", this.props.className), role: "alert", "aria-live": "polite", children: [jsxs("div", { className: "flex items-center gap-2 mb-2", children: [jsx("svg", { className: "w-5 h-5 text-danger-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" }) }), jsx("h3", { className: "text-
|
|
42
|
+
return (jsxs("div", { className: cn("flex flex-col items-center justify-center p-6 border border-danger-200 bg-danger-50 rounded-lg text-center", this.props.className), role: "alert", "aria-live": "polite", children: [jsxs("div", { className: "flex items-center gap-2 mb-2", children: [jsx("svg", { className: "w-5 h-5 text-danger-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" }) }), jsx("h3", { className: "text-base font-medium text-danger-800", children: "Chart Error" })] }), jsx("p", { className: "text-base text-danger-600 mb-3", children: "Unable to render chart due to an error" }), this.props.showErrorDetails && this.state.error && (jsxs("details", { className: "w-full", children: [jsx("summary", { className: "text-sm text-danger-500 cursor-pointer hover:text-danger-700 mb-2", children: "Show error details" }), jsxs("div", { className: "text-left bg-danger-100 p-3 rounded border text-sm font-mono text-danger-800 overflow-auto max-h-32", children: [jsx("div", { className: "font-semibold mb-1", children: "Error:" }), jsx("div", { className: "mb-2", children: this.state.error.message }), ((_a = this.state.errorInfo) === null || _a === void 0 ? void 0 : _a.componentStack) && (jsxs(Fragment, { children: [jsx("div", { className: "font-semibold mb-1", children: "Component Stack:" }), jsx("pre", { className: "whitespace-pre-wrap text-sm", children: this.state.errorInfo.componentStack })] }))] })] })), jsx("button", { onClick: () => this.setState({ hasError: false, error: undefined, errorInfo: undefined }), className: "mt-3 px-3 py-1 text-sm bg-danger-600 text-white rounded hover:bg-danger-700 transition-colors", children: "Try Again" })] }));
|
|
43
43
|
}
|
|
44
44
|
return this.props.children;
|
|
45
45
|
}
|
|
@@ -11,7 +11,7 @@ const ChartLegendContent = ({ payload = [], nameKey = 'name', className, ...prop
|
|
|
11
11
|
return (jsx("div", { className: `flex flex-wrap gap-4 ${className || ''}`, ...props, children: payload.map((entry, index) => {
|
|
12
12
|
const name = entry[nameKey] || entry.dataKey || `Series ${index + 1}`;
|
|
13
13
|
const color = entry.color || '#8884d8';
|
|
14
|
-
return (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "w-3 h-3 rounded", style: { backgroundColor: color } }), jsx("span", { className: "text-
|
|
14
|
+
return (jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "w-3 h-3 rounded", style: { backgroundColor: color } }), jsx("span", { className: "text-base text-gray-600", children: name })] }, index));
|
|
15
15
|
}) }));
|
|
16
16
|
};
|
|
17
17
|
|
|
@@ -11,7 +11,7 @@ const ChartText = ({ children, textAnchor = "start", dominantBaseline = "auto",
|
|
|
11
11
|
const theme = chartTextTheme;
|
|
12
12
|
// Truncate text if needed
|
|
13
13
|
const truncateText = (text, maxWidth) => {
|
|
14
|
-
// Rough estimate: 6px per character for text-
|
|
14
|
+
// Rough estimate: 6px per character for text-base
|
|
15
15
|
if (!maxWidth || text.length <= maxWidth / 6) {
|
|
16
16
|
return text;
|
|
17
17
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Uses fixed Tailwind styling for consistency across charts
|
|
4
4
|
*/
|
|
5
5
|
const chartTextTheme = {
|
|
6
|
-
baseStyle: "transition-all duration-200 text-
|
|
6
|
+
baseStyle: "transition-all duration-200 text-sm text-[var(--color-text-secondary)]/80 fill-[var(--color-text-secondary)]/80 font-medium select-none",
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
export { chartTextTheme };
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
const chartTooltipTheme = {
|
|
7
7
|
baseStyle: "fixed z-50 text-[var(--color-text-primary)] rounded-[var(--tooltip-radius)] px-3 py-2 shadow-lg pointer-events-none glass-effect",
|
|
8
|
-
contentStyle: "whitespace-nowrap text-
|
|
8
|
+
contentStyle: "whitespace-nowrap text-base",
|
|
9
9
|
multiSeriesContainerStyle: "text-left",
|
|
10
|
-
categoryStyle: "text-
|
|
10
|
+
categoryStyle: "text-sm font-semibold mb-1 text-[var(--color-text-primary)]",
|
|
11
11
|
seriesContainerStyle: "space-y-0.5",
|
|
12
12
|
seriesRowStyle: "flex items-center justify-between gap-3",
|
|
13
13
|
dotStyle: "size-2 rounded-[calc(var(--radius-base)*0.75)]",
|
|
14
|
-
labelStyle: "text-
|
|
15
|
-
valueStyle: "text-
|
|
14
|
+
labelStyle: "text-sm opacity-90 text-[var(--color-text-secondary)]",
|
|
15
|
+
valueStyle: "text-sm font-semibold text-[var(--color-text-primary)]",
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export { chartTooltipTheme };
|
|
@@ -6,7 +6,7 @@ import { semanticTextColors } from '../../../utils/colorUtils.js';
|
|
|
6
6
|
*/
|
|
7
7
|
const alertTheme = {
|
|
8
8
|
// Base styles applied to all alerts
|
|
9
|
-
baseStyle: "relative flex items-start gap-3 rounded-[var(--alert-radius)] p-4 text-
|
|
9
|
+
baseStyle: "relative flex items-start gap-3 rounded-[var(--alert-radius)] p-4 text-base border border-[var(--color-border)] backdrop-blur-md bg-white dark:bg-[var(--color-background-secondary)]/80",
|
|
10
10
|
// Visual style variants (structure only, no colors)
|
|
11
11
|
variants: {
|
|
12
12
|
default: "",
|
|
@@ -10,7 +10,7 @@ const AlertDialog = ({ trigger, icon, title, subtitle, footer, className, }) =>
|
|
|
10
10
|
const triggerElement = isValidElement(trigger)
|
|
11
11
|
? cloneElement(trigger, { onClick: handleOpen })
|
|
12
12
|
: null;
|
|
13
|
-
return (jsxs(Fragment, { children: [triggerElement, jsxs(Modal, { isOpen: isOpen, onClose: handleClose, size: "sm", closeOnOverlayClick: false, closeOnEsc: false, showCloseButton: false, role: "alertdialog", className: cn("!overflow-visible", className), children: [jsxs(Modal.Header, { children: [icon && (jsx("div", { className: "text-2xl rounded-full p-3 mb-3 w-fit glass-effect shadow-xl shadow-black/5", "aria-hidden": "true", children: icon })), jsx(Modal.Title, { children: title })] }), jsx(Modal.Body, { className: "pt-2", children: jsx("div", { className: "text-[var(--color-text-secondary)] text-
|
|
13
|
+
return (jsxs(Fragment, { children: [triggerElement, jsxs(Modal, { isOpen: isOpen, onClose: handleClose, size: "sm", closeOnOverlayClick: false, closeOnEsc: false, showCloseButton: false, role: "alertdialog", className: cn("!overflow-visible", className), children: [jsxs(Modal.Header, { children: [icon && (jsx("div", { className: "text-2xl rounded-full p-3 mb-3 w-fit glass-effect shadow-xl shadow-black/5", "aria-hidden": "true", children: icon })), jsx(Modal.Title, { children: title })] }), jsx(Modal.Body, { className: "pt-2", children: jsx("div", { className: "text-[var(--color-text-secondary)] text-base", children: subtitle }) }), footer && (jsx(Modal.Footer, { className: "pb-6", children: footer(handleClose) }))] })] }));
|
|
14
14
|
};
|
|
15
15
|
AlertDialog.displayName = "AlertDialog";
|
|
16
16
|
|
|
@@ -6,11 +6,11 @@ const avatarTheme = {
|
|
|
6
6
|
baseStyle: "relative inline-flex items-center justify-center overflow-hidden bg-neutral-200 text-[var(--color-text-primary)] font-semibold tracking-tighter rounded-[var(--avatar-radius)] ring-2 ring-[var(--color-primary)]/10 border border-[var(--border)] transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 glass-effect",
|
|
7
7
|
// Size variants using CSS variables
|
|
8
8
|
sizes: {
|
|
9
|
-
xs: "size-[var(--avatar-size-xs)] text-
|
|
10
|
-
sm: "size-[var(--avatar-size-sm)] text-
|
|
11
|
-
md: "size-[var(--avatar-size-md)] text-
|
|
12
|
-
lg: "size-[var(--avatar-size-lg)] text-
|
|
13
|
-
xl: "size-[var(--avatar-size-xl)] text-
|
|
9
|
+
xs: "size-[var(--avatar-size-xs)] text-sm",
|
|
10
|
+
sm: "size-[var(--avatar-size-sm)] text-base",
|
|
11
|
+
md: "size-[var(--avatar-size-md)] text-lg",
|
|
12
|
+
lg: "size-[var(--avatar-size-lg)] text-xl",
|
|
13
|
+
xl: "size-[var(--avatar-size-xl)] text-2xl",
|
|
14
14
|
},
|
|
15
15
|
// Status indicator styles
|
|
16
16
|
statuses: {
|