@flikk/ui 1.0.0-beta.6 → 1.0.0-beta.8
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/PromptInput/PromptInput.js +5 -124
- package/dist/components/core/Alert/Alert.js +1 -0
- package/dist/components/core/Alert/Alert.theme.js +3 -7
- package/dist/components/core/Alert/Alert.types.d.ts +2 -1
- package/dist/components/core/Badge/Badge.theme.js +13 -8
- package/dist/components/core/Badge/Badge.types.d.ts +2 -1
- package/dist/components/core/Button/Button.theme.js +36 -30
- package/dist/components/core/Button/Button.types.d.ts +2 -1
- package/dist/components/core/Calendar/Calendar.theme.js +3 -3
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +1 -1
- package/dist/components/core/MenuItem/MenuItem.theme.js +2 -2
- package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +1 -1
- package/dist/components/core/Popover/PopoverContent.js +2 -0
- package/dist/components/core/Progress/Progress.theme.js +9 -6
- package/dist/components/core/Progress/Progress.types.d.ts +2 -1
- package/dist/components/core/Spinner/Spinner.theme.js +3 -5
- package/dist/components/core/Spinner/Spinner.types.d.ts +2 -1
- package/dist/components/data-display/KPI/KPI.theme.js +3 -4
- package/dist/components/data-display/KPI/KPI.types.d.ts +2 -1
- package/dist/components/data-display/Metric/Metric.theme.js +4 -0
- package/dist/components/data-display/Metric/Metric.types.d.ts +2 -1
- package/dist/components/data-display/Table/TableFilter.js +1 -1
- package/dist/components/data-display/Timeline/Timeline.theme.js +2 -2
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +2 -0
- package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +2 -1
- package/dist/components/forms/Checkbox/Checkbox.d.ts +3 -4
- package/dist/components/forms/Checkbox/Checkbox.js +33 -9
- package/dist/components/forms/Checkbox/Checkbox.theme.js +6 -0
- package/dist/components/forms/Checkbox/Checkbox.types.d.ts +28 -2
- package/dist/components/forms/Checkbox/CheckboxContext.d.ts +14 -0
- package/dist/components/forms/Checkbox/CheckboxContext.js +12 -0
- package/dist/components/forms/Checkbox/CheckboxGroup.d.ts +3 -0
- package/dist/components/forms/Checkbox/CheckboxGroup.js +40 -0
- package/dist/components/forms/Checkbox/index.d.ts +1 -1
- package/dist/components/forms/FileUpload/FileUpload.js +0 -78
- package/dist/components/forms/Radio/Radio.d.ts +3 -4
- package/dist/components/forms/Radio/Radio.js +21 -4
- package/dist/components/forms/Radio/Radio.theme.js +6 -0
- package/dist/components/forms/Radio/Radio.types.d.ts +30 -4
- package/dist/components/forms/Radio/RadioContext.d.ts +14 -0
- package/dist/components/forms/Radio/RadioContext.js +12 -0
- package/dist/components/forms/Radio/RadioGroup.d.ts +3 -0
- package/dist/components/forms/Radio/RadioGroup.js +36 -0
- package/dist/components/forms/Radio/index.d.ts +1 -1
- package/dist/components/forms/TimePicker/TimePickerContent.js +1 -78
- package/dist/components/forms/index.d.ts +2 -2
- package/dist/components/forms/index.js +0 -78
- package/dist/components/layout/FormLayout/FormLayoutBody.js +1 -79
- package/dist/hooks/useSelectPortal.d.ts +3 -2
- package/dist/hooks/useSelectPortal.js +44 -19
- package/dist/index.js +191 -197
- package/dist/styles.css +1 -1
- package/dist/utils/colorUtils.d.ts +23 -0
- package/dist/utils/colorUtils.js +45 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/styles/theme.css +29 -0
|
@@ -1,43 +1,11 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React__default, { useState, useRef, useId, useEffect, useCallback } from 'react';
|
|
3
3
|
import { AnimatePresence, motion } from 'motion/react';
|
|
4
|
-
import '
|
|
5
|
-
import '
|
|
6
|
-
import '
|
|
7
|
-
import '../../forms/Select/Select.theme.js';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { CloudArrowUpIcon, DocumentIcon, XMarkIcon, PlusIcon, AdjustmentsHorizontalIcon, MicrophoneIcon, ChevronDownIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
|
|
6
|
+
import { promptInputTheme } from './PromptInput.theme.js';
|
|
8
7
|
import { Textarea } from '../../forms/Textarea/Textarea.js';
|
|
9
8
|
import '../../forms/Textarea/Textarea.theme.js';
|
|
10
|
-
import '../../forms/FormLabel/FormLabel.js';
|
|
11
|
-
import '../../forms/Radio/Radio.js';
|
|
12
|
-
import '../../forms/Checkbox/Checkbox.js';
|
|
13
|
-
import '../../forms/Switch/Switch.js';
|
|
14
|
-
import '../../forms/DatePicker/DatePicker.js';
|
|
15
|
-
import '../../forms/DatePicker/DatePicker.theme.js';
|
|
16
|
-
import '../../forms/FileUpload/FileUpload.js';
|
|
17
|
-
import '../../forms/TimePicker/TimePicker.js';
|
|
18
|
-
import { CloudArrowUpIcon, DocumentIcon, XMarkIcon, PlusIcon, AdjustmentsHorizontalIcon, MicrophoneIcon, ChevronDownIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
|
|
19
|
-
import { cn } from '../../../utils/cn.js';
|
|
20
|
-
import 'react-dom';
|
|
21
|
-
import '../../core/Accordion/Accordion.js';
|
|
22
|
-
import '../../core/AlertDialog/AlertDialog.js';
|
|
23
|
-
import '../../core/AspectRatio/AspectRatio.js';
|
|
24
|
-
import '../../core/Avatar/Avatar.js';
|
|
25
|
-
import '../../core/AvatarGroup/AvatarGroup.js';
|
|
26
|
-
import '../../core/Badge/Badge.js';
|
|
27
|
-
import '../../core/Breadcrumbs/Breadcrumbs.js';
|
|
28
|
-
import '../../core/Breadcrumbs/Breadcrumbs.theme.js';
|
|
29
|
-
import { Button } from '../../core/Button/Button.js';
|
|
30
|
-
import '../../core/ButtonGroup/ButtonGroup.js';
|
|
31
|
-
import '../../core/ButtonGroup/ButtonGroupSeparator.js';
|
|
32
|
-
import '../../core/ButtonGroup/ButtonGroupText.js';
|
|
33
|
-
import '../../core/Calendar/Calendar.js';
|
|
34
|
-
import '../../core/Calendar/CalendarMini/CalendarMini.js';
|
|
35
|
-
import '../../core/Card/Card.js';
|
|
36
|
-
import '../../core/CardStack/CardStack.js';
|
|
37
|
-
import '../../core/Carousel/Carousel.js';
|
|
38
|
-
import '../../core/CommandPalette/CommandPalette.js';
|
|
39
|
-
import '../../core/Separator/Separator.js';
|
|
40
|
-
import '../../core/Drawer/Drawer.js';
|
|
41
9
|
import { Dropdown } from '../../core/Dropdown/Dropdown.js';
|
|
42
10
|
import '../../core/Dropdown/DropdownTrigger.js';
|
|
43
11
|
import '../../core/Dropdown/DropdownMenu.js';
|
|
@@ -45,94 +13,7 @@ import '../../core/Dropdown/DropdownItem.js';
|
|
|
45
13
|
import '../../core/Dropdown/DropdownSection.js';
|
|
46
14
|
import '../../core/Dropdown/DropdownSeparator.js';
|
|
47
15
|
import '../../core/Dropdown/Dropdown.theme.js';
|
|
48
|
-
import '../../core/
|
|
49
|
-
import '../../core/MenuItem/MenuItem.js';
|
|
50
|
-
import '../../core/Link/Link.js';
|
|
51
|
-
import '../../core/Loader/Loader.js';
|
|
52
|
-
import '../../core/Modal/Modal.js';
|
|
53
|
-
import '../../core/ModalStack/ModalStack.js';
|
|
54
|
-
import '../../core/PageHeading/PageHeading.js';
|
|
55
|
-
import '../../core/Pagination/Pagination.js';
|
|
56
|
-
import '../../core/Popover/Popover.js';
|
|
57
|
-
import '../../core/Popover/PopoverContext.js';
|
|
58
|
-
import '../../core/Progress/Progress.js';
|
|
59
|
-
import '../../core/Rating/Rating.js';
|
|
60
|
-
import '../../core/ScrollArea/ScrollArea.js';
|
|
61
|
-
import '../../core/ScrollArea/smooth/SmoothScrollEngine.js';
|
|
62
|
-
import '../../core/Segmented/Segmented.js';
|
|
63
|
-
import '../../core/Skeleton/Skeleton.js';
|
|
64
|
-
import '../../core/SlidingNumber/SlidingNumber.js';
|
|
65
|
-
import '../../core/Tabs/Tabs.js';
|
|
66
|
-
import '../../core/Tabs/TabsList.js';
|
|
67
|
-
import '../../core/Tabs/TabsTrigger.js';
|
|
68
|
-
import '../../core/Tabs/TabsContent.js';
|
|
69
|
-
import '../../core/Tabs/TabsContext.js';
|
|
70
|
-
import '../../core/Tooltip/Tooltip.js';
|
|
71
|
-
import '../../core/Tooltip/Tooltip.animations.js';
|
|
72
|
-
import '../../core/Tree/Tree.js';
|
|
73
|
-
import '../../core/Tag/Tag.js';
|
|
74
|
-
import '../../core/Alert/Alert.js';
|
|
75
|
-
import '../../core/Toast/Toast.js';
|
|
76
|
-
import '../../core/Toast/ToastProvider.js';
|
|
77
|
-
import '@heroicons/react/24/solid';
|
|
78
|
-
import '../../core/Spinner/Spinner.js';
|
|
79
|
-
import '../../core/Message/Message.js';
|
|
80
|
-
import '../../core/Message/TypeWriter.js';
|
|
81
|
-
import '../../core/Empty/Empty.js';
|
|
82
|
-
import '../../core/Masonry/Masonry.js';
|
|
83
|
-
import '../../core/DragDrop/DragDrop.js';
|
|
84
|
-
import '../../core/Sortable/Sortable.js';
|
|
85
|
-
import '../../core/NavItem/NavItem.js';
|
|
86
|
-
import '../../core/Sidebar/Sidebar.js';
|
|
87
|
-
import '../../core/Sidebar/SidebarHeader.js';
|
|
88
|
-
import '../../core/Sidebar/SidebarContent.js';
|
|
89
|
-
import '../../core/Sidebar/SidebarFooter.js';
|
|
90
|
-
import '../../core/Sidebar/SidebarNav.js';
|
|
91
|
-
import '../../core/Sidebar/SidebarNavGroup.js';
|
|
92
|
-
import '../../core/Sidebar/SidebarToggle.js';
|
|
93
|
-
import '../../core/Sidebar/SidebarContext.js';
|
|
94
|
-
import '../../core/OfflineIndicator/OfflineIndicator.js';
|
|
95
|
-
import '../../core/ContextMenu/ContextMenu.js';
|
|
96
|
-
import '../../core/ContextMenu/ContextMenu.theme.js';
|
|
97
|
-
import '../../core/Pill/Pill.js';
|
|
98
|
-
import '../../core/SocialIcon/SocialIcon.js';
|
|
99
|
-
import '../../forms/TimePicker/WheelColumn.js';
|
|
100
|
-
import '../../forms/TimePicker/TimePicker.theme.js';
|
|
101
|
-
import '../../forms/Slider/Slider.js';
|
|
102
|
-
import '../../forms/Slider/Slider.theme.js';
|
|
103
|
-
import '../../forms/Signature/Signature.js';
|
|
104
|
-
import '../../forms/Signature/Signature.theme.js';
|
|
105
|
-
import '../../forms/RichTextEditor/RichTextEditor.js';
|
|
106
|
-
import '../../forms/RichTextEditor/RichTextEditor.theme.js';
|
|
107
|
-
import '../../forms/InputOTP/InputOTP.js';
|
|
108
|
-
import '../../forms/InputOTP/InputOTP.theme.js';
|
|
109
|
-
import '../../forms/InputCreditCard/InputCreditCard.js';
|
|
110
|
-
import '../../forms/InputCreditCard/InputCreditCard.theme.js';
|
|
111
|
-
import '../../forms/InputAddress/InputAddress.js';
|
|
112
|
-
import '../../forms/InputAddress/InputAddress.theme.js';
|
|
113
|
-
import '../../forms/InputDate/InputDate.js';
|
|
114
|
-
import '../../forms/InputCounter/InputCounter.js';
|
|
115
|
-
import '../../forms/InputTag/InputTag.js';
|
|
116
|
-
import '../../forms/InputTag/InputTag.theme.js';
|
|
117
|
-
import '../../forms/Combobox/Combobox.js';
|
|
118
|
-
import '../../forms/Combobox/Combobox.theme.js';
|
|
119
|
-
import '../../forms/ColorPicker/ColorPicker.js';
|
|
120
|
-
import '../../forms/ColorPicker/ColorPickerTrigger.js';
|
|
121
|
-
import '../../forms/ColorPicker/ColorPickerContent.js';
|
|
122
|
-
import '../../forms/ColorPicker/ColorPicker2DCanvas.js';
|
|
123
|
-
import '../../forms/ColorPicker/ColorPickerSwatch.js';
|
|
124
|
-
import '../../forms/ColorPicker/ColorPickerSliders.js';
|
|
125
|
-
import '../../forms/ColorPicker/ColorPickerInput.js';
|
|
126
|
-
import '../../forms/ColorPicker/ColorPickerFormatSelector.js';
|
|
127
|
-
import '../../forms/ColorPicker/ColorPickerEyeDropper.js';
|
|
128
|
-
import '../../forms/ColorPicker/ColorPickerPresets.js';
|
|
129
|
-
import '../../forms/SelectableCard/SelectableCard.js';
|
|
130
|
-
import '../../forms/TransferList/TransferList.js';
|
|
131
|
-
import '../../forms/Mention/Mention.js';
|
|
132
|
-
import '../../forms/Mention/Mention.theme.js';
|
|
133
|
-
import '../../forms/CronInput/CronInput.js';
|
|
134
|
-
import '../../forms/CronInput/CronInput.theme.js';
|
|
135
|
-
import { promptInputTheme } from './PromptInput.theme.js';
|
|
16
|
+
import { Button } from '../../core/Button/Button.js';
|
|
136
17
|
|
|
137
18
|
/**
|
|
138
19
|
* Default model options for the model selector
|
|
@@ -574,7 +455,7 @@ className, textareaClassName, footerClassName, theme = {},
|
|
|
574
455
|
e.target.value = "";
|
|
575
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-sm 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) => {
|
|
576
457
|
var _a;
|
|
577
|
-
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-
|
|
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));
|
|
578
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: {
|
|
579
460
|
minHeight,
|
|
580
461
|
maxHeight,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { semanticTextColors } from '../../../utils/colorUtils.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Default theme configuration for Alert component
|
|
3
5
|
* Uses flat color organization matching Badge pattern
|
|
@@ -11,13 +13,7 @@ const alertTheme = {
|
|
|
11
13
|
glass: "glass-effect",
|
|
12
14
|
},
|
|
13
15
|
// Icon color styles per color
|
|
14
|
-
iconColors:
|
|
15
|
-
neutral: "text-[var(--color-text-primary)]",
|
|
16
|
-
primary: "text-[var(--color-primary)]",
|
|
17
|
-
success: "text-[var(--color-success)]",
|
|
18
|
-
warning: "text-[var(--color-warning)]",
|
|
19
|
-
danger: "text-[var(--color-danger)]",
|
|
20
|
-
},
|
|
16
|
+
iconColors: semanticTextColors,
|
|
21
17
|
// State styles
|
|
22
18
|
states: {
|
|
23
19
|
dismissible: "pr-10",
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { HTMLAttributes, ReactNode } from "react";
|
|
2
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
2
3
|
/**
|
|
3
4
|
* Alert semantic colors (intent)
|
|
4
5
|
*/
|
|
5
|
-
export type AlertColor =
|
|
6
|
+
export type AlertColor = SemanticColor;
|
|
6
7
|
/**
|
|
7
8
|
* Alert visual variant
|
|
8
9
|
*/
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { semanticBgColors } from '../../../utils/colorUtils.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Default theme configuration for Badge component
|
|
3
5
|
* Uses variant-first color organization for reliable dark mode and className overrides
|
|
@@ -18,13 +20,15 @@ const badgeTheme = {
|
|
|
18
20
|
filled: {
|
|
19
21
|
neutral: "bg-[var(--color-neutral-900)] text-white ring-[var(--color-border)] " +
|
|
20
22
|
"dark:bg-[var(--color-neutral-700)] dark:ring-[var(--color-neutral-600)]",
|
|
21
|
-
primary: "bg-[var(--color-primary)] text-
|
|
23
|
+
primary: "bg-[var(--color-primary)] text-[var(--color-primary-contrast)] ring-[var(--color-primary-400)] " +
|
|
22
24
|
"dark:bg-[var(--color-primary-600)] dark:ring-[var(--color-primary-500)]",
|
|
23
|
-
|
|
25
|
+
secondary: "bg-[var(--color-secondary)] text-[var(--color-secondary-contrast)] ring-[var(--color-secondary-400)] " +
|
|
26
|
+
"dark:bg-[var(--color-secondary-600)] dark:ring-[var(--color-secondary-500)]",
|
|
27
|
+
success: "bg-[var(--color-success-600)] text-[var(--color-success-contrast)] ring-[var(--color-success-300)] " +
|
|
24
28
|
"dark:bg-[var(--color-success-600)] dark:ring-[var(--color-success-400)]",
|
|
25
|
-
warning: "bg-[var(--color-warning)] text-
|
|
29
|
+
warning: "bg-[var(--color-warning)] text-[var(--color-warning-contrast)] ring-[var(--color-warning-300)] " +
|
|
26
30
|
"dark:bg-[var(--color-warning-600)] dark:ring-[var(--color-warning-400)]",
|
|
27
|
-
danger: "bg-[var(--color-danger)] text-
|
|
31
|
+
danger: "bg-[var(--color-danger)] text-[var(--color-danger-contrast)] ring-[var(--color-danger-400)] " +
|
|
28
32
|
"dark:bg-[var(--color-danger-600)] dark:ring-[var(--color-danger-400)]",
|
|
29
33
|
},
|
|
30
34
|
// Outline variant - transparent bg with colored border
|
|
@@ -32,6 +36,8 @@ const badgeTheme = {
|
|
|
32
36
|
neutral: "text-[var(--color-text-secondary)] border-[var(--color-border)] " + "",
|
|
33
37
|
primary: "text-[var(--color-primary)] border-[var(--color-border)] " +
|
|
34
38
|
"dark:text-[var(--color-primary-400)]",
|
|
39
|
+
secondary: "text-[var(--color-secondary)] border-[var(--color-border)] " +
|
|
40
|
+
"dark:text-[var(--color-secondary-400)]",
|
|
35
41
|
success: "text-[var(--color-success)] border-[var(--color-border)] " +
|
|
36
42
|
"dark:text-[var(--color-success-400)]",
|
|
37
43
|
warning: "text-[var(--color-warning)] border-[var(--color-border)] " +
|
|
@@ -45,6 +51,8 @@ const badgeTheme = {
|
|
|
45
51
|
"dark:bg-[var(--color-neutral-900)] ",
|
|
46
52
|
primary: "bg-[var(--color-primary-100)] text-[var(--color-primary-700)] " +
|
|
47
53
|
"dark:bg-[var(--color-primary-600)]/30 dark:text-[var(--color-primary-400)]",
|
|
54
|
+
secondary: "bg-[var(--color-secondary-100)] text-[var(--color-secondary-700)] " +
|
|
55
|
+
"dark:bg-[var(--color-secondary-600)]/30 dark:text-[var(--color-secondary-400)]",
|
|
48
56
|
success: "bg-[var(--color-success-100)] text-[var(--color-success-600)] " +
|
|
49
57
|
"dark:bg-[var(--color-success-600)]/30 dark:text-[var(--color-success-400)]",
|
|
50
58
|
warning: "bg-[var(--color-warning-100)] text-[var(--color-warning-600)] " +
|
|
@@ -90,11 +98,8 @@ const badgeTheme = {
|
|
|
90
98
|
},
|
|
91
99
|
// Dot indicator colors (simple, no dark mode needed - inherits from parent)
|
|
92
100
|
dotColors: {
|
|
101
|
+
...semanticBgColors,
|
|
93
102
|
neutral: "bg-[var(--color-text-secondary)]",
|
|
94
|
-
primary: "bg-[var(--color-primary)]",
|
|
95
|
-
success: "bg-[var(--color-success)]",
|
|
96
|
-
warning: "bg-[var(--color-warning)]",
|
|
97
|
-
danger: "bg-[var(--color-danger)]",
|
|
98
103
|
},
|
|
99
104
|
// State styles
|
|
100
105
|
states: {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { ReactNode, MouseEvent } from "react";
|
|
2
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
2
3
|
export type BadgeVariant = "filled" | "outline" | "ghost";
|
|
3
|
-
export type BadgeColor =
|
|
4
|
+
export type BadgeColor = SemanticColor;
|
|
4
5
|
export type BadgeSize = "sm" | "md";
|
|
5
6
|
/**
|
|
6
7
|
* Theme configuration for Badge component
|
|
@@ -6,7 +6,7 @@ const buttonTheme = {
|
|
|
6
6
|
baseStyle: "relative inline-flex items-center justify-center gap-2 font-semibold focus:outline-none rounded-[var(--button-radius)] overflow-hidden cursor-pointer transition-all duration-300 ease-in-out min-w-fit flex-shrink-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 cursor-pointer",
|
|
7
7
|
// Visual style variants - STRUCTURE only (no colors)
|
|
8
8
|
variantStyles: {
|
|
9
|
-
filled: "border",
|
|
9
|
+
filled: "border hover:brightness-[0.9] dark:hover:brightness-[1.15]",
|
|
10
10
|
outline: "bg-transparent border",
|
|
11
11
|
ghost: "border-transparent",
|
|
12
12
|
link: "bg-transparent border-transparent",
|
|
@@ -16,54 +16,52 @@ const buttonTheme = {
|
|
|
16
16
|
// Filled variant - solid backgrounds
|
|
17
17
|
filled: {
|
|
18
18
|
neutral: "bg-[var(--color-neutral-900)] text-white border-[var(--color-border)] " +
|
|
19
|
-
"hover:bg-[var(--color-neutral-800)] hover:ring-2 hover:ring-[var(--color-neutral-900)]/20 " +
|
|
20
19
|
"focus-visible:outline-[var(--color-neutral-800)] " +
|
|
21
|
-
"dark:bg-[var(--color-neutral-200)] dark:text-[var(--color-neutral-900)] dark:border-[var(--color-neutral-200)]
|
|
22
|
-
|
|
23
|
-
primary: "bg-[var(--color-primary)] text-white border-[var(--color-primary)] " +
|
|
24
|
-
"hover:bg-[var(--color-primary-700)] hover:ring-2 hover:ring-[var(--color-primary)]/20 " +
|
|
20
|
+
"dark:bg-[var(--color-neutral-200)] dark:text-[var(--color-neutral-900)] dark:border-[var(--color-neutral-200)]",
|
|
21
|
+
primary: "bg-[var(--color-primary)] text-[var(--color-primary-contrast)] border-[var(--color-primary)] " +
|
|
25
22
|
"focus-visible:outline-[var(--color-primary-600)] " +
|
|
26
|
-
"dark:text-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"
|
|
23
|
+
"dark:text-[var(--color-primary-contrast)] dark:bg-[var(--color-primary-600)] dark:border-[var(--color-primary-600)]",
|
|
24
|
+
secondary: "bg-[var(--color-secondary)] text-[var(--color-secondary-contrast)] border-[var(--color-secondary)] " +
|
|
25
|
+
"focus-visible:outline-[var(--color-secondary-600)] " +
|
|
26
|
+
"dark:text-[var(--color-secondary-contrast)] dark:bg-[var(--color-secondary-600)] dark:border-[var(--color-secondary-600)]",
|
|
27
|
+
success: "bg-[var(--color-success)] text-[var(--color-success-contrast)] border-[var(--color-success)] " +
|
|
30
28
|
"focus-visible:outline-[var(--color-success-600)] " +
|
|
31
|
-
"dark:bg-[var(--color-success-700)] dark:border-[var(--color-success-700)]
|
|
32
|
-
|
|
33
|
-
warning: "bg-[var(--color-warning)] text-white border-[var(--color-warning)] " +
|
|
34
|
-
"hover:bg-[var(--color-warning-600)] hover:ring-2 hover:ring-[var(--color-warning)]/20 " +
|
|
29
|
+
"dark:bg-[var(--color-success-700)] dark:border-[var(--color-success-700)]",
|
|
30
|
+
warning: "bg-[var(--color-warning)] text-[var(--color-warning-contrast)] border-[var(--color-warning)] " +
|
|
35
31
|
"focus-visible:outline-[var(--color-warning-600)] " +
|
|
36
|
-
"dark:bg-[var(--color-warning-600)] dark:border-[var(--color-warning-600)]
|
|
37
|
-
|
|
38
|
-
danger: "bg-[var(--color-danger)] text-white border-[var(--color-danger)] " +
|
|
39
|
-
"hover:bg-[var(--color-danger-600)] hover:ring-2 hover:ring-[var(--color-danger)]/20 " +
|
|
32
|
+
"dark:bg-[var(--color-warning-600)] dark:border-[var(--color-warning-600)]",
|
|
33
|
+
danger: "bg-[var(--color-danger)] text-[var(--color-danger-contrast)] border-[var(--color-danger)] " +
|
|
40
34
|
"focus-visible:outline-[var(--color-danger-600)] " +
|
|
41
|
-
"dark:bg-[var(--color-danger-600)] dark:border-[var(--color-danger-600)]
|
|
42
|
-
"dark:hover:bg-[var(--color-danger-500)]",
|
|
35
|
+
"dark:bg-[var(--color-danger-600)] dark:border-[var(--color-danger-600)]",
|
|
43
36
|
},
|
|
44
37
|
// Outline variant - transparent bg with colored border
|
|
45
38
|
outline: {
|
|
46
39
|
neutral: "text-[var(--color-text-primary)] border-[var(--color-border)] " +
|
|
47
|
-
"hover:bg-[var(--color-neutral-100)]
|
|
40
|
+
"hover:bg-[var(--color-neutral-100)] " +
|
|
48
41
|
"focus-visible:outline-[var(--color-text-secondary)] " +
|
|
49
42
|
"dark:hover:bg-[var(--color-background-secondary)]",
|
|
50
43
|
primary: "text-[var(--color-primary-600)] border-[var(--color-primary-600)] " +
|
|
51
|
-
"hover:bg-[var(--color-primary-50)]
|
|
44
|
+
"hover:bg-[var(--color-primary-50)] " +
|
|
52
45
|
"focus-visible:outline-[var(--color-primary-600)] " +
|
|
53
46
|
"dark:text-[var(--color-primary-300)] dark:border-[var(--color-primary-400)] " +
|
|
54
47
|
"dark:hover:bg-[var(--color-primary-900)]/30",
|
|
48
|
+
secondary: "text-[var(--color-secondary-600)] border-[var(--color-secondary-600)] " +
|
|
49
|
+
"hover:bg-[var(--color-secondary-50)] " +
|
|
50
|
+
"focus-visible:outline-[var(--color-secondary-600)] " +
|
|
51
|
+
"dark:text-[var(--color-secondary-300)] dark:border-[var(--color-secondary-400)] " +
|
|
52
|
+
"dark:hover:bg-[var(--color-secondary-900)]/30",
|
|
55
53
|
success: "text-[var(--color-success-600)] border-[var(--color-success-600)] " +
|
|
56
|
-
"hover:bg-[var(--color-success-50)]
|
|
54
|
+
"hover:bg-[var(--color-success-50)] " +
|
|
57
55
|
"focus-visible:outline-[var(--color-success-600)] " +
|
|
58
56
|
"dark:text-[var(--color-success-300)] dark:border-[var(--color-success-400)] " +
|
|
59
57
|
"dark:hover:bg-[var(--color-success-900)]/30",
|
|
60
58
|
warning: "text-[var(--color-warning-600)] border-[var(--color-warning-600)] " +
|
|
61
|
-
"hover:bg-[var(--color-warning-50)]
|
|
59
|
+
"hover:bg-[var(--color-warning-50)] " +
|
|
62
60
|
"focus-visible:outline-[var(--color-warning-600)] " +
|
|
63
61
|
"dark:text-[var(--color-warning-300)] dark:border-[var(--color-warning-400)] " +
|
|
64
62
|
"dark:hover:bg-[var(--color-warning-900)]/30",
|
|
65
63
|
danger: "text-[var(--color-danger-600)] border-[var(--color-danger-600)] " +
|
|
66
|
-
"hover:bg-[var(--color-danger-50)]
|
|
64
|
+
"hover:bg-[var(--color-danger-50)] " +
|
|
67
65
|
"focus-visible:outline-[var(--color-danger-600)] " +
|
|
68
66
|
"dark:text-[var(--color-danger-300)] dark:border-[var(--color-danger-400)] " +
|
|
69
67
|
"dark:hover:bg-[var(--color-danger-900)]/30",
|
|
@@ -71,27 +69,32 @@ const buttonTheme = {
|
|
|
71
69
|
// Ghost variant - subtle background tints
|
|
72
70
|
ghost: {
|
|
73
71
|
neutral: "text-[var(--color-text-primary)] bg-[var(--color-neutral-100)] " +
|
|
74
|
-
"hover:bg-[var(--color-neutral-200)]
|
|
72
|
+
"hover:bg-[var(--color-neutral-200)] " +
|
|
75
73
|
"focus-visible:outline-[var(--color-text-secondary)] " +
|
|
76
74
|
"dark:text-[var(--color-text-primary)] dark:bg-[var(--color-neutral-900)] " +
|
|
77
75
|
"dark:hover:bg-[var(--color-neutral-800)]",
|
|
78
76
|
primary: "text-[var(--color-primary-600)] bg-[var(--color-primary)]/10 " +
|
|
79
|
-
"hover:bg-[var(--color-primary-50)]
|
|
77
|
+
"hover:bg-[var(--color-primary-50)] " +
|
|
80
78
|
"focus-visible:outline-[var(--color-primary-600)] " +
|
|
81
79
|
"dark:text-[var(--color-primary-300)] dark:bg-[var(--color-primary-900)]/30 " +
|
|
82
80
|
"dark:hover:bg-[var(--color-primary-900)]/50",
|
|
81
|
+
secondary: "text-[var(--color-secondary-600)] bg-[var(--color-secondary)]/10 " +
|
|
82
|
+
"hover:bg-[var(--color-secondary-50)] " +
|
|
83
|
+
"focus-visible:outline-[var(--color-secondary-600)] " +
|
|
84
|
+
"dark:text-[var(--color-secondary-300)] dark:bg-[var(--color-secondary-900)]/30 " +
|
|
85
|
+
"dark:hover:bg-[var(--color-secondary-900)]/50",
|
|
83
86
|
success: "text-[var(--color-success-600)] bg-[var(--color-success)]/10 " +
|
|
84
|
-
"hover:bg-[var(--color-success-50)]
|
|
87
|
+
"hover:bg-[var(--color-success-50)] " +
|
|
85
88
|
"focus-visible:outline-[var(--color-success-600)] " +
|
|
86
89
|
"dark:text-[var(--color-success-300)] dark:bg-[var(--color-success-900)]/30 " +
|
|
87
90
|
"dark:hover:bg-[var(--color-success-900)]/50",
|
|
88
91
|
warning: "text-[var(--color-warning-600)] bg-[var(--color-warning)]/10 " +
|
|
89
|
-
"hover:bg-[var(--color-warning-50)]
|
|
92
|
+
"hover:bg-[var(--color-warning-50)] " +
|
|
90
93
|
"focus-visible:outline-[var(--color-warning-600)] " +
|
|
91
94
|
"dark:text-[var(--color-warning-300)] dark:bg-[var(--color-warning-900)]/30 " +
|
|
92
95
|
"dark:hover:bg-[var(--color-warning-900)]/50",
|
|
93
96
|
danger: "text-[var(--color-danger-600)] bg-[var(--color-danger)]/10 " +
|
|
94
|
-
"hover:bg-[var(--color-danger-50)]
|
|
97
|
+
"hover:bg-[var(--color-danger-50)] " +
|
|
95
98
|
"focus-visible:outline-[var(--color-danger-600)] " +
|
|
96
99
|
"dark:text-[var(--color-danger-300)] dark:bg-[var(--color-danger-900)]/30 " +
|
|
97
100
|
"dark:hover:bg-[var(--color-danger-900)]/50",
|
|
@@ -104,6 +107,9 @@ const buttonTheme = {
|
|
|
104
107
|
primary: "text-[var(--color-primary-600)] underline-offset-4 hover:underline " +
|
|
105
108
|
"focus-visible:outline-[var(--color-primary-600)] " +
|
|
106
109
|
"dark:text-[var(--color-primary-300)]",
|
|
110
|
+
secondary: "text-[var(--color-secondary-600)] underline-offset-4 hover:underline " +
|
|
111
|
+
"focus-visible:outline-[var(--color-secondary-600)] " +
|
|
112
|
+
"dark:text-[var(--color-secondary-300)]",
|
|
107
113
|
success: "text-[var(--color-success-600)] underline-offset-4 hover:underline " +
|
|
108
114
|
"focus-visible:outline-[var(--color-success-600)] " +
|
|
109
115
|
"dark:text-[var(--color-success-300)]",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { RippleEffectType } from "./Button.ripple";
|
|
3
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
3
4
|
/**
|
|
4
5
|
* Button component props
|
|
5
6
|
* @property {ButtonColor} color - The semantic color/intent of the button
|
|
@@ -49,7 +50,7 @@ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElemen
|
|
|
49
50
|
*/
|
|
50
51
|
darkMode?: boolean;
|
|
51
52
|
}
|
|
52
|
-
export type ButtonColor =
|
|
53
|
+
export type ButtonColor = SemanticColor;
|
|
53
54
|
export type ButtonVariant = "filled" | "outline" | "ghost" | "link";
|
|
54
55
|
export type ButtonSize = "sm" | "md" | "lg";
|
|
55
56
|
export type ButtonState = "default" | "disabled" | "error" | "loading";
|
|
@@ -26,7 +26,7 @@ const calendarTheme = {
|
|
|
26
26
|
// Hover state
|
|
27
27
|
"hover:bg-[var(--color-primary-50)] dark:hover:bg-[var(--color-neutral-800)] " +
|
|
28
28
|
// Selected state
|
|
29
|
-
"data-[selected=true]:bg-[var(--color-primary)] data-[selected=true]:text-
|
|
29
|
+
"data-[selected=true]:bg-[var(--color-primary)] data-[selected=true]:text-[var(--color-primary-contrast)] " +
|
|
30
30
|
"data-[selected=true]:hover:bg-[var(--color-primary-600)] data-[selected=true]:border-t data-[selected=true]:border-white/30 " +
|
|
31
31
|
// Today indicator
|
|
32
32
|
"data-[today=true]:text-[var(--color-primary)] dark:data-[today=true]:text-[var(--color-primary-400)] " +
|
|
@@ -38,8 +38,8 @@ const calendarTheme = {
|
|
|
38
38
|
"data-[other-month=true]:text-[var(--color-text-muted)] data-[other-month=true]:opacity-60 " +
|
|
39
39
|
"dark:data-[other-month=true]:text-[var(--color-neutral-600)] " +
|
|
40
40
|
// Range mode states
|
|
41
|
-
"data-[range-start=true]:bg-[var(--color-primary)] data-[range-start=true]:text-
|
|
42
|
-
"data-[range-end=true]:bg-[var(--color-primary)] data-[range-end=true]:text-
|
|
41
|
+
"data-[range-start=true]:bg-[var(--color-primary)] data-[range-start=true]:text-[var(--color-primary-contrast)] " +
|
|
42
|
+
"data-[range-end=true]:bg-[var(--color-primary)] data-[range-end=true]:text-[var(--color-primary-contrast)] " +
|
|
43
43
|
"data-[in-range=true]:bg-[var(--color-primary-50)]/70 data-[in-range=true]:text-[var(--color-text-primary)] " +
|
|
44
44
|
"dark:data-[in-range=true]:bg-[var(--color-primary-900)]/50 dark:data-[in-range=true]:text-[var(--color-neutral-200)] " +
|
|
45
45
|
// Focus offset for dark mode
|
|
@@ -18,7 +18,7 @@ const commandPaletteTheme = {
|
|
|
18
18
|
commandItem: "flex items-center gap-3 px-4 py-2 rounded-[var(--radius-base)] cursor-pointer transition-colors " +
|
|
19
19
|
"hover:bg-[var(--color-primary)] " +
|
|
20
20
|
"data-[highlighted=true]:bg-[var(--color-primary)] data-[highlighted=true]:hover:bg-[var(--color-primary)] " +
|
|
21
|
-
"data-[highlighted=true]:text-
|
|
21
|
+
"data-[highlighted=true]:text-[var(--color-primary-contrast)] " +
|
|
22
22
|
"data-[disabled=true]:opacity-50 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:hover:bg-transparent " +
|
|
23
23
|
// Dark mode - adjust hover state
|
|
24
24
|
"dark:text-[var(--color-neutral-200)] dark:hover:bg-[var(--color-primary-600)] " +
|
|
@@ -13,8 +13,8 @@ const menuItemTheme = {
|
|
|
13
13
|
"dark:hover:bg-[var(--color-neutral-700)] " +
|
|
14
14
|
"dark:data-[selected=true]:bg-[var(--color-neutral-600)]/50 dark:data-[selected=true]:text-[var(--color-text-primary)]",
|
|
15
15
|
// Danger item styling (e.g., Delete actions)
|
|
16
|
-
dangerStyle: "text-[var(--color-danger)] hover:bg-[var(--color-danger)] hover:text-
|
|
17
|
-
"dark:text-[var(--color-danger-400)] dark:hover:bg-[var(--color-danger-600)] dark:hover:text-
|
|
16
|
+
dangerStyle: "text-[var(--color-danger)] hover:bg-[var(--color-danger)] hover:text-[var(--color-danger-contrast)] " +
|
|
17
|
+
"dark:text-[var(--color-danger-400)] dark:hover:bg-[var(--color-danger-600)] dark:hover:text-[var(--color-danger-contrast)]",
|
|
18
18
|
// Focus visible styling for keyboard navigation
|
|
19
19
|
focusStyle: "focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 " +
|
|
20
20
|
"dark:focus-visible:ring-[var(--color-primary-400)] dark:focus-visible:ring-offset-[var(--color-neutral-900)]",
|
|
@@ -13,7 +13,7 @@ const offlineIndicatorTheme = {
|
|
|
13
13
|
toast: "px-3 py-2 rounded-[var(--radius-base)] shadow-real-lg",
|
|
14
14
|
},
|
|
15
15
|
offline: "bg-[var(--color-neutral-900)]/90 backdrop-blur-sm text-white",
|
|
16
|
-
online: "bg-[var(--color-success)]/90 backdrop-blur-sm text-
|
|
16
|
+
online: "bg-[var(--color-success)]/90 backdrop-blur-sm text-[var(--color-success-contrast)]",
|
|
17
17
|
icon: "size-4 flex-shrink-0",
|
|
18
18
|
message: "text-xs font-medium",
|
|
19
19
|
queueCount: "text-xs opacity-80 ml-1",
|
|
@@ -61,6 +61,8 @@ const PopoverContent = React__default.forwardRef(({ children, className, animati
|
|
|
61
61
|
placement: placement,
|
|
62
62
|
offset: offset || 8,
|
|
63
63
|
autoWidth: true,
|
|
64
|
+
onClose: () => { if (!preventClose)
|
|
65
|
+
onOpenChange(false); },
|
|
64
66
|
});
|
|
65
67
|
// Click outside detection (active when no backdrop — with backdrop, Overlay handles it)
|
|
66
68
|
useClickOutside(localRef, (e) => {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { semanticBgColors } from '../../../utils/colorUtils.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Default theme configuration for Progress component
|
|
3
5
|
*/
|
|
@@ -11,7 +13,7 @@ const progressTheme = {
|
|
|
11
13
|
// Label text styles
|
|
12
14
|
labelStyle: "text-sm font-medium text-[var(--color-text-secondary)] tabular-nums min-w-[2.5rem] text-right",
|
|
13
15
|
// Inside label styles (when label is positioned inside the bar)
|
|
14
|
-
insideLabelStyle: "absolute inset-0 flex items-center justify-center text-xs font-medium text-
|
|
16
|
+
insideLabelStyle: "absolute inset-0 flex items-center justify-center text-xs font-medium text-[var(--color-primary-contrast)] tabular-nums",
|
|
15
17
|
// Size variants for track height
|
|
16
18
|
sizes: {
|
|
17
19
|
sm: "h-1.5",
|
|
@@ -20,11 +22,12 @@ const progressTheme = {
|
|
|
20
22
|
},
|
|
21
23
|
// Color variants for the fill
|
|
22
24
|
colors: {
|
|
23
|
-
neutral:
|
|
24
|
-
primary:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
neutral: semanticBgColors.neutral + " dark:bg-[var(--color-neutral-500)]",
|
|
26
|
+
primary: semanticBgColors.primary + " dark:bg-[var(--color-primary-400)]",
|
|
27
|
+
secondary: semanticBgColors.secondary + " dark:bg-[var(--color-secondary-400)]",
|
|
28
|
+
success: semanticBgColors.success + " dark:bg-[var(--color-success-400)]",
|
|
29
|
+
warning: semanticBgColors.warning + " dark:bg-[var(--color-warning-400)]",
|
|
30
|
+
danger: semanticBgColors.danger + " dark:bg-[var(--color-danger-400)]",
|
|
28
31
|
},
|
|
29
32
|
// Indeterminate animation styles
|
|
30
33
|
indeterminateStyle: "animate-[progress-indeterminate_1.5s_ease-in-out_infinite]",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
2
3
|
export type ProgressSize = "sm" | "md" | "lg";
|
|
3
|
-
export type ProgressColor =
|
|
4
|
+
export type ProgressColor = SemanticColor;
|
|
4
5
|
export type ProgressLabelPosition = "right" | "top" | "bottom" | "inside";
|
|
5
6
|
/**
|
|
6
7
|
* Theme configuration for Progress component
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { semanticSpinnerColors } from '../../../utils/colorUtils.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Default theme for the Spinner component
|
|
3
5
|
*/
|
|
@@ -12,12 +14,8 @@ const spinnerTheme = {
|
|
|
12
14
|
},
|
|
13
15
|
// Color variants
|
|
14
16
|
colors: {
|
|
15
|
-
|
|
17
|
+
...semanticSpinnerColors,
|
|
16
18
|
dark: "border-[var(--color-background-quinary)] border-t-transparent",
|
|
17
|
-
primary: "border-[var(--color-primary)] border-t-transparent",
|
|
18
|
-
success: "border-[var(--color-success)] border-t-transparent",
|
|
19
|
-
warning: "border-[var(--color-warning)] border-t-transparent",
|
|
20
|
-
danger: "border-[var(--color-danger)] border-t-transparent",
|
|
21
19
|
},
|
|
22
20
|
// Animation class with drop shadow
|
|
23
21
|
animation: "animate-[spin_1s_linear_infinite] rounded-full",
|
|
@@ -21,8 +21,9 @@ export interface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
21
21
|
*/
|
|
22
22
|
theme?: SpinnerThemeOverrides;
|
|
23
23
|
}
|
|
24
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
24
25
|
export type SpinnerSize = "sm" | "md" | "lg";
|
|
25
|
-
export type SpinnerColor =
|
|
26
|
+
export type SpinnerColor = SemanticColor | "dark";
|
|
26
27
|
export interface SpinnerThemeOverrides {
|
|
27
28
|
baseStyle?: string;
|
|
28
29
|
sizes?: Partial<Record<SpinnerSize, string>>;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { semanticBgColors } from '../../../utils/colorUtils.js';
|
|
2
|
+
|
|
1
3
|
const kpiTheme = {
|
|
2
4
|
baseStyle: "flex flex-col gap-3",
|
|
3
5
|
valueSizes: {
|
|
@@ -20,10 +22,7 @@ const kpiTheme = {
|
|
|
20
22
|
lg: "text-base",
|
|
21
23
|
},
|
|
22
24
|
barFilledColors: {
|
|
23
|
-
|
|
24
|
-
success: "bg-[var(--color-success)]",
|
|
25
|
-
warning: "bg-[var(--color-warning)]",
|
|
26
|
-
danger: "bg-[var(--color-danger)]",
|
|
25
|
+
...semanticBgColors,
|
|
27
26
|
neutral: "bg-[var(--color-text-secondary)]",
|
|
28
27
|
},
|
|
29
28
|
barEmptyColor: "bg-[var(--color-background-tertiary)]",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode, HTMLAttributes } from "react";
|
|
2
|
+
import { SemanticColor } from "../../../utils/colorUtils";
|
|
2
3
|
export type KPISize = "sm" | "md" | "lg";
|
|
3
|
-
export type KPIColor =
|
|
4
|
+
export type KPIColor = SemanticColor;
|
|
4
5
|
export interface KPITheme {
|
|
5
6
|
baseStyle: string;
|
|
6
7
|
valueSizes: Record<KPISize, string>;
|
|
@@ -22,6 +22,8 @@ const metricTheme = {
|
|
|
22
22
|
"dark:bg-[var(--color-background-secondary)]",
|
|
23
23
|
primary: "bg-white text-[var(--color-primary)] border border-[var(--color-border)] " +
|
|
24
24
|
"dark:bg-[var(--color-background-secondary)]",
|
|
25
|
+
secondary: "bg-white text-[var(--color-secondary)] border border-[var(--color-border)] " +
|
|
26
|
+
"dark:bg-[var(--color-background-secondary)]",
|
|
25
27
|
success: "bg-white text-[var(--color-success)] border border-[var(--color-border)] " +
|
|
26
28
|
"dark:bg-[var(--color-background-secondary)]",
|
|
27
29
|
warning: "bg-white text-[var(--color-warning)] border border-[var(--color-border)] " +
|
|
@@ -33,6 +35,8 @@ const metricTheme = {
|
|
|
33
35
|
neutral: "glass-effect-1 !ring-0 text-[var(--color-text-primary)]",
|
|
34
36
|
primary: "glass-effect-2 !ring-0 shadow-lg shadow-blue-500/10 text-[var(--color-primary)] " +
|
|
35
37
|
"dark:text-[var(--color-primary-400)]",
|
|
38
|
+
secondary: "glass-effect-2 !ring-0 shadow-lg shadow-gray-500/10 text-[var(--color-secondary)] " +
|
|
39
|
+
"dark:text-[var(--color-secondary-400)]",
|
|
36
40
|
success: "glass-effect-2 !ring-0 shadow-lg shadow-green-500/10 text-[var(--color-success)] " +
|
|
37
41
|
"dark:text-[var(--color-success-400)]",
|
|
38
42
|
warning: "glass-effect-2 !ring-0 shadow-lg shadow-yellow-500/10 text-[var(--color-warning)] " +
|