@chocodrop/mcp 0.1.0-alpha.0
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/LICENSE +21 -0
- package/README.md +19 -0
- package/bin/chocodrop-mcp.js +13 -0
- package/package.json +42 -0
- package/runtime/.chocodrop-mcp-runtime +1 -0
- package/runtime/asset-bridge.js +460 -0
- package/runtime/mcp-server.js +107 -0
- package/runtime/site/examples/basic/README.md +38 -0
- package/runtime/site/examples/basic/index.html +1730 -0
- package/runtime/site/examples/bookmarklet-v2.html +141 -0
- package/runtime/site/examples/bookmarklet.html +126 -0
- package/runtime/site/examples/lofi-room/index.html +2570 -0
- package/runtime/site/examples/lofi-room/sandbox-lite.html +124 -0
- package/runtime/site/examples/music-garden/index.html +2150 -0
- package/runtime/site/examples/pixel-ocean/index.html +1780 -0
- package/runtime/site/examples/react-three-fiber/AdvancedExample.jsx +338 -0
- package/runtime/site/examples/react-three-fiber/App.jsx +97 -0
- package/runtime/site/examples/react-three-fiber/README.md +294 -0
- package/runtime/site/examples/react-three-fiber/package.json +25 -0
- package/runtime/site/examples/sdk-test/README.md +70 -0
- package/runtime/site/examples/space/index.html +1975 -0
- package/runtime/site/examples/toy-city/index.html +2288 -0
- package/runtime/site/examples/wabi-sabi/index.html +2515 -0
- package/runtime/site/getting-started.html +84 -0
- package/runtime/site/index.html +1370 -0
- package/runtime/site/public/CommandUI.js +6341 -0
- package/runtime/site/public/LiveCommandClient.js +432 -0
- package/runtime/site/public/SceneManager.js +5493 -0
- package/runtime/site/public/bookmarklet.js +206 -0
- package/runtime/site/public/bootstrap.js +50 -0
- package/runtime/site/public/chocodrop-demo.umd.js +24020 -0
- package/runtime/site/public/chocodrop-demo.umd.min.js +24020 -0
- package/runtime/site/public/chocodrop.esm.js +2 -0
- package/runtime/site/public/html-sandbox/frame.js +865 -0
- package/runtime/site/public/icons/icon-192.png +0 -0
- package/runtime/site/public/icons/icon-512.png +0 -0
- package/runtime/site/public/icons/icon-maskable-512.png +0 -0
- package/runtime/site/public/immersive-launcher.js +175 -0
- package/runtime/site/public/immersive.html +165 -0
- package/runtime/site/public/index.html +1011 -0
- package/runtime/site/public/index.js +9 -0
- package/runtime/site/public/load-chocodrop.js +25 -0
- package/runtime/site/public/load-three.js +26 -0
- package/runtime/site/public/manifest.webmanifest +59 -0
- package/runtime/site/public/pwa-bootstrap.js +128 -0
- package/runtime/site/public/sample-card.svg +15 -0
- package/runtime/site/public/service-worker.js +117 -0
- package/runtime/site/public/translation-dictionary.js +257 -0
- package/runtime/site/public/xr/xr-ui.css +338 -0
- package/runtime/site/public/xr-viewer.html +263 -0
- package/runtime/site/src/client/local-bridge.js +83 -0
|
@@ -0,0 +1,1370 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ja">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>ChocoDrop | ちょこっとDrop。世界が咲く。</title>
|
|
7
|
+
<meta name="description" content="ブラウザでThree.jsシーンを拡張。デモで体験、ブックマークレットで試用、プロジェクトに本格導入。">
|
|
8
|
+
|
|
9
|
+
<!-- OGP -->
|
|
10
|
+
<meta property="og:title" content="ChocoDrop | ちょこっとDrop。世界が咲く。">
|
|
11
|
+
<meta property="og:description" content="ブラウザでThree.jsシーンを拡張。デモで体験、ブックマークレットで試用、プロジェクトに本格導入。">
|
|
12
|
+
<meta property="og:type" content="website">
|
|
13
|
+
<meta property="og:url" content="https://nyukicorn.github.io/chocodrop/">
|
|
14
|
+
<meta property="og:image" content="https://nyukicorn.github.io/chocodrop/public/sample-card.svg">
|
|
15
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
:root {
|
|
19
|
+
/* Core brand */
|
|
20
|
+
--choco-bg: #2C1810; /* Dark Chocolate */
|
|
21
|
+
--choco-mocha: #8B6F47; /* Mocha Mousse */
|
|
22
|
+
--choco-milk: #C19A6B; /* Milk Choco accent */
|
|
23
|
+
--choco-cream: #FFF8E7; /* White Choco text/base */
|
|
24
|
+
--accent-plum: #8B5CF6; /* Plum accent */
|
|
25
|
+
--accent-caramel: #D2691E; /* CTA */
|
|
26
|
+
|
|
27
|
+
/* Neutral surface for可読性 */
|
|
28
|
+
--surface-0: #0F0F10;
|
|
29
|
+
--surface-1: #161617;
|
|
30
|
+
--surface-2: #1F1F21;
|
|
31
|
+
|
|
32
|
+
/* State */
|
|
33
|
+
--ok-mint: #98FB98;
|
|
34
|
+
--warn-strawberry: #FFB6C1;
|
|
35
|
+
|
|
36
|
+
/* Effects */
|
|
37
|
+
--glass-bg: rgba(22,22,23,0.45);
|
|
38
|
+
--glass-blur: blur(8px);
|
|
39
|
+
|
|
40
|
+
/* Radii & space */
|
|
41
|
+
--r-s: 12px;
|
|
42
|
+
--r-m: 16px;
|
|
43
|
+
--r-l: 24px;
|
|
44
|
+
--r-xl: 28px;
|
|
45
|
+
--gap-s: 8px;
|
|
46
|
+
--gap-m: 12px;
|
|
47
|
+
--gap-l: 20px;
|
|
48
|
+
--gap-xl: 28px;
|
|
49
|
+
--shadow-1: 0 6px 20px rgba(0,0,0,.25);
|
|
50
|
+
--shadow-2: 0 8px 32px rgba(0,0,0,.35);
|
|
51
|
+
--shadow-glow: 0 0 40px rgba(139, 92, 246, 0.2);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
* {
|
|
55
|
+
margin: 0;
|
|
56
|
+
padding: 0;
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
body {
|
|
61
|
+
background: var(--surface-0);
|
|
62
|
+
color: var(--choco-cream);
|
|
63
|
+
font-family: "Helvetica Neue", -apple-system, "Hiragino Kaku Gothic ProN", "Noto Sans JP", "Yu Gothic", sans-serif;
|
|
64
|
+
line-height: 1.6;
|
|
65
|
+
overflow-x: hidden;
|
|
66
|
+
min-height: 100vh;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Subtle background gradient */
|
|
70
|
+
body::before {
|
|
71
|
+
content: '';
|
|
72
|
+
position: fixed;
|
|
73
|
+
top: 0;
|
|
74
|
+
left: 0;
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 100%;
|
|
77
|
+
background:
|
|
78
|
+
radial-gradient(circle at 20% 40%, rgba(139, 92, 246, 0.03) 0%, transparent 40%),
|
|
79
|
+
radial-gradient(circle at 80% 60%, rgba(139, 108, 71, 0.02) 0%, transparent 40%);
|
|
80
|
+
pointer-events: none;
|
|
81
|
+
z-index: 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.container {
|
|
85
|
+
max-width: 1280px;
|
|
86
|
+
margin: 0 auto;
|
|
87
|
+
padding: 0 24px;
|
|
88
|
+
position: relative;
|
|
89
|
+
z-index: 2;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Hero Section with Glass Effect */
|
|
93
|
+
.hero {
|
|
94
|
+
min-height: 100vh;
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-direction: column;
|
|
97
|
+
justify-content: center;
|
|
98
|
+
align-items: center;
|
|
99
|
+
text-align: center;
|
|
100
|
+
padding: 80px 20px;
|
|
101
|
+
position: relative;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.hero-content {
|
|
105
|
+
background: var(--glass-bg);
|
|
106
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
107
|
+
backdrop-filter: var(--glass-blur);
|
|
108
|
+
border: 1px solid rgba(255, 248, 231, 0.08);
|
|
109
|
+
border-radius: var(--r-xl);
|
|
110
|
+
padding: 60px 40px;
|
|
111
|
+
max-width: 800px;
|
|
112
|
+
margin: 0 auto;
|
|
113
|
+
box-shadow: var(--shadow-2);
|
|
114
|
+
transition: all 0.3s ease;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.hero-content:hover {
|
|
118
|
+
transform: translateY(-2px);
|
|
119
|
+
box-shadow: var(--shadow-2), var(--shadow-glow);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.logo {
|
|
123
|
+
font-size: 48px;
|
|
124
|
+
margin-bottom: 24px;
|
|
125
|
+
display: inline-block;
|
|
126
|
+
animation: float-gentle 3s ease-in-out infinite;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@keyframes float-gentle {
|
|
130
|
+
0%, 100% { transform: translateY(0px); }
|
|
131
|
+
50% { transform: translateY(-10px); }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
h1 {
|
|
135
|
+
font-size: clamp(32px, 6vw, 56px);
|
|
136
|
+
font-weight: 700;
|
|
137
|
+
margin-bottom: 16px;
|
|
138
|
+
background: linear-gradient(135deg, var(--choco-cream) 0%, var(--choco-milk) 50%, var(--accent-plum) 100%);
|
|
139
|
+
-webkit-background-clip: text;
|
|
140
|
+
-webkit-text-fill-color: transparent;
|
|
141
|
+
background-clip: text;
|
|
142
|
+
line-height: 1.2;
|
|
143
|
+
letter-spacing: -0.02em;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.hero .lead {
|
|
147
|
+
color: var(--accent-plum); /* アクセント色をタグラインに */
|
|
148
|
+
font-size: clamp(1.05rem, 2.2vw, 1.25rem);
|
|
149
|
+
letter-spacing: .02em;
|
|
150
|
+
text-decoration: underline;
|
|
151
|
+
text-underline-offset: 3px;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.lead.is-plum {
|
|
155
|
+
color: var(--accent-plum);
|
|
156
|
+
text-decoration: underline;
|
|
157
|
+
text-underline-offset: 3px;
|
|
158
|
+
font-size: clamp(1.05rem, 2.2vw, 1.25rem);
|
|
159
|
+
letter-spacing: .02em;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.hero-subtitle {
|
|
163
|
+
font-size: 18px;
|
|
164
|
+
color: rgba(255, 248, 231, 0.8);
|
|
165
|
+
margin-bottom: 40px;
|
|
166
|
+
font-weight: 400;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Demo Carousel */
|
|
170
|
+
.demo-carousel {
|
|
171
|
+
position: relative;
|
|
172
|
+
padding: 80px 0 60px;
|
|
173
|
+
background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(22, 22, 23, 0.4) 60%, rgba(139, 108, 71, 0.05) 100%);
|
|
174
|
+
border-top: 1px solid rgba(255, 248, 231, 0.04);
|
|
175
|
+
border-bottom: 1px solid rgba(255, 248, 231, 0.04);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.demo-carousel::after {
|
|
179
|
+
content: '';
|
|
180
|
+
position: absolute;
|
|
181
|
+
inset: 0;
|
|
182
|
+
background: radial-gradient(circle at 5% 10%, rgba(255, 248, 231, 0.04) 0%, transparent 45%),
|
|
183
|
+
radial-gradient(circle at 95% 90%, rgba(139, 92, 246, 0.08) 0%, transparent 55%);
|
|
184
|
+
pointer-events: none;
|
|
185
|
+
z-index: 1;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.demo-carousel .container {
|
|
189
|
+
position: relative;
|
|
190
|
+
z-index: 2;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.carousel-head {
|
|
194
|
+
display: flex;
|
|
195
|
+
flex-wrap: wrap;
|
|
196
|
+
align-items: flex-end;
|
|
197
|
+
justify-content: space-between;
|
|
198
|
+
gap: 20px;
|
|
199
|
+
margin-bottom: 32px;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.carousel-head h2 {
|
|
203
|
+
font-size: clamp(2rem, 4vw, 2.6rem);
|
|
204
|
+
font-weight: 700;
|
|
205
|
+
color: var(--choco-cream);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.carousel-copy {
|
|
209
|
+
max-width: 520px;
|
|
210
|
+
color: rgba(255, 248, 231, 0.7);
|
|
211
|
+
font-size: 0.98rem;
|
|
212
|
+
line-height: 1.7;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.carousel-nav {
|
|
216
|
+
display: flex;
|
|
217
|
+
gap: 12px;
|
|
218
|
+
align-items: center;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.carousel-nav button {
|
|
222
|
+
background: rgba(255, 248, 231, 0.08);
|
|
223
|
+
color: var(--choco-cream);
|
|
224
|
+
border: 1px solid rgba(255, 248, 231, 0.16);
|
|
225
|
+
border-radius: 50%;
|
|
226
|
+
width: 44px;
|
|
227
|
+
height: 44px;
|
|
228
|
+
display: inline-flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: center;
|
|
231
|
+
font-size: 1.15rem;
|
|
232
|
+
cursor: pointer;
|
|
233
|
+
transition: all 0.2s ease;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.carousel-nav button:hover:not([disabled]) {
|
|
237
|
+
transform: translateY(-2px);
|
|
238
|
+
box-shadow: var(--shadow-1);
|
|
239
|
+
border-color: rgba(139, 92, 246, 0.7);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.carousel-nav button[disabled] {
|
|
243
|
+
opacity: 0.35;
|
|
244
|
+
cursor: not-allowed;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.carousel-viewport {
|
|
248
|
+
position: relative;
|
|
249
|
+
overflow: hidden;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.carousel-track {
|
|
253
|
+
display: flex;
|
|
254
|
+
gap: 24px;
|
|
255
|
+
overflow-x: auto;
|
|
256
|
+
scroll-snap-type: x mandatory;
|
|
257
|
+
scroll-padding: 24px;
|
|
258
|
+
padding-bottom: 12px;
|
|
259
|
+
scrollbar-width: thin;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.carousel-track::-webkit-scrollbar {
|
|
263
|
+
height: 6px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.carousel-track::-webkit-scrollbar-thumb {
|
|
267
|
+
background: rgba(255, 248, 231, 0.2);
|
|
268
|
+
border-radius: 999px;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.carousel-card {
|
|
272
|
+
position: relative;
|
|
273
|
+
min-width: clamp(260px, 32vw, 360px);
|
|
274
|
+
padding: 28px 28px 120px;
|
|
275
|
+
border-radius: var(--r-l);
|
|
276
|
+
background: linear-gradient(160deg, rgba(17, 17, 19, 0.9) 0%, rgba(28, 24, 35, 0.7) 80%, rgba(139, 92, 246, 0.18) 100%);
|
|
277
|
+
border: 1px solid rgba(255, 248, 231, 0.08);
|
|
278
|
+
text-decoration: none;
|
|
279
|
+
color: var(--choco-cream);
|
|
280
|
+
scroll-snap-align: start;
|
|
281
|
+
overflow: hidden;
|
|
282
|
+
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);
|
|
283
|
+
transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.carousel-card:hover {
|
|
287
|
+
transform: translateY(-6px);
|
|
288
|
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35), var(--shadow-glow);
|
|
289
|
+
border-color: rgba(139, 92, 246, 0.4);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.carousel-card::after {
|
|
293
|
+
content: '';
|
|
294
|
+
position: absolute;
|
|
295
|
+
inset: 0;
|
|
296
|
+
background: radial-gradient(circle at 60% 30%, rgba(139, 92, 246, 0.35) 0%, transparent 60%);
|
|
297
|
+
opacity: 0;
|
|
298
|
+
transition: opacity 0.3s ease;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.carousel-card:hover::after {
|
|
302
|
+
opacity: 0.6;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.carousel-tag {
|
|
306
|
+
font-size: 0.78rem;
|
|
307
|
+
letter-spacing: 0.08em;
|
|
308
|
+
text-transform: uppercase;
|
|
309
|
+
color: rgba(255, 248, 231, 0.6);
|
|
310
|
+
display: inline-flex;
|
|
311
|
+
gap: 6px;
|
|
312
|
+
align-items: center;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.carousel-title {
|
|
316
|
+
font-size: 1.55rem;
|
|
317
|
+
font-weight: 700;
|
|
318
|
+
margin: 16px 0 10px;
|
|
319
|
+
display: flex;
|
|
320
|
+
align-items: center;
|
|
321
|
+
gap: 10px;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.carousel-title span {
|
|
325
|
+
font-size: 1.8rem;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.carousel-description {
|
|
329
|
+
font-size: 0.98rem;
|
|
330
|
+
line-height: 1.7;
|
|
331
|
+
opacity: 0.82;
|
|
332
|
+
margin-bottom: 18px;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.carousel-meta {
|
|
336
|
+
display: flex;
|
|
337
|
+
gap: 10px;
|
|
338
|
+
align-items: center;
|
|
339
|
+
font-size: 0.9rem;
|
|
340
|
+
opacity: 0.75;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.carousel-action {
|
|
344
|
+
position: absolute;
|
|
345
|
+
inset: auto 24px 24px 24px;
|
|
346
|
+
display: inline-flex;
|
|
347
|
+
gap: 8px;
|
|
348
|
+
align-items: center;
|
|
349
|
+
background: rgba(255, 248, 231, 0.12);
|
|
350
|
+
color: var(--choco-cream);
|
|
351
|
+
padding: 12px 18px;
|
|
352
|
+
border-radius: var(--r-xl);
|
|
353
|
+
font-weight: 600;
|
|
354
|
+
font-size: 0.92rem;
|
|
355
|
+
border: 1px solid rgba(255, 248, 231, 0.16);
|
|
356
|
+
transition: background 0.2s ease, color 0.2s ease;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.carousel-card:hover .carousel-action {
|
|
360
|
+
background: rgba(139, 92, 246, 0.22);
|
|
361
|
+
color: #fff;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.carousel-progress {
|
|
365
|
+
margin-top: 24px;
|
|
366
|
+
display: flex;
|
|
367
|
+
gap: 8px;
|
|
368
|
+
justify-content: center;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.carousel-progress button {
|
|
372
|
+
width: 10px;
|
|
373
|
+
height: 10px;
|
|
374
|
+
border-radius: 999px;
|
|
375
|
+
border: none;
|
|
376
|
+
background: rgba(255, 248, 231, 0.18);
|
|
377
|
+
cursor: pointer;
|
|
378
|
+
transition: width 0.25s ease, background 0.25s ease;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.carousel-progress button.is-active {
|
|
382
|
+
width: 32px;
|
|
383
|
+
background: rgba(139, 92, 246, 0.9);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.hero-buttons {
|
|
387
|
+
display: flex;
|
|
388
|
+
gap: 16px;
|
|
389
|
+
justify-content: center;
|
|
390
|
+
flex-wrap: wrap;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.btn-primary {
|
|
394
|
+
background: var(--accent-caramel);
|
|
395
|
+
color: #111;
|
|
396
|
+
border-radius: var(--r-xl);
|
|
397
|
+
padding: 16px 32px;
|
|
398
|
+
box-shadow: var(--shadow-1);
|
|
399
|
+
text-decoration: none;
|
|
400
|
+
font-weight: 600;
|
|
401
|
+
font-size: 16px;
|
|
402
|
+
display: inline-flex;
|
|
403
|
+
align-items: center;
|
|
404
|
+
gap: 8px;
|
|
405
|
+
transition: all 0.15s ease;
|
|
406
|
+
border: none;
|
|
407
|
+
cursor: pointer;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.btn-primary:hover {
|
|
411
|
+
transform: translateY(-2px);
|
|
412
|
+
box-shadow: var(--shadow-2);
|
|
413
|
+
border-radius: var(--r-l);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.btn-secondary {
|
|
417
|
+
background: transparent;
|
|
418
|
+
color: var(--choco-cream);
|
|
419
|
+
border: 1px solid rgba(255, 248, 231, 0.2);
|
|
420
|
+
border-radius: var(--r-xl);
|
|
421
|
+
padding: 16px 32px;
|
|
422
|
+
text-decoration: none;
|
|
423
|
+
font-weight: 600;
|
|
424
|
+
font-size: 16px;
|
|
425
|
+
display: inline-flex;
|
|
426
|
+
align-items: center;
|
|
427
|
+
gap: 8px;
|
|
428
|
+
transition: all 0.15s ease;
|
|
429
|
+
cursor: pointer;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.btn-secondary:hover {
|
|
433
|
+
background: rgba(255, 248, 231, 0.05);
|
|
434
|
+
border-color: rgba(255, 248, 231, 0.3);
|
|
435
|
+
transform: translateY(-1px);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/* Floating Chocolate Cubes */
|
|
439
|
+
.floating-elements {
|
|
440
|
+
position: absolute;
|
|
441
|
+
width: 100%;
|
|
442
|
+
height: 100%;
|
|
443
|
+
top: 0;
|
|
444
|
+
left: 0;
|
|
445
|
+
pointer-events: none;
|
|
446
|
+
z-index: 0;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.choco-cube {
|
|
450
|
+
position: absolute;
|
|
451
|
+
width: 40px;
|
|
452
|
+
height: 40px;
|
|
453
|
+
background: linear-gradient(135deg, var(--choco-mocha), var(--choco-milk));
|
|
454
|
+
border-radius: var(--r-s);
|
|
455
|
+
opacity: 0.3;
|
|
456
|
+
animation: float-rotate 20s ease-in-out infinite;
|
|
457
|
+
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
.choco-cube:nth-child(1) {
|
|
461
|
+
top: 20%;
|
|
462
|
+
left: 10%;
|
|
463
|
+
animation-delay: 0s;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.choco-cube:nth-child(2) {
|
|
467
|
+
top: 60%;
|
|
468
|
+
right: 15%;
|
|
469
|
+
animation-delay: 7s;
|
|
470
|
+
width: 30px;
|
|
471
|
+
height: 30px;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.choco-cube:nth-child(3) {
|
|
475
|
+
bottom: 20%;
|
|
476
|
+
left: 20%;
|
|
477
|
+
animation-delay: 14s;
|
|
478
|
+
width: 35px;
|
|
479
|
+
height: 35px;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
@keyframes float-rotate {
|
|
483
|
+
0%, 100% {
|
|
484
|
+
transform: translateY(0px) rotateX(0deg) rotateY(0deg);
|
|
485
|
+
}
|
|
486
|
+
25% {
|
|
487
|
+
transform: translateY(-20px) rotateX(180deg) rotateY(90deg);
|
|
488
|
+
}
|
|
489
|
+
50% {
|
|
490
|
+
transform: translateY(10px) rotateX(360deg) rotateY(180deg);
|
|
491
|
+
}
|
|
492
|
+
75% {
|
|
493
|
+
transform: translateY(-15px) rotateX(180deg) rotateY(270deg);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/* Bento Grid Layout */
|
|
498
|
+
.bento-section {
|
|
499
|
+
padding: 80px 0;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
.bento-grid {
|
|
503
|
+
display: grid;
|
|
504
|
+
gap: var(--gap-xl);
|
|
505
|
+
margin-bottom: 80px;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* 1段目: 2×2 */
|
|
509
|
+
.bento-row-1 {
|
|
510
|
+
grid-template-columns: 2fr 1fr;
|
|
511
|
+
min-height: 400px;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/* 2段目: 3カラム */
|
|
515
|
+
.bento-row-2 {
|
|
516
|
+
grid-template-columns: repeat(3, 1fr);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/* 3段目: 2×2 */
|
|
520
|
+
.bento-row-3 {
|
|
521
|
+
grid-template-columns: repeat(2, 1fr);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/* 4段目: 1カラム */
|
|
525
|
+
.bento-row-4 {
|
|
526
|
+
grid-template-columns: 1fr;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.bento-box {
|
|
530
|
+
background: var(--surface-1);
|
|
531
|
+
border: 1px solid rgba(255, 248, 231, 0.05);
|
|
532
|
+
border-radius: var(--r-l);
|
|
533
|
+
padding: 32px;
|
|
534
|
+
transition: all 0.3s ease;
|
|
535
|
+
position: relative;
|
|
536
|
+
overflow: hidden;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.bento-box:hover {
|
|
540
|
+
border-color: rgba(139, 92, 246, 0.2);
|
|
541
|
+
transform: translateY(-2px);
|
|
542
|
+
box-shadow: var(--shadow-1);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.bento-box::before {
|
|
546
|
+
content: '';
|
|
547
|
+
position: absolute;
|
|
548
|
+
top: -50%;
|
|
549
|
+
left: -50%;
|
|
550
|
+
width: 200%;
|
|
551
|
+
height: 200%;
|
|
552
|
+
background: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);
|
|
553
|
+
opacity: 0;
|
|
554
|
+
transition: opacity 0.3s ease;
|
|
555
|
+
pointer-events: none;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.bento-box:hover::before {
|
|
559
|
+
opacity: 1;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.bento-title {
|
|
563
|
+
font-size: 24px;
|
|
564
|
+
font-weight: 600;
|
|
565
|
+
margin-bottom: 16px;
|
|
566
|
+
color: var(--choco-milk);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.bento-description {
|
|
570
|
+
color: rgba(255, 248, 231, 0.7);
|
|
571
|
+
line-height: 1.8;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.feature-icon {
|
|
575
|
+
font-size: 48px;
|
|
576
|
+
margin-bottom: 20px;
|
|
577
|
+
display: block;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/* Mini Demo Embed */
|
|
581
|
+
.demo-embed {
|
|
582
|
+
width: 100%;
|
|
583
|
+
height: 350px;
|
|
584
|
+
border-radius: var(--r-m);
|
|
585
|
+
background: var(--surface-2);
|
|
586
|
+
border: 1px solid rgba(255, 248, 231, 0.1);
|
|
587
|
+
display: flex;
|
|
588
|
+
align-items: center;
|
|
589
|
+
justify-content: center;
|
|
590
|
+
color: rgba(255, 248, 231, 0.5);
|
|
591
|
+
font-size: 14px;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* Gallery */
|
|
595
|
+
.gallery-grid {
|
|
596
|
+
display: grid;
|
|
597
|
+
grid-template-columns: repeat(2, 1fr);
|
|
598
|
+
gap: var(--gap-m);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.gallery-item {
|
|
602
|
+
aspect-ratio: 16/9;
|
|
603
|
+
border-radius: var(--r-s);
|
|
604
|
+
background: var(--surface-2);
|
|
605
|
+
overflow: hidden;
|
|
606
|
+
position: relative;
|
|
607
|
+
cursor: pointer;
|
|
608
|
+
transition: all 0.3s ease;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.gallery-item:hover {
|
|
612
|
+
transform: scale(1.02);
|
|
613
|
+
box-shadow: var(--shadow-1);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/* Weekly Challenge */
|
|
617
|
+
.challenge-box {
|
|
618
|
+
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 108, 71, 0.05) 100%);
|
|
619
|
+
border: 2px solid var(--accent-plum);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.challenge-box .bento-title {
|
|
623
|
+
color: var(--accent-plum);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.challenge-button {
|
|
627
|
+
margin-top: 24px;
|
|
628
|
+
background: var(--accent-plum);
|
|
629
|
+
color: white;
|
|
630
|
+
padding: 12px 24px;
|
|
631
|
+
border-radius: var(--r-l);
|
|
632
|
+
text-decoration: none;
|
|
633
|
+
display: inline-block;
|
|
634
|
+
font-weight: 600;
|
|
635
|
+
transition: all 0.15s ease;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.challenge-button:hover {
|
|
639
|
+
transform: translateY(-2px);
|
|
640
|
+
box-shadow: 0 8px 24px rgba(139, 92, 246, 0.3);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/* Footer */
|
|
644
|
+
footer {
|
|
645
|
+
padding: 40px 0;
|
|
646
|
+
border-top: 1px solid rgba(255, 248, 231, 0.1);
|
|
647
|
+
text-align: center;
|
|
648
|
+
color: rgba(255, 248, 231, 0.5);
|
|
649
|
+
font-size: 14px;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
.footer-links {
|
|
653
|
+
display: flex;
|
|
654
|
+
gap: 24px;
|
|
655
|
+
justify-content: center;
|
|
656
|
+
margin-bottom: 24px;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.footer-links a {
|
|
660
|
+
color: rgba(255, 248, 231, 0.6);
|
|
661
|
+
text-decoration: none;
|
|
662
|
+
transition: color 0.2s ease;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
.footer-links a:hover {
|
|
666
|
+
color: var(--accent-plum);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/* Responsive */
|
|
670
|
+
@media (max-width: 768px) {
|
|
671
|
+
.hero-content {
|
|
672
|
+
padding: 40px 24px;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.bento-row-1,
|
|
676
|
+
.bento-row-2,
|
|
677
|
+
.bento-row-3 {
|
|
678
|
+
grid-template-columns: 1fr;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
.carousel-head {
|
|
682
|
+
flex-direction: column;
|
|
683
|
+
align-items: flex-start;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
.carousel-track {
|
|
687
|
+
gap: 18px;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
.carousel-card {
|
|
691
|
+
min-width: calc(100vw - 80px);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
.carousel-nav {
|
|
695
|
+
width: 100%;
|
|
696
|
+
justify-content: flex-end;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
.hero-buttons {
|
|
700
|
+
flex-direction: column;
|
|
701
|
+
width: 100%;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.btn-primary,
|
|
705
|
+
.btn-secondary {
|
|
706
|
+
width: 100%;
|
|
707
|
+
justify-content: center;
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
.bento-box {
|
|
711
|
+
padding: 24px;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
.gallery-grid {
|
|
715
|
+
grid-template-columns: 1fr;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* Micro Interactions */
|
|
720
|
+
.melting-hover {
|
|
721
|
+
transition: border-radius 0.15s ease;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.melting-hover:hover {
|
|
725
|
+
border-radius: var(--r-l);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/* Cursor highlight effect (CSS only) */
|
|
729
|
+
.highlight-cursor {
|
|
730
|
+
position: relative;
|
|
731
|
+
overflow: hidden;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
.highlight-cursor::after {
|
|
735
|
+
content: '';
|
|
736
|
+
position: absolute;
|
|
737
|
+
width: 100px;
|
|
738
|
+
height: 100px;
|
|
739
|
+
background: radial-gradient(circle, rgba(255, 248, 231, 0.1) 0%, transparent 70%);
|
|
740
|
+
pointer-events: none;
|
|
741
|
+
opacity: 0;
|
|
742
|
+
transition: opacity 0.3s;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.highlight-cursor:hover::after {
|
|
746
|
+
opacity: 1;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* "今週のしずく" Card Styles (Commented out for alpha - requires manual curation)
|
|
750
|
+
.cd-drops-grid {
|
|
751
|
+
display: grid;
|
|
752
|
+
gap: var(--gap-m);
|
|
753
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
.cd-card {
|
|
757
|
+
display: grid;
|
|
758
|
+
grid-template-rows: 140px auto auto;
|
|
759
|
+
gap: 10px;
|
|
760
|
+
padding: 12px;
|
|
761
|
+
border-radius: var(--r-l);
|
|
762
|
+
background: var(--surface-1);
|
|
763
|
+
border: 1px solid rgba(255, 248, 231, 0.08);
|
|
764
|
+
text-decoration: none;
|
|
765
|
+
color: inherit;
|
|
766
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease, border-radius 0.15s ease;
|
|
767
|
+
box-shadow: var(--shadow-1);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
.cd-card:hover {
|
|
771
|
+
transform: translateY(-2px);
|
|
772
|
+
border-radius: var(--r-xl);
|
|
773
|
+
box-shadow: var(--shadow-2);
|
|
774
|
+
border-color: rgba(139, 92, 246, 0.2);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/* Thumbnail with gradients */
|
|
778
|
+
.cd-thumb {
|
|
779
|
+
position: relative;
|
|
780
|
+
border-radius: var(--r-s);
|
|
781
|
+
overflow: hidden;
|
|
782
|
+
background: radial-gradient(120% 120% at 0% 0%, var(--choco-mocha) 0%, var(--choco-bg) 60%) no-repeat;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
.cd-thumb--rpg {
|
|
786
|
+
background: radial-gradient(120% 120% at 0% 0%, var(--accent-plum) 0%, #1A1333 60%) no-repeat;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
.cd-thumb--sea {
|
|
790
|
+
background: radial-gradient(120% 120% at 0% 0%, #2aa3ff 0%, #051a2c 60%) no-repeat;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.cd-thumb-overlay {
|
|
794
|
+
position: absolute;
|
|
795
|
+
inset: 0;
|
|
796
|
+
display: grid;
|
|
797
|
+
place-items: end start;
|
|
798
|
+
padding: 10px;
|
|
799
|
+
font-size: 12px;
|
|
800
|
+
letter-spacing: 0.02em;
|
|
801
|
+
background: linear-gradient(to top, rgba(0,0,0,0.4), rgba(0,0,0,0) 50%);
|
|
802
|
+
color: var(--choco-cream);
|
|
803
|
+
font-weight: 500;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/* Card metadata */
|
|
807
|
+
.cd-meta {
|
|
808
|
+
display: grid;
|
|
809
|
+
gap: 6px;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.cd-badge {
|
|
813
|
+
display: inline-block;
|
|
814
|
+
font-size: 10px;
|
|
815
|
+
padding: 4px 8px;
|
|
816
|
+
border-radius: 999px;
|
|
817
|
+
background: rgba(255, 248, 231, 0.08);
|
|
818
|
+
color: var(--choco-cream);
|
|
819
|
+
border: 1px solid rgba(255, 248, 231, 0.12);
|
|
820
|
+
justify-self: start;
|
|
821
|
+
font-weight: 500;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
.cd-title {
|
|
825
|
+
font-size: 14px;
|
|
826
|
+
font-weight: 600;
|
|
827
|
+
color: var(--choco-milk);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
.cd-author {
|
|
831
|
+
opacity: 0.7;
|
|
832
|
+
font-size: 11px;
|
|
833
|
+
color: var(--choco-cream);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/* CTA button */
|
|
837
|
+
.cd-cta {
|
|
838
|
+
margin-top: 2px;
|
|
839
|
+
font-size: 11px;
|
|
840
|
+
color: #111;
|
|
841
|
+
background: var(--accent-caramel);
|
|
842
|
+
padding: 6px 10px;
|
|
843
|
+
border-radius: var(--r-s);
|
|
844
|
+
justify-self: start;
|
|
845
|
+
font-weight: 600;
|
|
846
|
+
transition: all 0.15s ease;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
.cd-card:hover .cd-cta {
|
|
850
|
+
transform: translateY(-1px);
|
|
851
|
+
box-shadow: 0 4px 12px rgba(210, 105, 30, 0.3);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/* Responsive for card grid */
|
|
855
|
+
@media (max-width: 768px) {
|
|
856
|
+
.cd-drops-grid {
|
|
857
|
+
grid-template-columns: 1fr;
|
|
858
|
+
gap: var(--gap-s);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
.cd-card {
|
|
862
|
+
grid-template-rows: 120px auto auto;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
*/
|
|
866
|
+
</style>
|
|
867
|
+
</head>
|
|
868
|
+
<body>
|
|
869
|
+
<!-- Hero Section -->
|
|
870
|
+
<section class="hero">
|
|
871
|
+
<div class="floating-elements">
|
|
872
|
+
<div class="choco-cube"></div>
|
|
873
|
+
<div class="choco-cube"></div>
|
|
874
|
+
<div class="choco-cube"></div>
|
|
875
|
+
</div>
|
|
876
|
+
|
|
877
|
+
<div class="hero-content highlight-cursor">
|
|
878
|
+
<div class="logo">🍫</div>
|
|
879
|
+
<h1>ちょこっとDrop。<br>世界が咲く。</h1>
|
|
880
|
+
<p class="lead is-plum">Drop a little, bloom a lot.</p>
|
|
881
|
+
<p class="hero-subtitle">
|
|
882
|
+
インストール不要・30秒で体験<br>
|
|
883
|
+
<span style="font-size: 0.85em; opacity: 0.75;">手元の画像・動画・3Dモデルを配置。アカウントや生成サービスの設定は不要です</span>
|
|
884
|
+
</p>
|
|
885
|
+
|
|
886
|
+
<div class="hero-buttons">
|
|
887
|
+
<a href="examples/basic/index.html" class="btn-primary melting-hover" aria-label="今すぐ試す">
|
|
888
|
+
🎮 今すぐ試す
|
|
889
|
+
</a>
|
|
890
|
+
<button class="btn-secondary melting-hover" onclick="scrollToVideo()">
|
|
891
|
+
📖 はじめ方を見る
|
|
892
|
+
</button>
|
|
893
|
+
</div>
|
|
894
|
+
</div>
|
|
895
|
+
</section>
|
|
896
|
+
|
|
897
|
+
<section class="demo-carousel" aria-labelledby="demo-carousel-heading">
|
|
898
|
+
<div class="container">
|
|
899
|
+
<div class="carousel-head">
|
|
900
|
+
<div>
|
|
901
|
+
<h2 id="demo-carousel-heading">好きな世界をワープして体験</h2>
|
|
902
|
+
<p class="carousel-copy">
|
|
903
|
+
ひとつのデモだけで終わらないよう、世界観や用途別にシーンを用意しました。
|
|
904
|
+
スクロールまたはナビボタンで移動し、気になった世界をそのまま開いてください。
|
|
905
|
+
</p>
|
|
906
|
+
</div>
|
|
907
|
+
<div class="carousel-nav" role="group" aria-label="デモギャラリーナビゲーション">
|
|
908
|
+
<button type="button" data-direction="prev" aria-label="前のデモへ">
|
|
909
|
+
←
|
|
910
|
+
</button>
|
|
911
|
+
<button type="button" data-direction="next" aria-label="次のデモへ">
|
|
912
|
+
→
|
|
913
|
+
</button>
|
|
914
|
+
</div>
|
|
915
|
+
</div>
|
|
916
|
+
<div class="carousel-viewport">
|
|
917
|
+
<div class="carousel-track" data-carousel-track>
|
|
918
|
+
<a class="carousel-card" href="examples/basic/index.html" data-carousel-index="0" aria-label="スタータールーム デモを開く">
|
|
919
|
+
<span class="carousel-tag">入門</span>
|
|
920
|
+
<h3 class="carousel-title"><span>🍫</span>スタータールーム</h3>
|
|
921
|
+
<p class="carousel-description">
|
|
922
|
+
カカオ香るラウンジで基本コマンドを順番に体験。初訪でも迷わない導線。
|
|
923
|
+
</p>
|
|
924
|
+
<div class="carousel-meta">🕒 所要1分 / 基本操作</div>
|
|
925
|
+
<span class="carousel-action">この世界へ →</span>
|
|
926
|
+
</a>
|
|
927
|
+
|
|
928
|
+
<a class="carousel-card" href="examples/space/index.html" data-carousel-index="1" aria-label="宇宙遊泳ステーション デモを開く">
|
|
929
|
+
<span class="carousel-tag">照明</span>
|
|
930
|
+
<h3 class="carousel-title"><span>🌌</span>宇宙遊泳ステーション</h3>
|
|
931
|
+
<p class="carousel-description">
|
|
932
|
+
無重力の観測ステーションで光源とマテリアルを切り替え、暗所ワークフローを体感。
|
|
933
|
+
</p>
|
|
934
|
+
<div class="carousel-meta">💡 ライティング / カメラドリー</div>
|
|
935
|
+
<span class="carousel-action">この世界へ →</span>
|
|
936
|
+
</a>
|
|
937
|
+
|
|
938
|
+
<a class="carousel-card" href="examples/music-garden/index.html" data-carousel-index="2" aria-label="音咲き庭園 デモを開く">
|
|
939
|
+
<span class="carousel-tag">音反応</span>
|
|
940
|
+
<h3 class="carousel-title"><span>🎶</span>音咲き庭園</h3>
|
|
941
|
+
<p class="carousel-description">
|
|
942
|
+
夜風の庭に音が流れるたび粒子の花が揺れる。エフェクト系コマンドをまとめてチェック。
|
|
943
|
+
</p>
|
|
944
|
+
<div class="carousel-meta">🎧 オーディオリアクティブ</div>
|
|
945
|
+
<span class="carousel-action">この世界へ →</span>
|
|
946
|
+
</a>
|
|
947
|
+
|
|
948
|
+
<a class="carousel-card" href="examples/wabi-sabi/index.html" data-carousel-index="3" aria-label="侘び寂びアトリエ デモを開く">
|
|
949
|
+
<span class="carousel-tag">質感</span>
|
|
950
|
+
<h3 class="carousel-title"><span>🧘</span>侘び寂びアトリエ</h3>
|
|
951
|
+
<p class="carousel-description">
|
|
952
|
+
木と和紙の工房で静かな灯りを調整しながら、テクスチャとトーンを磨く。
|
|
953
|
+
</p>
|
|
954
|
+
<div class="carousel-meta">🧱 マテリアル / 静的ライト</div>
|
|
955
|
+
<span class="carousel-action">この世界へ →</span>
|
|
956
|
+
</a>
|
|
957
|
+
|
|
958
|
+
<a class="carousel-card" href="examples/toy-city/index.html" data-carousel-index="4" aria-label="AI遊園地 デモを開く">
|
|
959
|
+
<span class="carousel-tag">街づくり</span>
|
|
960
|
+
<h3 class="carousel-title"><span>🧩</span>AI遊園地</h3>
|
|
961
|
+
<p class="carousel-description">
|
|
962
|
+
AIが組み立てるネオン遊園地。ホログラム観覧車とドローンの上をカメラが滑空。
|
|
963
|
+
</p>
|
|
964
|
+
<div class="carousel-meta">🏙️ プロシージャル / カメラ</div>
|
|
965
|
+
<span class="carousel-action">この世界へ →</span>
|
|
966
|
+
</a>
|
|
967
|
+
|
|
968
|
+
<a class="carousel-card" href="examples/pixel-ocean/index.html" data-carousel-index="5" aria-label="ピクセル海底世界 デモを開く">
|
|
969
|
+
<span class="carousel-tag">海景</span>
|
|
970
|
+
<h3 class="carousel-title"><span>🌊</span>ピクセル海底世界</h3>
|
|
971
|
+
<p class="carousel-description">
|
|
972
|
+
ピクセルアートの魚と泡が静かに浮かぶ深海で、色調やモーションコマンドの効きを試す。
|
|
973
|
+
</p>
|
|
974
|
+
<div class="carousel-meta">🌈 カラーシフト / パーティクル</div>
|
|
975
|
+
<span class="carousel-action">この世界へ →</span>
|
|
976
|
+
</a>
|
|
977
|
+
|
|
978
|
+
<a class="carousel-card" href="examples/lofi-room/index.html" data-carousel-index="6" aria-label="ローファイ寝台車 デモを開く">
|
|
979
|
+
<span class="carousel-tag">チル</span>
|
|
980
|
+
<h3 class="carousel-title"><span>🎧</span>ローファイ寝台車</h3>
|
|
981
|
+
<p class="carousel-description">
|
|
982
|
+
夜行列車のキャビンでゆったりとインテリア配置。ムード切替の挙動を確かめられるチル空間。
|
|
983
|
+
</p>
|
|
984
|
+
<div class="carousel-meta">🪑 インテリア / ムード</div>
|
|
985
|
+
<span class="carousel-action">この世界へ →</span>
|
|
986
|
+
</a>
|
|
987
|
+
|
|
988
|
+
<a class="carousel-card" href="examples/react-three-fiber/index.html" data-carousel-index="7" aria-label="R3F 宙港ラボ デモを開く">
|
|
989
|
+
<span class="carousel-tag">React</span>
|
|
990
|
+
<h3 class="carousel-title"><span>⚛️</span>R3F 宙港ラボ</h3>
|
|
991
|
+
<p class="carousel-description">
|
|
992
|
+
React Three Fiber と ChocoDrop の連携実験基地。フロントエンド導入の流れを確認。
|
|
993
|
+
</p>
|
|
994
|
+
<div class="carousel-meta">🧠 React + Three.js</div>
|
|
995
|
+
<span class="carousel-action">この世界へ →</span>
|
|
996
|
+
</a>
|
|
997
|
+
</div>
|
|
998
|
+
</div>
|
|
999
|
+
<div class="carousel-progress" role="tablist" aria-label="デモ一覧の現在位置">
|
|
1000
|
+
<button type="button" data-carousel-dot="0" class="is-active" aria-label="スタータールーム を表示" aria-current="true"></button>
|
|
1001
|
+
<button type="button" data-carousel-dot="1" aria-label="宇宙遊泳ステーション を表示"></button>
|
|
1002
|
+
<button type="button" data-carousel-dot="2" aria-label="音咲き庭園 を表示"></button>
|
|
1003
|
+
<button type="button" data-carousel-dot="3" aria-label="侘び寂びアトリエ を表示"></button>
|
|
1004
|
+
<button type="button" data-carousel-dot="4" aria-label="AI遊園地 を表示"></button>
|
|
1005
|
+
<button type="button" data-carousel-dot="5" aria-label="ピクセル海底世界 を表示"></button>
|
|
1006
|
+
<button type="button" data-carousel-dot="6" aria-label="ローファイ寝台車 を表示"></button>
|
|
1007
|
+
<button type="button" data-carousel-dot="7" aria-label="R3F 宙港ラボ を表示"></button>
|
|
1008
|
+
</div>
|
|
1009
|
+
</div>
|
|
1010
|
+
</section>
|
|
1011
|
+
|
|
1012
|
+
<div class="container">
|
|
1013
|
+
<!-- Bento Section 1: Hero + Video -->
|
|
1014
|
+
<section class="bento-section">
|
|
1015
|
+
<div class="bento-grid bento-row-1">
|
|
1016
|
+
<div class="bento-box">
|
|
1017
|
+
<h2 class="bento-title" id="mini-demo">ブラウザで、今すぐ触れる</h2>
|
|
1018
|
+
<iframe src="examples/basic/index.html"
|
|
1019
|
+
width="100%"
|
|
1020
|
+
height="420"
|
|
1021
|
+
frameborder="0"
|
|
1022
|
+
title="ChocoDrop ミニデモ"
|
|
1023
|
+
loading="lazy"
|
|
1024
|
+
allow="microphone; clipboard-read; clipboard-write"
|
|
1025
|
+
style="border: 1px solid rgba(255,248,231,.12); border-radius: var(--r-m); overflow: hidden;">
|
|
1026
|
+
</iframe>
|
|
1027
|
+
<div style="margin-top: 12px; font-size: 12px; color: rgba(255, 248, 231, 0.7);">
|
|
1028
|
+
<a href="examples/basic/index.html" style="color: var(--choco-milk); text-decoration: none;">全画面で開く →</a><br>
|
|
1029
|
+
<span style="opacity: 0.8;">キーボード: @で起動 / Tabでフォーカス移動 / Enterで実行</span>
|
|
1030
|
+
</div>
|
|
1031
|
+
</div>
|
|
1032
|
+
|
|
1033
|
+
<div class="bento-box" id="video-section">
|
|
1034
|
+
<h2 class="bento-title">手元の素材で、はじめよう</h2>
|
|
1035
|
+
<div class="demo-embed">
|
|
1036
|
+
<div style="padding: 24px; line-height: 1.9;"><ol><li>デモを開く</li><li>「Import」で画像・動画・GLBを選ぶ</li><li>自動でシーンに配置される</li></ol><a href="getting-started.html">ローカル起動・Codex・Claude Code連携の手順 →</a><p>生成した素材も、普段のツールから保存して使えます。</p></div>
|
|
1037
|
+
</div>
|
|
1038
|
+
</div>
|
|
1039
|
+
</div>
|
|
1040
|
+
</section>
|
|
1041
|
+
|
|
1042
|
+
<!-- Bento Section 2: 3つの価値 -->
|
|
1043
|
+
<section class="bento-section">
|
|
1044
|
+
<div class="bento-grid bento-row-2">
|
|
1045
|
+
<div class="bento-box highlight-cursor">
|
|
1046
|
+
<span class="feature-icon">🎮</span>
|
|
1047
|
+
<h3 class="bento-title">デモで触って感覚をつかむ</h3>
|
|
1048
|
+
<p class="bento-description">
|
|
1049
|
+
インストール不要でブラウザで体験。<br>
|
|
1050
|
+
ブックマークレットで既存サイトにも。<br>
|
|
1051
|
+
まずは触って、雰囲気を感じてみよう。
|
|
1052
|
+
</p>
|
|
1053
|
+
</div>
|
|
1054
|
+
|
|
1055
|
+
<div class="bento-box highlight-cursor">
|
|
1056
|
+
<span class="feature-icon">🔧</span>
|
|
1057
|
+
<h3 class="bento-title">気に入ったらプロジェクトに導入</h3>
|
|
1058
|
+
<p class="bento-description">
|
|
1059
|
+
npm install で自分のThree.jsプロジェクトに。<br>
|
|
1060
|
+
SDK組み込みで本格的に活用。<br>
|
|
1061
|
+
開発環境に合わせて柔軟に対応。
|
|
1062
|
+
</p>
|
|
1063
|
+
</div>
|
|
1064
|
+
|
|
1065
|
+
<div class="bento-box highlight-cursor">
|
|
1066
|
+
<span class="feature-icon">✨</span>
|
|
1067
|
+
<h3 class="bento-title">いつもの制作ツールとつなぐ</h3>
|
|
1068
|
+
<p class="bento-description">
|
|
1069
|
+
お好きなAI・MCP・CLIで作った素材を配置。<br>
|
|
1070
|
+
Codex・Claude Codeから呼べるローカルMCPも。<br>
|
|
1071
|
+
<a href="getting-started.html">接続方法を見る →</a>
|
|
1072
|
+
</p>
|
|
1073
|
+
</div>
|
|
1074
|
+
</div>
|
|
1075
|
+
</section>
|
|
1076
|
+
|
|
1077
|
+
<!-- Bento Section 3: Gallery + Challenge (アルファ版では非表示) -->
|
|
1078
|
+
<!--
|
|
1079
|
+
<section class="bento-section">
|
|
1080
|
+
<div class="bento-grid bento-row-3">
|
|
1081
|
+
<div class="bento-box">
|
|
1082
|
+
<h3 class="bento-title" id="weekly-drops">今週のしずくたち</h3>
|
|
1083
|
+
<div class="cd-drops-grid">
|
|
1084
|
+
<a class="cd-card" href="examples/music-garden/index.html" aria-label="夜桜の庭 をこのテーマで作る">
|
|
1085
|
+
<div class="cd-thumb" role="img" aria-label="夜桜の庭のサンプルビジュアル">
|
|
1086
|
+
<div class="cd-thumb-overlay">夜桜の庭</div>
|
|
1087
|
+
</div>
|
|
1088
|
+
<div class="cd-meta">
|
|
1089
|
+
<span class="cd-badge">テーマ: 音楽の花園</span>
|
|
1090
|
+
<strong class="cd-title">夜桜、音に咲く</strong>
|
|
1091
|
+
<span class="cd-author">by demo_user</span>
|
|
1092
|
+
</div>
|
|
1093
|
+
<span class="cd-cta">このテーマで作る →</span>
|
|
1094
|
+
</a>
|
|
1095
|
+
|
|
1096
|
+
<a class="cd-card" href="examples/pixel-rpg/index.html" aria-label="失われた王国の広場 をこのテーマで作る">
|
|
1097
|
+
<div class="cd-thumb cd-thumb--rpg" role="img" aria-label="失われた王国の広場のサンプルビジュアル">
|
|
1098
|
+
<div class="cd-thumb-overlay">失われた王国の広場</div>
|
|
1099
|
+
</div>
|
|
1100
|
+
<div class="cd-meta">
|
|
1101
|
+
<span class="cd-badge">テーマ: RPG王国</span>
|
|
1102
|
+
<strong class="cd-title">朝霧のアーチ</strong>
|
|
1103
|
+
<span class="cd-author">by demo_user</span>
|
|
1104
|
+
</div>
|
|
1105
|
+
<span class="cd-cta">このテーマで作る →</span>
|
|
1106
|
+
</a>
|
|
1107
|
+
|
|
1108
|
+
<a class="cd-card" href="examples/pixel-ocean/index.html" aria-label="灯るクラゲ街 をこのテーマで作る">
|
|
1109
|
+
<div class="cd-thumb cd-thumb--sea" role="img" aria-label="海底のサンプルビジュアル">
|
|
1110
|
+
<div class="cd-thumb-overlay">灯るクラゲ街</div>
|
|
1111
|
+
</div>
|
|
1112
|
+
<div class="cd-meta">
|
|
1113
|
+
<span class="cd-badge">テーマ: 海底世界</span>
|
|
1114
|
+
<strong class="cd-title">ブルー・ドリフト</strong>
|
|
1115
|
+
<span class="cd-author">by demo_user</span>
|
|
1116
|
+
</div>
|
|
1117
|
+
<span class="cd-cta">このテーマで作る →</span>
|
|
1118
|
+
</a>
|
|
1119
|
+
</div>
|
|
1120
|
+
</div>
|
|
1121
|
+
|
|
1122
|
+
<div class="bento-box challenge-box">
|
|
1123
|
+
<h3 class="bento-title">🏆 今週のチャレンジ</h3>
|
|
1124
|
+
<p class="bento-description">
|
|
1125
|
+
お題:「未来の和室」<br>
|
|
1126
|
+
テクノロジーと和の融合を表現しよう!<br>
|
|
1127
|
+
#ChocoDrop #WeeklyChallenge
|
|
1128
|
+
</p>
|
|
1129
|
+
<a href="examples/basic/index.html" class="challenge-button melting-hover">
|
|
1130
|
+
参加する
|
|
1131
|
+
</a>
|
|
1132
|
+
</div>
|
|
1133
|
+
</div>
|
|
1134
|
+
</section>
|
|
1135
|
+
-->
|
|
1136
|
+
|
|
1137
|
+
<!-- Bento Section 3.5: Bookmarklet CTA -->
|
|
1138
|
+
<section class="bento-section" style="padding: 60px 0;">
|
|
1139
|
+
<div class="bento-grid" style="grid-template-columns: 1fr; max-width: 800px; margin: 0 auto;">
|
|
1140
|
+
<div class="bento-box" style="background: linear-gradient(135deg, rgba(139, 92, 246, 0.1), rgba(139, 108, 71, 0.08)); border: 2px solid rgba(139, 92, 246, 0.3); text-align: center; padding: 48px 40px;">
|
|
1141
|
+
<h3 class="bento-title" style="font-size: 2rem; margin-bottom: 16px;">🍫 ブックマークレットで試す</h3>
|
|
1142
|
+
<p class="bento-description" style="margin-bottom: 24px; font-size: 1.1rem; color: var(--choco-cream); opacity: 0.9;">
|
|
1143
|
+
ローカルdaemonを起動して、Three.jsのサンプルサイトで<strong>今すぐ</strong>試せます。
|
|
1144
|
+
</p>
|
|
1145
|
+
<a href="examples/bookmarklet-v2.html" class="btn-primary melting-hover" style="font-size: 1.2rem; padding: 18px 40px; display: inline-block;">
|
|
1146
|
+
📖 ブックマークレット登録ページへ
|
|
1147
|
+
</a>
|
|
1148
|
+
<p style="margin-top: 16px; font-size: 0.95rem; opacity: 0.7; color: var(--choco-cream);">
|
|
1149
|
+
⚠️ <strong>制限:</strong> 対象サイトの構成によって利用できない場合があります。まずは上のBasicデモでファイル配置をお試しください。
|
|
1150
|
+
</p>
|
|
1151
|
+
</div>
|
|
1152
|
+
</div>
|
|
1153
|
+
</section>
|
|
1154
|
+
|
|
1155
|
+
<!-- Bento Section 4: Documentation -->
|
|
1156
|
+
<section class="bento-section">
|
|
1157
|
+
<div class="bento-grid bento-row-4">
|
|
1158
|
+
<div class="bento-box">
|
|
1159
|
+
<h3 class="bento-title">開発者向けドキュメント</h3>
|
|
1160
|
+
<p class="bento-description" style="margin-bottom: 24px;">
|
|
1161
|
+
npm install chocodrop で、あなたのプロジェクトにも導入できます。
|
|
1162
|
+
</p>
|
|
1163
|
+
<div style="display: flex; gap: 16px; flex-wrap: wrap;">
|
|
1164
|
+
<a href="https://github.com/nyukicorn/chocodrop" class="btn-secondary melting-hover" style="font-size: 14px; padding: 12px 20px;">
|
|
1165
|
+
📚 README
|
|
1166
|
+
</a>
|
|
1167
|
+
<a href="getting-started.html" class="btn-secondary melting-hover" style="font-size: 14px; padding: 12px 20px;">
|
|
1168
|
+
📖 Docs
|
|
1169
|
+
</a>
|
|
1170
|
+
<a href="https://www.npmjs.com/package/chocodrop" class="btn-secondary melting-hover" style="font-size: 14px; padding: 12px 20px;">
|
|
1171
|
+
📦 npm
|
|
1172
|
+
</a>
|
|
1173
|
+
</div>
|
|
1174
|
+
</div>
|
|
1175
|
+
</div>
|
|
1176
|
+
</section>
|
|
1177
|
+
</div>
|
|
1178
|
+
|
|
1179
|
+
<!-- Footer -->
|
|
1180
|
+
<footer>
|
|
1181
|
+
<div class="container">
|
|
1182
|
+
<div class="footer-links">
|
|
1183
|
+
<a href="https://github.com/nyukicorn/chocodrop">GitHub</a>
|
|
1184
|
+
<a href="https://github.com/nyukicorn/chocodrop/blob/main/LICENSE">MIT License</a>
|
|
1185
|
+
<a href="https://github.com/nyukicorn/chocodrop/blob/main/README.md">README</a>
|
|
1186
|
+
<a href="getting-started.html">Docs</a>
|
|
1187
|
+
</div>
|
|
1188
|
+
<p>© 2025 ChocoDrop. Made with 🍫 and ✨</p>
|
|
1189
|
+
</div>
|
|
1190
|
+
</footer>
|
|
1191
|
+
|
|
1192
|
+
<script>
|
|
1193
|
+
// Demo carousel interactions
|
|
1194
|
+
const carouselTrack = document.querySelector('[data-carousel-track]');
|
|
1195
|
+
if (carouselTrack) {
|
|
1196
|
+
const cards = Array.from(carouselTrack.querySelectorAll('.carousel-card'));
|
|
1197
|
+
const navButtons = Array.from(document.querySelectorAll('.carousel-nav button'));
|
|
1198
|
+
const dots = Array.from(document.querySelectorAll('[data-carousel-dot]'));
|
|
1199
|
+
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
1200
|
+
let currentIndex = 0;
|
|
1201
|
+
let isProgrammatic = false;
|
|
1202
|
+
let autoplayTimer = null;
|
|
1203
|
+
let scrollDebounce = null;
|
|
1204
|
+
|
|
1205
|
+
const getStep = () => {
|
|
1206
|
+
if (cards.length <= 1) {
|
|
1207
|
+
return cards[0]?.offsetWidth ?? 0;
|
|
1208
|
+
}
|
|
1209
|
+
return cards[1].offsetLeft - cards[0].offsetLeft;
|
|
1210
|
+
};
|
|
1211
|
+
|
|
1212
|
+
const updateDots = (index) => {
|
|
1213
|
+
dots.forEach((dot, dotIndex) => {
|
|
1214
|
+
const isActive = dotIndex === index;
|
|
1215
|
+
dot.classList.toggle('is-active', isActive);
|
|
1216
|
+
dot.setAttribute('aria-current', isActive ? 'true' : 'false');
|
|
1217
|
+
});
|
|
1218
|
+
};
|
|
1219
|
+
|
|
1220
|
+
const updateNav = (index) => {
|
|
1221
|
+
const maxIndex = cards.length - 1;
|
|
1222
|
+
navButtons.forEach((btn) => {
|
|
1223
|
+
if (btn.dataset.direction === 'prev') {
|
|
1224
|
+
btn.disabled = index <= 0;
|
|
1225
|
+
} else {
|
|
1226
|
+
btn.disabled = index >= maxIndex;
|
|
1227
|
+
}
|
|
1228
|
+
});
|
|
1229
|
+
};
|
|
1230
|
+
|
|
1231
|
+
const scrollToIndex = (index) => {
|
|
1232
|
+
const step = getStep();
|
|
1233
|
+
if (!step) return;
|
|
1234
|
+
const maxIndex = cards.length - 1;
|
|
1235
|
+
const clamped = Math.max(0, Math.min(index, maxIndex));
|
|
1236
|
+
isProgrammatic = true;
|
|
1237
|
+
carouselTrack.scrollTo({
|
|
1238
|
+
left: clamped * step,
|
|
1239
|
+
behavior: 'smooth'
|
|
1240
|
+
});
|
|
1241
|
+
currentIndex = clamped;
|
|
1242
|
+
updateDots(currentIndex);
|
|
1243
|
+
updateNav(currentIndex);
|
|
1244
|
+
window.setTimeout(() => {
|
|
1245
|
+
isProgrammatic = false;
|
|
1246
|
+
}, 420);
|
|
1247
|
+
};
|
|
1248
|
+
|
|
1249
|
+
const stopAutoplay = () => {
|
|
1250
|
+
if (autoplayTimer) {
|
|
1251
|
+
window.clearInterval(autoplayTimer);
|
|
1252
|
+
autoplayTimer = null;
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
|
|
1256
|
+
const startAutoplay = () => {
|
|
1257
|
+
stopAutoplay();
|
|
1258
|
+
if (prefersReducedMotion.matches || cards.length <= 1) return;
|
|
1259
|
+
autoplayTimer = window.setInterval(() => {
|
|
1260
|
+
const nextIndex = (currentIndex + 1) % cards.length;
|
|
1261
|
+
scrollToIndex(nextIndex);
|
|
1262
|
+
}, 12000);
|
|
1263
|
+
};
|
|
1264
|
+
|
|
1265
|
+
navButtons.forEach((btn) => {
|
|
1266
|
+
btn.addEventListener('click', () => {
|
|
1267
|
+
const direction = btn.dataset.direction === 'prev' ? -1 : 1;
|
|
1268
|
+
scrollToIndex(currentIndex + direction);
|
|
1269
|
+
});
|
|
1270
|
+
});
|
|
1271
|
+
|
|
1272
|
+
dots.forEach((dot) => {
|
|
1273
|
+
dot.addEventListener('click', () => {
|
|
1274
|
+
const targetIndex = Number(dot.dataset.carouselDot);
|
|
1275
|
+
scrollToIndex(targetIndex);
|
|
1276
|
+
});
|
|
1277
|
+
});
|
|
1278
|
+
|
|
1279
|
+
carouselTrack.addEventListener('scroll', () => {
|
|
1280
|
+
if (isProgrammatic) return;
|
|
1281
|
+
window.clearTimeout(scrollDebounce);
|
|
1282
|
+
scrollDebounce = window.setTimeout(() => {
|
|
1283
|
+
const step = getStep();
|
|
1284
|
+
if (!step) return;
|
|
1285
|
+
const rawIndex = Math.round(carouselTrack.scrollLeft / step);
|
|
1286
|
+
const nextIndex = Math.max(0, Math.min(rawIndex, cards.length - 1));
|
|
1287
|
+
if (nextIndex !== currentIndex) {
|
|
1288
|
+
currentIndex = nextIndex;
|
|
1289
|
+
updateDots(currentIndex);
|
|
1290
|
+
updateNav(currentIndex);
|
|
1291
|
+
}
|
|
1292
|
+
}, 80);
|
|
1293
|
+
});
|
|
1294
|
+
|
|
1295
|
+
window.addEventListener('resize', () => {
|
|
1296
|
+
scrollToIndex(currentIndex);
|
|
1297
|
+
});
|
|
1298
|
+
|
|
1299
|
+
carouselTrack.addEventListener('pointerdown', stopAutoplay);
|
|
1300
|
+
carouselTrack.addEventListener('mouseenter', stopAutoplay);
|
|
1301
|
+
carouselTrack.addEventListener('mouseleave', startAutoplay);
|
|
1302
|
+
document.addEventListener('visibilitychange', () => {
|
|
1303
|
+
if (document.hidden) {
|
|
1304
|
+
stopAutoplay();
|
|
1305
|
+
} else {
|
|
1306
|
+
startAutoplay();
|
|
1307
|
+
}
|
|
1308
|
+
});
|
|
1309
|
+
const handleMotionPrefChange = () => {
|
|
1310
|
+
if (prefersReducedMotion.matches) {
|
|
1311
|
+
stopAutoplay();
|
|
1312
|
+
} else {
|
|
1313
|
+
startAutoplay();
|
|
1314
|
+
}
|
|
1315
|
+
};
|
|
1316
|
+
if (typeof prefersReducedMotion.addEventListener === 'function') {
|
|
1317
|
+
prefersReducedMotion.addEventListener('change', handleMotionPrefChange);
|
|
1318
|
+
} else if (typeof prefersReducedMotion.addListener === 'function') {
|
|
1319
|
+
prefersReducedMotion.addListener(handleMotionPrefChange);
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
updateDots(currentIndex);
|
|
1323
|
+
updateNav(currentIndex);
|
|
1324
|
+
startAutoplay();
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
// Scroll to video section
|
|
1328
|
+
function scrollToVideo() {
|
|
1329
|
+
document.getElementById('video-section').scrollIntoView({
|
|
1330
|
+
behavior: 'smooth',
|
|
1331
|
+
block: 'center'
|
|
1332
|
+
});
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
// Simple cursor follow effect for hero
|
|
1336
|
+
const heroContent = document.querySelector('.hero-content');
|
|
1337
|
+
if (heroContent) {
|
|
1338
|
+
heroContent.addEventListener('mousemove', (e) => {
|
|
1339
|
+
const rect = heroContent.getBoundingClientRect();
|
|
1340
|
+
const x = e.clientX - rect.left;
|
|
1341
|
+
const y = e.clientY - rect.top;
|
|
1342
|
+
|
|
1343
|
+
const highlight = heroContent.querySelector('::after');
|
|
1344
|
+
if (highlight) {
|
|
1345
|
+
highlight.style.left = x + 'px';
|
|
1346
|
+
highlight.style.top = y + 'px';
|
|
1347
|
+
}
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
// Hidden easter egg
|
|
1352
|
+
let secretCode = '';
|
|
1353
|
+
document.addEventListener('keypress', (e) => {
|
|
1354
|
+
secretCode += e.key;
|
|
1355
|
+
if (secretCode.includes('月光')) {
|
|
1356
|
+
// Add moon reflection to chocolate cubes
|
|
1357
|
+
document.querySelectorAll('.choco-cube').forEach(cube => {
|
|
1358
|
+
cube.style.boxShadow = '0 10px 30px rgba(255, 255, 255, 0.3), inset 0 0 20px rgba(255, 255, 255, 0.2)';
|
|
1359
|
+
setTimeout(() => {
|
|
1360
|
+
cube.style.boxShadow = '0 10px 30px rgba(0,0,0,0.3)';
|
|
1361
|
+
}, 3000);
|
|
1362
|
+
});
|
|
1363
|
+
secretCode = '';
|
|
1364
|
+
}
|
|
1365
|
+
// Reset if too long
|
|
1366
|
+
if (secretCode.length > 10) secretCode = '';
|
|
1367
|
+
});
|
|
1368
|
+
</script>
|
|
1369
|
+
</body>
|
|
1370
|
+
</html>
|