sa2kit 1.6.66 → 1.6.68
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/dist/festivalCard/index.d.mts +10 -0
- package/dist/festivalCard/index.d.ts +10 -0
- package/dist/festivalCard/index.js +206 -0
- package/dist/festivalCard/index.js.map +1 -0
- package/dist/festivalCard/index.mjs +181 -0
- package/dist/festivalCard/index.mjs.map +1 -0
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +210 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +208 -18
- package/dist/index.mjs.map +1 -1
- package/dist/screenReceiver/core/index.d.mts +10 -2
- package/dist/screenReceiver/core/index.d.ts +10 -2
- package/dist/screenReceiver/core/index.js +15 -0
- package/dist/screenReceiver/core/index.js.map +1 -1
- package/dist/screenReceiver/core/index.mjs +15 -1
- package/dist/screenReceiver/core/index.mjs.map +1 -1
- package/dist/screenReceiver/index.d.mts +1 -1
- package/dist/screenReceiver/index.d.ts +1 -1
- package/dist/screenReceiver/index.js +21 -3
- package/dist/screenReceiver/index.js.map +1 -1
- package/dist/screenReceiver/index.mjs +21 -4
- package/dist/screenReceiver/index.mjs.map +1 -1
- package/dist/screenReceiver/server/index.js +1 -1
- package/dist/screenReceiver/server/index.js.map +1 -1
- package/dist/screenReceiver/server/index.mjs +1 -1
- package/dist/screenReceiver/server/index.mjs.map +1 -1
- package/dist/screenReceiver/server/next.d.mts +9 -0
- package/dist/screenReceiver/server/next.d.ts +9 -0
- package/dist/screenReceiver/server/next.js +178 -0
- package/dist/screenReceiver/server/next.js.map +1 -0
- package/dist/screenReceiver/server/next.mjs +176 -0
- package/dist/screenReceiver/server/next.mjs.map +1 -0
- package/dist/screenReceiver/web/index.d.mts +1 -1
- package/dist/screenReceiver/web/index.d.ts +1 -1
- package/dist/screenReceiver/web/index.js +21 -3
- package/dist/screenReceiver/web/index.js.map +1 -1
- package/dist/screenReceiver/web/index.mjs +21 -4
- package/dist/screenReceiver/web/index.mjs.map +1 -1
- package/package.json +11 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface FestivalCard3DProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const FestivalCard3D: React__default.FC<FestivalCard3DProps>;
|
|
9
|
+
|
|
10
|
+
export { FestivalCard3D, type FestivalCard3DProps };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface FestivalCard3DProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const FestivalCard3D: React__default.FC<FestivalCard3DProps>;
|
|
9
|
+
|
|
10
|
+
export { FestivalCard3D, type FestivalCard3DProps };
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var THREE = require('three');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
27
|
+
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
28
|
+
|
|
29
|
+
// src/festivalCard/components/FestivalCard3D.tsx
|
|
30
|
+
var createSnow = (count) => {
|
|
31
|
+
const positions = new Float32Array(count * 3);
|
|
32
|
+
const speeds = new Float32Array(count);
|
|
33
|
+
for (let i = 0; i < count; i++) {
|
|
34
|
+
const i3 = i * 3;
|
|
35
|
+
positions[i3] = (Math.random() - 0.5) * 16;
|
|
36
|
+
positions[i3 + 1] = Math.random() * 10 + 1;
|
|
37
|
+
positions[i3 + 2] = (Math.random() - 0.5) * 16;
|
|
38
|
+
speeds[i] = 4e-3 + Math.random() * 0.01;
|
|
39
|
+
}
|
|
40
|
+
return { positions, speeds };
|
|
41
|
+
};
|
|
42
|
+
var FestivalCard3D = ({
|
|
43
|
+
title = "Happy Holidays",
|
|
44
|
+
subtitle = "Wishing you joy and peace",
|
|
45
|
+
className
|
|
46
|
+
}) => {
|
|
47
|
+
const mountRef = React.useRef(null);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
const mount = mountRef.current;
|
|
50
|
+
if (!mount) return;
|
|
51
|
+
const scene = new THREE__namespace.Scene();
|
|
52
|
+
scene.fog = new THREE__namespace.Fog(528934, 12, 28);
|
|
53
|
+
const camera = new THREE__namespace.PerspectiveCamera(50, mount.clientWidth / mount.clientHeight, 0.1, 100);
|
|
54
|
+
camera.position.set(0, 2.6, 7.5);
|
|
55
|
+
const renderer = new THREE__namespace.WebGLRenderer({ antialias: true, alpha: true });
|
|
56
|
+
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
|
|
57
|
+
renderer.setSize(mount.clientWidth, mount.clientHeight);
|
|
58
|
+
renderer.outputColorSpace = THREE__namespace.SRGBColorSpace;
|
|
59
|
+
mount.appendChild(renderer.domElement);
|
|
60
|
+
const ambientLight = new THREE__namespace.AmbientLight(9090303, 0.8);
|
|
61
|
+
scene.add(ambientLight);
|
|
62
|
+
const keyLight = new THREE__namespace.DirectionalLight(16777215, 1.25);
|
|
63
|
+
keyLight.position.set(2, 5, 4);
|
|
64
|
+
scene.add(keyLight);
|
|
65
|
+
const fillLight = new THREE__namespace.PointLight(8050687, 0.9, 24);
|
|
66
|
+
fillLight.position.set(-4, 3, -2);
|
|
67
|
+
scene.add(fillLight);
|
|
68
|
+
const floor = new THREE__namespace.Mesh(
|
|
69
|
+
new THREE__namespace.CircleGeometry(12, 48),
|
|
70
|
+
new THREE__namespace.MeshStandardMaterial({ color: 1056826, roughness: 0.95, metalness: 0.05 })
|
|
71
|
+
);
|
|
72
|
+
floor.rotation.x = -Math.PI / 2;
|
|
73
|
+
floor.position.y = -1.2;
|
|
74
|
+
scene.add(floor);
|
|
75
|
+
const giftGroup = new THREE__namespace.Group();
|
|
76
|
+
scene.add(giftGroup);
|
|
77
|
+
const box = new THREE__namespace.Mesh(
|
|
78
|
+
new THREE__namespace.BoxGeometry(2, 1.6, 2),
|
|
79
|
+
new THREE__namespace.MeshStandardMaterial({ color: 14238053, roughness: 0.55, metalness: 0.2 })
|
|
80
|
+
);
|
|
81
|
+
giftGroup.add(box);
|
|
82
|
+
const ribbonMaterial = new THREE__namespace.MeshStandardMaterial({ color: 16767354, roughness: 0.3, metalness: 0.5 });
|
|
83
|
+
const verticalRibbon = new THREE__namespace.Mesh(new THREE__namespace.BoxGeometry(0.24, 1.7, 2.02), ribbonMaterial);
|
|
84
|
+
const horizontalRibbon = new THREE__namespace.Mesh(new THREE__namespace.BoxGeometry(2.02, 1.7, 0.24), ribbonMaterial);
|
|
85
|
+
giftGroup.add(verticalRibbon);
|
|
86
|
+
giftGroup.add(horizontalRibbon);
|
|
87
|
+
const lid = new THREE__namespace.Mesh(
|
|
88
|
+
new THREE__namespace.BoxGeometry(2.15, 0.34, 2.15),
|
|
89
|
+
new THREE__namespace.MeshStandardMaterial({ color: 13448278, roughness: 0.52, metalness: 0.2 })
|
|
90
|
+
);
|
|
91
|
+
lid.position.y = 0.98;
|
|
92
|
+
giftGroup.add(lid);
|
|
93
|
+
const bowLeft = new THREE__namespace.Mesh(new THREE__namespace.TorusGeometry(0.26, 0.08, 12, 32), ribbonMaterial);
|
|
94
|
+
bowLeft.rotation.set(Math.PI / 2, Math.PI / 6, 0);
|
|
95
|
+
bowLeft.position.set(-0.22, 1.14, 0);
|
|
96
|
+
const bowRight = bowLeft.clone();
|
|
97
|
+
bowRight.rotation.y = -Math.PI / 6;
|
|
98
|
+
bowRight.position.x = 0.22;
|
|
99
|
+
giftGroup.add(bowLeft, bowRight);
|
|
100
|
+
giftGroup.position.y = -0.15;
|
|
101
|
+
const { positions, speeds } = createSnow(260);
|
|
102
|
+
const snowGeometry = new THREE__namespace.BufferGeometry();
|
|
103
|
+
snowGeometry.setAttribute("position", new THREE__namespace.BufferAttribute(positions, 3));
|
|
104
|
+
const snow = new THREE__namespace.Points(
|
|
105
|
+
snowGeometry,
|
|
106
|
+
new THREE__namespace.PointsMaterial({
|
|
107
|
+
color: 15267071,
|
|
108
|
+
size: 0.08,
|
|
109
|
+
transparent: true,
|
|
110
|
+
opacity: 0.92,
|
|
111
|
+
depthWrite: false
|
|
112
|
+
})
|
|
113
|
+
);
|
|
114
|
+
scene.add(snow);
|
|
115
|
+
let rafId = 0;
|
|
116
|
+
const clock = new THREE__namespace.Clock();
|
|
117
|
+
const animate = () => {
|
|
118
|
+
const elapsed = clock.getElapsedTime();
|
|
119
|
+
const pos = snowGeometry.attributes.position;
|
|
120
|
+
for (let i = 0; i < pos.count; i++) {
|
|
121
|
+
const speed = speeds[i] ?? 0.01;
|
|
122
|
+
const y = pos.getY(i) - speed;
|
|
123
|
+
pos.setY(i, y < -1.1 ? 10 + Math.random() * 2 : y);
|
|
124
|
+
pos.setX(i, pos.getX(i) + Math.sin(elapsed + i * 0.04) * 16e-4);
|
|
125
|
+
}
|
|
126
|
+
pos.needsUpdate = true;
|
|
127
|
+
giftGroup.rotation.y = elapsed * 0.35;
|
|
128
|
+
giftGroup.position.y = -0.15 + Math.sin(elapsed * 1.4) * 0.08;
|
|
129
|
+
lid.position.y = 0.98 + Math.sin(elapsed * 2.2) * 0.08;
|
|
130
|
+
renderer.render(scene, camera);
|
|
131
|
+
rafId = window.requestAnimationFrame(animate);
|
|
132
|
+
};
|
|
133
|
+
const handleResize = () => {
|
|
134
|
+
if (!mount) return;
|
|
135
|
+
const width = mount.clientWidth;
|
|
136
|
+
const height = mount.clientHeight;
|
|
137
|
+
camera.aspect = width / height;
|
|
138
|
+
camera.updateProjectionMatrix();
|
|
139
|
+
renderer.setSize(width, height);
|
|
140
|
+
};
|
|
141
|
+
window.addEventListener("resize", handleResize);
|
|
142
|
+
animate();
|
|
143
|
+
return () => {
|
|
144
|
+
window.cancelAnimationFrame(rafId);
|
|
145
|
+
window.removeEventListener("resize", handleResize);
|
|
146
|
+
scene.traverse((obj) => {
|
|
147
|
+
const mesh = obj;
|
|
148
|
+
if (mesh.geometry) mesh.geometry.dispose();
|
|
149
|
+
const material = mesh.material;
|
|
150
|
+
if (Array.isArray(material)) material.forEach((m) => m.dispose());
|
|
151
|
+
else material?.dispose();
|
|
152
|
+
});
|
|
153
|
+
renderer.dispose();
|
|
154
|
+
mount.removeChild(renderer.domElement);
|
|
155
|
+
};
|
|
156
|
+
}, []);
|
|
157
|
+
return /* @__PURE__ */ React__default.default.createElement(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
className,
|
|
161
|
+
style: {
|
|
162
|
+
position: "relative",
|
|
163
|
+
width: "100%",
|
|
164
|
+
minHeight: 420,
|
|
165
|
+
borderRadius: 20,
|
|
166
|
+
overflow: "hidden",
|
|
167
|
+
background: "radial-gradient(circle at 20% 20%, #244d8c 0%, #0c1a34 45%, #060d1f 100%)"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
/* @__PURE__ */ React__default.default.createElement("div", { ref: mountRef, style: { position: "absolute", inset: 0 } }),
|
|
171
|
+
/* @__PURE__ */ React__default.default.createElement(
|
|
172
|
+
"div",
|
|
173
|
+
{
|
|
174
|
+
style: {
|
|
175
|
+
position: "absolute",
|
|
176
|
+
inset: 0,
|
|
177
|
+
pointerEvents: "none",
|
|
178
|
+
background: "linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0.04) 35%, rgba(4,8,20,0.36) 100%)"
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ React__default.default.createElement(
|
|
183
|
+
"div",
|
|
184
|
+
{
|
|
185
|
+
style: {
|
|
186
|
+
position: "absolute",
|
|
187
|
+
left: 20,
|
|
188
|
+
right: 20,
|
|
189
|
+
bottom: 20,
|
|
190
|
+
zIndex: 2,
|
|
191
|
+
padding: "16px 18px",
|
|
192
|
+
borderRadius: 14,
|
|
193
|
+
backgroundColor: "rgba(8, 16, 35, 0.66)",
|
|
194
|
+
border: "1px solid rgba(255, 255, 255, 0.16)",
|
|
195
|
+
color: "#f8fafc"
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
/* @__PURE__ */ React__default.default.createElement("div", { style: { fontSize: 26, fontWeight: 700, lineHeight: 1.2 } }, title),
|
|
199
|
+
/* @__PURE__ */ React__default.default.createElement("div", { style: { marginTop: 6, fontSize: 15, opacity: 0.92 } }, subtitle)
|
|
200
|
+
)
|
|
201
|
+
);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
exports.FestivalCard3D = FestivalCard3D;
|
|
205
|
+
//# sourceMappingURL=index.js.map
|
|
206
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/festivalCard/components/FestivalCard3D.tsx"],"names":["useRef","useEffect","THREE","React"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport React, { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\n\nexport interface FestivalCard3DProps {\n title?: string;\n subtitle?: string;\n className?: string;\n}\n\nconst createSnow = (count: number) => {\n const positions = new Float32Array(count * 3);\n const speeds = new Float32Array(count);\n\n for (let i = 0; i < count; i++) {\n const i3 = i * 3;\n positions[i3] = (Math.random() - 0.5) * 16;\n positions[i3 + 1] = Math.random() * 10 + 1;\n positions[i3 + 2] = (Math.random() - 0.5) * 16;\n speeds[i] = 0.004 + Math.random() * 0.01;\n }\n\n return { positions, speeds };\n};\n\nexport const FestivalCard3D: React.FC<FestivalCard3DProps> = ({\n title = 'Happy Holidays',\n subtitle = 'Wishing you joy and peace',\n className,\n}) => {\n const mountRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const mount = mountRef.current;\n if (!mount) return;\n\n const scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0x081226, 12, 28);\n\n const camera = new THREE.PerspectiveCamera(50, mount.clientWidth / mount.clientHeight, 0.1, 100);\n camera.position.set(0, 2.6, 7.5);\n\n const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.setSize(mount.clientWidth, mount.clientHeight);\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n mount.appendChild(renderer.domElement);\n\n const ambientLight = new THREE.AmbientLight(0x8ab4ff, 0.8);\n scene.add(ambientLight);\n\n const keyLight = new THREE.DirectionalLight(0xffffff, 1.25);\n keyLight.position.set(2, 5, 4);\n scene.add(keyLight);\n\n const fillLight = new THREE.PointLight(0x7ad7ff, 0.9, 24);\n fillLight.position.set(-4, 3, -2);\n scene.add(fillLight);\n\n const floor = new THREE.Mesh(\n new THREE.CircleGeometry(12, 48),\n new THREE.MeshStandardMaterial({ color: 0x10203a, roughness: 0.95, metalness: 0.05 })\n );\n floor.rotation.x = -Math.PI / 2;\n floor.position.y = -1.2;\n scene.add(floor);\n\n const giftGroup = new THREE.Group();\n scene.add(giftGroup);\n\n const box = new THREE.Mesh(\n new THREE.BoxGeometry(2, 1.6, 2),\n new THREE.MeshStandardMaterial({ color: 0xd94165, roughness: 0.55, metalness: 0.2 })\n );\n giftGroup.add(box);\n\n const ribbonMaterial = new THREE.MeshStandardMaterial({ color: 0xffd97a, roughness: 0.3, metalness: 0.5 });\n const verticalRibbon = new THREE.Mesh(new THREE.BoxGeometry(0.24, 1.7, 2.02), ribbonMaterial);\n const horizontalRibbon = new THREE.Mesh(new THREE.BoxGeometry(2.02, 1.7, 0.24), ribbonMaterial);\n giftGroup.add(verticalRibbon);\n giftGroup.add(horizontalRibbon);\n\n const lid = new THREE.Mesh(\n new THREE.BoxGeometry(2.15, 0.34, 2.15),\n new THREE.MeshStandardMaterial({ color: 0xcd3456, roughness: 0.52, metalness: 0.2 })\n );\n lid.position.y = 0.98;\n giftGroup.add(lid);\n\n const bowLeft = new THREE.Mesh(new THREE.TorusGeometry(0.26, 0.08, 12, 32), ribbonMaterial);\n bowLeft.rotation.set(Math.PI / 2, Math.PI / 6, 0);\n bowLeft.position.set(-0.22, 1.14, 0);\n const bowRight = bowLeft.clone();\n bowRight.rotation.y = -Math.PI / 6;\n bowRight.position.x = 0.22;\n giftGroup.add(bowLeft, bowRight);\n\n giftGroup.position.y = -0.15;\n\n const { positions, speeds } = createSnow(260);\n const snowGeometry = new THREE.BufferGeometry();\n snowGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n const snow = new THREE.Points(\n snowGeometry,\n new THREE.PointsMaterial({\n color: 0xe8f4ff,\n size: 0.08,\n transparent: true,\n opacity: 0.92,\n depthWrite: false,\n })\n );\n scene.add(snow);\n\n let rafId = 0;\n const clock = new THREE.Clock();\n\n const animate = () => {\n const elapsed = clock.getElapsedTime();\n const pos = snowGeometry.attributes.position as THREE.BufferAttribute;\n\n for (let i = 0; i < pos.count; i++) {\n const speed = speeds[i] ?? 0.01;\n const y = pos.getY(i) - speed;\n pos.setY(i, y < -1.1 ? 10 + Math.random() * 2 : y);\n pos.setX(i, pos.getX(i) + Math.sin(elapsed + i * 0.04) * 0.0016);\n }\n pos.needsUpdate = true;\n\n giftGroup.rotation.y = elapsed * 0.35;\n giftGroup.position.y = -0.15 + Math.sin(elapsed * 1.4) * 0.08;\n lid.position.y = 0.98 + Math.sin(elapsed * 2.2) * 0.08;\n\n renderer.render(scene, camera);\n rafId = window.requestAnimationFrame(animate);\n };\n\n const handleResize = () => {\n if (!mount) return;\n const width = mount.clientWidth;\n const height = mount.clientHeight;\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height);\n };\n\n window.addEventListener('resize', handleResize);\n animate();\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.removeEventListener('resize', handleResize);\n\n scene.traverse((obj) => {\n const mesh = obj as THREE.Mesh;\n if (mesh.geometry) mesh.geometry.dispose();\n const material = mesh.material as THREE.Material | THREE.Material[] | undefined;\n if (Array.isArray(material)) material.forEach((m) => m.dispose());\n else material?.dispose();\n });\n\n renderer.dispose();\n mount.removeChild(renderer.domElement);\n };\n }, []);\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n width: '100%',\n minHeight: 420,\n borderRadius: 20,\n overflow: 'hidden',\n background: 'radial-gradient(circle at 20% 20%, #244d8c 0%, #0c1a34 45%, #060d1f 100%)',\n }}\n >\n <div ref={mountRef} style={{ position: 'absolute', inset: 0 }} />\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n background:\n 'linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0.04) 35%, rgba(4,8,20,0.36) 100%)',\n }}\n />\n <div\n style={{\n position: 'absolute',\n left: 20,\n right: 20,\n bottom: 20,\n zIndex: 2,\n padding: '16px 18px',\n borderRadius: 14,\n backgroundColor: 'rgba(8, 16, 35, 0.66)',\n border: '1px solid rgba(255, 255, 255, 0.16)',\n color: '#f8fafc',\n }}\n >\n <div style={{ fontSize: 26, fontWeight: 700, lineHeight: 1.2 }}>{title}</div>\n <div style={{ marginTop: 6, fontSize: 15, opacity: 0.92 }}>{subtitle}</div>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import React, { useRef, useEffect } from 'react';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
|
|
4
|
+
// src/festivalCard/components/FestivalCard3D.tsx
|
|
5
|
+
var createSnow = (count) => {
|
|
6
|
+
const positions = new Float32Array(count * 3);
|
|
7
|
+
const speeds = new Float32Array(count);
|
|
8
|
+
for (let i = 0; i < count; i++) {
|
|
9
|
+
const i3 = i * 3;
|
|
10
|
+
positions[i3] = (Math.random() - 0.5) * 16;
|
|
11
|
+
positions[i3 + 1] = Math.random() * 10 + 1;
|
|
12
|
+
positions[i3 + 2] = (Math.random() - 0.5) * 16;
|
|
13
|
+
speeds[i] = 4e-3 + Math.random() * 0.01;
|
|
14
|
+
}
|
|
15
|
+
return { positions, speeds };
|
|
16
|
+
};
|
|
17
|
+
var FestivalCard3D = ({
|
|
18
|
+
title = "Happy Holidays",
|
|
19
|
+
subtitle = "Wishing you joy and peace",
|
|
20
|
+
className
|
|
21
|
+
}) => {
|
|
22
|
+
const mountRef = useRef(null);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const mount = mountRef.current;
|
|
25
|
+
if (!mount) return;
|
|
26
|
+
const scene = new THREE.Scene();
|
|
27
|
+
scene.fog = new THREE.Fog(528934, 12, 28);
|
|
28
|
+
const camera = new THREE.PerspectiveCamera(50, mount.clientWidth / mount.clientHeight, 0.1, 100);
|
|
29
|
+
camera.position.set(0, 2.6, 7.5);
|
|
30
|
+
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
|
|
31
|
+
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
|
|
32
|
+
renderer.setSize(mount.clientWidth, mount.clientHeight);
|
|
33
|
+
renderer.outputColorSpace = THREE.SRGBColorSpace;
|
|
34
|
+
mount.appendChild(renderer.domElement);
|
|
35
|
+
const ambientLight = new THREE.AmbientLight(9090303, 0.8);
|
|
36
|
+
scene.add(ambientLight);
|
|
37
|
+
const keyLight = new THREE.DirectionalLight(16777215, 1.25);
|
|
38
|
+
keyLight.position.set(2, 5, 4);
|
|
39
|
+
scene.add(keyLight);
|
|
40
|
+
const fillLight = new THREE.PointLight(8050687, 0.9, 24);
|
|
41
|
+
fillLight.position.set(-4, 3, -2);
|
|
42
|
+
scene.add(fillLight);
|
|
43
|
+
const floor = new THREE.Mesh(
|
|
44
|
+
new THREE.CircleGeometry(12, 48),
|
|
45
|
+
new THREE.MeshStandardMaterial({ color: 1056826, roughness: 0.95, metalness: 0.05 })
|
|
46
|
+
);
|
|
47
|
+
floor.rotation.x = -Math.PI / 2;
|
|
48
|
+
floor.position.y = -1.2;
|
|
49
|
+
scene.add(floor);
|
|
50
|
+
const giftGroup = new THREE.Group();
|
|
51
|
+
scene.add(giftGroup);
|
|
52
|
+
const box = new THREE.Mesh(
|
|
53
|
+
new THREE.BoxGeometry(2, 1.6, 2),
|
|
54
|
+
new THREE.MeshStandardMaterial({ color: 14238053, roughness: 0.55, metalness: 0.2 })
|
|
55
|
+
);
|
|
56
|
+
giftGroup.add(box);
|
|
57
|
+
const ribbonMaterial = new THREE.MeshStandardMaterial({ color: 16767354, roughness: 0.3, metalness: 0.5 });
|
|
58
|
+
const verticalRibbon = new THREE.Mesh(new THREE.BoxGeometry(0.24, 1.7, 2.02), ribbonMaterial);
|
|
59
|
+
const horizontalRibbon = new THREE.Mesh(new THREE.BoxGeometry(2.02, 1.7, 0.24), ribbonMaterial);
|
|
60
|
+
giftGroup.add(verticalRibbon);
|
|
61
|
+
giftGroup.add(horizontalRibbon);
|
|
62
|
+
const lid = new THREE.Mesh(
|
|
63
|
+
new THREE.BoxGeometry(2.15, 0.34, 2.15),
|
|
64
|
+
new THREE.MeshStandardMaterial({ color: 13448278, roughness: 0.52, metalness: 0.2 })
|
|
65
|
+
);
|
|
66
|
+
lid.position.y = 0.98;
|
|
67
|
+
giftGroup.add(lid);
|
|
68
|
+
const bowLeft = new THREE.Mesh(new THREE.TorusGeometry(0.26, 0.08, 12, 32), ribbonMaterial);
|
|
69
|
+
bowLeft.rotation.set(Math.PI / 2, Math.PI / 6, 0);
|
|
70
|
+
bowLeft.position.set(-0.22, 1.14, 0);
|
|
71
|
+
const bowRight = bowLeft.clone();
|
|
72
|
+
bowRight.rotation.y = -Math.PI / 6;
|
|
73
|
+
bowRight.position.x = 0.22;
|
|
74
|
+
giftGroup.add(bowLeft, bowRight);
|
|
75
|
+
giftGroup.position.y = -0.15;
|
|
76
|
+
const { positions, speeds } = createSnow(260);
|
|
77
|
+
const snowGeometry = new THREE.BufferGeometry();
|
|
78
|
+
snowGeometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
|
|
79
|
+
const snow = new THREE.Points(
|
|
80
|
+
snowGeometry,
|
|
81
|
+
new THREE.PointsMaterial({
|
|
82
|
+
color: 15267071,
|
|
83
|
+
size: 0.08,
|
|
84
|
+
transparent: true,
|
|
85
|
+
opacity: 0.92,
|
|
86
|
+
depthWrite: false
|
|
87
|
+
})
|
|
88
|
+
);
|
|
89
|
+
scene.add(snow);
|
|
90
|
+
let rafId = 0;
|
|
91
|
+
const clock = new THREE.Clock();
|
|
92
|
+
const animate = () => {
|
|
93
|
+
const elapsed = clock.getElapsedTime();
|
|
94
|
+
const pos = snowGeometry.attributes.position;
|
|
95
|
+
for (let i = 0; i < pos.count; i++) {
|
|
96
|
+
const speed = speeds[i] ?? 0.01;
|
|
97
|
+
const y = pos.getY(i) - speed;
|
|
98
|
+
pos.setY(i, y < -1.1 ? 10 + Math.random() * 2 : y);
|
|
99
|
+
pos.setX(i, pos.getX(i) + Math.sin(elapsed + i * 0.04) * 16e-4);
|
|
100
|
+
}
|
|
101
|
+
pos.needsUpdate = true;
|
|
102
|
+
giftGroup.rotation.y = elapsed * 0.35;
|
|
103
|
+
giftGroup.position.y = -0.15 + Math.sin(elapsed * 1.4) * 0.08;
|
|
104
|
+
lid.position.y = 0.98 + Math.sin(elapsed * 2.2) * 0.08;
|
|
105
|
+
renderer.render(scene, camera);
|
|
106
|
+
rafId = window.requestAnimationFrame(animate);
|
|
107
|
+
};
|
|
108
|
+
const handleResize = () => {
|
|
109
|
+
if (!mount) return;
|
|
110
|
+
const width = mount.clientWidth;
|
|
111
|
+
const height = mount.clientHeight;
|
|
112
|
+
camera.aspect = width / height;
|
|
113
|
+
camera.updateProjectionMatrix();
|
|
114
|
+
renderer.setSize(width, height);
|
|
115
|
+
};
|
|
116
|
+
window.addEventListener("resize", handleResize);
|
|
117
|
+
animate();
|
|
118
|
+
return () => {
|
|
119
|
+
window.cancelAnimationFrame(rafId);
|
|
120
|
+
window.removeEventListener("resize", handleResize);
|
|
121
|
+
scene.traverse((obj) => {
|
|
122
|
+
const mesh = obj;
|
|
123
|
+
if (mesh.geometry) mesh.geometry.dispose();
|
|
124
|
+
const material = mesh.material;
|
|
125
|
+
if (Array.isArray(material)) material.forEach((m) => m.dispose());
|
|
126
|
+
else material?.dispose();
|
|
127
|
+
});
|
|
128
|
+
renderer.dispose();
|
|
129
|
+
mount.removeChild(renderer.domElement);
|
|
130
|
+
};
|
|
131
|
+
}, []);
|
|
132
|
+
return /* @__PURE__ */ React.createElement(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
className,
|
|
136
|
+
style: {
|
|
137
|
+
position: "relative",
|
|
138
|
+
width: "100%",
|
|
139
|
+
minHeight: 420,
|
|
140
|
+
borderRadius: 20,
|
|
141
|
+
overflow: "hidden",
|
|
142
|
+
background: "radial-gradient(circle at 20% 20%, #244d8c 0%, #0c1a34 45%, #060d1f 100%)"
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
/* @__PURE__ */ React.createElement("div", { ref: mountRef, style: { position: "absolute", inset: 0 } }),
|
|
146
|
+
/* @__PURE__ */ React.createElement(
|
|
147
|
+
"div",
|
|
148
|
+
{
|
|
149
|
+
style: {
|
|
150
|
+
position: "absolute",
|
|
151
|
+
inset: 0,
|
|
152
|
+
pointerEvents: "none",
|
|
153
|
+
background: "linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0.04) 35%, rgba(4,8,20,0.36) 100%)"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
/* @__PURE__ */ React.createElement(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
style: {
|
|
161
|
+
position: "absolute",
|
|
162
|
+
left: 20,
|
|
163
|
+
right: 20,
|
|
164
|
+
bottom: 20,
|
|
165
|
+
zIndex: 2,
|
|
166
|
+
padding: "16px 18px",
|
|
167
|
+
borderRadius: 14,
|
|
168
|
+
backgroundColor: "rgba(8, 16, 35, 0.66)",
|
|
169
|
+
border: "1px solid rgba(255, 255, 255, 0.16)",
|
|
170
|
+
color: "#f8fafc"
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
/* @__PURE__ */ React.createElement("div", { style: { fontSize: 26, fontWeight: 700, lineHeight: 1.2 } }, title),
|
|
174
|
+
/* @__PURE__ */ React.createElement("div", { style: { marginTop: 6, fontSize: 15, opacity: 0.92 } }, subtitle)
|
|
175
|
+
)
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export { FestivalCard3D };
|
|
180
|
+
//# sourceMappingURL=index.mjs.map
|
|
181
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/festivalCard/components/FestivalCard3D.tsx"],"names":[],"mappings":";;;;AAWA,IAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AACpC,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,KAAK,CAAA;AAErC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,IAAA,SAAA,CAAU,EAAE,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,EAAA;AACxC,IAAA,SAAA,CAAU,KAAK,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA,KAAW,EAAA,GAAK,CAAA;AACzC,IAAA,SAAA,CAAU,KAAK,CAAC,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,EAAA;AAC5C,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,QAAO,GAAI,IAAA;AAAA,EACtC;AAEA,EAAA,OAAO,EAAE,WAAW,MAAA,EAAO;AAC7B,CAAA;AAEO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,KAAA,GAAQ,gBAAA;AAAA,EACR,QAAA,GAAW,2BAAA;AAAA,EACX;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,OAA8B,IAAI,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,KAAA,GAAQ,IAAU,KAAA,CAAA,KAAA,EAAM;AAC9B,IAAA,KAAA,CAAM,GAAA,GAAM,IAAU,KAAA,CAAA,GAAA,CAAI,MAAA,EAAU,IAAI,EAAE,CAAA;AAE1C,IAAA,MAAM,MAAA,GAAS,IAAU,KAAA,CAAA,iBAAA,CAAkB,EAAA,EAAI,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,EAAc,GAAA,EAAK,GAAG,CAAA;AAC/F,IAAA,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAE/B,IAAA,MAAM,QAAA,GAAW,IAAU,KAAA,CAAA,aAAA,CAAc,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACzE,IAAA,QAAA,CAAS,cAAc,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,CAAC,CAAC,CAAA;AAC3D,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,YAAY,CAAA;AACtD,IAAA,QAAA,CAAS,gBAAA,GAAyB,KAAA,CAAA,cAAA;AAClC,IAAA,KAAA,CAAM,WAAA,CAAY,SAAS,UAAU,CAAA;AAErC,IAAA,MAAM,YAAA,GAAe,IAAU,KAAA,CAAA,YAAA,CAAa,OAAA,EAAU,GAAG,CAAA;AACzD,IAAA,KAAA,CAAM,IAAI,YAAY,CAAA;AAEtB,IAAA,MAAM,QAAA,GAAW,IAAU,KAAA,CAAA,gBAAA,CAAiB,QAAA,EAAU,IAAI,CAAA;AAC1D,IAAA,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC7B,IAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAElB,IAAA,MAAM,SAAA,GAAY,IAAU,KAAA,CAAA,UAAA,CAAW,OAAA,EAAU,KAAK,EAAE,CAAA;AACxD,IAAA,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA;AAChC,IAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AAEnB,IAAA,MAAM,QAAQ,IAAU,KAAA,CAAA,IAAA;AAAA,MACtB,IAAU,KAAA,CAAA,cAAA,CAAe,EAAA,EAAI,EAAE,CAAA;AAAA,MAC/B,IAAU,2BAAqB,EAAE,KAAA,EAAO,SAAU,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM;AAAA,KACtF;AACA,IAAA,KAAA,CAAM,QAAA,CAAS,CAAA,GAAI,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA;AAC9B,IAAA,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AACnB,IAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AAEf,IAAA,MAAM,SAAA,GAAY,IAAU,KAAA,CAAA,KAAA,EAAM;AAClC,IAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AAEnB,IAAA,MAAM,MAAM,IAAU,KAAA,CAAA,IAAA;AAAA,MACpB,IAAU,KAAA,CAAA,WAAA,CAAY,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAA,MAC/B,IAAU,2BAAqB,EAAE,KAAA,EAAO,UAAU,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK;AAAA,KACrF;AACA,IAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AAEjB,IAAA,MAAM,cAAA,GAAiB,IAAU,KAAA,CAAA,oBAAA,CAAqB,EAAE,KAAA,EAAO,UAAU,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,CAAA;AACzG,IAAA,MAAM,cAAA,GAAiB,IAAU,KAAA,CAAA,IAAA,CAAK,IAAU,kBAAY,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA,EAAG,cAAc,CAAA;AAC5F,IAAA,MAAM,gBAAA,GAAmB,IAAU,KAAA,CAAA,IAAA,CAAK,IAAU,kBAAY,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA,EAAG,cAAc,CAAA;AAC9F,IAAA,SAAA,CAAU,IAAI,cAAc,CAAA;AAC5B,IAAA,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAE9B,IAAA,MAAM,MAAM,IAAU,KAAA,CAAA,IAAA;AAAA,MACpB,IAAU,KAAA,CAAA,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,MACtC,IAAU,2BAAqB,EAAE,KAAA,EAAO,UAAU,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK;AAAA,KACrF;AACA,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AACjB,IAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AAEjB,IAAA,MAAM,OAAA,GAAU,IAAU,KAAA,CAAA,IAAA,CAAK,IAAU,KAAA,CAAA,aAAA,CAAc,MAAM,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA,EAAG,cAAc,CAAA;AAC1F,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,GAAK,GAAG,IAAA,CAAK,EAAA,GAAK,GAAG,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,EAAM;AAC/B,IAAA,QAAA,CAAS,QAAA,CAAS,CAAA,GAAI,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA;AACjC,IAAA,QAAA,CAAS,SAAS,CAAA,GAAI,IAAA;AACtB,IAAA,SAAA,CAAU,GAAA,CAAI,SAAS,QAAQ,CAAA;AAE/B,IAAA,SAAA,CAAU,SAAS,CAAA,GAAI,KAAA;AAEvB,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,WAAW,GAAG,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAU,KAAA,CAAA,cAAA,EAAe;AAC9C,IAAA,YAAA,CAAa,aAAa,UAAA,EAAY,IAAU,KAAA,CAAA,eAAA,CAAgB,SAAA,EAAW,CAAC,CAAC,CAAA;AAE7E,IAAA,MAAM,OAAO,IAAU,KAAA,CAAA,MAAA;AAAA,MACrB,YAAA;AAAA,MACA,IAAU,KAAA,CAAA,cAAA,CAAe;AAAA,QACvB,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,IAAA;AAAA,QACN,WAAA,EAAa,IAAA;AAAA,QACb,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb;AAAA,KACH;AACA,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAEd,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,KAAA,GAAQ,IAAU,KAAA,CAAA,KAAA,EAAM;AAE9B,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,EAAe;AACrC,MAAA,MAAM,GAAA,GAAM,aAAa,UAAA,CAAW,QAAA;AAEpC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAO,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAC3B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAI,KAAA;AACxB,QAAA,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,GAAO,KAAK,IAAA,CAAK,MAAA,EAAO,GAAI,CAAA,GAAI,CAAC,CAAA;AACjD,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,CAAA,GAAI,IAAI,CAAA,GAAI,KAAM,CAAA;AAAA,MACjE;AACA,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAElB,MAAA,SAAA,CAAU,QAAA,CAAS,IAAI,OAAA,GAAU,IAAA;AACjC,MAAA,SAAA,CAAU,SAAS,CAAA,GAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,GAAI,IAAA;AACzD,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,GAAO,KAAK,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,GAAI,IAAA;AAElD,MAAA,QAAA,CAAS,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B,MAAA,KAAA,GAAQ,MAAA,CAAO,sBAAsB,OAAO,CAAA;AAAA,IAC9C,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,QAAQ,KAAA,CAAM,WAAA;AACpB,MAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,MAAA,MAAA,CAAO,SAAS,KAAA,GAAQ,MAAA;AACxB,MAAA,MAAA,CAAO,sBAAA,EAAuB;AAC9B,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IAChC,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,qBAAqB,KAAK,CAAA;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAEjD,MAAA,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAQ;AACtB,QAAA,MAAM,IAAA,GAAO,GAAA;AACb,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AACzC,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,uBACjD,OAAA,EAAQ;AAAA,MACzB,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,MAAA,KAAA,CAAM,WAAA,CAAY,SAAS,UAAU,CAAA;AAAA,IACvC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,SAAA,EAAW,GAAA;AAAA,QACX,YAAA,EAAc,EAAA;AAAA,QACd,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY;AAAA;AACd,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAE,EAAG,CAAA;AAAA,oBAC/D,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,aAAA,EAAe,MAAA;AAAA,UACf,UAAA,EACE;AAAA;AACJ;AAAA,KACF;AAAA,oBACA,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,MAAA,EAAQ,CAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,YAAA,EAAc,EAAA;AAAA,UACd,eAAA,EAAiB,uBAAA;AAAA,UACjB,MAAA,EAAQ,qCAAA;AAAA,UACR,KAAA,EAAO;AAAA;AACT,OAAA;AAAA,sBAEA,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,UAAA,EAAY,GAAA,EAAI,EAAA,EAAI,KAAM,CAAA;AAAA,sBACvE,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,QAAA,EAAU,EAAA,EAAI,OAAA,EAAS,IAAA,EAAK,EAAA,EAAI,QAAS;AAAA;AACvE,GACF;AAEJ","file":"index.mjs","sourcesContent":["'use client';\n\nimport React, { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\n\nexport interface FestivalCard3DProps {\n title?: string;\n subtitle?: string;\n className?: string;\n}\n\nconst createSnow = (count: number) => {\n const positions = new Float32Array(count * 3);\n const speeds = new Float32Array(count);\n\n for (let i = 0; i < count; i++) {\n const i3 = i * 3;\n positions[i3] = (Math.random() - 0.5) * 16;\n positions[i3 + 1] = Math.random() * 10 + 1;\n positions[i3 + 2] = (Math.random() - 0.5) * 16;\n speeds[i] = 0.004 + Math.random() * 0.01;\n }\n\n return { positions, speeds };\n};\n\nexport const FestivalCard3D: React.FC<FestivalCard3DProps> = ({\n title = 'Happy Holidays',\n subtitle = 'Wishing you joy and peace',\n className,\n}) => {\n const mountRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const mount = mountRef.current;\n if (!mount) return;\n\n const scene = new THREE.Scene();\n scene.fog = new THREE.Fog(0x081226, 12, 28);\n\n const camera = new THREE.PerspectiveCamera(50, mount.clientWidth / mount.clientHeight, 0.1, 100);\n camera.position.set(0, 2.6, 7.5);\n\n const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.setSize(mount.clientWidth, mount.clientHeight);\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n mount.appendChild(renderer.domElement);\n\n const ambientLight = new THREE.AmbientLight(0x8ab4ff, 0.8);\n scene.add(ambientLight);\n\n const keyLight = new THREE.DirectionalLight(0xffffff, 1.25);\n keyLight.position.set(2, 5, 4);\n scene.add(keyLight);\n\n const fillLight = new THREE.PointLight(0x7ad7ff, 0.9, 24);\n fillLight.position.set(-4, 3, -2);\n scene.add(fillLight);\n\n const floor = new THREE.Mesh(\n new THREE.CircleGeometry(12, 48),\n new THREE.MeshStandardMaterial({ color: 0x10203a, roughness: 0.95, metalness: 0.05 })\n );\n floor.rotation.x = -Math.PI / 2;\n floor.position.y = -1.2;\n scene.add(floor);\n\n const giftGroup = new THREE.Group();\n scene.add(giftGroup);\n\n const box = new THREE.Mesh(\n new THREE.BoxGeometry(2, 1.6, 2),\n new THREE.MeshStandardMaterial({ color: 0xd94165, roughness: 0.55, metalness: 0.2 })\n );\n giftGroup.add(box);\n\n const ribbonMaterial = new THREE.MeshStandardMaterial({ color: 0xffd97a, roughness: 0.3, metalness: 0.5 });\n const verticalRibbon = new THREE.Mesh(new THREE.BoxGeometry(0.24, 1.7, 2.02), ribbonMaterial);\n const horizontalRibbon = new THREE.Mesh(new THREE.BoxGeometry(2.02, 1.7, 0.24), ribbonMaterial);\n giftGroup.add(verticalRibbon);\n giftGroup.add(horizontalRibbon);\n\n const lid = new THREE.Mesh(\n new THREE.BoxGeometry(2.15, 0.34, 2.15),\n new THREE.MeshStandardMaterial({ color: 0xcd3456, roughness: 0.52, metalness: 0.2 })\n );\n lid.position.y = 0.98;\n giftGroup.add(lid);\n\n const bowLeft = new THREE.Mesh(new THREE.TorusGeometry(0.26, 0.08, 12, 32), ribbonMaterial);\n bowLeft.rotation.set(Math.PI / 2, Math.PI / 6, 0);\n bowLeft.position.set(-0.22, 1.14, 0);\n const bowRight = bowLeft.clone();\n bowRight.rotation.y = -Math.PI / 6;\n bowRight.position.x = 0.22;\n giftGroup.add(bowLeft, bowRight);\n\n giftGroup.position.y = -0.15;\n\n const { positions, speeds } = createSnow(260);\n const snowGeometry = new THREE.BufferGeometry();\n snowGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n const snow = new THREE.Points(\n snowGeometry,\n new THREE.PointsMaterial({\n color: 0xe8f4ff,\n size: 0.08,\n transparent: true,\n opacity: 0.92,\n depthWrite: false,\n })\n );\n scene.add(snow);\n\n let rafId = 0;\n const clock = new THREE.Clock();\n\n const animate = () => {\n const elapsed = clock.getElapsedTime();\n const pos = snowGeometry.attributes.position as THREE.BufferAttribute;\n\n for (let i = 0; i < pos.count; i++) {\n const speed = speeds[i] ?? 0.01;\n const y = pos.getY(i) - speed;\n pos.setY(i, y < -1.1 ? 10 + Math.random() * 2 : y);\n pos.setX(i, pos.getX(i) + Math.sin(elapsed + i * 0.04) * 0.0016);\n }\n pos.needsUpdate = true;\n\n giftGroup.rotation.y = elapsed * 0.35;\n giftGroup.position.y = -0.15 + Math.sin(elapsed * 1.4) * 0.08;\n lid.position.y = 0.98 + Math.sin(elapsed * 2.2) * 0.08;\n\n renderer.render(scene, camera);\n rafId = window.requestAnimationFrame(animate);\n };\n\n const handleResize = () => {\n if (!mount) return;\n const width = mount.clientWidth;\n const height = mount.clientHeight;\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height);\n };\n\n window.addEventListener('resize', handleResize);\n animate();\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.removeEventListener('resize', handleResize);\n\n scene.traverse((obj) => {\n const mesh = obj as THREE.Mesh;\n if (mesh.geometry) mesh.geometry.dispose();\n const material = mesh.material as THREE.Material | THREE.Material[] | undefined;\n if (Array.isArray(material)) material.forEach((m) => m.dispose());\n else material?.dispose();\n });\n\n renderer.dispose();\n mount.removeChild(renderer.domElement);\n };\n }, []);\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n width: '100%',\n minHeight: 420,\n borderRadius: 20,\n overflow: 'hidden',\n background: 'radial-gradient(circle at 20% 20%, #244d8c 0%, #0c1a34 45%, #060d1f 100%)',\n }}\n >\n <div ref={mountRef} style={{ position: 'absolute', inset: 0 }} />\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n background:\n 'linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0.04) 35%, rgba(4,8,20,0.36) 100%)',\n }}\n />\n <div\n style={{\n position: 'absolute',\n left: 20,\n right: 20,\n bottom: 20,\n zIndex: 2,\n padding: '16px 18px',\n borderRadius: 14,\n backgroundColor: 'rgba(8, 16, 35, 0.66)',\n border: '1px solid rgba(255, 255, 255, 0.16)',\n color: '#f8fafc',\n }}\n >\n <div style={{ fontSize: 26, fontWeight: 700, lineHeight: 1.2 }}>{title}</div>\n <div style={{ marginTop: 6, fontSize: 15, opacity: 0.92 }}>{subtitle}</div>\n </div>\n </div>\n );\n};\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -12,8 +12,9 @@ export { FloatingMenu, FloatingMenuExample, Navigation, NavigationConfig, Naviga
|
|
|
12
12
|
import { B as BaseApiClient } from './base-api-client-BQ8ZPZjk.mjs';
|
|
13
13
|
export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuOverlayItem, DanmakuPanel, FIREWORK_KIND_LABELS, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, NORMAL_PALETTE, UseFireworksEngineOptions, WebSocketTransport, WebSocketTransportCallbacks, useDanmakuController, useFireworksEngine, useFireworksRealtime } from './mikuFireworks3D/index.mjs';
|
|
14
14
|
export { e as DanmakuControllerOptions, D as DanmakuMessage, d as DanmakuSendResult, c as FireworkEngineOptions, F as FireworkKind, a as FireworkLaunchPayload, b as FireworkPosition, g as FireworksRealtimeConfig, h as FireworksRealtimeState, f as FireworksRealtimeUser, M as MikuFireworks3DProps } from './types-DBVDr8Mu.mjs';
|
|
15
|
-
export { ScreenReceiverErrorMessage, ScreenReceiverIncomingMessage, ScreenReceiverJoinMessage, ScreenReceiverJoinedMessage, ScreenReceiverLogEntry, ScreenReceiverPeerJoinedMessage, ScreenReceiverPeerLeftMessage, ScreenReceiverRole, ScreenReceiverRoomStateMessage, ScreenReceiverSignalMessage, ScreenReceiverSignalType, UseScreenReceiverOptions, UseScreenReceiverReturn, useScreenReceiver } from './screenReceiver/core/index.mjs';
|
|
15
|
+
export { ResolveScreenReceiverSignalUrlOptions, ScreenReceiverClientRole, ScreenReceiverErrorMessage, ScreenReceiverIncomingMessage, ScreenReceiverJoinMessage, ScreenReceiverJoinedMessage, ScreenReceiverLogEntry, ScreenReceiverPeerJoinedMessage, ScreenReceiverPeerLeftMessage, ScreenReceiverRole, ScreenReceiverRoomStateMessage, ScreenReceiverSignalMessage, ScreenReceiverSignalType, UseScreenReceiverOptions, UseScreenReceiverReturn, resolveScreenReceiverSignalUrl, useScreenReceiver } from './screenReceiver/core/index.mjs';
|
|
16
16
|
export { ScreenReceiverPanel, ScreenReceiverPanelProps } from './screenReceiver/web/index.mjs';
|
|
17
|
+
export { FestivalCard3D, FestivalCard3DProps } from './festivalCard/index.mjs';
|
|
17
18
|
export { S as StorageAdapter, a as StorageChangeEvent } from './types-BaZccpvk.mjs';
|
|
18
19
|
export { b as useAsyncStorage, d as useElectronStorage, a as useLocalStorage, u as useStorage, c as useTaroStorage } from './useElectronStorage-Dj0rcorG.mjs';
|
|
19
20
|
import './types-CbTsi9CZ.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -12,8 +12,9 @@ export { FloatingMenu, FloatingMenuExample, Navigation, NavigationConfig, Naviga
|
|
|
12
12
|
import { B as BaseApiClient } from './base-api-client-B-yUCal3.js';
|
|
13
13
|
export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuOverlayItem, DanmakuPanel, FIREWORK_KIND_LABELS, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, NORMAL_PALETTE, UseFireworksEngineOptions, WebSocketTransport, WebSocketTransportCallbacks, useDanmakuController, useFireworksEngine, useFireworksRealtime } from './mikuFireworks3D/index.js';
|
|
14
14
|
export { e as DanmakuControllerOptions, D as DanmakuMessage, d as DanmakuSendResult, c as FireworkEngineOptions, F as FireworkKind, a as FireworkLaunchPayload, b as FireworkPosition, g as FireworksRealtimeConfig, h as FireworksRealtimeState, f as FireworksRealtimeUser, M as MikuFireworks3DProps } from './types-DBVDr8Mu.js';
|
|
15
|
-
export { ScreenReceiverErrorMessage, ScreenReceiverIncomingMessage, ScreenReceiverJoinMessage, ScreenReceiverJoinedMessage, ScreenReceiverLogEntry, ScreenReceiverPeerJoinedMessage, ScreenReceiverPeerLeftMessage, ScreenReceiverRole, ScreenReceiverRoomStateMessage, ScreenReceiverSignalMessage, ScreenReceiverSignalType, UseScreenReceiverOptions, UseScreenReceiverReturn, useScreenReceiver } from './screenReceiver/core/index.js';
|
|
15
|
+
export { ResolveScreenReceiverSignalUrlOptions, ScreenReceiverClientRole, ScreenReceiverErrorMessage, ScreenReceiverIncomingMessage, ScreenReceiverJoinMessage, ScreenReceiverJoinedMessage, ScreenReceiverLogEntry, ScreenReceiverPeerJoinedMessage, ScreenReceiverPeerLeftMessage, ScreenReceiverRole, ScreenReceiverRoomStateMessage, ScreenReceiverSignalMessage, ScreenReceiverSignalType, UseScreenReceiverOptions, UseScreenReceiverReturn, resolveScreenReceiverSignalUrl, useScreenReceiver } from './screenReceiver/core/index.js';
|
|
16
16
|
export { ScreenReceiverPanel, ScreenReceiverPanelProps } from './screenReceiver/web/index.js';
|
|
17
|
+
export { FestivalCard3D, FestivalCard3DProps } from './festivalCard/index.js';
|
|
17
18
|
export { S as StorageAdapter, a as StorageChangeEvent } from './types-BaZccpvk.js';
|
|
18
19
|
export { b as useAsyncStorage, d as useElectronStorage, a as useLocalStorage, u as useStorage, c as useTaroStorage } from './useElectronStorage-DwnNfIhl.js';
|
|
19
20
|
import './types-CbTsi9CZ.js';
|