diff --git a/frontend/src/components/Character3D.vue b/frontend/src/components/Character3D.vue
index 71edb66..47fc904 100644
--- a/frontend/src/components/Character3D.vue
+++ b/frontend/src/components/Character3D.vue
@@ -65,6 +65,10 @@ export default {
type: Boolean,
default: false
}
+ ,lazy: {
+ type: Boolean,
+ default: false
+ }
},
data() {
return {
@@ -83,6 +87,8 @@ export default {
threeLoaders: null,
threeModelRuntime: null
,resizeObserver: null
+ ,intersectionObserver: null
+ ,isVisible: false
};
},
computed: {
@@ -150,11 +156,42 @@ export default {
}
},
async mounted() {
- await this.init3D();
- await this.loadModel();
- // Ensure renderer has correct size if the container became visible after mount
- this.onWindowResize();
- this.animate();
+ const container = this.$refs.container;
+ if (this.lazy && typeof window !== 'undefined' && 'IntersectionObserver' in window && container) {
+ // Defer initialization until the element is in viewport
+ this.intersectionObserver = new window.IntersectionObserver((entries) => {
+ for (const entry of entries) {
+ if (entry.isIntersecting) {
+ this.isVisible = true;
+ // start 3D when visible
+ this.intersectionObserver.disconnect();
+ this.intersectionObserver = null;
+ (async () => {
+ await this.init3D();
+ await this.loadModel();
+ this.onWindowResize();
+ this.animate();
+ })();
+ break;
+ }
+ }
+ }, { threshold: 0.1 });
+ try {
+ this.intersectionObserver.observe(container);
+ } catch (e) {
+ // fallback to immediate init
+ await this.init3D();
+ await this.loadModel();
+ this.onWindowResize();
+ this.animate();
+ }
+ } else {
+ await this.init3D();
+ await this.loadModel();
+ // Ensure renderer has correct size if the container became visible after mount
+ this.onWindowResize();
+ this.animate();
+ }
},
beforeUnmount() {
this.cleanup();
@@ -512,6 +549,12 @@ export default {
} catch (e) {}
this.resizeObserver = null;
}
+ if (this.intersectionObserver) {
+ try {
+ this.intersectionObserver.disconnect();
+ } catch (e) {}
+ this.intersectionObserver = null;
+ }
}
}
};
diff --git a/frontend/src/views/falukant/FamilyView.vue b/frontend/src/views/falukant/FamilyView.vue
index f516681..4ab4af1 100644
--- a/frontend/src/views/falukant/FamilyView.vue
+++ b/frontend/src/views/falukant/FamilyView.vue
@@ -318,6 +318,9 @@
@@ -392,6 +395,9 @@