@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.
Files changed (57) hide show
  1. package/dist/components/ai/PromptInput/PromptInput.js +5 -124
  2. package/dist/components/core/Alert/Alert.js +1 -0
  3. package/dist/components/core/Alert/Alert.theme.js +3 -7
  4. package/dist/components/core/Alert/Alert.types.d.ts +2 -1
  5. package/dist/components/core/Badge/Badge.theme.js +13 -8
  6. package/dist/components/core/Badge/Badge.types.d.ts +2 -1
  7. package/dist/components/core/Button/Button.theme.js +36 -30
  8. package/dist/components/core/Button/Button.types.d.ts +2 -1
  9. package/dist/components/core/Calendar/Calendar.theme.js +3 -3
  10. package/dist/components/core/CommandPalette/CommandPalette.theme.js +1 -1
  11. package/dist/components/core/MenuItem/MenuItem.theme.js +2 -2
  12. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +1 -1
  13. package/dist/components/core/Popover/PopoverContent.js +2 -0
  14. package/dist/components/core/Progress/Progress.theme.js +9 -6
  15. package/dist/components/core/Progress/Progress.types.d.ts +2 -1
  16. package/dist/components/core/Spinner/Spinner.theme.js +3 -5
  17. package/dist/components/core/Spinner/Spinner.types.d.ts +2 -1
  18. package/dist/components/data-display/KPI/KPI.theme.js +3 -4
  19. package/dist/components/data-display/KPI/KPI.types.d.ts +2 -1
  20. package/dist/components/data-display/Metric/Metric.theme.js +4 -0
  21. package/dist/components/data-display/Metric/Metric.types.d.ts +2 -1
  22. package/dist/components/data-display/Table/TableFilter.js +1 -1
  23. package/dist/components/data-display/Timeline/Timeline.theme.js +2 -2
  24. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +2 -0
  25. package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +2 -1
  26. package/dist/components/forms/Checkbox/Checkbox.d.ts +3 -4
  27. package/dist/components/forms/Checkbox/Checkbox.js +33 -9
  28. package/dist/components/forms/Checkbox/Checkbox.theme.js +6 -0
  29. package/dist/components/forms/Checkbox/Checkbox.types.d.ts +28 -2
  30. package/dist/components/forms/Checkbox/CheckboxContext.d.ts +14 -0
  31. package/dist/components/forms/Checkbox/CheckboxContext.js +12 -0
  32. package/dist/components/forms/Checkbox/CheckboxGroup.d.ts +3 -0
  33. package/dist/components/forms/Checkbox/CheckboxGroup.js +40 -0
  34. package/dist/components/forms/Checkbox/index.d.ts +1 -1
  35. package/dist/components/forms/FileUpload/FileUpload.js +0 -78
  36. package/dist/components/forms/Radio/Radio.d.ts +3 -4
  37. package/dist/components/forms/Radio/Radio.js +21 -4
  38. package/dist/components/forms/Radio/Radio.theme.js +6 -0
  39. package/dist/components/forms/Radio/Radio.types.d.ts +30 -4
  40. package/dist/components/forms/Radio/RadioContext.d.ts +14 -0
  41. package/dist/components/forms/Radio/RadioContext.js +12 -0
  42. package/dist/components/forms/Radio/RadioGroup.d.ts +3 -0
  43. package/dist/components/forms/Radio/RadioGroup.js +36 -0
  44. package/dist/components/forms/Radio/index.d.ts +1 -1
  45. package/dist/components/forms/TimePicker/TimePickerContent.js +1 -78
  46. package/dist/components/forms/index.d.ts +2 -2
  47. package/dist/components/forms/index.js +0 -78
  48. package/dist/components/layout/FormLayout/FormLayoutBody.js +1 -79
  49. package/dist/hooks/useSelectPortal.d.ts +3 -2
  50. package/dist/hooks/useSelectPortal.js +44 -19
  51. package/dist/index.js +191 -197
  52. package/dist/styles.css +1 -1
  53. package/dist/utils/colorUtils.d.ts +23 -0
  54. package/dist/utils/colorUtils.js +45 -0
  55. package/dist/utils/index.d.ts +1 -0
  56. package/package.json +1 -1
  57. 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 '../../forms/Input/Input.js';
5
- import '../../forms/Input/Input.theme.js';
6
- import '../../forms/Select/Select.js';
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/Kbd/Kbd.js';
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-white 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));
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,
@@ -8,6 +8,7 @@ import { Button } from '../Button/Button.js';
8
8
  const defaultIcons = {
9
9
  neutral: BellIcon,
10
10
  primary: InformationCircleIcon,
11
+ secondary: InformationCircleIcon,
11
12
  success: CheckCircleIcon,
12
13
  warning: ExclamationTriangleIcon,
13
14
  danger: XCircleIcon,
@@ -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 = "neutral" | "primary" | "success" | "warning" | "danger";
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-white ring-[var(--color-primary-400)] " +
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
- success: "bg-[var(--color-success-600)] text-white ring-[var(--color-success-300)] " +
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-white ring-[var(--color-warning-300)] " +
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-white ring-[var(--color-danger-400)] " +
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 = "neutral" | "primary" | "success" | "warning" | "danger";
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
- "dark:hover:bg-[var(--color-neutral-300)]",
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-white dark:bg-[var(--color-primary-600)] dark:border-[var(--color-primary-600)] " +
27
- "dark:hover:bg-[var(--color-primary-500)]",
28
- success: "bg-[var(--color-success)] text-white border-[var(--color-success)] " +
29
- "hover:bg-[var(--color-success-600)] hover:ring-2 hover:ring-[var(--color-success)]/20 " +
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
- "dark:hover:bg-[var(--color-success-600)]",
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
- "dark:hover:bg-[var(--color-warning-500)]",
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)] hover:ring-2 hover:ring-[var(--color-border)] " +
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)] hover:ring-2 hover:ring-[var(--color-primary)]/30 " +
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)] hover:ring-2 hover:ring-[var(--color-success)]/30 " +
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)] hover:ring-2 hover:ring-[var(--color-warning)]/30 " +
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)] hover:ring-2 hover:ring-[var(--color-danger)]/30 " +
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)] hover:ring-2 hover:ring-[var(--color-border)] " +
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)] hover:ring-2 hover:ring-[var(--color-primary)]/10 " +
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)] hover:ring-2 hover:ring-[var(--color-success)]/20 " +
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)] hover:ring-2 hover:ring-[var(--color-warning)]/20 " +
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)] hover:ring-2 hover:ring-[var(--color-danger)]/20 " +
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 = "neutral" | "primary" | "success" | "warning" | "danger";
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-white " +
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-white " +
42
- "data-[range-end=true]:bg-[var(--color-primary)] data-[range-end=true]:text-white " +
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-white " +
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-white " +
17
- "dark:text-[var(--color-danger-400)] dark:hover:bg-[var(--color-danger-600)] dark:hover:text-white",
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-white",
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-white tabular-nums",
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: "bg-[var(--color-neutral-400)] dark:bg-[var(--color-neutral-500)]",
24
- primary: "bg-[var(--color-primary)] dark:bg-[var(--color-primary-400)]",
25
- success: "bg-[var(--color-success)] dark:bg-[var(--color-success-400)]",
26
- warning: "bg-[var(--color-warning)] dark:bg-[var(--color-warning-400)]",
27
- danger: "bg-[var(--color-danger)] dark:bg-[var(--color-danger-400)]",
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 = "neutral" | "primary" | "success" | "warning" | "danger";
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
- neutral: "border-[var(--color-border)] border-t-transparent",
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 = "neutral" | "dark" | "primary" | "success" | "warning" | "danger";
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
- primary: "bg-[var(--color-primary)]",
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 = "primary" | "success" | "warning" | "danger" | "neutral";
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)] " +