react-panel-layout 0.6.0 → 0.6.1
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/{FloatingPanelFrame-SgYLc6Ud.js → FloatingPanelFrame-3eU9AwPo.js} +2 -2
- package/dist/{FloatingPanelFrame-SgYLc6Ud.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
- package/dist/FloatingWindow-CUXnEtrb.js +827 -0
- package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
- package/dist/GridLayout-DKTg_N61.cjs +2 -0
- package/dist/{GridLayout-B4VRsC0r.cjs.map → GridLayout-DKTg_N61.cjs.map} +1 -1
- package/dist/{GridLayout-BltqeCPK.js → GridLayout-UWNxXw77.js} +34 -35
- package/dist/{GridLayout-BltqeCPK.js.map → GridLayout-UWNxXw77.js.map} +1 -1
- package/dist/{HorizontalDivider-WF1k_qND.js → HorizontalDivider-DdxzfV0l.js} +3 -3
- package/dist/{HorizontalDivider-WF1k_qND.js.map → HorizontalDivider-DdxzfV0l.js.map} +1 -1
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs → HorizontalDivider-_pgV4Mcv.cjs} +2 -2
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs.map → HorizontalDivider-_pgV4Mcv.cjs.map} +1 -1
- package/dist/{PanelSystem-Dr1TBhxM.js → PanelSystem-BqUzNtf2.js} +5 -5
- package/dist/{PanelSystem-Dr1TBhxM.js.map → PanelSystem-BqUzNtf2.js.map} +1 -1
- package/dist/{PanelSystem-Bs8bQwQF.cjs → PanelSystem-D603LKKv.cjs} +2 -2
- package/dist/{PanelSystem-Bs8bQwQF.cjs.map → PanelSystem-D603LKKv.cjs.map} +1 -1
- package/dist/ResizeHandle-CBcAS918.cjs +2 -0
- package/dist/{ResizeHandle-CScipO5l.cjs.map → ResizeHandle-CBcAS918.cjs.map} +1 -1
- package/dist/{ResizeHandle-CdA_JYfN.js → ResizeHandle-CXjc1meV.js} +28 -29
- package/dist/{ResizeHandle-CdA_JYfN.js.map → ResizeHandle-CXjc1meV.js.map} +1 -1
- package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
- package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
- package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
- package/dist/components/window/Drawer.d.ts +3 -1
- package/dist/components/window/DrawerLayers.d.ts +1 -1
- package/dist/components/window/drawerStyles.d.ts +69 -0
- package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
- package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -0
- package/dist/config.cjs +1 -1
- package/dist/config.js +3 -3
- package/dist/constants/styles.d.ts +17 -0
- package/dist/dialog/index.d.ts +69 -0
- package/dist/floating.js +1 -1
- package/dist/grid.cjs +1 -1
- package/dist/grid.js +2 -2
- package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +7 -0
- package/dist/hooks/gesture/types.d.ts +48 -5
- package/dist/hooks/gesture/utils.d.ts +19 -0
- package/dist/hooks/useAnimationFrame.d.ts +2 -0
- package/dist/hooks/useOperationContinuity.d.ts +64 -0
- package/dist/hooks/useResizeObserver.d.ts +33 -1
- package/dist/hooks/useSharedElementTransition.d.ts +112 -0
- package/dist/hooks/useSwipeContentTransform.d.ts +9 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +7 -7
- package/dist/modules/dialog/AlertDialog.d.ts +9 -0
- package/dist/modules/dialog/DialogContainer.d.ts +37 -0
- package/dist/modules/dialog/Modal.d.ts +26 -0
- package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
- package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
- package/dist/modules/dialog/types.d.ts +183 -0
- package/dist/modules/dialog/useDialog.d.ts +39 -0
- package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
- package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
- package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
- package/dist/modules/drawer/types.d.ts +74 -0
- package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
- package/dist/modules/pivot/SwipePivotTabBar.d.ts +3 -0
- package/dist/modules/stack/SwipeStackContent.d.ts +6 -3
- package/dist/modules/stack/SwipeStackOutlet.d.ts +4 -4
- package/dist/modules/stack/computeSwipeStackTransform.d.ts +1 -1
- package/dist/panels.cjs +1 -1
- package/dist/panels.js +1 -1
- package/dist/pivot.cjs +1 -1
- package/dist/pivot.js +1 -1
- package/dist/resizer.cjs +1 -1
- package/dist/resizer.js +2 -2
- package/dist/stack.cjs +1 -1
- package/dist/stack.cjs.map +1 -1
- package/dist/stack.js +503 -762
- package/dist/stack.js.map +1 -1
- package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
- package/dist/sticky-header.cjs +1 -1
- package/dist/sticky-header.cjs.map +1 -1
- package/dist/sticky-header.js +59 -51
- package/dist/sticky-header.js.map +1 -1
- package/dist/{styles-DPPuJ0sf.js → styles-NkjuMOVS.js} +13 -13
- package/dist/{styles-DPPuJ0sf.js.map → styles-NkjuMOVS.js.map} +1 -1
- package/dist/styles-qf6ptVLD.cjs.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/useDocumentPointerEvents-DXxw3qWj.js +54 -0
- package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.cjs.map +1 -0
- package/dist/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
- package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
- package/dist/window/index.d.ts +2 -0
- package/dist/window.cjs +1 -1
- package/dist/window.cjs.map +1 -1
- package/dist/window.js +114 -103
- package/dist/window.js.map +1 -1
- package/package.json +6 -1
- package/src/components/gesture/SwipeSafeZone.tsx +69 -0
- package/src/components/window/Drawer.tsx +249 -162
- package/src/components/window/DrawerLayers.tsx +13 -3
- package/src/components/window/drawerStyles.spec.ts +263 -0
- package/src/components/window/drawerStyles.ts +228 -0
- package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
- package/src/components/window/drawerSwipeConfig.ts +112 -0
- package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
- package/src/components/window/useDrawerSwipeTransform.ts +129 -0
- package/src/constants/styles.ts +19 -0
- package/src/demo/pages/Dialog/alerts/index.tsx +22 -0
- package/src/demo/pages/Dialog/card/index.tsx +22 -0
- package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
- package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
- package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
- package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
- package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
- package/src/demo/pages/Dialog/modal/index.tsx +17 -0
- package/src/demo/pages/Dialog/swipe/index.tsx +22 -0
- package/src/demo/pages/Drawer/components/DrawerSwipe.module.css +316 -0
- package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
- package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
- package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +54 -23
- package/src/demo/pages/Pivot/swipe-debug/index.tsx +1 -1
- package/src/demo/pages/Stack/components/StackBasics.spec.tsx +152 -0
- package/src/demo/pages/Stack/components/StackBasics.tsx +179 -95
- package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
- package/src/demo/pages/Stack/components/StackTablet.tsx +42 -21
- package/src/demo/routes.tsx +22 -1
- package/src/dialog/index.ts +85 -0
- package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +68 -64
- package/src/hooks/gesture/testing/createGestureSimulator.ts +112 -37
- package/src/hooks/gesture/types.ts +83 -6
- package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +22 -14
- package/src/hooks/gesture/useNativeGestureGuard.spec.ts +91 -31
- package/src/hooks/gesture/useNativeGestureGuard.ts +3 -1
- package/src/hooks/gesture/utils.ts +91 -0
- package/src/hooks/useAnimatedVisibility.spec.ts +44 -24
- package/src/hooks/useAnimatedVisibility.ts +28 -2
- package/src/hooks/useAnimationFrame.ts +8 -0
- package/src/hooks/useOperationContinuity.spec.ts +387 -0
- package/src/hooks/useOperationContinuity.ts +135 -0
- package/src/hooks/useResizeObserver.spec.tsx +277 -0
- package/src/hooks/useResizeObserver.tsx +108 -39
- package/src/hooks/useScrollContainer.ts +4 -10
- package/src/hooks/useSharedElementTransition.ts +333 -0
- package/src/hooks/useSwipeContentTransform.spec.ts +18 -18
- package/src/hooks/useSwipeContentTransform.ts +166 -28
- package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
- package/src/modules/dialog/AlertDialog.tsx +221 -0
- package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
- package/src/modules/dialog/DialogContainer.tsx +188 -0
- package/src/modules/dialog/Modal.spec.tsx +220 -0
- package/src/modules/dialog/Modal.tsx +182 -0
- package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
- package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
- package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
- package/src/modules/dialog/types.ts +186 -0
- package/src/modules/dialog/useDialog.spec.tsx +447 -0
- package/src/modules/dialog/useDialog.ts +214 -0
- package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
- package/src/modules/dialog/useDialogContainer.ts +150 -0
- package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
- package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
- package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
- package/src/modules/dialog/useDialogTransform.ts +407 -0
- package/src/modules/drawer/types.ts +102 -0
- package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
- package/src/modules/drawer/useDrawerSwipeInput.ts +399 -0
- package/src/modules/panels/rendering/ContentRegistry.spec.tsx +21 -14
- package/src/modules/pivot/SwipePivotContent.position.spec.tsx +12 -8
- package/src/modules/pivot/SwipePivotContent.spec.tsx +55 -25
- package/src/modules/pivot/SwipePivotContent.tsx +2 -2
- package/src/modules/pivot/SwipePivotTabBar.spec.tsx +85 -68
- package/src/modules/pivot/SwipePivotTabBar.tsx +75 -15
- package/src/modules/pivot/scaleInputState.spec.ts +11 -2
- package/src/modules/pivot/usePivot.spec.ts +17 -3
- package/src/modules/pivot/usePivotSwipeInput.spec.ts +182 -123
- package/src/modules/stack/SwipeStackContent.spec.tsx +387 -100
- package/src/modules/stack/SwipeStackContent.tsx +43 -33
- package/src/modules/stack/SwipeStackOutlet.spec.tsx +14 -16
- package/src/modules/stack/SwipeStackOutlet.tsx +6 -6
- package/src/modules/stack/computeSwipeStackTransform.spec.ts +5 -5
- package/src/modules/stack/computeSwipeStackTransform.ts +3 -3
- package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
- package/src/modules/stack/useStackAnimationState.spec.ts +3 -1
- package/src/modules/stack/useStackAnimationState.ts +18 -13
- package/src/modules/stack/useStackNavigation.spec.ts +198 -3
- package/src/modules/stack/useStackNavigation.tsx +113 -56
- package/src/modules/stack/useStackSwipeInput.spec.ts +65 -32
- package/src/modules/stack/useStackSwipeInput.ts +1 -1
- package/src/sticky-header/StickyArea.tsx +29 -57
- package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
- package/src/sticky-header/calculateStickyMetrics.ts +50 -0
- package/src/types.ts +18 -0
- package/src/window/index.ts +2 -0
- package/dist/FloatingWindow-BpdOpg_L.js +0 -400
- package/dist/FloatingWindow-BpdOpg_L.js.map +0 -1
- package/dist/FloatingWindow-TCDNY5gE.cjs +0 -2
- package/dist/FloatingWindow-TCDNY5gE.cjs.map +0 -1
- package/dist/GridLayout-B4VRsC0r.cjs +0 -2
- package/dist/ResizeHandle-CScipO5l.cjs +0 -2
- package/dist/SwipePivotTabBar-BGO9X94m.js +0 -407
- package/dist/SwipePivotTabBar-BGO9X94m.js.map +0 -1
- package/dist/SwipePivotTabBar-BrQismcZ.cjs +0 -2
- package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +0 -1
- package/dist/useDocumentPointerEvents-CKdhGXd0.js +0 -46
- package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +0 -1
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +0 -2
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +0 -1
- package/dist/useEffectEvent-Dp7HLCf0.js +0 -13
- package/dist/useEffectEvent-Dp7HLCf0.js.map +0 -1
- package/dist/useEffectEvent-huSsGUnl.cjs +0 -2
- package/dist/useEffectEvent-huSsGUnl.cjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const R=require("react/jsx-runtime"),I=require("react"),_=require("./useDocumentPointerEvents-DxDSOtip.cjs"),u=require("./styles-qf6ptVLD.cjs");function b(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return n.default=e,Object.freeze(n)}const t=b(I),v=e=>{const n=t.useRef(null),r=t.useRef(null),s=t.useRef(0),[a,c]=t.useState(!1),l=_.useEffectEvent(o=>{e.onResize?.(o)}),i=t.useCallback(o=>e.axis==="x"?o.clientX:o.clientY,[e.axis]),p=t.useCallback(o=>{o.preventDefault(),n.current=o.currentTarget,r.current=o.pointerId,s.current=i(o),c(!0)},[i]),d=t.useCallback(o=>{const E=i(o),g=E-s.current;g!==0&&(s.current=E,l(g))},[i,l]),f=t.useCallback(()=>{c(!1),r.current=null},[]);return _.useDragPointerEvents(n,a,{onMove:d,onUp:f,pointerId:r.current??void 0,capturePointer:!0,preventDefaults:!1}),{ref:n,onPointerDown:p,isDragging:a}},h=({element:e,component:n})=>t.forwardRef(({children:r,...s},a)=>e?t.cloneElement(e,{...s,ref:a},r??e.props.children):n?R.jsx(n,{...s,ref:a,children:r}):R.jsx("div",{...s,ref:a,children:r}));function S({element:e,component:n}){return t.useMemo(()=>h({element:e,component:n}),[n,e])}const m={position:"absolute",zIndex:u.RESIZE_HANDLE_Z_INDEX},z={vertical:{width:u.RESIZE_HANDLE_THICKNESS,height:"100%",top:0,cursor:"col-resize"},horizontal:{width:"100%",height:u.RESIZE_HANDLE_THICKNESS,left:0,cursor:"row-resize"}},H={idle:u.COLOR_RESIZE_HANDLE_IDLE,hovered:u.COLOR_RESIZE_HANDLE_HOVER,dragging:u.COLOR_RESIZE_HANDLE_ACTIVE},P=({direction:e,onResize:n,component:r,element:s,children:a})=>{const c=e==="vertical"?"x":"y",{ref:l,isDragging:i,onPointerDown:p}=v({axis:c,onResize:n}),[d,f]=t.useState(!1),o=t.useCallback(()=>{f(!0)},[]),E=t.useCallback(()=>{f(!1)},[]),g=S({element:s,component:r}),D=t.useMemo(()=>i?"dragging":d?"hovered":"idle",[i,d]),C=t.useMemo(()=>({...m,...z[e],backgroundColor:H[D],touchAction:"none"}),[e,D]);return R.jsx(g,{ref:l,style:C,role:"separator","aria-orientation":e,"aria-hidden":void 0,"data-resize-handle":"true","data-direction":e,"data-is-dragging":i?"true":void 0,onPointerDown:p,onPointerEnter:o,onPointerLeave:E,children:a})};exports.ResizeHandle=P;exports.useElementComponentWrapper=S;exports.useResizeDrag=v;
|
|
2
|
+
//# sourceMappingURL=ResizeHandle-CBcAS918.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeHandle-CScipO5l.cjs","sources":["../src/modules/resizer/useResizeDrag.ts","../src/hooks/useElementComponentWrapper.tsx","../src/components/resizer/ResizeHandle.tsx"],"sourcesContent":["/**\n * @file Shared logic for draggable resize handles.\n */\nimport * as React from \"react\";\nimport { useDragPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\n\nexport type ResizeDragAxis = \"x\" | \"y\";\n\nexport type UseResizeDragOptions = {\n /** Axis along which the drag should compute deltas */\n axis: ResizeDragAxis;\n /** Callback invoked with the delta value when dragging */\n onResize?: (delta: number) => void;\n};\n\nexport type UseResizeDragResult<TElement extends HTMLElement> = {\n /** Ref to attach to the draggable element */\n ref: React.RefObject<TElement | null>;\n /** Pointer down handler to initiate dragging */\n onPointerDown: (event: React.PointerEvent<TElement>) => void;\n /** Whether a drag interaction is currently active */\n isDragging: boolean;\n};\n\n/**\n * Provides unified pointer handling for resize-capable UI elements.\n *\n * @param options - Configuration for the drag interaction.\n * @returns Handlers and state for wiring into a draggable element.\n */\nexport const useResizeDrag = <TElement extends HTMLElement = HTMLElement>(\n options: UseResizeDragOptions,\n): UseResizeDragResult<TElement> => {\n const elementRef = React.useRef<TElement | null>(null);\n const pointerIdRef = React.useRef<number | null>(null);\n const previousCoordinateRef = React.useRef<number>(0);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const emitResize = useEffectEvent((delta: number) => {\n options.onResize?.(delta);\n });\n\n const getCoordinate = React.useCallback(\n (event: PointerEvent | React.PointerEvent) => {\n return options.axis === \"x\" ? event.clientX : event.clientY;\n },\n [options.axis],\n );\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent<TElement>) => {\n event.preventDefault();\n elementRef.current = event.currentTarget;\n pointerIdRef.current = event.pointerId;\n previousCoordinateRef.current = getCoordinate(event);\n setIsDragging(true);\n },\n [getCoordinate],\n );\n\n const handlePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const coordinate = getCoordinate(event);\n const delta = coordinate - previousCoordinateRef.current;\n if (delta === 0) {\n return;\n }\n previousCoordinateRef.current = coordinate;\n emitResize(delta);\n },\n [getCoordinate, emitResize],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n pointerIdRef.current = null;\n }, []);\n\n useDragPointerEvents(elementRef as React.RefObject<HTMLElement | null>, isDragging, {\n onMove: handlePointerMove,\n onUp: handlePointerUp,\n pointerId: pointerIdRef.current ?? undefined,\n capturePointer: true,\n preventDefaults: false,\n });\n\n return {\n ref: elementRef,\n onPointerDown: handlePointerDown,\n isDragging,\n };\n};\n\n","/**\n * @file Hook for building wrapper components that accept either an element or a component override.\n */\nimport * as React from \"react\";\n\ntype WrapperProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = WrapperProps & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\ntype UseElementComponentWrapperOptions = {\n element?: React.ReactElement<WrapperProps>;\n component?: React.ComponentType<WrapperProps & { ref?: React.Ref<HTMLDivElement> }>;\n};\n\ntype WrapperComponent = React.ForwardRefExoticComponent<\n React.PropsWithChildren<WrapperProps> & React.RefAttributes<HTMLDivElement>\n>;\n\nconst createWrapperComponent = ({\n element,\n component: Component,\n}: UseElementComponentWrapperOptions): WrapperComponent =>\n React.forwardRef<HTMLDivElement, React.PropsWithChildren<WrapperProps>>(({ children, ...rest }, forwardedRef) => {\n if (element) {\n return React.cloneElement(\n element,\n { ...rest, ref: forwardedRef } as CloneableProps,\n children ?? element.props.children\n );\n }\n if (Component) {\n return (\n <Component {...rest} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n return (\n <div {...rest} ref={forwardedRef}>\n {children}\n </div>\n );\n });\n\n/**\n * Memoizes a wrapper component that can render either a provided element, a provided component, or a default tag.\n * @returns Wrapper component honoring the overrides.\n */\nexport function useElementComponentWrapper({\n element,\n component,\n}: UseElementComponentWrapperOptions): WrapperComponent {\n return React.useMemo(\n () =>\n createWrapperComponent({\n element,\n component,\n }),\n [component, element]\n );\n}\n","/**\n * @file Resize handle component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport {\n RESIZE_HANDLE_THICKNESS,\n RESIZE_HANDLE_Z_INDEX,\n COLOR_RESIZE_HANDLE_IDLE,\n COLOR_RESIZE_HANDLE_ACTIVE,\n COLOR_RESIZE_HANDLE_HOVER,\n} from \"../../constants/styles\";\nimport { useElementComponentWrapper } from \"../../hooks/useElementComponentWrapper\";\n\ntype ResizeHandleDirection = \"horizontal\" | \"vertical\";\n\nexport type ResizeHandleProps = {\n /** Direction of resize */\n direction: ResizeHandleDirection;\n /** Callback when resize occurs */\n onResize?: (delta: number) => void;\n /** Custom component for the handle */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the handle */\n element?: React.ReactElement<React.HTMLAttributes<HTMLDivElement>>;\n /** Optional children rendered inside the handle */\n children?: React.ReactNode;\n};\n\nconst baseResizeHandleStyle: React.CSSProperties = {\n position: \"absolute\",\n zIndex: RESIZE_HANDLE_Z_INDEX,\n};\n\nconst sizeStylesByDirection: Record<ResizeHandleDirection, React.CSSProperties> = {\n vertical: {\n width: RESIZE_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n cursor: \"col-resize\",\n },\n horizontal: {\n width: \"100%\",\n height: RESIZE_HANDLE_THICKNESS,\n left: 0,\n cursor: \"row-resize\",\n },\n};\n\ntype ResizeHandleVisualState = \"idle\" | \"hovered\" | \"dragging\";\n\nconst backgroundByVisualState: Record<ResizeHandleVisualState, string> = {\n idle: COLOR_RESIZE_HANDLE_IDLE,\n hovered: COLOR_RESIZE_HANDLE_HOVER,\n dragging: COLOR_RESIZE_HANDLE_ACTIVE,\n};\n\n/**\n * ResizeHandle - Draggable handle for resizing grid areas\n */\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n direction,\n onResize,\n component: Component,\n element,\n children,\n}) => {\n const axis = direction === \"vertical\" ? \"x\" : \"y\";\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({ axis, onResize });\n const [isHovered, setIsHovered] = React.useState(false);\n const handlePointerEnter = React.useCallback(() => {\n setIsHovered(true);\n }, []);\n const handlePointerLeave = React.useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const Wrapper = useElementComponentWrapper({\n element,\n component: Component,\n });\n const visualState: ResizeHandleVisualState = React.useMemo(() => {\n if (isDragging) {\n return \"dragging\";\n }\n if (isHovered) {\n return \"hovered\";\n }\n return \"idle\";\n }, [isDragging, isHovered]);\n\n const style = React.useMemo(() => {\n return {\n ...baseResizeHandleStyle,\n ...sizeStylesByDirection[direction],\n backgroundColor: backgroundByVisualState[visualState],\n touchAction: \"none\",\n };\n }, [direction, visualState]);\n\n return (\n <Wrapper\n ref={ref}\n style={style}\n role=\"separator\"\n aria-orientation={direction}\n aria-hidden={undefined}\n data-resize-handle=\"true\"\n data-direction={direction}\n data-is-dragging={isDragging ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n >\n {children}\n </Wrapper>\n );\n};\n"],"names":["useResizeDrag","options","elementRef","React","pointerIdRef","previousCoordinateRef","isDragging","setIsDragging","emitResize","useEffectEvent","delta","getCoordinate","event","handlePointerDown","handlePointerMove","coordinate","handlePointerUp","useDragPointerEvents","createWrapperComponent","element","Component","children","rest","forwardedRef","useElementComponentWrapper","component","baseResizeHandleStyle","RESIZE_HANDLE_Z_INDEX","sizeStylesByDirection","RESIZE_HANDLE_THICKNESS","backgroundByVisualState","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","ResizeHandle","direction","onResize","axis","ref","onPointerDown","isHovered","setIsHovered","handlePointerEnter","handlePointerLeave","Wrapper","visualState","style","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResizeHandle-CBcAS918.cjs","sources":["../src/modules/resizer/useResizeDrag.ts","../src/hooks/useElementComponentWrapper.tsx","../src/components/resizer/ResizeHandle.tsx"],"sourcesContent":["/**\n * @file Shared logic for draggable resize handles.\n */\nimport * as React from \"react\";\nimport { useDragPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\n\nexport type ResizeDragAxis = \"x\" | \"y\";\n\nexport type UseResizeDragOptions = {\n /** Axis along which the drag should compute deltas */\n axis: ResizeDragAxis;\n /** Callback invoked with the delta value when dragging */\n onResize?: (delta: number) => void;\n};\n\nexport type UseResizeDragResult<TElement extends HTMLElement> = {\n /** Ref to attach to the draggable element */\n ref: React.RefObject<TElement | null>;\n /** Pointer down handler to initiate dragging */\n onPointerDown: (event: React.PointerEvent<TElement>) => void;\n /** Whether a drag interaction is currently active */\n isDragging: boolean;\n};\n\n/**\n * Provides unified pointer handling for resize-capable UI elements.\n *\n * @param options - Configuration for the drag interaction.\n * @returns Handlers and state for wiring into a draggable element.\n */\nexport const useResizeDrag = <TElement extends HTMLElement = HTMLElement>(\n options: UseResizeDragOptions,\n): UseResizeDragResult<TElement> => {\n const elementRef = React.useRef<TElement | null>(null);\n const pointerIdRef = React.useRef<number | null>(null);\n const previousCoordinateRef = React.useRef<number>(0);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const emitResize = useEffectEvent((delta: number) => {\n options.onResize?.(delta);\n });\n\n const getCoordinate = React.useCallback(\n (event: PointerEvent | React.PointerEvent) => {\n return options.axis === \"x\" ? event.clientX : event.clientY;\n },\n [options.axis],\n );\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent<TElement>) => {\n event.preventDefault();\n elementRef.current = event.currentTarget;\n pointerIdRef.current = event.pointerId;\n previousCoordinateRef.current = getCoordinate(event);\n setIsDragging(true);\n },\n [getCoordinate],\n );\n\n const handlePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const coordinate = getCoordinate(event);\n const delta = coordinate - previousCoordinateRef.current;\n if (delta === 0) {\n return;\n }\n previousCoordinateRef.current = coordinate;\n emitResize(delta);\n },\n [getCoordinate, emitResize],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n pointerIdRef.current = null;\n }, []);\n\n useDragPointerEvents(elementRef as React.RefObject<HTMLElement | null>, isDragging, {\n onMove: handlePointerMove,\n onUp: handlePointerUp,\n pointerId: pointerIdRef.current ?? undefined,\n capturePointer: true,\n preventDefaults: false,\n });\n\n return {\n ref: elementRef,\n onPointerDown: handlePointerDown,\n isDragging,\n };\n};\n\n","/**\n * @file Hook for building wrapper components that accept either an element or a component override.\n */\nimport * as React from \"react\";\n\ntype WrapperProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = WrapperProps & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\ntype UseElementComponentWrapperOptions = {\n element?: React.ReactElement<WrapperProps>;\n component?: React.ComponentType<WrapperProps & { ref?: React.Ref<HTMLDivElement> }>;\n};\n\ntype WrapperComponent = React.ForwardRefExoticComponent<\n React.PropsWithChildren<WrapperProps> & React.RefAttributes<HTMLDivElement>\n>;\n\nconst createWrapperComponent = ({\n element,\n component: Component,\n}: UseElementComponentWrapperOptions): WrapperComponent =>\n React.forwardRef<HTMLDivElement, React.PropsWithChildren<WrapperProps>>(({ children, ...rest }, forwardedRef) => {\n if (element) {\n return React.cloneElement(\n element,\n { ...rest, ref: forwardedRef } as CloneableProps,\n children ?? element.props.children\n );\n }\n if (Component) {\n return (\n <Component {...rest} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n return (\n <div {...rest} ref={forwardedRef}>\n {children}\n </div>\n );\n });\n\n/**\n * Memoizes a wrapper component that can render either a provided element, a provided component, or a default tag.\n * @returns Wrapper component honoring the overrides.\n */\nexport function useElementComponentWrapper({\n element,\n component,\n}: UseElementComponentWrapperOptions): WrapperComponent {\n return React.useMemo(\n () =>\n createWrapperComponent({\n element,\n component,\n }),\n [component, element]\n );\n}\n","/**\n * @file Resize handle component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport {\n RESIZE_HANDLE_THICKNESS,\n RESIZE_HANDLE_Z_INDEX,\n COLOR_RESIZE_HANDLE_IDLE,\n COLOR_RESIZE_HANDLE_ACTIVE,\n COLOR_RESIZE_HANDLE_HOVER,\n} from \"../../constants/styles\";\nimport { useElementComponentWrapper } from \"../../hooks/useElementComponentWrapper\";\n\ntype ResizeHandleDirection = \"horizontal\" | \"vertical\";\n\nexport type ResizeHandleProps = {\n /** Direction of resize */\n direction: ResizeHandleDirection;\n /** Callback when resize occurs */\n onResize?: (delta: number) => void;\n /** Custom component for the handle */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the handle */\n element?: React.ReactElement<React.HTMLAttributes<HTMLDivElement>>;\n /** Optional children rendered inside the handle */\n children?: React.ReactNode;\n};\n\nconst baseResizeHandleStyle: React.CSSProperties = {\n position: \"absolute\",\n zIndex: RESIZE_HANDLE_Z_INDEX,\n};\n\nconst sizeStylesByDirection: Record<ResizeHandleDirection, React.CSSProperties> = {\n vertical: {\n width: RESIZE_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n cursor: \"col-resize\",\n },\n horizontal: {\n width: \"100%\",\n height: RESIZE_HANDLE_THICKNESS,\n left: 0,\n cursor: \"row-resize\",\n },\n};\n\ntype ResizeHandleVisualState = \"idle\" | \"hovered\" | \"dragging\";\n\nconst backgroundByVisualState: Record<ResizeHandleVisualState, string> = {\n idle: COLOR_RESIZE_HANDLE_IDLE,\n hovered: COLOR_RESIZE_HANDLE_HOVER,\n dragging: COLOR_RESIZE_HANDLE_ACTIVE,\n};\n\n/**\n * ResizeHandle - Draggable handle for resizing grid areas\n */\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n direction,\n onResize,\n component: Component,\n element,\n children,\n}) => {\n const axis = direction === \"vertical\" ? \"x\" : \"y\";\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({ axis, onResize });\n const [isHovered, setIsHovered] = React.useState(false);\n const handlePointerEnter = React.useCallback(() => {\n setIsHovered(true);\n }, []);\n const handlePointerLeave = React.useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const Wrapper = useElementComponentWrapper({\n element,\n component: Component,\n });\n const visualState: ResizeHandleVisualState = React.useMemo(() => {\n if (isDragging) {\n return \"dragging\";\n }\n if (isHovered) {\n return \"hovered\";\n }\n return \"idle\";\n }, [isDragging, isHovered]);\n\n const style = React.useMemo(() => {\n return {\n ...baseResizeHandleStyle,\n ...sizeStylesByDirection[direction],\n backgroundColor: backgroundByVisualState[visualState],\n touchAction: \"none\",\n };\n }, [direction, visualState]);\n\n return (\n <Wrapper\n ref={ref}\n style={style}\n role=\"separator\"\n aria-orientation={direction}\n aria-hidden={undefined}\n data-resize-handle=\"true\"\n data-direction={direction}\n data-is-dragging={isDragging ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n >\n {children}\n </Wrapper>\n );\n};\n"],"names":["useResizeDrag","options","elementRef","React","pointerIdRef","previousCoordinateRef","isDragging","setIsDragging","emitResize","useEffectEvent","delta","getCoordinate","event","handlePointerDown","handlePointerMove","coordinate","handlePointerUp","useDragPointerEvents","createWrapperComponent","element","Component","children","rest","forwardedRef","useElementComponentWrapper","component","baseResizeHandleStyle","RESIZE_HANDLE_Z_INDEX","sizeStylesByDirection","RESIZE_HANDLE_THICKNESS","backgroundByVisualState","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","ResizeHandle","direction","onResize","axis","ref","onPointerDown","isHovered","setIsHovered","handlePointerEnter","handlePointerLeave","Wrapper","visualState","style","jsx"],"mappings":"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"}
|
|
@@ -1,29 +1,28 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as p } from "react/jsx-runtime";
|
|
2
2
|
import * as r from "react";
|
|
3
|
-
import { u as
|
|
4
|
-
import {
|
|
5
|
-
import { a as C, b as I, c as _, R as D, q as S } from "./styles-DPPuJ0sf.js";
|
|
3
|
+
import { u as v, a as m } from "./useDocumentPointerEvents-DXxw3qWj.js";
|
|
4
|
+
import { a as C, b as I, c as _, R as D, q as S } from "./styles-NkjuMOVS.js";
|
|
6
5
|
const b = (e) => {
|
|
7
|
-
const n = r.useRef(null), o = r.useRef(null),
|
|
6
|
+
const n = r.useRef(null), o = r.useRef(null), a = r.useRef(0), [s, u] = r.useState(!1), c = v((t) => {
|
|
8
7
|
e.onResize?.(t);
|
|
9
8
|
}), i = r.useCallback(
|
|
10
9
|
(t) => e.axis === "x" ? t.clientX : t.clientY,
|
|
11
10
|
[e.axis]
|
|
12
|
-
),
|
|
11
|
+
), g = r.useCallback(
|
|
13
12
|
(t) => {
|
|
14
|
-
t.preventDefault(), n.current = t.currentTarget, o.current = t.pointerId,
|
|
13
|
+
t.preventDefault(), n.current = t.currentTarget, o.current = t.pointerId, a.current = i(t), u(!0);
|
|
15
14
|
},
|
|
16
15
|
[i]
|
|
17
16
|
), l = r.useCallback(
|
|
18
17
|
(t) => {
|
|
19
|
-
const f = i(t),
|
|
20
|
-
|
|
18
|
+
const f = i(t), E = f - a.current;
|
|
19
|
+
E !== 0 && (a.current = f, c(E));
|
|
21
20
|
},
|
|
22
21
|
[i, c]
|
|
23
22
|
), d = r.useCallback(() => {
|
|
24
23
|
u(!1), o.current = null;
|
|
25
24
|
}, []);
|
|
26
|
-
return
|
|
25
|
+
return m(n, s, {
|
|
27
26
|
onMove: l,
|
|
28
27
|
onUp: d,
|
|
29
28
|
pointerId: o.current ?? void 0,
|
|
@@ -31,17 +30,17 @@ const b = (e) => {
|
|
|
31
30
|
preventDefaults: !1
|
|
32
31
|
}), {
|
|
33
32
|
ref: n,
|
|
34
|
-
onPointerDown:
|
|
35
|
-
isDragging:
|
|
33
|
+
onPointerDown: g,
|
|
34
|
+
isDragging: s
|
|
36
35
|
};
|
|
37
36
|
}, z = ({
|
|
38
37
|
element: e,
|
|
39
38
|
component: n
|
|
40
|
-
}) => r.forwardRef(({ children: o, ...
|
|
39
|
+
}) => r.forwardRef(({ children: o, ...a }, s) => e ? r.cloneElement(
|
|
41
40
|
e,
|
|
42
|
-
{ ...
|
|
41
|
+
{ ...a, ref: s },
|
|
43
42
|
o ?? e.props.children
|
|
44
|
-
) : n ? /* @__PURE__ */
|
|
43
|
+
) : n ? /* @__PURE__ */ p(n, { ...a, ref: s, children: o }) : /* @__PURE__ */ p("div", { ...a, ref: s, children: o }));
|
|
45
44
|
function H({
|
|
46
45
|
element: e,
|
|
47
46
|
component: n
|
|
@@ -74,47 +73,47 @@ const L = {
|
|
|
74
73
|
idle: _,
|
|
75
74
|
hovered: I,
|
|
76
75
|
dragging: C
|
|
77
|
-
},
|
|
76
|
+
}, O = ({
|
|
78
77
|
direction: e,
|
|
79
78
|
onResize: n,
|
|
80
79
|
component: o,
|
|
81
|
-
element:
|
|
82
|
-
children:
|
|
80
|
+
element: a,
|
|
81
|
+
children: s
|
|
83
82
|
}) => {
|
|
84
|
-
const u = e === "vertical" ? "x" : "y", { ref: c, isDragging: i, onPointerDown:
|
|
83
|
+
const u = e === "vertical" ? "x" : "y", { ref: c, isDragging: i, onPointerDown: g } = b({ axis: u, onResize: n }), [l, d] = r.useState(!1), t = r.useCallback(() => {
|
|
85
84
|
d(!0);
|
|
86
85
|
}, []), f = r.useCallback(() => {
|
|
87
86
|
d(!1);
|
|
88
|
-
}, []),
|
|
89
|
-
element:
|
|
87
|
+
}, []), E = H({
|
|
88
|
+
element: a,
|
|
90
89
|
component: o
|
|
91
|
-
}), R = r.useMemo(() => i ? "dragging" : l ? "hovered" : "idle", [i, l]),
|
|
90
|
+
}), R = r.useMemo(() => i ? "dragging" : l ? "hovered" : "idle", [i, l]), h = r.useMemo(() => ({
|
|
92
91
|
...L,
|
|
93
92
|
...P[e],
|
|
94
93
|
backgroundColor: k[R],
|
|
95
94
|
touchAction: "none"
|
|
96
95
|
}), [e, R]);
|
|
97
|
-
return /* @__PURE__ */
|
|
98
|
-
|
|
96
|
+
return /* @__PURE__ */ p(
|
|
97
|
+
E,
|
|
99
98
|
{
|
|
100
99
|
ref: c,
|
|
101
|
-
style:
|
|
100
|
+
style: h,
|
|
102
101
|
role: "separator",
|
|
103
102
|
"aria-orientation": e,
|
|
104
103
|
"aria-hidden": void 0,
|
|
105
104
|
"data-resize-handle": "true",
|
|
106
105
|
"data-direction": e,
|
|
107
106
|
"data-is-dragging": i ? "true" : void 0,
|
|
108
|
-
onPointerDown:
|
|
107
|
+
onPointerDown: g,
|
|
109
108
|
onPointerEnter: t,
|
|
110
109
|
onPointerLeave: f,
|
|
111
|
-
children:
|
|
110
|
+
children: s
|
|
112
111
|
}
|
|
113
112
|
);
|
|
114
113
|
};
|
|
115
114
|
export {
|
|
116
|
-
|
|
115
|
+
O as R,
|
|
117
116
|
H as a,
|
|
118
117
|
b as u
|
|
119
118
|
};
|
|
120
|
-
//# sourceMappingURL=ResizeHandle-
|
|
119
|
+
//# sourceMappingURL=ResizeHandle-CXjc1meV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeHandle-CdA_JYfN.js","sources":["../src/modules/resizer/useResizeDrag.ts","../src/hooks/useElementComponentWrapper.tsx","../src/components/resizer/ResizeHandle.tsx"],"sourcesContent":["/**\n * @file Shared logic for draggable resize handles.\n */\nimport * as React from \"react\";\nimport { useDragPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\n\nexport type ResizeDragAxis = \"x\" | \"y\";\n\nexport type UseResizeDragOptions = {\n /** Axis along which the drag should compute deltas */\n axis: ResizeDragAxis;\n /** Callback invoked with the delta value when dragging */\n onResize?: (delta: number) => void;\n};\n\nexport type UseResizeDragResult<TElement extends HTMLElement> = {\n /** Ref to attach to the draggable element */\n ref: React.RefObject<TElement | null>;\n /** Pointer down handler to initiate dragging */\n onPointerDown: (event: React.PointerEvent<TElement>) => void;\n /** Whether a drag interaction is currently active */\n isDragging: boolean;\n};\n\n/**\n * Provides unified pointer handling for resize-capable UI elements.\n *\n * @param options - Configuration for the drag interaction.\n * @returns Handlers and state for wiring into a draggable element.\n */\nexport const useResizeDrag = <TElement extends HTMLElement = HTMLElement>(\n options: UseResizeDragOptions,\n): UseResizeDragResult<TElement> => {\n const elementRef = React.useRef<TElement | null>(null);\n const pointerIdRef = React.useRef<number | null>(null);\n const previousCoordinateRef = React.useRef<number>(0);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const emitResize = useEffectEvent((delta: number) => {\n options.onResize?.(delta);\n });\n\n const getCoordinate = React.useCallback(\n (event: PointerEvent | React.PointerEvent) => {\n return options.axis === \"x\" ? event.clientX : event.clientY;\n },\n [options.axis],\n );\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent<TElement>) => {\n event.preventDefault();\n elementRef.current = event.currentTarget;\n pointerIdRef.current = event.pointerId;\n previousCoordinateRef.current = getCoordinate(event);\n setIsDragging(true);\n },\n [getCoordinate],\n );\n\n const handlePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const coordinate = getCoordinate(event);\n const delta = coordinate - previousCoordinateRef.current;\n if (delta === 0) {\n return;\n }\n previousCoordinateRef.current = coordinate;\n emitResize(delta);\n },\n [getCoordinate, emitResize],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n pointerIdRef.current = null;\n }, []);\n\n useDragPointerEvents(elementRef as React.RefObject<HTMLElement | null>, isDragging, {\n onMove: handlePointerMove,\n onUp: handlePointerUp,\n pointerId: pointerIdRef.current ?? undefined,\n capturePointer: true,\n preventDefaults: false,\n });\n\n return {\n ref: elementRef,\n onPointerDown: handlePointerDown,\n isDragging,\n };\n};\n\n","/**\n * @file Hook for building wrapper components that accept either an element or a component override.\n */\nimport * as React from \"react\";\n\ntype WrapperProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = WrapperProps & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\ntype UseElementComponentWrapperOptions = {\n element?: React.ReactElement<WrapperProps>;\n component?: React.ComponentType<WrapperProps & { ref?: React.Ref<HTMLDivElement> }>;\n};\n\ntype WrapperComponent = React.ForwardRefExoticComponent<\n React.PropsWithChildren<WrapperProps> & React.RefAttributes<HTMLDivElement>\n>;\n\nconst createWrapperComponent = ({\n element,\n component: Component,\n}: UseElementComponentWrapperOptions): WrapperComponent =>\n React.forwardRef<HTMLDivElement, React.PropsWithChildren<WrapperProps>>(({ children, ...rest }, forwardedRef) => {\n if (element) {\n return React.cloneElement(\n element,\n { ...rest, ref: forwardedRef } as CloneableProps,\n children ?? element.props.children\n );\n }\n if (Component) {\n return (\n <Component {...rest} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n return (\n <div {...rest} ref={forwardedRef}>\n {children}\n </div>\n );\n });\n\n/**\n * Memoizes a wrapper component that can render either a provided element, a provided component, or a default tag.\n * @returns Wrapper component honoring the overrides.\n */\nexport function useElementComponentWrapper({\n element,\n component,\n}: UseElementComponentWrapperOptions): WrapperComponent {\n return React.useMemo(\n () =>\n createWrapperComponent({\n element,\n component,\n }),\n [component, element]\n );\n}\n","/**\n * @file Resize handle component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport {\n RESIZE_HANDLE_THICKNESS,\n RESIZE_HANDLE_Z_INDEX,\n COLOR_RESIZE_HANDLE_IDLE,\n COLOR_RESIZE_HANDLE_ACTIVE,\n COLOR_RESIZE_HANDLE_HOVER,\n} from \"../../constants/styles\";\nimport { useElementComponentWrapper } from \"../../hooks/useElementComponentWrapper\";\n\ntype ResizeHandleDirection = \"horizontal\" | \"vertical\";\n\nexport type ResizeHandleProps = {\n /** Direction of resize */\n direction: ResizeHandleDirection;\n /** Callback when resize occurs */\n onResize?: (delta: number) => void;\n /** Custom component for the handle */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the handle */\n element?: React.ReactElement<React.HTMLAttributes<HTMLDivElement>>;\n /** Optional children rendered inside the handle */\n children?: React.ReactNode;\n};\n\nconst baseResizeHandleStyle: React.CSSProperties = {\n position: \"absolute\",\n zIndex: RESIZE_HANDLE_Z_INDEX,\n};\n\nconst sizeStylesByDirection: Record<ResizeHandleDirection, React.CSSProperties> = {\n vertical: {\n width: RESIZE_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n cursor: \"col-resize\",\n },\n horizontal: {\n width: \"100%\",\n height: RESIZE_HANDLE_THICKNESS,\n left: 0,\n cursor: \"row-resize\",\n },\n};\n\ntype ResizeHandleVisualState = \"idle\" | \"hovered\" | \"dragging\";\n\nconst backgroundByVisualState: Record<ResizeHandleVisualState, string> = {\n idle: COLOR_RESIZE_HANDLE_IDLE,\n hovered: COLOR_RESIZE_HANDLE_HOVER,\n dragging: COLOR_RESIZE_HANDLE_ACTIVE,\n};\n\n/**\n * ResizeHandle - Draggable handle for resizing grid areas\n */\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n direction,\n onResize,\n component: Component,\n element,\n children,\n}) => {\n const axis = direction === \"vertical\" ? \"x\" : \"y\";\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({ axis, onResize });\n const [isHovered, setIsHovered] = React.useState(false);\n const handlePointerEnter = React.useCallback(() => {\n setIsHovered(true);\n }, []);\n const handlePointerLeave = React.useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const Wrapper = useElementComponentWrapper({\n element,\n component: Component,\n });\n const visualState: ResizeHandleVisualState = React.useMemo(() => {\n if (isDragging) {\n return \"dragging\";\n }\n if (isHovered) {\n return \"hovered\";\n }\n return \"idle\";\n }, [isDragging, isHovered]);\n\n const style = React.useMemo(() => {\n return {\n ...baseResizeHandleStyle,\n ...sizeStylesByDirection[direction],\n backgroundColor: backgroundByVisualState[visualState],\n touchAction: \"none\",\n };\n }, [direction, visualState]);\n\n return (\n <Wrapper\n ref={ref}\n style={style}\n role=\"separator\"\n aria-orientation={direction}\n aria-hidden={undefined}\n data-resize-handle=\"true\"\n data-direction={direction}\n data-is-dragging={isDragging ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n >\n {children}\n </Wrapper>\n );\n};\n"],"names":["useResizeDrag","options","elementRef","React","pointerIdRef","previousCoordinateRef","isDragging","setIsDragging","emitResize","useEffectEvent","delta","getCoordinate","event","handlePointerDown","handlePointerMove","coordinate","handlePointerUp","useDragPointerEvents","createWrapperComponent","element","Component","children","rest","forwardedRef","useElementComponentWrapper","component","baseResizeHandleStyle","RESIZE_HANDLE_Z_INDEX","sizeStylesByDirection","RESIZE_HANDLE_THICKNESS","backgroundByVisualState","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","ResizeHandle","direction","onResize","axis","ref","onPointerDown","isHovered","setIsHovered","handlePointerEnter","handlePointerLeave","Wrapper","visualState","style","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResizeHandle-CXjc1meV.js","sources":["../src/modules/resizer/useResizeDrag.ts","../src/hooks/useElementComponentWrapper.tsx","../src/components/resizer/ResizeHandle.tsx"],"sourcesContent":["/**\n * @file Shared logic for draggable resize handles.\n */\nimport * as React from \"react\";\nimport { useDragPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\n\nexport type ResizeDragAxis = \"x\" | \"y\";\n\nexport type UseResizeDragOptions = {\n /** Axis along which the drag should compute deltas */\n axis: ResizeDragAxis;\n /** Callback invoked with the delta value when dragging */\n onResize?: (delta: number) => void;\n};\n\nexport type UseResizeDragResult<TElement extends HTMLElement> = {\n /** Ref to attach to the draggable element */\n ref: React.RefObject<TElement | null>;\n /** Pointer down handler to initiate dragging */\n onPointerDown: (event: React.PointerEvent<TElement>) => void;\n /** Whether a drag interaction is currently active */\n isDragging: boolean;\n};\n\n/**\n * Provides unified pointer handling for resize-capable UI elements.\n *\n * @param options - Configuration for the drag interaction.\n * @returns Handlers and state for wiring into a draggable element.\n */\nexport const useResizeDrag = <TElement extends HTMLElement = HTMLElement>(\n options: UseResizeDragOptions,\n): UseResizeDragResult<TElement> => {\n const elementRef = React.useRef<TElement | null>(null);\n const pointerIdRef = React.useRef<number | null>(null);\n const previousCoordinateRef = React.useRef<number>(0);\n const [isDragging, setIsDragging] = React.useState(false);\n\n const emitResize = useEffectEvent((delta: number) => {\n options.onResize?.(delta);\n });\n\n const getCoordinate = React.useCallback(\n (event: PointerEvent | React.PointerEvent) => {\n return options.axis === \"x\" ? event.clientX : event.clientY;\n },\n [options.axis],\n );\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent<TElement>) => {\n event.preventDefault();\n elementRef.current = event.currentTarget;\n pointerIdRef.current = event.pointerId;\n previousCoordinateRef.current = getCoordinate(event);\n setIsDragging(true);\n },\n [getCoordinate],\n );\n\n const handlePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const coordinate = getCoordinate(event);\n const delta = coordinate - previousCoordinateRef.current;\n if (delta === 0) {\n return;\n }\n previousCoordinateRef.current = coordinate;\n emitResize(delta);\n },\n [getCoordinate, emitResize],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n pointerIdRef.current = null;\n }, []);\n\n useDragPointerEvents(elementRef as React.RefObject<HTMLElement | null>, isDragging, {\n onMove: handlePointerMove,\n onUp: handlePointerUp,\n pointerId: pointerIdRef.current ?? undefined,\n capturePointer: true,\n preventDefaults: false,\n });\n\n return {\n ref: elementRef,\n onPointerDown: handlePointerDown,\n isDragging,\n };\n};\n\n","/**\n * @file Hook for building wrapper components that accept either an element or a component override.\n */\nimport * as React from \"react\";\n\ntype WrapperProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = WrapperProps & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\ntype UseElementComponentWrapperOptions = {\n element?: React.ReactElement<WrapperProps>;\n component?: React.ComponentType<WrapperProps & { ref?: React.Ref<HTMLDivElement> }>;\n};\n\ntype WrapperComponent = React.ForwardRefExoticComponent<\n React.PropsWithChildren<WrapperProps> & React.RefAttributes<HTMLDivElement>\n>;\n\nconst createWrapperComponent = ({\n element,\n component: Component,\n}: UseElementComponentWrapperOptions): WrapperComponent =>\n React.forwardRef<HTMLDivElement, React.PropsWithChildren<WrapperProps>>(({ children, ...rest }, forwardedRef) => {\n if (element) {\n return React.cloneElement(\n element,\n { ...rest, ref: forwardedRef } as CloneableProps,\n children ?? element.props.children\n );\n }\n if (Component) {\n return (\n <Component {...rest} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n return (\n <div {...rest} ref={forwardedRef}>\n {children}\n </div>\n );\n });\n\n/**\n * Memoizes a wrapper component that can render either a provided element, a provided component, or a default tag.\n * @returns Wrapper component honoring the overrides.\n */\nexport function useElementComponentWrapper({\n element,\n component,\n}: UseElementComponentWrapperOptions): WrapperComponent {\n return React.useMemo(\n () =>\n createWrapperComponent({\n element,\n component,\n }),\n [component, element]\n );\n}\n","/**\n * @file Resize handle component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport {\n RESIZE_HANDLE_THICKNESS,\n RESIZE_HANDLE_Z_INDEX,\n COLOR_RESIZE_HANDLE_IDLE,\n COLOR_RESIZE_HANDLE_ACTIVE,\n COLOR_RESIZE_HANDLE_HOVER,\n} from \"../../constants/styles\";\nimport { useElementComponentWrapper } from \"../../hooks/useElementComponentWrapper\";\n\ntype ResizeHandleDirection = \"horizontal\" | \"vertical\";\n\nexport type ResizeHandleProps = {\n /** Direction of resize */\n direction: ResizeHandleDirection;\n /** Callback when resize occurs */\n onResize?: (delta: number) => void;\n /** Custom component for the handle */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the handle */\n element?: React.ReactElement<React.HTMLAttributes<HTMLDivElement>>;\n /** Optional children rendered inside the handle */\n children?: React.ReactNode;\n};\n\nconst baseResizeHandleStyle: React.CSSProperties = {\n position: \"absolute\",\n zIndex: RESIZE_HANDLE_Z_INDEX,\n};\n\nconst sizeStylesByDirection: Record<ResizeHandleDirection, React.CSSProperties> = {\n vertical: {\n width: RESIZE_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n cursor: \"col-resize\",\n },\n horizontal: {\n width: \"100%\",\n height: RESIZE_HANDLE_THICKNESS,\n left: 0,\n cursor: \"row-resize\",\n },\n};\n\ntype ResizeHandleVisualState = \"idle\" | \"hovered\" | \"dragging\";\n\nconst backgroundByVisualState: Record<ResizeHandleVisualState, string> = {\n idle: COLOR_RESIZE_HANDLE_IDLE,\n hovered: COLOR_RESIZE_HANDLE_HOVER,\n dragging: COLOR_RESIZE_HANDLE_ACTIVE,\n};\n\n/**\n * ResizeHandle - Draggable handle for resizing grid areas\n */\nexport const ResizeHandle: React.FC<ResizeHandleProps> = ({\n direction,\n onResize,\n component: Component,\n element,\n children,\n}) => {\n const axis = direction === \"vertical\" ? \"x\" : \"y\";\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({ axis, onResize });\n const [isHovered, setIsHovered] = React.useState(false);\n const handlePointerEnter = React.useCallback(() => {\n setIsHovered(true);\n }, []);\n const handlePointerLeave = React.useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const Wrapper = useElementComponentWrapper({\n element,\n component: Component,\n });\n const visualState: ResizeHandleVisualState = React.useMemo(() => {\n if (isDragging) {\n return \"dragging\";\n }\n if (isHovered) {\n return \"hovered\";\n }\n return \"idle\";\n }, [isDragging, isHovered]);\n\n const style = React.useMemo(() => {\n return {\n ...baseResizeHandleStyle,\n ...sizeStylesByDirection[direction],\n backgroundColor: backgroundByVisualState[visualState],\n touchAction: \"none\",\n };\n }, [direction, visualState]);\n\n return (\n <Wrapper\n ref={ref}\n style={style}\n role=\"separator\"\n aria-orientation={direction}\n aria-hidden={undefined}\n data-resize-handle=\"true\"\n data-direction={direction}\n data-is-dragging={isDragging ? \"true\" : undefined}\n onPointerDown={onPointerDown}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={handlePointerLeave}\n >\n {children}\n </Wrapper>\n );\n};\n"],"names":["useResizeDrag","options","elementRef","React","pointerIdRef","previousCoordinateRef","isDragging","setIsDragging","emitResize","useEffectEvent","delta","getCoordinate","event","handlePointerDown","handlePointerMove","coordinate","handlePointerUp","useDragPointerEvents","createWrapperComponent","element","Component","children","rest","forwardedRef","useElementComponentWrapper","component","baseResizeHandleStyle","RESIZE_HANDLE_Z_INDEX","sizeStylesByDirection","RESIZE_HANDLE_THICKNESS","backgroundByVisualState","COLOR_RESIZE_HANDLE_IDLE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_ACTIVE","ResizeHandle","direction","onResize","axis","ref","onPointerDown","isHovered","setIsHovered","handlePointerEnter","handlePointerLeave","Wrapper","visualState","style","jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { jsx as E, Fragment as Q, jsxs as B } from "react/jsx-runtime";
|
|
2
|
+
import * as e from "react";
|
|
3
|
+
import { P as Z, r as G } from "./styles-NkjuMOVS.js";
|
|
4
|
+
import { u as W } from "./useContentCache-CO3LYNmz.js";
|
|
5
|
+
const tt = 1e3;
|
|
6
|
+
function et({
|
|
7
|
+
isVisible: c,
|
|
8
|
+
leaveAnimation: o,
|
|
9
|
+
skipAnimation: s = !1,
|
|
10
|
+
animationTimeout: h = tt
|
|
11
|
+
}) {
|
|
12
|
+
const g = e.useRef(c), [n, i] = e.useState(!1), l = e.useRef(null), R = (v, P) => !!(v || !P || P === "none"), y = (v, P) => !!(v || P);
|
|
13
|
+
e.useEffect(() => () => {
|
|
14
|
+
l.current && clearTimeout(l.current);
|
|
15
|
+
}, []), e.useEffect(() => {
|
|
16
|
+
const v = g.current;
|
|
17
|
+
g.current = c, l.current && (clearTimeout(l.current), l.current = null), v && !c ? R(s, o) ? i(!1) : (i(!0), l.current = setTimeout(() => {
|
|
18
|
+
i(!1);
|
|
19
|
+
}, h)) : !v && c && i(!1);
|
|
20
|
+
}, [c, o, s, h]);
|
|
21
|
+
const m = e.useCallback(
|
|
22
|
+
(v) => {
|
|
23
|
+
v.target === v.currentTarget && n && (l.current && (clearTimeout(l.current), l.current = null), i(!1));
|
|
24
|
+
},
|
|
25
|
+
[n]
|
|
26
|
+
), A = y(c, n);
|
|
27
|
+
return {
|
|
28
|
+
state: {
|
|
29
|
+
shouldDisplay: A,
|
|
30
|
+
isAnimatingOut: n
|
|
31
|
+
},
|
|
32
|
+
props: {
|
|
33
|
+
onAnimationEnd: m
|
|
34
|
+
},
|
|
35
|
+
style: {
|
|
36
|
+
display: A ? "block" : "none"
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const nt = {
|
|
41
|
+
position: "absolute",
|
|
42
|
+
inset: 0,
|
|
43
|
+
width: "100%",
|
|
44
|
+
height: "100%"
|
|
45
|
+
}, rt = e.memo(({ id: c, isActive: o, transitionMode: s, children: h }) => {
|
|
46
|
+
const g = et({
|
|
47
|
+
isVisible: o,
|
|
48
|
+
leaveAnimation: s === "css" ? G : void 0,
|
|
49
|
+
skipAnimation: s !== "css"
|
|
50
|
+
}), n = e.useMemo(() => {
|
|
51
|
+
const l = {
|
|
52
|
+
...nt,
|
|
53
|
+
...g.style,
|
|
54
|
+
pointerEvents: o ? "auto" : "none"
|
|
55
|
+
};
|
|
56
|
+
return s === "css" && (l.animation = o ? Z : G), l;
|
|
57
|
+
}, [o, s, g.style]), i = /* @__PURE__ */ E(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
"data-pivot-content": c,
|
|
61
|
+
"data-active": o ? "true" : "false",
|
|
62
|
+
style: n,
|
|
63
|
+
...g.props,
|
|
64
|
+
children: h
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
return s === "none" ? /* @__PURE__ */ E(e.Activity, { mode: o ? "visible" : "hidden", children: i }) : i;
|
|
68
|
+
}), H = e.createContext(null), st = e.memo(() => {
|
|
69
|
+
const c = e.useContext(H);
|
|
70
|
+
if (!c)
|
|
71
|
+
throw new Error("PivotOutlet must be used within usePivot");
|
|
72
|
+
const [, o] = e.useReducer((n) => n + 1, 0);
|
|
73
|
+
e.useEffect(() => c.subscribe(o), [c]);
|
|
74
|
+
const { items: s, activeId: h, transitionMode: g } = c.getState();
|
|
75
|
+
return /* @__PURE__ */ E(Q, { children: s.map((n) => /* @__PURE__ */ E(rt, { id: n.id, isActive: n.id === h, transitionMode: g, children: n.cache ? c.getCachedContent(n.id) : n.content }, n.id)) });
|
|
76
|
+
});
|
|
77
|
+
function dt(c) {
|
|
78
|
+
const { items: o, activeId: s, defaultActiveId: h, onActiveChange: g, transitionMode: n = "css", navigationMode: i = "linear" } = c, l = s !== void 0, [R, y] = e.useState(() => {
|
|
79
|
+
if (h !== void 0)
|
|
80
|
+
return h;
|
|
81
|
+
const t = o.find((r) => r.disabled !== !0);
|
|
82
|
+
if (!t)
|
|
83
|
+
throw new Error("usePivot: No enabled items provided");
|
|
84
|
+
return t.id;
|
|
85
|
+
}), m = l ? s : R, [A, v] = e.useState(!1), P = e.useCallback(
|
|
86
|
+
(t, r) => {
|
|
87
|
+
const a = o.find((w) => w.id === t);
|
|
88
|
+
if (!a || a.disabled)
|
|
89
|
+
return;
|
|
90
|
+
const d = r?.animated ?? n === "css";
|
|
91
|
+
v(d), l || y(t), g?.(t);
|
|
92
|
+
},
|
|
93
|
+
[o, l, g, n]
|
|
94
|
+
), L = e.useCallback(() => {
|
|
95
|
+
v(!1);
|
|
96
|
+
}, []), V = e.useCallback((t) => t === m, [m]), I = e.useMemo(
|
|
97
|
+
() => o.filter((t) => t.disabled !== !0),
|
|
98
|
+
[o]
|
|
99
|
+
), f = e.useMemo(() => {
|
|
100
|
+
const t = I.findIndex((r) => r.id === m);
|
|
101
|
+
return t === -1 ? 0 : t;
|
|
102
|
+
}, [I, m]), p = I.length, b = e.useCallback(
|
|
103
|
+
(t) => {
|
|
104
|
+
if (t === 0)
|
|
105
|
+
return !1;
|
|
106
|
+
if (i === "loop")
|
|
107
|
+
return p >= 2;
|
|
108
|
+
const r = f + t;
|
|
109
|
+
return r >= 0 && r < p;
|
|
110
|
+
},
|
|
111
|
+
[f, p, i]
|
|
112
|
+
), O = e.useCallback(
|
|
113
|
+
(t) => {
|
|
114
|
+
const r = f + t;
|
|
115
|
+
return i === "loop" ? (r % p + p) % p : r;
|
|
116
|
+
},
|
|
117
|
+
[f, i, p]
|
|
118
|
+
), T = e.useCallback(
|
|
119
|
+
(t, r) => {
|
|
120
|
+
if (!b(t))
|
|
121
|
+
return;
|
|
122
|
+
const a = O(t), d = I[a];
|
|
123
|
+
d && P(d.id, r);
|
|
124
|
+
},
|
|
125
|
+
[b, O, I, P]
|
|
126
|
+
), k = e.useCallback(
|
|
127
|
+
(t) => {
|
|
128
|
+
const r = I.findIndex((d) => d.id === t);
|
|
129
|
+
if (r === -1)
|
|
130
|
+
return null;
|
|
131
|
+
if (i === "linear") {
|
|
132
|
+
const d = r - f;
|
|
133
|
+
return Math.abs(d) > 1 ? null : d;
|
|
134
|
+
}
|
|
135
|
+
const a = ((r - f) % p + p) % p;
|
|
136
|
+
return a === 0 ? 0 : a === 1 ? 1 : p - a === 1 ? -1 : null;
|
|
137
|
+
},
|
|
138
|
+
[I, f, i, p]
|
|
139
|
+
), _ = e.useCallback(
|
|
140
|
+
(t) => {
|
|
141
|
+
const r = I.findIndex((w) => w.id === t);
|
|
142
|
+
if (r === -1)
|
|
143
|
+
return null;
|
|
144
|
+
if (i === "linear")
|
|
145
|
+
return r - f;
|
|
146
|
+
const a = ((r - f) % p + p) % p, d = p - a;
|
|
147
|
+
return a <= d ? a : -d;
|
|
148
|
+
},
|
|
149
|
+
[I, f, i, p]
|
|
150
|
+
), C = e.useCallback(
|
|
151
|
+
(t) => ({
|
|
152
|
+
"data-pivot-item": t,
|
|
153
|
+
"data-active": t === m ? "true" : "false",
|
|
154
|
+
"aria-selected": t === m,
|
|
155
|
+
tabIndex: t === m ? 0 : -1,
|
|
156
|
+
onClick: () => {
|
|
157
|
+
P(t);
|
|
158
|
+
}
|
|
159
|
+
}),
|
|
160
|
+
[m, P]
|
|
161
|
+
), M = e.useMemo(
|
|
162
|
+
() => ({
|
|
163
|
+
position: "relative",
|
|
164
|
+
width: "100%",
|
|
165
|
+
height: "100%"
|
|
166
|
+
}),
|
|
167
|
+
[]
|
|
168
|
+
), S = e.useRef({
|
|
169
|
+
items: o,
|
|
170
|
+
activeId: m,
|
|
171
|
+
transitionMode: n
|
|
172
|
+
});
|
|
173
|
+
S.current = {
|
|
174
|
+
items: o,
|
|
175
|
+
activeId: m,
|
|
176
|
+
transitionMode: n
|
|
177
|
+
};
|
|
178
|
+
const F = e.useRef(/* @__PURE__ */ new Set());
|
|
179
|
+
e.useEffect(() => {
|
|
180
|
+
F.current.forEach((t) => t());
|
|
181
|
+
}, [m, n]);
|
|
182
|
+
const U = e.useCallback(
|
|
183
|
+
(t) => S.current.items.find((a) => a.id === t)?.content ?? null,
|
|
184
|
+
[]
|
|
185
|
+
), x = e.useMemo(() => o.map((t) => t.id), [o]), { getCachedContent: N } = W({
|
|
186
|
+
resolveContent: U,
|
|
187
|
+
validIds: x
|
|
188
|
+
}), D = e.useMemo(
|
|
189
|
+
() => ({
|
|
190
|
+
getState: () => S.current,
|
|
191
|
+
subscribe: (t) => (F.current.add(t), () => F.current.delete(t)),
|
|
192
|
+
getCachedContent: N
|
|
193
|
+
}),
|
|
194
|
+
[N]
|
|
195
|
+
), u = e.useMemo(() => {
|
|
196
|
+
const t = () => /* @__PURE__ */ E(H.Provider, { value: D, children: /* @__PURE__ */ E("div", { style: M, "data-pivot-container": !0, children: /* @__PURE__ */ E(st, {}) }) });
|
|
197
|
+
return t.displayName = "PivotOutlet", t;
|
|
198
|
+
}, [D, M]);
|
|
199
|
+
return { activeId: m, setActiveId: P, isActive: V, getItemProps: C, Outlet: u, go: T, canGo: b, activeIndex: f, itemCount: p, isAnimating: A, endAnimation: L, navigationMode: i, getVirtualPosition: k, getItemPosition: _ };
|
|
200
|
+
}
|
|
201
|
+
const ot = 300, ct = (c, o) => c.phase === "idle" ? 0 : o === "horizontal" ? c.displacement.x : c.displacement.y, J = (c, o) => (c % o + o) % o, it = (c, o, s, h) => {
|
|
202
|
+
const g = o + c, n = (i, l) => i < 0 || i >= l;
|
|
203
|
+
return h === "linear" ? n(g, s) ? null : g : J(g, s);
|
|
204
|
+
}, ut = e.memo(({
|
|
205
|
+
slotPosition: c,
|
|
206
|
+
item: o,
|
|
207
|
+
itemIndex: s,
|
|
208
|
+
isActive: h,
|
|
209
|
+
centerX: g,
|
|
210
|
+
tabWidth: n,
|
|
211
|
+
viewportWidth: i,
|
|
212
|
+
offsetPx: l,
|
|
213
|
+
axis: R,
|
|
214
|
+
renderTab: y
|
|
215
|
+
}) => {
|
|
216
|
+
const m = c * n, A = g + m + l, v = A + n > 0 && A < i, P = R === "horizontal" ? "translateX" : "translateY";
|
|
217
|
+
return /* @__PURE__ */ E(
|
|
218
|
+
"div",
|
|
219
|
+
{
|
|
220
|
+
"data-pivot-tab": o.id,
|
|
221
|
+
"data-slot": c,
|
|
222
|
+
"data-active": h ? "true" : "false",
|
|
223
|
+
style: {
|
|
224
|
+
position: "absolute",
|
|
225
|
+
left: g,
|
|
226
|
+
top: 0,
|
|
227
|
+
width: n,
|
|
228
|
+
height: "100%",
|
|
229
|
+
visibility: v ? "visible" : "hidden",
|
|
230
|
+
willChange: "transform",
|
|
231
|
+
transform: `${P}(${m + l}px)`
|
|
232
|
+
},
|
|
233
|
+
children: y(o, h, s)
|
|
234
|
+
}
|
|
235
|
+
);
|
|
236
|
+
}), Y = (c) => c === 1 ? 1 : 1 - Math.pow(2, -10 * c);
|
|
237
|
+
function mt({
|
|
238
|
+
items: c,
|
|
239
|
+
activeId: o,
|
|
240
|
+
activeIndex: s,
|
|
241
|
+
itemCount: h,
|
|
242
|
+
inputState: g,
|
|
243
|
+
tabWidth: n,
|
|
244
|
+
viewportWidth: i,
|
|
245
|
+
navigationMode: l = "linear",
|
|
246
|
+
axis: R = "horizontal",
|
|
247
|
+
renderTab: y,
|
|
248
|
+
animationDuration: m = ot,
|
|
249
|
+
fixedTabs: A = !1,
|
|
250
|
+
renderIndicator: v
|
|
251
|
+
}) {
|
|
252
|
+
const P = (u) => u === "swiping" || u === "tracking", L = (u, t) => u !== null || t !== null, V = (u, t, r, a) => {
|
|
253
|
+
if (u === "loop") {
|
|
254
|
+
const d = J(t - r, a), w = a - d;
|
|
255
|
+
return d <= w ? d : -w;
|
|
256
|
+
}
|
|
257
|
+
return t - r;
|
|
258
|
+
}, I = ct(g, R), f = P(g.phase), [p, b] = e.useState(0), O = e.useRef(null), [T, k] = e.useState(s * n), _ = e.useRef(s * n), C = e.useRef(null), M = e.useRef(null);
|
|
259
|
+
e.useEffect(() => {
|
|
260
|
+
_.current = T;
|
|
261
|
+
}, [T]);
|
|
262
|
+
const S = e.useRef(s), F = Math.ceil(i / n / 2) + 1, U = (i - n) / 2;
|
|
263
|
+
e.useEffect(() => {
|
|
264
|
+
if (!A || !f)
|
|
265
|
+
return;
|
|
266
|
+
const u = s * n - I;
|
|
267
|
+
M.current = u, k(u);
|
|
268
|
+
}, [A, f, s, n, I]), e.useEffect(() => {
|
|
269
|
+
if (!A || f)
|
|
270
|
+
return;
|
|
271
|
+
const u = s * n, t = M.current ?? _.current;
|
|
272
|
+
if (M.current = null, Math.abs(t - u) < 1) {
|
|
273
|
+
k(u);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
C.current && cancelAnimationFrame(C.current.rafId);
|
|
277
|
+
const r = performance.now(), a = t, d = (w) => {
|
|
278
|
+
const j = w - r, q = Math.min(j / m, 1), z = Y(q), X = a + (u - a) * z;
|
|
279
|
+
k(X), q < 1 ? C.current = {
|
|
280
|
+
rafId: requestAnimationFrame(d)
|
|
281
|
+
} : (C.current = null, k(u));
|
|
282
|
+
};
|
|
283
|
+
C.current = {
|
|
284
|
+
rafId: requestAnimationFrame(d)
|
|
285
|
+
};
|
|
286
|
+
}, [A, f, s, n, m]), e.useEffect(() => {
|
|
287
|
+
if (A || S.current === s)
|
|
288
|
+
return;
|
|
289
|
+
const u = S.current;
|
|
290
|
+
S.current = s;
|
|
291
|
+
const r = -V(l, s, u, h) * n, a = f ? I : p;
|
|
292
|
+
if (O.current && cancelAnimationFrame(O.current.rafId), Math.abs(a - r) < 1) {
|
|
293
|
+
b(0);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const d = performance.now(), w = (j) => {
|
|
297
|
+
const q = j - d, z = Math.min(q / m, 1), X = Y(z), $ = a - r, K = $ * (1 - X);
|
|
298
|
+
b(K), z < 1 ? O.current = {
|
|
299
|
+
startTime: d,
|
|
300
|
+
startOffset: $,
|
|
301
|
+
targetOffset: 0,
|
|
302
|
+
rafId: requestAnimationFrame(w)
|
|
303
|
+
} : (O.current = null, b(0));
|
|
304
|
+
};
|
|
305
|
+
O.current = {
|
|
306
|
+
startTime: d,
|
|
307
|
+
startOffset: a - r,
|
|
308
|
+
targetOffset: 0,
|
|
309
|
+
rafId: requestAnimationFrame(w)
|
|
310
|
+
};
|
|
311
|
+
}, [A, s, h, n, m, l, I, f, p]), e.useEffect(() => {
|
|
312
|
+
A && (S.current = s);
|
|
313
|
+
}, [A, s]), e.useEffect(() => () => {
|
|
314
|
+
O.current && cancelAnimationFrame(O.current.rafId), C.current && cancelAnimationFrame(C.current.rafId);
|
|
315
|
+
}, []);
|
|
316
|
+
const x = f ? I : p, N = L(O.current, C.current);
|
|
317
|
+
if (e.useEffect(() => {
|
|
318
|
+
f && O.current && (cancelAnimationFrame(O.current.rafId), O.current = null, b(0));
|
|
319
|
+
}, [f]), A) {
|
|
320
|
+
const u = c.length * n, t = (i - u) / 2;
|
|
321
|
+
return /* @__PURE__ */ B(
|
|
322
|
+
"div",
|
|
323
|
+
{
|
|
324
|
+
"data-active-id": o,
|
|
325
|
+
style: {
|
|
326
|
+
position: "relative",
|
|
327
|
+
width: "100%",
|
|
328
|
+
height: "100%",
|
|
329
|
+
overflow: "hidden",
|
|
330
|
+
display: "flex",
|
|
331
|
+
justifyContent: "center"
|
|
332
|
+
},
|
|
333
|
+
children: [
|
|
334
|
+
v?.({
|
|
335
|
+
offsetPx: T,
|
|
336
|
+
tabWidth: n,
|
|
337
|
+
centerX: t,
|
|
338
|
+
isSwiping: f,
|
|
339
|
+
isAnimating: N
|
|
340
|
+
}),
|
|
341
|
+
c.map((r, a) => /* @__PURE__ */ E(
|
|
342
|
+
"div",
|
|
343
|
+
{
|
|
344
|
+
"data-pivot-tab": r.id,
|
|
345
|
+
"data-active": a === s ? "true" : "false",
|
|
346
|
+
style: {
|
|
347
|
+
position: "relative",
|
|
348
|
+
width: n,
|
|
349
|
+
height: "100%",
|
|
350
|
+
flexShrink: 0
|
|
351
|
+
},
|
|
352
|
+
children: y(r, a === s, a)
|
|
353
|
+
},
|
|
354
|
+
r.id
|
|
355
|
+
))
|
|
356
|
+
]
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
const D = [];
|
|
361
|
+
for (let u = -F; u <= F; u++) {
|
|
362
|
+
const t = it(u, s, h, l);
|
|
363
|
+
t !== null && D.push({
|
|
364
|
+
slotPosition: u,
|
|
365
|
+
itemIndex: t,
|
|
366
|
+
item: c[t]
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return /* @__PURE__ */ B(
|
|
370
|
+
"div",
|
|
371
|
+
{
|
|
372
|
+
"data-active-id": o,
|
|
373
|
+
style: {
|
|
374
|
+
position: "relative",
|
|
375
|
+
width: "100%",
|
|
376
|
+
height: "100%",
|
|
377
|
+
overflow: "hidden"
|
|
378
|
+
},
|
|
379
|
+
children: [
|
|
380
|
+
v?.({
|
|
381
|
+
offsetPx: x,
|
|
382
|
+
tabWidth: n,
|
|
383
|
+
centerX: U,
|
|
384
|
+
isSwiping: f,
|
|
385
|
+
isAnimating: N
|
|
386
|
+
}),
|
|
387
|
+
D.map(({ slotPosition: u, itemIndex: t, item: r }) => /* @__PURE__ */ E(
|
|
388
|
+
ut,
|
|
389
|
+
{
|
|
390
|
+
slotPosition: u,
|
|
391
|
+
item: r,
|
|
392
|
+
itemIndex: t,
|
|
393
|
+
isActive: t === s,
|
|
394
|
+
centerX: U,
|
|
395
|
+
tabWidth: n,
|
|
396
|
+
viewportWidth: i,
|
|
397
|
+
offsetPx: x,
|
|
398
|
+
axis: R,
|
|
399
|
+
renderTab: y
|
|
400
|
+
},
|
|
401
|
+
u
|
|
402
|
+
))
|
|
403
|
+
]
|
|
404
|
+
}
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
export {
|
|
408
|
+
mt as S,
|
|
409
|
+
dt as u
|
|
410
|
+
};
|
|
411
|
+
//# sourceMappingURL=SwipePivotTabBar-DWrCuwEI.js.map
|