diff --git a/package.json b/package.json
index cfff3eb..0e05278 100644
--- a/package.json
+++ b/package.json
@@ -73,6 +73,7 @@
"satellite.js": "^5.0.0",
"tailwind-merge": "^3.0.2",
"tdesign-icons-vue-next": "^0.3.4",
+ "three": "^0.175.0",
"ts-enum-util": "^4.1.0",
"utils4u": "^4.2.1",
"vant": "^4.9.16",
@@ -93,6 +94,7 @@
"@types/mockjs": "^1.0.10",
"@types/node": "^22.13.14",
"@types/nprogress": "^0.2.3",
+ "@types/three": "^0.175.0",
"@unocss/preset-rem-to-px": "^66.0.0",
"@vant/auto-import-resolver": "^1.2.1",
"@vitejs/plugin-vue": "^5.2.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dd4c0be..891bf3a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -115,6 +115,9 @@ importers:
tdesign-icons-vue-next:
specifier: ^0.3.4
version: 0.3.5(vue@3.5.13(typescript@5.8.2))
+ three:
+ specifier: ^0.175.0
+ version: 0.175.0
ts-enum-util:
specifier: ^4.1.0
version: 4.1.0
@@ -170,6 +173,9 @@ importers:
'@types/nprogress':
specifier: ^0.2.3
version: 0.2.3
+ '@types/three':
+ specifier: ^0.175.0
+ version: 0.175.0
'@unocss/preset-rem-to-px':
specifier: ^66.0.0
version: 66.0.0
@@ -1386,6 +1392,9 @@ packages:
'@tsconfig/node22@22.0.1':
resolution: {integrity: sha512-VkgOa3n6jvs1p+r3DiwBqeEwGAwEvnVCg/hIjiANl5IEcqP3G0u5m8cBJspe1t9qjZRlZ7WFgqq5bJrGdgAKMg==}
+ '@tweenjs/tween.js@23.1.3':
+ resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
+
'@tweenjs/tween.js@25.0.0':
resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==}
@@ -1440,6 +1449,12 @@ packages:
'@types/readdir-glob@1.1.5':
resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==}
+ '@types/stats.js@0.17.3':
+ resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
+
+ '@types/three@0.175.0':
+ resolution: {integrity: sha512-ldMSBgtZOZ3g9kJ3kOZSEtZIEITmJOzu8eKVpkhf036GuNkM4mt0NXecrjCn5tMm1OblOF7dZehlaDypBfNokw==}
+
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -1449,6 +1464,9 @@ packages:
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+ '@types/webxr@0.5.21':
+ resolution: {integrity: sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==}
+
'@typescript-eslint/eslint-plugin@8.28.0':
resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2015,6 +2033,9 @@ packages:
peerDependencies:
vue: ^3.5.0
+ '@webgpu/types@0.1.60':
+ resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==}
+
'@zip.js/zip.js@2.7.57':
resolution: {integrity: sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==}
engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
@@ -2912,6 +2933,9 @@ packages:
picomatch:
optional: true
+ fflate@0.8.2:
+ resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
+
figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
@@ -3669,6 +3693,9 @@ packages:
mersenne-twister@1.1.0:
resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==}
+ meshoptimizer@0.18.1:
+ resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
+
meshoptimizer@0.22.0:
resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
@@ -4708,6 +4735,9 @@ packages:
text-decoder@1.2.3:
resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
+ three@0.175.0:
+ resolution: {integrity: sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg==}
+
throttle-debounce@5.0.2:
resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
engines: {node: '>=12.22'}
@@ -6282,6 +6312,8 @@ snapshots:
'@tsconfig/node22@22.0.1': {}
+ '@tweenjs/tween.js@23.1.3': {}
+
'@tweenjs/tween.js@25.0.0': {}
'@tybys/wasm-util@0.9.0':
@@ -6333,6 +6365,17 @@ snapshots:
dependencies:
'@types/node': 22.13.14
+ '@types/stats.js@0.17.3': {}
+
+ '@types/three@0.175.0':
+ dependencies:
+ '@tweenjs/tween.js': 23.1.3
+ '@types/stats.js': 0.17.3
+ '@types/webxr': 0.5.21
+ '@webgpu/types': 0.1.60
+ fflate: 0.8.2
+ meshoptimizer: 0.18.1
+
'@types/trusted-types@2.0.7':
optional: true
@@ -6340,6 +6383,8 @@ snapshots:
'@types/web-bluetooth@0.0.21': {}
+ '@types/webxr@0.5.21': {}
+
'@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
dependencies:
'@eslint-community/regexpp': 4.12.1
@@ -7129,6 +7174,8 @@ snapshots:
dependencies:
vue: 3.5.13(typescript@5.8.2)
+ '@webgpu/types@0.1.60': {}
+
'@zip.js/zip.js@2.7.57': {}
abbrev@2.0.0: {}
@@ -8163,6 +8210,8 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
+ fflate@0.8.2: {}
+
figures@3.2.0:
dependencies:
escape-string-regexp: 1.0.5
@@ -8895,6 +8944,8 @@ snapshots:
mersenne-twister@1.1.0: {}
+ meshoptimizer@0.18.1: {}
+
meshoptimizer@0.22.0: {}
micromatch@4.0.8:
@@ -9971,6 +10022,8 @@ snapshots:
dependencies:
b4a: 1.6.7
+ three@0.175.0: {}
+
throttle-debounce@5.0.2: {}
through@2.3.8: {}
diff --git a/src/pages/UI-components/InspiraUI/BubblesBg.vue b/src/pages/UI-components/InspiraUI/BubblesBg.vue
new file mode 100644
index 0000000..ae7407b
--- /dev/null
+++ b/src/pages/UI-components/InspiraUI/BubblesBg.vue
@@ -0,0 +1,294 @@
+
+
+
+
+
diff --git a/src/pages/UI-components/InspiraUI/CardSpotlight.vue b/src/pages/UI-components/InspiraUI/CardSpotlight.vue
new file mode 100644
index 0000000..42967fe
--- /dev/null
+++ b/src/pages/UI-components/InspiraUI/CardSpotlight.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
diff --git a/src/pages/UI-components/InspiraUI/FallingStarsBg.vue b/src/pages/UI-components/InspiraUI/FallingStarsBg.vue
new file mode 100644
index 0000000..ee9394e
--- /dev/null
+++ b/src/pages/UI-components/InspiraUI/FallingStarsBg.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
diff --git a/src/pages/UI-components/InspiraUI/GradientButton.vue b/src/pages/UI-components/InspiraUI/GradientButton.vue
new file mode 100644
index 0000000..97d338d
--- /dev/null
+++ b/src/pages/UI-components/InspiraUI/GradientButton.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
diff --git a/src/pages/UI-components/InspiraUI/index.page.vue b/src/pages/UI-components/InspiraUI/index.page.vue
new file mode 100644
index 0000000..e4502cd
--- /dev/null
+++ b/src/pages/UI-components/InspiraUI/index.page.vue
@@ -0,0 +1,26 @@
+
+
+
+
+ Zooooooooooom 🚀
+
+
+
+ Card Spotlight
+
+
+
diff --git a/typed-router.d.ts b/typed-router.d.ts
index b0185be..24ed803 100644
--- a/typed-router.d.ts
+++ b/typed-router.d.ts
@@ -37,6 +37,7 @@ declare module 'vue-router/auto-routes' {
'UIComponentsComponents': RouteRecordInfo<'UIComponentsComponents', '/UI-components/Components', Record, Record>,
'UIComponentsInfiniteLoading': RouteRecordInfo<'UIComponentsInfiniteLoading', '/UI-components/infinite-loading', Record, Record>,
'UIComponentsInfiniteLoadingDetail': RouteRecordInfo<'UIComponentsInfiniteLoadingDetail', '/UI-components/infinite-loading/detail', Record, Record>,
+ 'UIComponentsInspiraUI': RouteRecordInfo<'UIComponentsInspiraUI', '/UI-components/InspiraUI', Record, Record>,
'UIComponentsPrimeVue': RouteRecordInfo<'UIComponentsPrimeVue', '/UI-components/PrimeVue', Record, Record>,
'UIComponentsShadcnVue': RouteRecordInfo<'UIComponentsShadcnVue', '/UI-components/ShadcnVue', Record, Record>,
'VueMacrosDefineRender': RouteRecordInfo<'VueMacrosDefineRender', '/VueMacros/DefineRender', Record, Record>,