svelte-flexiboards 0.4.0 → 0.4.2
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/LICENSE.md +21 -0
- package/README.md +15 -15
- package/dist/components/flexi-add.svelte +74 -86
- package/dist/components/flexi-add.svelte.d.ts +0 -12
- package/dist/components/flexi-announcer.svelte +24 -24
- package/dist/components/flexi-board.svelte +58 -58
- package/dist/components/flexi-delete.svelte +54 -66
- package/dist/components/flexi-grab.svelte +28 -28
- package/dist/components/flexi-grid.svelte +27 -27
- package/dist/components/flexi-layout-loader.svelte +10 -10
- package/dist/components/flexi-portal.svelte +14 -14
- package/dist/components/flexi-resize.svelte +30 -30
- package/dist/components/flexi-target-loader.svelte +14 -14
- package/dist/components/flexi-target.svelte +104 -104
- package/dist/components/flexi-widget.svelte +81 -81
- package/dist/components/rendered-flexi-widget.svelte +64 -64
- package/dist/components/responsive-flexi-board.svelte +83 -83
- package/dist/components/widget-transition-placeholder.svelte +12 -12
- package/dist/system/board/controller.svelte.d.ts +8 -8
- package/dist/system/board/controller.svelte.js +4 -0
- package/dist/system/internal-types.d.ts +109 -0
- package/dist/system/internal-types.js +1 -0
- package/dist/system/misc/adder.svelte.d.ts +2 -2
- package/dist/system/portal.d.ts +3 -3
- package/dist/system/shared/event-bus.d.ts +15 -14
- package/dist/system/shared/utils.svelte.d.ts +6 -3
- package/dist/system/shared/utils.svelte.js +49 -32
- package/dist/system/target/controller.svelte.d.ts +12 -11
- package/dist/system/target/controller.svelte.js +25 -22
- package/dist/system/target/types.d.ts +2 -2
- package/dist/system/types.d.ts +26 -27
- package/dist/system/widget/controller.svelte.d.ts +6 -6
- package/dist/system/widget/controller.svelte.js +1 -2
- package/dist/system/widget/triggers.svelte.js +9 -0
- package/package.json +60 -61
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
2
|
import { FlexiGrid, FlowFlexiGrid } from '../grid/index.js';
|
|
3
3
|
import { FlexiWidgetController } from '../widget/base.svelte.js';
|
|
4
4
|
import { InternalFlexiWidgetController } from '../widget/controller.svelte.js';
|
|
@@ -223,28 +223,31 @@ export class InternalFlexiTargetController {
|
|
|
223
223
|
* @returns The layout of widgets.
|
|
224
224
|
*/
|
|
225
225
|
exportLayout() {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
226
|
+
// Prevent reactive subscriptions onto exportLayout directly - they should use onLayoutChange.
|
|
227
|
+
return untrack(() => {
|
|
228
|
+
const result = [];
|
|
229
|
+
// Likely much more information than needed, but we've got it.
|
|
230
|
+
for (const widget of this.internalWidgets) {
|
|
231
|
+
if (!widget.type) {
|
|
232
|
+
console.warn('exportLayout(): widget has no type, it will be skipped.');
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const entry = {
|
|
236
|
+
type: widget.type,
|
|
237
|
+
width: widget.width,
|
|
238
|
+
height: widget.height,
|
|
239
|
+
x: widget.x,
|
|
240
|
+
y: widget.y,
|
|
241
|
+
metadata: widget.metadata
|
|
242
|
+
};
|
|
243
|
+
// Only include id if user provided one
|
|
244
|
+
if (widget.userProvidedId) {
|
|
245
|
+
entry.id = widget.userProvidedId;
|
|
246
|
+
}
|
|
247
|
+
result.push(entry);
|
|
244
248
|
}
|
|
245
|
-
result
|
|
246
|
-
}
|
|
247
|
-
return result;
|
|
249
|
+
return result;
|
|
250
|
+
});
|
|
248
251
|
}
|
|
249
252
|
#createShadow(of, action) {
|
|
250
253
|
const shadow = new InternalFlexiWidgetController({
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { FreeFormTargetLayout } from '../grid/free-grid.svelte.js';
|
|
2
2
|
import type { FlexiGrid, FlowTargetLayout } from '../grid/index.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { InternalWidgetAction } from '../internal-types.js';
|
|
4
4
|
import type { InternalFlexiWidgetController } from '../widget/controller.svelte.js';
|
|
5
5
|
import type { FlexiWidgetDefaults } from '../widget/types.js';
|
|
6
6
|
import type { FlexiTargetController } from './base.svelte.js';
|
|
7
7
|
export type FlexiTargetActionWidget = {
|
|
8
|
-
action:
|
|
8
|
+
action: InternalWidgetAction['action'];
|
|
9
9
|
widget: InternalFlexiWidgetController;
|
|
10
10
|
};
|
|
11
11
|
export type FlexiTargetState = {
|
package/dist/system/types.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { FlexiAddController
|
|
1
|
+
import type { FlexiTargetController } from './target/index.js';
|
|
2
|
+
import type { FlexiAddController } from './misc/adder.svelte.js';
|
|
3
3
|
import type { FlexiWidgetController } from './widget/base.svelte.js';
|
|
4
|
-
import type {
|
|
5
|
-
import type { InternalFlexiWidgetController } from './widget/controller.svelte.js';
|
|
4
|
+
import type { FlexiBoardController } from './board/base.svelte.js';
|
|
6
5
|
import type { FlexiLayout } from './board/types.js';
|
|
7
|
-
import type {
|
|
6
|
+
import type { ResponsiveFlexiBoardController } from './responsive/base.svelte.js';
|
|
8
7
|
export type ProxiedValue<T> = {
|
|
9
8
|
value: T;
|
|
10
9
|
};
|
|
@@ -20,7 +19,7 @@ export type WidgetResizability = 'none' | 'horizontal' | 'vertical' | 'both';
|
|
|
20
19
|
export type WidgetDraggability = 'none' | 'movable' | 'full';
|
|
21
20
|
export type WidgetGrabAction = {
|
|
22
21
|
action: 'grab';
|
|
23
|
-
widget:
|
|
22
|
+
widget: FlexiWidgetController;
|
|
24
23
|
offsetX: number;
|
|
25
24
|
offsetY: number;
|
|
26
25
|
capturedHeightPx: number;
|
|
@@ -28,7 +27,7 @@ export type WidgetGrabAction = {
|
|
|
28
27
|
};
|
|
29
28
|
export type WidgetResizeAction = {
|
|
30
29
|
action: 'resize';
|
|
31
|
-
widget:
|
|
30
|
+
widget: FlexiWidgetController;
|
|
32
31
|
offsetX: number;
|
|
33
32
|
offsetY: number;
|
|
34
33
|
left: number;
|
|
@@ -40,7 +39,7 @@ export type WidgetResizeAction = {
|
|
|
40
39
|
};
|
|
41
40
|
export type WidgetAction = WidgetGrabAction | WidgetResizeAction;
|
|
42
41
|
export type WidgetGrabbedParams = {
|
|
43
|
-
widget:
|
|
42
|
+
widget: FlexiWidgetController;
|
|
44
43
|
ref: HTMLElement;
|
|
45
44
|
xOffset: number;
|
|
46
45
|
yOffset: number;
|
|
@@ -50,7 +49,7 @@ export type WidgetGrabbedParams = {
|
|
|
50
49
|
capturedWidth: number;
|
|
51
50
|
};
|
|
52
51
|
export type WidgetStartResizeParams = {
|
|
53
|
-
widget:
|
|
52
|
+
widget: FlexiWidgetController;
|
|
54
53
|
xOffset: number;
|
|
55
54
|
yOffset: number;
|
|
56
55
|
left: number;
|
|
@@ -63,13 +62,13 @@ export type PointerMovedEvent = {
|
|
|
63
62
|
y: number;
|
|
64
63
|
};
|
|
65
64
|
export type AdderWidgetReadyEvent = {
|
|
66
|
-
adder:
|
|
67
|
-
widget:
|
|
65
|
+
adder: FlexiAddController;
|
|
66
|
+
widget: FlexiWidgetController;
|
|
68
67
|
};
|
|
69
68
|
export type WidgetEvent = {
|
|
70
|
-
target?:
|
|
71
|
-
board:
|
|
72
|
-
widget:
|
|
69
|
+
target?: FlexiTargetController;
|
|
70
|
+
board: FlexiBoardController;
|
|
71
|
+
widget: FlexiWidgetController;
|
|
73
72
|
};
|
|
74
73
|
export type WidgetGrabbedEvent = WidgetEvent & {
|
|
75
74
|
adder?: FlexiAddController;
|
|
@@ -81,7 +80,7 @@ export type WidgetGrabbedEvent = WidgetEvent & {
|
|
|
81
80
|
capturedWidthPx: number;
|
|
82
81
|
};
|
|
83
82
|
export type WidgetResizingEvent = WidgetEvent & {
|
|
84
|
-
target:
|
|
83
|
+
target: FlexiTargetController;
|
|
85
84
|
offsetX: number;
|
|
86
85
|
offsetY: number;
|
|
87
86
|
clientX: number;
|
|
@@ -92,24 +91,24 @@ export type WidgetResizingEvent = WidgetEvent & {
|
|
|
92
91
|
capturedWidthPx: number;
|
|
93
92
|
};
|
|
94
93
|
export type WidgetDroppedEvent = {
|
|
95
|
-
widget:
|
|
96
|
-
board:
|
|
97
|
-
oldTarget?:
|
|
98
|
-
newTarget?:
|
|
94
|
+
widget: FlexiWidgetController;
|
|
95
|
+
board: FlexiBoardController;
|
|
96
|
+
oldTarget?: FlexiTargetController;
|
|
97
|
+
newTarget?: FlexiTargetController;
|
|
99
98
|
};
|
|
100
99
|
export type WidgetStartResizeEvent = WidgetStartResizeParams & {
|
|
101
|
-
target:
|
|
100
|
+
target: FlexiTargetController;
|
|
102
101
|
};
|
|
103
102
|
export type WidgetOverEvent = {
|
|
104
|
-
widget:
|
|
103
|
+
widget: FlexiWidgetController;
|
|
105
104
|
mousePosition: Position;
|
|
106
105
|
};
|
|
107
106
|
export type WidgetOutEvent = {
|
|
108
|
-
widget:
|
|
107
|
+
widget: FlexiWidgetController;
|
|
109
108
|
};
|
|
110
109
|
export type TargetEvent = {
|
|
111
|
-
board:
|
|
112
|
-
target:
|
|
110
|
+
board: FlexiBoardController;
|
|
111
|
+
target: FlexiTargetController;
|
|
113
112
|
};
|
|
114
113
|
export type MouseGridCellMoveEvent = {
|
|
115
114
|
cellX: number;
|
|
@@ -121,7 +120,7 @@ export type GrabbedWidgetMouseEvent = {
|
|
|
121
120
|
widget: FlexiWidgetController;
|
|
122
121
|
};
|
|
123
122
|
export type HoveredTargetEvent = {
|
|
124
|
-
target:
|
|
123
|
+
target: FlexiTargetController;
|
|
125
124
|
};
|
|
126
125
|
export type WidgetActionEvent = (PointerEvent & {
|
|
127
126
|
isKeyboard?: undefined;
|
|
@@ -131,10 +130,10 @@ export type WidgetActionEvent = (PointerEvent & {
|
|
|
131
130
|
clientY: number;
|
|
132
131
|
});
|
|
133
132
|
export type BoardLayoutChangeEvent = {
|
|
134
|
-
board:
|
|
133
|
+
board: FlexiBoardController;
|
|
135
134
|
layout: FlexiLayout;
|
|
136
135
|
breakpoint?: string;
|
|
137
136
|
};
|
|
138
137
|
export type ResponsiveLayoutImportEvent = {
|
|
139
|
-
responsiveController:
|
|
138
|
+
responsiveController: ResponsiveFlexiBoardController;
|
|
140
139
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InternalWidgetDroppedEvent, InternalWidgetEvent, InternalWidgetGrabbedEvent, InternalWidgetResizingEvent } from '../internal-types.js';
|
|
2
2
|
import { FlexiWidgetController } from './base.svelte.js';
|
|
3
3
|
import type { InternalFlexiTargetController } from '../target/controller.svelte.js';
|
|
4
4
|
import { WidgetMoveInterpolator, type WidgetMovementAnimation } from './interpolator.svelte.js';
|
|
@@ -18,10 +18,10 @@ export declare class InternalFlexiWidgetController extends FlexiWidgetController
|
|
|
18
18
|
style: string;
|
|
19
19
|
readonly id: string;
|
|
20
20
|
constructor(params: FlexiWidgetConstructorParams);
|
|
21
|
-
onDropped(event:
|
|
22
|
-
onGrabbed(event:
|
|
23
|
-
onResizing(event:
|
|
24
|
-
onReleased(event:
|
|
21
|
+
onDropped(event: InternalWidgetDroppedEvent): void;
|
|
22
|
+
onGrabbed(event: InternalWidgetGrabbedEvent): void;
|
|
23
|
+
onResizing(event: InternalWidgetResizingEvent): void;
|
|
24
|
+
onReleased(event: InternalWidgetEvent): void;
|
|
25
25
|
/**
|
|
26
26
|
* Registers a grabber to the widget.
|
|
27
27
|
*/
|
|
@@ -50,7 +50,7 @@ export declare class InternalFlexiWidgetController extends FlexiWidgetController
|
|
|
50
50
|
* Deletes this widget from its target and board.
|
|
51
51
|
*/
|
|
52
52
|
delete(): void;
|
|
53
|
-
onDelete(event:
|
|
53
|
+
onDelete(event: InternalWidgetEvent): void;
|
|
54
54
|
/**
|
|
55
55
|
* Cleanup method to be called when the widget is destroyed
|
|
56
56
|
*/
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { getFlexiEventBus } from '../shared/event-bus.js';
|
|
2
|
-
import { generateUniqueId,
|
|
2
|
+
import { generateUniqueId, getPointerService } from '../shared/utils.svelte.js';
|
|
3
3
|
import { FlexiWidgetController } from './base.svelte.js';
|
|
4
4
|
import { WidgetMoveInterpolator } from './interpolator.svelte.js';
|
|
5
|
-
import { WidgetPointerEventWatcher } from './triggers.svelte.js';
|
|
6
5
|
export class InternalFlexiWidgetController extends FlexiWidgetController {
|
|
7
6
|
#pointerService = getPointerService();
|
|
8
7
|
// Grabber and resizer tracking
|
|
@@ -25,6 +25,9 @@ export class WidgetPointerEventWatcher {
|
|
|
25
25
|
if (!isGrabPointerEvent(event)) {
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
+
if (!this.#canStartWidgetEvent()) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
28
31
|
const pointerType = event.pointerType;
|
|
29
32
|
const triggerForType = this.#triggerConfig[pointerType] ?? this.#triggerConfig.default;
|
|
30
33
|
event.preventDefault();
|
|
@@ -34,6 +37,12 @@ export class WidgetPointerEventWatcher {
|
|
|
34
37
|
return this.#triggerWidgetEvent(event);
|
|
35
38
|
}
|
|
36
39
|
#eventTimeout = null;
|
|
40
|
+
#canStartWidgetEvent() {
|
|
41
|
+
if (this.#type == 'resize') {
|
|
42
|
+
return this.#widget.resizable;
|
|
43
|
+
}
|
|
44
|
+
return this.#widget.isGrabbable;
|
|
45
|
+
}
|
|
37
46
|
#handleLongPress(event, trigger) {
|
|
38
47
|
if (this.#eventTimeout) {
|
|
39
48
|
clearTimeout(this.#eventTimeout);
|
package/package.json
CHANGED
|
@@ -1,62 +1,61 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
2
|
+
"name": "svelte-flexiboards",
|
|
3
|
+
"licence": "MIT",
|
|
4
|
+
"version": "0.4.2",
|
|
5
|
+
"description": "The headless drag-and-drop toolkit for Svelte.",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"!dist/**/*.test.*",
|
|
9
|
+
"!dist/**/*.spec.*"
|
|
10
|
+
],
|
|
11
|
+
"svelte": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"module": "./dist/index.js",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"svelte": "./dist/index.js",
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"require": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"svelte": "^5.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@sveltejs/adapter-auto": "^3.0.0",
|
|
29
|
+
"@sveltejs/kit": "^2.0.0",
|
|
30
|
+
"@sveltejs/package": "^2.0.0",
|
|
31
|
+
"@sveltejs/vite-plugin-svelte": "^4.0.0",
|
|
32
|
+
"@types/node": "^22.13.5",
|
|
33
|
+
"@vitest/coverage-v8": "^3.0.7",
|
|
34
|
+
"typescript": "^5.0.0",
|
|
35
|
+
"typescript-eslint": "^8.0.0",
|
|
36
|
+
"vite": "^5.0.11",
|
|
37
|
+
"vitest": "^3.0.7"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/Blakintosh/svelte-flexiboards.git"
|
|
42
|
+
},
|
|
43
|
+
"author": "Blakintosh",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/Blakintosh/svelte-flexiboards/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/Blakintosh/svelte-flexiboards#readme",
|
|
49
|
+
"scripts": {
|
|
50
|
+
"dev": "pnpm watch",
|
|
51
|
+
"dev:host": "pnpm dev",
|
|
52
|
+
"build": "pnpm package",
|
|
53
|
+
"package": "svelte-kit sync && svelte-package && publint",
|
|
54
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
55
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
56
|
+
"format": "prettier --write .",
|
|
57
|
+
"lint": "prettier --check . && eslint .",
|
|
58
|
+
"watch": "svelte-kit sync && svelte-package --watch",
|
|
59
|
+
"test": "vitest run"
|
|
60
|
+
}
|
|
61
|
+
}
|