@threlte/flex 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,70 +1,100 @@
1
- <script lang="ts">import { T } from '@threlte/core';
2
- import { onDestroy } from 'svelte';
3
- import { Group, Object3D } from 'three';
4
- import { useFlex } from '../Flex/context';
5
- import { createUseDimensionsContext } from '../hooks/useDimensions';
6
- import { createNodeContext } from '../nodes/context';
7
- let { order, class: _class = '', onreflow, children, ...props } = $props();
8
- /**
9
- * Create the context for `useDimensions`
10
- */
11
- const dimensionsContext = createUseDimensionsContext();
12
- const { scaleFactor, onEvent, addNode, removeNode, updateNodeProps, mainAxis, crossAxis, depthAxis, classParser, reflow } = useFlex();
13
- const group = new Group();
14
- group.userData.isNode = true;
15
- const contentGroup = new Group();
16
- const { yoga } = useFlex();
17
- const node = yoga.Node.create();
18
- const parentNodeContext = createNodeContext(node);
19
- parentNodeContext?.insertNode(node, order);
20
- onDestroy(() => {
21
- parentNodeContext?.removeNode(node);
22
- });
23
- // update the order of the node
24
- $effect.pre(() => parentNodeContext?.updateNodeOrder(node, order));
25
- addNode(node, group, props);
26
- updateNodeProps(node, { ...classParser?.(_class, {}), ...props }, true);
27
- $effect.pre(() => updateNodeProps(node, { ...classParser?.(_class, {}), ...props }));
28
- onDestroy(() => {
29
- removeNode(node);
30
- });
31
- let computedWidth = $state(1);
32
- let computedHeight = $state(1);
33
- // after the parent has been reflowed, we can use the calculated layout to set the properties of the box
34
- onEvent('reflow:after', () => {
1
+ <script lang="ts">
2
+ import { T } from '@threlte/core'
3
+ import { onDestroy } from 'svelte'
4
+ import { Group, Object3D } from 'three'
5
+ import { useFlex } from '../Flex/context'
6
+ import { createUseDimensionsContext } from '../hooks/useDimensions'
7
+ import type { NodeProps } from '../lib/props'
8
+ import { createNodeContext } from '../nodes/context'
9
+ import type { BoxProps } from './types'
10
+
11
+ let { order, class: _class = '', onreflow, children, ...props }: BoxProps = $props()
12
+
13
+ /**
14
+ * Create the context for `useDimensions`
15
+ */
16
+ const dimensionsContext = createUseDimensionsContext()
17
+
18
+ const {
19
+ scaleFactor,
20
+ onEvent,
21
+ addNode,
22
+ removeNode,
23
+ updateNodeProps,
24
+ mainAxis,
25
+ crossAxis,
26
+ depthAxis,
27
+ classParser,
28
+ reflow
29
+ } = useFlex()
30
+
31
+ const group = new Group()
32
+ group.userData.isNode = true
33
+ const contentGroup = new Group()
34
+
35
+ const { yoga } = useFlex()
36
+
37
+ const node = yoga.Node.create()
38
+
39
+ const parentNodeContext = createNodeContext(node)
40
+ parentNodeContext?.insertNode(node, order)
41
+ onDestroy(() => {
42
+ parentNodeContext?.removeNode(node)
43
+ })
44
+
45
+ // update the order of the node
46
+ $effect.pre(() => parentNodeContext?.updateNodeOrder(node, order))
47
+
48
+ addNode(node, group, props as NodeProps)
49
+ updateNodeProps(node, { ...classParser?.(_class, {}), ...props } as NodeProps, true)
50
+
51
+ $effect.pre(() => updateNodeProps(node, { ...classParser?.(_class, {}), ...props } as NodeProps))
52
+
53
+ onDestroy(() => {
54
+ removeNode(node)
55
+ })
56
+
57
+ let computedWidth = $state(1)
58
+ let computedHeight = $state(1)
59
+
60
+ // after the parent has been reflowed, we can use the calculated layout to set the properties of the box
61
+ onEvent('reflow:after', () => {
35
62
  computedWidth =
36
- typeof props.width === 'number' ? props.width : node.getComputedWidth() / $scaleFactor;
63
+ typeof props.width === 'number' ? props.width : node.getComputedWidth() / $scaleFactor
64
+
37
65
  computedHeight =
38
- typeof props.height === 'number' ? props.height : node.getComputedHeight() / $scaleFactor;
39
- contentGroup.position[$mainAxis] = computedWidth / 2;
40
- contentGroup.position[$crossAxis] = -computedHeight / 2;
41
- contentGroup.position[$depthAxis] = 0;
42
- dimensionsContext.width.set(computedWidth);
43
- dimensionsContext.height.set(computedHeight);
66
+ typeof props.height === 'number' ? props.height : node.getComputedHeight() / $scaleFactor
67
+
68
+ contentGroup.position[$mainAxis] = computedWidth / 2
69
+ contentGroup.position[$crossAxis] = -computedHeight / 2
70
+ contentGroup.position[$depthAxis] = 0
71
+
72
+ dimensionsContext.width.set(computedWidth)
73
+ dimensionsContext.height.set(computedHeight)
74
+
44
75
  onreflow?.({
45
- width: computedWidth,
46
- height: computedHeight
47
- });
48
- });
49
- const proxy = new Object3D();
50
- proxy.add = (child) => {
76
+ width: computedWidth,
77
+ height: computedHeight
78
+ })
79
+ })
80
+
81
+ const proxy = new Object3D()
82
+ proxy.add = (child) => {
51
83
  if (child.userData.isNode) {
52
- group.add(child);
84
+ group.add(child)
85
+ } else {
86
+ contentGroup.add(child)
53
87
  }
54
- else {
55
- contentGroup.add(child);
56
- }
57
- return child;
58
- };
59
- proxy.remove = (child) => {
88
+ return child
89
+ }
90
+ proxy.remove = (child) => {
60
91
  if (child.userData.isNode) {
61
- group.remove(child);
62
- }
63
- else {
64
- contentGroup.remove(child);
92
+ group.remove(child)
93
+ } else {
94
+ contentGroup.remove(child)
65
95
  }
66
- return child;
67
- };
96
+ return child
97
+ }
68
98
  </script>
69
99
 
70
100
  <T is={group}>
@@ -1,3 +1,4 @@
1
1
  import type { BoxProps } from './types';
2
2
  declare const Box: import("svelte").Component<BoxProps, {}, "">;
3
+ type Box = ReturnType<typeof Box>;
3
4
  export default Box;
@@ -1,4 +1,4 @@
1
- import { type Snippet } from 'svelte';
1
+ import type { Snippet } from 'svelte';
2
2
  import type { NodeProps } from '../lib/props';
3
3
  export type BoxProps = NodeProps & {
4
4
  order?: number | undefined;
package/dist/Box/types.js CHANGED
@@ -1 +1 @@
1
- import {} from 'svelte';
1
+ export {};
@@ -1,11 +1,17 @@
1
- <script lang="ts">import { loadYoga } from 'yoga-layout/load';
2
- import InnerFlex from './InnerFlex.svelte';
3
- let { children: innerChildren, ref = $bindable(), ...props } = $props();
4
- let yoga = $state();
5
- const initialize = async () => {
6
- yoga = await loadYoga();
7
- };
8
- initialize();
1
+ <script lang="ts">
2
+ import { loadYoga, type Yoga } from 'yoga-layout/load'
3
+ import InnerFlex from './InnerFlex.svelte'
4
+ import type { FlexProps } from './types'
5
+
6
+ let { children: innerChildren, ref = $bindable(), ...props }: FlexProps = $props()
7
+
8
+ let yoga = $state<Yoga>()
9
+
10
+ const initialize = async () => {
11
+ yoga = await loadYoga()
12
+ }
13
+
14
+ initialize()
9
15
  </script>
10
16
 
11
17
  {#if yoga}
@@ -1,3 +1,4 @@
1
1
  import type { FlexProps } from './types';
2
2
  declare const Flex: import("svelte").Component<FlexProps, {}, "ref">;
3
+ type Flex = ReturnType<typeof Flex>;
3
4
  export default Flex;
@@ -1,153 +1,202 @@
1
- <script lang="ts">import { T, currentWritable, useTask } from '@threlte/core';
2
- import { onDestroy } from 'svelte';
3
- import { Box3, Group, Vector3 } from 'three';
4
- import { Direction } from 'yoga-layout';
5
- import { createUseDimensionsContext } from '../hooks/useDimensions';
6
- import { getDepthAxis } from '../lib/getDepthAxis';
7
- import { getOrientedBoundingBoxSize } from '../lib/getOrientedBoundingBoxSize';
8
- import { getRootShift } from '../lib/getRootShift';
9
- import { applyNodeProps } from '../lib/props';
10
- import { propsChanged } from '../lib/propsChanged';
11
- import { createNodeContext } from '../nodes/context';
12
- import { createFlexContext } from './context';
13
- let { yoga, width = 1, height = 1, plane = 'xy', direction = 'LTR', scaleFactor = 1000, classParser, class: _class = '', reflowStage, ref = $bindable(), onreflow, children, ...props } = $props();
14
- ref = new Group();
15
- ref.userData.isNode = true;
16
- const boundingBox = new Box3();
17
- const vec3 = new Vector3();
18
- /**
19
- * Create the context for `useDimensions`
20
- */
21
- const { width: computedWidth, height: computedHeight } = createUseDimensionsContext();
22
- /**
23
- * Reflowing inside useTask automatically batches reflows to 1 per frame.
24
- */
25
- const { start: reflow, stop } = useTask(Symbol('threlte-flex-reflow'), () => {
26
- flexContext.emit('reflow:before');
27
- for (const { node, group, props } of flexContext.nodes.values()) {
28
- const scaledWidth = typeof props.width === 'number' ? props.width * scaleFactor : props.width;
29
- const scaledHeight = typeof props.height === 'number' ? props.height * scaleFactor : props.height;
1
+ <script lang="ts">
2
+ import { T, currentWritable, useTask } from '@threlte/core'
3
+ import { onDestroy } from 'svelte'
4
+ import { Box3, Group, Vector3 } from 'three'
5
+ import { Direction } from 'yoga-layout'
6
+ import { createUseDimensionsContext } from '../hooks/useDimensions'
7
+ import { getDepthAxis } from '../lib/getDepthAxis'
8
+ import { getOrientedBoundingBoxSize } from '../lib/getOrientedBoundingBoxSize'
9
+ import { getRootShift } from '../lib/getRootShift'
10
+ import { applyNodeProps, type Axis, type NodeProps } from '../lib/props'
11
+ import { propsChanged } from '../lib/propsChanged'
12
+ import { createNodeContext } from '../nodes/context'
13
+ import { createFlexContext } from './context'
14
+ import type { InnerFlexProps } from './types'
15
+
16
+ let {
17
+ yoga,
18
+ width = 1,
19
+ height = 1,
20
+ plane = 'xy',
21
+ direction = 'LTR',
22
+ scaleFactor = 1000,
23
+ classParser,
24
+ class: _class = '',
25
+ reflowStage,
26
+ ref = $bindable(),
27
+ onreflow,
28
+ children,
29
+ ...props
30
+ }: InnerFlexProps = $props()
31
+
32
+ ref = new Group()
33
+ ref.userData.isNode = true
34
+
35
+ const boundingBox = new Box3()
36
+ const vec3 = new Vector3()
37
+
38
+ /**
39
+ * Create the context for `useDimensions`
40
+ */
41
+ const { width: computedWidth, height: computedHeight } = createUseDimensionsContext()
42
+
43
+ /**
44
+ * Reflowing inside useTask automatically batches reflows to 1 per frame.
45
+ */
46
+ const { start: reflow, stop } = useTask(
47
+ Symbol('threlte-flex-reflow'),
48
+ () => {
49
+ flexContext.emit('reflow:before')
50
+
51
+ for (const { node, group, props } of flexContext.nodes.values()) {
52
+ const scaledWidth =
53
+ typeof props.width === 'number' ? props.width * scaleFactor : props.width
54
+ const scaledHeight =
55
+ typeof props.height === 'number' ? props.height * scaleFactor : props.height
56
+
30
57
  if (scaledWidth !== undefined && scaledHeight !== undefined) {
31
- // Forced size, no need to calculate bounding box
32
- node.setWidth(scaledWidth);
33
- node.setHeight(scaledHeight);
34
- }
35
- else if (node.getChildCount() === 0) {
36
- // No size specified, calculate size
37
- if (ref) {
38
- getOrientedBoundingBoxSize(group, ref, boundingBox, vec3);
39
- }
40
- else {
41
- // ref is missing for some reason, let's just use usual bounding box
42
- boundingBox.setFromObject(group).getSize(vec3);
43
- }
44
- node.setWidth(scaledWidth || vec3[$mainAxis] * scaleFactor);
45
- node.setHeight(scaledHeight || vec3[$crossAxis] * scaleFactor);
58
+ // Forced size, no need to calculate bounding box
59
+ node.setWidth(scaledWidth)
60
+ node.setHeight(scaledHeight)
61
+ } else if (node.getChildCount() === 0) {
62
+ // No size specified, calculate size
63
+ if (ref) {
64
+ getOrientedBoundingBoxSize(group, ref, boundingBox, vec3)
65
+ } else {
66
+ // ref is missing for some reason, let's just use usual bounding box
67
+ boundingBox.setFromObject(group).getSize(vec3)
68
+ }
69
+
70
+ node.setWidth(scaledWidth || vec3[$mainAxis] * scaleFactor)
71
+ node.setHeight(scaledHeight || vec3[$crossAxis] * scaleFactor)
46
72
  }
47
- }
48
- rootNode.calculateLayout(width * scaleFactor, height * scaleFactor, Direction[direction]);
49
- const rootWidth = rootNode.getComputedWidth();
50
- const rootHeight = rootNode.getComputedHeight();
51
- let minX = 0;
52
- let maxX = 0;
53
- let minY = 0;
54
- let maxY = 0;
55
- // Reposition after recalculation
56
- for (const { node, group } of flexContext.nodes.values()) {
57
- const { left, top, width, height } = node.getComputedLayout();
58
- const [mainAxisShift, crossAxisShift] = getRootShift(rootWidth, rootHeight, node);
59
- group.position[$mainAxis] = (mainAxisShift + left) / scaleFactor;
60
- group.position[$crossAxis] = -(crossAxisShift + top) / scaleFactor;
61
- group.position[$depthAxis] = 0;
62
- minX = Math.min(minX, left);
63
- minY = Math.min(minY, top);
64
- maxX = Math.max(maxX, left + width);
65
- maxY = Math.max(maxY, top + height);
66
- }
67
- flexContext.emit('reflow:after');
68
- computedWidth.set((maxX - minX) / scaleFactor);
69
- computedHeight.set((maxY - minY) / scaleFactor);
70
- onreflow?.({
73
+ }
74
+
75
+ rootNode.calculateLayout(width * scaleFactor, height * scaleFactor, Direction[direction])
76
+
77
+ const rootWidth = rootNode.getComputedWidth()
78
+ const rootHeight = rootNode.getComputedHeight()
79
+
80
+ let minX = 0
81
+ let maxX = 0
82
+ let minY = 0
83
+ let maxY = 0
84
+
85
+ // Reposition after recalculation
86
+ for (const { node, group } of flexContext.nodes.values()) {
87
+ const { left, top, width, height } = node.getComputedLayout()
88
+ const [mainAxisShift, crossAxisShift] = getRootShift(rootWidth, rootHeight, node)
89
+
90
+ group.position[$mainAxis] = (mainAxisShift + left) / scaleFactor
91
+ group.position[$crossAxis] = -(crossAxisShift + top) / scaleFactor
92
+ group.position[$depthAxis] = 0
93
+
94
+ minX = Math.min(minX, left)
95
+ minY = Math.min(minY, top)
96
+ maxX = Math.max(maxX, left + width)
97
+ maxY = Math.max(maxY, top + height)
98
+ }
99
+
100
+ flexContext.emit('reflow:after')
101
+
102
+ computedWidth.set((maxX - minX) / scaleFactor)
103
+ computedHeight.set((maxY - minY) / scaleFactor)
104
+
105
+ onreflow?.({
71
106
  width: computedWidth.current,
72
107
  height: computedHeight.current
73
- });
74
- stop();
75
- }, {
76
- stage: reflowStage,
77
- autoStart: false
78
- });
79
- const flexContext = createFlexContext({
108
+ })
109
+
110
+ stop()
111
+ },
112
+ {
113
+ stage: reflowStage,
114
+ autoStart: false
115
+ }
116
+ )
117
+
118
+ const flexContext = createFlexContext({
80
119
  yoga,
81
120
  nodes: new Map(),
82
121
  addNode(node, group, props) {
83
- flexContext.nodes.set(node, { node, group, props });
84
- reflow();
122
+ flexContext.nodes.set(node, { node, group, props })
123
+ reflow()
85
124
  },
86
125
  updateNodeProps(node, props, force = false) {
87
- const nodeData = flexContext.nodes.get(node);
88
- // Updating the props can be forced and is done so on the initial call.
89
- if (force || propsChanged(node, props)) {
90
- applyNodeProps(node, props, scaleFactor);
91
- reflow();
92
- if (nodeData)
93
- nodeData.props = props;
94
- }
126
+ const nodeData = flexContext.nodes.get(node)
127
+
128
+ // Updating the props can be forced and is done so on the initial call.
129
+ if (force || propsChanged(node, props)) {
130
+ applyNodeProps(node, props, scaleFactor)
131
+ reflow()
132
+ if (nodeData) nodeData.props = props
133
+ }
95
134
  },
96
135
  removeNode(node) {
97
- flexContext.nodes.delete(node);
98
- reflow();
136
+ flexContext.nodes.delete(node)
137
+ reflow()
99
138
  },
100
139
  rootWidth: currentWritable(width),
101
140
  rootHeight: currentWritable(height),
102
141
  scaleFactor: currentWritable(scaleFactor ?? 1000),
103
- mainAxis: currentWritable(plane[0]),
104
- crossAxis: currentWritable(plane[1]),
142
+ mainAxis: currentWritable(plane[0] as Axis),
143
+ crossAxis: currentWritable(plane[1] as Axis),
105
144
  depthAxis: currentWritable(getDepthAxis(plane)),
106
145
  rootGroup: ref,
107
146
  reflow,
108
147
  classParser
109
- });
110
- const rootNode = yoga.Node.create();
111
- createNodeContext(rootNode);
112
- const { mainAxis, crossAxis, depthAxis } = flexContext;
113
- $effect.pre(() => {
114
- rootNode.setWidth(width * scaleFactor);
115
- rootNode.setHeight(height * scaleFactor);
116
- });
117
- flexContext.updateNodeProps(rootNode, { ...classParser?.(_class, {}), ...props }, true);
118
- $effect.pre(() => {
148
+ })
149
+
150
+ const rootNode = yoga.Node.create()
151
+ createNodeContext(rootNode)
152
+
153
+ const { mainAxis, crossAxis, depthAxis } = flexContext
154
+
155
+ $effect.pre(() => {
156
+ rootNode.setWidth(width * scaleFactor)
157
+ rootNode.setHeight(height * scaleFactor)
158
+ })
159
+
160
+ flexContext.updateNodeProps(
161
+ rootNode,
162
+ { ...classParser?.(_class, {}), ...props } as NodeProps,
163
+ true
164
+ )
165
+
166
+ $effect.pre(() => {
119
167
  flexContext.updateNodeProps(rootNode, {
120
- ...classParser?.(_class, {}),
121
- ...props
122
- });
123
- });
124
- $effect.pre(() => {
125
- flexContext.rootWidth.set(width);
126
- flexContext.reflow();
127
- });
128
- $effect.pre(() => {
129
- flexContext.rootHeight.set(height);
130
- flexContext.reflow();
131
- });
132
- $effect.pre(() => {
133
- flexContext.mainAxis.set(plane[0]);
134
- flexContext.reflow();
135
- });
136
- $effect.pre(() => {
137
- flexContext.crossAxis.set(plane[1]);
138
- flexContext.reflow();
139
- });
140
- $effect.pre(() => {
141
- flexContext.depthAxis.set(getDepthAxis(plane));
142
- flexContext.reflow();
143
- });
144
- $effect.pre(() => {
145
- flexContext.scaleFactor.set(scaleFactor);
146
- flexContext.reflow();
147
- });
148
- onDestroy(() => {
149
- rootNode.free();
150
- });
168
+ ...classParser?.(_class, {}),
169
+ ...props
170
+ } as NodeProps)
171
+ })
172
+ $effect.pre(() => {
173
+ flexContext.rootWidth.set(width)
174
+ flexContext.reflow()
175
+ })
176
+ $effect.pre(() => {
177
+ flexContext.rootHeight.set(height)
178
+ flexContext.reflow()
179
+ })
180
+ $effect.pre(() => {
181
+ flexContext.mainAxis.set(plane[0] as Axis)
182
+ flexContext.reflow()
183
+ })
184
+ $effect.pre(() => {
185
+ flexContext.crossAxis.set(plane[1] as Axis)
186
+ flexContext.reflow()
187
+ })
188
+ $effect.pre(() => {
189
+ flexContext.depthAxis.set(getDepthAxis(plane))
190
+ flexContext.reflow()
191
+ })
192
+ $effect.pre(() => {
193
+ flexContext.scaleFactor.set(scaleFactor)
194
+ flexContext.reflow()
195
+ })
196
+
197
+ onDestroy(() => {
198
+ rootNode.free()
199
+ })
151
200
  </script>
152
201
 
153
202
  <T is={ref}>
@@ -1,3 +1,4 @@
1
1
  import type { InnerFlexProps } from './types';
2
2
  declare const InnerFlex: import("svelte").Component<InnerFlexProps, {}, "ref">;
3
+ type InnerFlex = ReturnType<typeof InnerFlex>;
3
4
  export default InnerFlex;
package/dist/lib/props.js CHANGED
@@ -58,8 +58,16 @@ const applyScaleFactor = (prop, scaleFactor) => {
58
58
  return prop;
59
59
  };
60
60
  export const applyNodeProps = (node, props, scaleFactor) => {
61
- return Object.entries(alignFlexProps(props)).forEach(([key, value]) => {
62
- const scaledValue = applyScaleFactor(value, scaleFactor);
63
- propSetter[key]?.(scaledValue, node);
64
- });
61
+ const alignedProps = alignFlexProps(props);
62
+ for (const key in alignedProps) {
63
+ // limit to the known keys of propSetter
64
+ if (!(key in propSetter))
65
+ continue;
66
+ const k = key;
67
+ const prop = alignedProps[k];
68
+ if (prop === undefined)
69
+ continue;
70
+ const scaled = applyScaleFactor(prop, scaleFactor);
71
+ propSetter[k](scaled, node);
72
+ }
65
73
  };
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@threlte/flex",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",
5
5
  "license": "MIT",
6
6
  "description": "Components to easily use the flexbox spec with Threlte",
7
7
  "devDependencies": {
8
8
  "@eslint/js": "^9.26.0",
9
- "@sveltejs/adapter-auto": "^3.3.1",
10
- "@sveltejs/kit": "^2.7.7",
9
+ "@sveltejs/adapter-auto": "^6.1.0",
10
+ "@sveltejs/kit": "^2.37.0",
11
11
  "@sveltejs/package": "^2.3.7",
12
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
13
- "@types/node": "^20.12.7",
12
+ "@sveltejs/vite-plugin-svelte": "^6.1.4",
13
+ "@types/node": "^20.19.4",
14
14
  "@types/three": "^0.175.0",
15
15
  "@yushijinhun/three-minifier-rollup": "^0.4.0",
16
16
  "eslint": "^9.26.0",
@@ -19,18 +19,17 @@
19
19
  "prettier": "^3.2.5",
20
20
  "prettier-plugin-svelte": "^3.2.2",
21
21
  "publint": "^0.2.7",
22
- "rimraf": "^5.0.5",
23
- "svelte": "^5.26.2",
24
- "svelte-check": "^4.1.7",
25
- "svelte-preprocess": "^5.1.3",
22
+ "rimraf": "^6.0.1",
23
+ "svelte": "5.26.2",
24
+ "svelte-check": "^4.3.1",
26
25
  "svelte2tsx": "^0.7.6",
27
26
  "three": "^0.175.0",
28
27
  "tslib": "^2.6.2",
29
- "typescript": "^5.6.3",
28
+ "typescript": "5.9.2",
30
29
  "typescript-eslint": "^8.32.0",
31
- "vite": "^5.2.8",
32
- "@threlte/core": "8.0.5",
33
- "@threlte/extras": "9.2.2"
30
+ "vite": "^7.1.4",
31
+ "@threlte/core": "8.1.5",
32
+ "@threlte/extras": "9.5.4"
34
33
  },
35
34
  "dependencies": {
36
35
  "mitt": "^3.0.1",