@tomorrowevening/theatre-studio 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +105 -56
- package/package.json +1 -1
- package/dist/IDBStorage.js +0 -19
- package/dist/PaneManager.js +0 -112
- package/dist/Scrub.js +0 -134
- package/dist/Studio.js +0 -405
- package/dist/StudioBundle.js +0 -21
- package/dist/StudioStore/StudioStore.js +0 -163
- package/dist/StudioStore/createTransactionPrivateApi.js +0 -204
- package/dist/StudioStore/generateDiskStateRevision.js +0 -4
- package/dist/StudioStore/persistStateOfStudio.js +0 -61
- package/dist/TheatreStudio.js +0 -154
- package/dist/UI/UI.js +0 -65
- package/dist/UI/UINonSSRBits.js +0 -60
- package/dist/UIRoot/PanelsRoot.js +0 -19
- package/dist/UIRoot/PointerCapturing.js +0 -96
- package/dist/UIRoot/ProvideTheme.js +0 -9
- package/dist/UIRoot/UIRoot.js +0 -79
- package/dist/UIRoot/useKeyboardShortcuts.js +0 -158
- package/dist/checkForUpdates.js +0 -86
- package/dist/css.js +0 -116
- package/dist/getStudio.js +0 -10
- package/dist/notify.js +0 -328
- package/dist/panels/BasePanel/BasePanel.js +0 -74
- package/dist/panels/BasePanel/ExtensionPaneWrapper.js +0 -138
- package/dist/panels/BasePanel/PanelDragZone.js +0 -88
- package/dist/panels/BasePanel/PanelResizeHandle.js +0 -184
- package/dist/panels/BasePanel/PanelResizers.js +0 -14
- package/dist/panels/BasePanel/PanelWrapper.js +0 -34
- package/dist/panels/BasePanel/common.js +0 -52
- package/dist/panels/DetailPanel/DetailPanel.js +0 -146
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail/DetailCompoundPropEditor.js +0 -169
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail/DetailSimplePropEditor.js +0 -22
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail/SingleRowPropEditor.js +0 -89
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail/getDetailRowHighlightBackground.js +0 -7
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail/rowIndentationFormulaCSS.js +0 -1
- package/dist/panels/DetailPanel/DeterminePropEditorForDetail.js +0 -28
- package/dist/panels/DetailPanel/EmptyState.js +0 -36
- package/dist/panels/DetailPanel/ObjectDetails.js +0 -52
- package/dist/panels/DetailPanel/ProjectDetails/StateConflictRow.js +0 -86
- package/dist/panels/DetailPanel/ProjectDetails.js +0 -98
- package/dist/panels/OutlinePanel/BaseItem.js +0 -136
- package/dist/panels/OutlinePanel/ObjectsList/ObjectItem.js +0 -14
- package/dist/panels/OutlinePanel/ObjectsList/ObjectsList.js +0 -85
- package/dist/panels/OutlinePanel/OutlinePanel.js +0 -73
- package/dist/panels/OutlinePanel/ProjectsList/ProjectListItem.js +0 -38
- package/dist/panels/OutlinePanel/ProjectsList/ProjectsList.js +0 -22
- package/dist/panels/OutlinePanel/SheetsList/SheetInstanceItem.js +0 -36
- package/dist/panels/OutlinePanel/SheetsList/SheetItem.js +0 -23
- package/dist/panels/OutlinePanel/SheetsList/SheetsList.js +0 -15
- package/dist/panels/OutlinePanel/outlinePanelUtils.js +0 -23
- package/dist/panels/SequenceEditorPanel/DopeSheet/DopeSheet.js +0 -21
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/AnyCompositeRow.js +0 -74
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/Left.js +0 -25
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/PrimitivePropRow.js +0 -97
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/PropWithChildrenRow.js +0 -15
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/SheetObjectRow.js +0 -19
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/SheetRow.js +0 -20
- package/dist/panels/SequenceEditorPanel/DopeSheet/Left/usePropHighlightMouseEnter.js +0 -33
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/AggregateKeyframeConnector.js +0 -187
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/AggregateKeyframeDot.js +0 -158
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/AggregateKeyframeEditor.js +0 -32
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/AggregateKeyframeVisualDot.js +0 -61
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/iif.js +0 -3
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregateKeyframeEditor/useAggregateKeyframeEditorUtils.js +0 -73
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/AggregatedKeyframeTrack/AggregatedKeyframeTrack.js +0 -407
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/BasicKeyframedTrack.js +0 -108
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/BasicKeyframeConnector.js +0 -185
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveEditorPopover.js +0 -397
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveSegmentEditor.js +0 -136
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/EasingOption.js +0 -52
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/SVGCurveSegment.js +0 -43
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/colors.js +0 -3
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/shared.js +0 -84
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/useFreezableMemo.js +0 -16
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/useUIOptionGrid.js +0 -82
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/DeterminePropEditorForSingleKeyframe.js +0 -93
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/SingleKeyframeDot.js +0 -254
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/SingleKeyframeEditor.js +0 -22
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/useSingleKeyframeInlineEditorPopover.js +0 -11
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/useTempTransactionEditingTools.js +0 -43
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/DopeSheetBackground.js +0 -24
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/DopeSheetSelectionView.js +0 -272
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/FocusRangeCurtains.js +0 -88
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/HorizontallyScrollableArea.js +0 -215
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/KeyframeSnapTarget.js +0 -55
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/LengthIndicator/LengthEditorPopover.js +0 -69
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/LengthIndicator/LengthIndicator.js +0 -217
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/PrimitivePropRow.js +0 -25
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/PropWithChildrenRow.js +0 -18
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/Right.js +0 -30
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/Row.js +0 -50
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/SheetObjectRow.js +0 -14
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/SheetRow.js +0 -14
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/collectAggregateKeyframes.js +0 -92
- package/dist/panels/SequenceEditorPanel/DopeSheet/Right/keyframeRowUI/ConnectorLine.js +0 -62
- package/dist/panels/SequenceEditorPanel/DopeSheet/selections.js +0 -149
- package/dist/panels/SequenceEditorPanel/DopeSheet/setCollapsedSheetObjectOrCompoundProp.js +0 -10
- package/dist/panels/SequenceEditorPanel/FrameGrid/FrameGrid.js +0 -92
- package/dist/panels/SequenceEditorPanel/FrameGrid/StampsGrid.js +0 -99
- package/dist/panels/SequenceEditorPanel/FrameGrid/createGrid.js +0 -49
- package/dist/panels/SequenceEditorPanel/FrameStampPositionProvider.js +0 -189
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/BasicKeyframedTrack.js +0 -91
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/Curve.js +0 -87
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/CurveHandle.js +0 -186
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/GraphEditorDotNonScalar.js +0 -162
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/GraphEditorDotScalar.js +0 -209
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/GraphEditorNonScalarDash.js +0 -23
- package/dist/panels/SequenceEditorPanel/GraphEditor/BasicKeyframedTrack/KeyframeEditor/KeyframeEditor.js +0 -30
- package/dist/panels/SequenceEditorPanel/GraphEditor/GraphEditor.js +0 -73
- package/dist/panels/SequenceEditorPanel/GraphEditor/PrimitivePropGraph.js +0 -20
- package/dist/panels/SequenceEditorPanel/GraphEditorToggle.js +0 -59
- package/dist/panels/SequenceEditorPanel/RightOverlay/DopeSnap.js +0 -36
- package/dist/panels/SequenceEditorPanel/RightOverlay/DopeSnapHitZoneUI.js +0 -57
- package/dist/panels/SequenceEditorPanel/RightOverlay/FocusRangeZone/FocusRangeStrip.js +0 -233
- package/dist/panels/SequenceEditorPanel/RightOverlay/FocusRangeZone/FocusRangeThumb.js +0 -217
- package/dist/panels/SequenceEditorPanel/RightOverlay/FocusRangeZone/FocusRangeZone.js +0 -181
- package/dist/panels/SequenceEditorPanel/RightOverlay/FrameStamp.js +0 -65
- package/dist/panels/SequenceEditorPanel/RightOverlay/HorizontalScrollbar.js +0 -235
- package/dist/panels/SequenceEditorPanel/RightOverlay/Markers/MarkerDot.js +0 -184
- package/dist/panels/SequenceEditorPanel/RightOverlay/Markers/MarkerEditorPopover.js +0 -65
- package/dist/panels/SequenceEditorPanel/RightOverlay/Markers/Markers.js +0 -13
- package/dist/panels/SequenceEditorPanel/RightOverlay/Playhead.js +0 -265
- package/dist/panels/SequenceEditorPanel/RightOverlay/PlayheadPositionPopover.js +0 -64
- package/dist/panels/SequenceEditorPanel/RightOverlay/RightOverlay.js +0 -35
- package/dist/panels/SequenceEditorPanel/RightOverlay/TopStrip.js +0 -31
- package/dist/panels/SequenceEditorPanel/SequenceEditorPanel.js +0 -179
- package/dist/panels/SequenceEditorPanel/VerticalScrollContainer.js +0 -42
- package/dist/panels/SequenceEditorPanel/layout/layout.js +0 -166
- package/dist/panels/SequenceEditorPanel/layout/tree.js +0 -139
- package/dist/panels/SequenceEditorPanel/whatPropIsHighlighted.js +0 -58
- package/dist/propEditors/DefaultValueIndicator.js +0 -64
- package/dist/propEditors/NextPrevKeyframeCursors.js +0 -135
- package/dist/propEditors/getNearbyKeyframesOfTrack.js +0 -46
- package/dist/propEditors/simpleEditors/BooleanPropEditor.js +0 -17
- package/dist/propEditors/simpleEditors/FilePropEditor.js +0 -118
- package/dist/propEditors/simpleEditors/ISimplePropEditorReactProps.js +0 -1
- package/dist/propEditors/simpleEditors/ImagePropEditor.js +0 -126
- package/dist/propEditors/simpleEditors/NumberPropEditor.js +0 -9
- package/dist/propEditors/simpleEditors/RgbaPropEditor.js +0 -73
- package/dist/propEditors/simpleEditors/StringLiteralPropEditor.js +0 -10
- package/dist/propEditors/simpleEditors/StringPropEditor.js +0 -6
- package/dist/propEditors/simpleEditors/simplePropEditorByPropType.js +0 -16
- package/dist/propEditors/useEditingToolsForCompoundProp.js +0 -228
- package/dist/propEditors/useEditingToolsForSimpleProp.js +0 -229
- package/dist/propEditors/utils/IEditingTools.js +0 -1
- package/dist/propEditors/utils/PropConfigForType.js +0 -1
- package/dist/propEditors/utils/getPropTypeByPointer.js +0 -48
- package/dist/propEditors/utils/propNameTextCSS.js +0 -7
- package/dist/selectors.js +0 -63
- package/dist/store/index.js +0 -184
- package/dist/store/stateEditors.js +0 -774
- package/dist/store/types/ahistoric.js +0 -1
- package/dist/store/types/ephemeral.js +0 -1
- package/dist/store/types/historic.js +0 -1
- package/dist/store/types/index.js +0 -3
- package/dist/toolbars/ExtensionToolbar/ExtensionToolbar.js +0 -51
- package/dist/toolbars/ExtensionToolbar/Toolset.js +0 -27
- package/dist/toolbars/ExtensionToolbar/tools/ExtensionFlyoutMenu.js +0 -51
- package/dist/toolbars/ExtensionToolbar/tools/IconButton.js +0 -16
- package/dist/toolbars/ExtensionToolbar/tools/Switch.js +0 -20
- package/dist/toolbars/GlobalToolbar.js +0 -142
- package/dist/toolbars/MoreMenu/MoreMenu.js +0 -133
- package/dist/toolbars/PinButton.js +0 -26
- package/dist/uiComponents/DetailPanelButton.js +0 -21
- package/dist/uiComponents/PointerEventsHandler.js +0 -80
- package/dist/uiComponents/Popover/ArrowContext.js +0 -3
- package/dist/uiComponents/Popover/BasicPopover.js +0 -35
- package/dist/uiComponents/Popover/BasicTooltip.js +0 -10
- package/dist/uiComponents/Popover/ErrorTooltip.js +0 -9
- package/dist/uiComponents/Popover/MinimalTooltip.js +0 -6
- package/dist/uiComponents/Popover/PopoverArrow.js +0 -38
- package/dist/uiComponents/Popover/TooltipContext.js +0 -46
- package/dist/uiComponents/Popover/TooltipWrapper.js +0 -103
- package/dist/uiComponents/Popover/usePopover.js +0 -132
- package/dist/uiComponents/Popover/useTooltip.js +0 -33
- package/dist/uiComponents/RoomToClick.js +0 -10
- package/dist/uiComponents/SVGIcon.js +0 -19
- package/dist/uiComponents/ShowMousePosition.js +0 -30
- package/dist/uiComponents/colorPicker/components/EditingProvider.js +0 -15
- package/dist/uiComponents/colorPicker/components/RgbaColorPicker.js +0 -31
- package/dist/uiComponents/colorPicker/components/common/Alpha.js +0 -54
- package/dist/uiComponents/colorPicker/components/common/AlphaColorPicker.js +0 -28
- package/dist/uiComponents/colorPicker/components/common/Hue.js +0 -41
- package/dist/uiComponents/colorPicker/components/common/Interactive.js +0 -142
- package/dist/uiComponents/colorPicker/components/common/Pointer.js +0 -39
- package/dist/uiComponents/colorPicker/components/common/Saturation.js +0 -44
- package/dist/uiComponents/colorPicker/hooks/useColorManipulation.js +0 -77
- package/dist/uiComponents/colorPicker/hooks/useEventCallback.js +0 -10
- package/dist/uiComponents/colorPicker/hooks/useIsomorphicLayoutEffect.js +0 -5
- package/dist/uiComponents/colorPicker/index.js +0 -1
- package/dist/uiComponents/colorPicker/types.js +0 -1
- package/dist/uiComponents/colorPicker/utils/clamp.js +0 -6
- package/dist/uiComponents/colorPicker/utils/compare.js +0 -25
- package/dist/uiComponents/colorPicker/utils/convert.js +0 -165
- package/dist/uiComponents/colorPicker/utils/round.js +0 -3
- package/dist/uiComponents/colorPicker/utils/validate.js +0 -10
- package/dist/uiComponents/createCursorLock.js +0 -2
- package/dist/uiComponents/form/BasicCheckbox.js +0 -5
- package/dist/uiComponents/form/BasicNumberInput.js +0 -261
- package/dist/uiComponents/form/BasicSelect.js +0 -58
- package/dist/uiComponents/form/BasicStringInput.js +0 -151
- package/dist/uiComponents/form/BasicSwitch.js +0 -60
- package/dist/uiComponents/icons/AddImage.js +0 -6
- package/dist/uiComponents/icons/ArrowClockwise.js +0 -6
- package/dist/uiComponents/icons/ArrowsOutCardinal.js +0 -6
- package/dist/uiComponents/icons/Bell.js +0 -6
- package/dist/uiComponents/icons/Camera.js +0 -7
- package/dist/uiComponents/icons/ChevronDown.js +0 -6
- package/dist/uiComponents/icons/ChevronLeft.js +0 -6
- package/dist/uiComponents/icons/ChevronRight.js +0 -6
- package/dist/uiComponents/icons/Cube.js +0 -6
- package/dist/uiComponents/icons/CubeFull.js +0 -6
- package/dist/uiComponents/icons/CubeHalf.js +0 -6
- package/dist/uiComponents/icons/CubeRendered.js +0 -7
- package/dist/uiComponents/icons/Details.js +0 -6
- package/dist/uiComponents/icons/DoubleChevronLeft.js +0 -6
- package/dist/uiComponents/icons/DoubleChevronRight.js +0 -6
- package/dist/uiComponents/icons/Ellipsis.js +0 -6
- package/dist/uiComponents/icons/EllipsisFill.js +0 -6
- package/dist/uiComponents/icons/GlobeSimple.js +0 -6
- package/dist/uiComponents/icons/Outline.js +0 -6
- package/dist/uiComponents/icons/Package.js +0 -6
- package/dist/uiComponents/icons/Resize.js +0 -7
- package/dist/uiComponents/icons/Trash.js +0 -6
- package/dist/uiComponents/icons/index.js +0 -20
- package/dist/uiComponents/isSafari.js +0 -2
- package/dist/uiComponents/onPointerOutside.js +0 -19
- package/dist/uiComponents/selects/BasicSelect.js +0 -24
- package/dist/uiComponents/simpleContextMenu/ContextMenu/BaseMenu.js +0 -40
- package/dist/uiComponents/simpleContextMenu/ContextMenu/ContextMenu.js +0 -87
- package/dist/uiComponents/simpleContextMenu/ContextMenu/Item.js +0 -37
- package/dist/uiComponents/simpleContextMenu/useContextMenu.js +0 -20
- package/dist/uiComponents/simpleContextMenu/useRequestContextMenu.js +0 -22
- package/dist/uiComponents/toolbar/ToolbarDropdownSelect.js +0 -7
- package/dist/uiComponents/toolbar/ToolbarIconButton.js +0 -74
- package/dist/uiComponents/toolbar/ToolbarSwitchSelect.js +0 -12
- package/dist/uiComponents/toolbar/ToolbarSwitchSelectContainer.js +0 -9
- package/dist/uiComponents/useBoundingClientRect.js +0 -13
- package/dist/uiComponents/useDebugRefreshEvery.js +0 -19
- package/dist/uiComponents/useDrag.js +0 -199
- package/dist/uiComponents/useHotspot.js +0 -30
- package/dist/uiComponents/useHover.js +0 -23
- package/dist/uiComponents/useHoverWithoutDescendants.js +0 -33
- package/dist/uiComponents/useKeyDown.js +0 -9
- package/dist/uiComponents/useKeyDownCallback.js +0 -28
- package/dist/uiComponents/useLockSet.js +0 -17
- package/dist/uiComponents/useLogger.js +0 -16
- package/dist/uiComponents/useOnClickOutside.js +0 -25
- package/dist/uiComponents/useOnKeyDown.js +0 -12
- package/dist/uiComponents/usePresence.js +0 -156
- package/dist/uiComponents/useValToAtom.js +0 -11
- package/dist/utils/absoluteDims.js +0 -7
- package/dist/utils/contextualWebComponents.js +0 -44
- package/dist/utils/copyToClipboard.js +0 -28
- package/dist/utils/derive-utils.js +0 -61
- package/dist/utils/devStringify.js +0 -20
- package/dist/utils/invariant.js +0 -79
- package/dist/utils/isMac.js +0 -2
- package/dist/utils/keyboardUtils.js +0 -23
- package/dist/utils/mousePositionD.js +0 -18
- package/dist/utils/redux/actionCreator.js +0 -15
- package/dist/utils/redux/actionCreator.test.js +0 -35
- package/dist/utils/redux/actionReducersBundle.js +0 -18
- package/dist/utils/redux/atomFromReduxStore.js +0 -11
- package/dist/utils/redux/configureStore.js +0 -18
- package/dist/utils/redux/pointerFriendlySelector.js +0 -8
- package/dist/utils/redux/withHistory/withBatchActions.js +0 -13
- package/dist/utils/redux/withHistory/withHistory.js +0 -157
- package/dist/utils/renderInPortalInContext.js +0 -38
- package/dist/utils/selectClosestHTMLAncestor.js +0 -13
- package/dist/utils/tightJsonStringify.js +0 -27
- package/dist/utils/tightJsonStringify.test.js +0 -25
- package/dist/utils/useRefAndState.js +0 -32
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { useLayoutEffect, useRef } from 'react';
|
|
2
|
-
import { useCssCursorLock } from './PointerEventsHandler';
|
|
3
|
-
import { usePointerCapturing } from '@tomorrowevening/theatre-studio/UIRoot/PointerCapturing';
|
|
4
|
-
import noop from '@tomorrowevening/theatre-shared/utils/noop';
|
|
5
|
-
import { isSafari } from './isSafari';
|
|
6
|
-
import useRefAndState from '@tomorrowevening/theatre-studio/utils/useRefAndState';
|
|
7
|
-
export var MouseButton;
|
|
8
|
-
(function (MouseButton) {
|
|
9
|
-
MouseButton[MouseButton["Left"] = 0] = "Left";
|
|
10
|
-
MouseButton[MouseButton["Middle"] = 1] = "Middle";
|
|
11
|
-
// Not including Right because it _might_ interfere with chord clicking.
|
|
12
|
-
// So we'll wait for chord-clicking to land before exploring right-button gestures
|
|
13
|
-
})(MouseButton || (MouseButton = {}));
|
|
14
|
-
/** How far in total does the cursor have to move before we decide that the user is dragging */
|
|
15
|
-
const DRAG_DETECTION_DISTANCE_THRESHOLD = 3;
|
|
16
|
-
const DRAG_DETECTION_WAS_POINTER_LOCK_MOVEMENT = 100;
|
|
17
|
-
export default function useDrag(target, opts) {
|
|
18
|
-
const optsRef = useRef(opts);
|
|
19
|
-
optsRef.current = opts;
|
|
20
|
-
/**
|
|
21
|
-
* Safari has a gross behavior with locking the pointer changes the height of the webpage
|
|
22
|
-
* See {@link UseDragOpts.shouldPointerLock} for more context.
|
|
23
|
-
*/
|
|
24
|
-
const isPointerLockUsed = opts.shouldPointerLock && !isSafari;
|
|
25
|
-
const stateRef = useRef({
|
|
26
|
-
domDragStarted: false,
|
|
27
|
-
});
|
|
28
|
-
const { capturePointer } = usePointerCapturing(`useDrag for ${opts.debugName}`);
|
|
29
|
-
const callbacksRef = useRef({ onDrag: noop, onDragEnd: noop, onClick: noop });
|
|
30
|
-
const capturedPointerRef = useRef();
|
|
31
|
-
// needed to have a state on the react lifecycle which can be updated
|
|
32
|
-
// via a ref (e.g. via the below layout effect).
|
|
33
|
-
const [isDraggingRef, isDragging] = useRefAndState(false);
|
|
34
|
-
useLayoutEffect(() => {
|
|
35
|
-
if (!target)
|
|
36
|
-
return;
|
|
37
|
-
const ensureIsDraggingUpToDateForReactLifecycle = () => {
|
|
38
|
-
const isDragging = stateRef.current.domDragStarted && stateRef.current.detection.detected;
|
|
39
|
-
if (isDraggingRef.current !== isDragging) {
|
|
40
|
-
isDraggingRef.current = isDragging;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const dragHandler = (event) => {
|
|
44
|
-
if (!stateRef.current.domDragStarted)
|
|
45
|
-
return;
|
|
46
|
-
const stateStarted = stateRef.current;
|
|
47
|
-
if (didPointerLockCauseMovement(event, stateStarted))
|
|
48
|
-
return;
|
|
49
|
-
if (!stateStarted.detection.detected) {
|
|
50
|
-
stateStarted.detection.totalDistanceMoved +=
|
|
51
|
-
Math.abs(event.movementY) + Math.abs(event.movementX);
|
|
52
|
-
if (stateStarted.detection.totalDistanceMoved >
|
|
53
|
-
DRAG_DETECTION_DISTANCE_THRESHOLD) {
|
|
54
|
-
if (isPointerLockUsed) {
|
|
55
|
-
target.requestPointerLock();
|
|
56
|
-
}
|
|
57
|
-
stateStarted.detection = {
|
|
58
|
-
detected: true,
|
|
59
|
-
dragMovement: { x: 0, y: 0 },
|
|
60
|
-
dragEventCount: 0,
|
|
61
|
-
};
|
|
62
|
-
ensureIsDraggingUpToDateForReactLifecycle();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// drag detection threshold checking
|
|
66
|
-
if (stateStarted.detection.detected) {
|
|
67
|
-
stateStarted.detection.dragEventCount += 1;
|
|
68
|
-
const { dragMovement } = stateStarted.detection;
|
|
69
|
-
if (isPointerLockUsed) {
|
|
70
|
-
// when locked, the pointer event screen position is going to be 0s, since the pointer can't move.
|
|
71
|
-
// So, we use the movement on the event
|
|
72
|
-
dragMovement.x += event.movementX;
|
|
73
|
-
dragMovement.y += event.movementY;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
const { startPos } = stateStarted;
|
|
77
|
-
dragMovement.x = event.screenX - startPos.x;
|
|
78
|
-
dragMovement.y = event.screenY - startPos.y;
|
|
79
|
-
}
|
|
80
|
-
callbacksRef.current.onDrag(dragMovement.x, dragMovement.y, event, event.movementX, event.movementY);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
const dragEndHandler = (e) => {
|
|
84
|
-
removeDragListeners();
|
|
85
|
-
if (!stateRef.current.domDragStarted)
|
|
86
|
-
return;
|
|
87
|
-
const dragHappened = stateRef.current.detection.detected;
|
|
88
|
-
stateRef.current = { domDragStarted: false };
|
|
89
|
-
if (opts.shouldPointerLock && !isSafari)
|
|
90
|
-
document.exitPointerLock();
|
|
91
|
-
callbacksRef.current.onDragEnd(dragHappened);
|
|
92
|
-
// ensure that the window is focused after a successful drag
|
|
93
|
-
// this fixes an issue where after dragging something like the playhead
|
|
94
|
-
// through an iframe, you can immediately hit [space] and the animation
|
|
95
|
-
// will play, even if you hadn't been focusing in the iframe at the start
|
|
96
|
-
// of the drag.
|
|
97
|
-
//
|
|
98
|
-
// Fixes https://linear.app/theatre/issue/P-177/beginners-scrubbing-the-playhead-from-within-an-iframe-then-[space]
|
|
99
|
-
window.focus();
|
|
100
|
-
if (!dragHappened) {
|
|
101
|
-
callbacksRef.current.onClick(e);
|
|
102
|
-
}
|
|
103
|
-
ensureIsDraggingUpToDateForReactLifecycle();
|
|
104
|
-
};
|
|
105
|
-
const addDragListeners = () => {
|
|
106
|
-
document.addEventListener('mousemove', dragHandler);
|
|
107
|
-
document.addEventListener('mouseup', dragEndHandler);
|
|
108
|
-
};
|
|
109
|
-
const removeDragListeners = () => {
|
|
110
|
-
capturedPointerRef.current?.release();
|
|
111
|
-
document.removeEventListener('mousemove', dragHandler);
|
|
112
|
-
document.removeEventListener('mouseup', dragEndHandler);
|
|
113
|
-
};
|
|
114
|
-
const preventUnwantedClick = (event) => {
|
|
115
|
-
if (optsRef.current.disabled)
|
|
116
|
-
return;
|
|
117
|
-
if (!stateRef.current.domDragStarted)
|
|
118
|
-
return;
|
|
119
|
-
if (stateRef.current.detection.detected) {
|
|
120
|
-
if (!optsRef.current.dontBlockMouseDown) {
|
|
121
|
-
event.stopPropagation();
|
|
122
|
-
event.preventDefault();
|
|
123
|
-
}
|
|
124
|
-
stateRef.current.detection = {
|
|
125
|
-
detected: false,
|
|
126
|
-
totalDistanceMoved: 0,
|
|
127
|
-
};
|
|
128
|
-
ensureIsDraggingUpToDateForReactLifecycle();
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
const dragStartHandler = (event) => {
|
|
132
|
-
// defensively release
|
|
133
|
-
capturedPointerRef.current?.release();
|
|
134
|
-
const opts = optsRef.current;
|
|
135
|
-
if (opts.disabled === true)
|
|
136
|
-
return;
|
|
137
|
-
const acceptedButtons = opts.buttons ?? [MouseButton.Left];
|
|
138
|
-
if (!acceptedButtons.includes(event.button))
|
|
139
|
-
return;
|
|
140
|
-
const returnOfOnDragStart = opts.onDragStart(event);
|
|
141
|
-
if (returnOfOnDragStart === false) {
|
|
142
|
-
// we should ignore the gesture
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
callbacksRef.current.onDrag = returnOfOnDragStart.onDrag;
|
|
146
|
-
callbacksRef.current.onDragEnd = returnOfOnDragStart.onDragEnd ?? noop;
|
|
147
|
-
callbacksRef.current.onClick = returnOfOnDragStart.onClick ?? noop;
|
|
148
|
-
// need to capture pointer after we know the provided handler wants to handle drag start
|
|
149
|
-
capturedPointerRef.current = capturePointer('Drag start');
|
|
150
|
-
if (!opts.dontBlockMouseDown) {
|
|
151
|
-
event.stopPropagation();
|
|
152
|
-
event.preventDefault();
|
|
153
|
-
}
|
|
154
|
-
stateRef.current = {
|
|
155
|
-
domDragStarted: true,
|
|
156
|
-
startPos: { x: event.screenX, y: event.screenY },
|
|
157
|
-
detection: {
|
|
158
|
-
detected: false,
|
|
159
|
-
totalDistanceMoved: 0,
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
ensureIsDraggingUpToDateForReactLifecycle();
|
|
163
|
-
addDragListeners();
|
|
164
|
-
};
|
|
165
|
-
const onMouseDown = (e) => {
|
|
166
|
-
dragStartHandler(e);
|
|
167
|
-
};
|
|
168
|
-
target.addEventListener('mousedown', onMouseDown);
|
|
169
|
-
target.addEventListener('click', preventUnwantedClick);
|
|
170
|
-
return () => {
|
|
171
|
-
removeDragListeners();
|
|
172
|
-
target.removeEventListener('mousedown', onMouseDown);
|
|
173
|
-
target.removeEventListener('click', preventUnwantedClick);
|
|
174
|
-
if (stateRef.current.domDragStarted) {
|
|
175
|
-
callbacksRef.current.onDragEnd?.(stateRef.current.detection.detected);
|
|
176
|
-
}
|
|
177
|
-
stateRef.current = { domDragStarted: false };
|
|
178
|
-
ensureIsDraggingUpToDateForReactLifecycle();
|
|
179
|
-
};
|
|
180
|
-
}, [target]);
|
|
181
|
-
useCssCursorLock(isDragging && !!opts.lockCSSCursorTo, 'dragging', opts.lockCSSCursorTo);
|
|
182
|
-
return [isDragging];
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* shouldPointerLock moves the mouse to the center of your screen in firefox, which
|
|
186
|
-
* can cause it to report very large movementX when the pointer lock begins. This
|
|
187
|
-
* function hackily detects unnaturally large movements of the mouse.
|
|
188
|
-
*
|
|
189
|
-
* @param event - MouseEvent from onDrag
|
|
190
|
-
* @returns
|
|
191
|
-
*/
|
|
192
|
-
function didPointerLockCauseMovement(event, state) {
|
|
193
|
-
const isEarlyInDragging = !state.detection.detected ||
|
|
194
|
-
(state.detection.detected && state.detection.dragEventCount < 3);
|
|
195
|
-
return (isEarlyInDragging &&
|
|
196
|
-
// sudden movement
|
|
197
|
-
(Math.abs(event.movementX) > DRAG_DETECTION_WAS_POINTER_LOCK_MOVEMENT ||
|
|
198
|
-
Math.abs(event.movementY) > DRAG_DETECTION_WAS_POINTER_LOCK_MOVEMENT));
|
|
199
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
export default function useHotspot(spot) {
|
|
3
|
-
const [active, setActive] = useState(false);
|
|
4
|
-
useEffect(() => {
|
|
5
|
-
const hoverListener = (e) => {
|
|
6
|
-
const threshold = active ? 200 : 50;
|
|
7
|
-
// This is a super specific solution just for now so that the hotspot region
|
|
8
|
-
// excludes the pin button.
|
|
9
|
-
const topBuffer = 56;
|
|
10
|
-
let mouseInside = spot === 'left' ? e.x < threshold : e.x > window.innerWidth - threshold;
|
|
11
|
-
mouseInside &&= e.y > topBuffer;
|
|
12
|
-
if (mouseInside) {
|
|
13
|
-
setActive(true);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
setActive(false);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
document.addEventListener('mousemove', hoverListener);
|
|
20
|
-
const leaveListener = () => {
|
|
21
|
-
setActive(false);
|
|
22
|
-
};
|
|
23
|
-
document.addEventListener('mouseleave', leaveListener);
|
|
24
|
-
return () => {
|
|
25
|
-
document.removeEventListener('mousemove', hoverListener);
|
|
26
|
-
document.removeEventListener('mouseleave', leaveListener);
|
|
27
|
-
};
|
|
28
|
-
}, [active]);
|
|
29
|
-
return active;
|
|
30
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
export default function useHover(target) {
|
|
3
|
-
const [isHovered, setIsHovered] = useState(false);
|
|
4
|
-
useEffect(() => {
|
|
5
|
-
setIsHovered(false);
|
|
6
|
-
if (!target)
|
|
7
|
-
return;
|
|
8
|
-
const onMouseEnter = () => {
|
|
9
|
-
setIsHovered(true);
|
|
10
|
-
};
|
|
11
|
-
const onMouseLeave = () => {
|
|
12
|
-
setIsHovered(false);
|
|
13
|
-
};
|
|
14
|
-
target.addEventListener('mouseenter', onMouseEnter);
|
|
15
|
-
target.addEventListener('mouseleave', onMouseLeave);
|
|
16
|
-
return () => {
|
|
17
|
-
setIsHovered(false);
|
|
18
|
-
target.removeEventListener('mouseenter', onMouseEnter);
|
|
19
|
-
target.removeEventListener('mouseleave', onMouseLeave);
|
|
20
|
-
};
|
|
21
|
-
}, [target]);
|
|
22
|
-
return isHovered;
|
|
23
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* A react hook that returns true if the pointer is hovering over the target element and not its descendants
|
|
4
|
-
*/
|
|
5
|
-
export default function useHoverWithoutDescendants(target) {
|
|
6
|
-
const [isHovered, setIsHovered] = useState(false);
|
|
7
|
-
useEffect(() => {
|
|
8
|
-
setIsHovered(false);
|
|
9
|
-
if (!target)
|
|
10
|
-
return;
|
|
11
|
-
const onMouseEnterOrMove = (e) => {
|
|
12
|
-
if (e.target === target) {
|
|
13
|
-
setIsHovered(true);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
setIsHovered(false);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
const onMouseLeave = () => {
|
|
20
|
-
setIsHovered(false);
|
|
21
|
-
};
|
|
22
|
-
target.addEventListener('mouseenter', onMouseEnterOrMove);
|
|
23
|
-
target.addEventListener('mousemove', onMouseEnterOrMove);
|
|
24
|
-
target.addEventListener('mouseleave', onMouseLeave);
|
|
25
|
-
return () => {
|
|
26
|
-
setIsHovered(false);
|
|
27
|
-
target.removeEventListener('mouseenter', onMouseEnterOrMove);
|
|
28
|
-
target.removeEventListener('mousemove', onMouseEnterOrMove);
|
|
29
|
-
target.removeEventListener('mouseleave', onMouseLeave);
|
|
30
|
-
};
|
|
31
|
-
}, [target]);
|
|
32
|
-
return isHovered;
|
|
33
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
import useKeyDownCallback from './useKeyDownCallback';
|
|
3
|
-
export default function useKeyDown(combo) {
|
|
4
|
-
const [state, setState] = useState(false);
|
|
5
|
-
useKeyDownCallback(combo, ({ down }) => {
|
|
6
|
-
setState(down);
|
|
7
|
-
});
|
|
8
|
-
return state;
|
|
9
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react';
|
|
2
|
-
export default function useKeyDownCallback(combo, listener) {
|
|
3
|
-
const refs = useRef({ combo, listener });
|
|
4
|
-
refs.current = { combo, listener };
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
function onKeyDown(event) {
|
|
7
|
-
if (event.key === refs.current.combo) {
|
|
8
|
-
refs.current.listener({ down: true, event });
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
function onKeyUp(event) {
|
|
12
|
-
if (event.key === refs.current.combo) {
|
|
13
|
-
refs.current.listener({ down: false, event });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function onBlur(event) {
|
|
17
|
-
refs.current.listener({ down: false, event: undefined });
|
|
18
|
-
}
|
|
19
|
-
document.addEventListener('keydown', onKeyDown);
|
|
20
|
-
document.addEventListener('keyup', onKeyUp);
|
|
21
|
-
window.addEventListener('blur', onBlur);
|
|
22
|
-
return () => {
|
|
23
|
-
document.removeEventListener('keydown', onKeyDown);
|
|
24
|
-
document.removeEventListener('keyup', onKeyUp);
|
|
25
|
-
window.removeEventListener('blur', onBlur);
|
|
26
|
-
};
|
|
27
|
-
}, []);
|
|
28
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { useMemo, useState } from 'react';
|
|
2
|
-
export default function useLockSet() {
|
|
3
|
-
const [isLocked, _setIsLocked] = useState(false);
|
|
4
|
-
const addLock = useMemo(() => {
|
|
5
|
-
const locks = new Set();
|
|
6
|
-
return () => {
|
|
7
|
-
const unlock = () => {
|
|
8
|
-
locks.delete(unlock);
|
|
9
|
-
_setIsLocked(locks.size > 0);
|
|
10
|
-
};
|
|
11
|
-
locks.add(unlock);
|
|
12
|
-
_setIsLocked(true);
|
|
13
|
-
return unlock;
|
|
14
|
-
};
|
|
15
|
-
}, []);
|
|
16
|
-
return [isLocked, addLock];
|
|
17
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React, { useContext, useMemo } from 'react';
|
|
2
|
-
const loggerContext = React.createContext(null);
|
|
3
|
-
export function ProvideLogger(props) {
|
|
4
|
-
return (React.createElement(loggerContext.Provider, { value: props.logger }, props.children));
|
|
5
|
-
}
|
|
6
|
-
export function useLogger(name, key) {
|
|
7
|
-
const parentLogger = useContext(loggerContext);
|
|
8
|
-
return useMemo(() => {
|
|
9
|
-
if (name) {
|
|
10
|
-
return parentLogger.named(name, key);
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
return parentLogger;
|
|
14
|
-
}
|
|
15
|
-
}, [parentLogger, name, key]);
|
|
16
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
2
|
-
export default function useOnClickOutside(container, onOutside, enabled) {
|
|
3
|
-
useEffect(() => {
|
|
4
|
-
if (!container || enabled === false)
|
|
5
|
-
return;
|
|
6
|
-
const containers = Array.isArray(container)
|
|
7
|
-
? container.filter((container) => container)
|
|
8
|
-
: [container];
|
|
9
|
-
const onMouseDown = (e) => {
|
|
10
|
-
if (containers.every((container) => !e.composedPath().includes(container))) {
|
|
11
|
-
onOutside(e);
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
window.addEventListener('mousedown', onMouseDown, {
|
|
15
|
-
capture: true,
|
|
16
|
-
passive: false,
|
|
17
|
-
});
|
|
18
|
-
return () => {
|
|
19
|
-
window.removeEventListener('mousedown', onMouseDown, {
|
|
20
|
-
capture: true,
|
|
21
|
-
passive: false,
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
}, [container, enabled]);
|
|
25
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react';
|
|
2
|
-
export default function useOnKeyDown(callback) {
|
|
3
|
-
const ref = useRef(callback);
|
|
4
|
-
ref.current = callback;
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
const onKeyDown = (ev) => ref.current(ev);
|
|
7
|
-
window.addEventListener('keydown', onKeyDown);
|
|
8
|
-
return () => {
|
|
9
|
-
window.removeEventListener('keydown', onKeyDown);
|
|
10
|
-
};
|
|
11
|
-
}, []);
|
|
12
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
2
|
-
import { useEffect } from 'react';
|
|
3
|
-
import { useLogger } from './useLogger';
|
|
4
|
-
import { prism, pointerToPrism } from '@tomorrowevening/theatre-dataverse';
|
|
5
|
-
import { Atom } from '@tomorrowevening/theatre-dataverse';
|
|
6
|
-
import { usePrismInstance } from '@tomorrowevening/theatre-react';
|
|
7
|
-
import { selectClosestHTMLAncestor } from '@tomorrowevening/theatre-studio/utils/selectClosestHTMLAncestor';
|
|
8
|
-
import pointerDeep from '@tomorrowevening/theatre-shared/utils/pointerDeep';
|
|
9
|
-
/** To mean the presence value */
|
|
10
|
-
export var PresenceFlag;
|
|
11
|
-
(function (PresenceFlag) {
|
|
12
|
-
/** Self is hovered or what represents "self" is being hovered */
|
|
13
|
-
PresenceFlag[PresenceFlag["Primary"] = 2] = "Primary";
|
|
14
|
-
/** Related item is hovered */
|
|
15
|
-
PresenceFlag[PresenceFlag["Secondary"] = 1] = "Secondary";
|
|
16
|
-
// /** Tutorial */
|
|
17
|
-
// TutorialEmphasis = 0,
|
|
18
|
-
})(PresenceFlag || (PresenceFlag = {}));
|
|
19
|
-
const undefinedD = prism(() => undefined);
|
|
20
|
-
undefinedD.keepHot(); // constant anyway...
|
|
21
|
-
function createPresenceContext(options) {
|
|
22
|
-
const currentUserHoverItemB = new Atom(undefined);
|
|
23
|
-
const currentUserHoverFlagItemsAtom = new Atom({});
|
|
24
|
-
// keep as part of presence creation
|
|
25
|
-
const relationsAtom = new Atom({});
|
|
26
|
-
let lastRelationId = 0;
|
|
27
|
-
return {
|
|
28
|
-
addRelatedFlags(itemKey, relationships) {
|
|
29
|
-
const relationId = String(++lastRelationId);
|
|
30
|
-
// "clean up" paths returned from relationships declared
|
|
31
|
-
const undoAtPaths = relationships.map((rel) => {
|
|
32
|
-
const presence = {
|
|
33
|
-
flag: rel.flag,
|
|
34
|
-
};
|
|
35
|
-
const path = [rel.affects, itemKey, relationId];
|
|
36
|
-
relationsAtom.setByPointer((p) => pointerDeep(p, path), presence);
|
|
37
|
-
return path;
|
|
38
|
-
});
|
|
39
|
-
return () => {
|
|
40
|
-
for (const pathToUndo of undoAtPaths) {
|
|
41
|
-
relationsAtom.setByPointer((p) => pointerDeep(p, pathToUndo), undefined);
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
},
|
|
45
|
-
usePresenceFlag(itemKey) {
|
|
46
|
-
if (!options.enabled)
|
|
47
|
-
return undefined;
|
|
48
|
-
const focusD = useMemo(() => {
|
|
49
|
-
if (!itemKey)
|
|
50
|
-
return undefinedD;
|
|
51
|
-
// this is the thing being hovered
|
|
52
|
-
const currentD = currentUserHoverItemB.prism;
|
|
53
|
-
const primaryFocusDer = pointerToPrism(currentUserHoverFlagItemsAtom.pointer[itemKey]);
|
|
54
|
-
const relationsDer = pointerToPrism(relationsAtom.pointer[itemKey]);
|
|
55
|
-
return prism(() => {
|
|
56
|
-
const primary = primaryFocusDer.getValue();
|
|
57
|
-
if (primary) {
|
|
58
|
-
return PresenceFlag.Primary;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
const related = relationsDer.getValue();
|
|
62
|
-
const current = currentD.getValue();
|
|
63
|
-
const rels = related && current && related[current];
|
|
64
|
-
if (rels) {
|
|
65
|
-
// can this be cached into a derived atom?
|
|
66
|
-
let best;
|
|
67
|
-
for (const rel of Object.values(rels)) {
|
|
68
|
-
if (!rel)
|
|
69
|
-
continue;
|
|
70
|
-
if (best && best >= rel.flag)
|
|
71
|
-
continue;
|
|
72
|
-
best = rel.flag;
|
|
73
|
-
}
|
|
74
|
-
return best;
|
|
75
|
-
}
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}, [itemKey]);
|
|
80
|
-
return usePrismInstance(focusD);
|
|
81
|
-
},
|
|
82
|
-
setUserHover(itemKeyOpt) {
|
|
83
|
-
const prev = currentUserHoverItemB.get();
|
|
84
|
-
if (prev === itemKeyOpt) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (prev) {
|
|
88
|
-
currentUserHoverFlagItemsAtom.setByPointer((p) => p[prev], false);
|
|
89
|
-
}
|
|
90
|
-
currentUserHoverItemB.set(itemKeyOpt);
|
|
91
|
-
if (itemKeyOpt) {
|
|
92
|
-
currentUserHoverFlagItemsAtom.setByPointer((p) => p[itemKeyOpt], true);
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
const presenceInternalCtx = React.createContext(createPresenceContext({ enabled: false }));
|
|
98
|
-
export function ProvidePresenceRoot({ children }) {
|
|
99
|
-
const presence = useMemo(() => createPresenceContext({ enabled: false }), []);
|
|
100
|
-
return React.createElement(presenceInternalCtx.Provider, { children, value: presence }, children);
|
|
101
|
-
}
|
|
102
|
-
const PRESENCE_ITEM_DATA_ATTR = 'data-pi-key';
|
|
103
|
-
export default function usePresence(key) {
|
|
104
|
-
const presenceInternal = React.useContext(presenceInternalCtx);
|
|
105
|
-
const flag = presenceInternal.usePresenceFlag(key);
|
|
106
|
-
return {
|
|
107
|
-
attrs: {
|
|
108
|
-
[PRESENCE_ITEM_DATA_ATTR]: key,
|
|
109
|
-
},
|
|
110
|
-
flag,
|
|
111
|
-
useRelations(getRelations, deps) {
|
|
112
|
-
useEffect(() => {
|
|
113
|
-
return key && presenceInternal.addRelatedFlags(key, getRelations());
|
|
114
|
-
}, [key, ...deps]);
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
export function usePresenceListenersOnRootElement(target) {
|
|
119
|
-
const presence = React.useContext(presenceInternalCtx);
|
|
120
|
-
const logger = useLogger('PresenceListeners');
|
|
121
|
-
useEffect(() => {
|
|
122
|
-
// keep track of current primary hover to make sure we make changes to presence distinct
|
|
123
|
-
let currentItemKeyUserHover;
|
|
124
|
-
if (!target)
|
|
125
|
-
return;
|
|
126
|
-
const onMouseOver = (event) => {
|
|
127
|
-
if (event.target instanceof Node) {
|
|
128
|
-
const found = selectClosestHTMLAncestor(event.target, `[${PRESENCE_ITEM_DATA_ATTR}]`);
|
|
129
|
-
if (found) {
|
|
130
|
-
const itemKey = found.getAttribute(PRESENCE_ITEM_DATA_ATTR);
|
|
131
|
-
if (currentItemKeyUserHover !== itemKey) {
|
|
132
|
-
currentItemKeyUserHover = itemKey;
|
|
133
|
-
presence.setUserHover((itemKey || undefined));
|
|
134
|
-
logger._debug('Updated current hover', { itemKey });
|
|
135
|
-
}
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
// remove hover
|
|
139
|
-
if (currentItemKeyUserHover != null) {
|
|
140
|
-
currentItemKeyUserHover = null;
|
|
141
|
-
presence.setUserHover(undefined);
|
|
142
|
-
logger._debug('Cleared current hover');
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
target.addEventListener('mouseover', onMouseOver);
|
|
147
|
-
return () => {
|
|
148
|
-
target.removeEventListener('mouseover', onMouseOver);
|
|
149
|
-
// remove hover
|
|
150
|
-
if (currentItemKeyUserHover != null) {
|
|
151
|
-
currentItemKeyUserHover = null;
|
|
152
|
-
logger._debug('Cleared current hover as part of cleanup');
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
}, [target, presence]);
|
|
156
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Atom } from '@tomorrowevening/theatre-dataverse';
|
|
2
|
-
import { useLayoutEffect, useMemo } from 'react';
|
|
3
|
-
export default function useValToAtom(val) {
|
|
4
|
-
const atom = useMemo(() => {
|
|
5
|
-
return new Atom(val);
|
|
6
|
-
}, []);
|
|
7
|
-
useLayoutEffect(() => {
|
|
8
|
-
atom.set(val);
|
|
9
|
-
}, [val]);
|
|
10
|
-
return atom;
|
|
11
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { getMounter } from './renderInPortalInContext';
|
|
2
|
-
export function registerContextualWebComponent(ReactComponent, componentName,
|
|
3
|
-
// currently only supporting string prop types
|
|
4
|
-
propKeys) {
|
|
5
|
-
if (typeof window === 'undefined' || typeof customElements === 'undefined')
|
|
6
|
-
return;
|
|
7
|
-
const propList = Object.keys(propKeys);
|
|
8
|
-
class CustomWebComponent extends HTMLElement {
|
|
9
|
-
_mounted = false;
|
|
10
|
-
_mountOrRender;
|
|
11
|
-
_unmount;
|
|
12
|
-
static get observedAttributes() {
|
|
13
|
-
return propList;
|
|
14
|
-
}
|
|
15
|
-
constructor() {
|
|
16
|
-
super();
|
|
17
|
-
const { mountOrRender, unmount } = getMounter();
|
|
18
|
-
this._mountOrRender = mountOrRender;
|
|
19
|
-
this._unmount = unmount;
|
|
20
|
-
}
|
|
21
|
-
connectedCallback() {
|
|
22
|
-
// const shadow = this.attachShadow({mode: 'open'})
|
|
23
|
-
this._mounted = true;
|
|
24
|
-
this._render();
|
|
25
|
-
}
|
|
26
|
-
_render() {
|
|
27
|
-
const props = Object.fromEntries(propList.map((propName) => [
|
|
28
|
-
propName,
|
|
29
|
-
this.getAttribute(propName),
|
|
30
|
-
]));
|
|
31
|
-
this._mountOrRender(ReactComponent, props, this);
|
|
32
|
-
}
|
|
33
|
-
attributeChangedCallback() {
|
|
34
|
-
if (!this._mounted)
|
|
35
|
-
return;
|
|
36
|
-
this._render();
|
|
37
|
-
}
|
|
38
|
-
disconnectedCallback() {
|
|
39
|
-
this._mounted = false;
|
|
40
|
-
this._unmount();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
customElements.define(componentName, CustomWebComponent);
|
|
44
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export async function copyToClipboard(text) {
|
|
2
|
-
if (navigator.clipboard) {
|
|
3
|
-
return navigator.clipboard
|
|
4
|
-
.writeText(text)
|
|
5
|
-
.then(() => {
|
|
6
|
-
return true;
|
|
7
|
-
})
|
|
8
|
-
.catch(() => {
|
|
9
|
-
return false;
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
const tempTextArea = document.createElement('textarea');
|
|
14
|
-
tempTextArea.value = text;
|
|
15
|
-
document.body.appendChild(tempTextArea);
|
|
16
|
-
tempTextArea.focus();
|
|
17
|
-
tempTextArea.select();
|
|
18
|
-
try {
|
|
19
|
-
const successful = document.execCommand('copy');
|
|
20
|
-
document.body.removeChild(tempTextArea);
|
|
21
|
-
return Promise.resolve(successful);
|
|
22
|
-
}
|
|
23
|
-
catch (err) {
|
|
24
|
-
document.body.removeChild(tempTextArea);
|
|
25
|
-
return Promise.resolve(false);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|