@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,53 +1,85 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import React__default, { useMemo } from 'react';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import React__default, { useId, useState, useCallback, useMemo } from 'react';
|
|
3
3
|
import { cn } from '../../../utils/cn.js';
|
|
4
4
|
import { navItemTheme } from './NavItem.theme.js';
|
|
5
|
-
import { useSidebarContext } from '../Sidebar/SidebarContext.js';
|
|
5
|
+
import { useSidebarContext, useAccordionNavContext } from '../Sidebar/SidebarContext.js';
|
|
6
6
|
import { Tooltip } from '../Tooltip/Tooltip.js';
|
|
7
7
|
import '../Tooltip/Tooltip.animations.js';
|
|
8
8
|
import { Badge } from '../Badge/Badge.js';
|
|
9
9
|
import { ChevronDownIcon } from '@heroicons/react/20/solid';
|
|
10
|
+
import { AnimatePresence, motion } from 'motion/react';
|
|
10
11
|
|
|
11
12
|
const NavItem = React__default.forwardRef(({ children, startContent: propStartContent, endContent: propEndContent, icon, // Legacy
|
|
12
13
|
badge, // Legacy
|
|
13
|
-
description, shortcut, href, onClick, active = false, disabled = false, isDisabled: propIsDisabled, isDanger = false, hasSubmenu = false, expanded = false,
|
|
14
|
+
notification, description, shortcut, href, onClick, active = false, disabled = false, isDisabled: propIsDisabled, isDanger = false, hasSubmenu: propHasSubmenu = false, expanded: controlledExpanded, onToggleExpanded, items, defaultExpanded = false, level = 0, showTooltipWhenCollapsed = true, className, theme: customTheme = {}, ...props }, ref) => {
|
|
14
15
|
var _a, _b;
|
|
15
16
|
const sidebarContext = useSidebarContext();
|
|
17
|
+
const accordionNav = useAccordionNavContext();
|
|
18
|
+
const stableId = useId();
|
|
16
19
|
const collapsed = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.collapsed) || false;
|
|
17
20
|
const isInSidebar = !!sidebarContext;
|
|
21
|
+
const isMobile = (sidebarContext === null || sidebarContext === void 0 ? void 0 : sidebarContext.isMobile) || false;
|
|
22
|
+
// Self-managed submenu state
|
|
23
|
+
const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
|
|
24
|
+
// Determine if this item has a submenu
|
|
25
|
+
const hasSubmenu = propHasSubmenu || (items && items.length > 0);
|
|
26
|
+
// Determine expanded state: controlled vs accordion vs internal
|
|
27
|
+
const isAccordionManaged = !!accordionNav;
|
|
28
|
+
const isControlled = controlledExpanded !== undefined;
|
|
29
|
+
let isExpanded;
|
|
30
|
+
if (isControlled) {
|
|
31
|
+
isExpanded = controlledExpanded;
|
|
32
|
+
}
|
|
33
|
+
else if (isAccordionManaged && hasSubmenu) {
|
|
34
|
+
isExpanded = accordionNav.openId === stableId;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
isExpanded = internalExpanded;
|
|
38
|
+
}
|
|
39
|
+
const handleToggleExpanded = useCallback(() => {
|
|
40
|
+
if (isControlled) {
|
|
41
|
+
onToggleExpanded === null || onToggleExpanded === void 0 ? void 0 : onToggleExpanded();
|
|
42
|
+
}
|
|
43
|
+
else if (isAccordionManaged) {
|
|
44
|
+
if (isExpanded) {
|
|
45
|
+
accordionNav.unregister(stableId);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
accordionNav.register(stableId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
setInternalExpanded(prev => !prev);
|
|
53
|
+
}
|
|
54
|
+
}, [isControlled, isAccordionManaged, isExpanded, onToggleExpanded, accordionNav, stableId]);
|
|
18
55
|
// Map legacy props
|
|
19
56
|
const startContent = propStartContent || icon;
|
|
20
57
|
const actualIsDisabled = propIsDisabled || disabled;
|
|
21
|
-
//
|
|
58
|
+
// Build end content
|
|
22
59
|
let endContent = propEndContent;
|
|
23
60
|
if (!endContent && badge) {
|
|
24
|
-
endContent = (jsx(Badge, { color: "neutral", variant: "
|
|
25
|
-
}
|
|
26
|
-
if (!endContent && hasSubmenu) {
|
|
27
|
-
endContent = (jsx(ChevronDownIcon, { className: cn("size-4 transition-transform duration-300", expanded && "rotate-180") }));
|
|
61
|
+
endContent = (jsx(Badge, { color: "neutral", variant: "soft", size: "sm", children: badge }));
|
|
28
62
|
}
|
|
63
|
+
// Notification element
|
|
64
|
+
const notificationElement = useMemo(() => {
|
|
65
|
+
if (notification === undefined || notification === false)
|
|
66
|
+
return null;
|
|
67
|
+
if (notification === true) {
|
|
68
|
+
return (jsx("span", { className: cn(navItemTheme.notificationDot, customTheme.notificationDot) }));
|
|
69
|
+
}
|
|
70
|
+
if (typeof notification === "number" && notification > 0) {
|
|
71
|
+
return (jsx("span", { className: cn(navItemTheme.notificationBadge, customTheme.notificationBadge), children: notification > 99 ? "99+" : notification }));
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}, [notification, customTheme.notificationDot, customTheme.notificationBadge]);
|
|
29
75
|
const theme = useMemo(() => ({
|
|
30
76
|
...navItemTheme,
|
|
31
77
|
...customTheme,
|
|
32
|
-
states: {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
...navItemTheme.iconStates,
|
|
38
|
-
...customTheme.iconStates,
|
|
39
|
-
},
|
|
40
|
-
levels: {
|
|
41
|
-
...navItemTheme.levels,
|
|
42
|
-
...customTheme.levels,
|
|
43
|
-
},
|
|
44
|
-
collapsed: {
|
|
45
|
-
...navItemTheme.collapsed,
|
|
46
|
-
...customTheme.collapsed,
|
|
47
|
-
},
|
|
48
|
-
danger: customTheme.danger ||
|
|
49
|
-
navItemTheme.danger ||
|
|
50
|
-
"text-[var(--color-danger)] hover:bg-[var(--color-danger-50)]",
|
|
78
|
+
states: { ...navItemTheme.states, ...customTheme.states },
|
|
79
|
+
iconStates: { ...navItemTheme.iconStates, ...customTheme.iconStates },
|
|
80
|
+
levels: { ...navItemTheme.levels, ...customTheme.levels },
|
|
81
|
+
collapsed: { ...navItemTheme.collapsed, ...customTheme.collapsed },
|
|
82
|
+
danger: customTheme.danger || navItemTheme.danger || "text-[var(--color-danger)] hover:bg-[var(--color-danger-50)]",
|
|
51
83
|
}), [customTheme]);
|
|
52
84
|
// Handle click events
|
|
53
85
|
const handleClick = (e) => {
|
|
@@ -55,19 +87,27 @@ description, shortcut, href, onClick, active = false, disabled = false, isDisabl
|
|
|
55
87
|
e.preventDefault();
|
|
56
88
|
return;
|
|
57
89
|
}
|
|
58
|
-
if (hasSubmenu
|
|
90
|
+
if (hasSubmenu) {
|
|
59
91
|
e.preventDefault();
|
|
60
|
-
|
|
92
|
+
handleToggleExpanded();
|
|
61
93
|
return;
|
|
62
94
|
}
|
|
63
95
|
if (onClick) {
|
|
64
96
|
e.preventDefault();
|
|
65
97
|
onClick();
|
|
98
|
+
// Close mobile sidebar after clicking a nav item
|
|
99
|
+
if (isMobile && sidebarContext) {
|
|
100
|
+
sidebarContext.setMobileOpen(false);
|
|
101
|
+
}
|
|
66
102
|
return;
|
|
67
103
|
}
|
|
68
|
-
//
|
|
104
|
+
// Close mobile sidebar after navigation
|
|
105
|
+
if (href && isMobile && sidebarContext) {
|
|
106
|
+
sidebarContext.setMobileOpen(false);
|
|
107
|
+
}
|
|
69
108
|
};
|
|
70
109
|
const isActive = active;
|
|
110
|
+
const isCollapsedView = isInSidebar && collapsed && !isMobile;
|
|
71
111
|
// Get state classes
|
|
72
112
|
const getStateClasses = () => {
|
|
73
113
|
if (actualIsDisabled)
|
|
@@ -78,8 +118,10 @@ description, shortcut, href, onClick, active = false, disabled = false, isDisabl
|
|
|
78
118
|
};
|
|
79
119
|
// Danger overrides
|
|
80
120
|
const dangerClasses = isDanger ? theme.danger : "";
|
|
121
|
+
// Active indicator
|
|
122
|
+
const activeIndicatorClasses = isActive && level === 0 ? theme.activeIndicator : "";
|
|
81
123
|
// Build container classes
|
|
82
|
-
const containerClasses = cn(theme.baseStyle, getStateClasses(), theme.levels[level],
|
|
124
|
+
const containerClasses = cn(theme.baseStyle, getStateClasses(), theme.levels[level], isCollapsedView && ((_a = theme.collapsed) === null || _a === void 0 ? void 0 : _a.container), dangerClasses, activeIndicatorClasses, className);
|
|
83
125
|
// Get icon state classes
|
|
84
126
|
const getIconStateClasses = () => {
|
|
85
127
|
var _a, _b, _c;
|
|
@@ -90,35 +132,41 @@ description, shortcut, href, onClick, active = false, disabled = false, isDisabl
|
|
|
90
132
|
return (_c = theme.iconStates) === null || _c === void 0 ? void 0 : _c.default;
|
|
91
133
|
};
|
|
92
134
|
// Build icon classes
|
|
93
|
-
const iconClasses = cn(
|
|
135
|
+
const iconClasses = cn(isCollapsedView ? (_b = theme.collapsed) === null || _b === void 0 ? void 0 : _b.icon : theme.icon, getIconStateClasses());
|
|
94
136
|
const textClasses = cn(theme.text);
|
|
137
|
+
// Chevron for submenu
|
|
138
|
+
const chevron = hasSubmenu && !isCollapsedView ? (jsx(ChevronDownIcon, { className: cn("size-4 transition-transform duration-200 text-[var(--color-text-muted)]", isExpanded && "rotate-180") })) : null;
|
|
95
139
|
// Content component
|
|
96
|
-
const content = (jsxs("div", { ref: ref, className: containerClasses, role: href ? "link" : "button", tabIndex: actualIsDisabled ? -1 : 0, "aria-disabled": actualIsDisabled, "aria-expanded": hasSubmenu ?
|
|
140
|
+
const content = (jsxs("div", { ref: ref, className: containerClasses, role: href ? "link" : "button", tabIndex: actualIsDisabled ? -1 : 0, "aria-disabled": actualIsDisabled, "aria-expanded": hasSubmenu ? isExpanded : undefined, "data-active": isActive, "data-disabled": actualIsDisabled, "data-level": level, onClick: handleClick, onKeyDown: (e) => {
|
|
97
141
|
if (e.key === "Enter" || e.key === " ") {
|
|
98
142
|
e.preventDefault();
|
|
99
143
|
handleClick(e);
|
|
100
144
|
}
|
|
101
|
-
}, ...props, children: [startContent && (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
className: cn(
|
|
106
|
-
|
|
107
|
-
|
|
145
|
+
}, ...props, children: [startContent && (jsxs("div", { className: "flex items-center justify-center flex-shrink-0 relative", children: [React__default.isValidElement(startContent)
|
|
146
|
+
? React__default.cloneElement(startContent, {
|
|
147
|
+
className: cn(iconClasses, startContent.props.className),
|
|
148
|
+
})
|
|
149
|
+
: startContent, isCollapsedView && notificationElement && (jsx("span", { className: "absolute -top-1 -right-1", children: notificationElement }))] })), !isCollapsedView && (jsxs("div", { className: "flex-1 min-w-0", children: [jsxs("div", { className: "flex items-center justify-between gap-2", children: [jsx("span", { className: cn("truncate", textClasses), children: children }), shortcut && (jsx("kbd", { className: "hidden group-hover:inline-block text-sm text-[var(--color-text-muted)] font-sans border border-[var(--color-border)] rounded px-1.5 py-0.5", children: shortcut }))] }), description && (jsx("div", { className: "text-sm text-[var(--color-text-muted)] mt-0.5 truncate", children: description }))] })), !isCollapsedView && (jsxs("div", { className: "flex items-center gap-1.5 flex-shrink-0", children: [notificationElement, endContent, chevron] })), isCollapsedView && (jsx("span", { className: "sr-only", children: children }))] }));
|
|
150
|
+
// Self-contained submenu
|
|
151
|
+
const submenu = hasSubmenu && items && items.length > 0 && !isCollapsedView ? (jsx(AnimatePresence, { initial: false, children: isExpanded && (jsx(motion.div, { initial: "collapsed", animate: "open", exit: "collapsed", variants: {
|
|
152
|
+
open: { opacity: 1, height: "auto" },
|
|
153
|
+
collapsed: { opacity: 0, height: 0 },
|
|
154
|
+
}, transition: { duration: 0.2, ease: "easeInOut" }, className: "overflow-hidden", children: items.map((item, idx) => (jsx(NavItem, { level: Math.min((level + 1), 2), startContent: item.startContent, active: item.active, isDisabled: item.isDisabled, badge: item.badge, notification: item.notification, href: item.href, onClick: item.onClick, children: item.children }, idx))) })) })) : null;
|
|
108
155
|
// Wrap with link if href is provided
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (isInSidebar && collapsed && showTooltipWhenCollapsed) {
|
|
113
|
-
return (jsx(Tooltip, { content: children, placement: "right", children: LinkContent }));
|
|
156
|
+
const renderWrapped = (node) => {
|
|
157
|
+
if (href && !actualIsDisabled) {
|
|
158
|
+
return (jsx("a", { href: href, className: "block group", children: node }));
|
|
114
159
|
}
|
|
115
|
-
return
|
|
116
|
-
}
|
|
160
|
+
return node;
|
|
161
|
+
};
|
|
117
162
|
// Show tooltip in collapsed sidebar mode
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
163
|
+
const renderWithTooltip = (node) => {
|
|
164
|
+
if (isCollapsedView && showTooltipWhenCollapsed) {
|
|
165
|
+
return (jsx(Tooltip, { content: children, placement: "right", children: node }));
|
|
166
|
+
}
|
|
167
|
+
return node;
|
|
168
|
+
};
|
|
169
|
+
return (jsxs(Fragment, { children: [renderWithTooltip(renderWrapped(content)), submenu] }));
|
|
122
170
|
});
|
|
123
171
|
NavItem.displayName = "NavItem";
|
|
124
172
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
const navItemTheme = {
|
|
2
|
-
baseStyle: "relative flex items-center gap-2 px-2 py-1.5 text-base font-medium cursor-pointer select-none transition-all duration-
|
|
2
|
+
baseStyle: "relative flex items-center gap-2 px-2 py-1.5 text-base font-medium cursor-pointer select-none transition-all duration-150 w-full rounded-[var(--nav-item-radius)] outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] group",
|
|
3
3
|
icon: "size-4 text-[var(--color-text-secondary)]",
|
|
4
4
|
text: "flex-1 min-w-0 truncate",
|
|
5
5
|
states: {
|
|
6
|
-
default: "text-[var(--color-text-primary)] hover:bg-
|
|
6
|
+
default: "text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)]",
|
|
7
7
|
active: "bg-[var(--color-primary)]/10 text-[var(--color-primary)] font-semibold",
|
|
8
8
|
disabled: "opacity-60 cursor-not-allowed pointer-events-none text-[var(--color-text-placeholder)]",
|
|
9
|
-
hover: "hover:bg-
|
|
9
|
+
hover: "hover:bg-[var(--color-background-secondary)]",
|
|
10
10
|
},
|
|
11
11
|
iconStates: {
|
|
12
12
|
default: "text-[var(--color-text-secondary)] group-hover:text-[var(--color-text-primary)]",
|
|
@@ -22,6 +22,9 @@ const navItemTheme = {
|
|
|
22
22
|
container: "!gap-0 justify-center p-2 aspect-square",
|
|
23
23
|
icon: "size-5",
|
|
24
24
|
},
|
|
25
|
+
activeIndicator: "before:absolute before:left-0 before:top-1/2 before:-translate-y-1/2 before:h-5 before:w-[3px] before:rounded-full before:bg-[var(--color-primary)]",
|
|
26
|
+
notificationDot: "size-2 rounded-full bg-[var(--color-danger)]",
|
|
27
|
+
notificationBadge: "min-w-[18px] h-[18px] px-1 text-[10px] font-semibold rounded-full bg-[var(--color-danger)] text-[var(--color-danger-contrast)] flex items-center justify-center leading-none",
|
|
25
28
|
};
|
|
26
29
|
|
|
27
30
|
export { navItemTheme };
|
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
|
+
export interface NavItemSubmenuItem {
|
|
3
|
+
/** Label text */
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
/** Link href */
|
|
6
|
+
href?: string;
|
|
7
|
+
/** Click handler */
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
/** Whether this sub-item is active */
|
|
10
|
+
active?: boolean;
|
|
11
|
+
/** Whether this sub-item is disabled */
|
|
12
|
+
isDisabled?: boolean;
|
|
13
|
+
/** Badge text/number on the sub-item */
|
|
14
|
+
badge?: string | number;
|
|
15
|
+
/** Notification count/dot on the sub-item */
|
|
16
|
+
notification?: number | boolean;
|
|
17
|
+
/** Start content (icon) for the sub-item */
|
|
18
|
+
startContent?: ReactNode;
|
|
19
|
+
}
|
|
2
20
|
export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
21
|
/**
|
|
4
22
|
* Content of the navigation item
|
|
@@ -30,6 +48,10 @@ export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
30
48
|
* @deprecated Use endContent instead
|
|
31
49
|
*/
|
|
32
50
|
badge?: string | number;
|
|
51
|
+
/**
|
|
52
|
+
* Notification indicator. Pass a number for a count badge, or true for a dot.
|
|
53
|
+
*/
|
|
54
|
+
notification?: number | boolean;
|
|
33
55
|
/**
|
|
34
56
|
* Link href (for navigation)
|
|
35
57
|
*/
|
|
@@ -58,19 +80,31 @@ export interface NavItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
58
80
|
*/
|
|
59
81
|
isDanger?: boolean;
|
|
60
82
|
/**
|
|
61
|
-
* Whether the item has a submenu
|
|
83
|
+
* Whether the item has a submenu (manual mode).
|
|
84
|
+
* If `items` is provided, this is set automatically.
|
|
62
85
|
* @default false
|
|
63
86
|
*/
|
|
64
87
|
hasSubmenu?: boolean;
|
|
65
88
|
/**
|
|
66
|
-
* Whether the submenu is expanded (for
|
|
89
|
+
* Whether the submenu is expanded (controlled mode for manual submenus).
|
|
67
90
|
* @default false
|
|
68
91
|
*/
|
|
69
92
|
expanded?: boolean;
|
|
70
93
|
/**
|
|
71
|
-
* Callback when submenu is toggled
|
|
94
|
+
* Callback when submenu is toggled (manual mode)
|
|
72
95
|
*/
|
|
73
96
|
onToggleExpanded?: () => void;
|
|
97
|
+
/**
|
|
98
|
+
* Self-contained submenu items. When provided, NavItem manages its own
|
|
99
|
+
* expand/collapse state internally. Children items automatically get
|
|
100
|
+
* level={parentLevel + 1}.
|
|
101
|
+
*/
|
|
102
|
+
items?: NavItemSubmenuItem[];
|
|
103
|
+
/**
|
|
104
|
+
* Whether the self-contained submenu is expanded by default
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
107
|
+
defaultExpanded?: boolean;
|
|
74
108
|
/**
|
|
75
109
|
* Nesting level for indentation (0, 1, 2)
|
|
76
110
|
* @default 0
|
|
@@ -111,6 +145,10 @@ export interface NavItemTheme {
|
|
|
111
145
|
container: string;
|
|
112
146
|
icon: string;
|
|
113
147
|
};
|
|
148
|
+
activeIndicator?: string;
|
|
149
|
+
notificationDot?: string;
|
|
150
|
+
notificationBadge?: string;
|
|
151
|
+
danger?: string;
|
|
114
152
|
}
|
|
115
153
|
export interface NavItemThemeOverrides {
|
|
116
154
|
baseStyle?: string;
|
|
@@ -137,32 +175,8 @@ export interface NavItemThemeOverrides {
|
|
|
137
175
|
container: string;
|
|
138
176
|
icon: string;
|
|
139
177
|
}>;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
baseStyle: string;
|
|
144
|
-
icon: string;
|
|
145
|
-
text: string;
|
|
146
|
-
states: {
|
|
147
|
-
default: string;
|
|
148
|
-
active: string;
|
|
149
|
-
disabled: string;
|
|
150
|
-
hover: string;
|
|
151
|
-
};
|
|
152
|
-
iconStates?: {
|
|
153
|
-
default?: string;
|
|
154
|
-
active?: string;
|
|
155
|
-
disabled?: string;
|
|
156
|
-
hover?: string;
|
|
157
|
-
};
|
|
158
|
-
levels: {
|
|
159
|
-
0: string;
|
|
160
|
-
1: string;
|
|
161
|
-
2: string;
|
|
162
|
-
};
|
|
163
|
-
collapsed: {
|
|
164
|
-
container: string;
|
|
165
|
-
icon: string;
|
|
166
|
-
};
|
|
178
|
+
activeIndicator?: string;
|
|
179
|
+
notificationDot?: string;
|
|
180
|
+
notificationBadge?: string;
|
|
167
181
|
danger?: string;
|
|
168
182
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { NavItem } from './NavItem';
|
|
2
|
-
export type { NavItemProps, NavItemTheme, NavItemThemeOverrides } from './NavItem.types';
|
|
2
|
+
export type { NavItemProps, NavItemSubmenuItem, NavItemTheme, NavItemThemeOverrides } from './NavItem.types';
|
|
@@ -15,7 +15,7 @@ const paginationTheme = {
|
|
|
15
15
|
// Base state - dark
|
|
16
16
|
"dark:bg-[var(--color-neutral-800)] dark:text-[var(--color-neutral-400)] dark:border-transparent " +
|
|
17
17
|
// Hover state - light
|
|
18
|
-
"hover:text-[var(--color-text-primary)] hover:bg-
|
|
18
|
+
"hover:text-[var(--color-text-primary)] hover:bg-[var(--color-background-secondary)] hover:border-[var(--color-border)] " +
|
|
19
19
|
// Hover state - dark
|
|
20
20
|
"dark:hover:bg-[var(--color-neutral-700)] dark:hover:text-[var(--color-neutral-200)] dark:hover:border-[var(--color-neutral-600)] " +
|
|
21
21
|
// Active state - light
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { PopoverRootProps as PopoverProps } from "./Popover.types";
|
|
3
3
|
export declare const Popover: (({ children, className, isOpen: controlledIsOpen, defaultIsOpen, onOpenChange, placement, offset, triggerType, closeOnClickOutside, closeOnEsc, preventClose, hasBackdrop, theme: themeOverrides, darkMode, ...props }: PopoverProps) => import("react/jsx-runtime").JSX.Element) & {
|
|
4
|
-
Trigger: React.ForwardRefExoticComponent<Omit<import("./Popover.types").PopoverTriggerProps, "ref"> & React.RefAttributes<
|
|
4
|
+
Trigger: React.ForwardRefExoticComponent<Omit<import("./Popover.types").PopoverTriggerProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
5
5
|
Body: React.ForwardRefExoticComponent<import("./Popover.types").PopoverBodyProps & React.RefAttributes<HTMLDivElement>>;
|
|
6
6
|
};
|
|
@@ -58,7 +58,7 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
|
|
|
58
58
|
const { position, cssVariables, contentRef: portalContentRef, } = useSelectPortal({
|
|
59
59
|
triggerRef,
|
|
60
60
|
isOpen: isOpen || false,
|
|
61
|
-
placement
|
|
61
|
+
placement,
|
|
62
62
|
offset: offset || 8,
|
|
63
63
|
autoWidth: true,
|
|
64
64
|
onClose: () => {
|
|
@@ -132,7 +132,7 @@ const PopoverBody = React__default.forwardRef(({ children, className, animation
|
|
|
132
132
|
return (jsx(Overlay, { ref: handleRef, isOpen: isOpen, onClose: () => {
|
|
133
133
|
if (!preventClose)
|
|
134
134
|
onOpenChange(false);
|
|
135
|
-
}, closeOnOverlayClick: closeOnClickOutside && !preventClose, closeOnEsc: closeOnEsc && !preventClose, enableScrollLock: false, enableFocusTrap:
|
|
135
|
+
}, closeOnOverlayClick: closeOnClickOutside && !preventClose, closeOnEsc: closeOnEsc && !preventClose, enableScrollLock: false, enableFocusTrap: true, position: "none", role: "dialog", ariaModal: true, contentClassName: contentClasses, contentStyle: contentPositionStyle, animations: animation && !shouldReduceMotion
|
|
136
136
|
? {
|
|
137
137
|
overlay: overlayBackdropAnimations,
|
|
138
138
|
content: overlayContentAnimations,
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { PopoverTriggerProps } from "./Popover.types";
|
|
3
|
-
export declare const PopoverTrigger: React.ForwardRefExoticComponent<Omit<PopoverTriggerProps, "ref"> & React.RefAttributes<
|
|
3
|
+
export declare const PopoverTrigger: React.ForwardRefExoticComponent<Omit<PopoverTriggerProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
@@ -5,6 +5,7 @@ import { usePopoverContext } from './PopoverContext.js';
|
|
|
5
5
|
const PopoverTrigger = React__default.forwardRef(({ children, className, ...props }, ref) => {
|
|
6
6
|
var _a;
|
|
7
7
|
const context = usePopoverContext();
|
|
8
|
+
const childElement = children;
|
|
8
9
|
// Create trigger events based on triggerType
|
|
9
10
|
const getTriggerEvents = () => {
|
|
10
11
|
if (context.triggerType === "click") {
|
|
@@ -14,7 +15,7 @@ const PopoverTrigger = React__default.forwardRef(({ children, className, ...prop
|
|
|
14
15
|
e.preventDefault();
|
|
15
16
|
context.onOpenChange(!context.isOpen);
|
|
16
17
|
// Call the original onClick if it exists
|
|
17
|
-
(_b = (_a =
|
|
18
|
+
(_b = (_a = childElement.props) === null || _a === void 0 ? void 0 : _a.onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e);
|
|
18
19
|
},
|
|
19
20
|
};
|
|
20
21
|
}
|
|
@@ -24,7 +25,7 @@ const PopoverTrigger = React__default.forwardRef(({ children, className, ...prop
|
|
|
24
25
|
var _a, _b;
|
|
25
26
|
context.onOpenChange(true);
|
|
26
27
|
// Call the original onMouseEnter if it exists
|
|
27
|
-
(_b = (_a =
|
|
28
|
+
(_b = (_a = childElement.props) === null || _a === void 0 ? void 0 : _a.onMouseEnter) === null || _b === void 0 ? void 0 : _b.call(_a, e);
|
|
28
29
|
},
|
|
29
30
|
onMouseLeave: (e) => {
|
|
30
31
|
var _a, _b;
|
|
@@ -32,43 +33,42 @@ const PopoverTrigger = React__default.forwardRef(({ children, className, ...prop
|
|
|
32
33
|
context.onOpenChange(false);
|
|
33
34
|
}
|
|
34
35
|
// Call the original onMouseLeave if it exists
|
|
35
|
-
(_b = (_a =
|
|
36
|
+
(_b = (_a = childElement.props) === null || _a === void 0 ? void 0 : _a.onMouseLeave) === null || _b === void 0 ? void 0 : _b.call(_a, e);
|
|
36
37
|
},
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
return {};
|
|
40
41
|
};
|
|
41
42
|
// Merge refs for the trigger element
|
|
42
|
-
function
|
|
43
|
+
function mergeRefs(node) {
|
|
43
44
|
context.triggerRef.current = node;
|
|
44
45
|
if (ref) {
|
|
45
46
|
if (typeof ref === "function")
|
|
46
47
|
ref(node);
|
|
47
|
-
else if (typeof ref === "object")
|
|
48
|
+
else if (typeof ref === "object" && ref)
|
|
48
49
|
ref.current = node;
|
|
49
50
|
}
|
|
50
|
-
const childRef =
|
|
51
|
+
const childRef = childElement.ref;
|
|
51
52
|
if (childRef) {
|
|
52
53
|
if (typeof childRef === "function")
|
|
53
54
|
childRef(node);
|
|
54
|
-
else if (typeof childRef === "object")
|
|
55
|
+
else if (typeof childRef === "object" && childRef)
|
|
55
56
|
childRef.current = node;
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
const triggerEvents = getTriggerEvents();
|
|
59
|
-
const childElement = children;
|
|
60
60
|
return React__default.cloneElement(childElement, {
|
|
61
|
-
ref:
|
|
61
|
+
ref: mergeRefs,
|
|
62
62
|
"aria-expanded": context.isOpen,
|
|
63
63
|
"aria-haspopup": true,
|
|
64
64
|
"aria-controls": context.contentId,
|
|
65
|
-
className: cn((_a = childElement.props) === null || _a === void 0 ? void 0 : _a.className, className
|
|
65
|
+
className: cn("popover-trigger", (_a = childElement.props) === null || _a === void 0 ? void 0 : _a.className, className),
|
|
66
66
|
"data-state": context.isOpen ? "open" : "closed",
|
|
67
67
|
"data-trigger-type": context.triggerType,
|
|
68
68
|
...triggerEvents,
|
|
69
69
|
...props,
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
|
-
PopoverTrigger.displayName = "
|
|
72
|
+
PopoverTrigger.displayName = "Popover.Trigger";
|
|
73
73
|
|
|
74
74
|
export { PopoverTrigger };
|
|
@@ -6,23 +6,24 @@ import { ProgressProps } from "./Progress.types";
|
|
|
6
6
|
* Features:
|
|
7
7
|
* - Determinate mode: Shows specific progress value (0-100)
|
|
8
8
|
* - Indeterminate mode: Animated loading state when value is undefined
|
|
9
|
-
* - Multiple sizes
|
|
9
|
+
* - Multiple sizes with default primary color
|
|
10
|
+
* - className controls the fill bar color (the primary styling target)
|
|
11
|
+
* - wrapperClassName controls the outer container
|
|
10
12
|
* - Flexible label positioning (right, top, bottom, inside)
|
|
11
13
|
* - Respects reduced motion preferences
|
|
12
|
-
* - Full className override support
|
|
13
14
|
*
|
|
14
15
|
* @example
|
|
15
|
-
* //
|
|
16
|
-
* <Progress value={60}
|
|
16
|
+
* // Default (primary color)
|
|
17
|
+
* <Progress value={60} />
|
|
18
|
+
*
|
|
19
|
+
* // Custom fill color via className
|
|
20
|
+
* <Progress value={70} className="bg-[var(--color-success)]" />
|
|
17
21
|
*
|
|
18
22
|
* // With label
|
|
19
23
|
* <Progress value={75} showLabel labelPosition="right" />
|
|
20
24
|
*
|
|
21
25
|
* // Indeterminate (loading)
|
|
22
|
-
* <Progress
|
|
23
|
-
*
|
|
24
|
-
* // Custom label format
|
|
25
|
-
* <Progress value={50} showLabel formatLabel={(pct) => `${pct}% complete`} />
|
|
26
|
+
* <Progress />
|
|
26
27
|
*/
|
|
27
28
|
declare const Progress: React.ForwardRefExoticComponent<ProgressProps & React.RefAttributes<HTMLDivElement>>;
|
|
28
29
|
export { Progress };
|
|
@@ -16,25 +16,26 @@ const PROGRESS_SPRING_TRANSITION = {
|
|
|
16
16
|
* Features:
|
|
17
17
|
* - Determinate mode: Shows specific progress value (0-100)
|
|
18
18
|
* - Indeterminate mode: Animated loading state when value is undefined
|
|
19
|
-
* - Multiple sizes
|
|
19
|
+
* - Multiple sizes with default primary color
|
|
20
|
+
* - className controls the fill bar color (the primary styling target)
|
|
21
|
+
* - wrapperClassName controls the outer container
|
|
20
22
|
* - Flexible label positioning (right, top, bottom, inside)
|
|
21
23
|
* - Respects reduced motion preferences
|
|
22
|
-
* - Full className override support
|
|
23
24
|
*
|
|
24
25
|
* @example
|
|
25
|
-
* //
|
|
26
|
-
* <Progress value={60}
|
|
26
|
+
* // Default (primary color)
|
|
27
|
+
* <Progress value={60} />
|
|
28
|
+
*
|
|
29
|
+
* // Custom fill color via className
|
|
30
|
+
* <Progress value={70} className="bg-[var(--color-success)]" />
|
|
27
31
|
*
|
|
28
32
|
* // With label
|
|
29
33
|
* <Progress value={75} showLabel labelPosition="right" />
|
|
30
34
|
*
|
|
31
35
|
* // Indeterminate (loading)
|
|
32
|
-
* <Progress
|
|
33
|
-
*
|
|
34
|
-
* // Custom label format
|
|
35
|
-
* <Progress value={50} showLabel formatLabel={(pct) => `${pct}% complete`} />
|
|
36
|
+
* <Progress />
|
|
36
37
|
*/
|
|
37
|
-
const Progress = React__default.forwardRef(({ value, size = "md",
|
|
38
|
+
const Progress = React__default.forwardRef(({ value, size = "md", showLabel = false, labelPosition = "right", formatLabel, animated = true, wrapperClassName, className, theme: customTheme, ...props }, ref) => {
|
|
38
39
|
const shouldReduceMotion = useReducedMotion();
|
|
39
40
|
// Merge custom theme with default theme
|
|
40
41
|
const theme = useMemo(() => {
|
|
@@ -44,7 +45,6 @@ const Progress = React__default.forwardRef(({ value, size = "md", color = "prima
|
|
|
44
45
|
...progressTheme,
|
|
45
46
|
...customTheme,
|
|
46
47
|
sizes: { ...progressTheme.sizes, ...customTheme.sizes },
|
|
47
|
-
colors: { ...progressTheme.colors, ...customTheme.colors },
|
|
48
48
|
};
|
|
49
49
|
}, [customTheme]);
|
|
50
50
|
// Calculate percentage (clamped to 0-100)
|
|
@@ -71,7 +71,7 @@ const Progress = React__default.forwardRef(({ value, size = "md", color = "prima
|
|
|
71
71
|
case "top":
|
|
72
72
|
return "flex flex-col gap-1.5";
|
|
73
73
|
case "bottom":
|
|
74
|
-
return "flex flex-col
|
|
74
|
+
return "flex flex-col gap-1.5";
|
|
75
75
|
case "right":
|
|
76
76
|
return "flex items-center gap-3";
|
|
77
77
|
case "inside":
|
|
@@ -95,14 +95,14 @@ const Progress = React__default.forwardRef(({ value, size = "md", color = "prima
|
|
|
95
95
|
: ""), children: label }));
|
|
96
96
|
};
|
|
97
97
|
// Track element with optional fill
|
|
98
|
-
const renderTrack = () => (jsxs("div", { className: cn(theme.trackStyle, theme.sizes[size], "relative",
|
|
98
|
+
const renderTrack = () => (jsxs("div", { className: cn(theme.trackStyle, theme.sizes[size], "relative", wrapperClassName), children: [isIndeterminate ? (
|
|
99
99
|
// Indeterminate animation
|
|
100
|
-
jsx("div", { className: cn(theme.fillStyle,
|
|
100
|
+
jsx("div", { className: cn(theme.fillStyle, "absolute", theme.indeterminateStyle, className) })) : shouldAnimate ? (
|
|
101
101
|
// Animated determinate progress with spring animation
|
|
102
|
-
jsx(motion.div, { className: cn(theme.fillStyle,
|
|
102
|
+
jsx(motion.div, { className: cn(theme.fillStyle, className), initial: { width: 0 }, animate: { width: `${percentage}%` }, transition: PROGRESS_SPRING_TRANSITION })) : (
|
|
103
103
|
// Static determinate progress
|
|
104
|
-
jsx("div", { className: cn(theme.fillStyle,
|
|
105
|
-
return (jsxs("div", { ref: ref, className: cn(theme.containerStyle, containerLayoutClass
|
|
104
|
+
jsx("div", { className: cn(theme.fillStyle, className), style: { width: `${percentage}%` } })), showLabel && labelPosition === "inside" && size === "lg" && !isIndeterminate && (jsx("span", { className: theme.insideLabelStyle, children: label }))] }));
|
|
105
|
+
return (jsxs("div", { ref: ref, className: cn(theme.containerStyle, containerLayoutClass), role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": isIndeterminate ? undefined : percentage, "aria-label": isIndeterminate ? "Loading" : `${percentage}% complete`, ...props, children: [labelPosition === "top" && renderLabel(), labelPosition === "right" ? (jsxs(Fragment, { children: [jsx("div", { className: "flex-1", children: renderTrack() }), renderLabel()] })) : (renderTrack()), labelPosition === "bottom" && renderLabel()] }));
|
|
106
106
|
});
|
|
107
107
|
Progress.displayName = "Progress";
|
|
108
108
|
|