@dynamix-layout/solid 1.0.2 → 1.1.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.
@@ -0,0 +1,220 @@
1
+ import { Accessor } from 'solid-js';
2
+ import { Dimension } from '@dynamix-layout/core';
3
+ import { DynamixLayoutCore } from '@dynamix-layout/core';
4
+ import { JSX } from 'solid-js';
5
+ import { LayoutTree } from '@dynamix-layout/core';
6
+ import { NodeOptions } from '@dynamix-layout/core';
7
+ import { ParentComponent } from 'solid-js';
8
+ import { Setter } from 'solid-js';
9
+
10
+ export declare const DefaultHoverElement: (props: DivProps) => JSX.Element;
11
+
12
+ export declare const DefaultSliderElement: (props: {
13
+ direction?: boolean;
14
+ children?: JSX.Element;
15
+ } & DivProps) => JSX.Element;
16
+
17
+ export declare const DefaultTabsetToolbar: (props: TabsetToolbarProps) => JSX.Element;
18
+
19
+ export declare const DefaultWrapTabBody: (props: DivProps) => JSX.Element;
20
+
21
+ export declare const DefaultWrapTabHead: (props: DivProps) => JSX.Element;
22
+
23
+ export declare const DefaultWrapTabLabel: (props: DivProps) => JSX.Element;
24
+
25
+ export declare const DefaultWrapTabPanel: (props: DivProps) => JSX.Element;
26
+
27
+ export declare type DivFC = (props: {
28
+ children?: JSX.Element;
29
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
30
+
31
+ declare type DivProps = {
32
+ children?: JSX.Element;
33
+ active?: boolean;
34
+ } & JSX.HTMLAttributes<HTMLDivElement>;
35
+
36
+ export declare const DynamixLayout: ParentComponent<LayoutProps>;
37
+
38
+ export declare interface DynamixLayoutProps {
39
+ children?: JSX.Element;
40
+ layoutTree?: LayoutTree;
41
+ tabs?: string[];
42
+ class?: string;
43
+ style?: JSX.CSSProperties;
44
+ }
45
+
46
+ export declare const getTabOutput: (input: TabInput) => TabOutput;
47
+
48
+ export declare interface LayoutProps {
49
+ tabs: [string, JSX.Element][];
50
+ enableTabbar?: boolean;
51
+ WrapTabPanel?: DivFC;
52
+ WrapTabLabel?: (props: {
53
+ children?: JSX.Element;
54
+ active?: boolean;
55
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
56
+ WrapTabHead?: DivFC;
57
+ WrapTabBody?: DivFC;
58
+ HoverElement?: DivFC;
59
+ SliderElement?: (props: {
60
+ children?: JSX.Element;
61
+ direction?: boolean;
62
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
63
+ tabHeadHeight?: number;
64
+ layoutTree?: LayoutTree;
65
+ pad?: {
66
+ t: number;
67
+ b: number;
68
+ l: number;
69
+ r: number;
70
+ };
71
+ class?: string;
72
+ style?: JSX.CSSProperties;
73
+ bondWidth?: number;
74
+ /** In 2.0 this receives the v2 `LayoutJSON` format instead of `LayoutTree` (v1 layouts passed to `layoutTree` keep loading). See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
75
+ updateJSON?: (layoutTree: LayoutTree) => void;
76
+ minTabHeight?: number;
77
+ minTabWidth?: number;
78
+ /** @deprecated No effect in 2.0: splitters update once per animation frame. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
79
+ sliderUpdateTimeout?: number;
80
+ windowResizeTimeout?: number;
81
+ /** @deprecated No effect in 2.0: splitters update once per animation frame. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
82
+ disableSliderTimeout?: boolean;
83
+ disableResizeTimeout?: boolean;
84
+ hoverElementStyles?: JSX.CSSProperties;
85
+ sliderElementStyles?: JSX.CSSProperties;
86
+ tabPanelElementStyles?: JSX.CSSProperties;
87
+ tabBodyElementStyles?: JSX.CSSProperties;
88
+ tabHeadElementStyles?: JSX.CSSProperties;
89
+ tabLabelElementStyles?: JSX.CSSProperties;
90
+ RootSplitterHoverElStyles?: JSX.CSSProperties;
91
+ hoverElementClass?: string;
92
+ sliderElementClass?: string;
93
+ tabPanelElementClass?: string;
94
+ tabBodyElementClass?: string;
95
+ tabHeadElementClass?: string;
96
+ tabLabelElementClass?: string;
97
+ RootSplitterHoverElClass?: string;
98
+ rootId?: string;
99
+ tabNames?: Map<string, string | JSX.Element>;
100
+ /** Show the maximize button on tab bars (default true). */
101
+ enableMaximize?: boolean;
102
+ /** Show the fold button on tab bars (default true; needs the tab bar). */
103
+ enableCollapse?: boolean;
104
+ /** Double-click a tab bar to maximize or restore it (default true). */
105
+ enableDoubleClickMaximize?: boolean;
106
+ /** Alt/Option + "+" maximizes, Alt/Option + "-" folds the active tabset (default true). */
107
+ keyboardShortcuts?: boolean;
108
+ TabsetToolbar?: (props: TabsetToolbarProps) => JSX.Element;
109
+ }
110
+
111
+ export declare const RootSplitterHoverEl: (props: {
112
+ area: "left" | "right" | "top" | "bottom";
113
+ size?: {
114
+ w: string;
115
+ h: string;
116
+ };
117
+ gap?: string;
118
+ } & DivProps) => JSX.Element;
119
+
120
+ export declare type TabEntry = {
121
+ uqid: string;
122
+ name: string;
123
+ node: JSX.Element;
124
+ };
125
+
126
+ export declare type TabInput = [string, JSX.Element][];
127
+
128
+ export declare type TabOutput = {
129
+ keys: string[];
130
+ maps: Map<string, TabEntry>;
131
+ name: Map<string, string>;
132
+ };
133
+
134
+ export declare interface TabsetToolbarProps {
135
+ maximized: boolean;
136
+ folded: boolean;
137
+ /** The tab bar is drawn as a rotated vertical strip (folded, side-by-side row). */
138
+ rotated: boolean;
139
+ /** The tabset's row lays its children out side by side. */
140
+ rowIsHorizontal: boolean;
141
+ showMaximize: boolean;
142
+ showFold: boolean;
143
+ onToggleMaximize: () => void;
144
+ onToggleFold: () => void;
145
+ }
146
+
147
+ export declare const useDynamixLayout: ({ tabOutput, rootId, layoutTree, updateJSON, dimensions, tabHeadHeight, enableTabbar, bondWidth, minTabHeight, minTabWidth, sliderUpdateTimeout, windowResizeTimeout, disableSliderTimeout, disableResizeTimeout, keyboardShortcuts, enableDoubleClickMaximize, }: useDynamixLayoutOptions) => {
148
+ tabsets: Accessor<Map<string, NodeOptions>>;
149
+ sliders: Accessor<Map<string, NodeOptions>>;
150
+ tabsetsRef: Map<string, HTMLDivElement>;
151
+ panelsRef: Map<string, HTMLDivElement>;
152
+ tabsRef: Map<string, HTMLDivElement>;
153
+ slidersRef: Map<string, HTMLDivElement>;
154
+ layoutJSON: Accessor<LayoutTree | undefined>;
155
+ layoutInstance: DynamixLayoutCore;
156
+ hoverElementRef: {
157
+ current: HTMLDivElement | undefined;
158
+ };
159
+ rootSplitHoverEl: HTMLDivElement[];
160
+ dragging: Accessor<boolean>;
161
+ isUpdating: Accessor<boolean>;
162
+ /** @deprecated Internal state setter; will be removed in v2. */
163
+ setIsUpdating: Setter<boolean>;
164
+ /** @deprecated Internal state setter; will be removed in v2. */
165
+ setDragging: Setter<boolean>;
166
+ /** @deprecated Internal state setter; will be removed in v2. */
167
+ setTabsets: Setter<Map<string, NodeOptions>>;
168
+ /** @deprecated Internal state setter; will be removed in v2. */
169
+ setSliders: Setter<Map<string, NodeOptions>>;
170
+ /** @deprecated Internal state setter; will be removed in v2. */
171
+ setLayoutJSON: Setter<LayoutTree | undefined>;
172
+ onDragStart: (e: DragEvent) => void;
173
+ onDragOver: (e: DragEvent) => void;
174
+ onDragEnd: () => void;
175
+ onDragEnter: (e: DragEvent) => void;
176
+ onDragLeave: (e: DragEvent) => void;
177
+ onDrop: (e: DragEvent) => void;
178
+ onPointerDown: (e: PointerEvent) => void;
179
+ updateActiveTab: (e: MouseEvent) => void;
180
+ handleRootSplit: (e: DragEvent) => void;
181
+ handleNavbarDragOver: (e: DragEvent) => void;
182
+ toggleMaximize: (tabsetId: string) => void;
183
+ toggleCollapse: (tabsetId: string) => void;
184
+ onRootPointerDown: (e: PointerEvent) => void;
185
+ onTabbarDoubleClick: (e: MouseEvent) => void;
186
+ };
187
+
188
+ export declare interface UseDynamixLayoutOptions {
189
+ initialLayoutTree?: LayoutTree;
190
+ tabs?: string[];
191
+ }
192
+
193
+ export declare interface useDynamixLayoutOptions {
194
+ tabOutput: TabOutput;
195
+ rootId: string;
196
+ layoutTree?: LayoutTree;
197
+ updateJSON?: (layoutTree: LayoutTree) => void;
198
+ enableTabbar: boolean;
199
+ dimensions: () => Dimension;
200
+ sliderUpdateTimeout: number;
201
+ windowResizeTimeout: number;
202
+ disableSliderTimeout: boolean;
203
+ disableResizeTimeout: boolean;
204
+ hoverElementStyles?: JSX.CSSProperties;
205
+ bondWidth: number;
206
+ minTabHeight: number;
207
+ minTabWidth: number;
208
+ tabHeadHeight: number;
209
+ keyboardShortcuts?: boolean;
210
+ enableDoubleClickMaximize?: boolean;
211
+ }
212
+
213
+ export declare interface UseDynamixLayoutResult {
214
+ layoutTree: LayoutTree | undefined;
215
+ tabs: string[];
216
+ setTabs: (tabs: string[]) => void;
217
+ setLayoutTree: (layoutTree: LayoutTree) => void;
218
+ }
219
+
220
+ export { }
@@ -1,4 +1,220 @@
1
- export * from './components/Layout';
2
- export * from './hooks/useLayout';
3
- export * from './components/Default';
4
- export * from './types';
1
+ import { Accessor } from 'solid-js';
2
+ import { Dimension } from '@dynamix-layout/core';
3
+ import { DynamixLayoutCore } from '@dynamix-layout/core';
4
+ import { JSX } from 'solid-js';
5
+ import { LayoutTree } from '@dynamix-layout/core';
6
+ import { NodeOptions } from '@dynamix-layout/core';
7
+ import { ParentComponent } from 'solid-js';
8
+ import { Setter } from 'solid-js';
9
+
10
+ export declare const DefaultHoverElement: (props: DivProps) => JSX.Element;
11
+
12
+ export declare const DefaultSliderElement: (props: {
13
+ direction?: boolean;
14
+ children?: JSX.Element;
15
+ } & DivProps) => JSX.Element;
16
+
17
+ export declare const DefaultTabsetToolbar: (props: TabsetToolbarProps) => JSX.Element;
18
+
19
+ export declare const DefaultWrapTabBody: (props: DivProps) => JSX.Element;
20
+
21
+ export declare const DefaultWrapTabHead: (props: DivProps) => JSX.Element;
22
+
23
+ export declare const DefaultWrapTabLabel: (props: DivProps) => JSX.Element;
24
+
25
+ export declare const DefaultWrapTabPanel: (props: DivProps) => JSX.Element;
26
+
27
+ export declare type DivFC = (props: {
28
+ children?: JSX.Element;
29
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
30
+
31
+ declare type DivProps = {
32
+ children?: JSX.Element;
33
+ active?: boolean;
34
+ } & JSX.HTMLAttributes<HTMLDivElement>;
35
+
36
+ export declare const DynamixLayout: ParentComponent<LayoutProps>;
37
+
38
+ export declare interface DynamixLayoutProps {
39
+ children?: JSX.Element;
40
+ layoutTree?: LayoutTree;
41
+ tabs?: string[];
42
+ class?: string;
43
+ style?: JSX.CSSProperties;
44
+ }
45
+
46
+ export declare const getTabOutput: (input: TabInput) => TabOutput;
47
+
48
+ export declare interface LayoutProps {
49
+ tabs: [string, JSX.Element][];
50
+ enableTabbar?: boolean;
51
+ WrapTabPanel?: DivFC;
52
+ WrapTabLabel?: (props: {
53
+ children?: JSX.Element;
54
+ active?: boolean;
55
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
56
+ WrapTabHead?: DivFC;
57
+ WrapTabBody?: DivFC;
58
+ HoverElement?: DivFC;
59
+ SliderElement?: (props: {
60
+ children?: JSX.Element;
61
+ direction?: boolean;
62
+ } & JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;
63
+ tabHeadHeight?: number;
64
+ layoutTree?: LayoutTree;
65
+ pad?: {
66
+ t: number;
67
+ b: number;
68
+ l: number;
69
+ r: number;
70
+ };
71
+ class?: string;
72
+ style?: JSX.CSSProperties;
73
+ bondWidth?: number;
74
+ /** In 2.0 this receives the v2 `LayoutJSON` format instead of `LayoutTree` (v1 layouts passed to `layoutTree` keep loading). See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
75
+ updateJSON?: (layoutTree: LayoutTree) => void;
76
+ minTabHeight?: number;
77
+ minTabWidth?: number;
78
+ /** @deprecated No effect in 2.0: splitters update once per animation frame. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
79
+ sliderUpdateTimeout?: number;
80
+ windowResizeTimeout?: number;
81
+ /** @deprecated No effect in 2.0: splitters update once per animation frame. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
82
+ disableSliderTimeout?: boolean;
83
+ disableResizeTimeout?: boolean;
84
+ hoverElementStyles?: JSX.CSSProperties;
85
+ sliderElementStyles?: JSX.CSSProperties;
86
+ tabPanelElementStyles?: JSX.CSSProperties;
87
+ tabBodyElementStyles?: JSX.CSSProperties;
88
+ tabHeadElementStyles?: JSX.CSSProperties;
89
+ tabLabelElementStyles?: JSX.CSSProperties;
90
+ RootSplitterHoverElStyles?: JSX.CSSProperties;
91
+ hoverElementClass?: string;
92
+ sliderElementClass?: string;
93
+ tabPanelElementClass?: string;
94
+ tabBodyElementClass?: string;
95
+ tabHeadElementClass?: string;
96
+ tabLabelElementClass?: string;
97
+ RootSplitterHoverElClass?: string;
98
+ rootId?: string;
99
+ tabNames?: Map<string, string | JSX.Element>;
100
+ /** Show the maximize button on tab bars (default true). */
101
+ enableMaximize?: boolean;
102
+ /** Show the fold button on tab bars (default true; needs the tab bar). */
103
+ enableCollapse?: boolean;
104
+ /** Double-click a tab bar to maximize or restore it (default true). */
105
+ enableDoubleClickMaximize?: boolean;
106
+ /** Alt/Option + "+" maximizes, Alt/Option + "-" folds the active tabset (default true). */
107
+ keyboardShortcuts?: boolean;
108
+ TabsetToolbar?: (props: TabsetToolbarProps) => JSX.Element;
109
+ }
110
+
111
+ export declare const RootSplitterHoverEl: (props: {
112
+ area: "left" | "right" | "top" | "bottom";
113
+ size?: {
114
+ w: string;
115
+ h: string;
116
+ };
117
+ gap?: string;
118
+ } & DivProps) => JSX.Element;
119
+
120
+ export declare type TabEntry = {
121
+ uqid: string;
122
+ name: string;
123
+ node: JSX.Element;
124
+ };
125
+
126
+ export declare type TabInput = [string, JSX.Element][];
127
+
128
+ export declare type TabOutput = {
129
+ keys: string[];
130
+ maps: Map<string, TabEntry>;
131
+ name: Map<string, string>;
132
+ };
133
+
134
+ export declare interface TabsetToolbarProps {
135
+ maximized: boolean;
136
+ folded: boolean;
137
+ /** The tab bar is drawn as a rotated vertical strip (folded, side-by-side row). */
138
+ rotated: boolean;
139
+ /** The tabset's row lays its children out side by side. */
140
+ rowIsHorizontal: boolean;
141
+ showMaximize: boolean;
142
+ showFold: boolean;
143
+ onToggleMaximize: () => void;
144
+ onToggleFold: () => void;
145
+ }
146
+
147
+ export declare const useDynamixLayout: ({ tabOutput, rootId, layoutTree, updateJSON, dimensions, tabHeadHeight, enableTabbar, bondWidth, minTabHeight, minTabWidth, sliderUpdateTimeout, windowResizeTimeout, disableSliderTimeout, disableResizeTimeout, keyboardShortcuts, enableDoubleClickMaximize, }: useDynamixLayoutOptions) => {
148
+ tabsets: Accessor<Map<string, NodeOptions>>;
149
+ sliders: Accessor<Map<string, NodeOptions>>;
150
+ tabsetsRef: Map<string, HTMLDivElement>;
151
+ panelsRef: Map<string, HTMLDivElement>;
152
+ tabsRef: Map<string, HTMLDivElement>;
153
+ slidersRef: Map<string, HTMLDivElement>;
154
+ layoutJSON: Accessor<LayoutTree | undefined>;
155
+ layoutInstance: DynamixLayoutCore;
156
+ hoverElementRef: {
157
+ current: HTMLDivElement | undefined;
158
+ };
159
+ rootSplitHoverEl: HTMLDivElement[];
160
+ dragging: Accessor<boolean>;
161
+ isUpdating: Accessor<boolean>;
162
+ /** @deprecated Internal state setter; will be removed in v2. */
163
+ setIsUpdating: Setter<boolean>;
164
+ /** @deprecated Internal state setter; will be removed in v2. */
165
+ setDragging: Setter<boolean>;
166
+ /** @deprecated Internal state setter; will be removed in v2. */
167
+ setTabsets: Setter<Map<string, NodeOptions>>;
168
+ /** @deprecated Internal state setter; will be removed in v2. */
169
+ setSliders: Setter<Map<string, NodeOptions>>;
170
+ /** @deprecated Internal state setter; will be removed in v2. */
171
+ setLayoutJSON: Setter<LayoutTree | undefined>;
172
+ onDragStart: (e: DragEvent) => void;
173
+ onDragOver: (e: DragEvent) => void;
174
+ onDragEnd: () => void;
175
+ onDragEnter: (e: DragEvent) => void;
176
+ onDragLeave: (e: DragEvent) => void;
177
+ onDrop: (e: DragEvent) => void;
178
+ onPointerDown: (e: PointerEvent) => void;
179
+ updateActiveTab: (e: MouseEvent) => void;
180
+ handleRootSplit: (e: DragEvent) => void;
181
+ handleNavbarDragOver: (e: DragEvent) => void;
182
+ toggleMaximize: (tabsetId: string) => void;
183
+ toggleCollapse: (tabsetId: string) => void;
184
+ onRootPointerDown: (e: PointerEvent) => void;
185
+ onTabbarDoubleClick: (e: MouseEvent) => void;
186
+ };
187
+
188
+ export declare interface UseDynamixLayoutOptions {
189
+ initialLayoutTree?: LayoutTree;
190
+ tabs?: string[];
191
+ }
192
+
193
+ export declare interface useDynamixLayoutOptions {
194
+ tabOutput: TabOutput;
195
+ rootId: string;
196
+ layoutTree?: LayoutTree;
197
+ updateJSON?: (layoutTree: LayoutTree) => void;
198
+ enableTabbar: boolean;
199
+ dimensions: () => Dimension;
200
+ sliderUpdateTimeout: number;
201
+ windowResizeTimeout: number;
202
+ disableSliderTimeout: boolean;
203
+ disableResizeTimeout: boolean;
204
+ hoverElementStyles?: JSX.CSSProperties;
205
+ bondWidth: number;
206
+ minTabHeight: number;
207
+ minTabWidth: number;
208
+ tabHeadHeight: number;
209
+ keyboardShortcuts?: boolean;
210
+ enableDoubleClickMaximize?: boolean;
211
+ }
212
+
213
+ export declare interface UseDynamixLayoutResult {
214
+ layoutTree: LayoutTree | undefined;
215
+ tabs: string[];
216
+ setTabs: (tabs: string[]) => void;
217
+ setLayoutTree: (layoutTree: LayoutTree) => void;
218
+ }
219
+
220
+ export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamix-layout/solid",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "A powerful SolidJS component for creating dynamic, resizable, and draggable layouts.",
5
5
  "keywords": [
6
6
  "solid",
@@ -26,25 +26,32 @@
26
26
  ],
27
27
  "repository": {
28
28
  "type": "git",
29
- "url": "https://github.com/xcode-studio/dynamix-layout",
29
+ "url": "git+https://github.com/xcode-studio/dynamix-layout.git",
30
30
  "directory": "packages/solid"
31
31
  },
32
32
  "bugs": {
33
33
  "url": "https://github.com/xcode-studio/dynamix-layout/issues"
34
34
  },
35
35
  "homepage": "https://github.com/xcode-studio/dynamix-layout#readme",
36
- "main": "./dist/index.cjs.js",
36
+ "main": "./dist/index.cjs",
37
37
  "module": "./dist/index.es.js",
38
38
  "types": "./dist/types/index.d.ts",
39
39
  "typings": "./dist/types/index.d.ts",
40
40
  "style": "./dist/index.css",
41
41
  "exports": {
42
42
  ".": {
43
- "types": "./dist/types/index.d.ts",
44
- "import": "./dist/index.es.js",
45
- "require": "./dist/index.cjs.js"
43
+ "import": {
44
+ "types": "./dist/types/index.d.ts",
45
+ "default": "./dist/index.es.js"
46
+ },
47
+ "require": {
48
+ "types": "./dist/types/index.d.cts",
49
+ "default": "./dist/index.cjs"
50
+ }
46
51
  },
47
- "./style.css": "./dist/index.css"
52
+ "./style.css": "./dist/index.css",
53
+ "./styles.css": "./dist/index.css",
54
+ "./package.json": "./package.json"
48
55
  },
49
56
  "files": [
50
57
  "dist",
@@ -61,8 +68,7 @@
61
68
  },
62
69
  "type": "module",
63
70
  "engines": {
64
- "node": ">=22.16.0",
65
- "pnpm": ">=10.13.1"
71
+ "node": ">=18"
66
72
  },
67
73
  "license": "MIT",
68
74
  "devDependencies": {
@@ -73,12 +79,15 @@
73
79
  "vite": "^7.3.6",
74
80
  "vite-plugin-solid": "2.11.14",
75
81
  "vitest": "^4.1.11",
76
- "@repo/typescript-config": "0.0.0",
77
- "@repo/eslint-config": "0.0.0"
82
+ "solid-js": "^1.9.15",
83
+ "@repo/eslint-config": "0.0.0",
84
+ "@repo/typescript-config": "0.0.0"
78
85
  },
79
86
  "dependencies": {
80
- "solid-js": "^1.9.15",
81
- "@dynamix-layout/core": "1.1.0"
87
+ "@dynamix-layout/core": "1.2.0"
88
+ },
89
+ "peerDependencies": {
90
+ "solid-js": "^1.8.0"
82
91
  },
83
92
  "scripts": {
84
93
  "dev": "vite build --watch",
package/dist/index.cjs.js DELETED
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("solid-js/web"),l=require("@dynamix-layout/core"),b=require("solid-js");var N=n.template("<div>"),De=n.template("<div><div style=display:flex;align-items:center;gap:4px;height:100%>"),Ee=n.template('<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="lucide lucide-grip-vertical size-2.5"><circle cx=9 cy=12 r=1></circle><circle cx=9 cy=5 r=1></circle><circle cx=9 cy=19 r=1></circle><circle cx=15 cy=12 r=1></circle><circle cx=15 cy=5 r=1></circle><circle cx=15 cy=19 r=1>'),Te=n.template('<svg xmlns=http://www.w3.org/2000/svg width=24 height=24 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round style=transform:rotate(90deg)><circle cx=9 cy=12 r=1></circle><circle cx=9 cy=5 r=1></circle><circle cx=9 cy=19 r=1></circle><circle cx=15 cy=12 r=1></circle><circle cx=15 cy=5 r=1></circle><circle cx=15 cy=19 r=1>');const Z=e=>(()=>{var o=N();return n.spread(o,n.mergeProps(e,{get class(){return`DefaultWrapTabLabel ${e.class||""}`},get"data-state"(){return e.active?"active":"inactive"},get style(){return{"align-self":"center",padding:"4px 6px","box-sizing":"border-box","font-size":"14px","border-radius":"4px",...e.style}}}),!1,!0),n.insert(o,()=>e.children),o})(),ee=e=>(()=>{var o=N();return n.spread(o,n.mergeProps(e,{get class(){return`DefaultWrapTabBody hide-scrollbar ${e.class||""}`},get style(){return{"box-sizing":"border-box",height:"100%",width:"100%",display:"grid",overflow:"auto","scrollbar-width":"none","-ms-overflow-style":"none",...e.style}}}),!1,!0),n.insert(o,()=>e.children),o})(),te=e=>(()=>{var o=N();return n.spread(o,n.mergeProps(e,{get class(){return`DefaultWrapTabHead hide-scrollbar ${e.class||""}`},get style(){return{display:"grid","grid-auto-flow":"column","justify-content":"start","align-items":"center",gap:"6px","padding-left":"8px",width:"100%","box-sizing":"border-box",height:"100%","place-items":"self-start",overflow:"auto","background-color":"#dfdfdf","scrollbar-width":"none","-ms-overflow-style":"none",...e.style}}}),!1,!0),n.insert(o,()=>e.children),o})(),re=e=>(()=>{var o=N();return n.spread(o,n.mergeProps(e,{get class(){return`DefaultWrapTabPanel ${e.class||""}`},get style(){return{display:"grid","align-items":"center","place-items":"self-start","box-sizing":"border-box",position:"absolute","border-radius":"8px",...e.style}}}),!1,!0),n.insert(o,()=>e.children),o})(),ne=e=>(()=>{var o=N();return n.spread(o,n.mergeProps(e,{get class(){return`DefaultHoverElement ${e.class||""}`},get style(){return{display:"flex","justify-content":"center","align-items":"center",opacity:.7,position:"absolute","box-sizing":"border-box","font-weight":"bold","pointer-events":"none","background-color":"rgba(0, 175, 249, 0.5)","border-radius":"10px",transition:"all 0.2s ease",border:"2px dashed rgb(0, 196, 42)",...e.style}}}),!1,!0),n.insert(o,()=>e.children),o})(),ae=e=>(()=>{var o=De(),p=o.firstChild;return n.spread(o,n.mergeProps(e,{get class(){return`DefaultSliderElement ${e.class||""}`},get style(){return{width:"100%",height:"100%",position:"absolute","box-sizing":"border-box","background-color":"white","z-index":9,cursor:"grab",...e.style}}}),!1,!0),n.insert(p,(()=>{var m=n.memo(()=>!e.direction);return()=>m()?Ee():Te()})()),n.insert(o,()=>e.children,null),n.effect(m=>n.setStyleProperty(p,"flex-direction",e.direction?"column":"row")),o})(),oe=e=>{const[o,p]=b.splitProps(e,["area","size","gap","class","style","children"]),m=b.createMemo(()=>{const d=o.size||{h:"20%",w:"6px"},v=o.gap||"0px",f={};return o.area==="left"?(Object.assign(f,{"border-top-right-radius":"16px","border-bottom-right-radius":"16px",height:d.h,left:v,width:d.w}),f.top=`calc(50% - ${d.h} / 2)`):o.area==="top"?(Object.assign(f,{"border-bottom-left-radius":"16px","border-bottom-right-radius":"16px",width:d.h,top:v,height:d.w}),f.left=`calc(50% - ${d.h} / 2)`):o.area==="right"?(Object.assign(f,{"border-top-left-radius":"16px","border-bottom-left-radius":"16px",height:d.h,right:v,width:d.w}),f.top=`calc(50% - ${d.h} / 2)`):o.area==="bottom"&&(Object.assign(f,{"border-top-left-radius":"16px","border-top-right-radius":"16px",width:d.h,bottom:v,height:d.w}),f.left=`calc(50% - ${d.h} / 2)`),f});return(()=>{var d=N();return n.spread(d,n.mergeProps(p,{get class(){return`RootSplitterHoverEl ${o.class||""}`},get style(){return{position:"absolute","z-index":-1,display:"none","box-sizing":"border-box","background-color":"#0081f9",cursor:"grab",...o.style,...m()}}}),!1,!0),n.insert(d,()=>o.children),d})()},ie=({tabOutput:e,rootId:o,layoutTree:p,updateJSON:m,dimensions:d,tabHeadHeight:v,enableTabbar:f,bondWidth:F,minTabHeight:O,minTabWidth:S,sliderUpdateTimeout:A,windowResizeTimeout:z,disableSliderTimeout:P,disableResizeTimeout:R})=>{const $=new Map,H=new Map,C=new Map,W=new Map,w={current:void 0},L=[],[_,j]=b.createSignal(p),[I,E]=b.createSignal(new Map),[q,k]=b.createSignal(new Map),[U,x]=b.createSignal(!1);let D=null;const[X,y]=b.createSignal(!1),i={src:void 0,des:void 0,area:void 0,drag:!1},a={sliderId:void 0,isSliding:!1},u=f?Math.max(O,v):O,g=new l.DynamixLayoutCore({tabs:e.keys,tree:_(),minW:S,minH:u,bond:F,uqid:o,tabsIds:e.name}),G=t=>{const r=new Map(t);E(r)},Q=t=>{const r=new Map(t);k(r)},M=()=>{const t=f?v:0;l.Node.cache.tabOpts.get().forEach((r,c)=>{const s=W.get(c);if(!s)return;const h=l.getTabBodyRect(r.nodDims,t);l.setElementRect(s,h),s.style.display=r.nodOpen&&h.h>0?"block":"none"})},le=l.Node.cache.nodOpts.onChange(t=>{t.forEach((r,c)=>{const s=C.get(c);s&&l.setElementRect(s,r.nodDims);const h=$.get(c);h&&f&&l.setElementRect(h,{...r.nodDims,h:v})})}),de=l.Node.cache.tabOpts.onChange(()=>M()),ce=l.Node.cache.bndOpts.onChange(t=>{t.forEach((r,c)=>{const s=H.get(c);s&&l.setElementRect(s,r.nodDims)})}),Y=l.createFrameScheduler(({id:t,point:r})=>g.updateSlider(t,r,P,A)),V=t=>{const r=a.sliderId;!a.isSliding||!r||Y.schedule({id:r,point:{x:t.clientX,y:t.clientY}})},B=t=>{if(!a.isSliding)return;Y.flush();const r=t.currentTarget;a.isSliding=!1,a.sliderId=void 0,x(!1),m&&m(l.DynamixLayoutCore._root.toJSON()),r.releasePointerCapture(t.pointerId),r.removeEventListener("pointermove",V),r.removeEventListener("pointerup",B),r.removeEventListener("pointercancel",B)},ue=t=>{t.preventDefault();const r=t.currentTarget;a.isSliding=!0,a.sliderId=r.id,x(!0),r.setPointerCapture(t.pointerId),r.addEventListener("pointermove",V),r.addEventListener("pointerup",B),r.addEventListener("pointercancel",B)};let J={};const ge=(t,r,c)=>{if(!w.current||!i||!c)return null;const s=l.getTabsetDropPreview(c.getBoundingClientRect(),t,r);K(s),i.des=c,i.area=s.area},fe=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer&&(t.dataTransfer.dropEffect="move");const r=t.currentTarget,c=Array.from(r.childNodes);if(!w.current||!i)return;const s=l.getNavbarDropPreview(r.getBoundingClientRect(),c.map(h=>h.getBoundingClientRect()),t.clientX,t.clientY);s&&(K(s),i.des=c[s.index],i.area=s.area)},me=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer&&(t.dataTransfer.dropEffect="move");const r=t.currentTarget,{area:c,uid:s}=r.dataset;if(!c||!s||!w.current||!i)return;const h=c;i.des=r,i.area=h,K(l.getRootSplitPreview(d(),h))},K=t=>{const r=w.current;!r||l.isSameDropPreview(J,t)||(Object.assign(r.style,{left:`${t.left}px`,top:`${t.top}px`,width:`${t.width}px`,height:`${t.height}px`,display:"block",zIndex:"100"}),J=t)},he=t=>{if(t.stopPropagation(),x(!0),document.body.style.cursor="move",t.currentTarget){if(t.dataTransfer){t.dataTransfer.effectAllowed="move";const r=document.createElement("div");r.style.width="1px",r.style.height="1px",r.style.backgroundColor="transparent",r.style.position="absolute",r.style.top="-1000px",document.body.appendChild(r),t.dataTransfer.setDragImage(r,0,0),setTimeout(()=>{r.parentNode&&r.parentNode.removeChild(r)},0)}L.forEach(r=>{r&&(r.style.display="block",r.style.zIndex="99")}),C.forEach(r=>{r&&(r.style.display="block",r.style.zIndex="95")}),i.src=t.currentTarget,i.drag=!0}},be=t=>{if(t.preventDefault(),t.stopPropagation(),document.body.style.cursor="move",t.dataTransfer&&(t.dataTransfer.dropEffect="move"),!i?.src)return;const r=t.currentTarget,c=t.clientX,s=t.clientY;D&&cancelAnimationFrame(D),D=requestAnimationFrame(()=>{ge(c,s,r)})},ye=()=>{if(document.body.style.cursor="default",L.forEach(t=>{t&&(t.style.display="none",t.style.zIndex="-1")}),D&&(cancelAnimationFrame(D),D=null),w.current&&(w.current.style.display="none",w.current.style.zIndex="-1"),J={},i.drag=!1,!i?.src||!i?.des){i.area=void 0,i.src=void 0,i.des=void 0,x(!1);return}if(i.src===i.des){i.area=void 0,i.src=void 0,i.des=void 0,x(!1);return}if(i.src&&i.des){if(!i.area){console.warn("No area specified for drag and drop"),x(!1);return}if(!g.updateTree(i.src.dataset.uid,i.des.dataset.uid,i.area||"contain")){console.warn("Failed to update layout tree"),x(!1);return}requestAnimationFrame(()=>{G(l.Node.cache.nodOpts.get()),Q(l.Node.cache.bndOpts.get()),M(),m&&m(l.DynamixLayoutCore._root.toJSON())})}i.area=void 0,i.src=void 0,i.des=void 0,x(!1)},pe=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer&&(t.dataTransfer.dropEffect="move")},ve=t=>{t.preventDefault(),t.stopPropagation()},xe=t=>{t.preventDefault(),t.stopPropagation(),t.dataTransfer&&t.dataTransfer.getData("text/plain")},we=t=>{const r=t.currentTarget,c=r.dataset.uid;if(!c)return;const s=l.Node.cache.mapElem.get(c);if(!(s instanceof l.Node)){console.warn(`Element with uid ${c} is not a Node instance`);return}if(!s||!s.host||!s.host.unId){console.warn(`Node with uid ${c} not found in mapNode`);return}if(s.host.open==s.name){console.warn(`Node ${s.name} is already open`);return}const h=l.Node.cache.nodOpts.get().get(s.host.unId);if(!h||h.nodOpen&&s?.open)return;s.host.open=s.name,h.nodOpen=s.name,h.nodKids?.forEach(T=>{T.nodOpen=T.nodName===s.name}),r?.parentElement?.childNodes?.forEach(T=>{T instanceof HTMLDivElement&&T.dataset.uid!==c?T.dataset.state="inactive":T.dataset.state="active"}),M()};return b.onMount(()=>{const t=c=>{g.updateDimension(d(),c,z)};t(!0);const r=()=>t(R??!1);window.addEventListener("resize",r),G(l.Node.cache.nodOpts.get()),Q(l.Node.cache.bndOpts.get()),M(),m&&m(l.DynamixLayoutCore._root.toJSON()),b.onCleanup(()=>{window.removeEventListener("resize",r),le(),ce(),de(),Y.cancel(),D&&cancelAnimationFrame(D)})}),{tabsets:I,sliders:q,tabsetsRef:$,panelsRef:C,tabsRef:W,slidersRef:H,layoutJSON:_,layoutInstance:g,hoverElementRef:w,rootSplitHoverEl:L,dragging:U,isUpdating:X,setIsUpdating:y,setDragging:x,setTabsets:E,setSliders:k,setLayoutJSON:j,onDragStart:he,onDragOver:be,onDragEnd:ye,onDragEnter:pe,onDragLeave:ve,onDrop:xe,onPointerDown:ue,updateActiveTab:we,handleRootSplit:me,handleNavbarDragOver:fe}};var Se=n.template("<div>"),$e=n.template('<div class="flex items-center justify-center h-full"><span class=text-gray-500>No content');const se=e=>{const o=[],p=new Map,m=new Map;for(const[d,v]of e){const f=crypto.randomUUID();o.push(d),p.set(d,{uqid:f,name:d,node:v}),m.set(d,f)}return{keys:o,maps:p,name:m}},Ce=e=>{const o=b.createMemo(()=>se(e.tabs));let p;const m=()=>{const y=p;if(!y)return{w:0,h:0,x:0,y:0};const i=y.getBoundingClientRect(),a=e.pad||{t:0,b:0,l:0,r:0};return{w:i.width-(a.l+a.r),h:i.height-(a.t+a.b),x:i.left+a.l,y:i.top+a.t}},{tabsetsRef:d,slidersRef:v,sliders:f,tabsets:F,hoverElementRef:O,onDragEnd:S,onDragOver:A,onDragStart:z,onDragEnter:P,onDragLeave:R,onDrop:$,dragging:H,panelsRef:C,onPointerDown:W,handleNavbarDragOver:w,updateActiveTab:L,rootSplitHoverEl:_,handleRootSplit:j,tabsRef:I,isUpdating:E}=ie({tabOutput:o(),rootId:e.rootId||"dynamix-layout-root",updateJSON:e.updateJSON,enableTabbar:e.enableTabbar===void 0?!0:e.enableTabbar,layoutTree:e.layoutTree,tabHeadHeight:e.tabHeadHeight||l.DynamixLayoutCore._minH,dimensions:m,sliderUpdateTimeout:e.sliderUpdateTimeout||2,windowResizeTimeout:e.windowResizeTimeout||2,bondWidth:e.bondWidth||l.DynamixLayoutCore._bond,minTabHeight:e.minTabHeight||l.DynamixLayoutCore._minH,minTabWidth:e.minTabWidth||l.DynamixLayoutCore._minW,disableSliderTimeout:e.disableSliderTimeout===void 0?!0:e.disableSliderTimeout,disableResizeTimeout:e.disableResizeTimeout===void 0?!0:e.disableResizeTimeout,hoverElementStyles:e.hoverElementStyles}),q=e.WrapTabPanel||re,k=e.WrapTabHead||te,U=e.WrapTabLabel||Z,x=e.WrapTabBody||ee,D=e.SliderElement||ae,X=e.HoverElement||ne;return(()=>{var y=Se(),i=p;return typeof i=="function"?n.use(i,y):p=y,n.spread(y,n.mergeProps({get id(){return e.rootId||"dynamix-layout-root"}},e,{get"data-testid"(){return e.rootId||"dynamix-layout-root"},get class(){return H()?"is-dragging":""},get style(){return{position:"relative",width:"100%",height:"100%",overflow:"hidden",...e.style}}}),!1,!0),n.insert(y,n.createComponent(b.For,{get each(){return Array.from(F().values())},children:a=>[n.createComponent(q,{ref:u=>{const g=a.uidNode;u?C.set(g,u):C.delete(g)},onDragEnd:S,onDragOver:A,onDragEnter:P,onDragLeave:R,onDrop:$,get"data-uid"(){return a.uidNode},get"data-type"(){return a.typNode},get class(){return"hide-scrollbar DefaultWrapTabPanel "+(e.tabPanelElementClass||"")},get style(){return{position:"absolute",...e.tabPanelElementStyles,width:`${a.nodDims.w}px`,height:`${a.nodDims.h}px`,left:`${a.nodDims.x}px`,top:`${a.nodDims.y}px`,"background-color":"transparent"}}}),n.createComponent(k,{get draggable(){return!E()},get"data-uid"(){return a.uidNode},"data-type":"tabset",onDragOver:w,onDragStart:z,onDragEnd:S,onDragEnter:P,onDragLeave:R,onDrop:$,ref:u=>{const g=a.uidNode;u?d.set(g,u):d.delete(g)},get class(){return"hide-scrollbar "+(e.tabHeadElementClass||"")},get style(){return{...e.tabHeadElementStyles,position:"absolute","z-index":99,width:`${a.nodDims.w}px`,height:`${e.tabHeadHeight||l.DynamixLayoutCore._minH}px`,left:`${a.nodDims.x}px`,top:`${a.nodDims.y}px`,cursor:E()?"wait":"pointer"}},get children(){return n.createComponent(b.For,{get each(){return a.nodKids},children:u=>n.createComponent(U,{get"data-uid"(){return u.uidNode},"data-type":"tab",onDragStart:z,onDragEnd:S,get draggable(){return!E()},get active(){return!!u.nodOpen},get class(){return"hide-scrollbar "+(e.tabLabelElementClass||"")},get style(){return{cursor:E()?"wait":"pointer",...e.tabLabelElementStyles}},onClick:L,get children(){return n.memo(()=>!!e.tabNames)()&&e.tabNames.get(u.nodName)||u.nodName}})})}})]}),null),n.insert(y,n.createComponent(b.For,{get each(){return o().keys},children:a=>{const u=o().maps.get(a)?.uqid;return n.createComponent(x,{id:u,draggable:!1,"data-uid":u,get class(){return"hide-scrollbar "+(e.tabBodyElementClass||"")},get style(){return{position:"absolute","z-index":90,"overscroll-behavior":"contain",...e.tabBodyElementStyles}},ref:g=>{u&&(g?I.set(u,g):I.delete(u))},get children(){return o().maps.get(a)?.node||$e()}})}}),null),n.insert(y,n.createComponent(b.For,{get each(){return Array.from(f().values())},children:a=>n.createComponent(D,{get id(){return a.uidNode},get"data-uid"(){return a.uidNode},get direction(){return a.nodeDir},onPointerDown:W,get class(){return"hide-scrollbar "+(e.sliderElementClass||"")},ref:u=>{const g=a.uidNode;u?v.set(g,u):v.delete(g)},get style(){return{width:`${a.nodDims.w}px`,height:`${a.nodDims.h}px`,left:`${a.nodDims.x}px`,top:`${a.nodDims.y}px`,cursor:a.nodeDir?"ns-resize":"ew-resize",...e.sliderElementStyles}}})}),null),n.insert(y,n.createComponent(X,{get class(){return"hide-scrollbar "+(e.hoverElementClass||"")},get style(){return{...e.hoverElementStyles}},ref:a=>O.current=a}),null),n.insert(y,n.createComponent(b.For,{each:["left","right","top","bottom"],children:(a,u)=>n.createComponent(oe,{onDragOver:j,onDragEnd:S,onDragEnter:P,onDragLeave:R,onDrop:$,get"data-uid"(){return e.rootId||"dynamix-layout-root"},"data-area":a,get class(){return"hide-scrollbar "+(e.RootSplitterHoverElClass||"")},ref:g=>{g&&(_[u()]=g)},get style(){return{...e.RootSplitterHoverElStyles}},area:a,size:{h:"25%",w:"8px"}})}),null),y})()};exports.DefaultHoverElement=ne;exports.DefaultSliderElement=ae;exports.DefaultWrapTabBody=ee;exports.DefaultWrapTabHead=te;exports.DefaultWrapTabLabel=Z;exports.DefaultWrapTabPanel=re;exports.DynamixLayout=Ce;exports.RootSplitterHoverEl=oe;exports.getTabOutput=se;exports.useDynamixLayout=ie;
@@ -1,23 +0,0 @@
1
- import { JSX } from 'solid-js';
2
- type DivProps = {
3
- children?: JSX.Element;
4
- active?: boolean;
5
- } & JSX.HTMLAttributes<HTMLDivElement>;
6
- export declare const DefaultWrapTabLabel: (props: DivProps) => JSX.Element;
7
- export declare const DefaultWrapTabBody: (props: DivProps) => JSX.Element;
8
- export declare const DefaultWrapTabHead: (props: DivProps) => JSX.Element;
9
- export declare const DefaultWrapTabPanel: (props: DivProps) => JSX.Element;
10
- export declare const DefaultHoverElement: (props: DivProps) => JSX.Element;
11
- export declare const DefaultSliderElement: (props: {
12
- direction?: boolean;
13
- children?: JSX.Element;
14
- } & DivProps) => JSX.Element;
15
- export declare const RootSplitterHoverEl: (props: {
16
- area: "left" | "right" | "top" | "bottom";
17
- size?: {
18
- w: string;
19
- h: string;
20
- };
21
- gap?: string;
22
- } & DivProps) => JSX.Element;
23
- export {};
@@ -1,4 +0,0 @@
1
- import { ParentComponent } from 'solid-js';
2
- import { LayoutProps, TabInput, TabOutput } from '../types';
3
- export declare const getTabOutput: (input: TabInput) => TabOutput;
4
- export declare const DynamixLayout: ParentComponent<LayoutProps>;
@@ -1,39 +0,0 @@
1
- import { LayoutTree, DynamixLayoutCore, NodeOptions } from '../../../core/src';
2
- import { useDynamixLayoutOptions } from '../types';
3
- import { Accessor, Setter } from 'solid-js';
4
- export declare const useDynamixLayout: ({ tabOutput, rootId, layoutTree, updateJSON, dimensions, tabHeadHeight, enableTabbar, bondWidth, minTabHeight, minTabWidth, sliderUpdateTimeout, windowResizeTimeout, disableSliderTimeout, disableResizeTimeout, }: useDynamixLayoutOptions) => {
5
- tabsets: Accessor<Map<string, NodeOptions>>;
6
- sliders: Accessor<Map<string, NodeOptions>>;
7
- tabsetsRef: Map<string, HTMLDivElement>;
8
- panelsRef: Map<string, HTMLDivElement>;
9
- tabsRef: Map<string, HTMLDivElement>;
10
- slidersRef: Map<string, HTMLDivElement>;
11
- layoutJSON: Accessor<LayoutTree | undefined>;
12
- layoutInstance: DynamixLayoutCore;
13
- hoverElementRef: {
14
- current: HTMLDivElement | undefined;
15
- };
16
- rootSplitHoverEl: HTMLDivElement[];
17
- dragging: Accessor<boolean>;
18
- isUpdating: Accessor<boolean>;
19
- /** @deprecated Internal state setter; will be removed in v2. */
20
- setIsUpdating: Setter<boolean>;
21
- /** @deprecated Internal state setter; will be removed in v2. */
22
- setDragging: Setter<boolean>;
23
- /** @deprecated Internal state setter; will be removed in v2. */
24
- setTabsets: Setter<Map<string, NodeOptions>>;
25
- /** @deprecated Internal state setter; will be removed in v2. */
26
- setSliders: Setter<Map<string, NodeOptions>>;
27
- /** @deprecated Internal state setter; will be removed in v2. */
28
- setLayoutJSON: Setter<LayoutTree | undefined>;
29
- onDragStart: (e: DragEvent) => void;
30
- onDragOver: (e: DragEvent) => void;
31
- onDragEnd: () => void;
32
- onDragEnter: (e: DragEvent) => void;
33
- onDragLeave: (e: DragEvent) => void;
34
- onDrop: (e: DragEvent) => void;
35
- onPointerDown: (e: PointerEvent) => void;
36
- updateActiveTab: (e: MouseEvent) => void;
37
- handleRootSplit: (e: DragEvent) => void;
38
- handleNavbarDragOver: (e: DragEvent) => void;
39
- };