@threlte/theatre 3.0.7 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +0 -4
  2. package/dist/index.d.ts +6 -6
  3. package/dist/index.js +4 -4
  4. package/dist/project/Project.svelte +34 -13
  5. package/dist/project/Project.svelte.d.ts +4 -2
  6. package/dist/sequence/Sequence.svelte +102 -71
  7. package/dist/sequence/Sequence.svelte.d.ts +5 -5
  8. package/dist/sequence/SequenceController.d.ts +2 -2
  9. package/dist/sequence/SequenceController.js +1 -1
  10. package/dist/sequence/useSequence.d.ts +1 -1
  11. package/dist/sheet/Sheet.svelte +34 -16
  12. package/dist/sheet/Sheet.svelte.d.ts +5 -3
  13. package/dist/sheet/types.d.ts +1 -1
  14. package/dist/sheetObject/SheetObject.svelte +108 -75
  15. package/dist/sheetObject/SheetObject.svelte.d.ts +11 -4
  16. package/dist/sheetObject/declare/Declare.svelte +23 -14
  17. package/dist/sheetObject/declare/Declare.svelte.d.ts +11 -4
  18. package/dist/sheetObject/sync/Sync.svelte +122 -85
  19. package/dist/sheetObject/sync/Sync.svelte.d.ts +15 -4
  20. package/dist/sheetObject/sync/types.d.ts +1 -1
  21. package/dist/sheetObject/sync/utils/getInitialValue.js +2 -2
  22. package/dist/sheetObject/sync/utils/isComplexProp.d.ts +1 -1
  23. package/dist/sheetObject/sync/utils/isStringProp.d.ts +1 -1
  24. package/dist/sheetObject/sync/utils/parsePropLabel.d.ts +1 -1
  25. package/dist/sheetObject/transfomers/createTransformer.d.ts +1 -1
  26. package/dist/sheetObject/transfomers/defaults/color.d.ts +1 -1
  27. package/dist/sheetObject/transfomers/defaults/color.js +2 -2
  28. package/dist/sheetObject/transfomers/defaults/degrees.d.ts +1 -1
  29. package/dist/sheetObject/transfomers/defaults/degrees.js +2 -2
  30. package/dist/sheetObject/transfomers/defaults/euler.d.ts +1 -1
  31. package/dist/sheetObject/transfomers/defaults/euler.js +2 -2
  32. package/dist/sheetObject/transfomers/defaults/generic.d.ts +1 -1
  33. package/dist/sheetObject/transfomers/defaults/generic.js +3 -3
  34. package/dist/sheetObject/transfomers/defaults/normalized.d.ts +1 -1
  35. package/dist/sheetObject/transfomers/defaults/normalized.js +2 -2
  36. package/dist/sheetObject/transfomers/defaults/side.d.ts +1 -1
  37. package/dist/sheetObject/transfomers/defaults/side.js +2 -2
  38. package/dist/sheetObject/transfomers/getDefaultTransformer.d.ts +1 -1
  39. package/dist/sheetObject/transfomers/getDefaultTransformer.js +6 -6
  40. package/dist/sheetObject/transform/Transform.svelte +145 -120
  41. package/dist/sheetObject/transform/Transform.svelte.d.ts +11 -4
  42. package/dist/studio/InnerStudio.svelte +31 -19
  43. package/dist/studio/InnerStudio.svelte.d.ts +5 -3
  44. package/dist/studio/Studio.svelte +12 -3
  45. package/dist/studio/Studio.svelte.d.ts +4 -2
  46. package/dist/studio/useStudio.js +1 -1
  47. package/dist/theatre/Theatre.svelte +15 -2
  48. package/dist/theatre/Theatre.svelte.d.ts +4 -2
  49. package/package.json +11 -12
@@ -1,6 +1,6 @@
1
- import { types } from '../../../theatre';
2
- import { isPrimitive } from '../../sync/utils/isPrimitive';
3
- import { createTransformer } from '../createTransformer';
1
+ import { types } from '../../../theatre.js';
2
+ import { isPrimitive } from '../../sync/utils/isPrimitive.js';
3
+ import { createTransformer } from '../createTransformer.js';
4
4
  export const generic = createTransformer({
5
5
  transform(value) {
6
6
  if (isPrimitive(value)) {
@@ -1 +1 @@
1
- export declare const normalized: import("../types").Transformer;
1
+ export declare const normalized: import("../types.js").Transformer;
@@ -1,5 +1,5 @@
1
- import { types } from '../../../theatre';
2
- import { createTransformer } from '../createTransformer';
1
+ import { types } from '../../../theatre.js';
2
+ import { createTransformer } from '../createTransformer.js';
3
3
  export const normalized = createTransformer({
4
4
  transform(value) {
5
5
  return types.number(value, {
@@ -1 +1 @@
1
- export declare const side: import("../types").Transformer;
1
+ export declare const side: import("../types.js").Transformer;
@@ -1,5 +1,5 @@
1
- import { types } from '../../../theatre';
2
- import { createTransformer } from '../createTransformer';
1
+ import { types } from '../../../theatre.js';
2
+ import { createTransformer } from '../createTransformer.js';
3
3
  import { BackSide, DoubleSide, FrontSide } from 'three';
4
4
  export const side = createTransformer({
5
5
  transform(value) {
@@ -1 +1 @@
1
- export declare const getDefaultTransformer: (target: any, path: string, fullPropertyPath: string) => import("./types").Transformer;
1
+ export declare const getDefaultTransformer: (target: any, path: string, fullPropertyPath: string) => import("./types.js").Transformer;
@@ -1,9 +1,9 @@
1
- import { color } from './defaults/color';
2
- import { degrees } from './defaults/degrees';
3
- import { euler } from './defaults/euler';
4
- import { generic } from './defaults/generic';
5
- import { normalized } from './defaults/normalized';
6
- import { side } from './defaults/side';
1
+ import { color } from './defaults/color.js';
2
+ import { degrees } from './defaults/degrees.js';
3
+ import { euler } from './defaults/euler.js';
4
+ import { generic } from './defaults/generic.js';
5
+ import { normalized } from './defaults/normalized.js';
6
+ import { side } from './defaults/side.js';
7
7
  const isFullOrEndingPattern = (fullPropertyPath, pattern) => {
8
8
  return fullPropertyPath.endsWith(`.${pattern}`) || fullPropertyPath === pattern;
9
9
  };
@@ -1,137 +1,162 @@
1
1
  <script
2
2
  lang="ts"
3
3
  generics="Label extends string | undefined"
4
- >import { T, watch } from '@threlte/core';
5
- import { TransformControls } from '@threlte/extras';
6
- import { onMount } from 'svelte';
7
- import { Group } from 'three';
8
- import { RAD2DEG } from 'three/src/math/MathUtils.js';
9
- import { useStudio } from '../../studio/useStudio';
10
- import { types } from '../../theatre';
11
- import { getDefaultTransformer } from '../transfomers/getDefaultTransformer';
12
- import { useSheet } from '../useSheet';
13
- let { label, key, mode = 'translate', space, translationSnap, rotationSnap, scaleSnap, children } = $props();
14
- const { sheetObject, addProps, removeProps } = useSheet();
15
- let controls = $state(undefined);
16
- $effect.pre(() => {
4
+ >
5
+ import type { IScrub } from '@theatre/studio'
6
+ import { T, watch } from '@threlte/core'
7
+ import { TransformControls } from '@threlte/extras'
8
+ import { onMount } from 'svelte'
9
+ import { Group } from 'three'
10
+ import type { TransformControls as TC } from 'three/examples/jsm/controls/TransformControls.js'
11
+ import { RAD2DEG } from 'three/src/math/MathUtils.js'
12
+ import { useStudio } from '../../studio/useStudio.js'
13
+ import { types } from '../../theatre.js'
14
+ import { getDefaultTransformer } from '../transfomers/getDefaultTransformer.js'
15
+ import { useSheet } from '../useSheet.js'
16
+ import type { TransformProps } from './types.js'
17
+
18
+ let {
19
+ label,
20
+ key,
21
+ mode = 'translate',
22
+ space,
23
+ translationSnap,
24
+ rotationSnap,
25
+ scaleSnap,
26
+ children
27
+ }: TransformProps<Label> = $props()
28
+
29
+ const { sheetObject, addProps, removeProps } = useSheet<any>()
30
+
31
+ let controls = $state<TC | undefined>(undefined)
32
+
33
+ $effect.pre(() => {
17
34
  if (controls) {
18
- if (translationSnap) {
19
- controls.setTranslationSnap(translationSnap);
20
- }
21
- else {
22
- controls.setTranslationSnap(null);
23
- }
24
- if (rotationSnap) {
25
- controls.setRotationSnap(rotationSnap);
26
- }
27
- else {
28
- controls.setRotationSnap(null);
29
- }
30
- if (scaleSnap) {
31
- controls.setScaleSnap(scaleSnap);
32
- }
33
- else {
34
- controls.setScaleSnap(null);
35
- }
35
+ if (translationSnap) {
36
+ controls.setTranslationSnap(translationSnap)
37
+ } else {
38
+ controls.setTranslationSnap(null)
39
+ }
40
+ if (rotationSnap) {
41
+ controls.setRotationSnap(rotationSnap)
42
+ } else {
43
+ controls.setRotationSnap(null)
44
+ }
45
+ if (scaleSnap) {
46
+ controls.setScaleSnap(scaleSnap)
47
+ } else {
48
+ controls.setScaleSnap(null)
49
+ }
36
50
  }
37
- });
38
- const group = new Group();
39
- const positionTransformer = getDefaultTransformer(group, 'position', 'position');
40
- const rotationTransformer = getDefaultTransformer(group, 'rotation', 'rotation');
41
- const scaleTransformer = getDefaultTransformer(group, 'scale', 'scale');
42
- const initTransform = () => {
43
- const positionProp = positionTransformer.transform(group.position);
44
- const rotationProp = rotationTransformer.transform(group.rotation);
45
- const scaleProp = scaleTransformer.transform(group.scale);
51
+ })
52
+
53
+ const group = new Group()
54
+
55
+ const positionTransformer = getDefaultTransformer(group, 'position', 'position')
56
+ const rotationTransformer = getDefaultTransformer(group, 'rotation', 'rotation')
57
+ const scaleTransformer = getDefaultTransformer(group, 'scale', 'scale')
58
+
59
+ const initTransform = () => {
60
+ const positionProp = positionTransformer.transform(group.position)
61
+ const rotationProp = rotationTransformer.transform(group.rotation)
62
+ const scaleProp = scaleTransformer.transform(group.scale)
63
+
46
64
  if (key) {
47
- addProps({
48
- [key]: types.compound({
49
- position: positionProp,
50
- rotation: rotationProp,
51
- scale: scaleProp
52
- }, {
53
- label: label ?? key
54
- })
55
- });
56
- }
57
- else {
58
- addProps({
65
+ addProps({
66
+ [key]: types.compound(
67
+ {
59
68
  position: positionProp,
60
69
  rotation: rotationProp,
61
70
  scale: scaleProp
62
- });
71
+ },
72
+ {
73
+ label: label ?? key
74
+ }
75
+ )
76
+ })
77
+ } else {
78
+ addProps({
79
+ position: positionProp,
80
+ rotation: rotationProp,
81
+ scale: scaleProp
82
+ })
63
83
  }
64
- };
65
- watch([sheetObject], ([sheetObject]) => {
84
+ }
85
+
86
+ watch([sheetObject], ([sheetObject]) => {
66
87
  return sheetObject?.onValuesChange((values) => {
67
- let object = values;
68
- if (key) {
69
- if (!values[key])
70
- return;
71
- object = values[key];
72
- }
73
- else {
74
- if (!values.position || !values.rotation || !values.scale)
75
- return;
76
- }
77
- // sanity check
78
- if (!object)
79
- return;
80
- positionTransformer.apply(group, 'position', object.position);
81
- rotationTransformer.apply(group, 'rotation', object.rotation);
82
- scaleTransformer.apply(group, 'scale', object.scale);
83
- });
84
- });
85
- onMount(() => {
86
- initTransform();
88
+ let object = values
89
+
90
+ if (key) {
91
+ if (!values[key]) return
92
+ object = values[key]
93
+ } else {
94
+ if (!values.position || !values.rotation || !values.scale) return
95
+ }
96
+
97
+ // sanity check
98
+ if (!object) return
99
+
100
+ positionTransformer.apply(group, 'position', object.position)
101
+ rotationTransformer.apply(group, 'rotation', object.rotation)
102
+ scaleTransformer.apply(group, 'scale', object.scale)
103
+ })
104
+ })
105
+
106
+ onMount(() => {
107
+ initTransform()
87
108
  return () => {
88
- removeProps(key ? [key] : ['position', 'rotation', 'scale']);
89
- };
90
- });
91
- const studio = useStudio();
92
- let scrub;
93
- let isSelected = $state(false);
94
- watch([studio], ([studio]) => {
109
+ removeProps(key ? [key] : ['position', 'rotation', 'scale'])
110
+ }
111
+ })
112
+
113
+ const studio = useStudio()
114
+ let scrub: IScrub | undefined
115
+ let isSelected = $state(false)
116
+
117
+ watch([studio], ([studio]) => {
95
118
  return studio?.onSelectionChange((selection) => {
96
- if (!$sheetObject)
97
- return;
98
- isSelected = selection.includes($sheetObject);
99
- });
100
- });
101
- const onMouseDown = () => {
102
- if (!studio.current)
103
- return;
104
- if (scrub)
105
- return;
106
- scrub = $studio?.scrub();
107
- };
108
- const onChange = () => {
109
- if (!scrub)
110
- return;
119
+ if (!$sheetObject) return
120
+ isSelected = selection.includes($sheetObject)
121
+ })
122
+ })
123
+
124
+ const onMouseDown = () => {
125
+ if (!studio.current) return
126
+ if (scrub) return
127
+ scrub = $studio?.scrub()
128
+ }
129
+
130
+ const onChange = () => {
131
+ if (!scrub) return
111
132
  scrub.capture((api) => {
112
- if (!$sheetObject)
113
- return;
114
- const baseTarget = key ? $sheetObject.props[key] : $sheetObject.props;
115
- api.set(baseTarget.position, {
116
- ...group.position
117
- });
118
- api.set(baseTarget.rotation, {
119
- x: group.rotation.x * RAD2DEG,
120
- y: group.rotation.y * RAD2DEG,
121
- z: group.rotation.z * RAD2DEG
122
- });
123
- api.set(baseTarget.scale, {
124
- ...group.scale
125
- });
126
- });
127
- };
128
- const onMouseUp = () => {
129
- if (!scrub)
130
- return;
131
- scrub.commit();
132
- scrub = undefined;
133
- };
134
- const groupRef = group;
133
+ if (!$sheetObject) return
134
+
135
+ const baseTarget = key ? $sheetObject.props[key] : $sheetObject.props
136
+
137
+ api.set(baseTarget.position as any, {
138
+ ...group.position
139
+ })
140
+
141
+ api.set(baseTarget.rotation as any, {
142
+ x: group.rotation.x * RAD2DEG,
143
+ y: group.rotation.y * RAD2DEG,
144
+ z: group.rotation.z * RAD2DEG
145
+ })
146
+
147
+ api.set(baseTarget.scale as any, {
148
+ ...group.scale
149
+ })
150
+ })
151
+ }
152
+
153
+ const onMouseUp = () => {
154
+ if (!scrub) return
155
+ scrub.commit()
156
+ scrub = undefined
157
+ }
158
+
159
+ const groupRef = group as any
135
160
  </script>
136
161
 
137
162
  <T is={groupRef}>
@@ -1,8 +1,15 @@
1
- import type { TransformProps } from './types';
1
+ import type { TransformProps } from './types.js';
2
+ declare function $$render<Label extends string | undefined>(): {
3
+ props: TransformProps<Label>;
4
+ exports: {};
5
+ bindings: "";
6
+ slots: {};
7
+ events: {};
8
+ };
2
9
  declare class __sveltets_Render<Label extends string | undefined> {
3
- props(): TransformProps<Label>;
4
- events(): {};
5
- slots(): {};
10
+ props(): ReturnType<typeof $$render<Label>>['props'];
11
+ events(): ReturnType<typeof $$render<Label>>['events'];
12
+ slots(): ReturnType<typeof $$render<Label>>['slots'];
6
13
  bindings(): "";
7
14
  exports(): {};
8
15
  }
@@ -1,30 +1,42 @@
1
1
  <script
2
2
  lang="ts"
3
3
  module
4
- >import Studio from '@theatre/studio';
5
- import { studio } from '../consts';
6
- Studio.initialize();
7
- studio.set(Studio);
4
+ >
5
+ const studioModule = await import('@theatre/studio')
6
+ const Studio = studioModule.default as unknown as typeof import('@theatre/studio').default
7
+ import { studio } from '../consts.js'
8
+
9
+ Studio.initialize()
10
+ studio.set(Studio)
8
11
  </script>
9
12
 
10
- <script lang="ts">import { watch } from '@threlte/core';
11
- import { writable } from 'svelte/store';
12
- let { hide, children } = $props();
13
- const hideStore = writable(hide);
14
- $effect(() => {
15
- hideStore.set(hide);
16
- });
17
- watch([studio, hideStore], ([studio, hide]) => {
13
+ <script lang="ts">
14
+ import { watch } from '@threlte/core'
15
+ import { writable } from 'svelte/store'
16
+
17
+ interface Props {
18
+ hide: boolean
19
+ children?: import('svelte').Snippet
20
+ }
21
+
22
+ let { hide, children }: Props = $props()
23
+
24
+ const hideStore = writable(hide)
25
+ $effect(() => {
26
+ hideStore.set(hide)
27
+ })
28
+
29
+ watch([studio, hideStore], ([studio, hide]) => {
18
30
  if (hide) {
19
- studio?.ui.hide();
20
- }
21
- else {
22
- studio?.ui.restore();
31
+ studio?.ui.hide()
32
+ } else {
33
+ studio?.ui.restore()
23
34
  }
35
+
24
36
  return () => {
25
- studio?.ui.hide();
26
- };
27
- });
37
+ studio?.ui.hide()
38
+ }
39
+ })
28
40
  </script>
29
41
 
30
42
  {@render children?.()}
@@ -1,5 +1,7 @@
1
- declare const InnerStudio: import("svelte").Component<{
1
+ interface Props {
2
2
  hide: boolean;
3
- children?: import("svelte").Snippet;
4
- }, {}, "">;
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const InnerStudio: import("svelte").Component<Props, {}, "">;
6
+ type InnerStudio = ReturnType<typeof InnerStudio>;
5
7
  export default InnerStudio;
@@ -1,6 +1,15 @@
1
- <script lang="ts">let { enabled = true, hide = false, children } = $props();
2
- const browser = typeof window !== 'undefined';
3
- export {};
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte'
3
+
4
+ interface Props {
5
+ enabled?: boolean
6
+ hide?: boolean
7
+ children?: Snippet
8
+ }
9
+
10
+ let { enabled = true, hide = false, children }: Props = $props()
11
+
12
+ const browser = typeof window !== 'undefined'
4
13
  </script>
5
14
 
6
15
  {#if browser && enabled}
@@ -1,7 +1,9 @@
1
1
  import type { Snippet } from 'svelte';
2
- declare const Studio: import("svelte").Component<{
2
+ interface Props {
3
3
  enabled?: boolean;
4
4
  hide?: boolean;
5
5
  children?: Snippet;
6
- }, {}, "">;
6
+ }
7
+ declare const Studio: import("svelte").Component<Props, {}, "">;
8
+ type Studio = ReturnType<typeof Studio>;
7
9
  export default Studio;
@@ -1,4 +1,4 @@
1
- import { studio } from '../consts';
1
+ import { studio } from '../consts.js';
2
2
  /**
3
3
  * ### `useStudio`
4
4
  *
@@ -1,5 +1,18 @@
1
- <script lang="ts">import { Project, Sheet, Studio } from '..';
2
- let { studio = {}, config = undefined, children } = $props();
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte'
3
+ import type { IProjectConfig } from '@theatre/core'
4
+ import { Project, Sheet, Studio } from '../index.js'
5
+
6
+ interface Props {
7
+ studio?: {
8
+ enabled?: boolean
9
+ hide?: boolean
10
+ }
11
+ config?: IProjectConfig | undefined
12
+ children?: Snippet
13
+ }
14
+
15
+ let { studio = {}, config = undefined, children }: Props = $props()
3
16
  </script>
4
17
 
5
18
  <Studio {...studio}>
@@ -1,11 +1,13 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { IProjectConfig } from '@theatre/core';
3
- declare const Theatre: import("svelte").Component<{
3
+ interface Props {
4
4
  studio?: {
5
5
  enabled?: boolean;
6
6
  hide?: boolean;
7
7
  };
8
8
  config?: IProjectConfig | undefined;
9
9
  children?: Snippet;
10
- }, {}, "">;
10
+ }
11
+ declare const Theatre: import("svelte").Component<Props, {}, "">;
12
+ type Theatre = ReturnType<typeof Theatre>;
11
13
  export default Theatre;
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@threlte/theatre",
3
- "version": "3.0.7",
3
+ "version": "3.1.1",
4
4
  "author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",
5
5
  "license": "MIT",
6
6
  "description": "Threlte Components for Theatre, an animation library with a professional motion design toolset",
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,19 +19,18 @@
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",
22
+ "rimraf": "^6.0.1",
23
23
  "svelte": "5.26.2",
24
- "svelte-check": "^4.1.7",
25
- "svelte-preprocess": "^5.1.3",
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
28
  "type-fest": "^4.15.0",
30
- "typescript": "^5.6.3",
29
+ "typescript": "5.9.2",
31
30
  "typescript-eslint": "^8.32.0",
32
- "vite": "^5.2.8",
33
- "@threlte/core": "8.1.4",
34
- "@threlte/extras": "9.4.4"
31
+ "vite": "^7.1.4",
32
+ "@threlte/core": "8.3.0",
33
+ "@threlte/extras": "9.7.1"
35
34
  },
36
35
  "peerDependencies": {
37
36
  "@theatre/core": ">=0.6",