entangle-ui 0.2.0 → 0.3.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/CHANGELOG.md +23 -0
- package/dist/esm/components/Icons/CheckIcon.js +27 -0
- package/dist/esm/components/Icons/CheckIcon.js.map +1 -0
- package/dist/esm/components/Icons/ChevronDownIcon.js +27 -0
- package/dist/esm/components/Icons/ChevronDownIcon.js.map +1 -0
- package/dist/esm/components/Icons/ChevronUpIcon.js +27 -0
- package/dist/esm/components/Icons/ChevronUpIcon.js.map +1 -0
- package/dist/esm/components/Icons/CircleIcon.js +27 -0
- package/dist/esm/components/Icons/CircleIcon.js.map +1 -0
- package/dist/esm/components/Icons/CloseIcon.js +27 -0
- package/dist/esm/components/Icons/CloseIcon.js.map +1 -0
- package/dist/esm/components/Icons/EyeDropperIcon.js +28 -0
- package/dist/esm/components/Icons/EyeDropperIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentAlignedIcon.js +9 -0
- package/dist/esm/components/Icons/TangentAlignedIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentAutoIcon.js +9 -0
- package/dist/esm/components/Icons/TangentAutoIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentFreeIcon.js +9 -0
- package/dist/esm/components/Icons/TangentFreeIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentLinearIcon.js +9 -0
- package/dist/esm/components/Icons/TangentLinearIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentMirroredIcon.js +9 -0
- package/dist/esm/components/Icons/TangentMirroredIcon.js.map +1 -0
- package/dist/esm/components/Icons/TangentStepIcon.js +9 -0
- package/dist/esm/components/Icons/TangentStepIcon.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/AlphaSlider.js +92 -0
- package/dist/esm/components/controls/ColorPicker/AlphaSlider.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorArea.js +93 -0
- package/dist/esm/components/controls/ColorPicker/ColorArea.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorInputs.js +129 -0
- package/dist/esm/components/controls/ColorPicker/ColorInputs.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorPalette.js +89 -0
- package/dist/esm/components/controls/ColorPicker/ColorPalette.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorPicker.js +75 -0
- package/dist/esm/components/controls/ColorPicker/ColorPicker.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorPresets.js +57 -0
- package/dist/esm/components/controls/ColorPicker/ColorPresets.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/ColorSwatch.js +67 -0
- package/dist/esm/components/controls/ColorPicker/ColorSwatch.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/EyeDropper.js +85 -0
- package/dist/esm/components/controls/ColorPicker/EyeDropper.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/HueSlider.js +85 -0
- package/dist/esm/components/controls/ColorPicker/HueSlider.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/colorUtils.js +220 -0
- package/dist/esm/components/controls/ColorPicker/colorUtils.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/palettes/material.js +299 -0
- package/dist/esm/components/controls/ColorPicker/palettes/material.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/palettes/professional.js +479 -0
- package/dist/esm/components/controls/ColorPicker/palettes/professional.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/palettes/tailwind.js +366 -0
- package/dist/esm/components/controls/ColorPicker/palettes/tailwind.js.map +1 -0
- package/dist/esm/components/controls/ColorPicker/useColor.js +63 -0
- package/dist/esm/components/controls/ColorPicker/useColor.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/CurveCanvas.js +84 -0
- package/dist/esm/components/controls/CurveEditor/CurveCanvas.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/CurveEditor.js +134 -0
- package/dist/esm/components/controls/CurveEditor/CurveEditor.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/CurveToolbar.js +96 -0
- package/dist/esm/components/controls/CurveEditor/CurveToolbar.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/curvePresets.js +184 -0
- package/dist/esm/components/controls/CurveEditor/curvePresets.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/curveUtils.js +338 -0
- package/dist/esm/components/controls/CurveEditor/curveUtils.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js +569 -0
- package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js.map +1 -0
- package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js +400 -0
- package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js.map +1 -0
- package/dist/esm/components/controls/NumberInput/NumberInput.js +377 -0
- package/dist/esm/components/controls/NumberInput/NumberInput.js.map +1 -0
- package/dist/esm/components/controls/NumberInput/useNumberInput.js +324 -0
- package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -0
- package/dist/esm/components/controls/Select/Select.js +533 -0
- package/dist/esm/components/controls/Select/Select.js.map +1 -0
- package/dist/esm/components/controls/Slider/Slider.js +413 -0
- package/dist/esm/components/controls/Slider/Slider.js.map +1 -0
- package/dist/esm/components/controls/TreeView/TreeNode.js +189 -0
- package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -0
- package/dist/esm/components/controls/TreeView/TreeView.js +213 -0
- package/dist/esm/components/controls/TreeView/TreeView.js.map +1 -0
- package/dist/esm/components/controls/TreeView/useTreeState.js +154 -0
- package/dist/esm/components/controls/TreeView/useTreeState.js.map +1 -0
- package/dist/esm/components/controls/VectorInput/VectorInput.js +202 -0
- package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js +42 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js +98 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +154 -0
- package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/PropertySection.js +136 -0
- package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -0
- package/dist/esm/components/editor/PropertyInspector/usePropertyUndo.js +86 -0
- package/dist/esm/components/editor/PropertyInspector/usePropertyUndo.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/Dialog.js +92 -0
- package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/Dialog.styled.js +80 -0
- package/dist/esm/components/feedback/Dialog/Dialog.styled.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/DialogBody.js +33 -0
- package/dist/esm/components/feedback/Dialog/DialogBody.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/DialogClose.js +26 -0
- package/dist/esm/components/feedback/Dialog/DialogClose.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/DialogFooter.js +43 -0
- package/dist/esm/components/feedback/Dialog/DialogFooter.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/DialogHeader.js +84 -0
- package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js +70 -0
- package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -0
- package/dist/esm/components/feedback/Dialog/useFocusTrap.js +55 -0
- package/dist/esm/components/feedback/Dialog/useFocusTrap.js.map +1 -0
- package/dist/esm/components/feedback/Toast/ToastContainer.js +34 -0
- package/dist/esm/components/feedback/Toast/ToastContainer.js.map +1 -0
- package/dist/esm/components/feedback/Toast/ToastItem.js +214 -0
- package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -0
- package/dist/esm/components/feedback/Toast/ToastProvider.js +47 -0
- package/dist/esm/components/feedback/Toast/ToastProvider.js.map +1 -0
- package/dist/esm/components/feedback/Toast/useToast.js +60 -0
- package/dist/esm/components/feedback/Toast/useToast.js.map +1 -0
- package/dist/esm/components/form/FormHelperText.js +38 -0
- package/dist/esm/components/form/FormHelperText.js.map +1 -0
- package/dist/esm/components/form/FormLabel.js +43 -0
- package/dist/esm/components/form/FormLabel.js.map +1 -0
- package/dist/esm/components/form/InputWrapper.js +100 -0
- package/dist/esm/components/form/InputWrapper.js.map +1 -0
- package/dist/esm/components/layout/Accordion/Accordion.js +103 -0
- package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -0
- package/dist/esm/components/layout/Accordion/AccordionContent.js +37 -0
- package/dist/esm/components/layout/Accordion/AccordionContent.js.map +1 -0
- package/dist/esm/components/layout/Accordion/AccordionItem.js +24 -0
- package/dist/esm/components/layout/Accordion/AccordionItem.js.map +1 -0
- package/dist/esm/components/layout/Accordion/AccordionTrigger.js +123 -0
- package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -0
- package/dist/esm/components/layout/Flex/Flex.js +149 -0
- package/dist/esm/components/layout/Flex/Flex.js.map +1 -0
- package/dist/esm/components/layout/Grid/Grid.js +118 -0
- package/dist/esm/components/layout/Grid/Grid.js.map +1 -0
- package/dist/esm/components/layout/PanelSurface/PanelSurface.js +106 -0
- package/dist/esm/components/layout/PanelSurface/PanelSurface.js.map +1 -0
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js +362 -0
- package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -0
- package/dist/esm/components/layout/Spacer/Spacer.js +78 -0
- package/dist/esm/components/layout/Spacer/Spacer.js.map +1 -0
- package/dist/esm/components/layout/SplitPane/SplitPane.js +581 -0
- package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -0
- package/dist/esm/components/layout/SplitPane/SplitPanePanel.js +29 -0
- package/dist/esm/components/layout/SplitPane/SplitPanePanel.js.map +1 -0
- package/dist/esm/components/layout/Stack/Stack.js +138 -0
- package/dist/esm/components/layout/Stack/Stack.js.map +1 -0
- package/dist/esm/components/navigation/ContextMenu/ContextMenu.js +45 -0
- package/dist/esm/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js +52 -0
- package/dist/esm/components/navigation/ContextMenu/useContextMenuTarget.js.map +1 -0
- package/dist/esm/components/navigation/Menu/Menu.helpers.js +52 -0
- package/dist/esm/components/navigation/Menu/Menu.helpers.js.map +1 -0
- package/dist/esm/components/navigation/Menu/Menu.js +80 -0
- package/dist/esm/components/navigation/Menu/Menu.js.map +1 -0
- package/dist/esm/components/navigation/Menu/Menu.styled.js +83 -0
- package/dist/esm/components/navigation/Menu/Menu.styled.js.map +1 -0
- package/dist/esm/components/navigation/Menu/useMenu.js +87 -0
- package/dist/esm/components/navigation/Menu/useMenu.js.map +1 -0
- package/dist/esm/components/navigation/Tabs/Tab.js +222 -0
- package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -0
- package/dist/esm/components/navigation/Tabs/TabList.js +115 -0
- package/dist/esm/components/navigation/Tabs/TabList.js.map +1 -0
- package/dist/esm/components/navigation/Tabs/TabPanel.js +32 -0
- package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -0
- package/dist/esm/components/navigation/Tabs/Tabs.js +77 -0
- package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -0
- package/dist/esm/components/primitives/BaseButton/BaseButton.js +17 -0
- package/dist/esm/components/primitives/BaseButton/BaseButton.js.map +1 -0
- package/dist/esm/components/primitives/Button/Button.js +183 -0
- package/dist/esm/components/primitives/Button/Button.js.map +1 -0
- package/dist/esm/components/primitives/Checkbox/Checkbox.js +205 -0
- package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -0
- package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js +71 -0
- package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js.map +1 -0
- package/dist/esm/components/primitives/Collapsible/Collapsible.js +116 -0
- package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -0
- package/dist/esm/components/primitives/Icon/Icon.js +63 -0
- package/dist/esm/components/primitives/Icon/Icon.js.map +1 -0
- package/dist/esm/components/primitives/IconButton/IconButton.js +222 -0
- package/dist/esm/components/primitives/IconButton/IconButton.js.map +1 -0
- package/dist/esm/components/primitives/Input/Input.js +133 -0
- package/dist/esm/components/primitives/Input/Input.js.map +1 -0
- package/dist/esm/components/primitives/Paper/Paper.js +146 -0
- package/dist/esm/components/primitives/Paper/Paper.js.map +1 -0
- package/dist/esm/components/primitives/Popover/Popover.js +121 -0
- package/dist/esm/components/primitives/Popover/Popover.js.map +1 -0
- package/dist/esm/components/primitives/Popover/PopoverClose.js +50 -0
- package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -0
- package/dist/esm/components/primitives/Popover/PopoverContent.js +102 -0
- package/dist/esm/components/primitives/Popover/PopoverContent.js.map +1 -0
- package/dist/esm/components/primitives/Popover/PopoverTrigger.js +37 -0
- package/dist/esm/components/primitives/Popover/PopoverTrigger.js.map +1 -0
- package/dist/esm/components/primitives/Switch/Switch.js +170 -0
- package/dist/esm/components/primitives/Switch/Switch.js.map +1 -0
- package/dist/esm/components/primitives/Text/Text.js +166 -0
- package/dist/esm/components/primitives/Text/Text.js.map +1 -0
- package/dist/esm/components/primitives/Tooltip/Arrow.js +52 -0
- package/dist/esm/components/primitives/Tooltip/Arrow.js.map +1 -0
- package/dist/esm/components/primitives/Tooltip/Tooltip.js +219 -0
- package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/components/primitives/Tooltip/utils.js +66 -0
- package/dist/esm/components/primitives/Tooltip/utils.js.map +1 -0
- package/dist/esm/components/shell/AppShell/AppShell.js +157 -0
- package/dist/esm/components/shell/AppShell/AppShell.js.map +1 -0
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js +236 -0
- package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -0
- package/dist/esm/components/shell/MenuBar/MenuBar.js +340 -0
- package/dist/esm/components/shell/MenuBar/MenuBar.js.map +1 -0
- package/dist/esm/components/shell/StatusBar/StatusBar.js +134 -0
- package/dist/esm/components/shell/StatusBar/StatusBar.js.map +1 -0
- package/dist/esm/components/shell/Toolbar/Toolbar.js +185 -0
- package/dist/esm/components/shell/Toolbar/Toolbar.js.map +1 -0
- package/dist/esm/context/KeyboardContext.js +14 -0
- package/dist/esm/context/KeyboardContext.js.map +1 -0
- package/dist/esm/index.js +78 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/palettes.js +4 -0
- package/dist/esm/palettes.js.map +1 -0
- package/dist/esm/theme/ThemeProvider.js +12 -0
- package/dist/esm/theme/ThemeProvider.js.map +1 -0
- package/dist/esm/theme/createTheme.js +10 -0
- package/dist/esm/theme/createTheme.js.map +1 -0
- package/dist/esm/theme/tokens.js +144 -0
- package/dist/esm/theme/tokens.js.map +1 -0
- package/dist/esm/utils/cn.js +6 -0
- package/dist/esm/utils/cn.js.map +1 -0
- package/dist/esm/utils/mathExpression.js +275 -0
- package/dist/esm/utils/mathExpression.js.map +1 -0
- package/dist/esm/utils/mathUtils.js +18 -0
- package/dist/esm/utils/mathUtils.js.map +1 -0
- package/dist/esm/utils/objects.js +22 -0
- package/dist/esm/utils/objects.js.map +1 -0
- package/dist/esm/utils/styledUtils.js +81 -0
- package/dist/esm/utils/styledUtils.js.map +1 -0
- package/dist/types/components/controls/ColorPicker/ColorPalette.d.ts +16 -0
- package/dist/types/components/controls/ColorPicker/ColorPicker.d.ts +6 -0
- package/dist/types/components/controls/ColorPicker/ColorPicker.types.d.ts +120 -0
- package/dist/types/components/controls/ColorPicker/ColorSwatch.d.ts +6 -0
- package/dist/types/components/controls/ColorPicker/EyeDropper.d.ts +28 -0
- package/dist/types/components/controls/ColorPicker/colorUtils.d.ts +3 -0
- package/dist/types/components/controls/ColorPicker/palettes/material.d.ts +24 -0
- package/dist/types/components/controls/ColorPicker/palettes/professional.d.ts +19 -0
- package/dist/types/components/controls/ColorPicker/palettes/tailwind.d.ts +12 -0
- package/dist/types/components/controls/CurveEditor/CurveEditor.d.ts +6 -0
- package/dist/types/components/controls/CurveEditor/CurveEditor.types.d.ts +297 -0
- package/dist/types/components/controls/CurveEditor/curvePresets.d.ts +5 -0
- package/dist/types/components/controls/CurveEditor/curveUtils.d.ts +28 -0
- package/dist/types/components/controls/NumberInput/NumberInput.d.ts +150 -0
- package/dist/types/components/controls/NumberInput/useNumberInput.d.ts +65 -0
- package/dist/types/components/controls/Select/Select.d.ts +29 -0
- package/dist/types/components/controls/Select/Select.types.d.ts +131 -0
- package/dist/types/components/controls/Slider/Slider.d.ts +178 -0
- package/dist/types/components/controls/TreeView/TreeView.d.ts +27 -0
- package/dist/types/components/controls/TreeView/TreeView.types.d.ts +135 -0
- package/dist/types/components/controls/VectorInput/VectorInput.d.ts +26 -0
- package/dist/types/components/controls/VectorInput/VectorInput.types.d.ts +158 -0
- package/dist/types/components/editor/PropertyInspector/PropertyGroup.d.ts +6 -0
- package/dist/types/components/editor/PropertyInspector/PropertyInspector.types.d.ts +238 -0
- package/dist/types/components/editor/PropertyInspector/PropertyPanel.d.ts +6 -0
- package/dist/types/components/editor/PropertyInspector/PropertyRow.d.ts +6 -0
- package/dist/types/components/editor/PropertyInspector/PropertySection.d.ts +6 -0
- package/dist/types/components/editor/PropertyInspector/usePropertyUndo.d.ts +9 -0
- package/dist/types/components/feedback/Dialog/Dialog.d.ts +25 -0
- package/dist/types/components/feedback/Dialog/Dialog.types.d.ts +55 -0
- package/dist/types/components/feedback/Dialog/DialogBody.d.ts +16 -0
- package/dist/types/components/feedback/Dialog/DialogClose.d.ts +21 -0
- package/dist/types/components/feedback/Dialog/DialogFooter.d.ts +17 -0
- package/dist/types/components/feedback/Dialog/DialogHeader.d.ts +17 -0
- package/dist/types/components/feedback/Toast/Toast.types.d.ts +39 -0
- package/dist/types/components/feedback/Toast/ToastProvider.d.ts +19 -0
- package/dist/types/components/feedback/Toast/useToast.d.ts +22 -0
- package/dist/types/components/form/FormHelperText.d.ts +321 -0
- package/dist/types/components/form/FormLabel.d.ts +331 -0
- package/dist/types/components/form/InputWrapper.d.ts +346 -0
- package/dist/types/components/layout/Accordion/Accordion.d.ts +23 -0
- package/dist/types/components/layout/Accordion/Accordion.types.d.ts +109 -0
- package/dist/types/components/layout/Accordion/AccordionContent.d.ts +6 -0
- package/dist/types/components/layout/Accordion/AccordionItem.d.ts +6 -0
- package/dist/types/components/layout/Accordion/AccordionTrigger.d.ts +6 -0
- package/dist/types/components/layout/Flex/Flex.d.ts +215 -0
- package/dist/types/components/layout/Grid/Grid.d.ts +113 -0
- package/dist/types/components/layout/PanelSurface/PanelSurface.d.ts +1153 -0
- package/dist/types/components/layout/PanelSurface/PanelSurface.types.d.ts +64 -0
- package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts +6 -0
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +93 -0
- package/dist/types/components/layout/Spacer/Spacer.d.ts +329 -0
- package/dist/types/components/layout/SplitPane/SplitPane.d.ts +21 -0
- package/dist/types/components/layout/SplitPane/SplitPane.types.d.ts +87 -0
- package/dist/types/components/layout/SplitPane/SplitPanePanel.d.ts +20 -0
- package/dist/types/components/layout/Stack/Stack.d.ts +166 -0
- package/dist/types/components/navigation/ContextMenu/ContextMenu.d.ts +6 -0
- package/dist/types/components/navigation/ContextMenu/ContextMenu.types.d.ts +74 -0
- package/dist/types/components/navigation/ContextMenu/useContextMenuTarget.d.ts +5 -0
- package/dist/types/components/navigation/Menu/Menu.d.ts +42 -0
- package/dist/types/components/navigation/Menu/Menu.types.d.ts +94 -0
- package/dist/types/components/navigation/Menu/useMenu.d.ts +16 -0
- package/dist/types/components/navigation/Tabs/Tab.d.ts +6 -0
- package/dist/types/components/navigation/Tabs/TabList.d.ts +6 -0
- package/dist/types/components/navigation/Tabs/TabPanel.d.ts +6 -0
- package/dist/types/components/navigation/Tabs/Tabs.d.ts +23 -0
- package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +117 -0
- package/dist/types/components/primitives/Button/Button.d.ts +392 -0
- package/dist/types/components/primitives/Checkbox/Checkbox.d.ts +20 -0
- package/dist/types/components/primitives/Checkbox/Checkbox.types.d.ts +156 -0
- package/dist/types/components/primitives/Checkbox/CheckboxGroup.d.ts +25 -0
- package/dist/types/components/primitives/Collapsible/Collapsible.d.ts +6 -0
- package/dist/types/components/primitives/Collapsible/Collapsible.types.d.ts +28 -0
- package/dist/types/components/primitives/Icon/Icon.d.ts +40 -0
- package/dist/types/components/primitives/IconButton/IconButton.d.ts +354 -0
- package/dist/types/components/primitives/Input/Input.d.ts +134 -0
- package/dist/types/components/primitives/Paper/Paper.d.ts +419 -0
- package/dist/types/components/primitives/Popover/Popover.d.ts +25 -0
- package/dist/types/components/primitives/Popover/Popover.types.d.ts +99 -0
- package/dist/types/components/primitives/Popover/PopoverClose.d.ts +6 -0
- package/dist/types/components/primitives/Popover/PopoverContent.d.ts +6 -0
- package/dist/types/components/primitives/Popover/PopoverTrigger.d.ts +10 -0
- package/dist/types/components/primitives/Switch/Switch.d.ts +78 -0
- package/dist/types/components/primitives/Text/Text.d.ts +442 -0
- package/dist/types/components/primitives/Tooltip/Tooltip.d.ts +175 -0
- package/dist/types/components/primitives/Tooltip/types.d.ts +82 -0
- package/dist/types/components/shell/AppShell/AppShell.d.ts +1437 -0
- package/dist/types/components/shell/AppShell/AppShell.types.d.ts +48 -0
- package/dist/types/components/shell/FloatingPanel/FloatingPanel.d.ts +7 -0
- package/dist/types/components/shell/FloatingPanel/FloatingPanel.types.d.ts +61 -0
- package/dist/types/components/shell/MenuBar/MenuBar.d.ts +1441 -0
- package/dist/types/components/shell/MenuBar/MenuBar.types.d.ts +48 -0
- package/dist/types/components/shell/StatusBar/StatusBar.d.ts +868 -0
- package/dist/types/components/shell/StatusBar/StatusBar.types.d.ts +40 -0
- package/dist/types/components/shell/Toolbar/Toolbar.d.ts +1728 -0
- package/dist/types/components/shell/Toolbar/Toolbar.types.d.ts +59 -0
- package/dist/types/index.d.ts +101 -0
- package/dist/types/palettes.d.ts +3 -0
- package/dist/types/theme/ThemeProvider.d.ts +11 -0
- package/dist/types/theme/createTheme.d.ts +6 -0
- package/dist/types/theme/tokens.d.ts +147 -0
- package/dist/types/theme/types.d.ts +7 -0
- package/dist/types/types/common.d.ts +24 -0
- package/dist/types/types/utilities.d.ts +72 -0
- package/dist/types/utils/cn.d.ts +3 -0
- package/package.json +23 -7
- package/dist/index.d.ts +0 -12
- package/dist/index.esm.js +0 -13962
- package/dist/index.esm.js.map +0 -1
- package/dist/index.js +0 -14048
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback, useMemo, createContext, useContext } from 'react';
|
|
3
|
+
import styled from '@emotion/styled';
|
|
4
|
+
import { processCss } from '../../../utils/styledUtils.js';
|
|
5
|
+
import { ScrollArea } from '../../layout/ScrollArea/ScrollArea.js';
|
|
6
|
+
|
|
7
|
+
// --- Context ---
|
|
8
|
+
const PropertyPanelContext =
|
|
9
|
+
/*#__PURE__*/ createContext(null);
|
|
10
|
+
/**
|
|
11
|
+
* Returns the PropertyPanel context value, or null if not inside a PropertyPanel.
|
|
12
|
+
* Child components use this to inherit size and search query from the panel.
|
|
13
|
+
*/
|
|
14
|
+
function usePropertyPanelContext() {
|
|
15
|
+
return useContext(PropertyPanelContext);
|
|
16
|
+
}
|
|
17
|
+
const SEARCH_SIZE_MAP = {
|
|
18
|
+
sm: { height: 20, fontKey: 'md', paddingKey: 'sm' },
|
|
19
|
+
md: { height: 24, fontKey: 'md', paddingKey: 'md' },
|
|
20
|
+
lg: { height: 28, fontKey: 'lg', paddingKey: 'md' },
|
|
21
|
+
};
|
|
22
|
+
const StyledPanelRoot = styled.div `
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
height: 100%;
|
|
26
|
+
background: ${props => props.theme.colors.background.primary};
|
|
27
|
+
color: ${props => props.theme.colors.text.primary};
|
|
28
|
+
font-family: ${props => props.theme.typography.fontFamily.sans};
|
|
29
|
+
|
|
30
|
+
${props => processCss(props.$css, props.theme)}
|
|
31
|
+
`;
|
|
32
|
+
const StyledPanelHeader = styled.div `
|
|
33
|
+
flex-shrink: 0;
|
|
34
|
+
border-bottom: 1px solid ${props => props.theme.colors.border.default};
|
|
35
|
+
`;
|
|
36
|
+
const StyledSearchWrapper = styled.div `
|
|
37
|
+
padding: ${props => props.theme.spacing.sm}px
|
|
38
|
+
${props => props.theme.spacing.md}px;
|
|
39
|
+
`;
|
|
40
|
+
const StyledSearchInput = styled.input `
|
|
41
|
+
width: 100%;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
border: 1px solid ${props => props.theme.colors.border.default};
|
|
44
|
+
border-radius: ${props => props.theme.borderRadius.md}px;
|
|
45
|
+
background: ${props => props.theme.colors.surface.default};
|
|
46
|
+
color: ${props => props.theme.colors.text.primary};
|
|
47
|
+
height: ${props => SEARCH_SIZE_MAP[props.$size].height}px;
|
|
48
|
+
font-size: ${props => props.theme.typography.fontSize[SEARCH_SIZE_MAP[props.$size].fontKey]}px;
|
|
49
|
+
padding: 0
|
|
50
|
+
${props => props.theme.spacing[SEARCH_SIZE_MAP[props.$size].paddingKey]}px;
|
|
51
|
+
font-family: inherit;
|
|
52
|
+
outline: none;
|
|
53
|
+
transition:
|
|
54
|
+
border-color ${props => props.theme.transitions.fast},
|
|
55
|
+
box-shadow ${props => props.theme.transitions.fast};
|
|
56
|
+
|
|
57
|
+
&:focus {
|
|
58
|
+
border-color: ${props => props.theme.colors.border.focus};
|
|
59
|
+
box-shadow: ${props => props.theme.shadows.focus};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&::placeholder {
|
|
63
|
+
color: ${props => props.theme.colors.text.muted};
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
const StyledPanelContent = styled.div `
|
|
67
|
+
flex: 1;
|
|
68
|
+
min-height: 0;
|
|
69
|
+
padding: ${props => props.$contentTopSpacing ?? props.theme.spacing.sm}px
|
|
70
|
+
${props => props.theme.spacing.md}px
|
|
71
|
+
${props => props.$contentBottomSpacing ?? props.theme.spacing.md}px;
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
`;
|
|
74
|
+
const StyledPanelFooter = styled.div `
|
|
75
|
+
flex-shrink: 0;
|
|
76
|
+
border-top: 1px solid ${props => props.theme.colors.border.default};
|
|
77
|
+
`;
|
|
78
|
+
// --- Component ---
|
|
79
|
+
const PropertyPanel = ({ children, header, footer, size = 'md', maxHeight, searchable = false, searchPlaceholder = 'Search properties...', onSearchChange, contentTopSpacing, contentBottomSpacing, css, className, style, testId, ref, ...rest }) => {
|
|
80
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
81
|
+
const handleSearchChange = useCallback((e) => {
|
|
82
|
+
const query = e.target.value;
|
|
83
|
+
setSearchQuery(query);
|
|
84
|
+
onSearchChange?.(query);
|
|
85
|
+
}, [onSearchChange]);
|
|
86
|
+
const contextValue = useMemo(() => ({
|
|
87
|
+
size,
|
|
88
|
+
searchQuery: searchQuery.toLowerCase(),
|
|
89
|
+
}), [size, searchQuery]);
|
|
90
|
+
const hasHeader = header != null || searchable;
|
|
91
|
+
const hasFooter = footer != null;
|
|
92
|
+
const content = (jsx(StyledPanelContent, { "$contentTopSpacing": contentTopSpacing, "$contentBottomSpacing": contentBottomSpacing, children: children }));
|
|
93
|
+
return (jsx(PropertyPanelContext.Provider, { value: contextValue, children: jsxs(StyledPanelRoot, { ref: ref, role: "region", "aria-label": "Properties", "$css": css, className: className, style: style, "data-testid": testId, ...rest, children: [hasHeader && (jsxs(StyledPanelHeader, { children: [header, searchable && (jsx(StyledSearchWrapper, { children: jsx(StyledSearchInput, { type: "search", role: "searchbox", "aria-label": "Search properties", placeholder: searchPlaceholder, value: searchQuery, onChange: handleSearchChange, "$size": size }) }))] })), maxHeight != null ? (jsx(ScrollArea, { maxHeight: maxHeight, direction: "vertical", scrollbarVisibility: "auto", fadeMask: true, children: content })) : (content), hasFooter && jsx(StyledPanelFooter, { children: footer })] }) }));
|
|
94
|
+
};
|
|
95
|
+
PropertyPanel.displayName = 'PropertyPanel';
|
|
96
|
+
|
|
97
|
+
export { PropertyPanel, PropertyPanelContext, usePropertyPanelContext };
|
|
98
|
+
//# sourceMappingURL=PropertyPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPanel.js","sources":["../../../../../../src/components/editor/PropertyInspector/PropertyPanel.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import styled from '@emotion/styled';
|
|
4
|
+
import { Tooltip } from '../../primitives/Tooltip/Tooltip.js';
|
|
5
|
+
import { processCss } from '../../../utils/styledUtils.js';
|
|
6
|
+
import { usePropertyPanelContext } from './PropertyPanel.js';
|
|
7
|
+
|
|
8
|
+
const ROW_SIZE_MAP = {
|
|
9
|
+
sm: {
|
|
10
|
+
minHeight: 22,
|
|
11
|
+
paddingVKey: 'xs',
|
|
12
|
+
paddingHKey: 'sm',
|
|
13
|
+
fontKey: 'md',
|
|
14
|
+
resetIconSize: 10,
|
|
15
|
+
},
|
|
16
|
+
md: {
|
|
17
|
+
minHeight: 26,
|
|
18
|
+
paddingVKey: 'xs',
|
|
19
|
+
paddingHKey: 'md',
|
|
20
|
+
fontKey: 'md',
|
|
21
|
+
resetIconSize: 12,
|
|
22
|
+
},
|
|
23
|
+
lg: {
|
|
24
|
+
minHeight: 30,
|
|
25
|
+
paddingVKey: 'sm',
|
|
26
|
+
paddingHKey: 'lg',
|
|
27
|
+
fontKey: 'lg',
|
|
28
|
+
resetIconSize: 14,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
// --- Reset icon ---
|
|
32
|
+
const ResetIcon = ({ size }) => (jsxs("svg", { width: size, height: size, viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: [jsx("path", { d: "M2 4.5h6.5a2 2 0 0 1 0 4H6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), jsx("path", { d: "M4 2.5L2 4.5L4 6.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] }));
|
|
33
|
+
// --- Styled ---
|
|
34
|
+
const RESET_BUTTON_CLASS = 'property-row-reset';
|
|
35
|
+
const StyledRowRoot = styled.div `
|
|
36
|
+
display: ${props => props.$visible ? (props.$fullWidth ? 'flex' : 'flex') : 'none'};
|
|
37
|
+
flex-direction: ${props => (props.$fullWidth ? 'column' : 'row')};
|
|
38
|
+
align-items: ${props => (props.$fullWidth ? 'stretch' : 'center')};
|
|
39
|
+
position: relative;
|
|
40
|
+
min-height: ${props => ROW_SIZE_MAP[props.$size].minHeight}px;
|
|
41
|
+
padding: 2px 8px;
|
|
42
|
+
opacity: ${props => (props.$disabled ? 0.5 : 1)};
|
|
43
|
+
pointer-events: ${props => (props.$disabled ? 'none' : 'auto')};
|
|
44
|
+
transition: background ${props => props.theme.transitions.fast};
|
|
45
|
+
|
|
46
|
+
&:hover {
|
|
47
|
+
background: ${props => props.theme.colors.surface.hover};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&:hover .${RESET_BUTTON_CLASS} {
|
|
51
|
+
opacity: 1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
${props => processCss(props.$css, props.theme)}
|
|
55
|
+
`;
|
|
56
|
+
const StyledRowLabel = styled.div `
|
|
57
|
+
flex: 0 0 ${props => props.$splitRatio}%;
|
|
58
|
+
box-sizing: border-box;
|
|
59
|
+
min-width: 0;
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
font-size: ${props => props.theme.typography.fontSize[ROW_SIZE_MAP[props.$size].fontKey]}px;
|
|
63
|
+
color: ${props => props.theme.colors.text.secondary};
|
|
64
|
+
font-weight: ${props => props.$modified
|
|
65
|
+
? props.theme.typography.fontWeight.medium
|
|
66
|
+
: props.theme.typography.fontWeight.normal};
|
|
67
|
+
overflow: hidden;
|
|
68
|
+
text-overflow: ellipsis;
|
|
69
|
+
white-space: nowrap;
|
|
70
|
+
user-select: none;
|
|
71
|
+
padding-right: ${props => props.theme.spacing.md}px;
|
|
72
|
+
`;
|
|
73
|
+
const StyledFullWidthLabel = styled.div `
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
font-size: ${props => props.theme.typography.fontSize[ROW_SIZE_MAP[props.$size].fontKey]}px;
|
|
77
|
+
color: ${props => props.theme.colors.text.secondary};
|
|
78
|
+
font-weight: ${props => props.$modified
|
|
79
|
+
? props.theme.typography.fontWeight.medium
|
|
80
|
+
: props.theme.typography.fontWeight.normal};
|
|
81
|
+
margin-bottom: ${props => props.theme.spacing.xs}px;
|
|
82
|
+
user-select: none;
|
|
83
|
+
`;
|
|
84
|
+
const StyledModifiedDot = styled.span `
|
|
85
|
+
width: 4px;
|
|
86
|
+
height: 4px;
|
|
87
|
+
border-radius: 50%;
|
|
88
|
+
background: ${props => props.theme.colors.accent.primary};
|
|
89
|
+
margin-right: ${props => props.theme.spacing.xs}px;
|
|
90
|
+
flex-shrink: 0;
|
|
91
|
+
`;
|
|
92
|
+
const StyledRowControl = styled.div `
|
|
93
|
+
flex: 0 0 ${props => props.$splitRatio}%;
|
|
94
|
+
box-sizing: border-box;
|
|
95
|
+
display: flex;
|
|
96
|
+
align-items: center;
|
|
97
|
+
min-width: 0;
|
|
98
|
+
padding-right: ${props => props.theme.spacing.xs}px;
|
|
99
|
+
`;
|
|
100
|
+
const StyledFullWidthControl = styled.div `
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: stretch;
|
|
103
|
+
width: 100%;
|
|
104
|
+
flex: 1 1 auto;
|
|
105
|
+
min-width: 0;
|
|
106
|
+
padding-right: ${props => props.theme.spacing.xs}px;
|
|
107
|
+
`;
|
|
108
|
+
const StyledResetButton = styled.span `
|
|
109
|
+
position: absolute;
|
|
110
|
+
right: ${props => props.theme.spacing.xs}px;
|
|
111
|
+
top: 50%;
|
|
112
|
+
transform: translateY(-50%);
|
|
113
|
+
opacity: 0;
|
|
114
|
+
cursor: pointer;
|
|
115
|
+
display: flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
justify-content: center;
|
|
118
|
+
width: 16px;
|
|
119
|
+
height: 16px;
|
|
120
|
+
border-radius: ${props => props.theme.borderRadius.sm}px;
|
|
121
|
+
color: ${props => props.theme.colors.text.muted};
|
|
122
|
+
transition:
|
|
123
|
+
opacity ${props => props.theme.transitions.fast},
|
|
124
|
+
color ${props => props.theme.transitions.fast},
|
|
125
|
+
background ${props => props.theme.transitions.fast};
|
|
126
|
+
|
|
127
|
+
&:hover {
|
|
128
|
+
color: ${props => props.theme.colors.text.primary};
|
|
129
|
+
background: ${props => props.theme.colors.surface.active};
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
// --- Component ---
|
|
133
|
+
const PropertyRow = ({ label, tooltip, children, fullWidth = false, splitRatio = [40, 60], modified = false, disabled = false, visible = true, size: sizeProp, action, onLabelContextMenu, onReset, css, className, style, testId, ref, ...rest }) => {
|
|
134
|
+
const panelCtx = usePropertyPanelContext();
|
|
135
|
+
const size = sizeProp ?? panelCtx?.size ?? 'md';
|
|
136
|
+
const sizeConfig = ROW_SIZE_MAP[size];
|
|
137
|
+
const handleResetClick = useCallback((e) => {
|
|
138
|
+
e.stopPropagation();
|
|
139
|
+
onReset?.();
|
|
140
|
+
}, [onReset]);
|
|
141
|
+
const modifiedDot = modified ? (jsx(StyledModifiedDot, { "aria-label": "Modified", "data-testid": "modified-dot" })) : null;
|
|
142
|
+
const labelText = jsx("span", { children: label });
|
|
143
|
+
const labelElement = tooltip ? (jsx(Tooltip, { title: tooltip, children: jsxs("span", { style: { display: 'contents' }, children: [modifiedDot, labelText] }) })) : (jsxs(Fragment, { children: [modifiedDot, labelText] }));
|
|
144
|
+
return (jsxs(StyledRowRoot, { ref: ref, "$disabled": disabled, "$visible": visible, "$fullWidth": fullWidth, "$size": size, "$css": css, className: className, style: style, "data-testid": testId, ...rest, children: [fullWidth ? (jsxs(Fragment, { children: [jsx(StyledFullWidthLabel, { "$modified": modified, "$size": size, onContextMenu: onLabelContextMenu, children: labelElement }), jsx(StyledFullWidthControl, { children: children })] })) : (jsxs(Fragment, { children: [jsx(StyledRowLabel, { "$splitRatio": splitRatio[0], "$modified": modified, "$size": size, onContextMenu: onLabelContextMenu, children: labelElement }), jsx(StyledRowControl, { "$splitRatio": splitRatio[1], children: children })] })), action, onReset && (jsx(StyledResetButton, { className: RESET_BUTTON_CLASS, role: "button", tabIndex: 0, "aria-label": "Reset to default", onClick: handleResetClick, onKeyDown: (e) => {
|
|
145
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
onReset();
|
|
148
|
+
}
|
|
149
|
+
}, "data-testid": "reset-button", children: jsx(ResetIcon, { size: sizeConfig.resetIconSize }) }))] }));
|
|
150
|
+
};
|
|
151
|
+
PropertyRow.displayName = 'PropertyRow';
|
|
152
|
+
|
|
153
|
+
export { PropertyRow };
|
|
154
|
+
//# sourceMappingURL=PropertyRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyRow.js","sources":["../../../../../../src/components/editor/PropertyInspector/PropertyRow.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useId, useState, useCallback } from 'react';
|
|
3
|
+
import styled from '@emotion/styled';
|
|
4
|
+
import { usePropertyPanelContext } from './PropertyPanel.js';
|
|
5
|
+
|
|
6
|
+
const TRIGGER_SIZE_MAP = {
|
|
7
|
+
sm: { height: 24, paddingKey: 'sm', fontKey: 'md', chevronSize: 10 },
|
|
8
|
+
md: { height: 28, paddingKey: 'md', fontKey: 'md', chevronSize: 12 },
|
|
9
|
+
lg: { height: 32, paddingKey: 'lg', fontKey: 'lg', chevronSize: 14 },
|
|
10
|
+
};
|
|
11
|
+
// --- Chevron icon ---
|
|
12
|
+
const ChevronRightIcon = ({ size }) => (jsx("svg", { width: size, height: size, viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: jsx("path", { d: "M4.5 3L7.5 6L4.5 9", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
13
|
+
// --- Styled ---
|
|
14
|
+
const StyledSectionRoot = styled.div `
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
background: ${props => props.theme.colors.background.secondary};
|
|
18
|
+
border: 1px solid ${props => props.theme.colors.border.default};
|
|
19
|
+
border-radius: ${props => props.theme.borderRadius.md}px;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
|
|
22
|
+
& + & {
|
|
23
|
+
margin-top: ${props => props.theme.spacing.sm}px;
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
const StyledSectionTrigger = styled.button `
|
|
27
|
+
/* Reset */
|
|
28
|
+
margin: 0;
|
|
29
|
+
border: none;
|
|
30
|
+
font-family: inherit;
|
|
31
|
+
outline: none;
|
|
32
|
+
user-select: none;
|
|
33
|
+
width: 100%;
|
|
34
|
+
text-align: left;
|
|
35
|
+
|
|
36
|
+
/* Layout */
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: ${props => props.theme.spacing.sm}px;
|
|
40
|
+
|
|
41
|
+
/* Sizing */
|
|
42
|
+
height: ${props => TRIGGER_SIZE_MAP[props.$size].height}px;
|
|
43
|
+
padding: 0
|
|
44
|
+
${props => props.theme.spacing[TRIGGER_SIZE_MAP[props.$size].paddingKey]}px;
|
|
45
|
+
font-size: ${props => props.theme.typography.fontSize[TRIGGER_SIZE_MAP[props.$size].fontKey]}px;
|
|
46
|
+
font-weight: ${props => props.theme.typography.fontWeight.medium};
|
|
47
|
+
|
|
48
|
+
/* Colors */
|
|
49
|
+
background: ${props => props.theme.colors.surface.default};
|
|
50
|
+
color: ${props => props.theme.colors.text.primary};
|
|
51
|
+
border-bottom: ${props => props.$expanded
|
|
52
|
+
? `1px solid ${props.theme.colors.border.default}`
|
|
53
|
+
: 'none'};
|
|
54
|
+
cursor: ${props => (props.$disabled ? 'not-allowed' : 'pointer')};
|
|
55
|
+
opacity: ${props => (props.$disabled ? 0.5 : 1)};
|
|
56
|
+
transition: background ${props => props.theme.transitions.fast};
|
|
57
|
+
|
|
58
|
+
&:hover:not(:disabled) {
|
|
59
|
+
background: ${props => props.theme.colors.surface.hover};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&:focus-visible {
|
|
63
|
+
box-shadow: ${props => props.theme.shadows.focus};
|
|
64
|
+
z-index: 1;
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
const StyledChevron = styled.span `
|
|
68
|
+
display: flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
flex-shrink: 0;
|
|
72
|
+
transition: transform ${props => props.theme.transitions.fast};
|
|
73
|
+
transform: rotate(${props => (props.$expanded ? '90deg' : '0deg')});
|
|
74
|
+
color: ${props => props.theme.colors.text.muted};
|
|
75
|
+
|
|
76
|
+
svg {
|
|
77
|
+
width: ${props => props.$size}px;
|
|
78
|
+
height: ${props => props.$size}px;
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
const StyledIconArea = styled.span `
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
flex-shrink: 0;
|
|
85
|
+
`;
|
|
86
|
+
const StyledSectionLabel = styled.span `
|
|
87
|
+
flex: 1;
|
|
88
|
+
overflow: hidden;
|
|
89
|
+
text-overflow: ellipsis;
|
|
90
|
+
white-space: nowrap;
|
|
91
|
+
`;
|
|
92
|
+
const StyledActionsArea = styled.span `
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
margin-left: auto;
|
|
96
|
+
gap: ${props => props.theme.spacing.xs}px;
|
|
97
|
+
`;
|
|
98
|
+
const StyledContentWrapper = styled.div `
|
|
99
|
+
display: grid;
|
|
100
|
+
grid-template-rows: ${props => (props.$expanded ? '1fr' : '0fr')};
|
|
101
|
+
transition: grid-template-rows ${props => props.theme.transitions.normal};
|
|
102
|
+
`;
|
|
103
|
+
const StyledContentInner = styled.div `
|
|
104
|
+
overflow: hidden;
|
|
105
|
+
min-height: 0;
|
|
106
|
+
`;
|
|
107
|
+
// --- Component ---
|
|
108
|
+
const PropertySection = ({ title, icon, actions, expanded: expandedProp, defaultExpanded = true, onExpandedChange, keepMounted = false, disabled = false, size: sizeProp, indicator, onContextMenu, children, className, style, css, testId, ref, ...rest }) => {
|
|
109
|
+
const autoId = useId();
|
|
110
|
+
const triggerId = `property-section-${autoId}-trigger`;
|
|
111
|
+
const contentId = `property-section-${autoId}-content`;
|
|
112
|
+
const panelCtx = usePropertyPanelContext();
|
|
113
|
+
const size = sizeProp ?? panelCtx?.size ?? 'md';
|
|
114
|
+
const sizeConfig = TRIGGER_SIZE_MAP[size];
|
|
115
|
+
const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
|
|
116
|
+
const isControlled = expandedProp !== undefined;
|
|
117
|
+
const resolvedExpanded = isControlled ? expandedProp : internalExpanded;
|
|
118
|
+
const handleToggle = useCallback(() => {
|
|
119
|
+
if (disabled)
|
|
120
|
+
return;
|
|
121
|
+
const nextExpanded = !resolvedExpanded;
|
|
122
|
+
if (!isControlled) {
|
|
123
|
+
setInternalExpanded(nextExpanded);
|
|
124
|
+
}
|
|
125
|
+
onExpandedChange?.(nextExpanded);
|
|
126
|
+
}, [disabled, resolvedExpanded, isControlled, onExpandedChange]);
|
|
127
|
+
const handleActionsClick = useCallback((e) => {
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
}, []);
|
|
130
|
+
const showIndicator = indicator !== null;
|
|
131
|
+
return (jsxs(StyledSectionRoot, { ref: ref, className: className, style: style, "data-testid": testId, ...rest, children: [jsxs(StyledSectionTrigger, { type: "button", id: triggerId, "aria-expanded": resolvedExpanded, "aria-controls": contentId, "aria-disabled": disabled || undefined, disabled: disabled, onClick: handleToggle, onContextMenu: onContextMenu, "$size": size, "$disabled": disabled, "$expanded": resolvedExpanded, "$css": css, children: [showIndicator && (jsx(StyledChevron, { "$expanded": resolvedExpanded, "$size": sizeConfig.chevronSize, children: indicator ?? jsx(ChevronRightIcon, { size: sizeConfig.chevronSize }) })), icon && jsx(StyledIconArea, { children: icon }), jsx(StyledSectionLabel, { children: title }), actions && (jsx(StyledActionsArea, { onClick: handleActionsClick, children: actions }))] }), (resolvedExpanded || keepMounted) && (jsx(StyledContentWrapper, { "$expanded": resolvedExpanded, role: "region", id: contentId, "aria-labelledby": triggerId, hidden: !resolvedExpanded || undefined, children: jsx(StyledContentInner, { children: children }) }))] }));
|
|
132
|
+
};
|
|
133
|
+
PropertySection.displayName = 'PropertySection';
|
|
134
|
+
|
|
135
|
+
export { PropertySection };
|
|
136
|
+
//# sourceMappingURL=PropertySection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertySection.js","sources":["../../../../../../src/components/editor/PropertyInspector/PropertySection.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;AAkBA,MAAM,gBAAgB,GAAqD;AACzE,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;AACpE,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;AACpE,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;CACrE;AAED;AAEA,MAAM,gBAAgB,GAA+B,CAAC,EAAE,IAAI,EAAE,MAC5DA,GACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,iBACC,MAAM,EAAA,QAAA,EAElBA,GACE,CAAA,MAAA,EAAA,EAAA,CAAC,EAAC,oBAAoB,EACtB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EAAA,CACtB,EACE,CAAA,CACP;AAED;AAEA,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;gBAGpB,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAA;sBAC1C,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAA;mBAC7C,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAA;;;;kBAIrC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;;CAEhD;AASD,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAA2B;;;;;;;;;;;;;SAa5D,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;;;YAG5B,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;;AAEnD,IAAA,EAAA,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAA;AAC7D,aAAA,EAAA,KAAK,IAChB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;iBACzD,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAA;;;gBAGlD,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAA;WAChD,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAA;AAChC,iBAAA,EAAA,KAAK,IACpB,KAAK,CAAC;MACF,CAAa,UAAA,EAAA,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAE;AAClD,MAAE,MAAM,CAAA;AACF,UAAA,EAAA,KAAK,KAAK,KAAK,CAAC,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC,CAAA;AACrD,WAAA,EAAA,KAAK,KAAK,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC,CAAA;2BACtB,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA;;;kBAG9C,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAA;;;;kBAIzC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAA;;;CAGnD;AAOD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAoB;;;;;0BAK3B,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA;AACzC,oBAAA,EAAA,KAAK,KAAK,KAAK,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,CAAA;WACxD,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAA;;;AAGpC,WAAA,EAAA,KAAK,IAAI,KAAK,CAAC,KAAK,CAAA;AACnB,YAAA,EAAA,KAAK,IAAI,KAAK,CAAC,KAAK,CAAA;;CAEjC;AAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAA;;;;CAIjC;AAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAA;;;;;CAKrC;AAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAA;;;;SAI5B,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;CACvC;AAMD,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAA2B;;AAE1C,sBAAA,EAAA,KAAK,KAAK,KAAK,CAAC,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,CAAA;mCAC/B,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAA;CACzE;AAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA;;;CAGpC;AAED;AAEa,MAAA,eAAe,GAAmC,CAAC,EAC9D,KAAK,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EAAE,YAAY,EACtB,eAAe,GAAG,IAAI,EACtB,gBAAgB,EAChB,WAAW,GAAG,KAAK,EACnB,QAAQ,GAAG,KAAK,EAChB,IAAI,EAAE,QAAQ,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,EACH,MAAM,EACN,GAAG,EACH,GAAG,IAAI,EACR,KAAI;AACH,IAAA,MAAM,MAAM,GAAG,KAAK,EAAE;AACtB,IAAA,MAAM,SAAS,GAAG,CAAoB,iBAAA,EAAA,MAAM,UAAU;AACtD,IAAA,MAAM,SAAS,GAAG,CAAoB,iBAAA,EAAA,MAAM,UAAU;AAEtD,IAAA,MAAM,QAAQ,GAAG,uBAAuB,EAAE;IAC1C,MAAM,IAAI,GAAG,QAAQ,IAAI,QAAQ,EAAE,IAAI,IAAI,IAAI;AAC/C,IAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC;IAEzC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC;AACzE,IAAA,MAAM,YAAY,GAAG,YAAY,KAAK,SAAS;IAC/C,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB;AAEvE,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,MAAK;AACpC,QAAA,IAAI,QAAQ;YAAE;AAEd,QAAA,MAAM,YAAY,GAAG,CAAC,gBAAgB;QAEtC,IAAI,CAAC,YAAY,EAAE;YACjB,mBAAmB,CAAC,YAAY,CAAC;;AAGnC,QAAA,gBAAgB,GAAG,YAAY,CAAC;KACjC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAEhE,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAmB,KAAI;QAC7D,CAAC,CAAC,eAAe,EAAE;KACpB,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,aAAa,GAAG,SAAS,KAAK,IAAI;AAExC,IAAA,QACEC,IAAA,CAAC,iBAAiB,EAAA,EAChB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACC,aAAA,EAAA,MAAM,EACf,GAAA,IAAI,aAERA,IAAC,CAAA,oBAAoB,EACnB,EAAA,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,SAAS,EACE,eAAA,EAAA,gBAAgB,EAChB,eAAA,EAAA,SAAS,mBACT,QAAQ,IAAI,SAAS,EACpC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,aAAa,EAAA,OAAA,EACrB,IAAI,EAAA,WAAA,EACA,QAAQ,EACR,WAAA,EAAA,gBAAgB,EACrB,MAAA,EAAA,GAAG,aAER,aAAa,KACZD,GAAA,CAAC,aAAa,EACD,EAAA,WAAA,EAAA,gBAAgB,EACpB,OAAA,EAAA,UAAU,CAAC,WAAW,EAAA,QAAA,EAE5B,SAAS,IAAIA,IAAC,gBAAgB,EAAA,EAAC,IAAI,EAAE,UAAU,CAAC,WAAW,EAAA,CAAI,GAClD,CACjB,EACA,IAAI,IAAIA,IAAC,cAAc,EAAA,EAAA,QAAA,EAAE,IAAI,EAAA,CAAkB,EAChDA,GAAC,CAAA,kBAAkB,EAAE,EAAA,QAAA,EAAA,KAAK,GAAsB,EAC/C,OAAO,KACNA,IAAC,iBAAiB,EAAA,EAAC,OAAO,EAAE,kBAAkB,EAC3C,QAAA,EAAA,OAAO,EACU,CAAA,CACrB,IACoB,EAEtB,CAAC,gBAAgB,IAAI,WAAW,MAC/BA,IAAC,oBAAoB,EAAA,EAAA,WAAA,EACR,gBAAgB,EAC3B,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,SAAS,EAAA,iBAAA,EACI,SAAS,EAC1B,MAAM,EAAE,CAAC,gBAAgB,IAAI,SAAS,EAEtC,QAAA,EAAAA,GAAA,CAAC,kBAAkB,EAAA,EAAA,QAAA,EAAE,QAAQ,EAAsB,CAAA,EAAA,CAC9B,CACxB,CAAA,EAAA,CACiB;AAExB;AAEA,eAAe,CAAC,WAAW,GAAG,iBAAiB;;;;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { useReducer, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function undoReducer(state, action) {
|
|
4
|
+
switch (action.type) {
|
|
5
|
+
case 'RECORD': {
|
|
6
|
+
const newStack = [...state.undoStack, action.entry];
|
|
7
|
+
if (newStack.length > action.maxHistory) {
|
|
8
|
+
newStack.shift();
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
undoStack: newStack,
|
|
12
|
+
redoStack: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
case 'UNDO': {
|
|
16
|
+
if (state.undoStack.length === 0)
|
|
17
|
+
return state;
|
|
18
|
+
const entry = state.undoStack[state.undoStack.length - 1];
|
|
19
|
+
return {
|
|
20
|
+
undoStack: state.undoStack.slice(0, -1),
|
|
21
|
+
redoStack: [...state.redoStack, entry],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
case 'REDO': {
|
|
25
|
+
if (state.redoStack.length === 0)
|
|
26
|
+
return state;
|
|
27
|
+
const entry = state.redoStack[state.redoStack.length - 1];
|
|
28
|
+
return {
|
|
29
|
+
undoStack: [...state.undoStack, entry],
|
|
30
|
+
redoStack: state.redoStack.slice(0, -1),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
case 'CLEAR':
|
|
34
|
+
return { undoStack: [], redoStack: [] };
|
|
35
|
+
default:
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// --- Hook ---
|
|
40
|
+
/**
|
|
41
|
+
* Lightweight undo/redo stack for property changes.
|
|
42
|
+
* Records entries with property identifiers and values for precise undo control.
|
|
43
|
+
*/
|
|
44
|
+
function usePropertyUndo(options) {
|
|
45
|
+
const maxHistory = options?.maxHistory ?? 50;
|
|
46
|
+
const [state, dispatch] = useReducer((undoReducer), {
|
|
47
|
+
undoStack: [],
|
|
48
|
+
redoStack: [],
|
|
49
|
+
});
|
|
50
|
+
const record = useCallback((entry) => {
|
|
51
|
+
dispatch({
|
|
52
|
+
type: 'RECORD',
|
|
53
|
+
entry: { ...entry, timestamp: Date.now() },
|
|
54
|
+
maxHistory,
|
|
55
|
+
});
|
|
56
|
+
}, [maxHistory]);
|
|
57
|
+
const undo = useCallback(() => {
|
|
58
|
+
if (state.undoStack.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const entry = state.undoStack[state.undoStack.length - 1];
|
|
61
|
+
dispatch({ type: 'UNDO' });
|
|
62
|
+
return entry;
|
|
63
|
+
}, [state.undoStack]);
|
|
64
|
+
const redo = useCallback(() => {
|
|
65
|
+
if (state.redoStack.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
const entry = state.redoStack[state.redoStack.length - 1];
|
|
68
|
+
dispatch({ type: 'REDO' });
|
|
69
|
+
return entry;
|
|
70
|
+
}, [state.redoStack]);
|
|
71
|
+
const clear = useCallback(() => {
|
|
72
|
+
dispatch({ type: 'CLEAR' });
|
|
73
|
+
}, []);
|
|
74
|
+
return {
|
|
75
|
+
record,
|
|
76
|
+
undo,
|
|
77
|
+
redo,
|
|
78
|
+
canUndo: state.undoStack.length > 0,
|
|
79
|
+
canRedo: state.redoStack.length > 0,
|
|
80
|
+
history: state.undoStack,
|
|
81
|
+
clear,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { usePropertyUndo };
|
|
86
|
+
//# sourceMappingURL=usePropertyUndo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePropertyUndo.js","sources":["../../../../../../src/components/editor/PropertyInspector/usePropertyUndo.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useId, useRef, useCallback, createContext, useContext } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { StyledOverlay, StyledDialogPanel } from './Dialog.styled.js';
|
|
5
|
+
import { useDialogAnimation } from './useDialogAnimation.js';
|
|
6
|
+
import { useFocusTrap } from './useFocusTrap.js';
|
|
7
|
+
|
|
8
|
+
// --- Context ---
|
|
9
|
+
const DialogContext = /*#__PURE__*/ createContext(null);
|
|
10
|
+
function useDialogContext() {
|
|
11
|
+
const ctx = useContext(DialogContext);
|
|
12
|
+
if (!ctx) {
|
|
13
|
+
throw new Error('Dialog sub-components must be used within a <Dialog> component');
|
|
14
|
+
}
|
|
15
|
+
return ctx;
|
|
16
|
+
}
|
|
17
|
+
// --- Component ---
|
|
18
|
+
/**
|
|
19
|
+
* Dialog component for modal overlays in editor interfaces.
|
|
20
|
+
*
|
|
21
|
+
* Renders an accessible modal dialog with overlay, focus trap,
|
|
22
|
+
* and keyboard support. Compound component pattern: use with
|
|
23
|
+
* DialogHeader, DialogBody, DialogFooter, and DialogClose.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <Dialog open={isOpen} onClose={() => setIsOpen(false)} title="Confirm">
|
|
28
|
+
* <DialogHeader>Confirm Action</DialogHeader>
|
|
29
|
+
* <DialogBody>Are you sure?</DialogBody>
|
|
30
|
+
* <DialogFooter align="right">
|
|
31
|
+
* <Button onClick={() => setIsOpen(false)}>Cancel</Button>
|
|
32
|
+
* <Button variant="filled">Confirm</Button>
|
|
33
|
+
* </DialogFooter>
|
|
34
|
+
* </Dialog>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
const Dialog = ({ open, onClose, size = 'md', title, description, closeOnOverlayClick = true, closeOnEscape = true, showOverlay = true, trapFocus = true, initialFocusRef, portal = true, children, className, style, css, testId, id, ref, ...rest }) => {
|
|
38
|
+
const autoId = useId();
|
|
39
|
+
const titleId = `dialog-title-${autoId}`;
|
|
40
|
+
const descriptionId = `dialog-desc-${autoId}`;
|
|
41
|
+
const panelRef = useRef(null);
|
|
42
|
+
const { mounted, closing } = useDialogAnimation({
|
|
43
|
+
open,
|
|
44
|
+
panelRef,
|
|
45
|
+
initialFocusRef,
|
|
46
|
+
});
|
|
47
|
+
const handleFocusTrap = useFocusTrap({
|
|
48
|
+
containerRef: panelRef,
|
|
49
|
+
enabled: trapFocus,
|
|
50
|
+
});
|
|
51
|
+
const handleKeyDown = useCallback((e) => {
|
|
52
|
+
// Escape handler — inline instead of global document listener
|
|
53
|
+
if (closeOnEscape && e.key === 'Escape') {
|
|
54
|
+
e.stopPropagation();
|
|
55
|
+
onClose();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Focus trap
|
|
59
|
+
handleFocusTrap(e);
|
|
60
|
+
}, [closeOnEscape, onClose, handleFocusTrap]);
|
|
61
|
+
const handleOverlayClick = useCallback((e) => {
|
|
62
|
+
if (closeOnOverlayClick && e.target === e.currentTarget) {
|
|
63
|
+
onClose();
|
|
64
|
+
}
|
|
65
|
+
}, [closeOnOverlayClick, onClose]);
|
|
66
|
+
if (!mounted)
|
|
67
|
+
return null;
|
|
68
|
+
const contextValue = {
|
|
69
|
+
onClose,
|
|
70
|
+
titleId,
|
|
71
|
+
descriptionId,
|
|
72
|
+
};
|
|
73
|
+
const dialogContent = (jsxs(DialogContext.Provider, { value: contextValue, children: [showOverlay && (jsx(StyledOverlay, { "$closing": closing, onClick: handleOverlayClick, "data-testid": testId ? `${testId}-overlay` : undefined })), jsxs(StyledDialogPanel, { ref: (node) => {
|
|
74
|
+
panelRef.current =
|
|
75
|
+
node;
|
|
76
|
+
if (typeof ref === 'function') {
|
|
77
|
+
ref(node);
|
|
78
|
+
}
|
|
79
|
+
else if (ref) {
|
|
80
|
+
ref.current =
|
|
81
|
+
node;
|
|
82
|
+
}
|
|
83
|
+
}, role: "dialog", "aria-modal": "true", "aria-labelledby": title ? titleId : undefined, "aria-describedby": description ? descriptionId : undefined, tabIndex: -1, "$size": size, "$closing": closing, "$css": css, className: className, style: style, id: id, "data-testid": testId, onKeyDown: handleKeyDown, ...rest, children: [title && (jsx("span", { id: titleId, style: { display: 'none' }, children: title })), description && (jsx("span", { id: descriptionId, style: { display: 'none' }, children: description })), children] })] }));
|
|
84
|
+
if (portal) {
|
|
85
|
+
return createPortal(dialogContent, document.body);
|
|
86
|
+
}
|
|
87
|
+
return dialogContent;
|
|
88
|
+
};
|
|
89
|
+
Dialog.displayName = 'Dialog';
|
|
90
|
+
|
|
91
|
+
export { Dialog, useDialogContext };
|
|
92
|
+
//# sourceMappingURL=Dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog.js","sources":["../../../../../../src/components/feedback/Dialog/Dialog.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|