@plexui/ui 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/es/components/Accordion/Accordion.js +2 -2
- package/dist/es/components/Accordion/Accordion.js.map +1 -1
- package/dist/es/components/Accordion/index.js +1 -1
- package/dist/es/components/Alert/Alert.js +6 -6
- package/dist/es/components/Alert/Alert.js.map +1 -1
- package/dist/es/components/Alert/index.js +1 -1
- package/dist/es/components/Avatar/Avatar.js +12 -5
- package/dist/es/components/Avatar/Avatar.js.map +1 -1
- package/dist/es/components/Avatar/AvatarGroup.js +2 -2
- package/dist/es/components/Avatar/AvatarGroup.js.map +1 -1
- package/dist/es/components/Avatar/index.js +2 -2
- package/dist/es/components/Badge/index.js +3 -3
- package/dist/es/components/Badge/index.js.map +1 -1
- package/dist/es/components/Breadcrumb/Breadcrumb.js +34 -0
- package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/es/components/Breadcrumb/index.js +2 -0
- package/dist/es/components/Breadcrumb/index.js.map +1 -0
- package/dist/es/components/Button/Button.js +7 -7
- package/dist/es/components/Button/Button.js.map +1 -1
- package/dist/es/components/Button/CopyButton.js +25 -13
- package/dist/es/components/Button/CopyButton.js.map +1 -1
- package/dist/es/components/Button/index.js +2 -2
- package/dist/es/components/ButtonGroup/ButtonGroup.js +2 -2
- package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist/es/components/ButtonGroup/index.js +1 -1
- package/dist/es/components/Card/Card.js +4 -3
- package/dist/es/components/Card/Card.js.map +1 -1
- package/dist/es/components/Card/index.js +1 -1
- package/dist/es/components/Checkbox/Checkbox.js +12 -6
- package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/es/components/Checkbox/index.js +1 -1
- package/dist/es/components/CodeBlock/CodeBlock.js +25 -25
- package/dist/es/components/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js +6 -4
- package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js.map +1 -1
- package/dist/es/components/CodeBlock/index.js +2 -2
- package/dist/es/components/DataTable/DataTable.js +108 -27
- package/dist/es/components/DataTable/DataTable.js.map +1 -1
- package/dist/es/components/DataTable/DataTableColumnHeader.js +2 -2
- package/dist/es/components/DataTable/DataTableColumnHeader.js.map +1 -1
- package/dist/es/components/DataTable/DataTablePagination.js +8 -4
- package/dist/es/components/DataTable/DataTablePagination.js.map +1 -1
- package/dist/es/components/DataTable/columnHelpers.js +3 -3
- package/dist/es/components/DataTable/index.js +4 -4
- package/dist/es/components/DateInput/DateInput.js +21 -13
- package/dist/es/components/DateInput/DateInput.js.map +1 -1
- package/dist/es/components/DateInput/index.js +1 -1
- package/dist/es/components/DatePicker/Calendar.js +136 -32
- package/dist/es/components/DatePicker/Calendar.js.map +1 -1
- package/dist/es/components/DatePicker/DatePicker.js +15 -11
- package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/es/components/DatePicker/index.js +1 -1
- package/dist/es/components/DateRangePicker/Calendar.js +125 -22
- package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
- package/dist/es/components/DateRangePicker/DateRangePicker.js +10 -9
- package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/es/components/DateRangePicker/Trigger.js +12 -9
- package/dist/es/components/DateRangePicker/Trigger.js.map +1 -1
- package/dist/es/components/DateRangePicker/index.js +2 -2
- package/dist/es/components/Dialog/Dialog.js +11 -6
- package/dist/es/components/Dialog/Dialog.js.map +1 -1
- package/dist/es/components/Dialog/index.js +1 -1
- package/dist/es/components/Dialog/index.js.map +1 -1
- package/dist/es/components/EmptyMessage/EmptyMessage.js +4 -4
- package/dist/es/components/EmptyMessage/EmptyMessage.js.map +1 -1
- package/dist/es/components/EmptyMessage/index.js +1 -1
- package/dist/es/components/Field/Field.js +22 -7
- package/dist/es/components/Field/Field.js.map +1 -1
- package/dist/es/components/Field/index.js +1 -1
- package/dist/es/components/FieldError/FieldError.js +4 -4
- package/dist/es/components/FieldError/FieldError.js.map +1 -1
- package/dist/es/components/FieldError/index.js +1 -1
- package/dist/es/components/FileUpload/FileUpload.js +12 -9
- package/dist/es/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/es/components/FileUpload/index.js +1 -1
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js +31 -4
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js.map +1 -1
- package/dist/es/components/FloatingLabelInput/index.js +1 -1
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js +28 -8
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js.map +1 -1
- package/dist/es/components/FloatingLabelSelect/index.js +1 -1
- package/dist/es/components/Icon/aliases.js +20 -20
- package/dist/es/components/Icon/index.js +653 -653
- package/dist/es/components/Image/Image.js +19 -7
- package/dist/es/components/Image/Image.js.map +1 -1
- package/dist/es/components/Image/index.js +1 -1
- package/dist/es/components/Indicator/CircularProgress.js +3 -3
- package/dist/es/components/Indicator/CircularProgress.js.map +1 -1
- package/dist/es/components/Indicator/LoadingDots.js +1 -1
- package/dist/es/components/Indicator/LoadingDots.js.map +1 -1
- package/dist/es/components/Indicator/LoadingIndicator.js +2 -2
- package/dist/es/components/Indicator/LoadingIndicator.js.map +1 -1
- package/dist/es/components/Indicator/index.js +3 -3
- package/dist/es/components/Input/Input.js +16 -5
- package/dist/es/components/Input/Input.js.map +1 -1
- package/dist/es/components/Input/index.js +1 -1
- package/dist/es/components/InputGroup/InputGroup.js +60 -0
- package/dist/es/components/InputGroup/InputGroup.js.map +1 -0
- package/dist/es/components/InputGroup/index.js +2 -0
- package/dist/es/components/InputGroup/index.js.map +1 -0
- package/dist/es/components/Kbd/Kbd.js +13 -0
- package/dist/es/components/Kbd/Kbd.js.map +1 -0
- package/dist/es/components/Kbd/index.js +2 -0
- package/dist/es/components/Kbd/index.js.map +1 -0
- package/dist/es/components/Label/Label.js +1 -1
- package/dist/es/components/Label/Label.js.map +1 -1
- package/dist/es/components/Label/index.js +1 -1
- package/dist/es/components/Markdown/Markdown.js +8 -8
- package/dist/es/components/Markdown/Markdown.js.map +1 -1
- package/dist/es/components/Markdown/directives.js +2 -2
- package/dist/es/components/Markdown/index.js +4 -5
- package/dist/es/components/Markdown/index.js.map +1 -1
- package/dist/es/components/MarkdownEditor/MarkdownEditor.js +35 -11
- package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
- package/dist/es/components/MarkdownEditor/index.js +1 -1
- package/dist/es/components/Menu/Menu.js +26 -18
- package/dist/es/components/Menu/Menu.js.map +1 -1
- package/dist/es/components/Menu/index.js +1 -1
- package/dist/es/components/OTPInput/OTPInput.js +51 -34
- package/dist/es/components/OTPInput/OTPInput.js.map +1 -1
- package/dist/es/components/OTPInput/index.js +1 -1
- package/dist/es/components/PlexUIProvider/PlexUIProvider.js +3 -1
- package/dist/es/components/PlexUIProvider/PlexUIProvider.js.map +1 -1
- package/dist/es/components/PlexUIProvider/index.js +1 -1
- package/dist/es/components/PlexUIProvider/internal.js +1 -1
- package/dist/es/components/Popover/Popover.js +7 -7
- package/dist/es/components/Popover/Popover.js.map +1 -1
- package/dist/es/components/Popover/index.js +2 -3
- package/dist/es/components/Popover/index.js.map +1 -1
- package/dist/es/components/Popover/usePopoverController.js +2 -2
- package/dist/es/components/Progress/Progress.js +1 -1
- package/dist/es/components/Progress/Progress.js.map +1 -1
- package/dist/es/components/Progress/index.js +1 -1
- package/dist/es/components/ProgressSteps/ProgressSteps.js +6 -4
- package/dist/es/components/ProgressSteps/ProgressSteps.js.map +1 -1
- package/dist/es/components/ProgressSteps/index.js +1 -1
- package/dist/es/components/RadioGroup/RadioGroup.js +10 -6
- package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/es/components/RadioGroup/index.js +1 -1
- package/dist/es/components/SegmentedControl/index.js +1 -1
- package/dist/es/components/Select/Select.js +104 -67
- package/dist/es/components/Select/Select.js.map +1 -1
- package/dist/es/components/Select/index.js +1 -1
- package/dist/es/components/SelectControl/SelectControl.js +10 -5
- package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
- package/dist/es/components/SelectControl/index.js +1 -1
- package/dist/es/components/Separator/Separator.js +1 -1
- package/dist/es/components/Separator/Separator.js.map +1 -1
- package/dist/es/components/Separator/index.js +1 -1
- package/dist/es/components/ShimmerText/ShimmerText.js +1 -1
- package/dist/es/components/ShimmerText/ShimmerText.js.map +1 -1
- package/dist/es/components/ShimmerText/index.js +1 -1
- package/dist/es/components/Sidebar/Sidebar.js +37 -29
- package/dist/es/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/es/components/Sidebar/index.js +2 -2
- package/dist/es/components/Sidebar/useSidebarContext.js +17 -19
- package/dist/es/components/Sidebar/useSidebarContext.js.map +1 -1
- package/dist/es/components/Skeleton/index.js +1 -1
- package/dist/es/components/Skeleton/index.js.map +1 -1
- package/dist/es/components/Slider/Slider.js +48 -19
- package/dist/es/components/Slider/Slider.js.map +1 -1
- package/dist/es/components/Slider/index.js +1 -1
- package/dist/es/components/StatCard/StatCard.js +5 -5
- package/dist/es/components/StatCard/StatCard.js.map +1 -1
- package/dist/es/components/StatCard/index.js +1 -1
- package/dist/es/components/Switch/Switch.js +7 -3
- package/dist/es/components/Switch/Switch.js.map +1 -1
- package/dist/es/components/Switch/index.js +1 -1
- package/dist/es/components/Table/Table.js +1 -1
- package/dist/es/components/Table/Table.js.map +1 -1
- package/dist/es/components/Table/index.js +1 -1
- package/dist/es/components/Tabs/Tabs.js +154 -6
- package/dist/es/components/Tabs/Tabs.js.map +1 -1
- package/dist/es/components/Tabs/index.js +1 -1
- package/dist/es/components/Tabs/overflow.js +44 -0
- package/dist/es/components/Tabs/overflow.js.map +1 -0
- package/dist/es/components/TagInput/TagInput.js +47 -23
- package/dist/es/components/TagInput/TagInput.js.map +1 -1
- package/dist/es/components/TagInput/index.js +1 -1
- package/dist/es/components/TextLink/TextLink.js +16 -5
- package/dist/es/components/TextLink/TextLink.js.map +1 -1
- package/dist/es/components/TextLink/index.js +1 -1
- package/dist/es/components/Textarea/Textarea.js +4 -4
- package/dist/es/components/Textarea/Textarea.js.map +1 -1
- package/dist/es/components/Textarea/index.js +1 -1
- package/dist/es/components/Toast/Toaster.js +2 -2
- package/dist/es/components/Toast/Toaster.js.map +1 -1
- package/dist/es/components/Toast/index.js +1 -1
- package/dist/es/components/Tooltip/CopyTooltip.js +30 -9
- package/dist/es/components/Tooltip/CopyTooltip.js.map +1 -1
- package/dist/es/components/Tooltip/Tooltip.js +3 -3
- package/dist/es/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/es/components/Tooltip/index.js +2 -2
- package/dist/es/components/Transition/Animate.js +4 -4
- package/dist/es/components/Transition/Animate.js.map +1 -1
- package/dist/es/components/Transition/AnimateLayout.js +4 -4
- package/dist/es/components/Transition/AnimateLayout.js.map +1 -1
- package/dist/es/components/Transition/AnimateLayoutGroup.js +12 -8
- package/dist/es/components/Transition/AnimateLayoutGroup.js.map +1 -1
- package/dist/es/components/Transition/SlotTransitionGroup.js +4 -4
- package/dist/es/components/Transition/TransitionGroup.js +5 -5
- package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
- package/dist/es/components/Transition/getDisableAnimations.js +1 -1
- package/dist/es/components/Transition/index.js +5 -5
- package/dist/es/components/Transition/shared.js +7 -5
- package/dist/es/components/Transition/shared.js.map +1 -1
- package/dist/es/components/UIProvider/UIProvider.js +1 -1
- package/dist/es/components/UIProvider/index.js +1 -1
- package/dist/es/components/UIProvider/internal.js +1 -1
- package/dist/es/hooks/useAnimatedScrollTo.js +1 -1
- package/dist/es/hooks/useBreakpoints.js +8 -2
- package/dist/es/hooks/useBreakpoints.js.map +1 -1
- package/dist/es/hooks/useEscCloseStack.js +1 -1
- package/dist/es/hooks/usePrevious.js +7 -5
- package/dist/es/hooks/usePrevious.js.map +1 -1
- package/dist/es/hooks/useTextSelection.js +2 -2
- package/dist/es/hooks/useTrailingValue.js +1 -1
- package/dist/es/lib/constants.js +1 -1
- package/dist/es/lib/helpers.js +1 -1
- package/dist/es/lib/helpers.js.map +1 -1
- package/dist/es/lib/renderHelpers.js +15 -6
- package/dist/es/lib/renderHelpers.js.map +1 -1
- package/dist/es/lib/theme.js +16 -16
- package/dist/es/lib/theme.js.map +1 -1
- package/dist/es/lib/userAgent.js +3 -2
- package/dist/es/lib/userAgent.js.map +1 -1
- package/dist/es/styles/base.css +1 -102
- package/dist/es/styles/globals.css +1 -50
- package/dist/es/styles/index.css +1 -25
- package/dist/es/styles/katex.min.css +1 -1296
- package/dist/es/styles/tailwind-utilities.css +1 -1316
- package/dist/es/styles/variables-components.css +1 -626
- package/dist/es/styles/variables-primitive.css +1 -327
- package/dist/es/styles/variables-semantic.css +1 -609
- package/dist/es/styles/variables-tailwind-theme.css +1 -34
- package/dist/es/styles/variables-tokens-root.css +1 -41
- package/dist/es/types.js +1 -1
- package/dist/es/types.js.map +1 -1
- package/dist/es/vite/index.js +3 -53
- package/dist/es/vite/index.js.map +1 -1
- package/dist/types/components/Accordion/index.d.ts +1 -1
- package/dist/types/components/Alert/Alert.d.ts +8 -2
- package/dist/types/components/Alert/index.d.ts +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts +1 -1
- package/dist/types/components/Avatar/index.d.ts +2 -2
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +34 -0
- package/dist/types/components/Breadcrumb/index.d.ts +1 -0
- package/dist/types/components/Button/Button.d.ts +3 -3
- package/dist/types/components/Button/CopyButton.d.ts +9 -4
- package/dist/types/components/Button/index.d.ts +2 -2
- package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +4 -3
- package/dist/types/components/ButtonGroup/index.d.ts +1 -1
- package/dist/types/components/Card/index.d.ts +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +3 -1
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/CodeBlock/index.d.ts +2 -2
- package/dist/types/components/DataTable/DataTable.d.ts +3 -2
- package/dist/types/components/DataTable/index.d.ts +4 -4
- package/dist/types/components/DateInput/DateInput.d.ts +1 -1
- package/dist/types/components/DateInput/index.d.ts +1 -1
- package/dist/types/components/DatePicker/DatePicker.d.ts +7 -6
- package/dist/types/components/DatePicker/context.d.ts +1 -1
- package/dist/types/components/DatePicker/index.d.ts +2 -2
- package/dist/types/components/DateRangePicker/Calendar.d.ts +1 -1
- package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +5 -5
- package/dist/types/components/DateRangePicker/context.d.ts +2 -2
- package/dist/types/components/DateRangePicker/index.d.ts +2 -2
- package/dist/types/components/Dialog/Dialog.d.ts +19 -1
- package/dist/types/components/Dialog/index.d.ts +1 -1
- package/dist/types/components/EmptyMessage/EmptyMessage.d.ts +15 -3
- package/dist/types/components/EmptyMessage/index.d.ts +1 -1
- package/dist/types/components/Field/Field.d.ts +14 -4
- package/dist/types/components/Field/index.d.ts +1 -1
- package/dist/types/components/FieldError/FieldError.d.ts +7 -1
- package/dist/types/components/FieldError/index.d.ts +1 -1
- package/dist/types/components/FileUpload/index.d.ts +1 -1
- package/dist/types/components/FloatingLabelInput/index.d.ts +1 -1
- package/dist/types/components/FloatingLabelSelect/index.d.ts +1 -1
- package/dist/types/components/Icon/aliases.d.ts +20 -20
- package/dist/types/components/Icon/index.d.ts +653 -653
- package/dist/types/components/Image/Image.d.ts +1 -1
- package/dist/types/components/Image/index.d.ts +1 -1
- package/dist/types/components/Indicator/index.d.ts +3 -3
- package/dist/types/components/Input/Input.d.ts +2 -2
- package/dist/types/components/Input/index.d.ts +1 -1
- package/dist/types/components/InputGroup/InputGroup.d.ts +78 -0
- package/dist/types/components/InputGroup/index.d.ts +1 -0
- package/dist/types/components/Kbd/Kbd.d.ts +20 -0
- package/dist/types/components/Kbd/index.d.ts +1 -0
- package/dist/types/components/Label/index.d.ts +1 -1
- package/dist/types/components/Markdown/Markdown.d.ts +1 -1
- package/dist/types/components/Markdown/index.d.ts +4 -4
- package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +6 -2
- package/dist/types/components/MarkdownEditor/index.d.ts +1 -1
- package/dist/types/components/Menu/Menu.d.ts +11 -3
- package/dist/types/components/Menu/index.d.ts +1 -1
- package/dist/types/components/OTPInput/index.d.ts +1 -1
- package/dist/types/components/PlexUIProvider/PlexUIProvider.d.ts +0 -11
- package/dist/types/components/PlexUIProvider/index.d.ts +1 -1
- package/dist/types/components/Popover/index.d.ts +2 -2
- package/dist/types/components/Progress/index.d.ts +1 -1
- package/dist/types/components/ProgressSteps/ProgressSteps.d.ts +1 -1
- package/dist/types/components/ProgressSteps/index.d.ts +1 -1
- package/dist/types/components/RadioGroup/RadioGroup.d.ts +3 -1
- package/dist/types/components/RadioGroup/index.d.ts +1 -1
- package/dist/types/components/SegmentedControl/index.d.ts +2 -2
- package/dist/types/components/Select/Select.d.ts +8 -1
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/SelectControl/SelectControl.d.ts +1 -1
- package/dist/types/components/SelectControl/index.d.ts +1 -1
- package/dist/types/components/Separator/index.d.ts +1 -1
- package/dist/types/components/ShimmerText/index.d.ts +1 -1
- package/dist/types/components/Sidebar/Sidebar.d.ts +4 -8
- package/dist/types/components/Sidebar/index.d.ts +4 -4
- package/dist/types/components/Slider/Slider.d.ts +8 -0
- package/dist/types/components/Slider/index.d.ts +2 -2
- package/dist/types/components/StatCard/index.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts +1 -1
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Tabs/Tabs.d.ts +15 -2
- package/dist/types/components/Tabs/index.d.ts +2 -2
- package/dist/types/components/Tabs/overflow.d.ts +17 -0
- package/dist/types/components/TagInput/TagInput.d.ts +1 -1
- package/dist/types/components/TagInput/index.d.ts +1 -1
- package/dist/types/components/TextLink/index.d.ts +1 -1
- package/dist/types/components/Textarea/Textarea.d.ts +1 -1
- package/dist/types/components/Textarea/index.d.ts +1 -1
- package/dist/types/components/Toast/index.d.ts +1 -1
- package/dist/types/components/Tooltip/CopyTooltip.d.ts +6 -1
- package/dist/types/components/Tooltip/index.d.ts +2 -2
- package/dist/types/components/Transition/Animate.d.ts +2 -2
- package/dist/types/components/Transition/AnimateLayout.d.ts +2 -2
- package/dist/types/components/Transition/AnimateLayoutGroup.d.ts +2 -2
- package/dist/types/components/Transition/SlotTransitionGroup.d.ts +1 -1
- package/dist/types/components/Transition/TransitionGroup.d.ts +1 -1
- package/dist/types/components/Transition/index.d.ts +5 -5
- package/dist/types/components/UIProvider/index.d.ts +1 -1
- package/dist/types/global.d.ts +5 -1
- package/dist/types/lib/constants.d.ts +1 -1
- package/dist/types/lib/helpers.d.ts +4 -4
- package/dist/types/lib/theme.d.ts +1 -1
- package/dist/types/types.d.ts +2 -15
- package/dist/types/vite/index.d.ts +2 -55
- package/package.json +10 -18
- package/dist/es/components/Accordion/Accordion.module.css +0 -89
- package/dist/es/components/Alert/Alert.module.css +0 -187
- package/dist/es/components/Avatar/Avatar.module.css +0 -168
- package/dist/es/components/Avatar/AvatarGroup.module.css +0 -26
- package/dist/es/components/Badge/Badge.module.css +0 -196
- package/dist/es/components/Button/Button.module.css +0 -859
- package/dist/es/components/ButtonGroup/ButtonGroup.module.css +0 -159
- package/dist/es/components/Card/Card.module.css +0 -125
- package/dist/es/components/Checkbox/Checkbox.module.css +0 -198
- package/dist/es/components/CodeBlock/CodeBlock.module.css +0 -137
- package/dist/es/components/DataTable/DataTable.module.css +0 -108
- package/dist/es/components/DatePicker/Calendar.module.css +0 -271
- package/dist/es/components/DateRangePicker/Calendar.module.css +0 -295
- package/dist/es/components/DateRangePicker/Trigger.module.css +0 -25
- package/dist/es/components/Dialog/Dialog.module.css +0 -133
- package/dist/es/components/EmptyMessage/EmptyMessage.module.css +0 -82
- package/dist/es/components/Field/Field.module.css +0 -137
- package/dist/es/components/FieldError/FieldError.module.css +0 -22
- package/dist/es/components/FileUpload/FileUpload.module.css +0 -133
- package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +0 -220
- package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +0 -146
- package/dist/es/components/Image/Image.module.css +0 -9
- package/dist/es/components/Indicator/CircularProgress.module.css +0 -28
- package/dist/es/components/Indicator/LoadingDots.module.css +0 -35
- package/dist/es/components/Indicator/LoadingIndicator.module.css +0 -41
- package/dist/es/components/Input/Input.module.css +0 -507
- package/dist/es/components/Label/Label.module.css +0 -16
- package/dist/es/components/Markdown/Markdown.module.css +0 -233
- package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +0 -297
- package/dist/es/components/Menu/Menu.module.css +0 -377
- package/dist/es/components/OTPInput/OTPInput.module.css +0 -66
- package/dist/es/components/Popover/Popover.module.css +0 -82
- package/dist/es/components/Progress/Progress.module.css +0 -34
- package/dist/es/components/ProgressSteps/ProgressSteps.module.css +0 -246
- package/dist/es/components/RadioGroup/RadioGroup.module.css +0 -137
- package/dist/es/components/Select/Select.module.css +0 -310
- package/dist/es/components/SelectControl/SelectControl.module.css +0 -558
- package/dist/es/components/Separator/Separator.module.css +0 -16
- package/dist/es/components/ShimmerText/ShimmerText.module.css +0 -43
- package/dist/es/components/Sidebar/Sidebar.module.css +0 -909
- package/dist/es/components/Skeleton/Skeleton.module.css +0 -17
- package/dist/es/components/Slider/Slider.module.css +0 -203
- package/dist/es/components/StatCard/StatCard.module.css +0 -234
- package/dist/es/components/Switch/Switch.module.css +0 -121
- package/dist/es/components/Table/Table.module.css +0 -56
- package/dist/es/components/Tabs/Tabs.module.css +0 -672
- package/dist/es/components/TagInput/TagInput.module.css +0 -320
- package/dist/es/components/TextLink/TextLink.module.css +0 -50
- package/dist/es/components/Textarea/Textarea.module.css +0 -272
- package/dist/es/components/Toast/Toast.module.css +0 -84
- package/dist/es/components/Tooltip/Tooltip.module.css +0 -91
- package/dist/es/components/Transition/Animate.module.css +0 -54
- package/dist/es/components/Transition/AnimateLayout.module.css +0 -101
- package/dist/es/components/Transition/AnimateLayoutGroup.module.css +0 -72
- package/dist/es/components/Transition/TransitionGroup.module.css +0 -4
|
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
5
|
import { createPortal } from "react-dom";
|
|
6
|
-
import {} from "../../types";
|
|
7
|
-
import { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from "../Icon";
|
|
8
|
-
import { Tooltip } from "../Tooltip";
|
|
6
|
+
import {} from "../../types.js";
|
|
7
|
+
import { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from "../Icon/index.js";
|
|
8
|
+
import { Tooltip } from "../Tooltip/index.js";
|
|
9
9
|
import { useEditor, EditorContent } from "@tiptap/react";
|
|
10
10
|
import Document from "@tiptap/extension-document";
|
|
11
11
|
import Paragraph from "@tiptap/extension-paragraph";
|
|
@@ -20,10 +20,17 @@ import History from "@tiptap/extension-history";
|
|
|
20
20
|
import Placeholder from "@tiptap/extension-placeholder";
|
|
21
21
|
import HardBreak from "@tiptap/extension-hard-break";
|
|
22
22
|
import { Markdown as MarkdownExtension } from "tiptap-markdown";
|
|
23
|
-
import s from "
|
|
23
|
+
import s from "@plexui/styles/components/MarkdownEditor/MarkdownEditor.module.css";
|
|
24
24
|
export const markdownEditorStyles = {
|
|
25
25
|
toolbarButton: s.ToolbarButton,
|
|
26
26
|
};
|
|
27
|
+
// A link inserted as a text node, not as `<a>` HTML: the markdown parser runs
|
|
28
|
+
// with `html: false`, so HTML would land in the text as written
|
|
29
|
+
const linkText = (text, href) => ({
|
|
30
|
+
type: "text",
|
|
31
|
+
text,
|
|
32
|
+
marks: [{ type: "link", attrs: { href } }],
|
|
33
|
+
});
|
|
27
34
|
function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemove, onCancel, }) {
|
|
28
35
|
const [url, setUrl] = useState(initialUrl);
|
|
29
36
|
const [title, setTitle] = useState(initialTitle);
|
|
@@ -36,7 +43,8 @@ function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemov
|
|
|
36
43
|
}
|
|
37
44
|
}, [open, initialUrl, initialTitle]);
|
|
38
45
|
const handleKeyDown = (evt) => {
|
|
39
|
-
|
|
46
|
+
// Enter in a field saves; on a button it is that button's own click
|
|
47
|
+
if (evt.key === "Enter" && evt.target instanceof HTMLInputElement) {
|
|
40
48
|
evt.preventDefault();
|
|
41
49
|
onSave(url, title);
|
|
42
50
|
}
|
|
@@ -44,15 +52,26 @@ function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemov
|
|
|
44
52
|
evt.preventDefault();
|
|
45
53
|
onCancel();
|
|
46
54
|
}
|
|
55
|
+
// The dialog is modal: Tab from the last control wraps to the first, and
|
|
56
|
+
// Shift+Tab from the first to the last
|
|
57
|
+
if (evt.key === "Tab") {
|
|
58
|
+
const controls = Array.from(evt.currentTarget.querySelectorAll("input, button"));
|
|
59
|
+
const first = controls[0];
|
|
60
|
+
const last = controls[controls.length - 1];
|
|
61
|
+
if (evt.target === (evt.shiftKey ? first : last)) {
|
|
62
|
+
evt.preventDefault();
|
|
63
|
+
(evt.shiftKey ? last : first)?.focus();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
47
66
|
};
|
|
48
67
|
if (!open || typeof document === "undefined")
|
|
49
68
|
return null;
|
|
50
|
-
return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: s.LinkDialogOverlay, onClick: onCancel }), _jsxs("div", { className: s.LinkDialogContent, role: "dialog", "aria-label": "Link", onKeyDown: handleKeyDown, children: [_jsxs("div", { className: s.LinkDialogBody, children: [_jsx("h3", { className: s.LinkDialogTitle, children: "Link" }), _jsxs("div", { className: s.LinkDialogFields, children: [_jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-url", children: "URL" }), _jsx("input", { ref: urlRef, id: "md-editor-link-url", className: s.LinkDialogInput, type: "url", placeholder: "Enter URL", value: url, onChange: (e) => setUrl(e.target.value) })] }), _jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-title", children: "Link title" }), _jsx("input", { id: "md-editor-link-title", className: s.LinkDialogInput, type: "text", placeholder: "Enter link title", value: title, onChange: (e) => setTitle(e.target.value) })] })] })] }), _jsxs("div", { className: s.LinkDialogFooter, children: [isEditing && (_jsx("button", { type: "button", className: s.LinkDialogButtonRemove, onClick: onRemove, children: "Remove" })), _jsxs("div", { className: s.LinkDialogFooterTrailing, children: [_jsx("button", { type: "button", className: s.LinkDialogButtonCancel, onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: s.LinkDialogButtonSave, onClick: () => onSave(url, title), children: "Save" })] })] })] })] }), document.body);
|
|
69
|
+
return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: s.LinkDialogOverlay, onClick: onCancel }), _jsxs("div", { className: s.LinkDialogContent, role: "dialog", "aria-modal": "true", "aria-label": "Link", onKeyDown: handleKeyDown, children: [_jsxs("div", { className: s.LinkDialogBody, children: [_jsx("h3", { className: s.LinkDialogTitle, children: "Link" }), _jsxs("div", { className: s.LinkDialogFields, children: [_jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-url", children: "URL" }), _jsx("input", { ref: urlRef, id: "md-editor-link-url", className: s.LinkDialogInput, type: "url", placeholder: "Enter URL", value: url, onChange: (e) => setUrl(e.target.value) })] }), _jsxs("div", { className: s.LinkDialogField, children: [_jsx("label", { className: s.LinkDialogLabel, htmlFor: "md-editor-link-title", children: "Link title" }), _jsx("input", { id: "md-editor-link-title", className: s.LinkDialogInput, type: "text", placeholder: "Enter link title", value: title, onChange: (e) => setTitle(e.target.value) })] })] })] }), _jsxs("div", { className: s.LinkDialogFooter, children: [isEditing && (_jsx("button", { type: "button", className: s.LinkDialogButtonRemove, onClick: onRemove, children: "Remove" })), _jsxs("div", { className: s.LinkDialogFooterTrailing, children: [_jsx("button", { type: "button", className: s.LinkDialogButtonCancel, onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: s.LinkDialogButtonSave, onClick: () => onSave(url, title), children: "Save" })] })] })] })] }), document.body);
|
|
51
70
|
}
|
|
52
71
|
function ToolbarButton({ tooltip, active, disabled, onClick, children, }) {
|
|
53
|
-
return (_jsx(Tooltip, { content: tooltip, compact: true, children: _jsx("button", { type: "button", className: s.ToolbarButton, "data-active": active || undefined, onClick: onClick, disabled: disabled, "aria-label": tooltip, children: children }) }));
|
|
72
|
+
return (_jsx(Tooltip, { content: tooltip, compact: true, children: _jsx("button", { type: "button", className: s.ToolbarButton, "data-active": active || undefined, "aria-pressed": active, onClick: onClick, disabled: disabled, "aria-label": tooltip, children: children }) }));
|
|
54
73
|
}
|
|
55
|
-
export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows = 1, className, id, "aria-describedby": ariaDescribedby, "aria-invalid": ariaInvalid, }) {
|
|
74
|
+
export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows = 1, className, id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby, "aria-invalid": ariaInvalid, }) {
|
|
56
75
|
const [focused, setFocused] = useState(false);
|
|
57
76
|
const [linkDialogOpen, setLinkDialogOpen] = useState(false);
|
|
58
77
|
const [linkDialogInitial, setLinkDialogInitial] = useState({ url: "", title: "" });
|
|
@@ -104,6 +123,8 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
|
|
|
104
123
|
role: "textbox",
|
|
105
124
|
"aria-multiline": "true",
|
|
106
125
|
...(id && { id }),
|
|
126
|
+
...(ariaLabel && { "aria-label": ariaLabel }),
|
|
127
|
+
...(ariaLabelledby && { "aria-labelledby": ariaLabelledby }),
|
|
107
128
|
...(ariaDescribedby && { "aria-describedby": ariaDescribedby }),
|
|
108
129
|
...(ariaInvalid && { "aria-invalid": "true" }),
|
|
109
130
|
},
|
|
@@ -139,6 +160,9 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
|
|
|
139
160
|
const target = evt.target;
|
|
140
161
|
if (target.closest("button, [type='button'], [role='button'], a, input, label"))
|
|
141
162
|
return;
|
|
163
|
+
// A press in the text places the caret there itself
|
|
164
|
+
if (editor.view.dom.contains(target))
|
|
165
|
+
return;
|
|
142
166
|
if (editor.isFocused)
|
|
143
167
|
return;
|
|
144
168
|
evt.preventDefault();
|
|
@@ -182,20 +206,20 @@ export function MarkdownEditor({ variant = "outline", disabled = false, invalid
|
|
|
182
206
|
const selectedText = empty ? "" : editor.state.doc.textBetween(from, to, "");
|
|
183
207
|
const isOnExistingLink = editor.isActive("link");
|
|
184
208
|
if (empty && !isOnExistingLink) {
|
|
185
|
-
editor.chain().focus().insertContent(
|
|
209
|
+
editor.chain().focus().insertContent(linkText(title || url, url)).run();
|
|
186
210
|
}
|
|
187
211
|
else if (isOnExistingLink) {
|
|
188
212
|
editor.chain().focus().extendMarkRange("link").run();
|
|
189
213
|
const linkRange = editor.state.selection;
|
|
190
214
|
if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, "")) {
|
|
191
|
-
editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to },
|
|
215
|
+
editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, linkText(title, url)).run();
|
|
192
216
|
}
|
|
193
217
|
else {
|
|
194
218
|
editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
|
|
195
219
|
}
|
|
196
220
|
}
|
|
197
221
|
else if (title && title !== selectedText) {
|
|
198
|
-
editor.chain().focus().deleteSelection().insertContent(
|
|
222
|
+
editor.chain().focus().deleteSelection().insertContent(linkText(title, url)).run();
|
|
199
223
|
}
|
|
200
224
|
else {
|
|
201
225
|
editor.chain().focus().setLink({ href: url }).run();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"./MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 1\n */\n rows?: number\n className?: string\n id?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n if (evt.key === \"Enter\") {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div className={s.LinkDialogContent} role=\"dialog\" aria-label=\"Link\" onKeyDown={handleKeyDown}>\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 1,\n className,\n id,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(`<a href=\"${url}\">${title || url}</a>`).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, `<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(`<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"@plexui/styles/components/MarkdownEditor/MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 1\n */\n rows?: number\n className?: string\n id?: string\n /** Accessible name for the editor; a `<label for>` cannot name a contenteditable region */\n \"aria-label\"?: string\n /** Id of the element that names the editor, such as a Field label */\n \"aria-labelledby\"?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\n// A link inserted as a text node, not as `<a>` HTML: the markdown parser runs\n// with `html: false`, so HTML would land in the text as written\nconst linkText = (text: string, href: string) => ({\n type: \"text\",\n text,\n marks: [{ type: \"link\", attrs: { href } }],\n})\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLDivElement>) => {\n // Enter in a field saves; on a button it is that button's own click\n if (evt.key === \"Enter\" && evt.target instanceof HTMLInputElement) {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n // The dialog is modal: Tab from the last control wraps to the first, and\n // Shift+Tab from the first to the last\n if (evt.key === \"Tab\") {\n const controls = Array.from(evt.currentTarget.querySelectorAll<HTMLElement>(\"input, button\"))\n const first = controls[0]\n const last = controls[controls.length - 1]\n if (evt.target === (evt.shiftKey ? first : last)) {\n evt.preventDefault()\n ;(evt.shiftKey ? last : first)?.focus()\n }\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div\n className={s.LinkDialogContent}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Link\"\n onKeyDown={handleKeyDown}\n >\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n // Formatting buttons are toggles: announce their on/off state\n aria-pressed={active}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 1,\n className,\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaLabel && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledby && { \"aria-labelledby\": ariaLabelledby }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n // A press in the text places the caret there itself\n if (editor.view.dom.contains(target)) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(linkText(title || url, url)).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, linkText(title, url)).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(linkText(title, url)).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { MarkdownEditor, markdownEditorStyles } from "./MarkdownEditor";
|
|
1
|
+
export { MarkdownEditor, markdownEditorStyles } from "./MarkdownEditor.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -3,14 +3,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { DropdownMenu } from "radix-ui";
|
|
4
4
|
import React, { createContext, useCallback, useContext, useMemo, useRef, useState, } from "react";
|
|
5
5
|
import clsx from "clsx";
|
|
6
|
-
import { useEscCloseStack } from "../../hooks/useEscCloseStack";
|
|
7
|
-
import { useLatestValue } from "../../hooks/useLatestValue";
|
|
8
|
-
import { preventDefaultHandler, toCssVariables } from "../../lib/helpers";
|
|
9
|
-
import { Button } from "../Button";
|
|
10
|
-
import { Check, ChevronRight } from "../Icon";
|
|
11
|
-
import { useLinkComponent } from "../PlexUIProvider/internal";
|
|
12
|
-
import { TransitionGroup } from "../Transition";
|
|
13
|
-
import s from "
|
|
6
|
+
import { useEscCloseStack } from "../../hooks/useEscCloseStack.js";
|
|
7
|
+
import { useLatestValue } from "../../hooks/useLatestValue.js";
|
|
8
|
+
import { preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
|
|
9
|
+
import { Button } from "../Button/index.js";
|
|
10
|
+
import { Check, ChevronRight } from "../Icon/index.js";
|
|
11
|
+
import { useLinkComponent } from "../PlexUIProvider/internal.js";
|
|
12
|
+
import { TransitionGroup } from "../Transition/index.js";
|
|
13
|
+
import s from "@plexui/styles/components/Menu/Menu.module.css";
|
|
14
14
|
const MenuContext = createContext(null);
|
|
15
15
|
const useMenuContext = () => {
|
|
16
16
|
const context = useContext(MenuContext);
|
|
@@ -42,7 +42,7 @@ export const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }) =>
|
|
|
42
42
|
}), [isOpen, handleOpenChange]);
|
|
43
43
|
return (_jsx(MenuContext.Provider, { value: store, children: _jsx(DropdownMenu.Root, { open: isOpen, onOpenChange: handleOpenChange, modal: modal, children: children }) }));
|
|
44
44
|
};
|
|
45
|
-
const Item = ({ className, children, description, disabled, onSelect, onClick }) => {
|
|
45
|
+
const Item = ({ className, children, description, disabled, danger, onSelect, onClick }) => {
|
|
46
46
|
const { open } = useMenuContext();
|
|
47
47
|
// This handler patches over focus races with core Radix primitives
|
|
48
48
|
// https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734
|
|
@@ -55,9 +55,9 @@ const Item = ({ className, children, description, disabled, onSelect, onClick })
|
|
|
55
55
|
// A described item stacks its two lines; without a description the item
|
|
56
56
|
// keeps the plain flex row that icons and ItemActions rely on.
|
|
57
57
|
const content = description === undefined ? (children) : (_jsxs("div", { className: s.ItemLeading, children: [_jsx("div", { children: children }), _jsx("div", { className: s.ItemDescription, children: description })] }));
|
|
58
|
-
// Custom click handlers
|
|
59
|
-
if (onSelect) {
|
|
60
|
-
return (_jsx(DropdownMenu.Item, { className: clsx(s.MenuItem, className), onSelect: onSelect, onClick: onClick, disabled: disabled, onPointerMove: handlePreventAfterClose, onPointerLeave: handlePreventAfterClose, children: _jsx("div", { className: s.PressableInner, children: content }) }));
|
|
58
|
+
// Custom click handlers: either callback makes the item interactive
|
|
59
|
+
if (onSelect || onClick) {
|
|
60
|
+
return (_jsx(DropdownMenu.Item, { className: clsx(s.MenuItem, className), onSelect: onSelect, onClick: onClick, disabled: disabled, "data-danger": danger ? "" : undefined, onPointerMove: handlePreventAfterClose, onPointerLeave: handlePreventAfterClose, children: _jsx("div", { className: s.PressableInner, children: content }) }));
|
|
61
61
|
}
|
|
62
62
|
// Read-only content - will not appear interactive.
|
|
63
63
|
return _jsx("div", { className: clsx(s.MenuItemContent, className), children: content });
|
|
@@ -65,16 +65,16 @@ const Item = ({ className, children, description, disabled, onSelect, onClick })
|
|
|
65
65
|
const ItemActions = ({ className, children }) => {
|
|
66
66
|
return _jsx("div", { className: clsx(s.ItemActions, className), children: children });
|
|
67
67
|
};
|
|
68
|
-
const ItemAction = ({ children, onClick, }) => {
|
|
68
|
+
const ItemAction = ({ children, onClick, "aria-label": ariaLabel, }) => {
|
|
69
69
|
const { setOpen } = useMenuContext();
|
|
70
|
-
return (_jsx(Button, { className: "rounded-sm", color: "secondary", size: "xs", uniform: true, iconSize: "sm", variant: "ghost", onClick: (evt) => {
|
|
70
|
+
return (_jsx(Button, { className: "rounded-sm", color: "secondary", size: "xs", uniform: true, iconSize: "sm", variant: "ghost", "aria-label": ariaLabel, onClick: (evt) => {
|
|
71
71
|
evt.stopPropagation();
|
|
72
72
|
setOpen(false);
|
|
73
73
|
onClick(evt);
|
|
74
74
|
}, children: children }));
|
|
75
75
|
};
|
|
76
76
|
const Link = ((props) => {
|
|
77
|
-
const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props;
|
|
77
|
+
const { className, children, href, to, disabled, danger, as: OverrideComponent, ...restProps } = props;
|
|
78
78
|
const { open } = useMenuContext();
|
|
79
79
|
const propPath = href || to;
|
|
80
80
|
// When a path is not provided, default to an anchor
|
|
@@ -92,7 +92,12 @@ const Link = ((props) => {
|
|
|
92
92
|
const linkProps = isExternal
|
|
93
93
|
? { target: "_blank", rel: "noopener noreferrer", href: href ?? to }
|
|
94
94
|
: { href, to };
|
|
95
|
-
return (_jsx(DropdownMenu.Item, { asChild: true, className: clsx(s.MenuItem, className), disabled: disabled, onPointerMove: isExternal ? undefined : handlePreventAfterClose, onPointerLeave: isExternal ? undefined : handlePreventAfterClose, children: _jsx(Component, { ...linkProps, ...restProps,
|
|
95
|
+
return (_jsx(DropdownMenu.Item, { asChild: true, className: clsx(s.MenuItem, className), disabled: disabled, "data-danger": danger ? "" : undefined, onPointerMove: isExternal ? undefined : handlePreventAfterClose, onPointerLeave: isExternal ? undefined : handlePreventAfterClose, children: _jsx(Component, { ...linkProps, ...restProps, onClick: (event) => {
|
|
96
|
+
restProps.onClick?.(event);
|
|
97
|
+
// Radix skips selecting a disabled item, not the link's navigation
|
|
98
|
+
if (disabled)
|
|
99
|
+
event.preventDefault();
|
|
100
|
+
}, children: _jsx("span", { className: s.PressableInner, children: children }) }) }));
|
|
96
101
|
});
|
|
97
102
|
const Separator = ({ className }) => {
|
|
98
103
|
return _jsx(DropdownMenu.Separator, { className: clsx(s.Separator, className), role: "separator" });
|
|
@@ -112,8 +117,11 @@ const Content = ({ children, side, sideOffset = 5, align, alignOffset, width, mi
|
|
|
112
117
|
"menu-max-height": maxHeight,
|
|
113
118
|
}), children: children }, "dropdown")) }) }));
|
|
114
119
|
};
|
|
115
|
-
const Trigger = ({ children, disabled }) => {
|
|
116
|
-
|
|
120
|
+
const Trigger = ({ children, disabled, ...restProps }) => {
|
|
121
|
+
// Always composes onto the child (asChild after the spread wins over a
|
|
122
|
+
// caller's asChild); other props (aria-*, handlers, ref) reach it through
|
|
123
|
+
// the Slot instead of being dropped
|
|
124
|
+
return (_jsx(DropdownMenu.Trigger, { ...restProps, asChild: true, disabled: disabled, children: children }));
|
|
117
125
|
};
|
|
118
126
|
const SubmenuContext = createContext(null);
|
|
119
127
|
const useSubmenuContext = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /**\n * Second line under the item's label: what this action does, or which\n * value it carries. The label goes semibold on its own, the same way a\n * Select option with a description does — same pattern, same anatomy.\n */\n description?: ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n}\n\nconst Item = ({ className, children, description, disabled, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // A described item stacks its two lines; without a description the item\n // keeps the plain flex row that icons and ItemActions rely on.\n const content =\n description === undefined ? (\n children\n ) : (\n <div className={s.ItemLeading}>\n <div>{children}</div>\n <div className={s.ItemDescription}>{description}</div>\n </div>\n )\n\n // Custom click handlers\n if (onSelect) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{content}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{content}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component {...linkProps} {...restProps}>\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\n\nconst Label = ({ className, children }: { className?: string; children: ReactNode }) => {\n return (\n <DropdownMenu.Label className={clsx(s.MenuLabel, className)}>\n {children}\n </DropdownMenu.Label>\n )\n}\n\nconst Group = ({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) => {\n return <DropdownMenu.Group className={className}>{children}</DropdownMenu.Group>\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n /**\n * Layout direction of menu items.\n * Use `\"horizontal\"` for icon-based toolbars (iOS-style).\n * @default \"vertical\"\n */\n layout?: \"vertical\" | \"horizontal\"\n /**\n * Size of horizontal menu items. Controls icon size and padding.\n * Only applies when `layout=\"horizontal\"`.\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\"\n /**\n * Event handler called when auto-focus tries to return to the trigger\n * after the menu closes. Call `event.preventDefault()` to prevent the\n * trigger from regaining focus (and its focus-visible ring).\n */\n onCloseAutoFocus?: DropdownMenu.DropdownMenuContentProps[\"onCloseAutoFocus\"]\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n layout = \"vertical\",\n size,\n onCloseAutoFocus,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n const isHorizontal = layout === \"horizontal\"\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n onCloseAutoFocus={onCloseAutoFocus}\n data-layout={isHorizontal ? \"horizontal\" : undefined}\n data-size={isHorizontal && size ? size : undefined}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": isHorizontal ? \"auto\" : minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({ children, disabled }: DropdownMenu.DropdownMenuTriggerProps) => {\n return (\n <DropdownMenu.Trigger asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\nMenu.Label = Label\nMenu.Group = Group\n"]}
|
|
1
|
+
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DropdownMenu } from \"radix-ui\"\nimport React, {\n type ComponentProps,\n type ComponentType,\n createContext,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport clsx from \"clsx\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { Check, ChevronRight } from \"../Icon\"\nimport { useLinkComponent } from \"../PlexUIProvider/internal\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"@plexui/styles/components/Menu/Menu.module.css\"\n\ntype MenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nconst useMenuContext = () => {\n const context = useContext(MenuContext)\n\n if (!context) {\n throw new Error(\"Menu components must be wrapped in <Menu />\")\n }\n\n return context\n}\n\nexport type MenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n /**\n * When set to `true`, interaction with outside elements will be disabled and only menu content will be visible to screen readers.\n * @default false\n */\n modal?: boolean\n}\n\nexport const Menu = ({ children, forceOpen, onOpen, onClose, modal = false }: MenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n const store = useMemo<MenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <MenuContext.Provider value={store}>\n <DropdownMenu.Root open={isOpen} onOpenChange={handleOpenChange} modal={modal}>\n {children}\n </DropdownMenu.Root>\n </MenuContext.Provider>\n )\n}\n\nexport type MenuItemProps = {\n className?: string\n children: React.ReactNode\n /**\n * Second line under the item's label: what this action does, or which\n * value it carries. The label goes semibold on its own, the same way a\n * Select option with a description does — same pattern, same anatomy.\n */\n description?: ReactNode\n /** Callback triggered when the item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Callback triggered when the item is clicked */\n onClick?: DropdownMenu.DropdownMenuItemProps[\"onClick\"]\n /** Disables the menu item */\n disabled?: boolean\n /** Marks a destructive action (delete, remove, leave): the item is drawn in the danger color */\n danger?: boolean\n}\n\nconst Item = ({ className, children, description, disabled, danger, onSelect, onClick }: MenuItemProps) => {\n const { open } = useMenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n // A described item stacks its two lines; without a description the item\n // keeps the plain flex row that icons and ItemActions rely on.\n const content =\n description === undefined ? (\n children\n ) : (\n <div className={s.ItemLeading}>\n <div>{children}</div>\n <div className={s.ItemDescription}>{description}</div>\n </div>\n )\n\n // Custom click handlers: either callback makes the item interactive\n if (onSelect || onClick) {\n return (\n <DropdownMenu.Item\n className={clsx(s.MenuItem, className)}\n onSelect={onSelect}\n onClick={onClick}\n disabled={disabled}\n data-danger={danger ? \"\" : undefined}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>{content}</div>\n </DropdownMenu.Item>\n )\n }\n\n // Read-only content - will not appear interactive.\n return <div className={clsx(s.MenuItemContent, className)}>{content}</div>\n}\n\nconst ItemActions = ({ className, children }: { className?: string; children: ReactNode }) => {\n return <div className={clsx(s.ItemActions, className)}>{children}</div>\n}\n\nconst ItemAction = ({\n children,\n onClick,\n \"aria-label\": ariaLabel,\n}: {\n children: ReactNode\n onClick: (evt: MouseEvent) => void\n /** Accessible name; the action is an icon-only button */\n \"aria-label\"?: string\n}) => {\n const { setOpen } = useMenuContext()\n\n return (\n <Button\n className=\"rounded-sm\"\n color=\"secondary\"\n size=\"xs\"\n uniform\n iconSize=\"sm\"\n variant=\"ghost\"\n aria-label={ariaLabel}\n onClick={(evt) => {\n evt.stopPropagation()\n setOpen(false)\n onClick(evt)\n }}\n >\n {children}\n </Button>\n )\n}\n\ntype MenuLinkProps = Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n /** Content rendered inside the Link */\n children: React.ReactNode\n /** Disables the menu item */\n disabled?: boolean\n /** Marks a destructive destination: the item is drawn in the danger color */\n danger?: boolean\n}\n\ntype MenuLink = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends ComponentType<any> | \"a\" = PlexUI.LinkComponent,\n>(\n props: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n MenuLinkProps & {\n /**\n * Override the default component used for the link. This is useful for\n * using a routing library, or SSR rendering.\n * purposes.\n *\n * @default 'a'\n */\n as?: T\n } & ComponentProps<T>,\n) => ReactNode\n\nconst Link = ((\n props: MenuLinkProps & { href?: string; to?: string; as?: PlexUI.LinkComponent },\n) => {\n const { className, children, href, to, disabled, danger, as: OverrideComponent, ...restProps } = props\n const { open } = useMenuContext()\n\n const propPath = href || to\n // When a path is not provided, default to an anchor\n const isExternal = propPath ? /^https?:\\/\\//.test(propPath) : true\n const DefaultComponent = useLinkComponent()\n const Component = OverrideComponent || (isExternal ? \"a\" : DefaultComponent)\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we're always known to be closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n const linkProps = isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\", href: href ?? to }\n : { href, to }\n\n return (\n <DropdownMenu.Item\n asChild\n className={clsx(s.MenuItem, className)}\n disabled={disabled}\n data-danger={danger ? \"\" : undefined}\n onPointerMove={isExternal ? undefined : handlePreventAfterClose}\n onPointerLeave={isExternal ? undefined : handlePreventAfterClose}\n >\n <Component\n {...linkProps}\n {...restProps}\n onClick={(event: React.MouseEvent<HTMLAnchorElement>) => {\n restProps.onClick?.(event)\n // Radix skips selecting a disabled item, not the link's navigation\n if (disabled) event.preventDefault()\n }}\n >\n <span className={s.PressableInner}>{children}</span>\n </Component>\n </DropdownMenu.Item>\n )\n}) as MenuLink\n\nconst Separator = ({ className }: { className?: string }) => {\n return <DropdownMenu.Separator className={clsx(s.Separator, className)} role=\"separator\" />\n}\n\n\nconst Label = ({ className, children }: { className?: string; children: ReactNode }) => {\n return (\n <DropdownMenu.Label className={clsx(s.MenuLabel, className)}>\n {children}\n </DropdownMenu.Label>\n )\n}\n\nconst Group = ({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) => {\n return <DropdownMenu.Group className={className}>{children}</DropdownMenu.Group>\n}\n\nexport type MenuContentProps = {\n children: React.ReactNode\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: DropdownMenu.DropdownMenuContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 5\n */\n sideOffset?: DropdownMenu.DropdownMenuContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: DropdownMenu.DropdownMenuContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: DropdownMenu.DropdownMenuContentProps[\"alignOffset\"]\n /**\n * Defines the `width` property of the content\n * @default auto\n */\n width?: number | \"auto\"\n /**\n * Defines the `min-width` property of the content, in pixels.\n * @default 300\n */\n minWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the content, in pixels.\n */\n maxHeight?: number\n /**\n * Layout direction of menu items.\n * Use `\"horizontal\"` for icon-based toolbars (iOS-style).\n * @default \"vertical\"\n */\n layout?: \"vertical\" | \"horizontal\"\n /**\n * Size of horizontal menu items. Controls icon size and padding.\n * Only applies when `layout=\"horizontal\"`.\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\"\n /**\n * Event handler called when auto-focus tries to return to the trigger\n * after the menu closes. Call `event.preventDefault()` to prevent the\n * trigger from regaining focus (and its focus-visible ring).\n */\n onCloseAutoFocus?: DropdownMenu.DropdownMenuContentProps[\"onCloseAutoFocus\"]\n}\n\nconst Content = ({\n children,\n side,\n sideOffset = 5,\n align,\n alignOffset,\n width,\n minWidth,\n maxHeight,\n layout = \"vertical\",\n size,\n onCloseAutoFocus,\n}: MenuContentProps) => {\n const { open } = useMenuContext()\n const isHorizontal = layout === \"horizontal\"\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.Content\n key=\"dropdown\"\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n onCloseAutoFocus={onCloseAutoFocus}\n data-layout={isHorizontal ? \"horizontal\" : undefined}\n data-size={isHorizontal && size ? size : undefined}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": isHorizontal ? \"auto\" : minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.Content>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nconst Trigger = ({\n children,\n disabled,\n ...restProps\n}: DropdownMenu.DropdownMenuTriggerProps & { ref?: React.Ref<HTMLButtonElement> }) => {\n // Always composes onto the child (asChild after the spread wins over a\n // caller's asChild); other props (aria-*, handlers, ref) reach it through\n // the Slot instead of being dropped\n return (\n <DropdownMenu.Trigger {...restProps} asChild disabled={disabled}>\n {children}\n </DropdownMenu.Trigger>\n )\n}\n\ntype SubmenuContextValue = {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst SubmenuContext = createContext<SubmenuContextValue | null>(null)\n\nconst useSubmenuContext = () => {\n const context = useContext(SubmenuContext)\n\n if (!context) {\n throw new Error(\"Submenu components must be wrapped in <Sub />\")\n }\n\n return context\n}\n\nexport type SubmenuProps = {\n children: React.ReactNode\n /** Force the menu to remain open or closed */\n forceOpen?: boolean\n /** Callback triggered when the modal is opened */\n onOpen?: () => void\n /** Callback triggered when the modal is closed */\n onClose?: () => void\n}\n\nconst Sub = ({ children, forceOpen, onOpen, onClose }: SubmenuProps) => {\n const [open, setOpen] = useState<boolean>(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const isOpen = forceOpen ?? open\n\n const latestOnOpen = useLatestValue(onOpen)\n const latestOnClose = useLatestValue(onClose)\n\n const handleOpenChange = useCallback(\n (nextState: boolean) => {\n setOpen(nextState)\n if (nextState) {\n latestOnOpen.current?.()\n } else {\n latestOnClose.current?.()\n }\n },\n [latestOnOpen, latestOnClose],\n )\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n // Ensure trigger is focused\n triggerRef.current?.focus()\n })\n\n const store = useMemo<SubmenuContextValue>(\n () => ({\n open: isOpen,\n setOpen: handleOpenChange,\n triggerRef,\n }),\n [isOpen, handleOpenChange],\n )\n\n return (\n <SubmenuContext.Provider value={store}>\n <DropdownMenu.Sub open={isOpen} onOpenChange={handleOpenChange}>\n {children}\n </DropdownMenu.Sub>\n </SubmenuContext.Provider>\n )\n}\n\nconst SubTrigger = ({\n className,\n children,\n disabled,\n}: {\n className?: string\n children: ReactNode\n disabled?: boolean\n}) => {\n const { open } = useMenuContext()\n const { triggerRef } = useSubmenuContext()\n\n // This handler patches over focus races with core Radix primitives\n // https://github.com/radix-ui/primitives/blob/main/packages/react/menu/src/Menu.tsx#L712-L734\n const handlePreventAfterClose = (evt: React.PointerEvent<HTMLDivElement>) => {\n // Prevent default behavior when we know the outer menu is closing\n if (!open) {\n evt.preventDefault()\n }\n }\n\n return (\n <DropdownMenu.SubTrigger\n ref={triggerRef}\n className={clsx(s.MenuItem, s.SubMenuItem, className)}\n disabled={disabled}\n onPointerMove={handlePreventAfterClose}\n onPointerLeave={handlePreventAfterClose}\n >\n <div className={s.PressableInner}>\n {children}\n <ChevronRight width=\"16\" height=\"16\" className={s.SubTriggerIcon} />\n </div>\n </DropdownMenu.SubTrigger>\n )\n}\n\ntype SubContentProps = {\n children: ReactNode\n sideOffset?: DropdownMenu.DropdownMenuSubContentProps[\"sideOffset\"]\n alignOffset?: DropdownMenu.DropdownMenuSubContentProps[\"alignOffset\"]\n width?: number | \"auto\"\n minWidth?: number | \"auto\"\n maxHeight?: number\n}\n\nconst SubContent = ({\n children,\n sideOffset = 4,\n alignOffset = -6,\n width = \"auto\",\n minWidth = \"auto\",\n maxHeight,\n}: SubContentProps) => {\n const { open } = useSubmenuContext()\n\n return (\n <DropdownMenu.Portal forceMount>\n <TransitionGroup className={s.Menu} enterDuration={350} exitDuration={200} disableAnimations>\n {open && (\n <DropdownMenu.SubContent\n key=\"submenu\"\n className={s.MenuList}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n avoidCollisions\n collisionPadding={{ bottom: 30, top: 30, left: 12, right: 12 }}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"menu-width\": width,\n \"menu-min-width\": minWidth,\n \"menu-max-height\": maxHeight,\n })}\n >\n {children}\n </DropdownMenu.SubContent>\n )}\n </TransitionGroup>\n </DropdownMenu.Portal>\n )\n}\n\nexport type MenuRadioGroupProps<T extends string> = {\n /** Controlled value */\n value: T\n /** Fired when selection changes */\n onChange: (value: T) => void\n children: ReactNode\n /**\n * The orientation of the indicator within the radio item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n}\n\nconst RadioGroup = <T extends string>({\n children,\n value,\n onChange,\n indicatorPosition = \"end\",\n ...props\n}: MenuRadioGroupProps<T>) => (\n <DropdownMenu.RadioGroup\n {...props}\n value={value}\n onValueChange={(v: string) => onChange(v as T)}\n data-indicator-position={indicatorPosition}\n >\n {children}\n </DropdownMenu.RadioGroup>\n)\n\nexport type MenuRadioItemProps<T extends string> = {\n value: T\n /** Class applied to the radio item */\n className?: string\n children: ReactNode\n /** Callback triggered when the radio item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the radio item */\n disabled?: boolean\n}\n\nconst RadioItem = <T extends string>({ className, children, ...props }: MenuRadioItemProps<T>) => (\n <DropdownMenu.RadioItem className={clsx(s.MenuItem, s.RadioItem, className)} {...props}>\n <div className={s.PressableInner}>\n <div className={s.RadioIndicator}>\n <DropdownMenu.ItemIndicator className={s.RadioIndicatorActive} />\n </div>\n {children}\n </div>\n </DropdownMenu.RadioItem>\n)\n\nexport type MenuCheckboxItemProps = {\n /** Controlled checked state of the checkbox item */\n checked?: DropdownMenu.DropdownMenuCheckboxItemProps[\"checked\"]\n /** Event handler called when the checked state changes */\n onCheckedChange?: DropdownMenu.DropdownMenuCheckboxItemProps[\"onCheckedChange\"]\n /** Class applied to the checkbox item */\n className?: string\n children: ReactNode\n /** Callback triggered when the checkbox item is pressed */\n onSelect?: DropdownMenu.DropdownMenuItemProps[\"onSelect\"]\n /** Disables the checkbox item */\n disabled?: boolean\n /**\n * The orientation of the indicator within the checkbox item.\n * @default end\n */\n indicatorPosition?: \"start\" | \"end\"\n /**\n * Visual treatment for the checkbox indicator.\n * @default solid\n */\n indicatorVariant?: \"solid\" | \"ghost\"\n}\nconst CheckboxItem = ({\n className,\n children,\n indicatorPosition = \"end\",\n indicatorVariant = \"solid\",\n ...props\n}: MenuCheckboxItemProps) => (\n <DropdownMenu.CheckboxItem\n className={clsx(s.MenuItem, s.CheckboxItem, className)}\n {...props}\n data-indicator-position={indicatorPosition}\n data-indicator-variant={indicatorVariant}\n >\n <div className={s.PressableInner}>\n <div className={s.CheckboxIndicator}>\n <DropdownMenu.ItemIndicator>\n {indicatorVariant === \"ghost\" ? (\n <Check className=\"size-4\" />\n ) : (\n <div className={s.CheckboxCircle}>\n <Check className=\"size-4\" />\n </div>\n )}\n </DropdownMenu.ItemIndicator>\n </div>\n {children}\n </div>\n </DropdownMenu.CheckboxItem>\n)\n\nMenu.Content = Content\nMenu.Item = Item\nMenu.ItemActions = ItemActions\nMenu.ItemAction = ItemAction\nMenu.Link = Link\nMenu.Separator = Separator\nMenu.Trigger = Trigger\nMenu.Sub = Sub\nMenu.SubTrigger = SubTrigger\nMenu.SubContent = SubContent\nMenu.CheckboxItem = CheckboxItem\nMenu.RadioGroup = RadioGroup\nMenu.RadioItem = RadioItem\nMenu.Label = Label\nMenu.Group = Group\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Menu } from "./Menu";
|
|
1
|
+
export { Menu } from "./Menu.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|