@lobehub/ui 5.51.2 → 5.52.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/es/Accordion/Accordion.mjs +1 -1
- package/es/Accordion/Accordion.mjs.map +1 -1
- package/es/ActionIconGroup/type.d.mts +2 -1
- package/es/Alert/Alert.mjs +1 -1
- package/es/AutoComplete/Select.mjs +1 -1
- package/es/Avatar/Avatar.mjs +2 -2
- package/es/Burger/Burger.mjs +2 -2
- package/es/Burger/Burger.mjs.map +1 -1
- package/es/Button/Button.mjs +1 -1
- package/es/CodeDiff/DiffPanel.mjs +1 -1
- package/es/CodeDiff/DiffPanel.mjs.map +1 -1
- package/es/Collapse/Collapse.mjs +1 -1
- package/es/ColorSwatches/ColorSwatches.mjs +21 -21
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/ColorSwatches/style.mjs +3 -12
- package/es/ColorSwatches/style.mjs.map +1 -1
- package/es/DatePicker/DatePicker.mjs +1 -1
- package/es/DraggablePanel/DraggablePanel.mjs +1 -1
- package/es/Drawer/Drawer.mjs +1 -1
- package/es/EditableText/ControlInput.d.mts +2 -2
- package/es/EditableText/ControlInput.mjs +1 -1
- package/es/EditableText/ControlInput.mjs.map +1 -1
- package/es/EditableText/EditableText.mjs +1 -0
- package/es/EditableText/EditableText.mjs.map +1 -1
- package/es/EditableText/type.d.mts +5 -1
- package/es/EmojiPicker/AvatarUploader.mjs +76 -71
- package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.mjs +12 -6
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/EmojiPicker/style.mjs +32 -9
- package/es/EmojiPicker/style.mjs.map +1 -1
- package/es/EmojiPicker/type.d.mts +2 -1
- package/es/Form/Form.mjs +1 -1
- package/es/Form/components/FormDivider.mjs +1 -1
- package/es/Form/components/FormItem.mjs +1 -1
- package/es/Form/components/FormSubmitFooter.mjs +1 -1
- package/es/Form/components/FormTitle.mjs +1 -1
- package/es/GroupAvatar/GroupAvatar.mjs +1 -1
- package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
- package/es/GroupAvatar/type.d.mts +2 -1
- package/es/Highlighter/Highlighter.mjs +1 -1
- package/es/Highlighter/Highlighter.mjs.map +1 -1
- package/es/Highlighter/LangSelect.mjs +23 -13
- package/es/Highlighter/LangSelect.mjs.map +1 -1
- package/es/Highlighter/style.mjs +1 -1
- package/es/Highlighter/style.mjs.map +1 -1
- package/es/HtmlPreview/HtmlPreview.mjs +28 -1
- package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
- package/es/Image/viewer/ImageViewer.mjs +1 -1
- package/es/Image/viewer/ImageViewer.mjs.map +1 -1
- package/es/Image/viewer/Toolbar.mjs +1 -1
- package/es/Input/Input.mjs +1 -1
- package/es/Input/InputNumber.mjs +1 -1
- package/es/Input/InputOPT.mjs +1 -1
- package/es/Input/InputPassword.mjs +1 -1
- package/es/Input/TextArea.mjs +1 -1
- package/es/Menu/Menu.mjs +1 -1
- package/es/Menu/index.d.mts +2 -1
- package/es/Menu/index.mjs +1 -1
- package/es/Menu/itemInterface.d.mts +71 -0
- package/es/Menu/type.d.mts +8 -8
- package/es/Mermaid/Mermaid.mjs +1 -1
- package/es/Mermaid/Mermaid.mjs.map +1 -1
- package/es/Modal/Modal.mjs +1 -1
- package/es/SearchBar/SearchBar.mjs +1 -1
- package/es/SearchBar/SearchBar.mjs.map +1 -1
- package/es/SearchBar/type.d.mts +2 -2
- package/es/Segmented/Segmented.mjs +1 -1
- package/es/Select/Select.mjs +1 -1
- package/es/SliderWithInput/SliderWithInput.mjs +1 -1
- package/es/Tabs/Tabs.mjs +1 -1
- package/es/Tag/Tag.mjs +1 -1
- package/es/ThemeProvider/ConfigProvider.mjs +1 -1
- package/es/ThemeProvider/ThemeProvider.mjs +1 -1
- package/es/ThemeSwitch/ThemeSwitch.mjs +1 -1
- package/es/Toc/Toc.mjs +1 -1
- package/es/Toc/TocMobile.mjs +1 -1
- package/es/awesome/AgentSkillCard/AgentSkillCard.mjs +1 -1
- package/es/awesome/Hero/Hero.mjs +1 -1
- package/es/awesome/LandingSection/LandingSection.mjs +1 -1
- package/es/base-ui/Anchor/Anchor.d.mts +6 -0
- package/es/base-ui/Anchor/Anchor.mjs +141 -0
- package/es/base-ui/Anchor/Anchor.mjs.map +1 -0
- package/es/base-ui/Anchor/index.d.mts +3 -0
- package/es/base-ui/Anchor/style.mjs +80 -0
- package/es/base-ui/Anchor/style.mjs.map +1 -0
- package/es/base-ui/Anchor/type.d.mts +20 -0
- package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
- package/es/base-ui/Avatar/Avatar.mjs +1 -1
- package/es/base-ui/Breadcrumb/Breadcrumb.d.mts +6 -0
- package/es/base-ui/Breadcrumb/Breadcrumb.mjs +58 -0
- package/es/base-ui/Breadcrumb/Breadcrumb.mjs.map +1 -0
- package/es/base-ui/Breadcrumb/index.d.mts +3 -0
- package/es/base-ui/Breadcrumb/style.mjs +65 -0
- package/es/base-ui/Breadcrumb/style.mjs.map +1 -0
- package/es/base-ui/Breadcrumb/type.d.mts +24 -0
- package/es/base-ui/Burger/Burger.d.mts +6 -0
- package/es/base-ui/Burger/Burger.mjs +69 -0
- package/es/base-ui/Burger/Burger.mjs.map +1 -0
- package/es/base-ui/Burger/index.d.mts +3 -0
- package/es/base-ui/Burger/style.mjs +63 -0
- package/es/base-ui/Burger/style.mjs.map +1 -0
- package/es/base-ui/Burger/type.d.mts +23 -0
- package/es/base-ui/Carousel/Carousel.d.mts +6 -0
- package/es/base-ui/Carousel/Carousel.mjs +157 -0
- package/es/base-ui/Carousel/Carousel.mjs.map +1 -0
- package/es/base-ui/Carousel/index.d.mts +3 -0
- package/es/base-ui/Carousel/style.mjs +88 -0
- package/es/base-ui/Carousel/style.mjs.map +1 -0
- package/es/base-ui/Carousel/type.d.mts +23 -0
- package/es/base-ui/ColorPicker/ColorPicker.d.mts +6 -0
- package/es/base-ui/ColorPicker/ColorPicker.mjs +227 -0
- package/es/base-ui/ColorPicker/ColorPicker.mjs.map +1 -0
- package/es/base-ui/ColorPicker/SaturationArea.mjs +64 -0
- package/es/base-ui/ColorPicker/SaturationArea.mjs.map +1 -0
- package/es/base-ui/ColorPicker/color.mjs +28 -0
- package/es/base-ui/ColorPicker/color.mjs.map +1 -0
- package/es/base-ui/ColorPicker/index.d.mts +3 -0
- package/es/base-ui/ColorPicker/style.mjs +180 -0
- package/es/base-ui/ColorPicker/style.mjs.map +1 -0
- package/es/base-ui/ColorPicker/type.d.mts +20 -0
- package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
- package/es/base-ui/ContextMenu/renderItems.d.mts +0 -1
- package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/DatePicker/CalendarPanel.mjs +188 -0
- package/es/base-ui/DatePicker/CalendarPanel.mjs.map +1 -0
- package/es/base-ui/DatePicker/DatePicker.d.mts +6 -0
- package/es/base-ui/DatePicker/DatePicker.mjs +88 -0
- package/es/base-ui/DatePicker/DatePicker.mjs.map +1 -0
- package/es/base-ui/DatePicker/DateRangePicker.d.mts +6 -0
- package/es/base-ui/DatePicker/DateRangePicker.mjs +128 -0
- package/es/base-ui/DatePicker/DateRangePicker.mjs.map +1 -0
- package/es/base-ui/DatePicker/PickerShell.mjs +43 -0
- package/es/base-ui/DatePicker/PickerShell.mjs.map +1 -0
- package/es/base-ui/DatePicker/calendar.d.mts +5 -0
- package/es/base-ui/DatePicker/calendar.mjs +46 -0
- package/es/base-ui/DatePicker/calendar.mjs.map +1 -0
- package/es/base-ui/DatePicker/index.d.mts +5 -0
- package/es/base-ui/DatePicker/style.mjs +193 -0
- package/es/base-ui/DatePicker/style.mjs.map +1 -0
- package/es/base-ui/DatePicker/type.d.mts +35 -0
- package/es/base-ui/Descriptions/Descriptions.d.mts +6 -0
- package/es/base-ui/Descriptions/Descriptions.mjs +62 -0
- package/es/base-ui/Descriptions/Descriptions.mjs.map +1 -0
- package/es/base-ui/Descriptions/index.d.mts +3 -0
- package/es/base-ui/Descriptions/style.mjs +64 -0
- package/es/base-ui/Descriptions/style.mjs.map +1 -0
- package/es/base-ui/Descriptions/type.d.mts +28 -0
- package/es/base-ui/Divider/Divider.d.mts +6 -0
- package/es/base-ui/Divider/Divider.mjs +30 -0
- package/es/base-ui/Divider/Divider.mjs.map +1 -0
- package/es/base-ui/Divider/index.d.mts +3 -0
- package/es/base-ui/Divider/style.mjs +59 -0
- package/es/base-ui/Divider/style.mjs.map +1 -0
- package/es/base-ui/Divider/type.d.mts +12 -0
- package/es/base-ui/Drawer/atoms.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/atoms.mjs +1 -1
- package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/renderItems.d.mts +0 -1
- package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/Form/components/FormTitle.mjs +1 -1
- package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
- package/es/base-ui/Form/type.d.mts +2 -2
- package/es/base-ui/Input/ClearButton.mjs +32 -0
- package/es/base-ui/Input/ClearButton.mjs.map +1 -0
- package/es/base-ui/Input/Input.mjs +30 -4
- package/es/base-ui/Input/Input.mjs.map +1 -1
- package/es/base-ui/Input/InputNumber.mjs +43 -22
- package/es/base-ui/Input/InputNumber.mjs.map +1 -1
- package/es/base-ui/Input/TextArea.mjs +50 -13
- package/es/base-ui/Input/TextArea.mjs.map +1 -1
- package/es/base-ui/Input/clearNativeValue.mjs +12 -0
- package/es/base-ui/Input/clearNativeValue.mjs.map +1 -0
- package/es/base-ui/Input/pressEnter.mjs +6 -0
- package/es/base-ui/Input/pressEnter.mjs.map +1 -0
- package/es/base-ui/Input/style.d.mts +5 -1
- package/es/base-ui/Input/style.mjs +67 -4
- package/es/base-ui/Input/style.mjs.map +1 -1
- package/es/base-ui/Input/type.d.mts +13 -2
- package/es/base-ui/List/List.d.mts +6 -0
- package/es/base-ui/List/List.mjs +50 -0
- package/es/base-ui/List/List.mjs.map +1 -0
- package/es/base-ui/List/ListRow.mjs +74 -0
- package/es/base-ui/List/ListRow.mjs.map +1 -0
- package/es/base-ui/List/index.d.mts +3 -0
- package/es/base-ui/List/style.mjs +146 -0
- package/es/base-ui/List/style.mjs.map +1 -0
- package/es/base-ui/List/type.d.mts +48 -0
- package/es/base-ui/Modal/atoms.mjs.map +1 -1
- package/es/base-ui/Modal/imperative.mjs +1 -1
- package/es/base-ui/Modal/imperative.mjs.map +1 -1
- package/es/base-ui/Modal/type.d.mts +1 -0
- package/es/base-ui/Popover/PopoverPortal.mjs.map +1 -1
- package/es/base-ui/Progress/Progress.mjs +16 -14
- package/es/base-ui/Progress/Progress.mjs.map +1 -1
- package/es/base-ui/Progress/style.mjs +16 -25
- package/es/base-ui/Progress/style.mjs.map +1 -1
- package/es/base-ui/QRCode/QRCode.d.mts +6 -0
- package/es/base-ui/QRCode/QRCode.mjs +105 -0
- package/es/base-ui/QRCode/QRCode.mjs.map +1 -0
- package/es/base-ui/QRCode/index.d.mts +3 -0
- package/es/base-ui/QRCode/qrPath.mjs +16 -0
- package/es/base-ui/QRCode/qrPath.mjs.map +1 -0
- package/es/base-ui/QRCode/style.mjs +52 -0
- package/es/base-ui/QRCode/style.mjs.map +1 -0
- package/es/base-ui/QRCode/type.d.mts +19 -0
- package/es/base-ui/Rate/Rate.d.mts +6 -0
- package/es/base-ui/Rate/Rate.mjs +111 -0
- package/es/base-ui/Rate/Rate.mjs.map +1 -0
- package/es/base-ui/Rate/index.d.mts +3 -0
- package/es/base-ui/Rate/style.mjs +81 -0
- package/es/base-ui/Rate/style.mjs.map +1 -0
- package/es/base-ui/Rate/type.d.mts +19 -0
- package/es/base-ui/Select/atoms.mjs.map +1 -1
- package/es/base-ui/Select/hooks.mjs.map +1 -1
- package/es/base-ui/Statistic/Statistic.d.mts +6 -0
- package/es/base-ui/Statistic/Statistic.mjs +42 -0
- package/es/base-ui/Statistic/Statistic.mjs.map +1 -0
- package/es/base-ui/Statistic/formatValue.d.mts +5 -0
- package/es/base-ui/Statistic/formatValue.mjs +23 -0
- package/es/base-ui/Statistic/formatValue.mjs.map +1 -0
- package/es/base-ui/Statistic/index.d.mts +4 -0
- package/es/base-ui/Statistic/style.mjs +34 -0
- package/es/base-ui/Statistic/style.mjs.map +1 -0
- package/es/base-ui/Statistic/type.d.mts +23 -0
- package/es/base-ui/Steps/Steps.d.mts +6 -0
- package/es/base-ui/Steps/Steps.mjs +74 -0
- package/es/base-ui/Steps/Steps.mjs.map +1 -0
- package/es/base-ui/Steps/index.d.mts +3 -0
- package/es/base-ui/Steps/style.mjs +155 -0
- package/es/base-ui/Steps/style.mjs.map +1 -0
- package/es/base-ui/Steps/type.d.mts +32 -0
- package/es/base-ui/Table/FilterMenu.mjs +45 -0
- package/es/base-ui/Table/FilterMenu.mjs.map +1 -0
- package/es/base-ui/Table/Table.d.mts +10 -0
- package/es/base-ui/Table/Table.mjs +134 -0
- package/es/base-ui/Table/Table.mjs.map +1 -0
- package/es/base-ui/Table/TableBody.mjs +59 -0
- package/es/base-ui/Table/TableBody.mjs.map +1 -0
- package/es/base-ui/Table/TableHead.mjs +50 -0
- package/es/base-ui/Table/TableHead.mjs.map +1 -0
- package/es/base-ui/Table/features.mjs +12 -0
- package/es/base-ui/Table/features.mjs.map +1 -0
- package/es/base-ui/Table/fixedOffsets.mjs +29 -0
- package/es/base-ui/Table/fixedOffsets.mjs.map +1 -0
- package/es/base-ui/Table/index.d.mts +3 -0
- package/es/base-ui/Table/style.mjs +168 -0
- package/es/base-ui/Table/style.mjs.map +1 -0
- package/es/base-ui/Table/toColumnDefs.mjs +26 -0
- package/es/base-ui/Table/toColumnDefs.mjs.map +1 -0
- package/es/base-ui/Table/type.d.mts +68 -0
- package/es/base-ui/Table/useTableState.mjs +99 -0
- package/es/base-ui/Table/useTableState.mjs.map +1 -0
- package/es/base-ui/Toast/imperative.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
- package/es/base-ui/index.d.mts +66 -21
- package/es/base-ui/index.mjs +42 -26
- package/es/base-ui/panelStyles.mjs +95 -0
- package/es/base-ui/panelStyles.mjs.map +1 -0
- package/es/chat/ChatList/components/HistoryDivider.mjs +9 -6
- package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
- package/es/chat/MessageModal/MessageModal.mjs +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +1 -1
- package/es/color/CssVar/VarRow.mjs +1 -1
- package/es/color/CssVar/index.mjs +1 -1
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs +1 -1
- package/es/i18n/resources/en/burger.d.mts +8 -0
- package/es/i18n/resources/en/burger.mjs +9 -0
- package/es/i18n/resources/en/burger.mjs.map +1 -0
- package/es/i18n/resources/en/colorPicker.d.mts +12 -0
- package/es/i18n/resources/en/colorPicker.mjs +13 -0
- package/es/i18n/resources/en/colorPicker.mjs.map +1 -0
- package/es/i18n/resources/en/common.d.mts +1 -0
- package/es/i18n/resources/en/common.mjs +1 -0
- package/es/i18n/resources/en/common.mjs.map +1 -1
- package/es/i18n/resources/en/datePicker.d.mts +13 -0
- package/es/i18n/resources/en/datePicker.mjs +14 -0
- package/es/i18n/resources/en/datePicker.mjs.map +1 -0
- package/es/i18n/resources/en/index.d.mts +15 -11
- package/es/i18n/resources/en/index.mjs +9 -1
- package/es/i18n/resources/en/index.mjs.map +1 -1
- package/es/i18n/resources/en/qrCode.d.mts +9 -0
- package/es/i18n/resources/en/qrCode.mjs +10 -0
- package/es/i18n/resources/en/qrCode.mjs.map +1 -0
- package/es/i18n/resources/zhCn/burger.d.mts +8 -0
- package/es/i18n/resources/zhCn/burger.mjs +9 -0
- package/es/i18n/resources/zhCn/burger.mjs.map +1 -0
- package/es/i18n/resources/zhCn/colorPicker.d.mts +12 -0
- package/es/i18n/resources/zhCn/colorPicker.mjs +13 -0
- package/es/i18n/resources/zhCn/colorPicker.mjs.map +1 -0
- package/es/i18n/resources/zhCn/common.d.mts +1 -0
- package/es/i18n/resources/zhCn/common.mjs +1 -0
- package/es/i18n/resources/zhCn/common.mjs.map +1 -1
- package/es/i18n/resources/zhCn/datePicker.d.mts +13 -0
- package/es/i18n/resources/zhCn/datePicker.mjs +14 -0
- package/es/i18n/resources/zhCn/datePicker.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +15 -11
- package/es/i18n/resources/zhCn/index.mjs +9 -1
- package/es/i18n/resources/zhCn/index.mjs.map +1 -1
- package/es/i18n/resources/zhCn/qrCode.d.mts +9 -0
- package/es/i18n/resources/zhCn/qrCode.mjs +10 -0
- package/es/i18n/resources/zhCn/qrCode.mjs.map +1 -0
- package/es/i18n/types.d.mts +14 -10
- package/es/index.d.mts +12 -11
- package/es/index.mjs +23 -23
- package/es/mdx/Cards/Card.d.mts +2 -2
- package/es/mdx/Cards/Card.mjs +1 -1
- package/es/mdx/Cards/Card.mjs.map +1 -1
- package/es/mdx/Mdx/index.mjs +1 -1
- package/es/mdx/Mdx/index.mjs.map +1 -1
- package/es/mdx/Tabs/index.d.mts +2 -2
- package/es/mdx/Tabs/index.mjs +7 -2
- package/es/mdx/Tabs/index.mjs.map +1 -1
- package/es/mdx/Tabs/style.mjs +33 -1
- package/es/mdx/Tabs/style.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
- package/es/static-css/baseline.mjs +1 -4
- package/es/static-css/baseline.mjs.map +1 -1
- package/es/static-css/buildAntdStaticCss.mjs +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import Icon from "../../Icon/Icon.mjs";
|
|
3
|
+
import { useTranslation } from "../../i18n/useTranslation.mjs";
|
|
4
|
+
import { rootVariants } from "../Input/style.mjs";
|
|
5
|
+
import Input from "../Input/Input.mjs";
|
|
6
|
+
import InputNumber from "../Input/InputNumber.mjs";
|
|
7
|
+
import { panelStyles } from "../panelStyles.mjs";
|
|
8
|
+
import { PopoverPopup, PopoverPortal, PopoverPositioner, PopoverRoot, PopoverTriggerElement } from "../Popover/atoms.mjs";
|
|
9
|
+
import Slider from "../Slider/Slider.mjs";
|
|
10
|
+
import colorPicker_default from "../../i18n/resources/en/colorPicker.mjs";
|
|
11
|
+
import { formatColor, normalizeHexInput, parseColor } from "./color.mjs";
|
|
12
|
+
import { styles } from "./style.mjs";
|
|
13
|
+
import SaturationArea from "./SaturationArea.mjs";
|
|
14
|
+
import { memo, useEffect, useRef, useState } from "react";
|
|
15
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
import { cx, useThemeMode } from "antd-style";
|
|
17
|
+
import useMergeState from "use-merge-value";
|
|
18
|
+
import { Pipette } from "lucide-react";
|
|
19
|
+
//#region src/base-ui/ColorPicker/ColorPicker.tsx
|
|
20
|
+
const DEFAULT_COLOR = "#000000";
|
|
21
|
+
const hasEyeDropper = () => typeof window !== "undefined" && "EyeDropper" in window;
|
|
22
|
+
const ColorPicker = memo(({ alpha = false, children, className, defaultValue = DEFAULT_COLOR, disabled, onChange, onChangeComplete, presets, showText, size = "middle", style, value }) => {
|
|
23
|
+
const { t } = useTranslation(colorPicker_default);
|
|
24
|
+
const { isDarkMode } = useThemeMode();
|
|
25
|
+
const [hex, setHex] = useMergeState(defaultValue, {
|
|
26
|
+
defaultValue,
|
|
27
|
+
onChange,
|
|
28
|
+
value
|
|
29
|
+
});
|
|
30
|
+
const [hsva, setHsva] = useState(() => parseColor(hex));
|
|
31
|
+
const [draft, setDraft] = useState(hex.slice(1).toUpperCase());
|
|
32
|
+
const popupRef = useRef(null);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
setHsva((current) => formatColor(current, alpha) === hex.toLowerCase() ? current : parseColor(hex, current.h));
|
|
35
|
+
setDraft(hex.slice(1).toUpperCase());
|
|
36
|
+
}, [hex, alpha]);
|
|
37
|
+
const update = (next) => {
|
|
38
|
+
setHsva(next);
|
|
39
|
+
setHex(formatColor(next, alpha));
|
|
40
|
+
};
|
|
41
|
+
const commit = (next) => onChangeComplete?.(formatColor(next, alpha));
|
|
42
|
+
const apply = (next) => {
|
|
43
|
+
update(next);
|
|
44
|
+
commit(next);
|
|
45
|
+
};
|
|
46
|
+
const commitDraft = () => {
|
|
47
|
+
const normalized = normalizeHexInput(draft);
|
|
48
|
+
if (!normalized) return setDraft(hex.slice(1).toUpperCase());
|
|
49
|
+
apply(parseColor(normalized, hsva.h));
|
|
50
|
+
};
|
|
51
|
+
const swatch = (dimension) => /* @__PURE__ */ jsx("span", {
|
|
52
|
+
className: styles.swatch,
|
|
53
|
+
style: {
|
|
54
|
+
height: dimension,
|
|
55
|
+
width: dimension
|
|
56
|
+
},
|
|
57
|
+
children: /* @__PURE__ */ jsx("span", { style: { background: hex } })
|
|
58
|
+
});
|
|
59
|
+
const trigger = children ?? (showText ? /* @__PURE__ */ jsxs("button", {
|
|
60
|
+
"aria-label": t("colorPicker.trigger"),
|
|
61
|
+
disabled,
|
|
62
|
+
style,
|
|
63
|
+
type: "button",
|
|
64
|
+
className: cx(rootVariants({
|
|
65
|
+
size,
|
|
66
|
+
variant: isDarkMode ? "filled" : "outlined"
|
|
67
|
+
}), styles.textTrigger, className),
|
|
68
|
+
children: [swatch(18), /* @__PURE__ */ jsx("span", {
|
|
69
|
+
style: { fontFamily: "var(--lobe-font-family-code, monospace)" },
|
|
70
|
+
children: hex.toUpperCase()
|
|
71
|
+
})]
|
|
72
|
+
}) : /* @__PURE__ */ jsx("button", {
|
|
73
|
+
"aria-label": t("colorPicker.trigger"),
|
|
74
|
+
className: cx(styles.swatchButton, className),
|
|
75
|
+
disabled,
|
|
76
|
+
style,
|
|
77
|
+
type: "button",
|
|
78
|
+
children: swatch(24)
|
|
79
|
+
}));
|
|
80
|
+
return /* @__PURE__ */ jsxs(PopoverRoot, { children: [/* @__PURE__ */ jsx(PopoverTriggerElement, { children: trigger }), /* @__PURE__ */ jsx(PopoverPortal, { children: /* @__PURE__ */ jsx(PopoverPositioner, {
|
|
81
|
+
placement: "bottomLeft",
|
|
82
|
+
children: /* @__PURE__ */ jsx(PopoverPopup, {
|
|
83
|
+
className: panelStyles.popup,
|
|
84
|
+
ref: popupRef,
|
|
85
|
+
initialFocus: () => popupRef.current?.querySelector("[role=\"slider\"]") ?? true,
|
|
86
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
87
|
+
className: styles.panel,
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsxs("div", {
|
|
90
|
+
className: styles.summary,
|
|
91
|
+
children: [
|
|
92
|
+
swatch(40),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
94
|
+
className: styles.value,
|
|
95
|
+
children: hex.toUpperCase()
|
|
96
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
97
|
+
className: panelStyles.label,
|
|
98
|
+
children: alpha ? `HEX · ${Math.round(hsva.a * 100)}%` : "HEX"
|
|
99
|
+
})] }),
|
|
100
|
+
hasEyeDropper() && /* @__PURE__ */ jsx("button", {
|
|
101
|
+
"aria-label": t("colorPicker.eyeDropper"),
|
|
102
|
+
className: panelStyles.nav,
|
|
103
|
+
style: { marginInlineStart: "auto" },
|
|
104
|
+
type: "button",
|
|
105
|
+
onClick: async () => {
|
|
106
|
+
const result = await new window.EyeDropper().open().catch(() => null);
|
|
107
|
+
if (result) apply({
|
|
108
|
+
...parseColor(result.sRGBHex, hsva.h),
|
|
109
|
+
a: hsva.a
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
113
|
+
icon: Pipette,
|
|
114
|
+
size: 14
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
]
|
|
118
|
+
}),
|
|
119
|
+
/* @__PURE__ */ jsx(SaturationArea, {
|
|
120
|
+
hue: hsva.h,
|
|
121
|
+
label: t("colorPicker.saturation"),
|
|
122
|
+
saturation: hsva.s,
|
|
123
|
+
value: hsva.v,
|
|
124
|
+
onChange: (s, v) => update({
|
|
125
|
+
...hsva,
|
|
126
|
+
s,
|
|
127
|
+
v
|
|
128
|
+
}),
|
|
129
|
+
onChangeComplete: (s, v) => commit({
|
|
130
|
+
...hsva,
|
|
131
|
+
s,
|
|
132
|
+
v
|
|
133
|
+
})
|
|
134
|
+
}),
|
|
135
|
+
/* @__PURE__ */ jsx(Slider, {
|
|
136
|
+
"aria-label": t("colorPicker.hue"),
|
|
137
|
+
max: 360,
|
|
138
|
+
min: 0,
|
|
139
|
+
value: hsva.h,
|
|
140
|
+
classNames: {
|
|
141
|
+
indicator: styles.hidden,
|
|
142
|
+
thumb: styles.sliderThumb,
|
|
143
|
+
track: styles.hueTrack
|
|
144
|
+
},
|
|
145
|
+
onChange: (h) => update({
|
|
146
|
+
...hsva,
|
|
147
|
+
h
|
|
148
|
+
}),
|
|
149
|
+
onChangeComplete: (h) => commit({
|
|
150
|
+
...hsva,
|
|
151
|
+
h
|
|
152
|
+
})
|
|
153
|
+
}),
|
|
154
|
+
alpha && /* @__PURE__ */ jsx(Slider, {
|
|
155
|
+
"aria-label": t("colorPicker.alpha"),
|
|
156
|
+
max: 100,
|
|
157
|
+
min: 0,
|
|
158
|
+
value: Math.round(hsva.a * 100),
|
|
159
|
+
classNames: {
|
|
160
|
+
indicator: styles.hidden,
|
|
161
|
+
thumb: styles.sliderThumb,
|
|
162
|
+
track: styles.alphaTrack
|
|
163
|
+
},
|
|
164
|
+
styles: { track: { "--lobe-color-picker-alpha": formatColor(hsva, false) } },
|
|
165
|
+
onChange: (a) => update({
|
|
166
|
+
...hsva,
|
|
167
|
+
a: a / 100
|
|
168
|
+
}),
|
|
169
|
+
onChangeComplete: (a) => commit({
|
|
170
|
+
...hsva,
|
|
171
|
+
a: a / 100
|
|
172
|
+
})
|
|
173
|
+
}),
|
|
174
|
+
/* @__PURE__ */ jsxs("div", {
|
|
175
|
+
className: styles.hexRow,
|
|
176
|
+
children: [/* @__PURE__ */ jsx(Input, {
|
|
177
|
+
"aria-label": "HEX",
|
|
178
|
+
prefix: /* @__PURE__ */ jsx("span", {
|
|
179
|
+
className: panelStyles.label,
|
|
180
|
+
children: "HEX"
|
|
181
|
+
}),
|
|
182
|
+
value: draft,
|
|
183
|
+
variant: "filled",
|
|
184
|
+
onBlur: commitDraft,
|
|
185
|
+
onChange: (event) => setDraft(event.target.value),
|
|
186
|
+
onPressEnter: commitDraft
|
|
187
|
+
}), alpha && /* @__PURE__ */ jsx(InputNumber, {
|
|
188
|
+
"aria-label": t("colorPicker.alpha"),
|
|
189
|
+
className: styles.alphaField,
|
|
190
|
+
controls: false,
|
|
191
|
+
max: 100,
|
|
192
|
+
min: 0,
|
|
193
|
+
suffix: "%",
|
|
194
|
+
value: Math.round(hsva.a * 100),
|
|
195
|
+
variant: "filled",
|
|
196
|
+
onChange: (a) => a !== null && apply({
|
|
197
|
+
...hsva,
|
|
198
|
+
a: a / 100
|
|
199
|
+
})
|
|
200
|
+
})]
|
|
201
|
+
}),
|
|
202
|
+
presets && presets.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
203
|
+
"aria-label": t("colorPicker.presets"),
|
|
204
|
+
className: styles.presets,
|
|
205
|
+
role: "group",
|
|
206
|
+
children: presets.map((color) => /* @__PURE__ */ jsx("button", {
|
|
207
|
+
"aria-label": color,
|
|
208
|
+
"aria-pressed": color.toLowerCase() === hex.slice(0, 7).toLowerCase(),
|
|
209
|
+
className: styles.preset,
|
|
210
|
+
style: { background: color },
|
|
211
|
+
type: "button",
|
|
212
|
+
onClick: () => apply({
|
|
213
|
+
...parseColor(color, hsva.h),
|
|
214
|
+
a: parseColor(color).a
|
|
215
|
+
})
|
|
216
|
+
}, color))
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
})
|
|
220
|
+
})
|
|
221
|
+
}) })] });
|
|
222
|
+
});
|
|
223
|
+
ColorPicker.displayName = "ColorPicker";
|
|
224
|
+
//#endregion
|
|
225
|
+
export { ColorPicker as default };
|
|
226
|
+
|
|
227
|
+
//# sourceMappingURL=ColorPicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorPicker.mjs","names":["colorPickerMessages","useControlledState"],"sources":["../../../src/base-ui/ColorPicker/ColorPicker.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport { Pipette } from 'lucide-react';\nimport { type CSSProperties, memo, useEffect, useRef, useState } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Input, InputNumber } from '@/base-ui/Input';\nimport { rootVariants } from '@/base-ui/Input/style';\nimport { panelStyles } from '@/base-ui/panelStyles';\nimport {\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverRoot,\n PopoverTriggerElement,\n} from '@/base-ui/Popover';\nimport { Slider } from '@/base-ui/Slider';\nimport colorPickerMessages from '@/i18n/resources/en/colorPicker';\nimport { useTranslation } from '@/i18n/useTranslation';\nimport Icon from '@/Icon';\n\nimport { formatColor, type Hsva, normalizeHexInput, parseColor } from './color';\nimport SaturationArea from './SaturationArea';\nimport { styles } from './style';\nimport type { ColorPickerProps } from './type';\n\nconst DEFAULT_COLOR = '#000000';\n\nconst hasEyeDropper = () => typeof window !== 'undefined' && 'EyeDropper' in window;\n\nconst ColorPicker = memo<ColorPickerProps>(\n ({\n alpha = false,\n children,\n className,\n defaultValue = DEFAULT_COLOR,\n disabled,\n onChange,\n onChangeComplete,\n presets,\n showText,\n size = 'middle',\n style,\n value,\n }) => {\n const { t } = useTranslation(colorPickerMessages);\n const { isDarkMode } = useThemeMode();\n const [hex, setHex] = useControlledState<string>(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n const [hsva, setHsva] = useState<Hsva>(() => parseColor(hex));\n const [draft, setDraft] = useState(hex.slice(1).toUpperCase());\n const popupRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setHsva((current) =>\n formatColor(current, alpha) === hex.toLowerCase() ? current : parseColor(hex, current.h),\n );\n setDraft(hex.slice(1).toUpperCase());\n }, [hex, alpha]);\n\n const update = (next: Hsva) => {\n setHsva(next);\n setHex(formatColor(next, alpha));\n };\n const commit = (next: Hsva) => onChangeComplete?.(formatColor(next, alpha));\n const apply = (next: Hsva) => {\n update(next);\n commit(next);\n };\n\n const commitDraft = () => {\n const normalized = normalizeHexInput(draft);\n if (!normalized) return setDraft(hex.slice(1).toUpperCase());\n apply(parseColor(normalized, hsva.h));\n };\n\n const swatch = (dimension: number) => (\n <span className={styles.swatch} style={{ height: dimension, width: dimension }}>\n <span style={{ background: hex }} />\n </span>\n );\n\n const trigger =\n children ??\n (showText ? (\n <button\n aria-label={t('colorPicker.trigger')}\n disabled={disabled}\n style={style}\n type=\"button\"\n className={cx(\n rootVariants({ size, variant: isDarkMode ? 'filled' : 'outlined' }),\n styles.textTrigger,\n className,\n )}\n >\n {swatch(18)}\n <span style={{ fontFamily: 'var(--lobe-font-family-code, monospace)' }}>\n {hex.toUpperCase()}\n </span>\n </button>\n ) : (\n <button\n aria-label={t('colorPicker.trigger')}\n className={cx(styles.swatchButton, className)}\n disabled={disabled}\n style={style}\n type=\"button\"\n >\n {swatch(24)}\n </button>\n ));\n\n return (\n <PopoverRoot>\n <PopoverTriggerElement>{trigger}</PopoverTriggerElement>\n <PopoverPortal>\n <PopoverPositioner placement=\"bottomLeft\">\n <PopoverPopup\n className={panelStyles.popup}\n ref={popupRef}\n initialFocus={() =>\n popupRef.current?.querySelector<HTMLElement>('[role=\"slider\"]') ?? true\n }\n >\n <div className={styles.panel}>\n <div className={styles.summary}>\n {swatch(40)}\n <div>\n <div className={styles.value}>{hex.toUpperCase()}</div>\n <div className={panelStyles.label}>\n {alpha ? `HEX · ${Math.round(hsva.a * 100)}%` : 'HEX'}\n </div>\n </div>\n {hasEyeDropper() && (\n <button\n aria-label={t('colorPicker.eyeDropper')}\n className={panelStyles.nav}\n style={{ marginInlineStart: 'auto' }}\n type=\"button\"\n onClick={async () => {\n const dropper = new (\n window as unknown as {\n EyeDropper: new () => { open: () => Promise<{ sRGBHex: string }> };\n }\n ).EyeDropper();\n const result = await dropper.open().catch(() => null);\n if (result) apply({ ...parseColor(result.sRGBHex, hsva.h), a: hsva.a });\n }}\n >\n <Icon icon={Pipette} size={14} />\n </button>\n )}\n </div>\n <SaturationArea\n hue={hsva.h}\n label={t('colorPicker.saturation')}\n saturation={hsva.s}\n value={hsva.v}\n onChange={(s, v) => update({ ...hsva, s, v })}\n onChangeComplete={(s, v) => commit({ ...hsva, s, v })}\n />\n <Slider\n aria-label={t('colorPicker.hue')}\n max={360}\n min={0}\n value={hsva.h}\n classNames={{\n indicator: styles.hidden,\n thumb: styles.sliderThumb,\n track: styles.hueTrack,\n }}\n onChange={(h) => update({ ...hsva, h })}\n onChangeComplete={(h) => commit({ ...hsva, h })}\n />\n {alpha && (\n <Slider\n aria-label={t('colorPicker.alpha')}\n max={100}\n min={0}\n value={Math.round(hsva.a * 100)}\n classNames={{\n indicator: styles.hidden,\n thumb: styles.sliderThumb,\n track: styles.alphaTrack,\n }}\n styles={{\n track: {\n '--lobe-color-picker-alpha': formatColor(hsva, false),\n } as CSSProperties,\n }}\n onChange={(a) => update({ ...hsva, a: a / 100 })}\n onChangeComplete={(a) => commit({ ...hsva, a: a / 100 })}\n />\n )}\n <div className={styles.hexRow}>\n <Input\n aria-label=\"HEX\"\n prefix={<span className={panelStyles.label}>HEX</span>}\n value={draft}\n variant=\"filled\"\n onBlur={commitDraft}\n onChange={(event) => setDraft(event.target.value)}\n onPressEnter={commitDraft}\n />\n {alpha && (\n <InputNumber\n aria-label={t('colorPicker.alpha')}\n className={styles.alphaField}\n controls={false}\n max={100}\n min={0}\n suffix=\"%\"\n value={Math.round(hsva.a * 100)}\n variant=\"filled\"\n onChange={(a) => a !== null && apply({ ...hsva, a: a / 100 })}\n />\n )}\n </div>\n {presets && presets.length > 0 && (\n <div\n aria-label={t('colorPicker.presets')}\n className={styles.presets}\n role=\"group\"\n >\n {presets.map((color) => (\n <button\n aria-label={color}\n aria-pressed={color.toLowerCase() === hex.slice(0, 7).toLowerCase()}\n className={styles.preset}\n key={color}\n style={{ background: color }}\n type=\"button\"\n onClick={() =>\n apply({ ...parseColor(color, hsva.h), a: parseColor(color).a })\n }\n />\n ))}\n </div>\n )}\n </div>\n </PopoverPopup>\n </PopoverPositioner>\n </PopoverPortal>\n </PopoverRoot>\n );\n },\n);\n\nColorPicker.displayName = 'ColorPicker';\n\nexport default ColorPicker;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { styles } from "./style.mjs";
|
|
3
|
+
import { memo, useRef } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/base-ui/ColorPicker/SaturationArea.tsx
|
|
6
|
+
const clamp = (n) => Math.min(1, Math.max(0, Math.round(n * 100) / 100));
|
|
7
|
+
const SaturationArea = memo(({ hue, label, onChange, onChangeComplete, saturation, value }) => {
|
|
8
|
+
const areaRef = useRef(null);
|
|
9
|
+
const fromPointer = (event) => {
|
|
10
|
+
const rect = areaRef.current.getBoundingClientRect();
|
|
11
|
+
const next = [clamp((event.clientX - rect.left) / rect.width), clamp(1 - (event.clientY - rect.top) / rect.height)];
|
|
12
|
+
onChange(...next);
|
|
13
|
+
return next;
|
|
14
|
+
};
|
|
15
|
+
return /* @__PURE__ */ jsx("div", {
|
|
16
|
+
"aria-label": label,
|
|
17
|
+
"aria-valuemax": 100,
|
|
18
|
+
"aria-valuemin": 0,
|
|
19
|
+
"aria-valuenow": Math.round(saturation * 100),
|
|
20
|
+
"aria-valuetext": `Saturation ${Math.round(saturation * 100)}%, brightness ${Math.round(value * 100)}%`,
|
|
21
|
+
className: styles.saturation,
|
|
22
|
+
ref: areaRef,
|
|
23
|
+
role: "slider",
|
|
24
|
+
tabIndex: 0,
|
|
25
|
+
style: { background: `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, hsl(${hue} 100% 50%))` },
|
|
26
|
+
onKeyDown: (event) => {
|
|
27
|
+
const delta = event.shiftKey ? .1 : .01;
|
|
28
|
+
const move = {
|
|
29
|
+
ArrowDown: [0, -delta],
|
|
30
|
+
ArrowLeft: [-delta, 0],
|
|
31
|
+
ArrowRight: [delta, 0],
|
|
32
|
+
ArrowUp: [0, delta]
|
|
33
|
+
}[event.key];
|
|
34
|
+
if (!move) return;
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
const next = [clamp(saturation + move[0]), clamp(value + move[1])];
|
|
37
|
+
onChange(...next);
|
|
38
|
+
onChangeComplete(...next);
|
|
39
|
+
},
|
|
40
|
+
onPointerDown: (event) => {
|
|
41
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
42
|
+
fromPointer(event);
|
|
43
|
+
},
|
|
44
|
+
onPointerMove: (event) => {
|
|
45
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) fromPointer(event);
|
|
46
|
+
},
|
|
47
|
+
onPointerUp: (event) => {
|
|
48
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
49
|
+
onChangeComplete(...fromPointer(event));
|
|
50
|
+
},
|
|
51
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
52
|
+
className: styles.thumb,
|
|
53
|
+
style: {
|
|
54
|
+
left: `${saturation * 100}%`,
|
|
55
|
+
top: `${(1 - value) * 100}%`
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
SaturationArea.displayName = "ColorPickerSaturationArea";
|
|
61
|
+
//#endregion
|
|
62
|
+
export { SaturationArea as default };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=SaturationArea.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaturationArea.mjs","names":[],"sources":["../../../src/base-ui/ColorPicker/SaturationArea.tsx"],"sourcesContent":["'use client';\n\nimport { memo, type PointerEvent, useRef } from 'react';\n\nimport { styles } from './style';\n\nexport interface SaturationAreaProps {\n hue: number;\n label: string;\n onChange: (saturation: number, value: number) => void;\n onChangeComplete: (saturation: number, value: number) => void;\n saturation: number;\n value: number;\n}\n\nconst clamp = (n: number) => Math.min(1, Math.max(0, Math.round(n * 100) / 100));\n\nconst SaturationArea = memo<SaturationAreaProps>(\n ({ hue, label, onChange, onChangeComplete, saturation, value }) => {\n const areaRef = useRef<HTMLDivElement>(null);\n\n const fromPointer = (event: PointerEvent<HTMLDivElement>): [number, number] => {\n const rect = areaRef.current!.getBoundingClientRect();\n const next: [number, number] = [\n clamp((event.clientX - rect.left) / rect.width),\n clamp(1 - (event.clientY - rect.top) / rect.height),\n ];\n onChange(...next);\n return next;\n };\n\n return (\n <div\n aria-label={label}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={Math.round(saturation * 100)}\n aria-valuetext={`Saturation ${Math.round(saturation * 100)}%, brightness ${Math.round(value * 100)}%`}\n className={styles.saturation}\n ref={areaRef}\n role=\"slider\"\n tabIndex={0}\n style={{\n background: `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, hsl(${hue} 100% 50%))`,\n }}\n onKeyDown={(event) => {\n const delta = event.shiftKey ? 0.1 : 0.01;\n const moves: Record<string, [number, number]> = {\n ArrowDown: [0, -delta],\n ArrowLeft: [-delta, 0],\n ArrowRight: [delta, 0],\n ArrowUp: [0, delta],\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n const next: [number, number] = [clamp(saturation + move[0]), clamp(value + move[1])];\n onChange(...next);\n onChangeComplete(...next);\n }}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n fromPointer(event);\n }}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) fromPointer(event);\n }}\n onPointerUp={(event) => {\n event.currentTarget.releasePointerCapture(event.pointerId);\n onChangeComplete(...fromPointer(event));\n }}\n >\n <span\n className={styles.thumb}\n style={{ left: `${saturation * 100}%`, top: `${(1 - value) * 100}%` }}\n />\n </div>\n );\n },\n);\n\nSaturationArea.displayName = 'ColorPickerSaturationArea';\n\nexport default SaturationArea;\n"],"mappings":";;;;;AAeA,MAAM,SAAS,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;AAE/E,MAAM,iBAAiB,MACpB,EAAE,KAAK,OAAO,UAAU,kBAAkB,YAAY,YAAY;CACjE,MAAM,UAAU,OAAuB,IAAI;CAE3C,MAAM,eAAe,UAA0D;EAC7E,MAAM,OAAO,QAAQ,QAAS,sBAAsB;EACpD,MAAM,OAAyB,CAC7B,OAAO,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,GAC9C,MAAM,KAAK,MAAM,UAAU,KAAK,OAAO,KAAK,MAAM,CACpD;EACA,SAAS,GAAG,IAAI;EAChB,OAAO;CACT;CAEA,OACE,oBAAC,OAAD;EACE,cAAY;EACZ,iBAAe;EACf,iBAAe;EACf,iBAAe,KAAK,MAAM,aAAa,GAAG;EAC1C,kBAAgB,cAAc,KAAK,MAAM,aAAa,GAAG,EAAE,gBAAgB,KAAK,MAAM,QAAQ,GAAG,EAAE;EACnG,WAAW,OAAO;EAClB,KAAK;EACL,MAAK;EACL,UAAU;EACV,OAAO,EACL,YAAY,mFAAmF,IAAI,aACrG;EACA,YAAY,UAAU;GACpB,MAAM,QAAQ,MAAM,WAAW,KAAM;GAOrC,MAAM,OAAO;IALX,WAAW,CAAC,GAAG,CAAC,KAAK;IACrB,WAAW,CAAC,CAAC,OAAO,CAAC;IACrB,YAAY,CAAC,OAAO,CAAC;IACrB,SAAS,CAAC,GAAG,KAAK;GAEH,EAAE,MAAM;GACzB,IAAI,CAAC,MAAM;GACX,MAAM,eAAe;GACrB,MAAM,OAAyB,CAAC,MAAM,aAAa,KAAK,EAAE,GAAG,MAAM,QAAQ,KAAK,EAAE,CAAC;GACnF,SAAS,GAAG,IAAI;GAChB,iBAAiB,GAAG,IAAI;EAC1B;EACA,gBAAgB,UAAU;GACxB,MAAM,cAAc,kBAAkB,MAAM,SAAS;GACrD,YAAY,KAAK;EACnB;EACA,gBAAgB,UAAU;GACxB,IAAI,MAAM,cAAc,kBAAkB,MAAM,SAAS,GAAG,YAAY,KAAK;EAC/E;EACA,cAAc,UAAU;GACtB,MAAM,cAAc,sBAAsB,MAAM,SAAS;GACzD,iBAAiB,GAAG,YAAY,KAAK,CAAC;EACxC;EAEA,UAAA,oBAAC,QAAD;GACE,WAAW,OAAO;GAClB,OAAO;IAAE,MAAM,GAAG,aAAa,IAAI;IAAI,KAAK,IAAI,IAAI,SAAS,IAAI;GAAG;EACrE,CAAA;CACE,CAAA;AAET,CACF;AAEA,eAAe,cAAc"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chroma from "chroma-js";
|
|
2
|
+
//#region src/base-ui/ColorPicker/color.ts
|
|
3
|
+
const parseColor = (value, fallbackHue = 0) => {
|
|
4
|
+
if (!value || !chroma.valid(value)) return {
|
|
5
|
+
a: 1,
|
|
6
|
+
h: fallbackHue,
|
|
7
|
+
s: 0,
|
|
8
|
+
v: 0
|
|
9
|
+
};
|
|
10
|
+
const color = chroma(value);
|
|
11
|
+
const [h, s, v] = color.hsv();
|
|
12
|
+
return {
|
|
13
|
+
a: color.alpha(),
|
|
14
|
+
h: Number.isNaN(h) ? fallbackHue : h,
|
|
15
|
+
s,
|
|
16
|
+
v
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const formatColor = ({ a, h, s, v }, alpha) => chroma.hsv(h, s, v).alpha(alpha ? a : 1).hex(alpha ? "rgba" : "rgb");
|
|
20
|
+
const normalizeHexInput = (input) => {
|
|
21
|
+
const raw = input.trim().replace(/^#/, "");
|
|
22
|
+
if (!/^([\da-f]{3}|[\da-f]{6}|[\da-f]{8})$/i.test(raw)) return null;
|
|
23
|
+
return `#${raw.toLowerCase()}`;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { formatColor, normalizeHexInput, parseColor };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=color.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.mjs","names":[],"sources":["../../../src/base-ui/ColorPicker/color.ts"],"sourcesContent":["import chroma from 'chroma-js';\n\nexport interface Hsva {\n a: number;\n h: number;\n s: number;\n v: number;\n}\n\nexport const parseColor = (value: string | undefined, fallbackHue = 0): Hsva => {\n if (!value || !chroma.valid(value)) return { a: 1, h: fallbackHue, s: 0, v: 0 };\n const color = chroma(value);\n const [h, s, v] = color.hsv();\n return { a: color.alpha(), h: Number.isNaN(h) ? fallbackHue : h, s, v };\n};\n\nexport const formatColor = ({ a, h, s, v }: Hsva, alpha: boolean): string =>\n chroma\n .hsv(h, s, v)\n .alpha(alpha ? a : 1)\n .hex(alpha ? 'rgba' : 'rgb');\n\nexport const normalizeHexInput = (input: string): string | null => {\n const raw = input.trim().replace(/^#/, '');\n if (!/^([\\da-f]{3}|[\\da-f]{6}|[\\da-f]{8})$/i.test(raw)) return null;\n return `#${raw.toLowerCase()}`;\n};\n"],"mappings":";;AASA,MAAa,cAAc,OAA2B,cAAc,MAAY;CAC9E,IAAI,CAAC,SAAS,CAAC,OAAO,MAAM,KAAK,GAAG,OAAO;EAAE,GAAG;EAAG,GAAG;EAAa,GAAG;EAAG,GAAG;CAAE;CAC9E,MAAM,QAAQ,OAAO,KAAK;CAC1B,MAAM,CAAC,GAAG,GAAG,KAAK,MAAM,IAAI;CAC5B,OAAO;EAAE,GAAG,MAAM,MAAM;EAAG,GAAG,OAAO,MAAM,CAAC,IAAI,cAAc;EAAG;EAAG;CAAE;AACxE;AAEA,MAAa,eAAe,EAAE,GAAG,GAAG,GAAG,KAAW,UAChD,OACG,IAAI,GAAG,GAAG,CAAC,CAAC,CACZ,MAAM,QAAQ,IAAI,CAAC,CAAC,CACpB,IAAI,QAAQ,SAAS,KAAK;AAE/B,MAAa,qBAAqB,UAAiC;CACjE,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC,QAAQ,MAAM,EAAE;CACzC,IAAI,CAAC,wCAAwC,KAAK,GAAG,GAAG,OAAO;CAC/D,OAAO,IAAI,IAAI,YAAY;AAC7B"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { focusRing } from "../focusRing.mjs";
|
|
2
|
+
import { createStaticStyles } from "antd-style";
|
|
3
|
+
//#region src/base-ui/ColorPicker/style.ts
|
|
4
|
+
const checker = (color) => `
|
|
5
|
+
background-image:
|
|
6
|
+
linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%),
|
|
7
|
+
linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%);
|
|
8
|
+
background-position: 0 0, 4px 4px;
|
|
9
|
+
background-size: 8px 8px;
|
|
10
|
+
`;
|
|
11
|
+
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
12
|
+
alphaField: css`
|
|
13
|
+
flex: none;
|
|
14
|
+
width: 76px;
|
|
15
|
+
`,
|
|
16
|
+
alphaTrack: css`
|
|
17
|
+
height: 10px;
|
|
18
|
+
border-radius: 999px;
|
|
19
|
+
|
|
20
|
+
background-image:
|
|
21
|
+
linear-gradient(to right, transparent, var(--lobe-color-picker-alpha)),
|
|
22
|
+
linear-gradient(
|
|
23
|
+
45deg,
|
|
24
|
+
${cssVar.colorFillSecondary} 25%,
|
|
25
|
+
transparent 25%,
|
|
26
|
+
transparent 75%,
|
|
27
|
+
${cssVar.colorFillSecondary} 75%
|
|
28
|
+
),
|
|
29
|
+
linear-gradient(
|
|
30
|
+
45deg,
|
|
31
|
+
${cssVar.colorFillSecondary} 25%,
|
|
32
|
+
transparent 25%,
|
|
33
|
+
transparent 75%,
|
|
34
|
+
${cssVar.colorFillSecondary} 75%
|
|
35
|
+
);
|
|
36
|
+
background-position:
|
|
37
|
+
0 0,
|
|
38
|
+
0 0,
|
|
39
|
+
4px 4px;
|
|
40
|
+
background-size:
|
|
41
|
+
100% 100%,
|
|
42
|
+
8px 8px,
|
|
43
|
+
8px 8px;
|
|
44
|
+
`,
|
|
45
|
+
hexRow: css`
|
|
46
|
+
display: flex;
|
|
47
|
+
gap: 6px;
|
|
48
|
+
|
|
49
|
+
& > * {
|
|
50
|
+
min-width: 0;
|
|
51
|
+
}
|
|
52
|
+
`,
|
|
53
|
+
hidden: css`
|
|
54
|
+
background: transparent !important;
|
|
55
|
+
`,
|
|
56
|
+
hueTrack: css`
|
|
57
|
+
height: 10px;
|
|
58
|
+
border-radius: 999px;
|
|
59
|
+
background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);
|
|
60
|
+
`,
|
|
61
|
+
panel: css`
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: 14px;
|
|
65
|
+
width: 240px;
|
|
66
|
+
`,
|
|
67
|
+
preset: css`
|
|
68
|
+
${focusRing};
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
|
|
71
|
+
width: 22px;
|
|
72
|
+
height: 22px;
|
|
73
|
+
padding: 0;
|
|
74
|
+
border: 0;
|
|
75
|
+
border-radius: 50%;
|
|
76
|
+
|
|
77
|
+
&[aria-pressed='true'] {
|
|
78
|
+
box-shadow:
|
|
79
|
+
0 0 0 2px ${cssVar.colorBgElevated},
|
|
80
|
+
0 0 0 4px ${cssVar.colorText};
|
|
81
|
+
}
|
|
82
|
+
`,
|
|
83
|
+
presets: css`
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-wrap: wrap;
|
|
86
|
+
gap: 8px;
|
|
87
|
+
|
|
88
|
+
padding-block-start: 14px;
|
|
89
|
+
border-block-start: 1px solid ${cssVar.colorBorderSecondary};
|
|
90
|
+
`,
|
|
91
|
+
saturation: css`
|
|
92
|
+
${focusRing};
|
|
93
|
+
touch-action: none;
|
|
94
|
+
cursor: crosshair;
|
|
95
|
+
|
|
96
|
+
position: relative;
|
|
97
|
+
|
|
98
|
+
height: 164px;
|
|
99
|
+
border-radius: 12px;
|
|
100
|
+
`,
|
|
101
|
+
swatch: css`
|
|
102
|
+
${checker(cssVar.colorFillSecondary)};
|
|
103
|
+
overflow: hidden;
|
|
104
|
+
display: inline-flex;
|
|
105
|
+
flex: none;
|
|
106
|
+
|
|
107
|
+
border-radius: 50%;
|
|
108
|
+
|
|
109
|
+
box-shadow: inset 0 0 0 1px ${cssVar.colorFillSecondary};
|
|
110
|
+
|
|
111
|
+
& > span {
|
|
112
|
+
flex: 1;
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
swatchButton: css`
|
|
116
|
+
${focusRing};
|
|
117
|
+
cursor: pointer;
|
|
118
|
+
|
|
119
|
+
display: inline-flex;
|
|
120
|
+
align-items: center;
|
|
121
|
+
justify-content: center;
|
|
122
|
+
|
|
123
|
+
width: 32px;
|
|
124
|
+
height: 32px;
|
|
125
|
+
padding: 0;
|
|
126
|
+
border: 0;
|
|
127
|
+
border-radius: 50%;
|
|
128
|
+
|
|
129
|
+
background: none;
|
|
130
|
+
|
|
131
|
+
&:disabled {
|
|
132
|
+
cursor: not-allowed;
|
|
133
|
+
opacity: 0.5;
|
|
134
|
+
}
|
|
135
|
+
`,
|
|
136
|
+
textTrigger: css`
|
|
137
|
+
cursor: pointer;
|
|
138
|
+
width: auto;
|
|
139
|
+
`,
|
|
140
|
+
thumb: css`
|
|
141
|
+
position: absolute;
|
|
142
|
+
|
|
143
|
+
box-sizing: border-box;
|
|
144
|
+
width: 18px;
|
|
145
|
+
height: 18px;
|
|
146
|
+
margin-block: -9px 0;
|
|
147
|
+
margin-inline: -9px 0;
|
|
148
|
+
border: 3px solid #fff;
|
|
149
|
+
border-radius: 50%;
|
|
150
|
+
|
|
151
|
+
box-shadow:
|
|
152
|
+
0 0 0 1px rgb(0 0 0 / 12%),
|
|
153
|
+
0 2px 6px rgb(0 0 0 / 25%);
|
|
154
|
+
`,
|
|
155
|
+
sliderThumb: css`
|
|
156
|
+
width: 18px !important;
|
|
157
|
+
height: 18px !important;
|
|
158
|
+
border: 3px solid #fff !important;
|
|
159
|
+
|
|
160
|
+
background: transparent !important;
|
|
161
|
+
box-shadow:
|
|
162
|
+
0 0 0 1px rgb(0 0 0 / 12%),
|
|
163
|
+
0 2px 6px rgb(0 0 0 / 25%) !important;
|
|
164
|
+
`,
|
|
165
|
+
summary: css`
|
|
166
|
+
display: flex;
|
|
167
|
+
gap: 12px;
|
|
168
|
+
align-items: center;
|
|
169
|
+
`,
|
|
170
|
+
value: css`
|
|
171
|
+
font-family: ${cssVar.fontFamilyCode};
|
|
172
|
+
font-size: 20px;
|
|
173
|
+
font-weight: 600;
|
|
174
|
+
line-height: 1.2;
|
|
175
|
+
`
|
|
176
|
+
}));
|
|
177
|
+
//#endregion
|
|
178
|
+
export { styles };
|
|
179
|
+
|
|
180
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/ColorPicker/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nimport { focusRing } from '@/base-ui/focusRing';\n\nconst checker = (color: string) => `\n background-image:\n linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%),\n linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%);\n background-position: 0 0, 4px 4px;\n background-size: 8px 8px;\n`;\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n alphaField: css`\n flex: none;\n width: 76px;\n `,\n alphaTrack: css`\n height: 10px;\n border-radius: 999px;\n\n background-image:\n linear-gradient(to right, transparent, var(--lobe-color-picker-alpha)),\n linear-gradient(\n 45deg,\n ${cssVar.colorFillSecondary} 25%,\n transparent 25%,\n transparent 75%,\n ${cssVar.colorFillSecondary} 75%\n ),\n linear-gradient(\n 45deg,\n ${cssVar.colorFillSecondary} 25%,\n transparent 25%,\n transparent 75%,\n ${cssVar.colorFillSecondary} 75%\n );\n background-position:\n 0 0,\n 0 0,\n 4px 4px;\n background-size:\n 100% 100%,\n 8px 8px,\n 8px 8px;\n `,\n hexRow: css`\n display: flex;\n gap: 6px;\n\n & > * {\n min-width: 0;\n }\n `,\n hidden: css`\n background: transparent !important;\n `,\n hueTrack: css`\n height: 10px;\n border-radius: 999px;\n background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);\n `,\n panel: css`\n display: flex;\n flex-direction: column;\n gap: 14px;\n width: 240px;\n `,\n preset: css`\n ${focusRing};\n cursor: pointer;\n\n width: 22px;\n height: 22px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n\n &[aria-pressed='true'] {\n box-shadow:\n 0 0 0 2px ${cssVar.colorBgElevated},\n 0 0 0 4px ${cssVar.colorText};\n }\n `,\n presets: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding-block-start: 14px;\n border-block-start: 1px solid ${cssVar.colorBorderSecondary};\n `,\n saturation: css`\n ${focusRing};\n touch-action: none;\n cursor: crosshair;\n\n position: relative;\n\n height: 164px;\n border-radius: 12px;\n `,\n swatch: css`\n ${checker(cssVar.colorFillSecondary)};\n overflow: hidden;\n display: inline-flex;\n flex: none;\n\n border-radius: 50%;\n\n box-shadow: inset 0 0 0 1px ${cssVar.colorFillSecondary};\n\n & > span {\n flex: 1;\n }\n `,\n swatchButton: css`\n ${focusRing};\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n\n background: none;\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n `,\n textTrigger: css`\n cursor: pointer;\n width: auto;\n `,\n thumb: css`\n position: absolute;\n\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n margin-block: -9px 0;\n margin-inline: -9px 0;\n border: 3px solid #fff;\n border-radius: 50%;\n\n box-shadow:\n 0 0 0 1px rgb(0 0 0 / 12%),\n 0 2px 6px rgb(0 0 0 / 25%);\n `,\n sliderThumb: css`\n width: 18px !important;\n height: 18px !important;\n border: 3px solid #fff !important;\n\n background: transparent !important;\n box-shadow:\n 0 0 0 1px rgb(0 0 0 / 12%),\n 0 2px 6px rgb(0 0 0 / 25%) !important;\n `,\n summary: css`\n display: flex;\n gap: 12px;\n align-items: center;\n `,\n value: css`\n font-family: ${cssVar.fontFamilyCode};\n font-size: 20px;\n font-weight: 600;\n line-height: 1.2;\n `,\n}));\n"],"mappings":";;;AAIA,MAAM,WAAW,UAAkB;;6BAEN,MAAM,0CAA0C,MAAM;6BACtD,MAAM,0CAA0C,MAAM;;;;AAKnF,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc;CAC7D,YAAY,GAAG;;;;CAIf,YAAY,GAAG;;;;;;;;UAQP,OAAO,mBAAmB;;;UAG1B,OAAO,mBAAmB;;;;UAI1B,OAAO,mBAAmB;;;UAG1B,OAAO,mBAAmB;;;;;;;;;;;CAWlC,QAAQ,GAAG;;;;;;;;CAQX,QAAQ,GAAG;;;CAGX,UAAU,GAAG;;;;;CAKb,OAAO,GAAG;;;;;;CAMV,QAAQ,GAAG;MACP,UAAU;;;;;;;;;;;oBAWI,OAAO,gBAAgB;oBACvB,OAAO,UAAU;;;CAGnC,SAAS,GAAG;;;;;;oCAMsB,OAAO,qBAAqB;;CAE9D,YAAY,GAAG;MACX,UAAU;;;;;;;;;CASd,QAAQ,GAAG;MACP,QAAQ,OAAO,kBAAkB,EAAE;;;;;;;kCAOP,OAAO,mBAAmB;;;;;;CAM1D,cAAc,GAAG;MACb,UAAU;;;;;;;;;;;;;;;;;;;;CAoBd,aAAa,GAAG;;;;CAIhB,OAAO,GAAG;;;;;;;;;;;;;;;CAeV,aAAa,GAAG;;;;;;;;;;CAUhB,SAAS,GAAG;;;;;CAKZ,OAAO,GAAG;mBACO,OAAO,eAAe;;;;;AAKzC,EAAE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { InputSize } from "../Input/type.mjs";
|
|
2
|
+
import { CSSProperties, ReactElement } from "react";
|
|
3
|
+
//#region src/base-ui/ColorPicker/type.d.ts
|
|
4
|
+
interface ColorPickerProps {
|
|
5
|
+
alpha?: boolean;
|
|
6
|
+
children?: ReactElement;
|
|
7
|
+
className?: string;
|
|
8
|
+
defaultValue?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onChange?: (hex: string) => void;
|
|
11
|
+
onChangeComplete?: (hex: string) => void;
|
|
12
|
+
presets?: string[];
|
|
13
|
+
showText?: boolean;
|
|
14
|
+
size?: InputSize;
|
|
15
|
+
style?: CSSProperties;
|
|
16
|
+
value?: string;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ColorPickerProps };
|
|
20
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenuHost.mjs","names":[],"sources":["../../../src/base-ui/ContextMenu/ContextMenuHost.tsx"],"sourcesContent":["'use client';\n\nimport { ContextMenu } from '@base-ui/react/context-menu';\nimport { cx } from 'antd-style';\nimport { memo, useEffect, useMemo, useSyncExternalStore } from 'react';\n\nimport { getFloatingCollisionPadding } from '@/base-ui/floating';\nimport { MenuVirtualList } from '@/base-ui/virtual';\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { useAppElement } from '@/ThemeProvider';\nimport { registerDevSingleton } from '@/utils/devSingleton';\nimport { preventDefaultAndStopPropagation } from '@/utils/dom';\n\nimport { useLayerZIndex } from '../zIndex';\nimport { renderContextMenuItems } from './renderItems';\nimport {\n closeContextMenu,\n getServerSnapshot,\n getSnapshot,\n setContextMenuState,\n subscribe,\n updateLastPointer,\n} from './store';\nimport { styles } from './style';\n\nconst noAnimationStyles = { '--lobe-dropdown-animation-duration': '0ms' } as React.CSSProperties;\n\nexport const ContextMenuHost = memo(() => {\n const isClient = useIsClient();\n const appElement = useAppElement();\n const state = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n useEffect(() => {\n const DEV = process.env.NODE_ENV === 'development';\n if (!isClient || !DEV) return;\n return registerDevSingleton('ContextMenuHost', document.body);\n }, [isClient]);\n\n useEffect(() => {\n const handler = (event: MouseEvent | PointerEvent) => updateLastPointer(event);\n window.addEventListener('pointerdown', handler, true);\n window.addEventListener('contextmenu', handler, true);\n return () => {\n window.removeEventListener('pointerdown', handler, true);\n window.removeEventListener('contextmenu', handler, true);\n };\n }, []);\n\n const menuItems = useMemo(\n () =>\n renderContextMenuItems(state.items, [], {\n iconAlign: state.iconAlign,\n iconSpaceMode: state.iconSpaceMode,\n }),\n [state.items, state.iconAlign, state.iconSpaceMode],\n );\n const { zIndex, ref: zRef } = useLayerZIndex<HTMLDivElement>('floating');\n const hasSlots = state.header != null || state.footer != null;\n if (!isClient) return null;\n if (!state.open && state.items.length === 0) return null;\n\n return (\n <ContextMenu.Root\n open={state.open}\n onOpenChange={(open) => {\n if (open) {\n setContextMenuState({ open });\n return;\n }\n closeContextMenu();\n }}\n >\n <ContextMenu.Portal container={appElement}>\n <ContextMenu.Positioner\n anchor={state.anchor ?? undefined}\n className={styles.positioner}\n collisionPadding={getFloatingCollisionPadding()}\n ref={zRef as any}\n sideOffset={6}\n style={{ ...noAnimationStyles, zIndex }}\n >\n <ContextMenu.Popup\n className={cx(styles.popup, hasSlots && styles.popupWithSlots)}\n data-has-footer={state.footer == null ? undefined : ''}\n data-has-header={state.header == null ? undefined : ''}\n onContextMenu={preventDefaultAndStopPropagation}\n >\n {state.header == null ? null : <div className={styles.header}>{state.header}</div>}\n {state.virtual ? (\n <MenuVirtualList itemSize={state.listItemHeight}>{menuItems}</MenuVirtualList>\n ) : hasSlots ? (\n <div className={styles.slotViewport}>{menuItems}</div>\n ) : (\n menuItems\n )}\n {state.footer == null ? null : <div className={styles.footer}>{state.footer}</div>}\n </ContextMenu.Popup>\n </ContextMenu.Positioner>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n\nContextMenuHost.displayName = 'ContextMenuHost';\n"],"mappings":";;;;;;;;;;;;;;;;AAyBA,MAAM,oBAAoB,EAAE,sCAAsC,MAAM;AAExE,MAAa,kBAAkB,WAAW;CACxC,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,cAAc;CACjC,MAAM,QAAQ,qBAAqB,WAAW,aAAa,iBAAiB;CAE5E,gBAAgB;EACd,MAAM,MAAM,QAAQ,IAAI,aAAa;EACrC,IAAI,CAAC,YAAY,CAAC,KAAK;EACvB,OAAO,qBAAqB,mBAAmB,SAAS,IAAI;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,gBAAgB;EACd,MAAM,WAAW,UAAqC,kBAAkB,KAAK;EAC7E,OAAO,iBAAiB,eAAe,SAAS,IAAI;EACpD,OAAO,iBAAiB,eAAe,SAAS,IAAI;EACpD,aAAa;GACX,OAAO,oBAAoB,eAAe,SAAS,IAAI;GACvD,OAAO,oBAAoB,eAAe,SAAS,IAAI;EACzD;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,cAEd,uBAAuB,MAAM,OAAO,CAAC,GAAG;EACtC,WAAW,MAAM;EACjB,eAAe,MAAM;CACvB,CAAC,GACH;EAAC,MAAM;EAAO,MAAM;EAAW,MAAM;CAAa,CACpD;CACA,MAAM,EAAE,QAAQ,KAAK,SAAS,eAA+B,UAAU;CACvE,MAAM,WAAW,MAAM,UAAU,QAAQ,MAAM,UAAU;CACzD,IAAI,CAAC,UAAU,OAAO;CACtB,IAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,WAAW,GAAG,OAAO;CAEpD,OACE,oBAAC,YAAY,MAAb;EACE,MAAM,MAAM;EACZ,eAAe,SAAS;GACtB,IAAI,MAAM;IACR,oBAAoB,EAAE,KAAK,CAAC;IAC5B;GACF;GACA,iBAAiB;EACnB;EAEA,UAAA,oBAAC,YAAY,QAAb;GAAoB,WAAW;GAC7B,UAAA,oBAAC,YAAY,YAAb;IACE,QAAQ,MAAM,UAAU,KAAA;IACxB,WAAW,OAAO;IAClB,kBAAkB,4BAA4B;IAC9C,KAAK;IACL,YAAY;IACZ,OAAO;KAAE,GAAG;KAAmB;IAAO;IAEtC,UAAA,qBAAC,YAAY,OAAb;KACE,WAAW,GAAG,OAAO,OAAO,YAAY,OAAO,cAAc;KAC7D,mBAAiB,MAAM,UAAU,OAAO,KAAA,IAAY;KACpD,mBAAiB,MAAM,UAAU,OAAO,KAAA,IAAY;KACpD,eAAe;KAJjB,UAAA;MAMG,MAAM,UAAU,OAAO,OAAO,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAS,UAAA,MAAM;MAAY,CAAA;MAChF,MAAM,UACL,oBAAC,iBAAD;OAAiB,UAAU,MAAM;OAAiB,UAAA;MAA2B,CAAA,IAC3E,WACF,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAe,UAAA;MAAe,CAAA,IAErD;MAED,MAAM,UAAU,OAAO,OAAO,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAS,UAAA,MAAM;MAAY,CAAA;KAChE;;GACG,CAAA;EACN,CAAA;CACJ,CAAA;AAEtB,CAAC;AAED,gBAAgB,cAAc"}
|
|
1
|
+
{"version":3,"file":"ContextMenuHost.mjs","names":[],"sources":["../../../src/base-ui/ContextMenu/ContextMenuHost.tsx"],"sourcesContent":["'use client';\n\nimport { ContextMenu } from '@base-ui/react/context-menu';\nimport { cx } from 'antd-style';\nimport { memo, useEffect, useMemo, useSyncExternalStore } from 'react';\n\nimport { getFloatingCollisionPadding } from '@/base-ui/floating';\nimport { MenuVirtualList } from '@/base-ui/virtual';\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { useAppElement } from '@/ThemeProvider/AppElementContext';\nimport { registerDevSingleton } from '@/utils/devSingleton';\nimport { preventDefaultAndStopPropagation } from '@/utils/dom';\n\nimport { useLayerZIndex } from '../zIndex';\nimport { renderContextMenuItems } from './renderItems';\nimport {\n closeContextMenu,\n getServerSnapshot,\n getSnapshot,\n setContextMenuState,\n subscribe,\n updateLastPointer,\n} from './store';\nimport { styles } from './style';\n\nconst noAnimationStyles = { '--lobe-dropdown-animation-duration': '0ms' } as React.CSSProperties;\n\nexport const ContextMenuHost = memo(() => {\n const isClient = useIsClient();\n const appElement = useAppElement();\n const state = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n useEffect(() => {\n const DEV = process.env.NODE_ENV === 'development';\n if (!isClient || !DEV) return;\n return registerDevSingleton('ContextMenuHost', document.body);\n }, [isClient]);\n\n useEffect(() => {\n const handler = (event: MouseEvent | PointerEvent) => updateLastPointer(event);\n window.addEventListener('pointerdown', handler, true);\n window.addEventListener('contextmenu', handler, true);\n return () => {\n window.removeEventListener('pointerdown', handler, true);\n window.removeEventListener('contextmenu', handler, true);\n };\n }, []);\n\n const menuItems = useMemo(\n () =>\n renderContextMenuItems(state.items, [], {\n iconAlign: state.iconAlign,\n iconSpaceMode: state.iconSpaceMode,\n }),\n [state.items, state.iconAlign, state.iconSpaceMode],\n );\n const { zIndex, ref: zRef } = useLayerZIndex<HTMLDivElement>('floating');\n const hasSlots = state.header != null || state.footer != null;\n if (!isClient) return null;\n if (!state.open && state.items.length === 0) return null;\n\n return (\n <ContextMenu.Root\n open={state.open}\n onOpenChange={(open) => {\n if (open) {\n setContextMenuState({ open });\n return;\n }\n closeContextMenu();\n }}\n >\n <ContextMenu.Portal container={appElement}>\n <ContextMenu.Positioner\n anchor={state.anchor ?? undefined}\n className={styles.positioner}\n collisionPadding={getFloatingCollisionPadding()}\n ref={zRef as any}\n sideOffset={6}\n style={{ ...noAnimationStyles, zIndex }}\n >\n <ContextMenu.Popup\n className={cx(styles.popup, hasSlots && styles.popupWithSlots)}\n data-has-footer={state.footer == null ? undefined : ''}\n data-has-header={state.header == null ? undefined : ''}\n onContextMenu={preventDefaultAndStopPropagation}\n >\n {state.header == null ? null : <div className={styles.header}>{state.header}</div>}\n {state.virtual ? (\n <MenuVirtualList itemSize={state.listItemHeight}>{menuItems}</MenuVirtualList>\n ) : hasSlots ? (\n <div className={styles.slotViewport}>{menuItems}</div>\n ) : (\n menuItems\n )}\n {state.footer == null ? null : <div className={styles.footer}>{state.footer}</div>}\n </ContextMenu.Popup>\n </ContextMenu.Positioner>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n );\n});\n\nContextMenuHost.displayName = 'ContextMenuHost';\n"],"mappings":";;;;;;;;;;;;;;;;AAyBA,MAAM,oBAAoB,EAAE,sCAAsC,MAAM;AAExE,MAAa,kBAAkB,WAAW;CACxC,MAAM,WAAW,YAAY;CAC7B,MAAM,aAAa,cAAc;CACjC,MAAM,QAAQ,qBAAqB,WAAW,aAAa,iBAAiB;CAE5E,gBAAgB;EACd,MAAM,MAAM,QAAQ,IAAI,aAAa;EACrC,IAAI,CAAC,YAAY,CAAC,KAAK;EACvB,OAAO,qBAAqB,mBAAmB,SAAS,IAAI;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,gBAAgB;EACd,MAAM,WAAW,UAAqC,kBAAkB,KAAK;EAC7E,OAAO,iBAAiB,eAAe,SAAS,IAAI;EACpD,OAAO,iBAAiB,eAAe,SAAS,IAAI;EACpD,aAAa;GACX,OAAO,oBAAoB,eAAe,SAAS,IAAI;GACvD,OAAO,oBAAoB,eAAe,SAAS,IAAI;EACzD;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,cAEd,uBAAuB,MAAM,OAAO,CAAC,GAAG;EACtC,WAAW,MAAM;EACjB,eAAe,MAAM;CACvB,CAAC,GACH;EAAC,MAAM;EAAO,MAAM;EAAW,MAAM;CAAa,CACpD;CACA,MAAM,EAAE,QAAQ,KAAK,SAAS,eAA+B,UAAU;CACvE,MAAM,WAAW,MAAM,UAAU,QAAQ,MAAM,UAAU;CACzD,IAAI,CAAC,UAAU,OAAO;CACtB,IAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,WAAW,GAAG,OAAO;CAEpD,OACE,oBAAC,YAAY,MAAb;EACE,MAAM,MAAM;EACZ,eAAe,SAAS;GACtB,IAAI,MAAM;IACR,oBAAoB,EAAE,KAAK,CAAC;IAC5B;GACF;GACA,iBAAiB;EACnB;EAEA,UAAA,oBAAC,YAAY,QAAb;GAAoB,WAAW;GAC7B,UAAA,oBAAC,YAAY,YAAb;IACE,QAAQ,MAAM,UAAU,KAAA;IACxB,WAAW,OAAO;IAClB,kBAAkB,4BAA4B;IAC9C,KAAK;IACL,YAAY;IACZ,OAAO;KAAE,GAAG;KAAmB;IAAO;IAEtC,UAAA,qBAAC,YAAY,OAAb;KACE,WAAW,GAAG,OAAO,OAAO,YAAY,OAAO,cAAc;KAC7D,mBAAiB,MAAM,UAAU,OAAO,KAAA,IAAY;KACpD,mBAAiB,MAAM,UAAU,OAAO,KAAA,IAAY;KACpD,eAAe;KAJjB,UAAA;MAMG,MAAM,UAAU,OAAO,OAAO,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAS,UAAA,MAAM;MAAY,CAAA;MAChF,MAAM,UACL,oBAAC,iBAAD;OAAiB,UAAU,MAAM;OAAiB,UAAA;MAA2B,CAAA,IAC3E,WACF,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAe,UAAA;MAAe,CAAA,IAErD;MAED,MAAM,UAAU,OAAO,OAAO,oBAAC,OAAD;OAAK,WAAW,OAAO;OAAS,UAAA,MAAM;MAAY,CAAA;KAChE;;GACG,CAAA;EACN,CAAA;CACJ,CAAA;AAEtB,CAAC;AAED,gBAAgB,cAAc"}
|