@flikk/ui 1.0.0-beta.13 → 1.0.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
- package/dist/components/ai/PromptInput/PromptInput.js +4 -2
- package/dist/components/ai/PromptInput/VoiceRecorder.js +1 -1
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +4 -4
- package/dist/components/ai/StreamingResponse/StreamingResponse.js +6 -0
- package/dist/components/ai/ThinkingIndicator/ThinkingIndicator.js +3 -14
- package/dist/components/ai/index.d.ts +0 -5
- package/dist/components/ai/index.js +8 -4
- package/dist/components/charts/DonutChart/DonutChart.js +1 -1
- package/dist/components/charts/DonutChart/MultiSegmentDonutChart.js +1 -1
- package/dist/components/charts/FunnelChart/FunnelChart.js +2 -2
- 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 +26 -50
- package/dist/components/core/Badge/Badge.theme.js +49 -63
- package/dist/components/core/Badge/Badge.types.d.ts +6 -30
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.ripple.js +1 -1
- package/dist/components/core/Button/Button.theme.d.ts +1 -1
- package/dist/components/core/Button/Button.theme.js +5 -5
- package/dist/components/core/Button/Button.types.d.ts +1 -1
- 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/Calendar/CalendarMini/CalendarMini.js +2 -2
- 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/Drawer/DrawerHeader.js +1 -1
- 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 +4 -2
- 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/Modal/ModalHeader.js +1 -1
- package/dist/components/core/NavItem/NavItem.js +100 -52
- package/dist/components/core/NavItem/NavItem.theme.js +6 -3
- package/dist/components/core/NavItem/NavItem.types.d.ts +44 -30
- package/dist/components/core/NavItem/index.d.ts +1 -1
- package/dist/components/core/Pagination/Pagination.theme.js +1 -1
- package/dist/components/core/Pill/Pill.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 +5 -16
- 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.d.ts +11 -1
- package/dist/components/core/Sidebar/Sidebar.js +51 -17
- package/dist/components/core/Sidebar/Sidebar.theme.js +9 -7
- package/dist/components/core/Sidebar/Sidebar.types.d.ts +57 -0
- package/dist/components/core/Sidebar/SidebarContent.js +3 -1
- package/dist/components/core/Sidebar/SidebarContext.d.ts +14 -0
- package/dist/components/core/Sidebar/SidebarContext.js +63 -11
- package/dist/components/core/Sidebar/SidebarFooter.js +3 -1
- package/dist/components/core/Sidebar/SidebarHeader.js +6 -2
- package/dist/components/core/Sidebar/SidebarMobileTrigger.d.ts +3 -0
- package/dist/components/core/Sidebar/SidebarMobileTrigger.js +29 -0
- package/dist/components/core/Sidebar/SidebarNav.js +3 -2
- package/dist/components/core/Sidebar/SidebarNavGroup.js +4 -2
- package/dist/components/core/Sidebar/SidebarToggle.js +2 -1
- package/dist/components/core/Sidebar/SidebarUserProfile.d.ts +3 -0
- package/dist/components/core/Sidebar/SidebarUserProfile.js +35 -0
- package/dist/components/core/Sidebar/index.d.ts +3 -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/Tabs.theme.d.ts +1 -1
- package/dist/components/core/Tabs/Tabs.theme.js +3 -3
- 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 +11 -0
- package/dist/components/data-display/GanttChart/GanttChart.types.d.ts +2 -2
- package/dist/components/data-display/GanttChart/GanttToolbar.js +1 -1
- 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 +12 -4
- 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 +9 -0
- package/dist/components/effects/Neumorphic/InsetCircleButton.js +10 -0
- package/dist/components/effects/Neumorphic/InsetPill.d.ts +7 -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 +23 -14
- 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.theme.js +1 -1
- 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 -0
- package/dist/components/forms/index.js +8 -0
- 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 +23 -0
- 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 +320 -39
- package/src/styles/theme.css +151 -62
- 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/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
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useContext, useState, useCallback, useMemo } from 'react';
|
|
1
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';
|
|
3
3
|
|
|
4
4
|
const SidebarContext = createContext(null);
|
|
5
5
|
const useSidebarContext = () => {
|
|
@@ -7,32 +7,84 @@ const useSidebarContext = () => {
|
|
|
7
7
|
// Return null if not in sidebar context (allows NavItem to work elsewhere)
|
|
8
8
|
return context;
|
|
9
9
|
};
|
|
10
|
-
const
|
|
10
|
+
const AccordionNavContext = createContext(null);
|
|
11
|
+
const useAccordionNavContext = () => useContext(AccordionNavContext);
|
|
12
|
+
const AccordionNavProvider = ({ children, accordion = false }) => {
|
|
13
|
+
const [openId, setOpenId] = useState(null);
|
|
14
|
+
const register = useCallback((id) => {
|
|
15
|
+
setOpenId(id);
|
|
16
|
+
}, []);
|
|
17
|
+
const unregister = useCallback((id) => {
|
|
18
|
+
setOpenId(prev => (prev === id ? null : prev));
|
|
19
|
+
}, []);
|
|
20
|
+
const value = useMemo(() => ({ openId, register, unregister }), [openId, register, unregister]);
|
|
21
|
+
if (!accordion)
|
|
22
|
+
return jsx(Fragment, { children: children });
|
|
23
|
+
return (jsx(AccordionNavContext.Provider, { value: value, children: children }));
|
|
24
|
+
};
|
|
25
|
+
const SidebarProvider = ({ children, defaultCollapsed = false, collapsed: controlledCollapsed, onCollapsedChange, mobileBreakpoint = 1024, mobileOpen: controlledMobileOpen, onMobileOpenChange, width = {}, side = 'left', variant = 'sidebar', }) => {
|
|
11
26
|
const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
27
|
+
const [internalMobileOpen, setInternalMobileOpen] = useState(false);
|
|
28
|
+
const [isMobile, setIsMobile] = useState(false);
|
|
29
|
+
// Detect mobile breakpoint
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (typeof window === 'undefined')
|
|
32
|
+
return;
|
|
33
|
+
const mql = window.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`);
|
|
34
|
+
const handler = (e) => {
|
|
35
|
+
setIsMobile(e.matches);
|
|
36
|
+
if (!e.matches) {
|
|
37
|
+
setInternalMobileOpen(false);
|
|
38
|
+
onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
handler(mql);
|
|
42
|
+
mql.addEventListener('change', handler);
|
|
43
|
+
return () => mql.removeEventListener('change', handler);
|
|
44
|
+
}, [mobileBreakpoint, onMobileOpenChange]);
|
|
45
|
+
// Collapsed state
|
|
46
|
+
const isCollapsedControlled = controlledCollapsed !== undefined;
|
|
47
|
+
const collapsed = isCollapsedControlled ? controlledCollapsed : internalCollapsed;
|
|
15
48
|
const setCollapsed = useCallback((newCollapsed) => {
|
|
16
|
-
if (!
|
|
49
|
+
if (!isCollapsedControlled) {
|
|
17
50
|
setInternalCollapsed(newCollapsed);
|
|
18
51
|
}
|
|
19
52
|
onCollapsedChange === null || onCollapsedChange === void 0 ? void 0 : onCollapsedChange(newCollapsed);
|
|
20
|
-
}, [
|
|
53
|
+
}, [isCollapsedControlled, onCollapsedChange]);
|
|
21
54
|
const toggleCollapsed = useCallback(() => {
|
|
22
55
|
setCollapsed(!collapsed);
|
|
23
56
|
}, [collapsed, setCollapsed]);
|
|
57
|
+
// Mobile open state
|
|
58
|
+
const isMobileOpenControlled = controlledMobileOpen !== undefined;
|
|
59
|
+
const isMobileOpen = isMobileOpenControlled ? controlledMobileOpen : internalMobileOpen;
|
|
60
|
+
const setMobileOpen = useCallback((open) => {
|
|
61
|
+
if (!isMobileOpenControlled) {
|
|
62
|
+
setInternalMobileOpen(open);
|
|
63
|
+
}
|
|
64
|
+
onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(open);
|
|
65
|
+
}, [isMobileOpenControlled, onMobileOpenChange]);
|
|
66
|
+
// Lock body scroll when mobile overlay is open
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (isMobile && isMobileOpen) {
|
|
69
|
+
document.body.style.overflow = 'hidden';
|
|
70
|
+
return () => { document.body.style.overflow = ''; };
|
|
71
|
+
}
|
|
72
|
+
}, [isMobile, isMobileOpen]);
|
|
24
73
|
const contextValue = useMemo(() => ({
|
|
25
74
|
collapsed,
|
|
26
75
|
setCollapsed,
|
|
27
76
|
toggleCollapsed,
|
|
28
77
|
width: {
|
|
29
78
|
expanded: width.expanded || 280,
|
|
30
|
-
collapsed: width.collapsed ||
|
|
79
|
+
collapsed: width.collapsed || 64,
|
|
31
80
|
},
|
|
32
81
|
side,
|
|
33
82
|
variant,
|
|
34
|
-
|
|
83
|
+
isMobileOpen,
|
|
84
|
+
setMobileOpen,
|
|
85
|
+
isMobile,
|
|
86
|
+
}), [collapsed, setCollapsed, toggleCollapsed, width.expanded, width.collapsed, side, variant, isMobileOpen, setMobileOpen, isMobile]);
|
|
35
87
|
return (jsx(SidebarContext.Provider, { value: contextValue, children: children }));
|
|
36
88
|
};
|
|
37
89
|
|
|
38
|
-
export { SidebarProvider, useSidebarContext };
|
|
90
|
+
export { AccordionNavProvider, SidebarProvider, useAccordionNavContext, useSidebarContext };
|
|
@@ -6,7 +6,9 @@ import { useSidebarContext } from './SidebarContext.js';
|
|
|
6
6
|
const SidebarFooter = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
7
7
|
const sidebarContext = useSidebarContext();
|
|
8
8
|
const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
|
|
9
|
-
|
|
9
|
+
const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
|
|
10
|
+
const isCollapsedView = collapsed && !isMobile;
|
|
11
|
+
return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-t border-[var(--color-border)] transition-all duration-200", isCollapsedView ? "p-2 flex justify-center" : "p-4", className), ...props, children: children }));
|
|
10
12
|
});
|
|
11
13
|
SidebarFooter.displayName = "SidebarFooter";
|
|
12
14
|
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import React__default from 'react';
|
|
3
|
+
import { XMarkIcon } from '@heroicons/react/24/outline';
|
|
3
4
|
import { cn } from '../../../utils/cn.js';
|
|
4
5
|
import { useSidebarContext } from './SidebarContext.js';
|
|
5
6
|
import { SidebarToggle } from './SidebarToggle.js';
|
|
7
|
+
import { Button } from '../Button/Button.js';
|
|
6
8
|
|
|
7
9
|
const SidebarHeader = React__default.forwardRef(({ logo, showToggle = true, customToggle, children, className, ...props }, ref) => {
|
|
8
10
|
const sidebarContext = useSidebarContext();
|
|
9
11
|
const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
|
|
12
|
+
const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
|
|
13
|
+
const isMobileOpen = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobileOpen) || false;
|
|
10
14
|
// If children are provided, use them instead of default layout
|
|
11
15
|
if (children) {
|
|
12
|
-
return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-b border-
|
|
16
|
+
return (jsx("div", { ref: ref, className: cn("flex-shrink-0 border-b border-[var(--color-border)]", className), ...props, children: children }));
|
|
13
17
|
}
|
|
14
|
-
return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between flex-shrink-0 h-16 border-b border-[var(--color-border)]
|
|
18
|
+
return (jsxs("div", { ref: ref, className: cn("flex items-center justify-between flex-shrink-0 h-16 border-b border-[var(--color-border)] transition-all duration-200", collapsed && !isMobile ? "px-3" : "px-4", className), ...props, children: [jsx("div", { className: cn("flex items-center min-w-0 transition-all duration-200", collapsed && !isMobile ? "flex-shrink-0" : "flex-1"), children: logo }), isMobile && isMobileOpen && (jsx(Button, { variant: "soft", size: "sm", className: "size-8 p-0", onClick: () => sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.setMobileOpen(false), "aria-label": "Close navigation", children: jsx(XMarkIcon, { className: "size-5" }) })), !isMobile && showToggle && (jsx("div", { className: "flex-shrink-0", children: customToggle || jsx(SidebarToggle, {}) }))] }));
|
|
15
19
|
});
|
|
16
20
|
SidebarHeader.displayName = "SidebarHeader";
|
|
17
21
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { Bars3Icon } from '@heroicons/react/24/outline';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { useSidebarContext } from './SidebarContext.js';
|
|
6
|
+
import { Button } from '../Button/Button.js';
|
|
7
|
+
|
|
8
|
+
const SidebarMobileTrigger = React__default.forwardRef(({ icon, className, onClick, ...props }, ref) => {
|
|
9
|
+
const sidebarContext = useSidebarContext();
|
|
10
|
+
if (!sidebarContext) {
|
|
11
|
+
if (process.env.NODE_ENV !== "production") {
|
|
12
|
+
console.warn("SidebarMobileTrigger must be used within a Sidebar component");
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const { isMobile, setMobileOpen } = sidebarContext;
|
|
17
|
+
// Only render on mobile
|
|
18
|
+
if (!isMobile)
|
|
19
|
+
return null;
|
|
20
|
+
const handleClick = (e) => {
|
|
21
|
+
setMobileOpen(true);
|
|
22
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
23
|
+
};
|
|
24
|
+
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, color: _color, ...buttonProps } = props;
|
|
25
|
+
return (jsx(Button, { ref: ref, variant: "soft", size: "sm", className: cn("size-9 p-0", className), onClick: handleClick, "aria-label": "Open navigation menu", ...buttonProps, children: icon || jsx(Bars3Icon, { className: "size-5" }) }));
|
|
26
|
+
});
|
|
27
|
+
SidebarMobileTrigger.displayName = "SidebarMobileTrigger";
|
|
28
|
+
|
|
29
|
+
export { SidebarMobileTrigger };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React__default from 'react';
|
|
3
3
|
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
import { AccordionNavProvider } from './SidebarContext.js';
|
|
4
5
|
|
|
5
|
-
const SidebarNav = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
6
|
-
return (jsx("nav", { ref: ref, className: cn('flex-1 space-y-1 p-4', className), role: "navigation", ...props, children: children }));
|
|
6
|
+
const SidebarNav = React__default.forwardRef(({ accordion = false, children, className, ...props }, ref) => {
|
|
7
|
+
return (jsx("nav", { ref: ref, className: cn('flex-1 space-y-1 p-4', className), role: "navigation", ...props, children: jsx(AccordionNavProvider, { accordion: accordion, children: children }) }));
|
|
7
8
|
});
|
|
8
9
|
SidebarNav.displayName = 'SidebarNav';
|
|
9
10
|
|
|
@@ -6,8 +6,10 @@ import { useSidebarContext } from './SidebarContext.js';
|
|
|
6
6
|
const SidebarNavGroup = React__default.forwardRef(({ title, showTitleWhenCollapsed = false, children, className, ...props }, ref) => {
|
|
7
7
|
const sidebarContext = useSidebarContext();
|
|
8
8
|
const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
|
|
9
|
-
const
|
|
10
|
-
|
|
9
|
+
const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
|
|
10
|
+
const isCollapsedView = collapsed && !isMobile;
|
|
11
|
+
const showTitle = title && (!isCollapsedView || showTitleWhenCollapsed);
|
|
12
|
+
return (jsxs("div", { ref: ref, className: cn("space-y-1", className), ...props, children: [showTitle && (jsx("div", { className: "px-2 py-2", children: jsx("h3", { className: "text-sm font-semibold text-[var(--color-text-muted)] uppercase tracking-wider", children: title }) })), isCollapsedView && !showTitleWhenCollapsed && (jsx("div", { className: "h-px bg-[var(--color-border)] mx-2 my-2" })), jsx("div", { className: "space-y-1", children: children })] }));
|
|
11
13
|
});
|
|
12
14
|
SidebarNavGroup.displayName = "SidebarNavGroup";
|
|
13
15
|
|
|
@@ -19,7 +19,8 @@ const SidebarToggle = React__default.forwardRef(({ expandIcon, collapseIcon, cla
|
|
|
19
19
|
toggleCollapsed();
|
|
20
20
|
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
21
21
|
};
|
|
22
|
-
|
|
22
|
+
const { onAnimationStart, onAnimationEnd, onDrag, onDragStart, onDragEnd, color: _color, ...buttonProps } = props;
|
|
23
|
+
return (jsx(Button, { ref: ref, variant: "soft", size: "sm", className: cn("size-8 p-0", className), onClick: handleClick, "aria-label": collapsed ? "Expand sidebar" : "Collapse sidebar", title: collapsed ? "Expand sidebar" : "Collapse sidebar", ...buttonProps, children: jsx(motion.div, { initial: false, animate: { rotate: collapsed ? 180 : 0 }, transition: { duration: 0.2 }, children: collapsed
|
|
23
24
|
? expandIcon || jsx(ChevronRightIcon, { className: "size-4" })
|
|
24
25
|
: collapseIcon || jsx(ChevronLeftIcon, { className: "size-4" }) }) }));
|
|
25
26
|
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { cn } from '../../../utils/cn.js';
|
|
4
|
+
import { useSidebarContext } from './SidebarContext.js';
|
|
5
|
+
import { Avatar } from '../Avatar/Avatar.js';
|
|
6
|
+
import { Tooltip } from '../Tooltip/Tooltip.js';
|
|
7
|
+
import '../Tooltip/Tooltip.animations.js';
|
|
8
|
+
|
|
9
|
+
const statusColors = {
|
|
10
|
+
online: "bg-[var(--color-success)]",
|
|
11
|
+
offline: "bg-[var(--color-background-quaternary)]",
|
|
12
|
+
away: "bg-[var(--color-warning)]",
|
|
13
|
+
busy: "bg-[var(--color-danger)]",
|
|
14
|
+
};
|
|
15
|
+
const SidebarUserProfile = React__default.forwardRef(({ name, email, avatar, status, dropdownContent, className, onClick, ...props }, ref) => {
|
|
16
|
+
const sidebarContext = useSidebarContext();
|
|
17
|
+
const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
|
|
18
|
+
const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
|
|
19
|
+
const isCollapsedView = collapsed && !isMobile;
|
|
20
|
+
const avatarElement = (jsxs("div", { className: "relative flex-shrink-0", children: [jsx(Avatar, { src: avatar, name: name, size: "sm" }), status && (jsx("span", { className: cn("absolute -bottom-0.5 -right-0.5 size-3 rounded-full ring-2 ring-[var(--color-background)]", statusColors[status]), "aria-label": `Status: ${status}` }))] }));
|
|
21
|
+
const content = (jsxs("div", { ref: ref, className: cn("flex items-center gap-3 rounded-[var(--radius-base)] cursor-pointer transition-colors duration-150 hover:bg-[var(--color-background-secondary)]", isCollapsedView ? "justify-center p-2" : "px-3 py-2", className), role: "button", tabIndex: 0, onClick: onClick, onKeyDown: (e) => {
|
|
22
|
+
if ((e.key === "Enter" || e.key === " ") && onClick) {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
e.currentTarget.click();
|
|
25
|
+
}
|
|
26
|
+
}, ...props, children: [avatarElement, !isCollapsedView && (jsxs("div", { className: "flex-1 min-w-0", children: [jsx("div", { className: "text-sm font-medium text-[var(--color-text-primary)] truncate", children: name }), email && (jsx("div", { className: "text-xs text-[var(--color-text-muted)] truncate", children: email }))] }))] }));
|
|
27
|
+
// Tooltip when collapsed
|
|
28
|
+
if (isCollapsedView) {
|
|
29
|
+
return (jsx(Tooltip, { content: name, placement: "right", children: content }));
|
|
30
|
+
}
|
|
31
|
+
return content;
|
|
32
|
+
});
|
|
33
|
+
SidebarUserProfile.displayName = "SidebarUserProfile";
|
|
34
|
+
|
|
35
|
+
export { SidebarUserProfile };
|
|
@@ -6,5 +6,7 @@ export { SidebarNav } from "./SidebarNav";
|
|
|
6
6
|
export { SidebarNavGroup } from "./SidebarNavGroup";
|
|
7
7
|
export { SidebarSubmenu } from "./SidebarSubmenu";
|
|
8
8
|
export { SidebarToggle } from "./SidebarToggle";
|
|
9
|
+
export { SidebarMobileTrigger } from "./SidebarMobileTrigger";
|
|
10
|
+
export { SidebarUserProfile } from "./SidebarUserProfile";
|
|
9
11
|
export { useSidebarContext } from "./SidebarContext";
|
|
10
|
-
export type { SidebarProps, SidebarHeaderProps, SidebarContentProps, SidebarFooterProps, SidebarNavProps, SidebarNavGroupProps, SidebarToggleProps, SidebarSide, SidebarVariant, SidebarContextValue, SidebarTheme, SidebarThemeOverrides, } from "./Sidebar.types";
|
|
12
|
+
export type { SidebarProps, SidebarHeaderProps, SidebarContentProps, SidebarFooterProps, SidebarNavProps, SidebarNavGroupProps, SidebarToggleProps, SidebarMobileTriggerProps, SidebarUserProfileProps, SidebarUserStatus, SidebarSide, SidebarVariant, SidebarContextValue, SidebarTheme, SidebarThemeOverrides, } from "./Sidebar.types";
|
|
@@ -22,7 +22,7 @@ const SocialIcon = React__default.forwardRef(({ icon, size = 'md', colorMode = '
|
|
|
22
22
|
const fill = colorMode === 'brand' ? platform.brandColor : 'currentColor';
|
|
23
23
|
return (jsx("svg", { ref: ref, xmlns: "http://www.w3.org/2000/svg", viewBox: platform.viewBox, width: resolvedSize, height: resolvedSize, fill: fill, role: "img", "aria-label": `${platform.label} icon`, "data-icon": icon, "data-color-mode": colorMode, "data-size": size, className: cn(theme.baseStyle, className), ...props, children: platform.shapes.map((shape, i) => {
|
|
24
24
|
var _a;
|
|
25
|
-
return (jsx("path", { d: shape.d, fill: (_a = shape.fill) !== null && _a !== void 0 ? _a : undefined }, i));
|
|
25
|
+
return (jsx("path", { d: shape.d, fill: colorMode === 'brand' ? ((_a = shape.fill) !== null && _a !== void 0 ? _a : undefined) : undefined }, i));
|
|
26
26
|
}) }));
|
|
27
27
|
});
|
|
28
28
|
SocialIcon.displayName = 'SocialIcon';
|
|
@@ -154,7 +154,7 @@ const SortableItem = React__default.forwardRef(({ id, children, className, theme
|
|
|
154
154
|
context.setDraggedItemContent(children);
|
|
155
155
|
const items = Array.from(context.itemRefs.current.entries());
|
|
156
156
|
const currentIndex = items.findIndex(([itemId]) => itemId === id);
|
|
157
|
-
(_a = context.onSortDragStart) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value }
|
|
157
|
+
(_a = context.onSortDragStart) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value });
|
|
158
158
|
}, [disabled, id, children, context, value]);
|
|
159
159
|
const handleDragEnd = useCallback(() => {
|
|
160
160
|
var _a;
|
|
@@ -164,7 +164,7 @@ const SortableItem = React__default.forwardRef(({ id, children, className, theme
|
|
|
164
164
|
context.setDropPosition(null);
|
|
165
165
|
const items = Array.from(context.itemRefs.current.entries());
|
|
166
166
|
const currentIndex = items.findIndex(([itemId]) => itemId === id);
|
|
167
|
-
(_a = context.onSortDragEnd) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value }
|
|
167
|
+
(_a = context.onSortDragEnd) === null || _a === void 0 ? void 0 : _a.call(context, { id, index: currentIndex, data: value });
|
|
168
168
|
}, [id, context, value]);
|
|
169
169
|
const handlePointerDown = useCallback((event) => {
|
|
170
170
|
if (disabled) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const sortableTheme = {
|
|
2
2
|
containerStyle: "relative list-none",
|
|
3
3
|
itemStyle: "relative cursor-move select-none relative focus-within:z-10 list-none",
|
|
4
|
-
dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-
|
|
4
|
+
dragHandleStyle: "cursor-grab active:cursor-grabbing p-1 text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] flex items-center justify-center rounded transition-colors duration-200",
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
export { sortableTheme };
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { HTMLAttributes, ReactNode
|
|
1
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
2
|
export interface SortableData {
|
|
3
3
|
id: string;
|
|
4
4
|
index: number;
|
|
5
5
|
data?: string | number | Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
+
/** Event type for sort drag callbacks - may be a native event, React event, or absent (keyboard-initiated) */
|
|
8
|
+
export type SortableEvent = React.KeyboardEvent<HTMLDivElement> | Event | undefined;
|
|
7
9
|
export interface SortableTheme {
|
|
8
10
|
containerStyle: string;
|
|
9
11
|
itemStyle: string;
|
|
@@ -28,9 +30,9 @@ export interface SortableProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onD
|
|
|
28
30
|
/** Show drag handles */
|
|
29
31
|
showDragHandle?: boolean;
|
|
30
32
|
/** Called when drag starts */
|
|
31
|
-
onSortDragStart?: (data: SortableData, event
|
|
33
|
+
onSortDragStart?: (data: SortableData, event?: SortableEvent) => void;
|
|
32
34
|
/** Called when drag ends */
|
|
33
|
-
onSortDragEnd?: (data: SortableData, event
|
|
35
|
+
onSortDragEnd?: (data: SortableData, event?: SortableEvent) => void;
|
|
34
36
|
/** Optional array of values for Reorder.Group - auto-extracted from children if not provided */
|
|
35
37
|
values?: (string | number)[];
|
|
36
38
|
}
|
|
@@ -53,8 +55,8 @@ export interface SortableContextValue {
|
|
|
53
55
|
showDragHandle: boolean;
|
|
54
56
|
theme: SortableTheme;
|
|
55
57
|
onReorder: (fromIndex: number, toIndex: number) => void;
|
|
56
|
-
onSortDragStart?: (data: SortableData, event
|
|
57
|
-
onSortDragEnd?: (data: SortableData, event
|
|
58
|
+
onSortDragStart?: (data: SortableData, event?: SortableEvent) => void;
|
|
59
|
+
onSortDragEnd?: (data: SortableData, event?: SortableEvent) => void;
|
|
58
60
|
draggedItem: string | null;
|
|
59
61
|
setDraggedItem: (id: string | null) => void;
|
|
60
62
|
dropPosition: {
|
|
@@ -7,11 +7,11 @@ const tabsTheme = {
|
|
|
7
7
|
// TabsList styles with proper design tokens
|
|
8
8
|
listStyle: "relative inline-flex items-center flex-row border-b border-[var(--color-border)] gap-2",
|
|
9
9
|
// TabsTrigger base styles - no individual borders, underline will be handled separately
|
|
10
|
-
triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-
|
|
10
|
+
triggerStyle: "relative inline-flex items-center justify-center whitespace-nowrap font-semibold transition-all duration-300 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] data-[state=active]:text-[var(--color-primary)]",
|
|
11
11
|
// TabsTrigger size variants using CSS variables where applicable
|
|
12
12
|
triggerSizes: {
|
|
13
|
-
sm: "px-2 py-1.5 text-base
|
|
14
|
-
md: "px-2 py-2 text-base
|
|
13
|
+
sm: "px-2 py-1.5 text-base",
|
|
14
|
+
md: "px-2 py-2 text-base",
|
|
15
15
|
},
|
|
16
16
|
// TabsBody styles with proper CSS variables
|
|
17
17
|
bodyStyle: "focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2",
|
|
@@ -14,7 +14,7 @@ const TabsBody = React__default.forwardRef(({ value, forceMount = false, childre
|
|
|
14
14
|
const shouldReduceMotion = useReducedMotion();
|
|
15
15
|
// Check if we're in Storybook and should disable animations
|
|
16
16
|
const isInStorybook = typeof window !== 'undefined' && window.__STORYBOOK_DISABLE_ANIMATIONS__;
|
|
17
|
-
const shouldDisableAnimations = !!shouldReduceMotion || isInStorybook;
|
|
17
|
+
const shouldDisableAnimations = !!shouldReduceMotion || !!isInStorybook;
|
|
18
18
|
const isSelected = value === selectedValue;
|
|
19
19
|
const shouldRender = forceMount || isSelected;
|
|
20
20
|
// Compute animation variants without a global cache (HMR-safe)
|
|
@@ -14,7 +14,7 @@ const TabsTrigger = React__default.forwardRef(({ value, disabled = false, childr
|
|
|
14
14
|
const shouldReduceMotion = useReducedMotion();
|
|
15
15
|
// Check if we're in Storybook and should disable animations
|
|
16
16
|
const isInStorybook = typeof window !== 'undefined' && window.__STORYBOOK_DISABLE_ANIMATIONS__;
|
|
17
|
-
const shouldDisableAnimations = !!shouldReduceMotion || isInStorybook;
|
|
17
|
+
const shouldDisableAnimations = !!shouldReduceMotion || !!isInStorybook;
|
|
18
18
|
// Memoize derived state flags for performance
|
|
19
19
|
const derivedState = useMemo(() => ({
|
|
20
20
|
isSelected: value === selectedValue,
|
|
@@ -47,10 +47,10 @@ const Tag = React__default.forwardRef(({ children, size = "md", removable = true
|
|
|
47
47
|
// Avatar takes precedence over startContent
|
|
48
48
|
const renderLeadingContent = () => {
|
|
49
49
|
if (avatar) {
|
|
50
|
-
return (jsx(Avatar, { src: avatar.src, name: avatar.name, fallback: avatar.fallback, initialsCount: avatar.initialsCount,
|
|
50
|
+
return (jsx("span", { className: cn("inline-flex items-center justify-center shrink-0 overflow-hidden rounded-full", theme.avatarSizes[size]), children: jsx(Avatar, { src: avatar.src, name: avatar.name, fallback: avatar.fallback, initialsCount: avatar.initialsCount, size: "xs", className: "!size-full border-0 rounded-full" }) }));
|
|
51
51
|
}
|
|
52
52
|
if (startContent) {
|
|
53
|
-
return (jsx("span", { className: cn("inline-flex items-center", theme.startContentSizes[size]), children: startContent }));
|
|
53
|
+
return (jsx("span", { className: cn("inline-flex items-center justify-center shrink-0", theme.startContentSizes[size]), children: startContent }));
|
|
54
54
|
}
|
|
55
55
|
return null;
|
|
56
56
|
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import { ToastProps } from
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ToastProps } from "./Toast.types";
|
|
3
3
|
export declare const Toast: React.ForwardRefExoticComponent<ToastProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -5,14 +5,18 @@ import { cn } from '../../../utils/cn.js';
|
|
|
5
5
|
import { toastTheme } from './Toast.theme.js';
|
|
6
6
|
import { toastAnimations, getToastStackingAnimation } from './Toast.animations.js';
|
|
7
7
|
import { ArrowPathIcon, InformationCircleIcon, XMarkIcon } from '@heroicons/react/24/solid';
|
|
8
|
+
import { Button } from '../Button/Button.js';
|
|
8
9
|
|
|
9
|
-
const
|
|
10
|
-
|
|
10
|
+
const isToastAction = (action) => typeof action === "object" &&
|
|
11
|
+
action !== null &&
|
|
12
|
+
"label" in action &&
|
|
13
|
+
"onClick" in action;
|
|
14
|
+
const Toast = React__default.forwardRef(({ toast, className, onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouseLeave, onHeightChange, expandedOffset, darkMode = false, ...props }, ref) => {
|
|
11
15
|
var _a;
|
|
12
16
|
const internalRef = useRef(null);
|
|
13
17
|
const setRefs = useCallback((node) => {
|
|
14
18
|
internalRef.current = node;
|
|
15
|
-
if (typeof ref ===
|
|
19
|
+
if (typeof ref === "function") {
|
|
16
20
|
ref(node);
|
|
17
21
|
}
|
|
18
22
|
else if (ref) {
|
|
@@ -20,11 +24,9 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
|
|
|
20
24
|
}
|
|
21
25
|
}, [ref]);
|
|
22
26
|
const shouldReduceMotion = useReducedMotion();
|
|
23
|
-
const { id, variant =
|
|
24
|
-
const isTextOnly = !subtitle && !action;
|
|
25
|
-
const defaultIcon = state ===
|
|
26
|
-
? (jsx(motion.div, { animate: { rotate: 360 }, transition: { repeat: Infinity, duration: 1, ease: "linear" }, children: jsx(ArrowPathIcon, { className: "w-5 h-5" }) }))
|
|
27
|
-
: jsx(InformationCircleIcon, { className: "w-5 h-5" });
|
|
27
|
+
const { id, variant = "default", state = "default", title, subtitle, icon, action, children, duration = 5000, dismissible = true, } = toast;
|
|
28
|
+
const isTextOnly = !subtitle && !action && !children;
|
|
29
|
+
const defaultIcon = state === "loading" ? (jsx(motion.div, { animate: { rotate: 360 }, transition: { repeat: Infinity, duration: 1, ease: "linear" }, children: jsx(ArrowPathIcon, { className: "w-5 h-5" }) })) : (jsx(InformationCircleIcon, { className: "w-5 h-5" }));
|
|
28
30
|
const resolvedIcon = icon || defaultIcon;
|
|
29
31
|
// Auto-dismiss after duration
|
|
30
32
|
useEffect(() => {
|
|
@@ -46,9 +48,11 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
|
|
|
46
48
|
onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(id);
|
|
47
49
|
};
|
|
48
50
|
const handleActionClick = () => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
if (isToastAction(action)) {
|
|
52
|
+
action.onClick();
|
|
53
|
+
if (dismissible) {
|
|
54
|
+
handleDismiss();
|
|
55
|
+
}
|
|
52
56
|
}
|
|
53
57
|
};
|
|
54
58
|
const stackingStyle = getToastStackingAnimation(index, totalToasts, isExpanded, expandedOffset);
|
|
@@ -58,31 +62,36 @@ onDismiss, index = 0, isExpanded = false, totalToasts = 1, onMouseEnter, onMouse
|
|
|
58
62
|
opacity: (_a = stackingStyle.opacity) !== null && _a !== void 0 ? _a : 1,
|
|
59
63
|
y: (_b = stackingStyle.y) !== null && _b !== void 0 ? _b : 0,
|
|
60
64
|
scale: (_c = stackingStyle.scale) !== null && _c !== void 0 ? _c : 1,
|
|
61
|
-
zIndex: (_d = stackingStyle.zIndex) !== null && _d !== void 0 ? _d : 1
|
|
65
|
+
zIndex: (_d = stackingStyle.zIndex) !== null && _d !== void 0 ? _d : 1,
|
|
62
66
|
});
|
|
63
|
-
}, [
|
|
67
|
+
}, [
|
|
68
|
+
stackingStyle.opacity,
|
|
69
|
+
stackingStyle.y,
|
|
70
|
+
stackingStyle.scale,
|
|
71
|
+
stackingStyle.zIndex,
|
|
72
|
+
]);
|
|
64
73
|
const styleValue = useMemo(() => {
|
|
65
74
|
var _a;
|
|
66
75
|
return ({
|
|
67
76
|
zIndex: (_a = stackingStyle.zIndex) !== null && _a !== void 0 ? _a : 1,
|
|
68
|
-
position: (index > 0
|
|
77
|
+
position: (index > 0
|
|
78
|
+
? "absolute"
|
|
79
|
+
: "relative"),
|
|
69
80
|
top: index > 0 ? 0 : undefined,
|
|
70
81
|
left: index > 0 ? 0 : undefined,
|
|
71
|
-
width: index > 0 ?
|
|
82
|
+
width: index > 0 ? "100%" : undefined,
|
|
72
83
|
});
|
|
73
84
|
}, [stackingStyle.zIndex, index]);
|
|
74
85
|
const toastNode = (jsxs(motion.div, { ref: setRefs, layout: true, initial: shouldReduceMotion ? false : toastAnimations.initial, animate: animateValue, exit: shouldReduceMotion
|
|
75
86
|
? { ...toastAnimations.exit, transition: { duration: 0 } }
|
|
76
|
-
: toastAnimations.exit, transition: shouldReduceMotion ? { duration: 0 } : toastAnimations.transition, className: cn(toastTheme.baseStyle, isTextOnly &&
|
|
77
|
-
? jsx("div", { className:
|
|
78
|
-
:
|
|
79
|
-
? jsx("div", { className: toastTheme.subtitleStyle, children: subtitle })
|
|
80
|
-
: subtitle), action && (jsx("div", { className: "mt-2", children: jsx("button", { type: "button", className: toastTheme.actionStyle, onClick: handleActionClick, children: action.label }) }))] }), dismissible && (jsx("button", { type: "button", className: isTextOnly ? toastTheme.closeButtonCenteredStyle : toastTheme.closeButtonStyle, onClick: handleDismiss, "aria-label": "Dismiss notification", children: jsx(XMarkIcon, { className: "w-4 h-4" }) }))] }));
|
|
87
|
+
: toastAnimations.exit, transition: shouldReduceMotion ? { duration: 0 } : toastAnimations.transition, className: cn(toastTheme.baseStyle, isTextOnly && "items-center", ((_a = toastTheme.variants) === null || _a === void 0 ? void 0 : _a[variant]) || "", "pointer-events-auto", index > 0 && !isExpanded && "absolute top-0 left-0", className), style: styleValue, role: "alert", "aria-live": "polite", children: [jsx("div", { className: cn(toastTheme.iconStyle, !isTextOnly && "mt-0.5"), children: resolvedIcon }), jsxs("div", { className: "flex-1 min-w-0", children: [title &&
|
|
88
|
+
(typeof title === "string" ? (jsx("div", { className: cn(toastTheme.titleStyle, !isTextOnly && "font-semibold"), children: title })) : (title)), subtitle &&
|
|
89
|
+
(typeof subtitle === "string" ? (jsx("div", { className: toastTheme.subtitleStyle, children: subtitle })) : (subtitle)), action && (jsx("div", { className: "mt-4", children: isToastAction(action) ? (jsx(Button, { variant: "link", color: "primary", onClick: handleActionClick, children: action.label })) : (action) })), children] }), dismissible && (jsx("button", { type: "button", className: cn(toastTheme.closeButtonStyle, !isTextOnly && "mt-0.5"), onClick: handleDismiss, "aria-label": "Dismiss notification", children: jsx(XMarkIcon, { className: "size-5" }) }))] }));
|
|
81
90
|
if (darkMode) {
|
|
82
91
|
return jsx("div", { className: "dark", children: toastNode });
|
|
83
92
|
}
|
|
84
93
|
return toastNode;
|
|
85
94
|
});
|
|
86
|
-
Toast.displayName =
|
|
95
|
+
Toast.displayName = "Toast";
|
|
87
96
|
|
|
88
97
|
export { Toast };
|
|
@@ -6,15 +6,10 @@ const toastTheme = {
|
|
|
6
6
|
default: "border border-[var(--color-border)] dark:border-white/10",
|
|
7
7
|
glass: "glass-effect",
|
|
8
8
|
},
|
|
9
|
-
iconStyle: "flex-shrink-0
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
subtitleStyle: "text-base mt-0.5 opacity-60",
|
|
14
|
-
actionStyle: "text-sm font-medium px-2 py-1 rounded border bg-white/80 hover:bg-white transition-colors cursor-pointer " +
|
|
15
|
-
"dark:bg-white/10 dark:border-white/20 dark:hover:bg-white/20 dark:text-white",
|
|
16
|
-
closeButtonStyle: "absolute top-2 right-2 flex-shrink-0 w-4 h-4 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
|
|
17
|
-
closeButtonCenteredStyle: "flex-shrink-0 w-4 h-4 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
|
|
9
|
+
iconStyle: "flex-shrink-0",
|
|
10
|
+
titleStyle: "text-base text-[var(--color-text-primary)]",
|
|
11
|
+
subtitleStyle: "text-base mt-1 text-[var(--color-text-secondary)]",
|
|
12
|
+
closeButtonStyle: "flex-shrink-0 size-5 opacity-70 hover:opacity-100 transition-opacity cursor-pointer",
|
|
18
13
|
containerStyle: "fixed z-50 pointer-events-none",
|
|
19
14
|
};
|
|
20
15
|
|
|
@@ -16,28 +16,11 @@ export interface ToastTheme {
|
|
|
16
16
|
baseStyle: string;
|
|
17
17
|
variants: Record<ToastVariant, string>;
|
|
18
18
|
iconStyle: string;
|
|
19
|
-
iconCenteredStyle: string;
|
|
20
19
|
titleStyle: string;
|
|
21
|
-
textOnlyStyle: string;
|
|
22
20
|
subtitleStyle: string;
|
|
23
|
-
actionStyle: string;
|
|
24
21
|
closeButtonStyle: string;
|
|
25
|
-
closeButtonCenteredStyle: string;
|
|
26
22
|
containerStyle: string;
|
|
27
23
|
}
|
|
28
|
-
export interface ToastThemeOverrides {
|
|
29
|
-
baseStyle?: string;
|
|
30
|
-
variants?: Partial<Record<ToastVariant, string>>;
|
|
31
|
-
iconStyle?: string;
|
|
32
|
-
iconCenteredStyle?: string;
|
|
33
|
-
titleStyle?: string;
|
|
34
|
-
textOnlyStyle?: string;
|
|
35
|
-
subtitleStyle?: string;
|
|
36
|
-
actionStyle?: string;
|
|
37
|
-
closeButtonStyle?: string;
|
|
38
|
-
closeButtonCenteredStyle?: string;
|
|
39
|
-
containerStyle?: string;
|
|
40
|
-
}
|
|
41
24
|
export interface ToastData {
|
|
42
25
|
id: string;
|
|
43
26
|
variant?: ToastVariant;
|
|
@@ -45,7 +28,8 @@ export interface ToastData {
|
|
|
45
28
|
title?: ReactNode;
|
|
46
29
|
subtitle?: ReactNode;
|
|
47
30
|
icon?: ReactNode;
|
|
48
|
-
action?: ToastAction;
|
|
31
|
+
action?: ToastAction | ReactNode;
|
|
32
|
+
children?: ReactNode;
|
|
49
33
|
duration?: number;
|
|
50
34
|
dismissible?: boolean;
|
|
51
35
|
onDismiss?: () => void;
|
|
@@ -55,8 +39,6 @@ export interface ToastProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"
|
|
|
55
39
|
toast: ToastData;
|
|
56
40
|
/** Custom class name */
|
|
57
41
|
className?: string;
|
|
58
|
-
/** Theme overrides (deprecated - use className for customization) */
|
|
59
|
-
theme?: ToastThemeOverrides;
|
|
60
42
|
/** Callback when toast is dismissed */
|
|
61
43
|
onDismiss?: (id: string) => void;
|
|
62
44
|
/** Index of toast in the stack */
|
|
@@ -102,7 +84,8 @@ export interface UseToastOptions {
|
|
|
102
84
|
state?: ToastState;
|
|
103
85
|
duration?: number;
|
|
104
86
|
dismissible?: boolean;
|
|
105
|
-
action?: ToastAction;
|
|
87
|
+
action?: ToastAction | ReactNode;
|
|
88
|
+
children?: ReactNode;
|
|
106
89
|
icon?: ReactNode;
|
|
107
90
|
}
|
|
108
91
|
export interface UseToastReturn {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Toast } from './Toast';
|
|
2
2
|
export { ToastProvider, useToastContext } from './ToastProvider';
|
|
3
3
|
export { useToast } from './useToast';
|
|
4
|
-
export type { ToastProps, ToastData, ToastProviderProps, ToastTheme,
|
|
4
|
+
export type { ToastProps, ToastData, ToastProviderProps, ToastTheme, ToastVariant, UseToastReturn, UseToastOptions, } from './Toast.types';
|
|
5
5
|
export { toastTheme } from './Toast.theme';
|
|
@@ -55,7 +55,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
|
|
|
55
55
|
const { position, cssVariables, contentRef: portalContentRef} = useSelectPortal({
|
|
56
56
|
triggerRef,
|
|
57
57
|
isOpen: isVisible,
|
|
58
|
-
placement: placement,
|
|
58
|
+
placement: placement,
|
|
59
59
|
offset,
|
|
60
60
|
autoWidth: true,
|
|
61
61
|
});
|