@flikk/ui 1.0.0-beta.14 → 1.0.0-beta.16
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/README.md +52 -0
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +3 -1
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +4 -4
- package/dist/components/ai/StreamingResponse/AnimatedText.js +3 -3
- package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +22 -22
- package/dist/components/ai/StreamingResponse/StreamingCursor.js +1 -1
- package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +10 -10
- package/dist/components/ai/StreamingResponse/StreamingResponse.js +9 -3
- package/dist/components/ai/StreamingResponse/WordAnimationContext.d.ts +1 -1
- package/dist/components/ai/StreamingResponse/WordAnimationContext.js +11 -11
- package/dist/components/ai/index.d.ts +0 -7
- package/dist/components/ai/index.js +8 -6
- package/dist/components/charts/DonutChart/DonutChart.js +1 -1
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +1 -1
- package/dist/components/charts/shared/ChartLegend/ChartLegend.types.d.ts +13 -1
- package/dist/components/charts/shared/ChartLegend/ChartLegendContent.js +1 -1
- package/dist/components/charts/shared/ChartTooltip/ChartTooltip.types.d.ts +13 -2
- package/dist/components/core/Accordion/AccordionItem.js +1 -1
- package/dist/components/core/Accordion/AccordionTrigger.js +1 -1
- package/dist/components/core/Alert/Alert.animations.d.ts +11 -0
- package/dist/components/core/Alert/Alert.animations.js +44 -0
- package/dist/components/core/Alert/Alert.js +16 -3
- package/dist/components/core/Avatar/Avatar.js +12 -7
- package/dist/components/core/Avatar/Avatar.theme.d.ts +4 -6
- package/dist/components/core/Avatar/Avatar.theme.js +22 -12
- package/dist/components/core/Avatar/Avatar.types.d.ts +9 -0
- package/dist/components/core/AvatarGroup/AvatarGroup.animations.js +2 -2
- package/dist/components/core/AvatarGroup/AvatarGroup.js +1 -2
- package/dist/components/core/AvatarGroup/AvatarGroup.theme.js +1 -1
- package/dist/components/core/Badge/Badge.animations.js +1 -1
- package/dist/components/core/Badge/Badge.js +23 -47
- package/dist/components/core/Badge/Badge.theme.js +48 -62
- package/dist/components/core/Badge/Badge.types.d.ts +5 -29
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.theme.js +2 -2
- package/dist/components/core/ButtonGroup/ButtonGroup.theme.js +6 -6
- package/dist/components/core/ButtonGroup/ButtonGroupText.js +1 -3
- package/dist/components/core/Calendar/Calendar.js +29 -3
- package/dist/components/core/Calendar/Calendar.theme.js +11 -7
- package/dist/components/core/Calendar/Calendar.types.d.ts +3 -0
- package/dist/components/core/Carousel/CarouselBody.js +0 -1
- package/dist/components/core/CommandPalette/CommandItem.js +1 -1
- package/dist/components/core/CommandPalette/CommandPalette.js +6 -4
- package/dist/components/core/CommandPalette/CommandPalette.theme.js +1 -0
- package/dist/components/core/CommandPalette/CommandPalette.types.d.ts +6 -0
- package/dist/components/core/ContextMenu/ContextMenu.js +5 -4
- package/dist/components/core/ContextMenu/ContextMenuTrigger.js +5 -6
- package/dist/components/core/Drawer/Drawer.d.ts +1 -1
- package/dist/components/core/Drawer/Drawer.js +25 -2
- package/dist/components/core/Drawer/Drawer.theme.js +2 -2
- package/dist/components/core/Drawer/Drawer.types.d.ts +6 -0
- package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/core/Dropdown/Dropdown.js +5 -1
- package/dist/components/core/Dropdown/Dropdown.types.d.ts +1 -0
- package/dist/components/core/Dropdown/DropdownItem.js +1 -1
- package/dist/components/core/Dropdown/DropdownMenu.js +4 -4
- package/dist/components/core/Dropdown/DropdownSection.js +1 -1
- package/dist/components/core/Dropdown/DropdownSeparator.js +1 -1
- package/dist/components/core/Dropdown/DropdownTrigger.d.ts +6 -1
- package/dist/components/core/Dropdown/DropdownTrigger.js +10 -8
- package/dist/components/core/Kbd/Kbd.theme.js +3 -3
- package/dist/components/core/Link/Link.js +3 -1
- package/dist/components/core/Message/Message.d.ts +9 -0
- package/dist/components/core/Message/Message.js +44 -3
- package/dist/components/core/Message/Message.theme.js +22 -0
- package/dist/components/core/Message/Message.types.d.ts +115 -0
- package/dist/components/core/Message/MessageAudio.d.ts +8 -0
- package/dist/components/core/Message/MessageAudio.js +11 -0
- package/dist/components/core/Message/MessageContext.d.ts +3 -1
- package/dist/components/core/Message/MessageDateDivider.d.ts +6 -0
- package/dist/components/core/Message/MessageDateDivider.js +10 -0
- package/dist/components/core/Message/MessageFile.d.ts +9 -0
- package/dist/components/core/Message/MessageFile.js +15 -0
- package/dist/components/core/Message/MessageImage.d.ts +11 -0
- package/dist/components/core/Message/MessageImage.js +13 -0
- package/dist/components/core/Message/MessageLink.d.ts +10 -0
- package/dist/components/core/Message/MessageLink.js +15 -0
- package/dist/components/core/Message/MessageReactions.d.ts +8 -0
- package/dist/components/core/Message/MessageReactions.js +12 -0
- package/dist/components/core/Message/MessageReply.d.ts +8 -0
- package/dist/components/core/Message/MessageReply.js +10 -0
- package/dist/components/core/Message/MessageSenderName.d.ts +6 -0
- package/dist/components/core/Message/MessageSenderName.js +10 -0
- package/dist/components/core/Message/MessageStatusIndicator.d.ts +9 -0
- package/dist/components/core/Message/MessageStatusIndicator.js +45 -0
- package/dist/components/core/Message/index.d.ts +19 -1
- package/dist/components/core/Modal/Modal.animations.d.ts +1 -0
- package/dist/components/core/Modal/Modal.animations.js +14 -11
- package/dist/components/core/Pagination/Pagination.theme.js +1 -1
- package/dist/components/core/Popover/Popover.d.ts +1 -1
- package/dist/components/core/Popover/PopoverBody.js +2 -2
- package/dist/components/core/Popover/PopoverTrigger.d.ts +1 -1
- package/dist/components/core/Popover/PopoverTrigger.js +11 -11
- package/dist/components/core/Progress/Progress.d.ts +9 -8
- package/dist/components/core/Progress/Progress.js +16 -16
- package/dist/components/core/Progress/Progress.theme.js +4 -15
- package/dist/components/core/Progress/Progress.types.d.ts +2 -20
- package/dist/components/core/Progress/index.d.ts +1 -1
- package/dist/components/core/ScrollArea/ScrollArea.js +49 -7
- package/dist/components/core/ScrollArea/ScrollArea.types.d.ts +12 -3
- package/dist/components/core/ScrollArea/index.d.ts +1 -1
- package/dist/components/core/Segmented/SegmentedItem.js +1 -1
- package/dist/components/core/Sidebar/Sidebar.js +2 -1
- package/dist/components/core/Sidebar/SidebarMobileTrigger.js +2 -1
- package/dist/components/core/Sidebar/SidebarToggle.js +2 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -1
- package/dist/components/core/SocialIcon/SocialIcon.js +1 -1
- package/dist/components/core/Sortable/Sortable.js +2 -2
- package/dist/components/core/Sortable/Sortable.theme.js +1 -1
- package/dist/components/core/Sortable/Sortable.types.d.ts +7 -5
- package/dist/components/core/Tabs/TabsBody.js +1 -1
- package/dist/components/core/Tabs/TabsTrigger.js +1 -1
- package/dist/components/core/Tag/Tag.js +2 -2
- package/dist/components/core/Toast/Toast.d.ts +2 -2
- package/dist/components/core/Toast/Toast.js +30 -21
- package/dist/components/core/Toast/Toast.theme.js +4 -9
- package/dist/components/core/Toast/Toast.types.d.ts +4 -21
- package/dist/components/core/Toast/index.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/index.js +9 -0
- package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +2 -2
- package/dist/components/data-display/Table/Table.types.d.ts +8 -8
- package/dist/components/effects/CustomCursor/CustomCursor.js +2 -2
- package/dist/components/effects/GlassSurface/GlassSurface.d.ts +1 -1
- package/dist/components/effects/GlassSurface/GlassSurface.js +17 -9
- package/dist/components/effects/GlassSurface/GlassSurface.types.d.ts +6 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.d.ts +39 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.animations.js +98 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.js +104 -0
- package/dist/components/effects/InteractiveCharacters/InteractiveCharacters.types.d.ts +30 -0
- package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/BlobCharacter.js +36 -0
- package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/SmallCharacter.js +36 -0
- package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.d.ts +3 -0
- package/dist/components/effects/InteractiveCharacters/characters/TallCharacter.js +37 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useBlink.d.ts +14 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useBlink.js +41 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.d.ts +25 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useIdleAnimation.js +84 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.d.ts +18 -0
- package/dist/components/effects/InteractiveCharacters/hooks/useMouseTracking.js +35 -0
- package/dist/components/effects/InteractiveCharacters/index.d.ts +2 -0
- package/dist/components/effects/MorphingText/MorphingText.d.ts +1 -1
- package/dist/components/effects/MorphingText/MorphingText.js +6 -5
- package/dist/components/effects/Neumorphic/InsetCircleButton.d.ts +10 -0
- package/dist/components/effects/Neumorphic/InsetCircleButton.js +10 -0
- package/dist/components/effects/Neumorphic/InsetPill.d.ts +8 -0
- package/dist/components/effects/Neumorphic/InsetPill.js +7 -0
- package/dist/components/effects/Neumorphic/index.d.ts +4 -0
- package/dist/components/effects/NoiseOverlay/NoiseOverlay.d.ts +1 -1
- package/dist/components/effects/NoiseOverlay/NoiseOverlay.js +4 -4
- package/dist/components/effects/Overlay/Overlay.js +6 -4
- package/dist/components/effects/PageTransition/PageTransition.animations.d.ts +8 -0
- package/dist/components/effects/PageTransition/PageTransition.animations.js +53 -0
- package/dist/components/effects/PageTransition/PageTransition.d.ts +3 -0
- package/dist/components/effects/PageTransition/PageTransition.js +71 -0
- package/dist/components/effects/PageTransition/PageTransition.types.d.ts +15 -0
- package/dist/components/effects/PageTransition/index.d.ts +2 -0
- package/dist/components/effects/index.d.ts +6 -0
- package/dist/components/effects/index.js +4 -0
- package/dist/components/forms/Checkbox/Checkbox.animations.d.ts +14 -0
- package/dist/components/forms/Checkbox/Checkbox.animations.js +53 -0
- package/dist/components/forms/Checkbox/Checkbox.js +4 -2
- package/dist/components/forms/Checkbox/Checkbox.theme.js +3 -3
- package/dist/components/forms/ColorPicker/ColorPicker.types.d.ts +1 -1
- package/dist/components/forms/ColorPicker/ColorPickerBody.js +3 -3
- package/dist/components/forms/Combobox/Combobox.js +5 -3
- package/dist/components/forms/DatePicker/DatePickerBody.js +1 -1
- package/dist/components/forms/DateRangePicker/DateRangePicker.animations.d.ts +1 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.d.ts +37 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.js +110 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.d.ts +5 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +52 -0
- package/dist/components/forms/DateRangePicker/DateRangePicker.types.d.ts +154 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerBody.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerBody.js +208 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerPresets.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerPresets.js +41 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.d.ts +6 -0
- package/dist/components/forms/DateRangePicker/DateRangePickerTrigger.js +32 -0
- package/dist/components/forms/DateRangePicker/dateRangePresets.d.ts +5 -0
- package/dist/components/forms/DateRangePicker/dateRangePresets.js +59 -0
- package/dist/components/forms/DateRangePicker/index.d.ts +4 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.animations.d.ts +36 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.animations.js +22 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.d.ts +3 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.js +111 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.d.ts +19 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +27 -0
- package/dist/components/forms/FileUpload/FileUploadProgress.types.d.ts +33 -0
- package/dist/components/forms/FileUpload/index.d.ts +3 -0
- package/dist/components/forms/Input/Input.js +8 -13
- package/dist/components/forms/Input/Input.types.d.ts +6 -0
- package/dist/components/forms/InputAddress/InputAddress.theme.js +1 -1
- package/dist/components/forms/InputCounter/InputCounter.js +1 -1
- package/dist/components/forms/InputCreditCard/InputCreditCard.theme.js +1 -1
- package/dist/components/forms/InputOTP/InputOTP.theme.js +1 -1
- package/dist/components/forms/Radio/Radio.animations.d.ts +10 -0
- package/dist/components/forms/Radio/Radio.animations.js +33 -0
- package/dist/components/forms/Radio/Radio.js +11 -2
- package/dist/components/forms/Radio/Radio.theme.js +3 -3
- package/dist/components/forms/RichTextEditor/RichTextEditor.js +13 -4
- package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +2 -2
- package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +11 -0
- package/dist/components/forms/Select/Select.d.ts +1 -1
- package/dist/components/forms/Select/Select.js +7 -7
- package/dist/components/forms/Select/Select.types.d.ts +3 -3
- package/dist/components/forms/SelectableCard/SelectableCard.js +1 -1
- package/dist/components/forms/Slider/Slider.js +10 -3
- package/dist/components/forms/Slider/Slider.theme.js +3 -3
- package/dist/components/forms/Switch/Switch.js +10 -2
- package/dist/components/forms/Switch/Switch.theme.js +3 -3
- package/dist/components/forms/forms.theme.js +1 -1
- package/dist/components/forms/index.d.ts +6 -3
- package/dist/components/forms/index.js +8 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useMediaQuery.d.ts +5 -0
- package/dist/hooks/useMediaQuery.js +21 -0
- package/dist/index.js +21 -2
- package/dist/styles.css +1 -1
- package/dist/utils/dateUtils.js +56 -5
- package/dist/utils/formatUtils.d.ts +10 -0
- package/dist/utils/formatUtils.js +24 -0
- package/dist/utils/index.d.ts +1 -1
- package/package.json +12 -4
- package/src/global.scss +319 -39
- package/src/styles/theme.css +105 -16
- package/src/theme-plugin.css +13 -0
- package/dist/components/ai/ApprovalCard/ApprovalCard.d.ts +0 -3
- package/dist/components/ai/ApprovalCard/ApprovalCard.js +0 -16
- package/dist/components/ai/ApprovalCard/ApprovalCard.theme.d.ts +0 -13
- package/dist/components/ai/ApprovalCard/ApprovalCard.theme.js +0 -15
- package/dist/components/ai/ApprovalCard/ApprovalCard.types.d.ts +0 -43
- package/dist/components/ai/ApprovalCard/index.d.ts +0 -2
- package/dist/components/ai/MessageHistory/MessageHistory.d.ts +0 -18
- package/dist/components/ai/MessageHistory/MessageHistory.js +0 -98
- package/dist/components/ai/MessageHistory/MessageHistory.theme.d.ts +0 -2
- package/dist/components/ai/MessageHistory/MessageHistory.theme.js +0 -8
- package/dist/components/ai/MessageHistory/MessageHistory.types.d.ts +0 -94
- package/dist/components/ai/MessageHistory/index.d.ts +0 -3
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.animations.d.ts +0 -10
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.animations.js +0 -47
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.d.ts +0 -20
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.js +0 -55
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.theme.d.ts +0 -2
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.theme.js +0 -20
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.types.d.ts +0 -67
- package/dist/components/ai/ThinkingIndicator/index.d.ts +0 -3
- package/dist/components/forms/TransferList/TransferList.animations.d.ts +0 -10
- package/dist/components/forms/TransferList/TransferList.animations.js +0 -32
- package/dist/components/forms/TransferList/TransferList.d.ts +0 -28
- package/dist/components/forms/TransferList/TransferList.js +0 -199
- package/dist/components/forms/TransferList/TransferList.theme.d.ts +0 -6
- package/dist/components/forms/TransferList/TransferList.theme.js +0 -60
- package/dist/components/forms/TransferList/TransferList.types.d.ts +0 -101
- package/dist/components/forms/TransferList/index.d.ts +0 -3
- package/dist/icons/Icon.d.ts +0 -24
- package/dist/icons/Icon.js +0 -30
- package/dist/icons/Index.d.ts +0 -16
- package/dist/icons/core/ChevronUpDown.d.ts +0 -1
- package/dist/icons/core/ChevronUpDown.js +0 -7
- package/dist/icons/core/DollarIcon.d.ts +0 -1
- package/dist/icons/core/DollarIcon.js +0 -5
- package/dist/icons/core/LockIcon.d.ts +0 -1
- package/dist/icons/core/LockIcon.js +0 -5
- package/dist/icons/core/MinusIcon.d.ts +0 -1
- package/dist/icons/core/MinusIcon.js +0 -7
- package/dist/icons/core/PlusIcon.d.ts +0 -1
- package/dist/icons/core/PlusIcon.js +0 -7
- package/dist/icons/core/SearchIcon.d.ts +0 -1
- package/dist/icons/core/SearchIcon.js +0 -7
- package/dist/icons/core/TickIcon.d.ts +0 -1
- package/dist/icons/core/TickIcon.js +0 -5
- package/dist/icons/core/User.d.ts +0 -1
- package/dist/utils/useClickOutside.d.ts +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, { useState, useRef, useMemo,
|
|
2
|
+
import React__default, { useState, useCallback, useRef, useMemo, useEffect } from 'react';
|
|
3
3
|
import { createPortal } from 'react-dom';
|
|
4
4
|
import { useReducedMotion, AnimatePresence, motion } from 'motion/react';
|
|
5
5
|
import { FormLabel } from '../FormLabel/FormLabel.js';
|
|
@@ -73,7 +73,7 @@ const DEFAULT_TOOLBAR = {
|
|
|
73
73
|
"redo",
|
|
74
74
|
],
|
|
75
75
|
};
|
|
76
|
-
const RichTextEditor = React__default.forwardRef(({ size = "md", state = "default", className = "", label, labelClassName = "", helperText, helperTextClassName = "", value = "", onChange, placeholder = "Start typing...", id, required, minHeight = 120, maxHeight, toolbar: toolbarProp = DEFAULT_TOOLBAR, theme = {}, ...props }, ref) => {
|
|
76
|
+
const RichTextEditor = React__default.forwardRef(({ size = "md", state = "default", className = "", label, labelClassName = "", helperText, helperTextClassName = "", value = "", onChange, placeholder = "Start typing...", id, required, minHeight = 120, maxHeight, toolbar: toolbarProp = DEFAULT_TOOLBAR, theme = {}, sanitize, ...props }, ref) => {
|
|
77
77
|
const [isFocused, setIsFocused] = useState(false);
|
|
78
78
|
const [showToolbar, setShowToolbar] = useState(false);
|
|
79
79
|
const [toolbarPosition, setToolbarPosition] = useState({ top: 0, left: 0 });
|
|
@@ -82,6 +82,15 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
|
|
|
82
82
|
const [showColorPicker, setShowColorPicker] = useState(false);
|
|
83
83
|
const shouldReduceMotion = useReducedMotion();
|
|
84
84
|
const isClient = useIsClient();
|
|
85
|
+
// Built-in basic sanitizer: strips <script> tags and on* event handlers
|
|
86
|
+
const sanitizeHtml = useCallback((html) => {
|
|
87
|
+
if (sanitize)
|
|
88
|
+
return sanitize(html);
|
|
89
|
+
// Basic sanitization — strips script tags and inline event handlers
|
|
90
|
+
return html
|
|
91
|
+
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
|
|
92
|
+
.replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
|
|
93
|
+
}, [sanitize]);
|
|
85
94
|
const editorRef = useRef(null);
|
|
86
95
|
const toolbarRef = useRef(null);
|
|
87
96
|
const fontSizeTriggerRef = useRef(null);
|
|
@@ -512,10 +521,10 @@ const RichTextEditor = React__default.forwardRef(({ size = "md", state = "defaul
|
|
|
512
521
|
}, [toolbarConfig.position]);
|
|
513
522
|
useEffect(() => {
|
|
514
523
|
if (editorRef.current && value !== editorRef.current.innerHTML) {
|
|
515
|
-
editorRef.current.innerHTML = value;
|
|
524
|
+
editorRef.current.innerHTML = sanitizeHtml(value);
|
|
516
525
|
updateFormattingState();
|
|
517
526
|
}
|
|
518
|
-
}, [updateFormattingState, value]);
|
|
527
|
+
}, [updateFormattingState, value, sanitizeHtml]);
|
|
519
528
|
const renderToolbarTool = (tool, index) => {
|
|
520
529
|
var _a, _b;
|
|
521
530
|
const isActive = tool === "bold"
|
|
@@ -28,9 +28,9 @@ const richTextEditorTheme = {
|
|
|
28
28
|
// Toolbar styling (RTE-specific)
|
|
29
29
|
toolbarStyle: "flex items-center gap-1 p-2 border-b border-[var(--color-border)] bg-white dark:bg-[var(--color-background-secondary)]",
|
|
30
30
|
// Toolbar button styling
|
|
31
|
-
toolbarButtonStyle: "inline-flex items-center justify-center size-8 rounded-[calc(var(--radius-base)*0.75)] text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-white active:bg-
|
|
31
|
+
toolbarButtonStyle: "inline-flex items-center justify-center size-8 rounded-[calc(var(--radius-base)*0.75)] text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] hover:bg-white active:bg-[var(--color-background-tertiary)] transition-colors duration-300 disabled:opacity-50 disabled:cursor-not-allowed data-[state=active]:bg-[var(--color-background-tertiary)] data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:hover:bg-[var(--color-primary-50)] border border-transparent data-[pressed=true]:bg-[var(--color-primary-50)] data-[pressed=true]:text-[var(--color-primary-900)] data-[pressed=true]:shadow-inner data-[pressed=true]:border-[var(--color-primary-200)]",
|
|
32
32
|
// Dropdown styling (font size, color picker)
|
|
33
|
-
dropdownStyle: "fixed z-[1000] min-w-[120px] py-1 bg-white/90 backdrop-blur-md rounded-[var(--form-radius)] shadow-xl ring-1 ring-
|
|
33
|
+
dropdownStyle: "fixed z-[1000] min-w-[120px] py-1 bg-white/90 backdrop-blur-md rounded-[var(--form-radius)] shadow-xl ring-1 ring-[var(--color-border)] focus:outline-none",
|
|
34
34
|
// Dropdown item styling
|
|
35
35
|
dropdownItemStyle: "block w-full px-3 py-2 text-left text-base text-[var(--color-text-primary)] hover:bg-[var(--color-background-tertiary)] transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
36
36
|
// Separator between toolbar sections
|
|
@@ -48,6 +48,17 @@ export interface RichTextEditorProps extends Omit<React.HTMLAttributes<HTMLDivEl
|
|
|
48
48
|
toolbar?: ToolbarConfig;
|
|
49
49
|
/** Component-level theme overrides */
|
|
50
50
|
theme?: RichTextEditorThemeOverrides;
|
|
51
|
+
/**
|
|
52
|
+
* Optional HTML sanitizer function applied before setting innerHTML.
|
|
53
|
+
* Receives raw HTML string, must return sanitized HTML string.
|
|
54
|
+
* Recommended: pass DOMPurify.sanitize for robust XSS protection.
|
|
55
|
+
* If not provided, a basic built-in sanitizer strips script tags and on* event handlers.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* import DOMPurify from 'dompurify';
|
|
59
|
+
* <RichTextEditor sanitize={DOMPurify.sanitize} />
|
|
60
|
+
*/
|
|
61
|
+
sanitize?: (html: string) => string;
|
|
51
62
|
}
|
|
52
63
|
export type RichTextEditorSize = 'sm' | 'md' | 'lg';
|
|
53
64
|
export type RichTextEditorState = 'default' | 'disabled' | 'invalid';
|
|
@@ -88,6 +88,6 @@ export declare const SelectOptions: React.FC<SelectOptionsExtendedProps>;
|
|
|
88
88
|
* Select Option Component
|
|
89
89
|
*/
|
|
90
90
|
export declare const SelectOption: <T extends any>({ value, isSelected, disabled, className, onSelect, children, }: SelectOptionProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
91
|
-
export declare const Select: <T
|
|
91
|
+
export declare const Select: <T = unknown>(props: SelectProps<T> & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
|
|
92
92
|
export { useSelectState };
|
|
93
93
|
export type { UseSelectStateProps, UseSelectStateReturn };
|
|
@@ -7,11 +7,10 @@ import { FormLabel } from '../FormLabel/FormLabel.js';
|
|
|
7
7
|
import { Input } from '../Input/Input.js';
|
|
8
8
|
import '../Input/Input.theme.js';
|
|
9
9
|
import { createDropdownAnimations } from './Select.animations.js';
|
|
10
|
-
import { ChevronUpDownIcon } from '
|
|
10
|
+
import { ChevronUpDownIcon, PlusIcon, CheckIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
|
11
11
|
import { useSelectPortal } from '../../../hooks/useSelectPortal.js';
|
|
12
12
|
import { cn } from '../../../utils/cn.js';
|
|
13
13
|
import { isValidTypeaheadChar, findNextMatchingOption, TYPEAHEAD_TIMEOUT_MS } from '../../../utils/typeaheadUtils.js';
|
|
14
|
-
import { PlusIcon, CheckIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
|
15
14
|
import { Tag } from '../../core/Tag/Tag.js';
|
|
16
15
|
import { useIsClient } from '../../../hooks/useIsClient.js';
|
|
17
16
|
import { useSelectState } from './useSelectState.js';
|
|
@@ -124,7 +123,7 @@ const SelectButton = ({ id, disabled, isOpen, state = "default", size = "md", ic
|
|
|
124
123
|
? focusStateStyle ||
|
|
125
124
|
"outline-2 outline-[var(--color-primary)] -outline-offset-1 ring-4 ring-[var(--color-primary)]/10"
|
|
126
125
|
: "";
|
|
127
|
-
return (jsx("div", { className: cn(buttonWrapperStyle), children: jsxs("button", { ref: buttonRef, id: id, type: "button", className: cn(baseStyle, sizeStyle, stateStyle, hoverStateStyle, activeFocusState, iconStartPadding, iconEndPadding, buttonStyle, className), onClick: onClick, onFocus: onFocus, onBlur: onBlur, disabled: disabled, "aria-expanded": isOpen, "aria-haspopup": "listbox", children: [iconStart && jsx("span", { className: iconStartStyle, children: iconStart }), children, iconEnd && jsx("span", { className: iconEndStyle, children: iconEnd })] }) }));
|
|
126
|
+
return (jsx("div", { className: cn(buttonWrapperStyle), children: jsxs("button", { ref: buttonRef, id: id, type: "button", className: cn(baseStyle, sizeStyle, stateStyle, hoverStateStyle, activeFocusState, iconStartPadding, iconEndPadding, buttonStyle, className), onClick: onClick, onFocus: onFocus, onBlur: onBlur, disabled: disabled, "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": isOpen && id ? `${id}-listbox` : undefined, children: [iconStart && jsx("span", { className: iconStartStyle, children: iconStart }), children, iconEnd && jsx("span", { className: iconEndStyle, children: iconEnd })] }) }));
|
|
128
127
|
};
|
|
129
128
|
/**
|
|
130
129
|
* Select Options Component
|
|
@@ -316,7 +315,7 @@ const SelectOptions = ({ isOpen, maxHeight = "15rem", className = "", onClose, c
|
|
|
316
315
|
}),
|
|
317
316
|
}, role: "listbox", tabIndex: -1, variants: animations, initial: "initial", animate: "visible", exit: "exit", children: [searchable && (jsx("div", { className: `sticky top-0 py-1 bg-[var(--color-background)] z-[10000] border-b border-[var(--color-border)] ${searchInputStyle}`, style: {
|
|
318
317
|
"--form-radius": "0",
|
|
319
|
-
}, children: jsx(Input, { placeholder: "Search...", value: searchValue, onChange: handleSearchChange, type: "search", ref: searchInputRef, className: "w-full block bg-[var(--color-background)] border-none outline-none !min-h-8 py-2 ring-0 shadow-none [&:focus]:outline-none [&:focus]:ring-0 [&:focus]:border-none [&:focus-visible]:outline-none [&:focus-visible]:ring-0 [&:focus-visible]:border-none", iconStart: jsx(MagnifyingGlassIcon, { strokeWidth: 2, className: "size-4 text-[var(--color-text-muted)] group-focus-within:text-[var(--color-primary)]" }), wrapperClassName: "!border-none !outline-none !ring-0 !shadow-none", inputGroupClassName: "!border-none !outline-none !ring-0 !shadow-none flex items-center", style: {
|
|
318
|
+
}, children: jsx(Input, { placeholder: "Search...", "aria-label": "Search options", value: searchValue, onChange: handleSearchChange, type: "search", ref: searchInputRef, className: "w-full block bg-[var(--color-background)] border-none outline-none !min-h-8 py-2 ring-0 shadow-none [&:focus]:outline-none [&:focus]:ring-0 [&:focus]:border-none [&:focus-visible]:outline-none [&:focus-visible]:ring-0 [&:focus-visible]:border-none", iconStart: jsx(MagnifyingGlassIcon, { strokeWidth: 2, className: "size-4 text-[var(--color-text-muted)] group-focus-within:text-[var(--color-primary)]" }), wrapperClassName: "!border-none !outline-none !ring-0 !shadow-none", inputGroupClassName: "!border-none !outline-none !ring-0 !shadow-none flex items-center", style: {
|
|
320
319
|
border: "none",
|
|
321
320
|
outline: "none",
|
|
322
321
|
boxShadow: "none",
|
|
@@ -435,7 +434,7 @@ const SelectInner = ({ id, name, size = "md", state = "default", value, displayV
|
|
|
435
434
|
// Container style
|
|
436
435
|
const containerStyle = theme.containerStyle || "";
|
|
437
436
|
// Default chevron icon if no iconEnd provided
|
|
438
|
-
const defaultChevronIcon = jsx(ChevronUpDownIcon, {
|
|
437
|
+
const defaultChevronIcon = jsx(ChevronUpDownIcon, { className: "size-4" });
|
|
439
438
|
// Generate a unique ID if not provided
|
|
440
439
|
const generatedId = React__default.useId();
|
|
441
440
|
const selectId = id || generatedId;
|
|
@@ -452,7 +451,8 @@ const SelectInner = ({ id, name, size = "md", state = "default", value, displayV
|
|
|
452
451
|
return (jsx(SelectOption, { value: option.value, isSelected: isSelected, disabled: option.disabled || false, children: isCreateOption ? (jsxs("span", { className: "flex items-center gap-2", children: [jsx(PlusIcon, { className: "size-4 shrink-0" }), jsx("span", { className: "block truncate", children: option.label })] })) : multiple ? (jsxs(Fragment, { children: [jsx("span", { className: "block truncate", children: option.label }), isSelected && (jsx("span", { className: theme.checkIconStyle, children: jsx(CheckIcon, { className: "size-4", strokeWidth: 2 }) }))] })) : (jsx("span", { className: "block truncate", children: option.label })) }, option.id));
|
|
453
452
|
}) }), helperText && (typeof helperText === 'string' ? (jsx("p", { className: cn(helperTextStyle, helperTextStateStyle), children: helperText })) : (helperText)), name && (jsx("input", { type: "hidden", name: name, value: selectedValue !== undefined ? String(selectedValue) : "" }))] }) }));
|
|
454
453
|
};
|
|
455
|
-
const
|
|
456
|
-
|
|
454
|
+
const SelectForwarded = React__default.forwardRef(SelectInner);
|
|
455
|
+
SelectForwarded.displayName = "Select";
|
|
456
|
+
const Select = SelectForwarded;
|
|
457
457
|
|
|
458
458
|
export { Select, SelectButton, SelectContext, SelectOption, SelectOptions, SelectProvider, useSelectContext, useSelectState };
|
|
@@ -4,7 +4,7 @@ import type { SelectPlacement } from "../../../hooks/useSelectPortal";
|
|
|
4
4
|
* Select value option type
|
|
5
5
|
* @template T The type of the option value
|
|
6
6
|
*/
|
|
7
|
-
export interface SelectOption<T =
|
|
7
|
+
export interface SelectOption<T = unknown> {
|
|
8
8
|
/** Unique identifier for the option */
|
|
9
9
|
id: string | number;
|
|
10
10
|
/** Display label for the option */
|
|
@@ -25,7 +25,7 @@ export interface SelectBaseProps {
|
|
|
25
25
|
* Select component props
|
|
26
26
|
* @template T The type of the select value
|
|
27
27
|
*/
|
|
28
|
-
export interface SelectProps<T =
|
|
28
|
+
export interface SelectProps<T = unknown> extends SelectBaseProps {
|
|
29
29
|
/** ID for the select component */
|
|
30
30
|
id?: string;
|
|
31
31
|
/** Name for the select component */
|
|
@@ -138,7 +138,7 @@ export interface SelectOptionsProps extends SelectBaseProps {
|
|
|
138
138
|
/**
|
|
139
139
|
* Select option props
|
|
140
140
|
*/
|
|
141
|
-
export interface SelectOptionProps<T =
|
|
141
|
+
export interface SelectOptionProps<T = unknown> extends SelectBaseProps {
|
|
142
142
|
/** Option value */
|
|
143
143
|
value: T;
|
|
144
144
|
/** Whether the option is currently selected */
|
|
@@ -16,7 +16,7 @@ const CheckboxIndicator = ({ checked }) => (jsx("div", { className: cn("flex-shr
|
|
|
16
16
|
? "border-[var(--color-primary)] bg-[var(--color-primary)]"
|
|
17
17
|
: "border-[var(--color-border)] bg-[var(--color-background)]"), children: checked && jsx(CheckIcon, { className: "size-3.5 stroke-white", strokeWidth: 3 }) }));
|
|
18
18
|
// ─── SelectableCard ──────────────────────────────────────────────────────────
|
|
19
|
-
const SelectableCardRoot = React__default.forwardRef(({ value, disabled: cardDisabled, className, children, ...props }, ref) => {
|
|
19
|
+
const SelectableCardRoot = React__default.forwardRef(({ value, disabled: cardDisabled, className, children, onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, ...props }, ref) => {
|
|
20
20
|
const content = children;
|
|
21
21
|
const ctx = useSelectableCardContext();
|
|
22
22
|
const inputId = useId();
|
|
@@ -216,18 +216,25 @@ const Slider = React__default.forwardRef(({ state = "default", className = "", l
|
|
|
216
216
|
}
|
|
217
217
|
return `${currentValue}${unit}`;
|
|
218
218
|
};
|
|
219
|
-
|
|
219
|
+
const filterId = `slider-liquid-lens-${sliderId}`;
|
|
220
|
+
return (jsxs("div", { className: cn(mergedTheme.wrapperStyle, wrapperClassName), ref: ref, ...props, children: [jsx("svg", { width: "0", height: "0", className: "absolute", "aria-hidden": "true", children: jsx("defs", { children: jsxs("filter", { id: filterId, children: [jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "1", result: "blur" }), jsx("feColorMatrix", { in: "blur", type: "matrix", values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7", result: "goo" }), jsx("feComposite", { in: "SourceGraphic", in2: "goo", operator: "atop" })] }) }) }), label && (jsx(FormLabel, { htmlFor: sliderId, required: required, className: cn(mergedTheme.labelStyle, labelClassName), children: label })), jsxs("div", { className: "flex items-center gap-4", children: [iconStart && (jsx("div", { className: "flex-shrink-0 text-[var(--color-text-muted)]", children: iconStart })), showMinMax && (jsx("span", { className: cn(mergedTheme.minMaxLabelStyle), children: min })), jsxs("div", { className: cn(mergedTheme.rootStyle, className), "data-disabled": isDisabled || undefined, "data-invalid": isInvalid || undefined, "data-orientation": "horizontal", children: [jsxs("div", { ref: trackRef, className: mergedTheme.trackStyle, onPointerDown: handleTrackClick, role: "presentation", children: [jsx("div", { className: mergedTheme.rangeStyle, style: getFilledTrackStyle() }), showTicks &&
|
|
220
221
|
ticks.map((tick) => {
|
|
221
222
|
const percentage = getPercentage(tick);
|
|
222
223
|
return (jsx("div", { className: mergedTheme.tickStyle, style: { left: `${percentage}%` } }, tick));
|
|
223
224
|
})] }), values.map((val, index) => {
|
|
224
225
|
const percentage = getPercentage(val);
|
|
225
|
-
return (
|
|
226
|
+
return (jsxs("div", { className: cn(mergedTheme.thumbStyle, "outline-[2px] outline-[var(--color-border)]/80 ring-0 shadow-lg p-0"), style: {
|
|
226
227
|
left: `${percentage}%`,
|
|
227
228
|
transform: "translate(-50%, -50%)",
|
|
228
229
|
position: "absolute",
|
|
229
230
|
top: "50%",
|
|
230
|
-
}, onPointerDown: (e) => handlePointerDown(e, index), onKeyDown: (e) => handleKeyDown(e, index), role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": val, "aria-orientation": "horizontal", "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (range ? `Slider thumb ${index + 1}` : "Slider"), "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby !== null && ariaDescribedby !== void 0 ? ariaDescribedby : helperTextId, tabIndex: isDisabled ? -1 : 0, "data-disabled": isDisabled || undefined, "data-invalid": isInvalid || undefined
|
|
231
|
+
}, onPointerDown: (e) => handlePointerDown(e, index), onKeyDown: (e) => handleKeyDown(e, index), role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": val, "aria-orientation": "horizontal", "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (range ? `Slider thumb ${index + 1}` : "Slider"), "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby !== null && ariaDescribedby !== void 0 ? ariaDescribedby : helperTextId, tabIndex: isDisabled ? -1 : 0, "data-disabled": isDisabled || undefined, "data-invalid": isInvalid || undefined, children: [jsx("div", { className: "absolute inset-0 z-0 rounded-full", style: {
|
|
232
|
+
backdropFilter: "blur(0.6px)",
|
|
233
|
+
WebkitBackdropFilter: "blur(0.6px)",
|
|
234
|
+
filter: `url(#${filterId})`,
|
|
235
|
+
}, "aria-hidden": "true" }), jsx("div", { className: "absolute inset-0 z-[1] rounded-full bg-[var(--color-surface)]/90", "aria-hidden": "true" }), jsx("div", { className: "absolute inset-0 z-[2] rounded-full", style: {
|
|
236
|
+
boxShadow: "inset 1px 1px 0 rgba(255,255,255,0.35), inset 1px 3px 0 rgba(0,0,0,0.03), inset 0 0 14px rgba(255,255,255,0.25), inset -1px -1px 0 rgba(0,0,0,0.06)",
|
|
237
|
+
}, "aria-hidden": "true" })] }, index));
|
|
231
238
|
}), name && (jsx("input", { type: "hidden", name: name, value: Array.isArray(currentValue)
|
|
232
239
|
? currentValue.join(",")
|
|
233
240
|
: currentValue }))] }), showMinMax && (jsx("span", { className: cn(mergedTheme.minMaxLabelStyle), children: max })), showValue && (jsx("div", { className: cn(mergedTheme.valueDisplayStyle), children: formatValueDisplay() })), iconEnd && (jsx("div", { className: "flex-shrink-0 text-[var(--color-text-muted)]", children: iconEnd }))] }), helperText && (jsx("div", { id: helperTextId, className: cn(mergedTheme.helperTextStyle, helperTextClassName), children: helperText }))] }));
|
|
@@ -10,17 +10,17 @@ const sliderTheme = {
|
|
|
10
10
|
// Root container with layout
|
|
11
11
|
rootStyle: "relative flex items-center w-full touch-none select-none data-[orientation=vertical]:flex-col data-[orientation=vertical]:h-full",
|
|
12
12
|
// Track (background)
|
|
13
|
-
trackStyle: "relative w-full h-2 grow rounded-full bg-
|
|
13
|
+
trackStyle: "relative w-full h-2 grow rounded-full bg-[var(--color-background-tertiary)] overflow-hidden data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[orientation=vertical]:w-2 data-[orientation=vertical]:h-full shadow-inner",
|
|
14
14
|
// Range (filled portion) - rounded to match track clipping
|
|
15
15
|
rangeStyle: "absolute h-full bg-gradient-to-r from-[var(--color-primary-500)] to-[var(--color-primary-700)] transition-all rounded-full data-[disabled]:bg-[var(--color-background-disabled)] data-[invalid]:bg-[var(--color-danger)]",
|
|
16
16
|
// Thumb (draggable handle)
|
|
17
|
-
thumbStyle: "block h-5 w-
|
|
17
|
+
thumbStyle: "block h-5 w-7 rounded-full bg-transparent overflow-hidden cursor-grab active:cursor-grabbing active:scale-x-110 active:scale-y-[0.98] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-border)] focus-visible:ring-offset-2 transition-all hover:scale-110 data-[disabled]:cursor-not-allowed data-[disabled]:hover:scale-100 data-[invalid]:focus-visible:ring-[var(--color-danger)]",
|
|
18
18
|
// Value display
|
|
19
19
|
valueDisplayStyle: "text-base font-medium text-[var(--color-text-secondary)] w-fit min-w-12",
|
|
20
20
|
// Min/max labels
|
|
21
21
|
minMaxLabelStyle: "text-base font-medium text-[var(--color-text-muted)]",
|
|
22
22
|
// Tick marks
|
|
23
|
-
tickStyle: "absolute w-0.5 h-2 bg-
|
|
23
|
+
tickStyle: "absolute w-0.5 h-2 bg-[var(--color-border)] -translate-x-0.5 pointer-events-none",
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
export { sliderTheme };
|
|
@@ -34,7 +34,9 @@ const Switch = React__default.forwardRef(({ id, checked: controlledChecked, onCh
|
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
36
|
// Label and description content
|
|
37
|
-
const labelContent = label || description ? (jsxs("div", { className: "flex grow flex-col", children: [label &&
|
|
37
|
+
const labelContent = label || description ? (jsxs("div", { className: "flex grow flex-col", children: [label &&
|
|
38
|
+
(typeof label === "string" ? (jsx(FormLabel, { htmlFor: id, state: state, children: label })) : (label)), description &&
|
|
39
|
+
(typeof description === "string" ? (jsx("div", { className: cn(switchTheme.description, theme === null || theme === void 0 ? void 0 : theme.description), children: description })) : (description))] })) : null;
|
|
38
40
|
// Build data attributes for state-based styling
|
|
39
41
|
const trackDataState = isDisabled
|
|
40
42
|
? "disabled"
|
|
@@ -43,8 +45,14 @@ const Switch = React__default.forwardRef(({ id, checked: controlledChecked, onCh
|
|
|
43
45
|
: isChecked
|
|
44
46
|
? "checked"
|
|
45
47
|
: "unchecked";
|
|
48
|
+
const filterId = `switch-liquid-lens-${id}`;
|
|
46
49
|
// Switch toggle component
|
|
47
|
-
const switchToggle = (jsxs("div", { className: "relative flex items-center h-6", children: [jsx("input", { ref: ref, type: "checkbox", id: id, checked: isChecked, onChange: handleChange, disabled: isDisabled, className: "sr-only", "aria-checked": isChecked, "aria-invalid": isInvalid }), jsx("div", { className: cn(switchTheme.track, theme === null || theme === void 0 ? void 0 : theme.track), "data-state": trackDataState, onClick: handleTrackClick, children:
|
|
50
|
+
const switchToggle = (jsxs("div", { className: "relative flex items-center h-6", children: [jsx("input", { ref: ref, type: "checkbox", id: id, checked: isChecked, onChange: handleChange, disabled: isDisabled, className: "sr-only", "aria-checked": isChecked, "aria-invalid": isInvalid }), jsx("svg", { width: "0", height: "0", className: "absolute", "aria-hidden": "true", children: jsx("defs", { children: jsxs("filter", { id: filterId, children: [jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "1", result: "blur" }), jsx("feColorMatrix", { in: "blur", type: "matrix", values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7", result: "goo" }), jsx("feComposite", { in: "SourceGraphic", in2: "goo", operator: "atop" })] }) }) }), jsx("div", { className: cn(switchTheme.track, theme === null || theme === void 0 ? void 0 : theme.track), "data-state": trackDataState, onClick: handleTrackClick, children: jsxs(motion.div, { className: cn(switchTheme.thumb, theme === null || theme === void 0 ? void 0 : theme.thumb, ""), initial: false, animate: isChecked ? thumbPositions.checked : thumbPositions.unchecked, transition: { type: "spring", stiffness: 500, damping: 30 }, whileTap: isDisabled ? undefined : { scale: 1.15 }, style: { filter: `url(#${filterId})` }, children: [jsx("div", { className: "absolute inset-0 z-0 rounded-full", style: {
|
|
51
|
+
backdropFilter: "blur(0.6px)",
|
|
52
|
+
WebkitBackdropFilter: "blur(0.6px)",
|
|
53
|
+
}, "aria-hidden": "true" }), jsx("div", { className: "absolute inset-0 z-[1] rounded-full bg-[var(--color-surface)]/80", "aria-hidden": "true" }), jsx("div", { className: "absolute inset-0 z-[2] rounded-full", style: {
|
|
54
|
+
boxShadow: "inset 1px 1px 0 rgba(255,255,255,0.35), inset 1px 3px 0 rgba(0,0,0,0.03), inset 0 0 14px rgba(255,255,255,0.25), inset -1px -1px 0 rgba(0,0,0,0.06)",
|
|
55
|
+
}, "aria-hidden": "true" })] }) })] }));
|
|
48
56
|
return (jsxs("div", { className: cn(switchTheme.container, labelPosition === "start" ? "flex-row-reverse" : "flex-row", theme === null || theme === void 0 ? void 0 : theme.container, className), ...rest, children: [labelContent, switchToggle] }));
|
|
49
57
|
});
|
|
50
58
|
Switch.displayName = "Switch";
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
*/
|
|
4
4
|
const switchTheme = {
|
|
5
5
|
container: "flex w-full justify-between items-center gap-4",
|
|
6
|
-
track: "w-12 h-6 rounded-full
|
|
7
|
-
thumb: "w-7 h-5 rounded-full
|
|
6
|
+
track: "w-12 h-6 rounded-full cursor-pointer shadow-inner bg-[var(--color-background-tertiary)] data-[state=checked]:bg-[var(--color-primary)] data-[state=disabled]:bg-[var(--color-background-disabled)] data-[state=disabled]:cursor-not-allowed data-[state=invalid]:border-2 data-[state=invalid]:border-[var(--color-danger)] outline outline-[var(--color-border)] transition-colors duration-300",
|
|
7
|
+
thumb: "w-7 h-5 rounded-full bg-transparent overflow-hidden border border-[var(--color-border)]/40 shadow-lg",
|
|
8
8
|
description: "text-base text-[var(--color-text-muted)] -mt-1.5",
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
11
|
* Thumb position values for animation
|
|
12
12
|
*/
|
|
13
13
|
const thumbPositions = {
|
|
14
|
-
checked: { x:
|
|
14
|
+
checked: { x: 16, y: 2 },
|
|
15
15
|
unchecked: { x: 2, y: 2 },
|
|
16
16
|
};
|
|
17
17
|
|
|
@@ -72,7 +72,7 @@ const formsBaseTheme = {
|
|
|
72
72
|
invalid: "",
|
|
73
73
|
},
|
|
74
74
|
// Common helper text style with state variations
|
|
75
|
-
helperText: "text-sm text-
|
|
75
|
+
helperText: "text-sm text-[var(--color-text-muted)] mt-1.5 [.state-disabled_&]:text-[var(--color-text-disabled)] [.state-invalid_&]:text-[var(--color-danger-500)] " +
|
|
76
76
|
"dark:text-[var(--color-neutral-400)] dark:[.state-invalid_&]:text-[var(--color-danger-400)]",
|
|
77
77
|
// Common icon styles
|
|
78
78
|
iconStyles: {
|
|
@@ -22,9 +22,15 @@ export { switchTheme } from "./Switch";
|
|
|
22
22
|
export { DatePicker, DatePickerTrigger, DatePickerBody, DatePickerPresets, } from "./DatePicker";
|
|
23
23
|
export type { DatePickerProps, DatePickerTriggerProps, DatePickerBodyProps, DatePickerSize, DatePickerState, DatePickerPlacement, DatePickerMode, DatePickerTheme, DateRange, DateRangePreset, } from "./DatePicker";
|
|
24
24
|
export { datePickerTheme } from "./DatePicker";
|
|
25
|
+
export { DateRangePicker, DateRangePickerTrigger, DateRangePickerBody, DateRangePickerPresets, } from "./DateRangePicker";
|
|
26
|
+
export type { DateRangePickerProps, DateRangePickerTriggerProps, DateRangePickerBodyProps, DateRangePickerPresetsProps, DateRangePickerSize, DateRangePickerState, DateRangePickerPlacement, DateRangePickerTheme, } from "./DateRangePicker";
|
|
27
|
+
export { dateRangePickerTheme, DEFAULT_DATE_RANGE_PRESETS } from "./DateRangePicker";
|
|
25
28
|
export { FileUpload } from "./FileUpload";
|
|
26
29
|
export type { FileUploadProps, FileUploadThemeOverrides, UploadedFile, } from "./FileUpload";
|
|
27
30
|
export { fileUploadTheme } from "./FileUpload";
|
|
31
|
+
export { FileUploadProgress } from "./FileUpload";
|
|
32
|
+
export type { FileUploadProgressProps, FileUploadProgressItem, FileUploadProgressStatus, FileUploadProgressThemeOverrides, } from "./FileUpload";
|
|
33
|
+
export { fileUploadProgressTheme } from "./FileUpload";
|
|
28
34
|
export { TimePicker } from "./TimePicker";
|
|
29
35
|
export type { TimePickerProps, TimePickerSize, TimePickerState, TimePickerThemeOverrides, } from "./TimePicker";
|
|
30
36
|
export { timePickerTheme } from "./TimePicker";
|
|
@@ -63,9 +69,6 @@ export * from "./ColorPicker";
|
|
|
63
69
|
export { SelectableCard } from "./SelectableCard";
|
|
64
70
|
export type { SelectableCardProps, SelectableCardGroupProps, SelectableCardType, SelectableCardIndicator, SelectableCardTheme, } from "./SelectableCard";
|
|
65
71
|
export { selectableCardTheme } from "./SelectableCard";
|
|
66
|
-
export { TransferList } from "./TransferList";
|
|
67
|
-
export type { TransferListProps, TransferListItem, TransferListSize, TransferListTheme, } from "./TransferList";
|
|
68
|
-
export { transferListTheme } from "./TransferList";
|
|
69
72
|
export { Mention } from "./Mention";
|
|
70
73
|
export type { MentionProps, MentionSuggestion, MentionTrigger, MentionSize, MentionTheme, MentionThemeOverrides, } from "./Mention";
|
|
71
74
|
export { mentionTheme } from "./Mention";
|
|
@@ -14,8 +14,13 @@ export { Switch } from './Switch/Switch.js';
|
|
|
14
14
|
export { switchTheme } from './Switch/Switch.theme.js';
|
|
15
15
|
export { DatePicker } from './DatePicker/DatePicker.js';
|
|
16
16
|
export { datePickerTheme } from './DatePicker/DatePicker.theme.js';
|
|
17
|
+
export { DateRangePicker } from './DateRangePicker/DateRangePicker.js';
|
|
18
|
+
export { dateRangePickerTheme } from './DateRangePicker/DateRangePicker.theme.js';
|
|
19
|
+
export { DEFAULT_DATE_RANGE_PRESETS } from './DateRangePicker/dateRangePresets.js';
|
|
17
20
|
export { FileUpload } from './FileUpload/FileUpload.js';
|
|
18
21
|
export { fileUploadTheme } from './FileUpload/FileUpload.theme.js';
|
|
22
|
+
export { FileUploadProgress } from './FileUpload/FileUploadProgress.js';
|
|
23
|
+
export { fileUploadProgressTheme } from './FileUpload/FileUploadProgress.theme.js';
|
|
19
24
|
export { TimePicker } from './TimePicker/TimePicker.js';
|
|
20
25
|
import 'react/jsx-runtime';
|
|
21
26
|
import 'react';
|
|
@@ -60,8 +65,6 @@ export { ColorPickerPresets } from './ColorPicker/ColorPickerPresets.js';
|
|
|
60
65
|
export { formatHex, formatHsl, formatRgb, hexToRgb, hslToRgb, hsvToRgb, parseColor, rgbToHex, rgbToHsl, rgbToHsv, validateHex, validateRgb } from './ColorPicker/colorUtils.js';
|
|
61
66
|
export { SelectableCard } from './SelectableCard/SelectableCard.js';
|
|
62
67
|
export { selectableCardTheme } from './SelectableCard/SelectableCard.theme.js';
|
|
63
|
-
export { TransferList } from './TransferList/TransferList.js';
|
|
64
|
-
export { transferListTheme } from './TransferList/TransferList.theme.js';
|
|
65
68
|
export { Mention } from './Mention/Mention.js';
|
|
66
69
|
export { mentionTheme } from './Mention/Mention.theme.js';
|
|
67
70
|
export { CronInput } from './CronInput/CronInput.js';
|
|
@@ -70,3 +73,6 @@ export { CRON_PRESETS, cronToDescription, fieldsToCron, formatNextRun, getNextRu
|
|
|
70
73
|
export { DatePickerBody } from './DatePicker/DatePickerBody.js';
|
|
71
74
|
export { DatePickerPresets } from './DatePicker/DatePickerPresets.js';
|
|
72
75
|
export { DatePickerTrigger } from './DatePicker/DatePickerTrigger.js';
|
|
76
|
+
export { DateRangePickerBody } from './DateRangePicker/DateRangePickerBody.js';
|
|
77
|
+
export { DateRangePickerPresets } from './DateRangePicker/DateRangePickerPresets.js';
|
|
78
|
+
export { DateRangePickerTrigger } from './DateRangePicker/DateRangePickerTrigger.js';
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -13,3 +13,4 @@ export { useIsClient } from "./useIsClient";
|
|
|
13
13
|
export { useClickOutside } from "./useClickOutside";
|
|
14
14
|
export { useScaleBackground } from "./useScaleBackground";
|
|
15
15
|
export type { UseScaleBackgroundOptions } from "./useScaleBackground";
|
|
16
|
+
export { useMediaQuery } from "./useMediaQuery";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook to detect if a media query matches.
|
|
5
|
+
* Returns false during SSR and on first render (safe default).
|
|
6
|
+
*/
|
|
7
|
+
const useMediaQuery = (query) => {
|
|
8
|
+
const [matches, setMatches] = useState(false);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (typeof window === "undefined")
|
|
11
|
+
return;
|
|
12
|
+
const mql = window.matchMedia(query);
|
|
13
|
+
setMatches(mql.matches);
|
|
14
|
+
const handler = (e) => setMatches(e.matches);
|
|
15
|
+
mql.addEventListener("change", handler);
|
|
16
|
+
return () => mql.removeEventListener("change", handler);
|
|
17
|
+
}, [query]);
|
|
18
|
+
return matches;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { useMediaQuery };
|
package/dist/index.js
CHANGED
|
@@ -66,10 +66,15 @@ export { ContextMenu } from './components/core/ContextMenu/ContextMenu.js';
|
|
|
66
66
|
export { CronInput } from './components/forms/CronInput/CronInput.js';
|
|
67
67
|
export { CustomCursor } from './components/effects/CustomCursor/CustomCursor.js';
|
|
68
68
|
export { DEFAULT_CHART_COLORS, EXTENDED_CHART_COLORS, MINIMAL_CHART_COLORS, colorClassToVariable, combineClasses, createColorClass, extractFillClass, extractStrokeClass, generateColorPalette, generateSeriesColors, getContrastColor } from './components/charts/utils/color-utils.js';
|
|
69
|
+
export { DEFAULT_DATE_RANGE_PRESETS } from './components/forms/DateRangePicker/dateRangePresets.js';
|
|
69
70
|
export { DatePicker } from './components/forms/DatePicker/DatePicker.js';
|
|
70
71
|
export { DatePickerBody } from './components/forms/DatePicker/DatePickerBody.js';
|
|
71
72
|
export { DatePickerPresets } from './components/forms/DatePicker/DatePickerPresets.js';
|
|
72
73
|
export { DatePickerTrigger } from './components/forms/DatePicker/DatePickerTrigger.js';
|
|
74
|
+
export { DateRangePicker } from './components/forms/DateRangePicker/DateRangePicker.js';
|
|
75
|
+
export { DateRangePickerBody } from './components/forms/DateRangePicker/DateRangePickerBody.js';
|
|
76
|
+
export { DateRangePickerPresets } from './components/forms/DateRangePicker/DateRangePickerPresets.js';
|
|
77
|
+
export { DateRangePickerTrigger } from './components/forms/DateRangePicker/DateRangePickerTrigger.js';
|
|
73
78
|
export { DescriptionList } from './components/data-display/DescriptionList/DescriptionList.js';
|
|
74
79
|
export { DonutChart } from './components/charts/DonutChart/DonutChart.js';
|
|
75
80
|
export { DotPattern } from './components/effects/DotPattern/DotPattern.js';
|
|
@@ -86,6 +91,7 @@ export { Empty } from './components/core/Empty/Empty.js';
|
|
|
86
91
|
export { Feed } from './components/data-display/Feed/Feed.js';
|
|
87
92
|
export { FileTypeIcon } from './components/core/FileTypeIcon/FileTypeIcon.js';
|
|
88
93
|
export { FileUpload } from './components/forms/FileUpload/FileUpload.js';
|
|
94
|
+
export { FileUploadProgress } from './components/forms/FileUpload/FileUploadProgress.js';
|
|
89
95
|
export { FormLabel } from './components/forms/FormLabel/FormLabel.js';
|
|
90
96
|
export { FunnelChart } from './components/charts/FunnelChart/FunnelChart.js';
|
|
91
97
|
export { GanttChart } from './components/data-display/GanttChart/GanttChart.js';
|
|
@@ -101,6 +107,9 @@ export { InputCreditCard } from './components/forms/InputCreditCard/InputCreditC
|
|
|
101
107
|
export { InputDate } from './components/forms/InputDate/InputDate.js';
|
|
102
108
|
export { InputOTP } from './components/forms/InputOTP/InputOTP.js';
|
|
103
109
|
export { InputTag } from './components/forms/InputTag/InputTag.js';
|
|
110
|
+
export { InsetCircleButton } from './components/effects/Neumorphic/InsetCircleButton.js';
|
|
111
|
+
export { InsetPill } from './components/effects/Neumorphic/InsetPill.js';
|
|
112
|
+
export { InteractiveCharacters } from './components/effects/InteractiveCharacters/InteractiveCharacters.js';
|
|
104
113
|
export { KPI } from './components/data-display/KPI/KPI.js';
|
|
105
114
|
export { Kbd } from './components/core/Kbd/Kbd.js';
|
|
106
115
|
export { LINE_CHART_DEFAULTS } from './components/charts/LineChart/LineChart.types.js';
|
|
@@ -111,7 +120,16 @@ export { Masonry } from './components/core/Masonry/Masonry.js';
|
|
|
111
120
|
export { Mention } from './components/forms/Mention/Mention.js';
|
|
112
121
|
export { MenuItem } from './components/core/MenuItem/MenuItem.js';
|
|
113
122
|
export { Message } from './components/core/Message/Message.js';
|
|
123
|
+
export { MessageAudio } from './components/core/Message/MessageAudio.js';
|
|
114
124
|
export { MessageBody } from './components/core/Message/MessageBody.js';
|
|
125
|
+
export { MessageDateDivider } from './components/core/Message/MessageDateDivider.js';
|
|
126
|
+
export { MessageFile } from './components/core/Message/MessageFile.js';
|
|
127
|
+
export { MessageImage } from './components/core/Message/MessageImage.js';
|
|
128
|
+
export { MessageLink } from './components/core/Message/MessageLink.js';
|
|
129
|
+
export { MessageReactions } from './components/core/Message/MessageReactions.js';
|
|
130
|
+
export { MessageReply } from './components/core/Message/MessageReply.js';
|
|
131
|
+
export { MessageSenderName } from './components/core/Message/MessageSenderName.js';
|
|
132
|
+
export { MessageStatusIndicator } from './components/core/Message/MessageStatusIndicator.js';
|
|
115
133
|
export { Metric } from './components/data-display/Metric/Metric.js';
|
|
116
134
|
export { Modal } from './components/core/Modal/Modal.js';
|
|
117
135
|
export { ModalStack } from './components/core/ModalStack/ModalStack.js';
|
|
@@ -127,6 +145,7 @@ export { PageHeadingBackButton } from './components/core/PageHeading/PageHeading
|
|
|
127
145
|
export { PageHeadingIcon } from './components/core/PageHeading/PageHeadingIcon.js';
|
|
128
146
|
export { PageHeadingSubtitle } from './components/core/PageHeading/PageHeadingSubtitle.js';
|
|
129
147
|
export { PageHeadingTitle } from './components/core/PageHeading/PageHeadingTitle.js';
|
|
148
|
+
export { PageTransition } from './components/effects/PageTransition/PageTransition.js';
|
|
130
149
|
export { Pagination } from './components/core/Pagination/Pagination.js';
|
|
131
150
|
export { ParallaxSection } from './components/effects/ParallaxSection/ParallaxSection.js';
|
|
132
151
|
export { Pill } from './components/core/Pill/Pill.js';
|
|
@@ -186,7 +205,6 @@ export { Timeline } from './components/data-display/Timeline/Timeline.js';
|
|
|
186
205
|
export { Toast } from './components/core/Toast/Toast.js';
|
|
187
206
|
export { ToastProvider, useToastContext } from './components/core/Toast/ToastProvider.js';
|
|
188
207
|
export { Tooltip } from './components/core/Tooltip/Tooltip.js';
|
|
189
|
-
export { TransferList } from './components/forms/TransferList/TransferList.js';
|
|
190
208
|
export { Tree } from './components/core/Tree/Tree.js';
|
|
191
209
|
export { TypeWriter } from './components/core/Message/TypeWriter.js';
|
|
192
210
|
export { XAxis } from './components/charts/shared/ChartAxis/XAxis.js';
|
|
@@ -204,8 +222,10 @@ export { commandPaletteTheme } from './components/core/CommandPalette/CommandPal
|
|
|
204
222
|
export { contextMenuTheme } from './components/core/ContextMenu/ContextMenu.theme.js';
|
|
205
223
|
export { cronInputTheme } from './components/forms/CronInput/CronInput.theme.js';
|
|
206
224
|
export { datePickerTheme } from './components/forms/DatePicker/DatePicker.theme.js';
|
|
225
|
+
export { dateRangePickerTheme } from './components/forms/DateRangePicker/DateRangePicker.theme.js';
|
|
207
226
|
export { dropdownTheme } from './components/core/Dropdown/Dropdown.theme.js';
|
|
208
227
|
export { emptyTheme } from './components/core/Empty/Empty.theme.js';
|
|
228
|
+
export { fileUploadProgressTheme } from './components/forms/FileUpload/FileUploadProgress.theme.js';
|
|
209
229
|
export { fileUploadTheme } from './components/forms/FileUpload/FileUpload.theme.js';
|
|
210
230
|
export { filterData, getDefaultOperator, getOperatorsForFilterType, inferFilterType, isBetweenOperator, isUnaryOperator, operatorLabels } from './components/data-display/Table/Table.filterUtils.js';
|
|
211
231
|
export { formLabelTheme } from './components/forms/FormLabel/FormLabel.theme.js';
|
|
@@ -242,7 +262,6 @@ export { tagTheme } from './components/core/Tag/Tag.theme.js';
|
|
|
242
262
|
export { textareaTheme } from './components/forms/Textarea/Textarea.theme.js';
|
|
243
263
|
export { timePickerTheme } from './components/forms/TimePicker/TimePicker.theme.js';
|
|
244
264
|
export { toastTheme } from './components/core/Toast/Toast.theme.js';
|
|
245
|
-
export { transferListTheme } from './components/forms/TransferList/TransferList.theme.js';
|
|
246
265
|
export { treeTheme } from './components/core/Tree/Tree.theme.js';
|
|
247
266
|
export { useChartAccessibility } from './components/charts/hooks/useChartAccessibility.js';
|
|
248
267
|
export { useChartTheme } from './components/charts/hooks/useChartTheme.js';
|