sa2kit 1.6.64 → 1.6.67

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 (89) hide show
  1. package/dist/auth/legacy/core/index.js +24 -12
  2. package/dist/auth/legacy/core/index.js.map +1 -1
  3. package/dist/auth/legacy/core/index.mjs +24 -12
  4. package/dist/auth/legacy/core/index.mjs.map +1 -1
  5. package/dist/auth/legacy/index.js +30 -12
  6. package/dist/auth/legacy/index.js.map +1 -1
  7. package/dist/auth/legacy/index.mjs +30 -12
  8. package/dist/auth/legacy/index.mjs.map +1 -1
  9. package/dist/auth/legacy/logic/index.js +24 -12
  10. package/dist/auth/legacy/logic/index.js.map +1 -1
  11. package/dist/auth/legacy/logic/index.mjs +24 -12
  12. package/dist/auth/legacy/logic/index.mjs.map +1 -1
  13. package/dist/auth/legacy/miniapp/index.js +24 -12
  14. package/dist/auth/legacy/miniapp/index.js.map +1 -1
  15. package/dist/auth/legacy/miniapp/index.mjs +24 -12
  16. package/dist/auth/legacy/miniapp/index.mjs.map +1 -1
  17. package/dist/auth/legacy/routes/index.d.mts +3 -0
  18. package/dist/auth/legacy/routes/index.d.ts +3 -0
  19. package/dist/auth/legacy/routes/index.js +8 -1
  20. package/dist/auth/legacy/routes/index.js.map +1 -1
  21. package/dist/auth/legacy/routes/index.mjs +8 -1
  22. package/dist/auth/legacy/routes/index.mjs.map +1 -1
  23. package/dist/auth/legacy/server/index.js +8 -1
  24. package/dist/auth/legacy/server/index.js.map +1 -1
  25. package/dist/auth/legacy/server/index.mjs +8 -1
  26. package/dist/auth/legacy/server/index.mjs.map +1 -1
  27. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -1
  28. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -1
  29. package/dist/auth/legacy/ui/web/index.js +6 -0
  30. package/dist/auth/legacy/ui/web/index.js.map +1 -1
  31. package/dist/auth/legacy/ui/web/index.mjs +6 -0
  32. package/dist/auth/legacy/ui/web/index.mjs.map +1 -1
  33. package/dist/auth/legacy/web/index.js +30 -12
  34. package/dist/auth/legacy/web/index.js.map +1 -1
  35. package/dist/auth/legacy/web/index.mjs +30 -12
  36. package/dist/auth/legacy/web/index.mjs.map +1 -1
  37. package/dist/festivalCard/index.d.mts +10 -0
  38. package/dist/festivalCard/index.d.ts +10 -0
  39. package/dist/festivalCard/index.js +206 -0
  40. package/dist/festivalCard/index.js.map +1 -0
  41. package/dist/festivalCard/index.mjs +181 -0
  42. package/dist/festivalCard/index.mjs.map +1 -0
  43. package/dist/index.d.mts +2 -1
  44. package/dist/index.d.ts +2 -1
  45. package/dist/index.js +210 -18
  46. package/dist/index.js.map +1 -1
  47. package/dist/index.mjs +208 -18
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/screenReceiver/core/index.d.mts +10 -2
  50. package/dist/screenReceiver/core/index.d.ts +10 -2
  51. package/dist/screenReceiver/core/index.js +15 -0
  52. package/dist/screenReceiver/core/index.js.map +1 -1
  53. package/dist/screenReceiver/core/index.mjs +15 -1
  54. package/dist/screenReceiver/core/index.mjs.map +1 -1
  55. package/dist/screenReceiver/index.d.mts +1 -1
  56. package/dist/screenReceiver/index.d.ts +1 -1
  57. package/dist/screenReceiver/index.js +21 -3
  58. package/dist/screenReceiver/index.js.map +1 -1
  59. package/dist/screenReceiver/index.mjs +21 -4
  60. package/dist/screenReceiver/index.mjs.map +1 -1
  61. package/dist/screenReceiver/server/index.js +1 -1
  62. package/dist/screenReceiver/server/index.js.map +1 -1
  63. package/dist/screenReceiver/server/index.mjs +1 -1
  64. package/dist/screenReceiver/server/index.mjs.map +1 -1
  65. package/dist/screenReceiver/server/next.d.mts +9 -0
  66. package/dist/screenReceiver/server/next.d.ts +9 -0
  67. package/dist/screenReceiver/server/next.js +178 -0
  68. package/dist/screenReceiver/server/next.js.map +1 -0
  69. package/dist/screenReceiver/server/next.mjs +176 -0
  70. package/dist/screenReceiver/server/next.mjs.map +1 -0
  71. package/dist/screenReceiver/web/index.d.mts +1 -1
  72. package/dist/screenReceiver/web/index.d.ts +1 -1
  73. package/dist/screenReceiver/web/index.js +21 -3
  74. package/dist/screenReceiver/web/index.js.map +1 -1
  75. package/dist/screenReceiver/web/index.mjs +21 -4
  76. package/dist/screenReceiver/web/index.mjs.map +1 -1
  77. package/dist/showmasterpiece/index.js +30 -12
  78. package/dist/showmasterpiece/index.js.map +1 -1
  79. package/dist/showmasterpiece/index.mjs +30 -12
  80. package/dist/showmasterpiece/index.mjs.map +1 -1
  81. package/dist/showmasterpiece/ui/web/index.js +30 -12
  82. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  83. package/dist/showmasterpiece/ui/web/index.mjs +30 -12
  84. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  85. package/dist/showmasterpiece/web/index.js +30 -12
  86. package/dist/showmasterpiece/web/index.js.map +1 -1
  87. package/dist/showmasterpiece/web/index.mjs +30 -12
  88. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  89. package/package.json +11 -1
@@ -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":"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","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';