@lobehub/ui 5.40.3 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/es/base-ui/DraggablePanel/DraggablePanel.d.mts +6 -0
  2. package/es/base-ui/DraggablePanel/DraggablePanel.mjs +68 -0
  3. package/es/base-ui/DraggablePanel/DraggablePanel.mjs.map +1 -0
  4. package/es/base-ui/DraggablePanel/atoms.d.mts +47 -0
  5. package/es/base-ui/DraggablePanel/atoms.mjs +333 -0
  6. package/es/base-ui/DraggablePanel/atoms.mjs.map +1 -0
  7. package/es/base-ui/DraggablePanel/context.d.mts +17 -0
  8. package/es/base-ui/DraggablePanel/context.mjs +13 -0
  9. package/es/base-ui/DraggablePanel/context.mjs.map +1 -0
  10. package/es/base-ui/DraggablePanel/core/axes.d.mts +16 -0
  11. package/es/base-ui/DraggablePanel/core/axes.mjs +51 -0
  12. package/es/base-ui/DraggablePanel/core/axes.mjs.map +1 -0
  13. package/es/base-ui/DraggablePanel/core/controller.d.mts +56 -0
  14. package/es/base-ui/DraggablePanel/core/controller.mjs +206 -0
  15. package/es/base-ui/DraggablePanel/core/controller.mjs.map +1 -0
  16. package/es/base-ui/DraggablePanel/core/dom.mjs +34 -0
  17. package/es/base-ui/DraggablePanel/core/dom.mjs.map +1 -0
  18. package/es/base-ui/DraggablePanel/core/env.mjs +28 -0
  19. package/es/base-ui/DraggablePanel/core/env.mjs.map +1 -0
  20. package/es/base-ui/DraggablePanel/core/internal.mjs +9 -0
  21. package/es/base-ui/DraggablePanel/core/internal.mjs.map +1 -0
  22. package/es/base-ui/DraggablePanel/core/transition.mjs +17 -0
  23. package/es/base-ui/DraggablePanel/core/transition.mjs.map +1 -0
  24. package/es/base-ui/DraggablePanel/core/utils.mjs +20 -0
  25. package/es/base-ui/DraggablePanel/core/utils.mjs.map +1 -0
  26. package/es/base-ui/DraggablePanel/index.d.mts +5 -0
  27. package/es/base-ui/DraggablePanel/style.mjs +356 -0
  28. package/es/base-ui/DraggablePanel/style.mjs.map +1 -0
  29. package/es/base-ui/DraggablePanel/type.d.mts +53 -0
  30. package/es/base-ui/Input/style.d.mts +1 -1
  31. package/es/base-ui/index.d.mts +6 -1
  32. package/es/base-ui/index.mjs +4 -1
  33. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ import { DraggablePanelProps } from "./type.mjs";
2
+ //#region src/base-ui/DraggablePanel/DraggablePanel.d.ts
3
+ declare const DraggablePanel: import("react").NamedExoticComponent<DraggablePanelProps>;
4
+ //#endregion
5
+ export { DraggablePanel as default };
6
+ //# sourceMappingURL=DraggablePanel.d.mts.map
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { AXES } from "./core/axes.mjs";
3
+ import { DraggablePanelContent, DraggablePanelHandle, DraggablePanelRoot, DraggablePanelToggle } from "./atoms.mjs";
4
+ import { memo, useCallback } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { cx } from "antd-style";
7
+ //#region src/base-ui/DraggablePanel/DraggablePanel.tsx
8
+ const toNumber = (value) => typeof value === "number" ? Math.max(value, 0) : void 0;
9
+ const DraggablePanel = memo(({ backgroundColor, children, className, classNames, collapseThreshold, defaultExpand, defaultSize, expand, expandable = true, maxHeight, maxWidth, minHeight, minWidth, mode = "fixed", onExpandChange, onSizeChange, onSizeDragging, placement = "right", showBorder = true, showHandleWhenCollapsed, showHandleWideArea = true, size, styles: customStyles, ...rest }) => {
10
+ const { vertical } = AXES[placement];
11
+ const toSize = useCallback((value) => vertical ? {
12
+ height: value,
13
+ width: "100%"
14
+ } : {
15
+ height: "100%",
16
+ width: value
17
+ }, [vertical]);
18
+ const toDelta = useCallback((value) => vertical ? {
19
+ height: value,
20
+ width: 0
21
+ } : {
22
+ height: 0,
23
+ width: value
24
+ }, [vertical]);
25
+ const handleSizeChange = useCallback((next, delta) => onSizeChange?.(toDelta(delta), toSize(next)), [
26
+ onSizeChange,
27
+ toDelta,
28
+ toSize
29
+ ]);
30
+ const handleSizeDragging = useCallback((next, delta) => onSizeDragging?.(toDelta(delta), toSize(next)), [
31
+ onSizeDragging,
32
+ toDelta,
33
+ toSize
34
+ ]);
35
+ return /* @__PURE__ */ jsxs(DraggablePanelRoot, {
36
+ backgroundColor,
37
+ className,
38
+ collapseThreshold,
39
+ defaultExpand,
40
+ defaultSize: toNumber(vertical ? defaultSize?.height : defaultSize?.width),
41
+ expand,
42
+ expandable,
43
+ max: toNumber(vertical ? maxHeight : maxWidth),
44
+ min: toNumber(vertical ? minHeight : minWidth) ?? 0,
45
+ mode,
46
+ placement,
47
+ showBorder,
48
+ size: toNumber(vertical ? size?.height : size?.width),
49
+ onExpandChange,
50
+ onSizeChange: handleSizeChange,
51
+ onSizeDragging: handleSizeDragging,
52
+ ...rest,
53
+ children: [
54
+ /* @__PURE__ */ jsx(DraggablePanelToggle, { showHandleWhenCollapsed }),
55
+ /* @__PURE__ */ jsx(DraggablePanelContent, {
56
+ className: cx(classNames?.content),
57
+ style: customStyles?.content,
58
+ children
59
+ }),
60
+ /* @__PURE__ */ jsx(DraggablePanelHandle, { wideArea: showHandleWideArea })
61
+ ]
62
+ });
63
+ });
64
+ DraggablePanel.displayName = "DraggablePanel";
65
+ //#endregion
66
+ export { DraggablePanel as default };
67
+
68
+ //# sourceMappingURL=DraggablePanel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraggablePanel.mjs","names":[],"sources":["../../../src/base-ui/DraggablePanel/DraggablePanel.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo, useCallback } from 'react';\n\nimport {\n DraggablePanelContent,\n DraggablePanelHandle,\n DraggablePanelRoot,\n DraggablePanelToggle,\n} from './atoms';\nimport { AXES } from './core/axes';\nimport type { DraggablePanelProps, DraggablePanelSize } from './type';\n\nconst toNumber = (value: number | string | undefined) =>\n typeof value === 'number' ? Math.max(value, 0) : undefined;\n\nconst DraggablePanel = memo<DraggablePanelProps>(\n ({\n backgroundColor,\n children,\n className,\n classNames,\n collapseThreshold,\n defaultExpand,\n defaultSize,\n expand,\n expandable = true,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n mode = 'fixed',\n onExpandChange,\n onSizeChange,\n onSizeDragging,\n placement = 'right',\n showBorder = true,\n showHandleWhenCollapsed,\n showHandleWideArea = true,\n size,\n styles: customStyles,\n ...rest\n }) => {\n const { vertical } = AXES[placement];\n\n const toSize = useCallback(\n (value: number): DraggablePanelSize =>\n vertical ? { height: value, width: '100%' } : { height: '100%', width: value },\n [vertical],\n );\n const toDelta = useCallback(\n (value: number): DraggablePanelSize =>\n vertical ? { height: value, width: 0 } : { height: 0, width: value },\n [vertical],\n );\n\n const handleSizeChange = useCallback(\n (next: number, delta: number) => onSizeChange?.(toDelta(delta), toSize(next)),\n [onSizeChange, toDelta, toSize],\n );\n const handleSizeDragging = useCallback(\n (next: number, delta: number) => onSizeDragging?.(toDelta(delta), toSize(next)),\n [onSizeDragging, toDelta, toSize],\n );\n\n return (\n <DraggablePanelRoot\n backgroundColor={backgroundColor}\n className={className}\n collapseThreshold={collapseThreshold}\n defaultExpand={defaultExpand}\n defaultSize={toNumber(vertical ? defaultSize?.height : defaultSize?.width)}\n expand={expand}\n expandable={expandable}\n max={toNumber(vertical ? maxHeight : maxWidth)}\n min={toNumber(vertical ? minHeight : minWidth) ?? 0}\n mode={mode}\n placement={placement}\n showBorder={showBorder}\n size={toNumber(vertical ? size?.height : size?.width)}\n onExpandChange={onExpandChange}\n onSizeChange={handleSizeChange}\n onSizeDragging={handleSizeDragging}\n {...rest}\n >\n <DraggablePanelToggle showHandleWhenCollapsed={showHandleWhenCollapsed} />\n <DraggablePanelContent className={cx(classNames?.content)} style={customStyles?.content}>\n {children}\n </DraggablePanelContent>\n <DraggablePanelHandle wideArea={showHandleWideArea} />\n </DraggablePanelRoot>\n );\n },\n);\n\nDraggablePanel.displayName = 'DraggablePanel';\n\nexport default DraggablePanel;\n"],"mappings":";;;;;;;AAcA,MAAM,YAAY,UAChB,OAAO,UAAU,WAAW,KAAK,IAAI,OAAO,CAAC,IAAI,KAAA;AAEnD,MAAM,iBAAiB,MACpB,EACC,iBACA,UACA,WACA,YACA,mBACA,eACA,aACA,QACA,aAAa,MACb,WACA,UACA,WACA,UACA,OAAO,SACP,gBACA,cACA,gBACA,YAAY,SACZ,aAAa,MACb,yBACA,qBAAqB,MACrB,MACA,QAAQ,cACR,GAAG,WACC;CACJ,MAAM,EAAE,aAAa,KAAK;CAE1B,MAAM,SAAS,aACZ,UACC,WAAW;EAAE,QAAQ;EAAO,OAAO;CAAO,IAAI;EAAE,QAAQ;EAAQ,OAAO;CAAM,GAC/E,CAAC,QAAQ,CACX;CACA,MAAM,UAAU,aACb,UACC,WAAW;EAAE,QAAQ;EAAO,OAAO;CAAE,IAAI;EAAE,QAAQ;EAAG,OAAO;CAAM,GACrE,CAAC,QAAQ,CACX;CAEA,MAAM,mBAAmB,aACtB,MAAc,UAAkB,eAAe,QAAQ,KAAK,GAAG,OAAO,IAAI,CAAC,GAC5E;EAAC;EAAc;EAAS;CAAM,CAChC;CACA,MAAM,qBAAqB,aACxB,MAAc,UAAkB,iBAAiB,QAAQ,KAAK,GAAG,OAAO,IAAI,CAAC,GAC9E;EAAC;EAAgB;EAAS;CAAM,CAClC;CAEA,OACE,qBAAC,oBAAD;EACmB;EACN;EACQ;EACJ;EACf,aAAa,SAAS,WAAW,aAAa,SAAS,aAAa,KAAK;EACjE;EACI;EACZ,KAAK,SAAS,WAAW,YAAY,QAAQ;EAC7C,KAAK,SAAS,WAAW,YAAY,QAAQ,KAAK;EAC5C;EACK;EACC;EACZ,MAAM,SAAS,WAAW,MAAM,SAAS,MAAM,KAAK;EACpC;EAChB,cAAc;EACd,gBAAgB;EAChB,GAAI;EAjBN,UAAA;GAmBE,oBAAC,sBAAD,EAA+C,wBAA0B,CAAA;GACzE,oBAAC,uBAAD;IAAuB,WAAW,GAAG,YAAY,OAAO;IAAG,OAAO,cAAc;IAC7E;GACoB,CAAA;GACvB,oBAAC,sBAAD,EAAsB,UAAU,mBAAqB,CAAA;EACnC;;AAExB,CACF;AAEA,eAAe,cAAc"}
@@ -0,0 +1,47 @@
1
+ import { DivProps } from "../../types/index.mjs";
2
+ import { Placement } from "./core/axes.mjs";
3
+ import { ReactNode } from "react";
4
+ //#region src/base-ui/DraggablePanel/atoms.d.ts
5
+ interface DraggablePanelRootProps extends Omit<DivProps, 'onDrag'> {
6
+ backgroundColor?: string;
7
+ collapseThreshold?: number;
8
+ defaultExpand?: boolean;
9
+ defaultSize?: number;
10
+ expand?: boolean;
11
+ expandable?: boolean;
12
+ max?: number;
13
+ min?: number;
14
+ mode?: 'fixed' | 'float';
15
+ onExpandChange?: (expand: boolean) => void;
16
+ onSizeChange?: (size: number, delta: number) => void;
17
+ onSizeDragging?: (size: number, delta: number) => void;
18
+ placement?: Placement;
19
+ showBorder?: boolean;
20
+ size?: number;
21
+ }
22
+ declare const DraggablePanelRoot: import("react").NamedExoticComponent<DraggablePanelRootProps>;
23
+ interface DraggablePanelContentProps extends Omit<DivProps, 'onDrag'> {}
24
+ declare const DraggablePanelContent: import("react").NamedExoticComponent<DraggablePanelContentProps>;
25
+ interface DraggablePanelHandleProps extends Omit<DivProps, 'onDrag'> {
26
+ wideArea?: boolean;
27
+ }
28
+ declare const DraggablePanelHandle: import("react").NamedExoticComponent<DraggablePanelHandleProps>;
29
+ interface DraggablePanelToggleProps extends Omit<DivProps, 'onDrag'> {
30
+ showHandleWhenCollapsed?: boolean;
31
+ }
32
+ declare const DraggablePanelToggle: import("react").NamedExoticComponent<DraggablePanelToggleProps>;
33
+ type DraggablePanelContainerProps = DivProps;
34
+ declare const DraggablePanelContainer: import("react").NamedExoticComponent<DivProps>;
35
+ type DraggablePanelBodyProps = DivProps;
36
+ declare const DraggablePanelBody: import("react").NamedExoticComponent<DivProps>;
37
+ type DraggablePanelFooterProps = DivProps;
38
+ declare const DraggablePanelFooter: import("react").NamedExoticComponent<DivProps>;
39
+ interface DraggablePanelHeaderProps extends Omit<DivProps, 'children' | 'title'> {
40
+ extra?: ReactNode;
41
+ onCollapse?: () => void;
42
+ title?: ReactNode;
43
+ }
44
+ declare const DraggablePanelHeader: import("react").NamedExoticComponent<DraggablePanelHeaderProps>;
45
+ //#endregion
46
+ export { DraggablePanelBody, DraggablePanelBodyProps, DraggablePanelContainer, DraggablePanelContainerProps, DraggablePanelContent, DraggablePanelContentProps, DraggablePanelFooter, DraggablePanelFooterProps, DraggablePanelHandle, DraggablePanelHandleProps, DraggablePanelHeader, DraggablePanelHeaderProps, DraggablePanelRoot, DraggablePanelRootProps, DraggablePanelToggle, DraggablePanelToggleProps };
47
+ //# sourceMappingURL=atoms.d.mts.map
@@ -0,0 +1,333 @@
1
+ "use client";
2
+ import ActionIcon from "../ActionIcon/ActionIcon.mjs";
3
+ import { DraggablePanelContext, useDraggablePanelContext } from "./context.mjs";
4
+ import { AXES } from "./core/axes.mjs";
5
+ import { coarsePointer, handleSize } from "./core/env.mjs";
6
+ import { timing } from "./core/transition.mjs";
7
+ import { createPanelController } from "./core/controller.mjs";
8
+ import { useIsomorphicLayoutEffect, useStore } from "./core/internal.mjs";
9
+ import { BOW, handleVariants, rootVariants, styles, toggleVariants } from "./style.mjs";
10
+ import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { cx } from "antd-style";
13
+ import { motion, useTransform } from "motion/react";
14
+ import useMergeState from "use-merge-value";
15
+ import { ChevronLeft } from "lucide-react";
16
+ //#region src/base-ui/DraggablePanel/atoms.tsx
17
+ const PAN_THRESHOLD = 3;
18
+ const BOW_CX = 15;
19
+ const BOW_CY = BOW.half + 8;
20
+ const BOW_W = 30;
21
+ const BOW_H = BOW_CY * 2;
22
+ const bowPath = (direction, verticalSeam) => {
23
+ const k = BOW.half * BOW.curve;
24
+ const b = BOW_CX + BOW.bulge * direction;
25
+ const a0 = BOW_CY - BOW.half;
26
+ const a1 = BOW_CY + BOW.half;
27
+ const pt = (along, across) => verticalSeam ? `${along} ${across}` : `${across} ${along}`;
28
+ return [
29
+ `M${pt(BOW_CX, a0)}`,
30
+ `C${pt(BOW_CX, a0 + k)} ${pt(b, BOW_CY - k)} ${pt(b, BOW_CY)}`,
31
+ `C${pt(b, BOW_CY + k)} ${pt(BOW_CX, a1 - k)} ${pt(BOW_CX, a1)}`
32
+ ].join(" ");
33
+ };
34
+ const BOW_PATHS = {
35
+ horizontalSeam: [bowPath(-1, false), bowPath(1, false)],
36
+ verticalSeam: [bowPath(-1, true), bowPath(1, true)]
37
+ };
38
+ /** The chevron points the way a click moves the panel. */
39
+ const CHEVRON_TURN = {
40
+ bottom: 270,
41
+ left: 0,
42
+ right: 180,
43
+ top: 90
44
+ };
45
+ const chevronPath = (cx, cy) => `M${cx + 2.4} ${cy - 4.8} L${cx - 2.4} ${cy} L${cx + 2.4} ${cy + 4.8}`;
46
+ const ORIGIN_MAP = {
47
+ bottom: "center bottom",
48
+ left: "left center",
49
+ right: "right center",
50
+ top: "center top"
51
+ };
52
+ const COLLAPSED_SCALE = .97;
53
+ const EDGE_INSET = {
54
+ bottom: "insetBlockEnd",
55
+ left: "insetInlineStart",
56
+ right: "insetInlineEnd",
57
+ top: "insetBlockStart"
58
+ };
59
+ const DraggablePanelRoot = memo(({ backgroundColor, children, className, collapseThreshold, defaultExpand = true, defaultSize, expand, expandable = true, max, min = 0, mode = "fixed", onExpandChange, onSizeChange, onSizeDragging, placement = "right", showBorder = true, size, style, ...rest }) => {
60
+ const axis = AXES[placement];
61
+ const fallbackSize = axis.vertical ? 180 : 280;
62
+ const resolvedDefaultSize = defaultSize ?? fallbackSize;
63
+ const [isExpand, setIsExpand] = useMergeState(defaultExpand, {
64
+ onChange: onExpandChange,
65
+ value: expand
66
+ });
67
+ const [innerSize, setInnerSize] = useState(resolvedDefaultSize);
68
+ const currentSize = size ?? innerSize;
69
+ const commitSize = useCallback((next, delta) => {
70
+ if (size === void 0) setInnerSize(next);
71
+ onSizeChange?.(next, delta);
72
+ }, [onSizeChange, size]);
73
+ const options = {
74
+ collapseThreshold: expandable ? collapseThreshold : void 0,
75
+ defaultSize: resolvedDefaultSize,
76
+ expand: isExpand,
77
+ max,
78
+ min,
79
+ onExpandChange: expandable ? setIsExpand : void 0,
80
+ onSizeChange: commitSize,
81
+ onSizeDragging,
82
+ placement,
83
+ size: currentSize
84
+ };
85
+ const [controller] = useState(() => createPanelController(options));
86
+ const state = useStore(controller.subscribe, () => controller.state);
87
+ const elementRef = useRef(null);
88
+ useIsomorphicLayoutEffect(() => {
89
+ controller.sync(options);
90
+ });
91
+ useIsomorphicLayoutEffect(() => {
92
+ const node = elementRef.current;
93
+ return node ? controller.attach(node) : void 0;
94
+ }, [controller]);
95
+ const toggleExpand = useCallback(() => {
96
+ if (expandable) setIsExpand(!isExpand);
97
+ }, [
98
+ expandable,
99
+ isExpand,
100
+ setIsExpand
101
+ ]);
102
+ const context = useMemo(() => ({
103
+ axis,
104
+ controller,
105
+ expand: isExpand,
106
+ expandable,
107
+ placement,
108
+ showBorder,
109
+ state,
110
+ toggleExpand
111
+ }), [
112
+ axis,
113
+ controller,
114
+ isExpand,
115
+ expandable,
116
+ placement,
117
+ showBorder,
118
+ state,
119
+ toggleExpand
120
+ ]);
121
+ return /* @__PURE__ */ jsx(DraggablePanelContext, {
122
+ value: context,
123
+ children: /* @__PURE__ */ jsx("aside", {
124
+ className: cx(rootVariants({
125
+ mode,
126
+ placement
127
+ }), className),
128
+ "data-expand": isExpand,
129
+ "data-expandable": expandable,
130
+ "data-resizing": state.dragging,
131
+ ref: elementRef,
132
+ style: {
133
+ "--draggable-panel-bg": backgroundColor || "",
134
+ "flexDirection": axis.vertical ? "column" : "row",
135
+ ...style
136
+ },
137
+ ...rest,
138
+ children
139
+ })
140
+ });
141
+ });
142
+ DraggablePanelRoot.displayName = "DraggablePanelRoot";
143
+ const DraggablePanelContent = memo(({ children, className, style, ...rest }) => {
144
+ const { axis, controller, expand, placement, state } = useDraggablePanelContext();
145
+ const extent = useTransform(controller.motion.size, (value) => Math.max(0, value));
146
+ const clipping = state.dragging || state.folding || controller.target === 0;
147
+ const shrunk = state.collapsing || !expand;
148
+ return /* @__PURE__ */ jsx(motion.div, {
149
+ inert: !expand,
150
+ style: {
151
+ display: "flex",
152
+ flexDirection: axis.vertical ? "column" : "row",
153
+ flexShrink: 0,
154
+ justifyContent: axis.anchorEnd ? "flex-end" : "flex-start",
155
+ overflow: clipping ? "clip" : "visible",
156
+ [axis.cross]: "100%",
157
+ [axis.extent]: extent
158
+ },
159
+ children: /* @__PURE__ */ jsx(motion.div, {
160
+ animate: { scale: shrunk ? COLLAPSED_SCALE : 1 },
161
+ className: cx(styles.content, className),
162
+ transition: timing(),
163
+ style: {
164
+ transformOrigin: ORIGIN_MAP[placement],
165
+ [axis.cross]: "100%",
166
+ [axis.extent]: controller.motion.content,
167
+ ...style
168
+ },
169
+ ...rest,
170
+ children
171
+ })
172
+ });
173
+ });
174
+ DraggablePanelContent.displayName = "DraggablePanelContent";
175
+ const DraggablePanelHandle = memo(({ className, style, wideArea = true, ...rest }) => {
176
+ const { axis, controller, expand, showBorder, state } = useDraggablePanelContext();
177
+ const size = useStore(coarsePointer.subscribe, () => handleSize(wideArea));
178
+ const target = useStore(controller.subscribe, () => controller.target);
179
+ useEffect(() => () => controller.drag.cancel(), [controller]);
180
+ const pressedRef = useRef(null);
181
+ const draggingRef = useRef(false);
182
+ const draggedRef = useRef(false);
183
+ const { max, min } = controller.bounds();
184
+ if (!expand) return null;
185
+ return /* @__PURE__ */ jsx("div", {
186
+ "aria-orientation": axis.ariaOrientation,
187
+ "aria-valuemax": Number.isFinite(max) ? max : void 0,
188
+ "aria-valuemin": min,
189
+ "aria-valuenow": target,
190
+ "aria-valuetext": `${target} pixels`,
191
+ className: cx(handleVariants({ edge: axis.edge }), className),
192
+ "data-border": showBorder,
193
+ "data-resizing": state.dragging || void 0,
194
+ role: "separator",
195
+ tabIndex: 0,
196
+ style: {
197
+ "--draggable-panel-handle-size": `${size}px`,
198
+ [EDGE_INSET[axis.edge]]: -size / 2,
199
+ ...style
200
+ },
201
+ onKeyDown: (event) => controller.resizeByKey(event),
202
+ onDoubleClick: () => {
203
+ if (!draggedRef.current) controller.reset();
204
+ },
205
+ onLostPointerCapture: () => {
206
+ if (draggingRef.current) controller.drag.cancel();
207
+ pressedRef.current = null;
208
+ draggingRef.current = false;
209
+ },
210
+ onPointerCancel: () => {
211
+ controller.drag.cancel();
212
+ pressedRef.current = null;
213
+ draggingRef.current = false;
214
+ },
215
+ onPointerDown: (event) => {
216
+ draggedRef.current = false;
217
+ pressedRef.current = {
218
+ x: event.clientX,
219
+ y: event.clientY
220
+ };
221
+ try {
222
+ event.currentTarget.setPointerCapture(event.pointerId);
223
+ } catch {}
224
+ },
225
+ onPointerMove: (event) => {
226
+ if (!pressedRef.current) return;
227
+ const offset = {
228
+ x: event.clientX - pressedRef.current.x,
229
+ y: event.clientY - pressedRef.current.y
230
+ };
231
+ if (!draggingRef.current) {
232
+ if (Math.hypot(offset.x, offset.y) < PAN_THRESHOLD) return;
233
+ draggingRef.current = true;
234
+ draggedRef.current = true;
235
+ controller.drag.start();
236
+ }
237
+ controller.drag.move(offset);
238
+ },
239
+ onPointerUp: () => {
240
+ if (draggingRef.current) controller.drag.end();
241
+ pressedRef.current = null;
242
+ draggingRef.current = false;
243
+ },
244
+ ...rest
245
+ });
246
+ });
247
+ DraggablePanelHandle.displayName = "DraggablePanelHandle";
248
+ const DraggablePanelToggle = memo(({ className, showHandleWhenCollapsed, style, ...rest }) => {
249
+ const { axis, expand, expandable, placement, toggleExpand } = useDraggablePanelContext();
250
+ if (!expandable) return null;
251
+ const turn = CHEVRON_TURN[placement] + (expand ? 0 : 180);
252
+ const chevX = axis.vertical ? BOW_CY : BOW_CX;
253
+ const chevY = axis.vertical ? BOW_CX : BOW_CY;
254
+ return /* @__PURE__ */ jsx("div", {
255
+ className: cx(toggleVariants({ placement }), className),
256
+ style: {
257
+ opacity: expand ? void 0 : showHandleWhenCollapsed ? 1 : 0,
258
+ ...style
259
+ },
260
+ ...rest,
261
+ children: /* @__PURE__ */ jsx("button", {
262
+ "aria-label": expand ? "Collapse panel" : "Expand panel",
263
+ type: "button",
264
+ onClick: toggleExpand,
265
+ children: /* @__PURE__ */ jsxs("svg", {
266
+ fill: "none",
267
+ height: axis.vertical ? BOW_W : BOW_H,
268
+ viewBox: `0 0 ${axis.vertical ? BOW_H : BOW_W} ${axis.vertical ? BOW_W : BOW_H}`,
269
+ width: axis.vertical ? BOW_H : BOW_W,
270
+ children: [BOW_PATHS[axis.vertical ? "horizontalSeam" : "verticalSeam"].map((d) => /* @__PURE__ */ jsx("path", {
271
+ d,
272
+ "data-bow": "",
273
+ strokeLinecap: "round",
274
+ strokeWidth: BOW.stroke
275
+ }, d)), /* @__PURE__ */ jsx("g", {
276
+ style: {
277
+ rotate: `${turn}deg`,
278
+ transformOrigin: `${chevX}px ${chevY}px`,
279
+ transition: "rotate 0.25s var(--ant-motion-ease-out, ease)"
280
+ },
281
+ children: /* @__PURE__ */ jsx("path", {
282
+ d: chevronPath(chevX, chevY),
283
+ stroke: "currentColor",
284
+ strokeLinecap: "round",
285
+ strokeLinejoin: "round",
286
+ strokeWidth: 1.6
287
+ })
288
+ })]
289
+ })
290
+ })
291
+ });
292
+ });
293
+ DraggablePanelToggle.displayName = "DraggablePanelToggle";
294
+ const DraggablePanelContainer = memo(({ className, ...rest }) => /* @__PURE__ */ jsx("div", {
295
+ className: cx(styles.container, className),
296
+ ...rest
297
+ }));
298
+ DraggablePanelContainer.displayName = "DraggablePanelContainer";
299
+ const DraggablePanelBody = memo(({ className, style, ...rest }) => /* @__PURE__ */ jsx("div", {
300
+ className: cx(styles.body, className),
301
+ style: {
302
+ flex: 1,
303
+ ...style
304
+ },
305
+ ...rest
306
+ }));
307
+ DraggablePanelBody.displayName = "DraggablePanelBody";
308
+ const DraggablePanelFooter = memo(({ className, ...rest }) => /* @__PURE__ */ jsx("div", {
309
+ className: cx(styles.footer, className),
310
+ ...rest
311
+ }));
312
+ DraggablePanelFooter.displayName = "DraggablePanelFooter";
313
+ const DraggablePanelHeader = memo(({ className, extra, onCollapse, title, ...rest }) => {
314
+ const { toggleExpand } = useDraggablePanelContext();
315
+ return /* @__PURE__ */ jsxs("div", {
316
+ className: cx(styles.header, className),
317
+ ...rest,
318
+ children: [
319
+ /* @__PURE__ */ jsx(ActionIcon, {
320
+ icon: ChevronLeft,
321
+ size: "small",
322
+ onClick: onCollapse ?? toggleExpand
323
+ }),
324
+ title,
325
+ extra
326
+ ]
327
+ });
328
+ });
329
+ DraggablePanelHeader.displayName = "DraggablePanelHeader";
330
+ //#endregion
331
+ export { DraggablePanelBody, DraggablePanelContainer, DraggablePanelContent, DraggablePanelFooter, DraggablePanelHandle, DraggablePanelHeader, DraggablePanelRoot, DraggablePanelToggle };
332
+
333
+ //# sourceMappingURL=atoms.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atoms.mjs","names":["useControlledState","getHandleSize"],"sources":["../../../src/base-ui/DraggablePanel/atoms.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronLeft } from 'lucide-react';\nimport type { HTMLMotionProps, MotionStyle } from 'motion/react';\nimport { motion, useTransform } from 'motion/react';\nimport {\n type CSSProperties,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport type { DivProps } from '@/types';\n\nimport { DraggablePanelContext, useDraggablePanelContext } from './context';\nimport type { Placement } from './core/axes';\nimport { AXES } from './core/axes';\nimport type { PanelControllerOptions } from './core/controller';\nimport { createPanelController } from './core/controller';\nimport { coarsePointer, handleSize as getHandleSize } from './core/env';\nimport { useIsomorphicLayoutEffect, useStore } from './core/internal';\nimport { timing } from './core/transition';\nimport { BOW, handleVariants, rootVariants, styles, toggleVariants } from './style';\n\nconst PAN_THRESHOLD = 3;\n\nconst BOW_CX = 15;\nconst BOW_CY = BOW.half + 8;\nconst BOW_W = BOW_CX * 2;\nconst BOW_H = BOW_CY * 2;\n\nconst bowPath = (direction: 1 | -1, verticalSeam: boolean) => {\n const k = BOW.half * BOW.curve;\n const b = BOW_CX + BOW.bulge * direction;\n const a0 = BOW_CY - BOW.half;\n const a1 = BOW_CY + BOW.half;\n // `a` runs along the seam, `b` across it; a horizontal seam swaps the two.\n const pt = (along: number, across: number) =>\n verticalSeam ? `${along} ${across}` : `${across} ${along}`;\n return [\n `M${pt(BOW_CX, a0)}`,\n `C${pt(BOW_CX, a0 + k)} ${pt(b, BOW_CY - k)} ${pt(b, BOW_CY)}`,\n `C${pt(b, BOW_CY + k)} ${pt(BOW_CX, a1 - k)} ${pt(BOW_CX, a1)}`,\n ].join(' ');\n};\n\nconst BOW_PATHS = {\n horizontalSeam: [bowPath(-1, false), bowPath(1, false)],\n verticalSeam: [bowPath(-1, true), bowPath(1, true)],\n};\n\n/** The chevron points the way a click moves the panel. */\nconst CHEVRON_TURN = { bottom: 270, left: 0, right: 180, top: 90 } as const;\n\nconst chevronPath = (cx: number, cy: number) =>\n `M${cx + 2.4} ${cy - 4.8} L${cx - 2.4} ${cy} L${cx + 2.4} ${cy + 4.8}`;\n\nconst ORIGIN_MAP = {\n bottom: 'center bottom',\n left: 'left center',\n right: 'right center',\n top: 'center top',\n} as const;\n\nconst COLLAPSED_SCALE = 0.97;\n\nconst EDGE_INSET = {\n bottom: 'insetBlockEnd',\n left: 'insetInlineStart',\n right: 'insetInlineEnd',\n top: 'insetBlockStart',\n} as const;\n\nexport interface DraggablePanelRootProps extends Omit<DivProps, 'onDrag'> {\n backgroundColor?: string;\n collapseThreshold?: number;\n defaultExpand?: boolean;\n defaultSize?: number;\n expand?: boolean;\n expandable?: boolean;\n max?: number;\n min?: number;\n mode?: 'fixed' | 'float';\n onExpandChange?: (expand: boolean) => void;\n onSizeChange?: (size: number, delta: number) => void;\n onSizeDragging?: (size: number, delta: number) => void;\n placement?: Placement;\n showBorder?: boolean;\n size?: number;\n}\n\nexport const DraggablePanelRoot = memo<DraggablePanelRootProps>(\n ({\n backgroundColor,\n children,\n className,\n collapseThreshold,\n defaultExpand = true,\n defaultSize,\n expand,\n expandable = true,\n max,\n min = 0,\n mode = 'fixed',\n onExpandChange,\n onSizeChange,\n onSizeDragging,\n placement = 'right',\n showBorder = true,\n size,\n style,\n ...rest\n }) => {\n const axis = AXES[placement];\n const fallbackSize = axis.vertical ? 180 : 280;\n const resolvedDefaultSize = defaultSize ?? fallbackSize;\n\n const [isExpand, setIsExpand] = useControlledState(defaultExpand, {\n onChange: onExpandChange,\n value: expand,\n });\n const [innerSize, setInnerSize] = useState(resolvedDefaultSize);\n const currentSize = size ?? innerSize;\n\n const commitSize = useCallback(\n (next: number, delta: number) => {\n if (size === undefined) setInnerSize(next);\n onSizeChange?.(next, delta);\n },\n [onSizeChange, size],\n );\n\n const options: PanelControllerOptions = {\n collapseThreshold: expandable ? collapseThreshold : undefined,\n defaultSize: resolvedDefaultSize,\n expand: isExpand,\n max,\n min,\n onExpandChange: expandable ? setIsExpand : undefined,\n onSizeChange: commitSize,\n onSizeDragging,\n placement,\n size: currentSize,\n };\n\n const [controller] = useState(() => createPanelController(options));\n const state = useStore(controller.subscribe, () => controller.state);\n const elementRef = useRef<HTMLElement>(null);\n\n useIsomorphicLayoutEffect(() => {\n controller.sync(options);\n });\n\n useIsomorphicLayoutEffect(() => {\n const node = elementRef.current;\n return node ? controller.attach(node) : undefined;\n }, [controller]);\n\n const toggleExpand = useCallback(() => {\n if (expandable) setIsExpand(!isExpand);\n }, [expandable, isExpand, setIsExpand]);\n\n const context = useMemo(\n () => ({\n axis,\n controller,\n expand: isExpand,\n expandable,\n placement,\n showBorder,\n state,\n toggleExpand,\n }),\n [axis, controller, isExpand, expandable, placement, showBorder, state, toggleExpand],\n );\n\n return (\n <DraggablePanelContext value={context}>\n <aside\n className={cx(rootVariants({ mode, placement }), className)}\n data-expand={isExpand}\n data-expandable={expandable}\n data-resizing={state.dragging}\n ref={elementRef}\n style={\n {\n '--draggable-panel-bg': backgroundColor || '',\n 'flexDirection': axis.vertical ? 'column' : 'row',\n ...style,\n } as CSSProperties\n }\n {...rest}\n >\n {children}\n </aside>\n </DraggablePanelContext>\n );\n },\n);\n\nDraggablePanelRoot.displayName = 'DraggablePanelRoot';\n\nexport interface DraggablePanelContentProps extends Omit<DivProps, 'onDrag'> {}\n\nexport const DraggablePanelContent = memo<DraggablePanelContentProps>(\n ({ children, className, style, ...rest }) => {\n const { axis, controller, expand, placement, state } = useDraggablePanelContext();\n const extent = useTransform(controller.motion.size, (value) => Math.max(0, value));\n const clipping = state.dragging || state.folding || controller.target === 0;\n const shrunk = state.collapsing || !expand;\n\n return (\n <motion.div\n inert={!expand}\n style={\n {\n display: 'flex',\n flexDirection: axis.vertical ? 'column' : 'row',\n flexShrink: 0,\n justifyContent: axis.anchorEnd ? 'flex-end' : 'flex-start',\n overflow: clipping ? 'clip' : 'visible',\n [axis.cross]: '100%',\n [axis.extent]: extent,\n } as MotionStyle\n }\n >\n <motion.div\n animate={{ scale: shrunk ? COLLAPSED_SCALE : 1 }}\n className={cx(styles.content, className)}\n transition={timing()}\n style={\n {\n transformOrigin: ORIGIN_MAP[placement],\n [axis.cross]: '100%',\n [axis.extent]: controller.motion.content,\n ...style,\n } as MotionStyle\n }\n {...(rest as HTMLMotionProps<'div'>)}\n >\n {children}\n </motion.div>\n </motion.div>\n );\n },\n);\n\nDraggablePanelContent.displayName = 'DraggablePanelContent';\n\nexport interface DraggablePanelHandleProps extends Omit<DivProps, 'onDrag'> {\n wideArea?: boolean;\n}\n\nexport const DraggablePanelHandle = memo<DraggablePanelHandleProps>(\n ({ className, style, wideArea = true, ...rest }) => {\n const { axis, controller, expand, showBorder, state } = useDraggablePanelContext();\n const size = useStore(coarsePointer.subscribe, () => getHandleSize(wideArea));\n const target = useStore(controller.subscribe, () => controller.target);\n useEffect(() => () => controller.drag.cancel(), [controller]);\n\n const pressedRef = useRef<{ x: number; y: number } | null>(null);\n const draggingRef = useRef(false);\n const draggedRef = useRef(false);\n const { max, min } = controller.bounds();\n\n if (!expand) return null;\n\n return (\n <div\n aria-orientation={axis.ariaOrientation}\n aria-valuemax={Number.isFinite(max) ? max : undefined}\n aria-valuemin={min}\n aria-valuenow={target}\n aria-valuetext={`${target} pixels`}\n className={cx(handleVariants({ edge: axis.edge }), className)}\n data-border={showBorder}\n data-resizing={state.dragging || undefined}\n role=\"separator\"\n tabIndex={0}\n style={\n {\n '--draggable-panel-handle-size': `${size}px`,\n [EDGE_INSET[axis.edge]]: -size / 2,\n ...style,\n } as CSSProperties\n }\n onKeyDown={(event) => controller.resizeByKey(event)}\n onDoubleClick={() => {\n if (!draggedRef.current) controller.reset();\n }}\n onLostPointerCapture={() => {\n if (draggingRef.current) controller.drag.cancel();\n pressedRef.current = null;\n draggingRef.current = false;\n }}\n onPointerCancel={() => {\n controller.drag.cancel();\n pressedRef.current = null;\n draggingRef.current = false;\n }}\n onPointerDown={(event) => {\n draggedRef.current = false;\n pressedRef.current = { x: event.clientX, y: event.clientY };\n // A synthetic pointerdown carries no active pointer, and capturing throws.\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n /* empty */\n }\n }}\n onPointerMove={(event) => {\n if (!pressedRef.current) return;\n const offset = {\n x: event.clientX - pressedRef.current.x,\n y: event.clientY - pressedRef.current.y,\n };\n if (!draggingRef.current) {\n if (Math.hypot(offset.x, offset.y) < PAN_THRESHOLD) return;\n draggingRef.current = true;\n draggedRef.current = true;\n controller.drag.start();\n }\n controller.drag.move(offset);\n }}\n onPointerUp={() => {\n if (draggingRef.current) controller.drag.end();\n pressedRef.current = null;\n draggingRef.current = false;\n }}\n {...rest}\n />\n );\n },\n);\n\nDraggablePanelHandle.displayName = 'DraggablePanelHandle';\n\nexport interface DraggablePanelToggleProps extends Omit<DivProps, 'onDrag'> {\n showHandleWhenCollapsed?: boolean;\n}\n\nexport const DraggablePanelToggle = memo<DraggablePanelToggleProps>(\n ({ className, showHandleWhenCollapsed, style, ...rest }) => {\n const { axis, expand, expandable, placement, toggleExpand } = useDraggablePanelContext();\n\n if (!expandable) return null;\n\n const turn = CHEVRON_TURN[placement] + (expand ? 0 : 180);\n const chevX = axis.vertical ? BOW_CY : BOW_CX;\n const chevY = axis.vertical ? BOW_CX : BOW_CY;\n\n return (\n <div\n className={cx(toggleVariants({ placement }), className)}\n style={{ opacity: expand ? undefined : showHandleWhenCollapsed ? 1 : 0, ...style }}\n {...rest}\n >\n <button\n aria-label={expand ? 'Collapse panel' : 'Expand panel'}\n type=\"button\"\n onClick={toggleExpand}\n >\n <svg\n fill=\"none\"\n height={axis.vertical ? BOW_W : BOW_H}\n viewBox={`0 0 ${axis.vertical ? BOW_H : BOW_W} ${axis.vertical ? BOW_W : BOW_H}`}\n width={axis.vertical ? BOW_H : BOW_W}\n >\n {BOW_PATHS[axis.vertical ? 'horizontalSeam' : 'verticalSeam'].map((d) => (\n <path d={d} data-bow=\"\" key={d} strokeLinecap=\"round\" strokeWidth={BOW.stroke} />\n ))}\n <g\n style={{\n rotate: `${turn}deg`,\n transformOrigin: `${chevX}px ${chevY}px`,\n transition: 'rotate 0.25s var(--ant-motion-ease-out, ease)',\n }}\n >\n <path\n d={chevronPath(chevX, chevY)}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.6}\n />\n </g>\n </svg>\n </button>\n </div>\n );\n },\n);\n\nDraggablePanelToggle.displayName = 'DraggablePanelToggle';\n\nexport type DraggablePanelContainerProps = DivProps;\n\nexport const DraggablePanelContainer = memo<DraggablePanelContainerProps>(\n ({ className, ...rest }) => <div className={cx(styles.container, className)} {...rest} />,\n);\n\nDraggablePanelContainer.displayName = 'DraggablePanelContainer';\n\nexport type DraggablePanelBodyProps = DivProps;\n\nexport const DraggablePanelBody = memo<DraggablePanelBodyProps>(({ className, style, ...rest }) => (\n <div className={cx(styles.body, className)} style={{ flex: 1, ...style }} {...rest} />\n));\n\nDraggablePanelBody.displayName = 'DraggablePanelBody';\n\nexport type DraggablePanelFooterProps = DivProps;\n\nexport const DraggablePanelFooter = memo<DraggablePanelFooterProps>(({ className, ...rest }) => (\n <div className={cx(styles.footer, className)} {...rest} />\n));\n\nDraggablePanelFooter.displayName = 'DraggablePanelFooter';\n\nexport interface DraggablePanelHeaderProps extends Omit<DivProps, 'children' | 'title'> {\n extra?: ReactNode;\n onCollapse?: () => void;\n title?: ReactNode;\n}\n\nexport const DraggablePanelHeader = memo<DraggablePanelHeaderProps>(\n ({ className, extra, onCollapse, title, ...rest }) => {\n const { toggleExpand } = useDraggablePanelContext();\n\n return (\n <div className={cx(styles.header, className)} {...rest}>\n <ActionIcon icon={ChevronLeft} size={'small'} onClick={onCollapse ?? toggleExpand} />\n {title}\n {extra}\n </div>\n );\n },\n);\n\nDraggablePanelHeader.displayName = 'DraggablePanelHeader';\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Axis, Placement } from "./core/axes.mjs";
2
+ import { PanelController, PanelState } from "./core/controller.mjs";
3
+ //#region src/base-ui/DraggablePanel/context.d.ts
4
+ interface DraggablePanelContextValue {
5
+ axis: Axis;
6
+ controller: PanelController;
7
+ expand: boolean;
8
+ expandable: boolean;
9
+ placement: Placement;
10
+ showBorder: boolean;
11
+ state: PanelState;
12
+ toggleExpand: () => void;
13
+ }
14
+ declare const useDraggablePanelContext: () => DraggablePanelContextValue;
15
+ //#endregion
16
+ export { DraggablePanelContextValue, useDraggablePanelContext };
17
+ //# sourceMappingURL=context.d.mts.map
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { createContext, use } from "react";
3
+ //#region src/base-ui/DraggablePanel/context.ts
4
+ const DraggablePanelContext = createContext(null);
5
+ const useDraggablePanelContext = () => {
6
+ const context = use(DraggablePanelContext);
7
+ if (!context) throw new Error("DraggablePanel atoms must be used inside DraggablePanelRoot");
8
+ return context;
9
+ };
10
+ //#endregion
11
+ export { DraggablePanelContext, useDraggablePanelContext };
12
+
13
+ //# sourceMappingURL=context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.mjs","names":[],"sources":["../../../src/base-ui/DraggablePanel/context.ts"],"sourcesContent":["'use client';\n\nimport { createContext, use } from 'react';\n\nimport type { Axis, Placement } from './core/axes';\nimport type { PanelController, PanelState } from './core/controller';\n\nexport interface DraggablePanelContextValue {\n axis: Axis;\n controller: PanelController;\n expand: boolean;\n expandable: boolean;\n placement: Placement;\n showBorder: boolean;\n state: PanelState;\n toggleExpand: () => void;\n}\n\nexport const DraggablePanelContext = createContext<DraggablePanelContextValue | null>(null);\n\nexport const useDraggablePanelContext = () => {\n const context = use(DraggablePanelContext);\n if (!context) throw new Error('DraggablePanel atoms must be used inside DraggablePanelRoot');\n return context;\n};\n"],"mappings":";;;AAkBA,MAAa,wBAAwB,cAAiD,IAAI;AAE1F,MAAa,iCAAiC;CAC5C,MAAM,UAAU,IAAI,qBAAqB;CACzC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,6DAA6D;CAC3F,OAAO;AACT"}
@@ -0,0 +1,16 @@
1
+ //#region src/base-ui/DraggablePanel/core/axes.d.ts
2
+ type Placement = 'bottom' | 'left' | 'right' | 'top';
3
+ interface Axis {
4
+ anchorEnd: boolean;
5
+ ariaOrientation: 'horizontal' | 'vertical';
6
+ cross: 'height' | 'width';
7
+ cursor: 'col-resize' | 'row-resize';
8
+ edge: Placement;
9
+ extent: 'height' | 'width';
10
+ grow: 1 | -1;
11
+ point: 'x' | 'y';
12
+ vertical: boolean;
13
+ }
14
+ //#endregion
15
+ export { Axis, Placement };
16
+ //# sourceMappingURL=axes.d.mts.map
@@ -0,0 +1,51 @@
1
+ //#region src/base-ui/DraggablePanel/core/axes.ts
2
+ const AXES = {
3
+ bottom: {
4
+ anchorEnd: true,
5
+ ariaOrientation: "horizontal",
6
+ cross: "width",
7
+ cursor: "row-resize",
8
+ edge: "top",
9
+ extent: "height",
10
+ grow: -1,
11
+ point: "y",
12
+ vertical: true
13
+ },
14
+ left: {
15
+ anchorEnd: false,
16
+ ariaOrientation: "vertical",
17
+ cross: "height",
18
+ cursor: "col-resize",
19
+ edge: "right",
20
+ extent: "width",
21
+ grow: 1,
22
+ point: "x",
23
+ vertical: false
24
+ },
25
+ right: {
26
+ anchorEnd: true,
27
+ ariaOrientation: "vertical",
28
+ cross: "height",
29
+ cursor: "col-resize",
30
+ edge: "left",
31
+ extent: "width",
32
+ grow: -1,
33
+ point: "x",
34
+ vertical: false
35
+ },
36
+ top: {
37
+ anchorEnd: false,
38
+ ariaOrientation: "horizontal",
39
+ cross: "width",
40
+ cursor: "row-resize",
41
+ edge: "bottom",
42
+ extent: "height",
43
+ grow: 1,
44
+ point: "y",
45
+ vertical: true
46
+ }
47
+ };
48
+ //#endregion
49
+ export { AXES };
50
+
51
+ //# sourceMappingURL=axes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axes.mjs","names":[],"sources":["../../../../src/base-ui/DraggablePanel/core/axes.ts"],"sourcesContent":["export type Placement = 'bottom' | 'left' | 'right' | 'top';\n\nexport interface Axis {\n anchorEnd: boolean;\n ariaOrientation: 'horizontal' | 'vertical';\n cross: 'height' | 'width';\n cursor: 'col-resize' | 'row-resize';\n edge: Placement;\n extent: 'height' | 'width';\n grow: 1 | -1;\n point: 'x' | 'y';\n vertical: boolean;\n}\n\nexport const AXES: Record<Placement, Axis> = {\n bottom: {\n anchorEnd: true,\n ariaOrientation: 'horizontal',\n cross: 'width',\n cursor: 'row-resize',\n edge: 'top',\n extent: 'height',\n grow: -1,\n point: 'y',\n vertical: true,\n },\n left: {\n anchorEnd: false,\n ariaOrientation: 'vertical',\n cross: 'height',\n cursor: 'col-resize',\n edge: 'right',\n extent: 'width',\n grow: 1,\n point: 'x',\n vertical: false,\n },\n right: {\n anchorEnd: true,\n ariaOrientation: 'vertical',\n cross: 'height',\n cursor: 'col-resize',\n edge: 'left',\n extent: 'width',\n grow: -1,\n point: 'x',\n vertical: false,\n },\n top: {\n anchorEnd: false,\n ariaOrientation: 'horizontal',\n cross: 'width',\n cursor: 'row-resize',\n edge: 'bottom',\n extent: 'height',\n grow: 1,\n point: 'y',\n vertical: true,\n },\n};\n\nexport const mirrorPlacement = (placement: Placement): Placement => {\n if (placement === 'left') return 'right';\n if (placement === 'right') return 'left';\n return placement;\n};\n"],"mappings":";AAcA,MAAa,OAAgC;CAC3C,QAAQ;EACN,WAAW;EACX,iBAAiB;EACjB,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,UAAU;CACZ;CACA,MAAM;EACJ,WAAW;EACX,iBAAiB;EACjB,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,UAAU;CACZ;CACA,OAAO;EACL,WAAW;EACX,iBAAiB;EACjB,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,UAAU;CACZ;CACA,KAAK;EACH,WAAW;EACX,iBAAiB;EACjB,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,UAAU;CACZ;AACF"}