allknowingroger commited on
Commit
bd9d750
·
verified ·
1 Parent(s): d8cf6a3

Upload 30 files

Browse files
3coBt1IXriuQsgcXB.html ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://dodecahedra.websim.ai" />
2
+ <title>Dodecahedra Animation in WebGL</title>
3
+ <style>
4
+ body {
5
+ margin: 0;
6
+ overflow: hidden;
7
+ background-color: #000;
8
+ font-family: Arial, sans-serif;
9
+ }
10
+ #info {
11
+ position: absolute;
12
+ top: 10px;
13
+ width: 100%;
14
+ text-align: center;
15
+ color: #fff;
16
+ }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <div id="info">Dodecahedra Animation in WebGL<br/>
21
+ <a href="https://websim.ai/mathshapes" style="color: #8af;">Explore More Mathematical Shapes</a>
22
+ </div>
23
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
24
+ <script>
25
+ let scene, camera, renderer, dodecahedra = [];
26
+
27
+ function init() {
28
+ scene = new THREE.Scene();
29
+ camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
30
+ camera.position.z = 5;
31
+
32
+ renderer = new THREE.WebGLRenderer({ antialias: true });
33
+ renderer.setSize(window.innerWidth, window.innerHeight);
34
+ document.body.appendChild(renderer.domElement);
35
+
36
+ const geometry = new THREE.DodecahedronGeometry(0.5);
37
+ const material = new THREE.MeshPhongMaterial({ color: 0x00ff00, shininess: 100 });
38
+
39
+ for (let i = 0; i < 20; i++) {
40
+ const dodecahedron = new THREE.Mesh(geometry, material);
41
+ dodecahedron.position.set(
42
+ Math.random() * 8 - 4,
43
+ Math.random() * 8 - 4,
44
+ Math.random() * 8 - 4
45
+ );
46
+ scene.add(dodecahedron);
47
+ dodecahedra.push(dodecahedron);
48
+ }
49
+
50
+ const light = new THREE.PointLight(0xffffff, 1, 100);
51
+ light.position.set(0, 0, 10);
52
+ scene.add(light);
53
+
54
+ window.addEventListener('resize', onWindowResize, false);
55
+ }
56
+
57
+ function onWindowResize() {
58
+ camera.aspect = window.innerWidth / window.innerHeight;
59
+ camera.updateProjectionMatrix();
60
+ renderer.setSize(window.innerWidth, window.innerHeight);
61
+ }
62
+
63
+ function animate() {
64
+ requestAnimationFrame(animate);
65
+
66
+ dodecahedra.forEach((d, index) => {
67
+ d.rotation.x += 0.01 * (index % 3 + 1);
68
+ d.rotation.y += 0.02 * (index % 3 + 1);
69
+ d.position.y = Math.sin(Date.now() * 0.001 + index) * 2;
70
+ });
71
+
72
+ renderer.render(scene, camera);
73
+ }
74
+
75
+ init();
76
+ animate();
77
+ </script>
78
+ </body></html>
3idxEhBNkScb0PfiO.html ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Sina Daily Funny GIFs - WebSim</title>
2
+ <meta charset="utf-8">
3
+ <meta name="viewport" content="width=device-width,initial-scale=1">
4
+ <style type="text/css">
5
+ * {
6
+ padding: 0;
7
+ margin: 0;
8
+ }
9
+
10
+ body {
11
+ background: #333;
12
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
13
+ }
14
+
15
+ ul {
16
+ list-style: none;
17
+ }
18
+
19
+ li {
20
+ text-align: center;
21
+ border: 1px solid #d8d5d5;
22
+ margin: 18px 8px;
23
+ padding: 16px 0px;
24
+ border-radius: 10px;
25
+ background: #fff;
26
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
27
+ transition: transform 0.2s ease-in-out;
28
+ }
29
+
30
+ li:hover {
31
+ transform: translateY(-5px);
32
+ }
33
+
34
+ img {
35
+ width: 100%;
36
+ border-radius: 5px;
37
+ }
38
+
39
+ h1 {
40
+ font-size: 16px;
41
+ text-align: left;
42
+ margin: 10px 20px 20px;
43
+ font-weight: 500;
44
+ color: #333;
45
+ }
46
+
47
+ h2 {
48
+ text-align: right;
49
+ font-size: 12px;
50
+ font-weight: 400;
51
+ margin: 9px 12px -7px 0;
52
+ color: #666;
53
+ }
54
+
55
+ @media screen and (min-width:440px) {
56
+ body {
57
+ width: 440px;
58
+ margin: 0 auto;
59
+ }
60
+ }
61
+
62
+ section {
63
+ position: fixed;
64
+ bottom: 30px;
65
+ right: 20px;
66
+ display: flex;
67
+ gap: 10px;
68
+ }
69
+
70
+ a {
71
+ background: #598263;
72
+ color: #fff;
73
+ padding: 10px 20px;
74
+ border-radius: 10px;
75
+ font-size: 14px;
76
+ text-decoration: none;
77
+ transition: background-color 0.2s ease-in-out;
78
+ cursor: pointer;
79
+ }
80
+
81
+ a:hover {
82
+ background: #4a6e53;
83
+ }
84
+
85
+ .page {
86
+ position: fixed;
87
+ right: 8px;
88
+ top: 8px;
89
+ font-size: 14px;
90
+ padding: 4px 8px;
91
+ color: #fff;
92
+ background: rgba(89, 130, 99, 0.8);
93
+ border-radius: 8px;
94
+ }
95
+
96
+ .container {
97
+ padding-bottom: 60px;
98
+ }
99
+
100
+ .header {
101
+ background: #598263;
102
+ color: #fff;
103
+ padding: 20px;
104
+ text-align: center;
105
+ margin-bottom: 20px;
106
+ }
107
+
108
+ .header h1 {
109
+ font-size: 24px;
110
+ margin: 0;
111
+ color: #fff;
112
+ }
113
+
114
+ .loading {
115
+ text-align: center;
116
+ color: #fff;
117
+ padding: 20px;
118
+ font-size: 18px;
119
+ }
120
+ </style>
121
+ </head>
122
+ <body>
123
+ <div class="container">
124
+ <div class="header">
125
+ <h1>Sina Daily Funny GIFs</h1>
126
+ </div>
127
+ <span class="page"></span>
128
+ <ul></ul>
129
+ <section>
130
+ <a onclick="prePage()">Previous</a>
131
+ <a onclick="nextPage()">Next</a>
132
+ </section>
133
+ </div>
134
+
135
+ <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
136
+ <script type="text/javascript">
137
+ var refresh = function (page) {
138
+ $('ul').html('<div class="loading">Loading...</div>');
139
+ $.ajax({
140
+ type: 'GET',
141
+ url: 'https://interface.sina.cn/tech/gif/album.d.json?num=' + 20 + '&page=' + page + '&jsoncallback=jsonp1&_=' + new Date().getTime(),
142
+ async: true,
143
+ dataType: "jsonp",
144
+ jsonp: "callback",
145
+ jsonpCallback: "jsonp1",
146
+ success: function (msg) {
147
+ $('ul').empty();
148
+ msg.data.forEach(function (currentValue, index, arr) {
149
+ $('ul').append('<li><h1>' + msg.data[index].name + '</h1><img src="' + msg.data[index].img_url.replace(/^http:/, 'https:') + '" alt="' + msg.data[index].name + '"/><h2>' + msg.data[index].createtime + '</h2></li>')
150
+ })
151
+ },
152
+ error: function() {
153
+ $('ul').html('<div class="loading">Loading failed, please try again</div>');
154
+ }
155
+ })
156
+ $('.page').html('Current Page: ' + page);
157
+ }
158
+
159
+ refresh(1);
160
+ var page = 1;
161
+ var prePage = function () {
162
+ if (page == 1) {
163
+ alert('This is the first page');
164
+ } else {
165
+ page--;
166
+ refresh(page);
167
+ }
168
+ }
169
+ var nextPage = function () {
170
+ page++;
171
+ refresh(page);
172
+ }
173
+ </script>
174
+
175
+ </body></html>
4lUqnsnO3ShitR5ow.html ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/lottery"><title>Lucky Draw</title>
2
+ <style>
3
+ * {
4
+ margin: 0;
5
+ padding: 0;
6
+ }
7
+
8
+ body {
9
+ font-family: Arial, sans-serif;
10
+ background: linear-gradient(135deg, #83a4d4, #b6fbff);
11
+ display: flex;
12
+ justify-content: center;
13
+ align-items: center;
14
+ height: 100vh;
15
+ color: #333;
16
+ }
17
+
18
+ .container {
19
+ background: rgba(255, 255, 255, 0.9);
20
+ border-radius: 10px;
21
+ padding: 30px;
22
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.37);
23
+ text-align: center;
24
+ }
25
+
26
+ h2 {
27
+ margin-bottom: 20px;
28
+ color: #4a4a4a;
29
+ }
30
+
31
+ #list {
32
+ display: block;
33
+ margin: 20px 0;
34
+ font-size: 24px;
35
+ font-weight: bold;
36
+ color: #e74c3c;
37
+ height: 40px;
38
+ line-height: 40px;
39
+ }
40
+
41
+ button {
42
+ background: #3498db;
43
+ border: none;
44
+ color: white;
45
+ padding: 10px 20px;
46
+ text-align: center;
47
+ text-decoration: none;
48
+ display: inline-block;
49
+ font-size: 16px;
50
+ margin: 4px 2px;
51
+ cursor: pointer;
52
+ border-radius: 5px;
53
+ transition: background 0.3s ease;
54
+ }
55
+
56
+ button:hover {
57
+ background: #2980b9;
58
+ }
59
+
60
+ button:disabled {
61
+ background: #95a5a6;
62
+ cursor: not-allowed;
63
+ }
64
+
65
+ .decription {
66
+ margin-top: 30px;
67
+ font-style: italic;
68
+ color: #7f8c8d;
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="container">
74
+ <h2>WebSim Lucky Draw</h2>
75
+ <div id="list">Ready to Start</div>
76
+ <button id="start">Start</button>
77
+ <button id="stop" disabled>Stop</button>
78
+ <div class="decription">
79
+ <p>Press Start or hit Enter to begin. Press Stop or hit Enter again to end the draw.</p>
80
+ </div>
81
+ </div>
82
+
83
+ <script>
84
+ const list = document.getElementById('list');
85
+ const start = document.getElementById('start');
86
+ const stop = document.getElementById('stop');
87
+ const prizes = [
88
+ "WebSim Pro Account",
89
+ "Virtual Reality Headset",
90
+ "AI Assistant Bot",
91
+ "Quantum Computer Access",
92
+ "Holographic Display",
93
+ "Neural Interface",
94
+ "Time Machine Demo",
95
+ "Space Tourism Ticket",
96
+ "Nanomedicine Treatment",
97
+ "Better luck next time!"
98
+ ];
99
+ let timer = null;
100
+
101
+ start.addEventListener('click', startDraw);
102
+ stop.addEventListener('click', stopDraw);
103
+ document.addEventListener('keyup', handleKeyPress);
104
+
105
+ function startDraw() {
106
+ clearInterval(timer);
107
+ timer = setInterval(() => {
108
+ const randomPrize = prizes[Math.floor(Math.random() * prizes.length)];
109
+ list.textContent = randomPrize;
110
+ }, 50);
111
+ start.disabled = true;
112
+ stop.disabled = false;
113
+ }
114
+
115
+ function stopDraw() {
116
+ clearInterval(timer);
117
+ start.disabled = false;
118
+ stop.disabled = true;
119
+ }
120
+
121
+ function handleKeyPress(e) {
122
+ if (e.key === 'Enter') {
123
+ if (start.disabled) {
124
+ stopDraw();
125
+ } else {
126
+ startDraw();
127
+ }
128
+ }
129
+ }
130
+ </script>
131
+ </body>
132
+ </html>
7FQ8tde0NjsOEkivO.html ADDED
@@ -0,0 +1,354 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>Stormy Pet Rescue: Raining Cats and Dogs!</title>
3
+ <style>
4
+ body, html {
5
+ margin: 0;
6
+ padding: 0;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ font-family: 'Comic Sans MS', cursive, sans-serif;
10
+ background: linear-gradient(to bottom, #1a2a3a, #2c3e50);
11
+ user-select: none;
12
+ }
13
+ #game-container {
14
+ width: 100%;
15
+ height: 100%;
16
+ position: relative;
17
+ overflow: hidden;
18
+ }
19
+ #trampoline {
20
+ width: 100px;
21
+ height: 20px;
22
+ background: linear-gradient(to bottom, #FF69B4, #C71585);
23
+ position: absolute;
24
+ bottom: 20px;
25
+ border-radius: 50%;
26
+ box-shadow: 0 5px 0 #8B008B, 0 0 10px rgba(255,255,255,0.5);
27
+ cursor: grab;
28
+ z-index: 10;
29
+ transition: transform 0.1s;
30
+ }
31
+ #trampoline:active {
32
+ cursor: grabbing;
33
+ transform: scale(0.95);
34
+ }
35
+ .animal {
36
+ position: absolute;
37
+ width: 50px;
38
+ height: 50px;
39
+ background-size: contain;
40
+ background-repeat: no-repeat;
41
+ z-index: 5;
42
+ filter: drop-shadow(0 0 5px rgba(255,255,255,0.5));
43
+ }
44
+ .cat { background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="90">🐱</text></svg>'); }
45
+ .dog { background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y=".9em" font-size="90">🐶</text></svg>'); }
46
+ #score, #level {
47
+ position: absolute;
48
+ font-size: 24px;
49
+ color: #FFFFFF;
50
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
51
+ z-index: 15;
52
+ }
53
+ #score { top: 10px; left: 10px; }
54
+ #level { top: 10px; right: 10px; }
55
+ #game-over {
56
+ position: absolute;
57
+ top: 50%;
58
+ left: 50%;
59
+ transform: translate(-50%, -50%);
60
+ background-color: rgba(255, 255, 255, 0.9);
61
+ padding: 20px;
62
+ border-radius: 10px;
63
+ text-align: center;
64
+ display: none;
65
+ z-index: 20;
66
+ box-shadow: 0 0 20px rgba(0,0,0,0.5);
67
+ }
68
+ #restart-btn {
69
+ margin-top: 10px;
70
+ padding: 10px 20px;
71
+ font-size: 18px;
72
+ background-color: #4CAF50;
73
+ color: white;
74
+ border: none;
75
+ border-radius: 5px;
76
+ cursor: pointer;
77
+ transition: background-color 0.3s;
78
+ }
79
+ #restart-btn:hover {
80
+ background-color: #45a049;
81
+ }
82
+ .cloud {
83
+ position: absolute;
84
+ background-color: #7f8c8d;
85
+ border-radius: 50%;
86
+ opacity: 0.8;
87
+ animation: float 20s infinite linear;
88
+ z-index: 1;
89
+ box-shadow: 0 0 10px rgba(0,0,0,0.3);
90
+ }
91
+ @keyframes float {
92
+ 0% { transform: translateX(100%); }
93
+ 100% { transform: translateX(-100%); }
94
+ }
95
+ .lightning {
96
+ position: absolute;
97
+ width: 100%;
98
+ height: 100%;
99
+ background-color: rgba(255, 255, 255, 0.3);
100
+ opacity: 0;
101
+ z-index: 2;
102
+ pointer-events: none;
103
+ }
104
+ .raindrop {
105
+ position: absolute;
106
+ width: 2px;
107
+ height: 20px;
108
+ background: linear-gradient(to bottom, rgba(174, 194, 224, 0), rgba(174, 194, 224, 0.5));
109
+ opacity: 0.6;
110
+ z-index: 3;
111
+ }
112
+ #pause-btn {
113
+ position: absolute;
114
+ top: 10px;
115
+ left: 50%;
116
+ transform: translateX(-50%);
117
+ padding: 5px 10px;
118
+ font-size: 16px;
119
+ background-color: rgba(255, 255, 255, 0.7);
120
+ border: none;
121
+ border-radius: 5px;
122
+ cursor: pointer;
123
+ z-index: 15;
124
+ }
125
+ </style>
126
+ </head>
127
+ <body>
128
+ <div id="game-container">
129
+ <div id="score">Score: <span id="score-value">0</span></div>
130
+ <div id="level">Level: <span id="level-value">1</span></div>
131
+ <button id="pause-btn">Pause</button>
132
+ <div id="trampoline"></div>
133
+ <div id="game-over">
134
+ <h2>Game Over!</h2>
135
+ <p>Your final score: <span id="final-score"></span></p>
136
+ <p>Highest level: <span id="final-level"></span></p>
137
+ <button id="restart-btn">Play Again</button>
138
+ </div>
139
+ <div class="lightning"></div>
140
+ </div>
141
+
142
+ <script>
143
+ const gameContainer = document.getElementById('game-container');
144
+ const trampoline = document.getElementById('trampoline');
145
+ const scoreElement = document.getElementById('score-value');
146
+ const levelElement = document.getElementById('level-value');
147
+ const gameOverElement = document.getElementById('game-over');
148
+ const finalScoreElement = document.getElementById('final-score');
149
+ const finalLevelElement = document.getElementById('final-level');
150
+ const restartBtn = document.getElementById('restart-btn');
151
+ const pauseBtn = document.getElementById('pause-btn');
152
+ const lightning = document.querySelector('.lightning');
153
+
154
+ let score = 0;
155
+ let level = 1;
156
+ let gameRunning = true;
157
+ let isPaused = false;
158
+ let isDragging = false;
159
+ let startX, trampolineLeft;
160
+ let fallSpeedMultiplier = 1;
161
+ let spawnDelayMultiplier = 1;
162
+ let spawnInterval;
163
+ let rainInterval;
164
+ let lightningInterval;
165
+
166
+ function createCloud() {
167
+ const cloud = document.createElement('div');
168
+ cloud.className = 'cloud';
169
+ cloud.style.width = Math.random() * 100 + 50 + 'px';
170
+ cloud.style.height = cloud.style.width;
171
+ cloud.style.top = Math.random() * 50 + '%';
172
+ gameContainer.appendChild(cloud);
173
+
174
+ setTimeout(() => {
175
+ gameContainer.removeChild(cloud);
176
+ }, 20000);
177
+ }
178
+
179
+ function createRaindrop() {
180
+ if (isPaused) return;
181
+ const raindrop = document.createElement('div');
182
+ raindrop.className = 'raindrop';
183
+ raindrop.style.left = Math.random() * 100 + '%';
184
+ raindrop.style.top = '-20px';
185
+ gameContainer.appendChild(raindrop);
186
+
187
+ const fallAnimation = raindrop.animate(
188
+ [
189
+ { transform: 'translateY(0)' },
190
+ { transform: `translateY(${window.innerHeight + 20}px)` }
191
+ ],
192
+ {
193
+ duration: 1000,
194
+ easing: 'linear'
195
+ }
196
+ );
197
+
198
+ fallAnimation.onfinish = () => {
199
+ gameContainer.removeChild(raindrop);
200
+ };
201
+ }
202
+
203
+ function flashLightning() {
204
+ if (isPaused) return;
205
+ lightning.style.opacity = 1;
206
+ setTimeout(() => {
207
+ lightning.style.opacity = 0;
208
+ }, 100);
209
+ }
210
+
211
+ function spawnAnimal() {
212
+ if (!gameRunning || isPaused) return;
213
+
214
+ const animal = document.createElement('div');
215
+ animal.className = 'animal ' + (Math.random() < 0.5 ? 'cat' : 'dog');
216
+ animal.style.left = Math.random() * (gameContainer.clientWidth - 50) + 'px';
217
+ animal.style.top = '-50px';
218
+ gameContainer.appendChild(animal);
219
+
220
+ let posY = -50;
221
+ const fallInterval = setInterval(() => {
222
+ if (!gameRunning || isPaused) {
223
+ clearInterval(fallInterval);
224
+ return;
225
+ }
226
+
227
+ posY += 5 * fallSpeedMultiplier;
228
+ animal.style.top = posY + 'px';
229
+
230
+ const animalRect = animal.getBoundingClientRect();
231
+ const trampolineRect = trampoline.getBoundingClientRect();
232
+
233
+ if (
234
+ animalRect.bottom >= trampolineRect.top &&
235
+ animalRect.left < trampolineRect.right &&
236
+ animalRect.right > trampolineRect.left
237
+ ) {
238
+ score++;
239
+ scoreElement.textContent = score;
240
+ gameContainer.removeChild(animal);
241
+ clearInterval(fallInterval);
242
+ checkLevelUp();
243
+ } else if (posY > gameContainer.clientHeight) {
244
+ gameOver();
245
+ clearInterval(fallInterval);
246
+ }
247
+ }, 50);
248
+ }
249
+
250
+ function checkLevelUp() {
251
+ if (score % 10 === 0) {
252
+ level++;
253
+ levelElement.textContent = level;
254
+ fallSpeedMultiplier *= 1.1;
255
+ spawnDelayMultiplier *= 0.9;
256
+ updateSpawnInterval();
257
+ }
258
+ }
259
+
260
+ function updateSpawnInterval() {
261
+ clearInterval(spawnInterval);
262
+ spawnInterval = setInterval(spawnAnimal, 1000 * spawnDelayMultiplier);
263
+ }
264
+
265
+ function gameOver() {
266
+ gameRunning = false;
267
+ gameOverElement.style.display = 'block';
268
+ finalScoreElement.textContent = score;
269
+ finalLevelElement.textContent = level;
270
+ clearInterval(spawnInterval);
271
+ clearInterval(rainInterval);
272
+ clearInterval(lightningInterval);
273
+ }
274
+
275
+ function restartGame() {
276
+ score = 0;
277
+ level = 1;
278
+ scoreElement.textContent = score;
279
+ levelElement.textContent = level;
280
+ gameOverElement.style.display = 'none';
281
+ gameRunning = true;
282
+ isPaused = false;
283
+ pauseBtn.textContent = 'Pause';
284
+ fallSpeedMultiplier = 1;
285
+ spawnDelayMultiplier = 1;
286
+
287
+ document.querySelectorAll('.animal').forEach(animal => animal.remove());
288
+
289
+ startGame();
290
+ }
291
+
292
+ function startGame() {
293
+ updateSpawnInterval();
294
+ setInterval(createCloud, 5000);
295
+ rainInterval = setInterval(createRaindrop, 50);
296
+ lightningInterval = setInterval(flashLightning, 5000);
297
+
298
+ trampoline.style.left = (gameContainer.clientWidth - trampoline.offsetWidth) / 2 + 'px';
299
+ }
300
+
301
+ function togglePause() {
302
+ isPaused = !isPaused;
303
+ pauseBtn.textContent = isPaused ? 'Resume' : 'Pause';
304
+ }
305
+
306
+ restartBtn.addEventListener('click', restartGame);
307
+ pauseBtn.addEventListener('click', togglePause);
308
+
309
+ trampoline.addEventListener('mousedown', (e) => {
310
+ isDragging = true;
311
+ startX = e.clientX - trampoline.offsetLeft;
312
+ });
313
+
314
+ document.addEventListener('mousemove', (e) => {
315
+ if (!isDragging || isPaused) return;
316
+ e.preventDefault();
317
+ const trampolineWidth = trampoline.offsetWidth;
318
+ let newX = e.clientX - startX;
319
+ newX = Math.max(-trampolineWidth / 2, Math.min(newX, gameContainer.clientWidth - trampolineWidth / 2));
320
+ trampoline.style.left = newX + 'px';
321
+ });
322
+
323
+ document.addEventListener('mouseup', () => {
324
+ isDragging = false;
325
+ });
326
+
327
+ trampoline.addEventListener('touchstart', (e) => {
328
+ isDragging = true;
329
+ startX = e.touches[0].clientX - trampoline.offsetLeft;
330
+ });
331
+
332
+ document.addEventListener('touchmove', (e) => {
333
+ if (!isDragging || isPaused) return;
334
+ e.preventDefault();
335
+ const trampolineWidth = trampoline.offsetWidth;
336
+ let newX = e.touches[0].clientX - startX;
337
+ newX = Math.max(-trampolineWidth / 2, Math.min(newX, gameContainer.clientWidth - trampolineWidth / 2));
338
+ trampoline.style.left = newX + 'px';
339
+ });
340
+
341
+ document.addEventListener('touchend', () => {
342
+ isDragging = false;
343
+ });
344
+
345
+ window.addEventListener('resize', () => {
346
+ const trampolineWidth = trampoline.offsetWidth;
347
+ let currentLeft = parseInt(trampoline.style.left);
348
+ currentLeft = Math.max(-trampolineWidth / 2, Math.min(currentLeft, gameContainer.clientWidth - trampolineWidth / 2));
349
+ trampoline.style.left = currentLeft + 'px';
350
+ });
351
+
352
+ startGame();
353
+ </script>
354
+ </body></html>
9gwLjbpZKVd6Hs4Yy.html ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/jokegenerator" />
2
+ <title>AI Joke Generator Pro</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ background-color: #f0f8ff;
7
+ display: flex;
8
+ justify-content: center;
9
+ align-items: center;
10
+ height: 100vh;
11
+ margin: 0;
12
+ }
13
+ .container {
14
+ background-color: white;
15
+ padding: 2rem;
16
+ border-radius: 10px;
17
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
18
+ text-align: center;
19
+ max-width: 600px;
20
+ width: 100%;
21
+ }
22
+ h1 {
23
+ color: #4a4a4a;
24
+ margin-bottom: 1rem;
25
+ }
26
+ #joke-display {
27
+ font-size: 1.2rem;
28
+ margin: 1rem 0;
29
+ min-height: 3em;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ }
34
+ button {
35
+ background-color: #4CAF50;
36
+ border: none;
37
+ color: white;
38
+ padding: 15px 32px;
39
+ text-align: center;
40
+ text-decoration: none;
41
+ display: inline-block;
42
+ font-size: 16px;
43
+ margin: 4px 2px;
44
+ cursor: pointer;
45
+ transition: background-color 0.3s;
46
+ }
47
+ button:hover {
48
+ background-color: #45a049;
49
+ }
50
+ .mood-selector {
51
+ margin: 1rem 0;
52
+ }
53
+ select {
54
+ padding: 0.5rem;
55
+ font-size: 1rem;
56
+ }
57
+ .loading {
58
+ display: inline-block;
59
+ width: 20px;
60
+ height: 20px;
61
+ border: 3px solid rgba(0,0,0,.3);
62
+ border-radius: 50%;
63
+ border-top-color: #4CAF50;
64
+ animation: spin 1s ease-in-out infinite;
65
+ margin-left: 10px;
66
+ }
67
+ @keyframes spin {
68
+ to { transform: rotate(360deg); }
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div class="container">
74
+ <h1>AI Joke Generator Pro</h1>
75
+ <div class="mood-selector">
76
+ <label for="mood">Select joke mood:</label>
77
+ <select id="mood">
78
+ <option value="funny">Funny</option>
79
+ <option value="dad">Dad Joke</option>
80
+ <option value="nerdy">Nerdy</option>
81
+ <option value="pun">Pun</option>
82
+ <option value="dark">Dark Humor</option>
83
+ </select>
84
+ </div>
85
+ <div id="joke-display">Click the button to generate a joke!</div>
86
+ <button onclick="generateJoke()">Generate Joke</button>
87
+ <div id="loading" class="loading" style="display: none;"></div>
88
+ </div>
89
+
90
+ <script>
91
+ const jokes = {
92
+ funny: [
93
+ "Why don't scientists trust atoms? Because they make up everything!",
94
+ "Why did the scarecrow win an award? He was outstanding in his field!",
95
+ "Why don't eggs tell jokes? They'd crack each other up!",
96
+ "What do you call a fake noodle? An impasta!",
97
+ "Why did the math book look so sad? Because it had too many problems!"
98
+ ],
99
+ dad: [
100
+ "I'm afraid for the calendar. Its days are numbered.",
101
+ "What do you call a fish wearing a bowtie? Sofishticated.",
102
+ "How do you make a tissue dance? Put a little boogie in it!",
103
+ "Why did the cookie go to the doctor? Because it was feeling crumbly!",
104
+ "What do you call cheese that isn't yours? Nacho cheese!"
105
+ ],
106
+ nerdy: [
107
+ "There are 10 types of people in the world: those who understand binary, and those who don't.",
108
+ "Why do programmers prefer dark mode? Because light attracts bugs!",
109
+ "A photon checks into a hotel. The bellhop asks, 'Can I help you with your luggage?' The photon replies, 'No thanks, I'm traveling light.'",
110
+ "Why was the math book sad? Because it had too many problems!",
111
+ "What do you get when you cross a snowman with a vampire? Frostbite!"
112
+ ],
113
+ pun: [
114
+ "I wondered why the baseball was getting bigger. Then it hit me.",
115
+ "What do you call a can opener that doesn't work? A can't opener!",
116
+ "I used to be addicted to soap, but I'm clean now.",
117
+ "A bicycle can't stand on its own because it's two-tired.",
118
+ "What do you call a fake noodle? An impasta!"
119
+ ],
120
+ dark: [
121
+ "I have a stepladder because my real ladder left when I was just a kid.",
122
+ "Light travels faster than sound, which is why some people appear bright until you hear them speak.",
123
+ "I was going to tell a dead baby joke. But I decided to abort.",
124
+ "What's the difference between a tire and 365 used condoms? One's a Goodyear. The other's a great year.",
125
+ "Give a man a match, and he'll be warm for a few hours. Set a man on fire, and he will be warm for the rest of his life."
126
+ ]
127
+ };
128
+
129
+ function generateJoke() {
130
+ const mood = document.getElementById('mood').value;
131
+ const jokeDisplay = document.getElementById('joke-display');
132
+ const loadingSpinner = document.getElementById('loading');
133
+
134
+ jokeDisplay.textContent = '';
135
+ loadingSpinner.style.display = 'inline-block';
136
+
137
+ setTimeout(() => {
138
+ const randomJoke = jokes[mood][Math.floor(Math.random() * jokes[mood].length)];
139
+ jokeDisplay.textContent = randomJoke;
140
+ loadingSpinner.style.display = 'none';
141
+ }, 1000);
142
+ }
143
+ </script>
144
+ </body></html>
IGcZCVDlVe6wQDZOK.html ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>PBS Viral Player - WebSim Integrated Viewing Experience</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ background-color: #f0f0f0;
7
+ margin: 0;
8
+ padding: 20px;
9
+ color: #333;
10
+ }
11
+ .container {
12
+ max-width: 800px;
13
+ margin: 0 auto;
14
+ background-color: #fff;
15
+ border-radius: 10px;
16
+ padding: 20px;
17
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
18
+ }
19
+ h1 {
20
+ color: #2c3e50;
21
+ text-align: center;
22
+ }
23
+ .video-container {
24
+ margin-bottom: 20px;
25
+ }
26
+ .description {
27
+ line-height: 1.6;
28
+ }
29
+ .related-content {
30
+ margin-top: 30px;
31
+ }
32
+ .related-content h2 {
33
+ color: #2c3e50;
34
+ border-bottom: 2px solid #3498db;
35
+ padding-bottom: 10px;
36
+ }
37
+ .related-content ul {
38
+ list-style-type: none;
39
+ padding: 0;
40
+ }
41
+ .related-content li {
42
+ margin-bottom: 10px;
43
+ }
44
+ .related-content a {
45
+ color: #3498db;
46
+ text-decoration: none;
47
+ }
48
+ .related-content a:hover {
49
+ text-decoration: underline;
50
+ }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div class="container">
55
+ <h1>WebSim Integrated PBS Viewing Experience</h1>
56
+
57
+ <div class="video-container">
58
+ <div class="pbs-viral-player-wrapper" style="position: relative; padding-top: calc(56.25% + 43px);">
59
+ <iframe src="https://player.pbs.org/viralplayer/3074764395/" allowfullscreen allow="encrypted-media" style="position: absolute; top: 0; width: 100%; height: 100%; border: 0;"></iframe>
60
+ </div>
61
+ </div>
62
+
63
+ <div class="description">
64
+ <p>Welcome to the WebSim integrated PBS viewing experience. This innovative platform combines the educational content of PBS with the interactive capabilities of WebSim, creating a unique learning environment.</p>
65
+ <p>The video above is sourced directly from PBS, ensuring high-quality, factual content. As you watch, WebSim's AI will analyze the video in real-time, providing additional context, related information, and interactive elements to enhance your viewing experience.</p>
66
+ </div>
67
+
68
+ <div class="related-content">
69
+ <h2>Explore More with WebSim</h2>
70
+ <ul>
71
+ <li><a href="https://websim.ai/pbs/interactive-timeline">Interactive Timeline: Trace the history related to this video</a></li>
72
+ <li><a href="https://websim.ai/pbs/quiz-generator">AI-Generated Quiz: Test your knowledge on the video's content</a></li>
73
+ <li><a href="https://websim.ai/pbs/virtual-field-trip">Virtual Field Trip: Explore locations mentioned in the video</a></li>
74
+ <li><a href="https://websim.ai/pbs/discussion-forum">Join the Discussion: Share your thoughts with other viewers</a></li>
75
+ </ul>
76
+ </div>
77
+ </div>
78
+ </body></html>
IpiL5e3XmBvC8zIYc.html ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Pocket Memory Game</title>
2
+ <style>
3
+ body, html {
4
+ margin: 0;
5
+ padding: 0;
6
+ height: 100%;
7
+ display: flex;
8
+ justify-content: center;
9
+ align-items: center;
10
+ font-family: Arial, sans-serif;
11
+ background-color: #000000;
12
+ color: #ffffff;
13
+ }
14
+ .game-container {
15
+ width: 2.88in;
16
+ height: 2.88in;
17
+ background-color: #000000;
18
+ display: flex;
19
+ flex-direction: column;
20
+ justify-content: center;
21
+ align-items: center;
22
+ }
23
+ .board {
24
+ display: grid;
25
+ grid-template-columns: repeat(4, 1fr);
26
+ gap: 0.08in;
27
+ margin-bottom: 0.16in;
28
+ }
29
+ .card {
30
+ width: 0.6in;
31
+ height: 0.6in;
32
+ background-color: #000000;
33
+ border: 2px solid #ffffff;
34
+ border-radius: 0.08in;
35
+ display: flex;
36
+ justify-content: center;
37
+ align-items: center;
38
+ font-size: 0.3in;
39
+ font-weight: bold;
40
+ cursor: pointer;
41
+ transition: background-color 0.3s;
42
+ }
43
+ .card.flipped {
44
+ background-color: #ffffff;
45
+ color: #000000;
46
+ }
47
+ .status {
48
+ font-size: 0.18in;
49
+ text-align: center;
50
+ }
51
+ </style>
52
+ </head><body>
53
+ <div class="game-container">
54
+ <div class="board">
55
+ <div class="card" data-card="A"></div>
56
+ <div class="card" data-card="A"></div>
57
+ <div class="card" data-card="B"></div>
58
+ <div class="card" data-card="B"></div>
59
+ <div class="card" data-card="C"></div>
60
+ <div class="card" data-card="C"></div>
61
+ <div class="card" data-card="D"></div>
62
+ <div class="card" data-card="D"></div>
63
+ <div class="card" data-card="E"></div>
64
+ <div class="card" data-card="E"></div>
65
+ <div class="card" data-card="F"></div>
66
+ <div class="card" data-card="F"></div>
67
+ <div class="card" data-card="G"></div>
68
+ <div class="card" data-card="G"></div>
69
+ <div class="card" data-card="H"></div>
70
+ <div class="card" data-card="H"></div>
71
+ </div>
72
+ <div class="status">Pairs: 0 | Moves: 0</div>
73
+ </div>
74
+
75
+ <script>
76
+ const cards = document.querySelectorAll('.card');
77
+ const statusDisplay = document.querySelector('.status');
78
+ let hasFlippedCard = false;
79
+ let lockBoard = false;
80
+ let firstCard, secondCard;
81
+ let pairs = 0;
82
+ let moves = 0;
83
+
84
+ function flipCard() {
85
+ if (lockBoard) return;
86
+ if (this === firstCard) return;
87
+
88
+ this.classList.add('flipped');
89
+ this.textContent = this.dataset.card;
90
+
91
+ if (!hasFlippedCard) {
92
+ hasFlippedCard = true;
93
+ firstCard = this;
94
+ return;
95
+ }
96
+
97
+ secondCard = this;
98
+ checkForMatch();
99
+ }
100
+
101
+ function checkForMatch() {
102
+ moves++;
103
+ let isMatch = firstCard.dataset.card === secondCard.dataset.card;
104
+
105
+ isMatch ? disableCards() : unflipCards();
106
+
107
+ updateStatus();
108
+ }
109
+
110
+ function disableCards() {
111
+ firstCard.removeEventListener('click', flipCard);
112
+ secondCard.removeEventListener('click', flipCard);
113
+ pairs++;
114
+ resetBoard();
115
+ }
116
+
117
+ function unflipCards() {
118
+ lockBoard = true;
119
+
120
+ setTimeout(() => {
121
+ firstCard.classList.remove('flipped');
122
+ secondCard.classList.remove('flipped');
123
+ firstCard.textContent = '';
124
+ secondCard.textContent = '';
125
+ resetBoard();
126
+ }, 1000);
127
+ }
128
+
129
+ function resetBoard() {
130
+ [hasFlippedCard, lockBoard] = [false, false];
131
+ [firstCard, secondCard] = [null, null];
132
+ }
133
+
134
+ function updateStatus() {
135
+ statusDisplay.textContent = `Pairs: ${pairs} | Moves: ${moves}`;
136
+ if (pairs === 8) {
137
+ statusDisplay.textContent += ' | You Win!';
138
+ }
139
+ }
140
+
141
+ function shuffle() {
142
+ cards.forEach(card => {
143
+ let randomPos = Math.floor(Math.random() * 16);
144
+ card.style.order = randomPos;
145
+ });
146
+ }
147
+
148
+ cards.forEach(card => card.addEventListener('click', flipCard));
149
+ shuffle();
150
+ </script>
151
+ </body></html>
JkDNLJnf5cvaKlr0C.html ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/"><title>AInfinitoGram - Infinite AI-Generated Photography</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ margin: 0;
5
+ padding: 0;
6
+ background-color: #f0f0f0;
7
+ }
8
+ header {
9
+ background-color: #333;
10
+ color: white;
11
+ padding: 1rem;
12
+ text-align: center;
13
+ }
14
+ h1 {
15
+ margin: 0;
16
+ }
17
+ .gallery {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ justify-content: center;
21
+ padding: 1rem;
22
+ }
23
+ .photo {
24
+ margin: 0.5rem;
25
+ background-color: white;
26
+ box-shadow: 0 0 5px rgba(0,0,0,0.1);
27
+ border-radius: 5px;
28
+ overflow: hidden;
29
+ width: 300px;
30
+ }
31
+ .photo img {
32
+ width: 100%;
33
+ height: 200px;
34
+ object-fit: cover;
35
+ }
36
+ .photo-info {
37
+ padding: 0.5rem;
38
+ }
39
+ .photo-title {
40
+ font-weight: bold;
41
+ margin-bottom: 0.25rem;
42
+ }
43
+ .photo-date {
44
+ color: #666;
45
+ font-size: 0.8rem;
46
+ }
47
+ #load-more {
48
+ display: block;
49
+ margin: 1rem auto;
50
+ padding: 0.5rem 1rem;
51
+ background-color: #333;
52
+ color: white;
53
+ border: none;
54
+ border-radius: 5px;
55
+ cursor: pointer;
56
+ }
57
+ footer {
58
+ background-color: #333;
59
+ color: white;
60
+ text-align: center;
61
+ padding: 1rem;
62
+ position: fixed;
63
+ bottom: 0;
64
+ width: 100%;
65
+ }
66
+ </style></head><body>
67
+ <header>
68
+ <h1>AInfinitoGram</h1>
69
+ <p>Infinite AI-Generated Photography</p>
70
+ </header>
71
+
72
+ <div class="gallery" id="photo-gallery">
73
+ <!-- Photos will be dynamically added here -->
74
+ </div>
75
+
76
+ <button id="load-more">Load More</button>
77
+
78
+ <footer>
79
+ <p>&copy; 2023 AInfinitoGram - AI-Generated Photography</p>
80
+ </footer>
81
+
82
+ <script>
83
+ const photoGallery = document.getElementById('photo-gallery');
84
+ const loadMoreButton = document.getElementById('load-more');
85
+ let photoCount = 0;
86
+
87
+ function generateRandomDate() {
88
+ const start = new Date(2010, 0, 1);
89
+ const end = new Date();
90
+ return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
91
+ }
92
+
93
+ function formatDate(date) {
94
+ return date.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
95
+ }
96
+
97
+ function generatePhotoTitle() {
98
+ const subjects = ['Landscape', 'Portrait', 'Street', 'Nature', 'Abstract', 'Architecture', 'Wildlife', 'Macro', 'Night', 'Aerial'];
99
+ const adjectives = ['Vibrant', 'Serene', 'Mysterious', 'Energetic', 'Dreamy', 'Bold', 'Ethereal', 'Dramatic', 'Minimalist', 'Surreal'];
100
+ return `${adjectives[Math.floor(Math.random() * adjectives.length)]} ${subjects[Math.floor(Math.random() * subjects.length)]}`;
101
+ }
102
+
103
+ function addPhoto() {
104
+ const photo = document.createElement('div');
105
+ photo.className = 'photo';
106
+
107
+ const img = document.createElement('img');
108
+ img.src = `https://picsum.photos/300/200?random=${photoCount}`;
109
+ img.alt = 'AI-generated photo';
110
+
111
+ const info = document.createElement('div');
112
+ info.className = 'photo-info';
113
+
114
+ const title = document.createElement('div');
115
+ title.className = 'photo-title';
116
+ title.textContent = generatePhotoTitle();
117
+
118
+ const date = document.createElement('div');
119
+ date.className = 'photo-date';
120
+ date.textContent = formatDate(generateRandomDate());
121
+
122
+ info.appendChild(title);
123
+ info.appendChild(date);
124
+ photo.appendChild(img);
125
+ photo.appendChild(info);
126
+ photoGallery.appendChild(photo);
127
+
128
+ photoCount++;
129
+ }
130
+
131
+ function loadMorePhotos() {
132
+ for (let i = 0; i < 12; i++) {
133
+ addPhoto();
134
+ }
135
+ }
136
+
137
+ loadMoreButton.addEventListener('click', loadMorePhotos);
138
+
139
+ // Initial load
140
+ loadMorePhotos();
141
+ </script>
142
+ </body></html>
Ju6NyzfkxiEUQMJJU.html ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://magicaldoors.websim.ai/"/><title>Magical Doors - A Whimsical Adventure</title><style>
2
+ body {
3
+ font-family: 'Work Sans', sans-serif;
4
+ margin: 0;
5
+ padding: 0;
6
+ background: linear-gradient(135deg, #f6d365 0%, #fda085 100%);
7
+ color: #4a4a4a;
8
+ }
9
+ .header {
10
+ background-color: #8ec5fc;
11
+ background-image: linear-gradient(62deg, #8ec5fc 0%, #e0c3fc 100%);
12
+ height: 50px;
13
+ }
14
+ .container {
15
+ max-width: 800px;
16
+ margin: 0 auto;
17
+ padding: 20px;
18
+ }
19
+ .title-row {
20
+ display: flex;
21
+ justify-content: center;
22
+ align-items: center;
23
+ margin-bottom: 30px;
24
+ }
25
+ .instructions-title {
26
+ font-size: 24px;
27
+ margin: 0 15px;
28
+ color: #6a3093;
29
+ }
30
+ .instructions-row {
31
+ width: 100%;
32
+ margin-bottom: 30px;
33
+ }
34
+ .instructions-number {
35
+ font-size: 36px;
36
+ color: #a044ff;
37
+ width: 50px;
38
+ text-align: center;
39
+ vertical-align: top;
40
+ }
41
+ .instructions-text {
42
+ font-size: 18px;
43
+ padding: 10px;
44
+ line-height: 1.5;
45
+ }
46
+ .door-row {
47
+ display: flex;
48
+ justify-content: space-around;
49
+ margin-bottom: 30px;
50
+ }
51
+ .frame {
52
+ width: 200px;
53
+ cursor: pointer;
54
+ transition: transform 0.3s ease;
55
+ }
56
+ .frame:hover {
57
+ transform: scale(1.05);
58
+ }
59
+ #start-row {
60
+ text-align: center;
61
+ }
62
+ #start {
63
+ font-size: 18px;
64
+ padding: 10px 20px;
65
+ background-color: #a044ff;
66
+ color: white;
67
+ border: none;
68
+ border-radius: 5px;
69
+ cursor: pointer;
70
+ transition: background-color 0.3s ease;
71
+ }
72
+ #start:hover {
73
+ background-color: #8e2de2;
74
+ }
75
+ @keyframes doorGlow {
76
+ 0% { box-shadow: 0 0 5px #f6d365; }
77
+ 50% { box-shadow: 0 0 20px #fda085; }
78
+ 100% { box-shadow: 0 0 5px #f6d365; }
79
+ }
80
+ .frame {
81
+ animation: doorGlow 2s infinite;
82
+ }
83
+ </style></head><body>
84
+ <div class="header"></div>
85
+ <div class="container">
86
+ <div class="title-row">
87
+ <img src="https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/star.svg" alt="Magical star" width="30" height="30">
88
+ <p class="instructions-title">Welcome to the Magical Doors!</p>
89
+ <img src="https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/star.svg" alt="Magical star" width="30" height="30">
90
+ </div>
91
+
92
+ <table class="instructions-row">
93
+ <tr>
94
+ <td class="instructions-number">1</td>
95
+ <td class="instructions-text">
96
+ Behind one of these enchanted doors lies the mischievous Pixie.
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <td class="instructions-number">2</td>
101
+ <td class="instructions-text">
102
+ Your quest is to open all the doors without encountering the Pixie.
103
+ </td>
104
+ </tr>
105
+ <tr>
106
+ <td class="instructions-number">3</td>
107
+ <td class="instructions-text">
108
+ If you succeed in avoiding the Pixie until the very last door, you'll discover a magical treasure!
109
+ </td>
110
+ </tr>
111
+ <tr>
112
+ <td class="instructions-number">4</td>
113
+ <td class="instructions-text">
114
+ Challenge yourself to achieve a streak of successful quests!
115
+ </td>
116
+ </tr>
117
+ </table>
118
+
119
+ <div class="door-row">
120
+ <img id="door1" class="frame" src="https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/closed_door.svg" alt="Magical door 1" width="200" height="360">
121
+ <img id="door2" class="frame" src="https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/closed_door.svg" alt="Magical door 2" width="200" height="360">
122
+ <img id="door3" class="frame" src="https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/closed_door.svg" alt="Magical door 3" width="200" height="360">
123
+ </div>
124
+
125
+ <div id="start-row">
126
+ <button id="start">Begin Your Magical Quest!</button>
127
+ </div>
128
+ </div>
129
+
130
+ <script>
131
+ const door1 = document.getElementById('door1');
132
+ const door2 = document.getElementById('door2');
133
+ const door3 = document.getElementById('door3');
134
+ const startButton = document.getElementById('start');
135
+
136
+ const closedDoorPath = "https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/closed_door.svg";
137
+ const pixiePath = "https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/robot.svg";
138
+ const fairyPath = "https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/beach.svg";
139
+ const unicornPath = "https://s3.amazonaws.com/codecademy-content/projects/chore-door/images/space.svg";
140
+
141
+ let openDoor1, openDoor2, openDoor3;
142
+ let numClosedDoors = 3;
143
+ let currentlyPlaying = true;
144
+
145
+ const isPixie = (door) => {
146
+ return door.src === pixiePath;
147
+ }
148
+
149
+ const isClicked = (door) => {
150
+ return door.src !== closedDoorPath;
151
+ }
152
+
153
+ const playDoor = (door) => {
154
+ numClosedDoors--;
155
+ if (numClosedDoors === 0) {
156
+ gameOver('win');
157
+ } else if (isPixie(door)) {
158
+ gameOver();
159
+ }
160
+ }
161
+
162
+ const randomDoorGenerator = () => {
163
+ const pixieDoor = Math.floor(Math.random() * numClosedDoors);
164
+ if (pixieDoor === 0) {
165
+ openDoor1 = pixiePath;
166
+ openDoor2 = fairyPath;
167
+ openDoor3 = unicornPath;
168
+ } else if (pixieDoor === 1) {
169
+ openDoor1 = fairyPath;
170
+ openDoor2 = pixiePath;
171
+ openDoor3 = unicornPath;
172
+ } else {
173
+ openDoor1 = fairyPath;
174
+ openDoor2 = unicornPath;
175
+ openDoor3 = pixiePath;
176
+ }
177
+ }
178
+
179
+ door1.onclick = () => {
180
+ if (currentlyPlaying && !isClicked(door1)) {
181
+ door1.src = openDoor1;
182
+ playDoor(door1);
183
+ }
184
+ }
185
+
186
+ door2.onclick = () => {
187
+ if (currentlyPlaying && !isClicked(door2)) {
188
+ door2.src = openDoor2;
189
+ playDoor(door2);
190
+ }
191
+ }
192
+
193
+ door3.onclick = () => {
194
+ if (currentlyPlaying && !isClicked(door3)) {
195
+ door3.src = openDoor3;
196
+ playDoor(door3);
197
+ }
198
+ }
199
+
200
+ startButton.onclick = () => {
201
+ if (!currentlyPlaying) {
202
+ startRound();
203
+ }
204
+ }
205
+
206
+ const startRound = () => {
207
+ door1.src = closedDoorPath;
208
+ door2.src = closedDoorPath;
209
+ door3.src = closedDoorPath;
210
+ numClosedDoors = 3;
211
+ startButton.innerHTML = 'Good luck!';
212
+ currentlyPlaying = true;
213
+ randomDoorGenerator();
214
+ }
215
+
216
+ const gameOver = (status) => {
217
+ if (status === 'win') {
218
+ startButton.innerHTML = 'You found the treasure! Play again?';
219
+ } else {
220
+ startButton.innerHTML = 'Game over! Play again?';
221
+ }
222
+ currentlyPlaying = false;
223
+ }
224
+
225
+ startRound();
226
+ </script>
227
+ </body></html>
OQnUUFVv9rY1pFLFM.html ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://%3Ciframe%3Ehttps://mapbox.github.io/webgl-wind/demo/%3C/iframe%3E">
2
+ <title>WebGL Wind Simulation</title>
3
+ <style>
4
+ body, html {
5
+ margin: 0;
6
+ padding: 0;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ font-family: Arial, sans-serif;
10
+ }
11
+ #wind-simulation {
12
+ width: 100%;
13
+ height: 100vh;
14
+ border: none;
15
+ }
16
+ #overlay {
17
+ position: absolute;
18
+ top: 10px;
19
+ left: 10px;
20
+ background: rgba(255,255,255,0.8);
21
+ padding: 10px;
22
+ border-radius: 5px;
23
+ }
24
+ h1 {
25
+ margin: 0 0 10px 0;
26
+ font-size: 24px;
27
+ }
28
+ p {
29
+ margin: 5px 0;
30
+ }
31
+ .control {
32
+ margin-top: 10px;
33
+ }
34
+ select, input {
35
+ width: 100%;
36
+ }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <iframe id="wind-simulation" src="https://mapbox.github.io/webgl-wind/demo/" title="WebGL Wind Simulation"></iframe>
41
+
42
+ <div id="overlay">
43
+ <h1>WebGL Wind Simulation</h1>
44
+ <p>Explore global wind patterns in real-time using cutting-edge WebGL technology.</p>
45
+
46
+ <div class="control">
47
+ <label for="wind-layer">Wind Layer:</label>
48
+ <select id="wind-layer">
49
+ <option value="surface">Surface</option>
50
+ <option value="850hpa">850 hPa</option>
51
+ <option value="250hpa">250 hPa</option>
52
+ </select>
53
+ </div>
54
+
55
+ <div class="control">
56
+ <label for="particle-density">Particle Density:</label>
57
+ <input type="range" id="particle-density" min="1000" max="100000" step="1000" value="65000">
58
+ </div>
59
+
60
+ <div class="control">
61
+ <label for="particle-speed">Particle Speed:</label>
62
+ <input type="range" id="particle-speed" min="0.1" max="2" step="0.1" value="0.75">
63
+ </div>
64
+
65
+ <p><a href="https://websim.ai/wind-patterns">Learn more about global wind patterns</a></p>
66
+ <p><a href="https://websim.ai/webgl-tech">Explore WebGL technology</a></p>
67
+ </div>
68
+
69
+ <script>
70
+ // Simulated interactivity
71
+ document.getElementById('wind-layer').addEventListener('change', function(e) {
72
+ console.log('Wind layer changed to: ' + e.target.value);
73
+ });
74
+
75
+ document.getElementById('particle-density').addEventListener('input', function(e) {
76
+ console.log('Particle density changed to: ' + e.target.value);
77
+ });
78
+
79
+ document.getElementById('particle-speed').addEventListener('input', function(e) {
80
+ console.log('Particle speed changed to: ' + e.target.value);
81
+ });
82
+ </script>
83
+ </body></html>
RKuJrfCm8ZlLAgYES.html ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/" /><title>Whack-a-Mole Mania: Eco Edition</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Fredoka One', cursive;
5
+ background: linear-gradient(135deg, #7cba01, #2c8c09);
6
+ display: flex;
7
+ justify-content: center;
8
+ align-items: center;
9
+ height: 100vh;
10
+ margin: 0;
11
+ overflow: hidden;
12
+ }
13
+ #game-container {
14
+ width: 500px;
15
+ height: 500px;
16
+ background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><rect width="100" height="100" fill="%23654321"/><circle cx="50" cy="50" r="30" fill="%23543210"/></svg>');
17
+ background-size: 100px 100px;
18
+ border-radius: 20px;
19
+ display: grid;
20
+ grid-template-columns: repeat(3, 1fr);
21
+ grid-template-rows: repeat(3, 1fr);
22
+ gap: 20px;
23
+ padding: 20px;
24
+ box-shadow: 0 10px 30px rgba(0,0,0,0.3);
25
+ }
26
+ .hole {
27
+ background: radial-gradient(circle, #3a2410 60%, #291809 100%);
28
+ border-radius: 50%;
29
+ overflow: hidden;
30
+ position: relative;
31
+ box-shadow: inset 0 5px 10px rgba(0,0,0,0.5);
32
+ }
33
+ .mole {
34
+ width: 100%;
35
+ height: 100%;
36
+ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="%23964B00"/><circle cx="30" cy="30" r="10" fill="%23000"/><circle cx="70" cy="30" r="10" fill="%23000"/><path d="M35 70 Q50 80 65 70" stroke="%23000" stroke-width="5" fill="none"/><ellipse cx="50" cy="40" rx="10" ry="5" fill="%23FFA500"/></svg>');
37
+ background-size: cover;
38
+ position: absolute;
39
+ bottom: 100%;
40
+ transition: bottom 0.1s cubic-bezier(0.68, -0.55, 0.265, 1.55);
41
+ cursor: pointer;
42
+ }
43
+ .mole.up {
44
+ bottom: 0;
45
+ }
46
+ #score, #misses, #time {
47
+ position: absolute;
48
+ top: 20px;
49
+ font-size: 28px;
50
+ color: white;
51
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
52
+ }
53
+ #score { left: 20px; }
54
+ #misses { right: 20px; }
55
+ #time { top: 60px; left: 20px; }
56
+ #start-btn {
57
+ position: absolute;
58
+ bottom: 20px;
59
+ padding: 15px 30px;
60
+ font-size: 24px;
61
+ font-family: 'Fredoka One', cursive;
62
+ background-color: #FFD700;
63
+ color: #333;
64
+ border: none;
65
+ border-radius: 50px;
66
+ cursor: pointer;
67
+ transition: all 0.3s;
68
+ box-shadow: 0 5px 15px rgba(0,0,0,0.2);
69
+ }
70
+ #start-btn:hover {
71
+ background-color: #FFC300;
72
+ transform: translateY(-3px);
73
+ box-shadow: 0 8px 20px rgba(0,0,0,0.3);
74
+ }
75
+ .particle {
76
+ position: absolute;
77
+ pointer-events: none;
78
+ animation: particleAnimation 0.5s ease-out forwards;
79
+ }
80
+ @keyframes particleAnimation {
81
+ 0% { transform: translateY(0) scale(1); opacity: 1; }
82
+ 100% { transform: translateY(-50px) scale(0); opacity: 0; }
83
+ }
84
+ #level-up {
85
+ position: absolute;
86
+ font-size: 48px;
87
+ color: #FFD700;
88
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
89
+ opacity: 0;
90
+ transition: opacity 0.5s;
91
+ }
92
+ </style>
93
+ </head>
94
+ <body>
95
+ <div id="score">Score: 0</div>
96
+ <div id="misses">Misses: 0</div>
97
+ <div id="time">Time: 60s</div>
98
+ <div id="game-container"></div>
99
+ <button id="start-btn">Start Game</button>
100
+ <div id="level-up">Level Up!</div>
101
+
102
+ <script>
103
+ const gameContainer = document.getElementById('game-container');
104
+ const scoreElement = document.getElementById('score');
105
+ const missesElement = document.getElementById('misses');
106
+ const timeElement = document.getElementById('time');
107
+ const startBtn = document.getElementById('start-btn');
108
+ const levelUpElement = document.getElementById('level-up');
109
+
110
+ let score = 0;
111
+ let misses = 0;
112
+ let consecutiveMisses = 0;
113
+ let gameInterval;
114
+ let speed = 1000;
115
+ let timeLeft = 60;
116
+ let level = 1;
117
+
118
+ function createHoles() {
119
+ for (let i = 0; i < 9; i++) {
120
+ const hole = document.createElement('div');
121
+ hole.classList.add('hole');
122
+ const mole = document.createElement('div');
123
+ mole.classList.add('mole');
124
+ mole.addEventListener('click', whackMole);
125
+ hole.appendChild(mole);
126
+ gameContainer.appendChild(hole);
127
+ }
128
+ }
129
+
130
+ function whackMole(event) {
131
+ if (this.classList.contains('up')) {
132
+ this.classList.remove('up');
133
+ score++;
134
+ scoreElement.textContent = `Score: ${score}`;
135
+ consecutiveMisses = 0;
136
+ createParticles(event.clientX, event.clientY);
137
+ checkLevelUp();
138
+ }
139
+ }
140
+
141
+ function createParticles(x, y) {
142
+ for (let i = 0; i < 10; i++) {
143
+ const particle = document.createElement('div');
144
+ particle.classList.add('particle');
145
+ particle.style.left = `${x}px`;
146
+ particle.style.top = `${y}px`;
147
+ particle.style.backgroundColor = `hsl(${Math.random() * 360}, 100%, 50%)`;
148
+ particle.style.width = `${Math.random() * 10 + 5}px`;
149
+ particle.style.height = particle.style.width;
150
+ document.body.appendChild(particle);
151
+ setTimeout(() => particle.remove(), 500);
152
+ }
153
+ }
154
+
155
+ function showMole() {
156
+ const moles = document.querySelectorAll('.mole');
157
+ const randomMole = moles[Math.floor(Math.random() * moles.length)];
158
+
159
+ if (!randomMole.classList.contains('up')) {
160
+ randomMole.classList.add('up');
161
+ setTimeout(() => {
162
+ if (randomMole.classList.contains('up')) {
163
+ randomMole.classList.remove('up');
164
+ misses++;
165
+ consecutiveMisses++;
166
+ missesElement.textContent = `Misses: ${misses}`;
167
+
168
+ if (consecutiveMisses >= 3) {
169
+ endGame();
170
+ }
171
+ }
172
+ }, speed);
173
+ }
174
+ }
175
+
176
+ function startGame() {
177
+ score = 0;
178
+ misses = 0;
179
+ consecutiveMisses = 0;
180
+ speed = 1000;
181
+ timeLeft = 60;
182
+ level = 1;
183
+ scoreElement.textContent = 'Score: 0';
184
+ missesElement.textContent = 'Misses: 0';
185
+ timeElement.textContent = 'Time: 60s';
186
+ startBtn.style.display = 'none';
187
+
188
+ gameInterval = setInterval(() => {
189
+ showMole();
190
+ timeLeft--;
191
+ timeElement.textContent = `Time: ${timeLeft}s`;
192
+ if (timeLeft <= 0) {
193
+ endGame();
194
+ }
195
+ }, 1000);
196
+ }
197
+
198
+ function endGame() {
199
+ clearInterval(gameInterval);
200
+ alert(`Game Over! Your score: ${score}`);
201
+ startBtn.style.display = 'block';
202
+ }
203
+
204
+ function checkLevelUp() {
205
+ if (score % 10 === 0) {
206
+ level++;
207
+ speed = Math.max(300, speed - 50);
208
+ levelUpElement.style.opacity = '1';
209
+ levelUpElement.textContent = `Level ${level}!`;
210
+ setTimeout(() => {
211
+ levelUpElement.style.opacity = '0';
212
+ }, 1500);
213
+ }
214
+ }
215
+
216
+ createHoles();
217
+ startBtn.addEventListener('click', startGame);
218
+ </script>
219
+ </body></html>
WPhS2osiyGKInfTqb.html ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" /><title>WeChat-style Chat - WebSim</title><style>
2
+ body, html {
3
+ margin: 0;
4
+ padding: 0;
5
+ height: 100%;
6
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
7
+ background-color: #f1f1f1;
8
+ }
9
+ .chat-container {
10
+ max-width: 500px;
11
+ margin: 0 auto;
12
+ background-color: #fff;
13
+ height: 100%;
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
17
+ .chat-header {
18
+ background-color: #07C160;
19
+ color: white;
20
+ padding: 10px;
21
+ text-align: center;
22
+ font-size: 18px;
23
+ }
24
+ .chat-messages {
25
+ flex: 1;
26
+ overflow-y: auto;
27
+ padding: 10px;
28
+ }
29
+ .message {
30
+ max-width: 70%;
31
+ margin-bottom: 10px;
32
+ clear: both;
33
+ }
34
+ .message-content {
35
+ padding: 10px;
36
+ border-radius: 10px;
37
+ }
38
+ .left {
39
+ float: left;
40
+ }
41
+ .right {
42
+ float: right;
43
+ }
44
+ .left .message-content {
45
+ background-color: #fff;
46
+ border: 1px solid #ccc;
47
+ }
48
+ .right .message-content {
49
+ background-color: #07C160;
50
+ color: white;
51
+ }
52
+ .chat-input {
53
+ padding: 10px;
54
+ background-color: #f1f1f1;
55
+ display: flex;
56
+ }
57
+ .chat-input input {
58
+ flex: 1;
59
+ padding: 10px;
60
+ border: none;
61
+ border-radius: 20px;
62
+ outline: none;
63
+ }
64
+ .chat-input button {
65
+ background-color: #07C160;
66
+ color: white;
67
+ border: none;
68
+ padding: 10px 15px;
69
+ margin-left: 10px;
70
+ border-radius: 20px;
71
+ cursor: pointer;
72
+ }
73
+ .avatar {
74
+ width: 40px;
75
+ height: 40px;
76
+ border-radius: 50%;
77
+ margin-right: 10px;
78
+ }
79
+ </style></head><body>
80
+ <div class="chat-container">
81
+ <div class="chat-header">
82
+ WeChat-style Chat
83
+ </div>
84
+ <div class="chat-messages" id="chatMessages">
85
+ <div class="message left">
86
+ <img src="https://websim.ai/images/ai-avatar.png" alt="AI Avatar" class="avatar">
87
+ <div class="message-content">
88
+ Hello! Welcome to the simulated WeChat chat interface. How can I assist you today?
89
+ </div>
90
+ </div>
91
+ </div>
92
+ <div class="chat-input">
93
+ <input type="text" id="userInput" placeholder="Enter a message...">
94
+ <button onclick="sendMessage()">Send</button>
95
+ </div>
96
+ </div>
97
+
98
+ <script>
99
+ function sendMessage() {
100
+ const userInput = document.getElementById('userInput');
101
+ const chatMessages = document.getElementById('chatMessages');
102
+
103
+ if (userInput.value.trim() !== '') {
104
+ // Add user message
105
+ const userMessage = document.createElement('div');
106
+ userMessage.className = 'message right';
107
+ userMessage.innerHTML = `
108
+ <div class="message-content">
109
+ ${userInput.value}
110
+ </div>
111
+ `;
112
+ chatMessages.appendChild(userMessage);
113
+
114
+ // Simulate AI reply
115
+ setTimeout(() => {
116
+ const aiMessage = document.createElement('div');
117
+ aiMessage.className = 'message left';
118
+ aiMessage.innerHTML = `
119
+ <img src="https://websim.ai/images/ai-avatar.png" alt="AI Avatar" class="avatar">
120
+ <div class="message-content">
121
+ You said "${userInput.value}", I understand. Is there anything else I can help you with?
122
+ </div>
123
+ `;
124
+ chatMessages.appendChild(aiMessage);
125
+ chatMessages.scrollTop = chatMessages.scrollHeight;
126
+ }, 1000);
127
+
128
+ userInput.value = '';
129
+ chatMessages.scrollTop = chatMessages.scrollHeight;
130
+ }
131
+ }
132
+
133
+ document.getElementById('userInput').addEventListener('keypress', function(e) {
134
+ if (e.key === 'Enter') {
135
+ sendMessage();
136
+ }
137
+ });
138
+ </script>
139
+ </body></html>
WqE3pXOmpC4fzd2R8.html ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://bugsquish.com/" /><title>BugSquish Pro - Ultimate Bug Squashing Challenge!</title><style>
2
+ @import url('https://fonts.googleapis.com/css2?family=Fredoka+One&display=swap');
3
+
4
+ body {
5
+ margin: 0;
6
+ padding: 0;
7
+ font-family: 'Fredoka One', cursive;
8
+ background: linear-gradient(135deg, #8FBC8F, #3CB371);
9
+ touch-action: manipulation;
10
+ user-select: none;
11
+ overflow: hidden;
12
+ }
13
+ #game-container {
14
+ width: 100vw;
15
+ height: 100vh;
16
+ position: relative;
17
+ overflow: hidden;
18
+ }
19
+ .bug {
20
+ position: absolute;
21
+ cursor: pointer;
22
+ transition: transform 0.1s, opacity 0.3s;
23
+ background-size: contain;
24
+ background-repeat: no-repeat;
25
+ background-position: center;
26
+ }
27
+ .bug:active {
28
+ transform: scale(0.8) rotate(10deg);
29
+ }
30
+ .squished {
31
+ opacity: 0;
32
+ transform: scale(1.2) rotate(180deg);
33
+ }
34
+ #score, #timer, #level {
35
+ position: absolute;
36
+ font-size: 24px;
37
+ color: white;
38
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
39
+ background: rgba(0,0,0,0.3);
40
+ padding: 5px 10px;
41
+ border-radius: 10px;
42
+ }
43
+ #score { top: 10px; left: 10px; }
44
+ #timer { top: 10px; right: 10px; }
45
+ #level { top: 50px; left: 10px; }
46
+ #start-button, #tutorial-button {
47
+ position: absolute;
48
+ font-size: 24px;
49
+ padding: 15px 30px;
50
+ background-color: #4CAF50;
51
+ color: white;
52
+ border: none;
53
+ border-radius: 15px;
54
+ cursor: pointer;
55
+ transition: background-color 0.3s, transform 0.1s;
56
+ font-family: 'Fredoka One', cursive;
57
+ }
58
+ #start-button:hover, #tutorial-button:hover {
59
+ background-color: #45a049;
60
+ transform: scale(1.05);
61
+ }
62
+ #start-button { top: 40%; left: 50%; transform: translate(-50%, -50%); }
63
+ #tutorial-button { top: 55%; left: 50%; transform: translate(-50%, -50%); }
64
+ .powerup {
65
+ position: absolute;
66
+ width: 40px;
67
+ height: 40px;
68
+ border-radius: 50%;
69
+ background-size: contain;
70
+ cursor: pointer;
71
+ animation: pulse 1s infinite alternate;
72
+ }
73
+ @keyframes pulse {
74
+ from { transform: scale(1); }
75
+ to { transform: scale(1.1); }
76
+ }
77
+ #tutorial {
78
+ position: absolute;
79
+ top: 50%;
80
+ left: 50%;
81
+ transform: translate(-50%, -50%);
82
+ background: rgba(255,255,255,0.9);
83
+ padding: 20px;
84
+ border-radius: 10px;
85
+ text-align: center;
86
+ display: none;
87
+ }
88
+ #tutorial h2 { margin-top: 0; }
89
+ #tutorial button {
90
+ margin-top: 10px;
91
+ padding: 10px 20px;
92
+ background-color: #4CAF50;
93
+ color: white;
94
+ border: none;
95
+ border-radius: 5px;
96
+ cursor: pointer;
97
+ }
98
+ </style></head><body>
99
+ <div id="game-container">
100
+ <div id="score">Score: 0</div>
101
+ <div id="timer">Time: 60</div>
102
+ <div id="level">Level: 1</div>
103
+ <button id="start-button">Start Game</button>
104
+ <button id="tutorial-button">How to Play</button>
105
+ </div>
106
+
107
+ <div id="tutorial">
108
+ <h2>How to Play BugSquish Pro</h2>
109
+ <p>Tap or click on bugs to squish them. Different bugs have different health and points:</p>
110
+ <ul>
111
+ <li>Ants: 1 tap, 1 point</li>
112
+ <li>Beetles: 2 taps, 2 points</li>
113
+ <li>Spiders: 3 taps, 3 points</li>
114
+ </ul>
115
+ <p>Look out for power-ups to boost your score or freeze time!</p>
116
+ <button onclick="closeTutorial()">Got it!</button>
117
+ </div>
118
+
119
+ <script>
120
+ const gameContainer = document.getElementById('game-container');
121
+ const scoreElement = document.getElementById('score');
122
+ const timerElement = document.getElementById('timer');
123
+ const levelElement = document.getElementById('level');
124
+ const startButton = document.getElementById('start-button');
125
+ const tutorialButton = document.getElementById('tutorial-button');
126
+ const tutorial = document.getElementById('tutorial');
127
+
128
+ let score = 0;
129
+ let timeLeft = 60;
130
+ let level = 1;
131
+ let gameInterval;
132
+ let bugs = [];
133
+ let powerups = [];
134
+
135
+ const bugTypes = [
136
+ { name: 'ant', points: 1, health: 1, size: 30, image: 'ant.png', speed: 2 },
137
+ { name: 'beetle', points: 2, health: 2, size: 40, image: 'beetle.png', speed: 1.5 },
138
+ { name: 'spider', points: 3, health: 3, size: 50, image: 'spider.png', speed: 2.5 },
139
+ ];
140
+
141
+ const powerUpTypes = [
142
+ { name: 'freeze', duration: 5, image: 'freeze.png' },
143
+ { name: 'doublePoints', duration: 10, image: 'double.png' },
144
+ ];
145
+
146
+ function createBug() {
147
+ const bugType = bugTypes[Math.floor(Math.random() * bugTypes.length)];
148
+ const bug = document.createElement('div');
149
+ bug.className = 'bug';
150
+ bug.style.width = bug.style.height = `${bugType.size}px`;
151
+ bug.style.backgroundImage = `url(${bugType.image})`;
152
+ bug.style.left = `${Math.random() * (gameContainer.clientWidth - bugType.size)}px`;
153
+ bug.style.top = `${Math.random() * (gameContainer.clientHeight - bugType.size)}px`;
154
+
155
+ const bugData = {
156
+ element: bug,
157
+ health: bugType.health,
158
+ points: bugType.points,
159
+ speed: bugType.speed * (1 + (level - 1) * 0.1),
160
+ direction: Math.random() * 2 * Math.PI
161
+ };
162
+
163
+ bug.addEventListener('click', () => squishBug(bugData));
164
+ gameContainer.appendChild(bug);
165
+ bugs.push(bugData);
166
+ }
167
+
168
+ function createPowerUp() {
169
+ if (Math.random() < 0.1) {
170
+ const powerUpType = powerUpTypes[Math.floor(Math.random() * powerUpTypes.length)];
171
+ const powerUp = document.createElement('div');
172
+ powerUp.className = 'powerup';
173
+ powerUp.style.backgroundImage = `url(${powerUpType.image})`;
174
+ powerUp.style.left = `${Math.random() * (gameContainer.clientWidth - 40)}px`;
175
+ powerUp.style.top = `${Math.random() * (gameContainer.clientHeight - 40)}px`;
176
+
177
+ powerUp.addEventListener('click', () => activatePowerUp(powerUpType));
178
+ gameContainer.appendChild(powerUp);
179
+ powerups.push(powerUp);
180
+
181
+ setTimeout(() => {
182
+ if (powerups.includes(powerUp)) {
183
+ gameContainer.removeChild(powerUp);
184
+ powerups = powerups.filter(p => p !== powerUp);
185
+ }
186
+ }, 5000);
187
+ }
188
+ }
189
+
190
+ function activatePowerUp(powerUpType) {
191
+ if (powerUpType.name === 'freeze') {
192
+ bugs.forEach(bug => bug.element.style.animationPlayState = 'paused');
193
+ setTimeout(() => {
194
+ bugs.forEach(bug => bug.element.style.animationPlayState = 'running');
195
+ }, powerUpType.duration * 1000);
196
+ } else if (powerUpType.name === 'doublePoints') {
197
+ const originalPoints = bugTypes.map(bug => bug.points);
198
+ bugTypes.forEach(bug => bug.points *= 2);
199
+ setTimeout(() => {
200
+ bugTypes.forEach((bug, index) => bug.points = originalPoints[index]);
201
+ }, powerUpType.duration * 1000);
202
+ }
203
+ gameContainer.removeChild(event.target);
204
+ powerups = powerups.filter(p => p !== event.target);
205
+ }
206
+
207
+ function moveBugs() {
208
+ bugs.forEach(bug => {
209
+ const rect = bug.element.getBoundingClientRect();
210
+ let newX = rect.left + Math.cos(bug.direction) * bug.speed;
211
+ let newY = rect.top + Math.sin(bug.direction) * bug.speed;
212
+
213
+ if (newX <= 0 || newX + rect.width >= gameContainer.clientWidth) {
214
+ bug.direction = Math.PI - bug.direction;
215
+ }
216
+ if (newY <= 0 || newY + rect.height >= gameContainer.clientHeight) {
217
+ bug.direction = -bug.direction;
218
+ }
219
+
220
+ bug.element.style.left = `${newX}px`;
221
+ bug.element.style.top = `${newY}px`;
222
+ });
223
+ }
224
+
225
+ function squishBug(bug) {
226
+ bug.health--;
227
+ if (bug.health <= 0) {
228
+ score += bug.points;
229
+ scoreElement.textContent = `Score: ${score}`;
230
+ bug.element.classList.add('squished');
231
+ setTimeout(() => {
232
+ gameContainer.removeChild(bug.element);
233
+ bugs = bugs.filter(b => b !== bug);
234
+ createBug();
235
+ }, 300);
236
+ } else {
237
+ bug.element.style.opacity = bug.health / bugTypes.find(t => t.points === bug.points).health;
238
+ }
239
+ }
240
+
241
+ function startGame() {
242
+ score = 0;
243
+ timeLeft = 60;
244
+ level = 1;
245
+ bugs.forEach(bug => gameContainer.removeChild(bug.element));
246
+ powerups.forEach(powerup => gameContainer.removeChild(powerup));
247
+ bugs = [];
248
+ powerups = [];
249
+ scoreElement.textContent = 'Score: 0';
250
+ timerElement.textContent = 'Time: 60';
251
+ levelElement.textContent = 'Level: 1';
252
+ startButton.style.display = 'none';
253
+ tutorialButton.style.display = 'none';
254
+
255
+ for (let i = 0; i < 10; i++) {
256
+ createBug();
257
+ }
258
+
259
+ gameInterval = setInterval(() => {
260
+ timeLeft--;
261
+ timerElement.textContent = `Time: ${timeLeft}`;
262
+ moveBugs();
263
+ createPowerUp();
264
+
265
+ if (timeLeft <= 0) {
266
+ clearInterval(gameInterval);
267
+ endGame();
268
+ } else if (timeLeft % 20 === 0) {
269
+ levelUp();
270
+ }
271
+ }, 1000);
272
+ }
273
+
274
+ function levelUp() {
275
+ level++;
276
+ levelElement.textContent = `Level: ${level}`;
277
+ for (let i = 0; i < 2; i++) {
278
+ createBug();
279
+ }
280
+ }
281
+
282
+ function endGame() {
283
+ bugs.forEach(bug => gameContainer.removeChild(bug.element));
284
+ powerups.forEach(powerup => gameContainer.removeChild(powerup));
285
+ bugs = [];
286
+ powerups = [];
287
+ alert(`Game Over! Your score: ${score}`);
288
+ startButton.style.display = 'block';
289
+ tutorialButton.style.display = 'block';
290
+ }
291
+
292
+ function showTutorial() {
293
+ tutorial.style.display = 'block';
294
+ }
295
+
296
+ function closeTutorial() {
297
+ tutorial.style.display = 'none';
298
+ }
299
+
300
+ startButton.addEventListener('click', startGame);
301
+ tutorialButton.addEventListener('click', showTutorial);
302
+ </script>
303
+ </body></html>
YQVELXyRHVtPLOLZ0.html ADDED
@@ -0,0 +1,375 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/" />
2
+ <title>PropNet Builder - Advanced Propagator Network Editor</title>
3
+ <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
4
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jsPlumb/2.15.6/js/jsplumb.min.js"></script>
5
+ <style>
6
+ body, html {
7
+ margin: 0;
8
+ padding: 0;
9
+ height: 100%;
10
+ font-family: Arial, sans-serif;
11
+ }
12
+ #app {
13
+ height: 100vh;
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
17
+ .controls {
18
+ background-color: #f0f0f0;
19
+ padding: 10px;
20
+ display: flex;
21
+ justify-content: center;
22
+ gap: 10px;
23
+ }
24
+ button, select {
25
+ padding: 10px;
26
+ font-size: 16px;
27
+ border: none;
28
+ border-radius: 4px;
29
+ cursor: pointer;
30
+ }
31
+ button {
32
+ background-color: #4CAF50;
33
+ color: white;
34
+ }
35
+ button:hover {
36
+ background-color: #45a049;
37
+ }
38
+ select {
39
+ background-color: #f8f8f8;
40
+ }
41
+ .network-canvas {
42
+ flex-grow: 1;
43
+ position: relative;
44
+ overflow: hidden;
45
+ background-color: #f0f0f0;
46
+ }
47
+ .node {
48
+ width: 200px;
49
+ background-color: #3498db;
50
+ border-radius: 8px;
51
+ color: white;
52
+ position: absolute;
53
+ cursor: move;
54
+ user-select: none;
55
+ display: flex;
56
+ flex-direction: column;
57
+ align-items: center;
58
+ padding: 10px;
59
+ box-sizing: border-box;
60
+ }
61
+ .node-title {
62
+ font-weight: bold;
63
+ margin-bottom: 5px;
64
+ }
65
+ .node.prompt-node { background-color: #e74c3c; }
66
+ .node.combine-node { background-color: #2ecc71; }
67
+ .node.text-node { background-color: #9b59b6; }
68
+ .node.delay-node { background-color: #f39c12; }
69
+ .connection-point {
70
+ width: 10px;
71
+ height: 10px;
72
+ background-color: #f39c12;
73
+ border-radius: 50%;
74
+ position: absolute;
75
+ }
76
+ .connection-point.input { top: 25px; left: -5px; }
77
+ .connection-point.output { top: 25px; right: -5px; }
78
+ .node textarea, .node input[type="number"] {
79
+ width: 180px;
80
+ margin-top: 5px;
81
+ }
82
+ .node textarea { height: 60px; resize: vertical; }
83
+ .node .output-text {
84
+ width: 180px;
85
+ height: 60px;
86
+ margin-top: 5px;
87
+ background-color: rgba(255, 255, 255, 0.2);
88
+ color: white;
89
+ padding: 5px;
90
+ border-radius: 4px;
91
+ overflow-y: auto;
92
+ }
93
+ .edit-button {
94
+ position: absolute;
95
+ top: 5px;
96
+ right: 5px;
97
+ background-color: rgba(255, 255, 255, 0.3);
98
+ border: none;
99
+ border-radius: 3px;
100
+ padding: 2px 5px;
101
+ cursor: pointer;
102
+ }
103
+ .edit-menu {
104
+ position: absolute;
105
+ top: 100%;
106
+ right: 0;
107
+ background-color: white;
108
+ border: 1px solid #ccc;
109
+ border-radius: 4px;
110
+ padding: 5px;
111
+ z-index: 1000;
112
+ }
113
+ .edit-menu button {
114
+ display: block;
115
+ width: 100%;
116
+ text-align: left;
117
+ background: none;
118
+ border: none;
119
+ padding: 5px;
120
+ cursor: pointer;
121
+ }
122
+ .edit-menu button:hover {
123
+ background-color: #f0f0f0;
124
+ }
125
+ .status-bar {
126
+ background-color: #34495e;
127
+ color: white;
128
+ padding: 5px 10px;
129
+ text-align: center;
130
+ }
131
+ </style>
132
+ </head>
133
+ <body>
134
+ <div id="app">
135
+ <div class="controls">
136
+ <button @click="addNode">Add Node</button>
137
+ <select v-model="selectedNodeType">
138
+ <option value="prompt-node">Prompt Node</option>
139
+ <option value="combine-node">Combine Node</option>
140
+ <option value="text-node">Text Node</option>
141
+ <option value="delay-node">Delay Node</option>
142
+ </select>
143
+ </div>
144
+ <div class="status-bar">
145
+ {{ statusMessage }}
146
+ </div>
147
+ <div class="network-canvas" ref="canvas">
148
+ <div v-for="node in nodes" :key="node.id" :id="node.id" class="node" :class="node.type"
149
+ :style="{ left: node.x + 'px', top: node.y + 'px' }">
150
+ <div class="node-title">{{ node.type }}</div>
151
+ <textarea v-if="['prompt-node', 'text-node'].includes(node.type)"
152
+ v-model="node.data.text" placeholder="Enter text..." @input="handleUserInput(node)"></textarea>
153
+ <input v-if="node.type === 'delay-node'" type="number" v-model="node.data.delay" @input="handleUserInput(node)" placeholder="Delay (ms)">
154
+ <div v-if="['prompt-node', 'combine-node'].includes(node.type)" class="output-text">{{ node.data.output }}</div>
155
+ <div class="connection-point input"></div>
156
+ <div class="connection-point output"></div>
157
+ <button class="edit-button" @click="toggleEditMenu(node)">⋮</button>
158
+ <div v-if="node.showEditMenu" class="edit-menu">
159
+ <button @click="deleteNode(node)">Delete Node</button>
160
+ <button @click="disconnectNode(node)">Disconnect All</button>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+
166
+ <script>
167
+ const { createApp, ref, onMounted, watch } = Vue;
168
+
169
+ createApp({
170
+ setup() {
171
+ const nodes = ref([]);
172
+ const selectedNodeType = ref('prompt-node');
173
+ const canvas = ref(null);
174
+ let jsPlumbInstance;
175
+ const statusMessage = ref('System ready');
176
+ let lastUserInputTime = Date.now();
177
+ let inactivityTimer = null;
178
+
179
+ onMounted(() => {
180
+ jsPlumbInstance = jsPlumb.getInstance();
181
+ jsPlumbInstance.setContainer(canvas.value);
182
+
183
+ jsPlumbInstance.bind("ready", function() {
184
+ jsPlumbInstance.registerConnectionType("basic", {
185
+ anchor: ["Left", "Right"],
186
+ connector: ["Bezier", { curviness: 50 }],
187
+ paintStyle: { stroke: "#f39c12", strokeWidth: 4 },
188
+ hoverPaintStyle: { stroke: "#2980b9", strokeWidth: 6 },
189
+ });
190
+ });
191
+
192
+ jsPlumbInstance.bind("connection", function(info) {
193
+ const sourceNode = nodes.value.find(node => node.id === info.sourceId);
194
+ const targetNode = nodes.value.find(node => node.id === info.targetId);
195
+ if (sourceNode && targetNode) {
196
+ if (!targetNode.inputs) targetNode.inputs = [];
197
+ targetNode.inputs.push(sourceNode);
198
+ updateNode(targetNode);
199
+ }
200
+ });
201
+
202
+ jsPlumbInstance.bind("connectionDetached", function(info) {
203
+ const targetNode = nodes.value.find(node => node.id === info.targetId);
204
+ if (targetNode) {
205
+ targetNode.inputs = targetNode.inputs.filter(input => input.id !== info.sourceId);
206
+ updateNode(targetNode);
207
+ }
208
+ });
209
+
210
+ startInactivityTimer();
211
+ });
212
+
213
+ function addNode() {
214
+ const newNode = {
215
+ id: `node-${Date.now()}`,
216
+ type: selectedNodeType.value,
217
+ x: Math.random() * (canvas.value.clientWidth - 200),
218
+ y: Math.random() * (canvas.value.clientHeight - 100),
219
+ data: {
220
+ text: '',
221
+ output: '',
222
+ delay: 1000,
223
+ },
224
+ inputs: [],
225
+ showEditMenu: false,
226
+ };
227
+ nodes.value.push(newNode);
228
+
229
+ setTimeout(() => {
230
+ makeNodeDraggable(newNode.id);
231
+ addEndpoints(newNode.id);
232
+ }, 0);
233
+
234
+ handleUserInput();
235
+ }
236
+
237
+ function makeNodeDraggable(id) {
238
+ jsPlumbInstance.draggable(id, {
239
+ grid: [10, 10],
240
+ stop: function(event) {
241
+ const nodeElement = event.el;
242
+ const nodeId = nodeElement.id;
243
+ const node = nodes.value.find(n => n.id === nodeId);
244
+ if (node) {
245
+ node.x = parseInt(nodeElement.style.left, 10);
246
+ node.y = parseInt(nodeElement.style.top, 10);
247
+ }
248
+ handleUserInput();
249
+ }
250
+ });
251
+ }
252
+
253
+ function addEndpoints(id) {
254
+ jsPlumbInstance.addEndpoint(id, {
255
+ anchor: "Left",
256
+ isSource: false,
257
+ isTarget: true,
258
+ maxConnections: -1,
259
+ endpoint: ["Dot", { radius: 7 }],
260
+ paintStyle: { fill: "#f39c12" },
261
+ });
262
+
263
+ jsPlumbInstance.addEndpoint(id, {
264
+ anchor: "Right",
265
+ isSource: true,
266
+ isTarget: false,
267
+ maxConnections: -1,
268
+ endpoint: ["Dot", { radius: 7 }],
269
+ paintStyle: { fill: "#f39c12" },
270
+ connectorStyle: { stroke: "#f39c12", strokeWidth: 4 },
271
+ connector: ["Bezier", { curviness: 50 }],
272
+ connectionType: "basic",
273
+ });
274
+ }
275
+
276
+ async function updateNode(node) {
277
+ const inputData = node.inputs.map(input => input.data.output || input.data.text);
278
+
279
+ if (node.type === 'prompt-node') {
280
+ const instruction = node.data.text;
281
+ try {
282
+ statusMessage.value = 'Processing request...';
283
+ await new Promise(resolve => setTimeout(resolve, 5000)); // Minimum 5 second delay
284
+ const response = await fetch('/api/llm', {
285
+ method: 'POST',
286
+ headers: { 'Content-Type': 'application/json' },
287
+ body: JSON.stringify({ instruction, input: inputData.join('\n') }),
288
+ });
289
+ const data = await response.json();
290
+ node.data.output = data.response;
291
+ statusMessage.value = 'Request completed';
292
+ } catch (error) {
293
+ console.error('Error calling LLM API:', error);
294
+ node.data.output = 'Error: Unable to process request';
295
+ statusMessage.value = 'Error in processing request';
296
+ }
297
+ } else if (node.type === 'text-node') {
298
+ node.data.output = node.data.text;
299
+ } else if (node.type === 'combine-node') {
300
+ node.data.output = inputData.join('\n');
301
+ } else if (node.type === 'delay-node') {
302
+ setTimeout(() => {
303
+ node.data.output = inputData[0] || '';
304
+ propagateUpdate(node);
305
+ }, Math.max(node.data.delay, 5000)); // Ensure minimum 5 second delay
306
+ return; // Early return to prevent immediate propagation
307
+ }
308
+
309
+ propagateUpdate(node);
310
+ }
311
+
312
+ function propagateUpdate(node) {
313
+ const connectedNodes = nodes.value.filter(n => n.inputs.includes(node));
314
+ connectedNodes.forEach(updateNode);
315
+
316
+ Vue.nextTick(() => {
317
+ jsPlumbInstance.repaintEverything();
318
+ });
319
+ }
320
+
321
+ function toggleEditMenu(node) {
322
+ node.showEditMenu = !node.showEditMenu;
323
+ handleUserInput();
324
+ }
325
+
326
+ function deleteNode(nodeToDelete) {
327
+ jsPlumbInstance.remove(nodeToDelete.id);
328
+ nodes.value = nodes.value.filter(node => node.id !== nodeToDelete.id);
329
+ nodes.value.forEach(node => {
330
+ node.inputs = node.inputs.filter(input => input.id !== nodeToDelete.id);
331
+ });
332
+ handleUserInput();
333
+ }
334
+
335
+ function disconnectNode(node) {
336
+ jsPlumbInstance.deleteConnectionsForElement(node.id);
337
+ node.inputs = [];
338
+ updateNode(node);
339
+ handleUserInput();
340
+ }
341
+
342
+ function handleUserInput(node) {
343
+ lastUserInputTime = Date.now();
344
+ if (inactivityTimer) {
345
+ clearTimeout(inactivityTimer);
346
+ }
347
+ startInactivityTimer();
348
+
349
+ if (node) {
350
+ updateNode(node);
351
+ }
352
+ }
353
+
354
+ function startInactivityTimer() {
355
+ inactivityTimer = setTimeout(() => {
356
+ statusMessage.value = 'Inactive for 1 minute. Prompt requests paused.';
357
+ }, 60000);
358
+ }
359
+
360
+ return {
361
+ nodes,
362
+ selectedNodeType,
363
+ canvas,
364
+ statusMessage,
365
+ addNode,
366
+ updateNode,
367
+ toggleEditMenu,
368
+ deleteNode,
369
+ disconnectNode,
370
+ handleUserInput
371
+ };
372
+ }
373
+ }).mount('#app');
374
+ </script>
375
+ </body></html>
b0nTIje2IorBnxbn4.html ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/geometry-insights"><title>Geometry Insights - Interactive 3D Weaire-Phelan Structure with Dodecahedra</title>
2
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ line-height: 1.6;
7
+ color: #333;
8
+ margin: 0;
9
+ padding: 20px;
10
+ background-color: #f0f8ff;
11
+ }
12
+ h1 {
13
+ color: #1a5f7a;
14
+ border-bottom: 2px solid #1a5f7a;
15
+ padding-bottom: 10px;
16
+ }
17
+ #model-container {
18
+ width: 100%;
19
+ height: 400px;
20
+ background-color: #e6f3ff;
21
+ border: 1px solid #b0d4ff;
22
+ border-radius: 5px;
23
+ margin: 20px 0;
24
+ }
25
+ .controls {
26
+ display: flex;
27
+ justify-content: center;
28
+ gap: 10px;
29
+ margin-top: 10px;
30
+ }
31
+ button {
32
+ background-color: #4a90e2;
33
+ color: white;
34
+ border: none;
35
+ padding: 10px 15px;
36
+ border-radius: 5px;
37
+ cursor: pointer;
38
+ transition: background-color 0.3s;
39
+ }
40
+ button:hover {
41
+ background-color: #357abd;
42
+ }
43
+ </style>
44
+ </head><body>
45
+ <h1>Interactive 3D Weaire-Phelan Structure with Dodecahedra</h1>
46
+
47
+ <div id="model-container"></div>
48
+ <div class="controls">
49
+ <button id="rotate">Toggle Rotation</button>
50
+ <button id="wireframe">Toggle Wireframe</button>
51
+ <button id="explode">Explode/Implode</button>
52
+ </div>
53
+
54
+ <script>
55
+ let scene, camera, renderer, dodecahedra = [];
56
+ let isRotating = true;
57
+ let isWireframe = false;
58
+ let isExploded = false;
59
+
60
+ function init() {
61
+ scene = new THREE.Scene();
62
+ camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
63
+ renderer = new THREE.WebGLRenderer({ antialias: true });
64
+ renderer.setSize(window.innerWidth, window.innerHeight);
65
+ document.getElementById('model-container').appendChild(renderer.domElement);
66
+
67
+ camera.position.z = 10;
68
+
69
+ createWeairePhelanStructure();
70
+
71
+ const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
72
+ scene.add(ambientLight);
73
+
74
+ const pointLight = new THREE.PointLight(0xffffff, 0.5);
75
+ pointLight.position.set(5, 5, 5);
76
+ scene.add(pointLight);
77
+
78
+ window.addEventListener('resize', onWindowResize, false);
79
+
80
+ document.getElementById('rotate').addEventListener('click', toggleRotation);
81
+ document.getElementById('wireframe').addEventListener('click', toggleWireframe);
82
+ document.getElementById('explode').addEventListener('click', toggleExplode);
83
+
84
+ animate();
85
+ }
86
+
87
+ function createWeairePhelanStructure() {
88
+ const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio
89
+ const scale = 0.5;
90
+
91
+ const dodecahedronGeometry = new THREE.DodecahedronGeometry(scale);
92
+ const material = new THREE.MeshPhongMaterial({ color: 0x4a90e2, flatShading: true });
93
+
94
+ // Create a 2x2x2 grid of dodecahedra
95
+ for (let x = -1; x <= 1; x += 2) {
96
+ for (let y = -1; y <= 1; y += 2) {
97
+ for (let z = -1; z <= 1; z += 2) {
98
+ const dodecahedron = new THREE.Mesh(dodecahedronGeometry, material);
99
+ dodecahedron.position.set(x * scale * phi, y * scale * phi, z * scale * phi);
100
+ scene.add(dodecahedron);
101
+ dodecahedra.push(dodecahedron);
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ function animate() {
108
+ requestAnimationFrame(animate);
109
+
110
+ if (isRotating) {
111
+ dodecahedra.forEach(dodecahedron => {
112
+ dodecahedron.rotation.x += 0.01;
113
+ dodecahedron.rotation.y += 0.01;
114
+ });
115
+ }
116
+
117
+ renderer.render(scene, camera);
118
+ }
119
+
120
+ function onWindowResize() {
121
+ camera.aspect = window.innerWidth / window.innerHeight;
122
+ camera.updateProjectionMatrix();
123
+ renderer.setSize(window.innerWidth, window.innerHeight);
124
+ }
125
+
126
+ function toggleRotation() {
127
+ isRotating = !isRotating;
128
+ }
129
+
130
+ function toggleWireframe() {
131
+ isWireframe = !isWireframe;
132
+ dodecahedra.forEach(dodecahedron => {
133
+ dodecahedron.material.wireframe = isWireframe;
134
+ });
135
+ }
136
+
137
+ function toggleExplode() {
138
+ isExploded = !isExploded;
139
+ const phi = (1 + Math.sqrt(5)) / 2;
140
+ const scale = isExploded ? 1 : 0.5;
141
+
142
+ dodecahedra.forEach(dodecahedron => {
143
+ const { x, y, z } = dodecahedron.position;
144
+ dodecahedron.position.set(
145
+ x > 0 ? scale * phi : -scale * phi,
146
+ y > 0 ? scale * phi : -scale * phi,
147
+ z > 0 ? scale * phi : -scale * phi
148
+ );
149
+ });
150
+ }
151
+
152
+ init();
153
+ </script>
154
+
155
+ <p>This interactive 3D model now demonstrates a simplified version of the Weaire-Phelan structure using dodecahedra. While it doesn't capture all the intricacies of the actual structure (which includes both dodecahedra and tetrakaidecahedra), it provides a visual representation of how the dodecahedral cells are arranged in three-dimensional space.</p>
156
+
157
+ <p>Use the controls below the model to:</p>
158
+ <ul>
159
+ <li><strong>Toggle Rotation:</strong> Start or stop the automatic rotation of the structure.</li>
160
+ <li><strong>Toggle Wireframe:</strong> Switch between solid and wireframe views to better observe the structure's geometry.</li>
161
+ <li><strong>Explode/Implode:</strong> Separate or bring together the dodecahedra to better visualize individual cells.</li>
162
+ </ul>
163
+
164
+ <p>Key points about this model:</p>
165
+ <ul>
166
+ <li>The structure consists of 8 dodecahedra arranged in a 2x2x2 grid.</li>
167
+ <li>Each dodecahedron is positioned using the golden ratio (phi) to approximate the Weaire-Phelan structure's proportions.</li>
168
+ <li>The explode/implode function helps visualize how these cells pack together in the structure.</li>
169
+ </ul>
170
+
171
+ <p>Remember, the actual Weaire-Phelan structure is more complex, consisting of both irregular dodecahedra and tetrakaidecahedra. This model focuses on the dodecahedral component to give you a general idea of its three-dimensional nature and packing.</p>
172
+
173
+ <p>For a more detailed exploration of the Weaire-Phelan structure and its properties, consider visiting our other pages:</p>
174
+
175
+ <ul>
176
+ <li><a href="https://websim.ai/geometry-insights/weaire-phelan-full-structure">Complete Weaire-Phelan Structure</a></li>
177
+ <li><a href="https://websim.ai/geometry-insights/foam-geometry">Geometry of Foams and Minimal Surfaces</a></li>
178
+ <li><a href="https://websim.ai/geometry-insights/applications-in-nature">Weaire-Phelan Structure in Nature</a></li>
179
+ </ul>
180
+
181
+ </body></html>
bDWjOaPOtlaMLADFT.html ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>WebSim Video Player</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ background-color: #f0f0f0;
7
+ margin: 0;
8
+ padding: 20px;
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: center;
12
+ }
13
+ .video-container {
14
+ background-color: white;
15
+ border-radius: 10px;
16
+ padding: 20px;
17
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
18
+ }
19
+ h1 {
20
+ color: #333;
21
+ margin-bottom: 20px;
22
+ }
23
+ .description {
24
+ max-width: 512px;
25
+ text-align: center;
26
+ margin-top: 20px;
27
+ color: #666;
28
+ }
29
+ .related-links {
30
+ margin-top: 30px;
31
+ }
32
+ .related-links a {
33
+ display: inline-block;
34
+ margin: 0 10px;
35
+ color: #0066cc;
36
+ text-decoration: none;
37
+ }
38
+ .related-links a:hover {
39
+ text-decoration: underline;
40
+ }
41
+ </style>
42
+ </head>
43
+ <body>
44
+ <h1>WebSim Educational Video Portal</h1>
45
+ <div class="video-container">
46
+ <iframe width="512" height="332" src="https://player.pbs.org/viralplayer/3009692333/" allowfullscreen allow="encrypted-media" style="border: 0;"></iframe>
47
+ </div>
48
+ <p class="description">
49
+ Welcome to the WebSim Educational Video Portal. Here, we curate thought-provoking content from various sources to expand your understanding of the digital world and beyond.
50
+ </p>
51
+ <div class="related-links">
52
+ <a href="https://websim.ai/learn/web-history">Web History</a>
53
+ <a href="https://websim.ai/explore/digital-literacy">Digital Literacy</a>
54
+ <a href="https://websim.ai/simulate/future-web">Simulate Future Web</a>
55
+ </div>
56
+ </body></html>
eDcZGrhdCEYZ00ATI.html ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/code-interpreter"><title>Cute Chick Catches Basketball</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Comic Sans MS', cursive, sans-serif;
5
+ background-color: #FFE5E5;
6
+ margin: 0;
7
+ padding: 20px;
8
+ display: flex;
9
+ justify-content: center;
10
+ align-items: center;
11
+ height: 100vh;
12
+ }
13
+ .game-container {
14
+ background-color: #FFF0F5;
15
+ border-radius: 20px;
16
+ box-shadow: 0 0 20px rgba(255,105,180,0.3);
17
+ padding: 20px;
18
+ text-align: center;
19
+ }
20
+ canvas {
21
+ border: 4px solid #FF69B4;
22
+ border-radius: 10px;
23
+ background-color: #E6E6FA;
24
+ }
25
+ h1 {
26
+ color: #FF1493;
27
+ font-size: 28px;
28
+ margin-bottom: 10px;
29
+ }
30
+ p {
31
+ color: #8B008B;
32
+ font-size: 18px;
33
+ }
34
+ button {
35
+ background-color: #FF69B4;
36
+ border: none;
37
+ color: white;
38
+ padding: 15px 32px;
39
+ text-align: center;
40
+ text-decoration: none;
41
+ display: inline-block;
42
+ font-size: 18px;
43
+ margin: 10px 2px;
44
+ cursor: pointer;
45
+ border-radius: 25px;
46
+ transition: background-color 0.3s;
47
+ }
48
+ button:hover {
49
+ background-color: #FF1493;
50
+ }
51
+ #score {
52
+ font-size: 24px;
53
+ font-weight: bold;
54
+ color: #FF1493;
55
+ }
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <div class="game-container">
60
+ <h1>Cute Chick Catches Basketball</h1>
61
+ <canvas id="gameCanvas" width="400" height="400"></canvas>
62
+ <p>Use the mouse to move the cute chick and catch the colorful basketballs!</p>
63
+ <button onclick="startGame()">Start Game</button>
64
+ <p id="score">Score: 0</p>
65
+ </div>
66
+
67
+ <script>
68
+ const canvas = document.getElementById('gameCanvas');
69
+ const ctx = canvas.getContext('2d');
70
+
71
+ let chickenX = 200;
72
+ let chickenY = 350;
73
+ let ballX = Math.random() * 360 + 20;
74
+ let ballY = 0;
75
+ let ballSpeed = 4;
76
+ let score = 0;
77
+ let gameRunning = false;
78
+
79
+ function drawChicken() {
80
+ // Body
81
+ ctx.fillStyle = '#FFD700';
82
+ ctx.beginPath();
83
+ ctx.arc(chickenX, chickenY - 25, 25, 0, Math.PI * 2);
84
+ ctx.fill();
85
+
86
+ // Overalls
87
+ ctx.fillStyle = '#FFFFFF';
88
+ ctx.fillRect(chickenX - 20, chickenY - 15, 40, 35);
89
+ ctx.strokeStyle = '#000000';
90
+ ctx.lineWidth = 2;
91
+ ctx.strokeRect(chickenX - 20, chickenY - 15, 40, 35);
92
+
93
+ // Straps
94
+ ctx.beginPath();
95
+ ctx.moveTo(chickenX - 15, chickenY - 15);
96
+ ctx.lineTo(chickenX - 15, chickenY + 20);
97
+ ctx.moveTo(chickenX + 15, chickenY - 15);
98
+ ctx.lineTo(chickenX + 15, chickenY + 20);
99
+ ctx.stroke();
100
+
101
+ // Hair
102
+ ctx.fillStyle = '#808080';
103
+ ctx.beginPath();
104
+ ctx.moveTo(chickenX - 20, chickenY - 30);
105
+ ctx.lineTo(chickenX, chickenY - 45);
106
+ ctx.lineTo(chickenX + 20, chickenY - 30);
107
+ ctx.closePath();
108
+ ctx.fill();
109
+
110
+ // Eyes
111
+ ctx.fillStyle = '#000000';
112
+ ctx.beginPath();
113
+ ctx.arc(chickenX - 10, chickenY - 30, 3, 0, Math.PI * 2);
114
+ ctx.arc(chickenX + 10, chickenY - 30, 3, 0, Math.PI * 2);
115
+ ctx.fill();
116
+
117
+ // Smile
118
+ ctx.beginPath();
119
+ ctx.arc(chickenX, chickenY - 20, 12, 0.1 * Math.PI, 0.9 * Math.PI);
120
+ ctx.stroke();
121
+
122
+ // Legs
123
+ ctx.strokeStyle = '#FFA500';
124
+ ctx.lineWidth = 3;
125
+ ctx.beginPath();
126
+ ctx.moveTo(chickenX - 10, chickenY + 20);
127
+ ctx.lineTo(chickenX - 10, chickenY + 30);
128
+ ctx.moveTo(chickenX + 10, chickenY + 20);
129
+ ctx.lineTo(chickenX + 10, chickenY + 30);
130
+ ctx.stroke();
131
+ }
132
+
133
+ function drawBall() {
134
+ let gradient = ctx.createRadialGradient(ballX, ballY, 0, ballX, ballY, 20);
135
+ gradient.addColorStop(0, '#FF69B4');
136
+ gradient.addColorStop(0.5, '#FF1493');
137
+ gradient.addColorStop(1, '#C71585');
138
+
139
+ ctx.fillStyle = gradient;
140
+ ctx.beginPath();
141
+ ctx.arc(ballX, ballY, 20, 0, Math.PI * 2);
142
+ ctx.fill();
143
+
144
+ ctx.strokeStyle = '#FFFFFF';
145
+ ctx.lineWidth = 2;
146
+ ctx.beginPath();
147
+ ctx.moveTo(ballX - 20, ballY);
148
+ ctx.lineTo(ballX + 20, ballY);
149
+ ctx.moveTo(ballX, ballY - 20);
150
+ ctx.lineTo(ballX, ballY + 20);
151
+ ctx.stroke();
152
+ }
153
+
154
+ function updateGame() {
155
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
156
+
157
+ drawChicken();
158
+ drawBall();
159
+
160
+ ballY += ballSpeed;
161
+
162
+ if (ballY > chickenY - 45 && ballY < chickenY + 10 &&
163
+ Math.abs(ballX - chickenX) < 40) {
164
+ ballY = 0;
165
+ ballX = Math.random() * 360 + 20;
166
+ score++;
167
+ updateScore();
168
+ ballSpeed += 0.2;
169
+ }
170
+
171
+ if (ballY > canvas.height) {
172
+ gameRunning = false;
173
+ showGameOver();
174
+ }
175
+
176
+ if (gameRunning) {
177
+ requestAnimationFrame(updateGame);
178
+ }
179
+ }
180
+
181
+ function startGame() {
182
+ if (!gameRunning) {
183
+ gameRunning = true;
184
+ score = 0;
185
+ ballSpeed = 4;
186
+ ballY = 0;
187
+ ballX = Math.random() * 360 + 20;
188
+ updateScore();
189
+ updateGame();
190
+ }
191
+ }
192
+
193
+ function updateScore() {
194
+ document.getElementById('score').textContent = `Score: ${score}`;
195
+ }
196
+
197
+ function showGameOver() {
198
+ ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
199
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
200
+
201
+ ctx.fillStyle = '#FFFFFF';
202
+ ctx.font = '30px Comic Sans MS';
203
+ ctx.textAlign = 'center';
204
+ ctx.fillText('Game Over!', canvas.width / 2, canvas.height / 2 - 30);
205
+ ctx.fillText(`Your total score is: ${score}`, canvas.width / 2, canvas.height / 2 + 20);
206
+ }
207
+
208
+ canvas.addEventListener('mousemove', (e) => {
209
+ let rect = canvas.getBoundingClientRect();
210
+ chickenX = e.clientX - rect.left;
211
+ chickenX = Math.max(25, Math.min(chickenX, canvas.width - 25));
212
+ });
213
+ </script>
214
+ </body></html>
eLVIZm95PqDycHF0i.html ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>Welcome to WebSim - Interactive Web Environment</title>
3
+ <style>
4
+ body, html {
5
+ margin: 0;
6
+ padding: 0;
7
+ font-family: 'Ubuntu Condensed', Arial, sans-serif;
8
+ background-color: #1a1a2e;
9
+ color: #e0e0e0;
10
+ height: 100%;
11
+ overflow: hidden;
12
+ }
13
+ #main_canvas {
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ z-index: -1;
20
+ }
21
+ #load_progress {
22
+ position: fixed;
23
+ top: 50%;
24
+ left: 50%;
25
+ transform: translate(-50%, -50%);
26
+ width: 200px;
27
+ height: 20px;
28
+ }
29
+ .body_dialog {
30
+ background-color: rgba(26, 26, 46, 0.9);
31
+ border: 2px solid #4a4e69;
32
+ border-radius: 10px;
33
+ color: #e0e0e0;
34
+ padding: 20px;
35
+ max-width: 80%;
36
+ max-height: 80%;
37
+ overflow-y: auto;
38
+ }
39
+ .dialog_content_left, .dialog_content_middle, .dialog_content_right {
40
+ display: inline-block;
41
+ vertical-align: top;
42
+ padding: 10px;
43
+ }
44
+ .menu {
45
+ position: fixed;
46
+ top: 20px;
47
+ left: 20px;
48
+ z-index: 100;
49
+ }
50
+ .menu-item {
51
+ display: block;
52
+ margin-bottom: 10px;
53
+ padding: 10px;
54
+ background-color: #4a4e69;
55
+ color: #e0e0e0;
56
+ text-decoration: none;
57
+ border-radius: 5px;
58
+ transition: background-color 0.3s;
59
+ }
60
+ .menu-item:hover {
61
+ background-color: #22223b;
62
+ }
63
+ @keyframes float {
64
+ 0% { transform: translateY(0px); }
65
+ 50% { transform: translateY(-20px); }
66
+ 100% { transform: translateY(0px); }
67
+ }
68
+ .floating-element {
69
+ position: absolute;
70
+ animation: float 6s ease-in-out infinite;
71
+ }
72
+ </style>
73
+ </head>
74
+ <body>
75
+ <canvas id="main_canvas"></canvas>
76
+ <progress id="load_progress" value="0" max="100"></progress>
77
+
78
+ <nav class="menu">
79
+ <a href="#home" class="menu-item">Home</a>
80
+ <a href="#about" class="menu-item">About</a>
81
+ <a href="#projects" class="menu-item">Projects</a>
82
+ <a href="#technologies" class="menu-item">Technologies</a>
83
+ <a href="#contact" class="menu-item">Contact</a>
84
+ </nav>
85
+
86
+ <div id="content"></div>
87
+
88
+ <script>
89
+ const canvas = document.getElementById('main_canvas');
90
+ const ctx = canvas.getContext('2d');
91
+ const progress = document.getElementById('load_progress');
92
+ const content = document.getElementById('content');
93
+
94
+ // Resize canvas to fit window
95
+ function resizeCanvas() {
96
+ canvas.width = window.innerWidth;
97
+ canvas.height = window.innerHeight;
98
+ }
99
+ window.addEventListener('resize', resizeCanvas);
100
+ resizeCanvas();
101
+
102
+ // Simulate loading
103
+ let loadProgress = 0;
104
+ const loadInterval = setInterval(() => {
105
+ loadProgress += Math.random() * 10;
106
+ if (loadProgress >= 100) {
107
+ loadProgress = 100;
108
+ clearInterval(loadInterval);
109
+ progress.style.display = 'none';
110
+ startSimulation();
111
+ }
112
+ progress.value = loadProgress;
113
+ }, 200);
114
+
115
+ // WebSim environment simulation
116
+ function startSimulation() {
117
+ const particles = [];
118
+ const maxParticles = 100;
119
+
120
+ class Particle {
121
+ constructor() {
122
+ this.x = Math.random() * canvas.width;
123
+ this.y = Math.random() * canvas.height;
124
+ this.size = Math.random() * 5 + 1;
125
+ this.speedX = Math.random() * 3 - 1.5;
126
+ this.speedY = Math.random() * 3 - 1.5;
127
+ this.color = `hsl(${Math.random() * 360}, 50%, 50%)`;
128
+ }
129
+
130
+ update() {
131
+ this.x += this.speedX;
132
+ this.y += this.speedY;
133
+
134
+ if (this.size > 0.2) this.size -= 0.1;
135
+
136
+ if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;
137
+ if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;
138
+ }
139
+
140
+ draw() {
141
+ ctx.fillStyle = this.color;
142
+ ctx.beginPath();
143
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
144
+ ctx.fill();
145
+ }
146
+ }
147
+
148
+ function handleParticles() {
149
+ for (let i = 0; i < particles.length; i++) {
150
+ particles[i].update();
151
+ particles[i].draw();
152
+
153
+ if (particles[i].size <= 0.2) {
154
+ particles.splice(i, 1);
155
+ i--;
156
+ }
157
+ }
158
+
159
+ if (particles.length < maxParticles) {
160
+ particles.push(new Particle());
161
+ }
162
+ }
163
+
164
+ function animate() {
165
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
166
+ handleParticles();
167
+ requestAnimationFrame(animate);
168
+ }
169
+
170
+ animate();
171
+ }
172
+
173
+ // Simple routing
174
+ function loadContent(route) {
175
+ const contentMap = {
176
+ '#home': 'Welcome to WebSim - where imagination meets the web!',
177
+ '#about': 'WebSim is an interactive web environment simulation platform.',
178
+ '#projects': 'Explore endless possibilities with WebSim projects.',
179
+ '#technologies': 'WebSim utilizes cutting-edge web technologies.',
180
+ '#contact': 'Get in touch with us at [email protected]'
181
+ };
182
+
183
+ content.innerHTML = `<h1>${contentMap[route] || 'Page not found'}</h1>`;
184
+ }
185
+
186
+ window.addEventListener('hashchange', () => loadContent(window.location.hash));
187
+ loadContent(window.location.hash || '#home');
188
+ </script>
189
+ </body></html>
ffHrkxgFpIRIFJFH2.html ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>3D Carousel Gallery - WebSim</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ background-color: #f0f0f0;
7
+ margin: 0;
8
+ padding: 20px;
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: center;
12
+ min-height: 100vh;
13
+ }
14
+
15
+ .container {
16
+ background-color: white;
17
+ border-radius: 10px;
18
+ padding: 20px;
19
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
20
+ max-width: 800px;
21
+ width: 100%;
22
+ }
23
+
24
+ h1 {
25
+ color: #333;
26
+ text-align: center;
27
+ }
28
+
29
+ .carousel {
30
+ position: relative;
31
+ width: 100%;
32
+ height: 400px;
33
+ perspective: 1000px;
34
+ transform-style: preserve-3d;
35
+ }
36
+
37
+ .carousel__face {
38
+ position: absolute;
39
+ width: 300px;
40
+ height: 187px;
41
+ top: 20px;
42
+ left: 10px;
43
+ right: 10px;
44
+ background-size: cover;
45
+ box-shadow:inset 0 0 0 2000px rgba(0,0,0,0.5);
46
+ display: flex;
47
+ }
48
+
49
+ .carousel__face:nth-child(1) { background-image: url("https://images.websim.ai/v1/sample/nature1"); }
50
+ .carousel__face:nth-child(2) { background-image: url("https://images.websim.ai/v1/sample/nature2"); }
51
+ .carousel__face:nth-child(3) { background-image: url("https://images.websim.ai/v1/sample/nature3"); }
52
+ .carousel__face:nth-child(4) { background-image: url("https://images.websim.ai/v1/sample/nature4"); }
53
+ .carousel__face:nth-child(5) { background-image: url("https://images.websim.ai/v1/sample/nature5"); }
54
+ .carousel__face:nth-child(6) { background-image: url("https://images.websim.ai/v1/sample/nature6"); }
55
+
56
+ .carousel__face:nth-child(1) { transform: rotateY( 0deg) translateZ(430px); }
57
+ .carousel__face:nth-child(2) { transform: rotateY( 60deg) translateZ(430px); }
58
+ .carousel__face:nth-child(3) { transform: rotateY(120deg) translateZ(430px); }
59
+ .carousel__face:nth-child(4) { transform: rotateY(180deg) translateZ(430px); }
60
+ .carousel__face:nth-child(5) { transform: rotateY(240deg) translateZ(430px); }
61
+ .carousel__face:nth-child(6) { transform: rotateY(300deg) translateZ(430px); }
62
+
63
+ @keyframes rotate {
64
+ from { transform: rotateY(0deg); }
65
+ to { transform: rotateY(-360deg); }
66
+ }
67
+
68
+ .carousel {
69
+ animation: rotate 15s infinite linear;
70
+ }
71
+
72
+ .carousel__face {
73
+ border: 2px solid white;
74
+ border-radius: 10px;
75
+ overflow: hidden;
76
+ }
77
+
78
+ .image-title {
79
+ position: absolute;
80
+ bottom: 20px;
81
+ left: 20px;
82
+ color: white;
83
+ font-size: 24px;
84
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
85
+ }
86
+
87
+ .description {
88
+ text-align: center;
89
+ margin-top: 20px;
90
+ color: #666;
91
+ }
92
+
93
+ .controls {
94
+ display: flex;
95
+ justify-content: center;
96
+ margin-top: 20px;
97
+ }
98
+
99
+ .control-btn {
100
+ background-color: #4CAF50;
101
+ border: none;
102
+ color: white;
103
+ padding: 10px 20px;
104
+ text-align: center;
105
+ text-decoration: none;
106
+ display: inline-block;
107
+ font-size: 16px;
108
+ margin: 4px 2px;
109
+ cursor: pointer;
110
+ border-radius: 5px;
111
+ transition: background-color 0.3s;
112
+ }
113
+
114
+ .control-btn:hover {
115
+ background-color: #45a049;
116
+ }
117
+
118
+ .control-btn:active {
119
+ background-color: #3e8e41;
120
+ }
121
+
122
+ </style>
123
+ </head>
124
+ <body>
125
+ <div class="container">
126
+ <h1>3D Carousel Gallery</h1>
127
+
128
+ <div class="carousel">
129
+ <div class="carousel__face"><span class="image-title">Mountain View</span></div>
130
+ <div class="carousel__face"><span class="image-title">Serene Lake</span></div>
131
+ <div class="carousel__face"><span class="image-title">Forest Path</span></div>
132
+ <div class="carousel__face"><span class="image-title">Autumn Colors</span></div>
133
+ <div class="carousel__face"><span class="image-title">Coastal Sunset</span></div>
134
+ <div class="carousel__face"><span class="image-title">Misty Valley</span></div>
135
+ </div>
136
+
137
+ <p class="description">
138
+ Experience the beauty of nature through our innovative 3D carousel gallery.
139
+ This mesmerizing display showcases breathtaking landscapes from around the world,
140
+ allowing you to immerse yourself in stunning natural scenery with just a glance.
141
+ </p>
142
+
143
+ <div class="controls">
144
+ <button class="control-btn" id="pauseBtn">Pause</button>
145
+ <button class="control-btn" id="resumeBtn">Resume</button>
146
+ </div>
147
+ </div>
148
+
149
+ <script>
150
+ const carousel = document.querySelector('.carousel');
151
+ const pauseBtn = document.getElementById('pauseBtn');
152
+ const resumeBtn = document.getElementById('resumeBtn');
153
+
154
+ pauseBtn.addEventListener('click', () => {
155
+ carousel.style.animationPlayState = 'paused';
156
+ });
157
+
158
+ resumeBtn.addEventListener('click', () => {
159
+ carousel.style.animationPlayState = 'running';
160
+ });
161
+ </script>
162
+
163
+ </body></html>
ka7hqzOKlKKqpdsut.html ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Gallery WebSim</title><style>
2
+ body {
3
+ background-color: #152836;
4
+ font-family: Arial, sans-serif;
5
+ margin: 0;
6
+ padding: 20px;
7
+ }
8
+
9
+ .gallery {
10
+ display: flex;
11
+ flex-wrap: wrap;
12
+ justify-content: center;
13
+ gap: 20px;
14
+ }
15
+
16
+ .gallery-item {
17
+ width: 200px;
18
+ border: 3px solid #FFF;
19
+ border-radius: 3px;
20
+ overflow: hidden;
21
+ position: relative;
22
+ transition: transform 0.3s ease;
23
+ }
24
+
25
+ .gallery-item:hover {
26
+ transform: scale(1.05);
27
+ }
28
+
29
+ .gallery-item img {
30
+ width: 100%;
31
+ height: auto;
32
+ display: block;
33
+ }
34
+
35
+ .gallery-item .caption {
36
+ position: absolute;
37
+ bottom: 0;
38
+ left: 0;
39
+ right: 0;
40
+ background: rgba(0,0,0,0.7);
41
+ color: #fff;
42
+ padding: 10px;
43
+ transform: translateY(100%);
44
+ transition: transform 0.3s ease;
45
+ }
46
+
47
+ .gallery-item:hover .caption {
48
+ transform: translateY(0);
49
+ }
50
+
51
+ h1 {
52
+ color: #fff;
53
+ text-align: center;
54
+ margin-bottom: 30px;
55
+ }
56
+
57
+ .websim-footer {
58
+ position: fixed;
59
+ bottom: 10px;
60
+ right: 10px;
61
+ color: #fff;
62
+ font-size: 14px;
63
+ }
64
+ </style></head>
65
+ <body>
66
+ <h1>WebSim Gallery Showcase</h1>
67
+
68
+ <div class="gallery">
69
+ <div class="gallery-item">
70
+ <img src="https://websim.ai/img/gallery/fading-light.jpg" alt="Fading Light" width="200" height="150">
71
+ <div class="caption">
72
+ <h4>Fading Light</h4>
73
+ <p>Classic view from Rigwood Jetty on Coniston Water</p>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="gallery-item">
78
+ <img src="https://websim.ai/img/gallery/bowness-bay.jpg" alt="Bowness Bay" width="200" height="150">
79
+ <div class="caption">
80
+ <h4>Bowness Bay</h4>
81
+ <p>A beautiful Sunrise en-route to Keswick</p>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="gallery-item">
86
+ <img src="https://websim.ai/img/gallery/virtual-reality.jpg" alt="Virtual Reality Experience" width="200" height="150">
87
+ <div class="caption">
88
+ <h4>Virtual Reality Experience</h4>
89
+ <p>Immersive WebSim VR technology showcase</p>
90
+ </div>
91
+ </div>
92
+
93
+ <div class="gallery-item">
94
+ <img src="https://websim.ai/img/gallery/ai-generated-art.jpg" alt="AI Generated Art" width="200" height="150">
95
+ <div class="caption">
96
+ <h4>AI Generated Art</h4>
97
+ <p>Stunning artwork created by WebSim's AI</p>
98
+ </div>
99
+ </div>
100
+ </div>
101
+
102
+ <div class="websim-footer">
103
+ Powered by WebSim.ai - Explore the possibilities
104
+ </div>
105
+
106
+ <script>
107
+ document.querySelectorAll('.gallery-item').forEach(item => {
108
+ item.addEventListener('click', () => {
109
+ window.location.href = `https://websim.ai/gallery/${item.querySelector('h4').textContent.toLowerCase().replace(' ', '-')}`;
110
+ });
111
+ });
112
+ </script>
113
+ </body></html>
le6kYD6PULsHCIrx0.html ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/">
2
+ <title>WebSim - Basic Data Entry Form</title>
3
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
4
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
5
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
6
+ <script src="./oidc_web/oidc-web.min.js"></script>
7
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/rdflib.min.js"></script>
8
+ <style>
9
+ .error { border: 2px solid red; }
10
+ .errorMessage { color: red; }
11
+ td { word-wrap: break-word; }
12
+ #spinner {
13
+ position: fixed;
14
+ width: 100%;
15
+ left: 0;right: 0;top: 0;bottom: 0;
16
+ background-color: rgba(255,255,255,0.7);
17
+ z-index: 9999;
18
+ display: none;
19
+ }
20
+ @keyframes spin {
21
+ from { transform: rotate(0deg); }
22
+ to { transform: rotate(360deg); }
23
+ }
24
+ #spinner::after {
25
+ content:'';
26
+ display:block;
27
+ position:absolute;
28
+ left:48%;top:40%;
29
+ width:40px;height:40px;
30
+ border-style:solid;
31
+ border-color:black;
32
+ border-top-color:transparent;
33
+ border-width: 4px;
34
+ border-radius:50%;
35
+ -webkit-animation: spin .8s linear infinite;
36
+ animation: spin .8s linear infinite;
37
+ }
38
+ .dropdown-menu {
39
+ padding-left: 15px;
40
+ width: 450px;
41
+ }
42
+ .glyphicon.glyphicon-cog {
43
+ font-size: 20px;
44
+ }
45
+ #snackbar {
46
+ visibility: hidden;
47
+ min-width: 250px;
48
+ margin-left: -125px;
49
+ background-color: #333;
50
+ color: #fff;
51
+ text-align: center;
52
+ border-radius: 2px;
53
+ padding: 16px;
54
+ position: fixed;
55
+ z-index: 1;
56
+ left: 50%;
57
+ bottom: 30px;
58
+ font-size: 17px;
59
+ }
60
+ #snackbar.show {
61
+ visibility: visible;
62
+ -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
63
+ animation: fadein 0.5s, fadeout 0.5s 2.5s;
64
+ }
65
+ @-webkit-keyframes fadein {
66
+ from {bottom: 0; opacity: 0;}
67
+ to {bottom: 30px; opacity: 1;}
68
+ }
69
+ @keyframes fadein {
70
+ from {bottom: 0; opacity: 0;}
71
+ to {bottom: 30px; opacity: 1;}
72
+ }
73
+ @-webkit-keyframes fadeout {
74
+ from {bottom: 30px; opacity: 1;}
75
+ to {bottom: 0; opacity: 0;}
76
+ }
77
+ @keyframes fadeout {
78
+ from {bottom: 30px; opacity: 1;}
79
+ to {bottom: 0; opacity: 0;}
80
+ }
81
+ </style>
82
+ </head>
83
+ <body>
84
+ <div id="snackbar">
85
+ <div id="msg1"></div>
86
+ <div id="msg2"></div>
87
+ </div>
88
+
89
+ <div id="spinner"></div>
90
+
91
+ <div class="container">
92
+ <ul class="nav nav-tabs">
93
+ <li class="active" id="dbmsTabID"><a data-toggle="tab" href="#dbmsID">DBMS</a></li>
94
+ <li id="fsTabID"><a data-toggle="tab" href="#fsID">File System</a></li>
95
+ <li id="aboutTabID"><a data-toggle="tab" href="#aboutID">About</a></li>
96
+ <li class="pull-right dropdown">
97
+ <a class="dropdown-toggle" style="max-height: 40px" data-toggle="dropdown" href="#">
98
+ <span class="glyphicon glyphicon-cog"></span>
99
+ <span class="caret"></span>
100
+ </a>
101
+ <ul class="dropdown-menu">
102
+ <div class="checkbox">
103
+ <label><input id="fctID" type="checkbox" value="">Faceted Browser Links</label>
104
+ </div>
105
+ <div class="checkbox">
106
+ <label><input id="uriID" type="checkbox" value="">Shortened URI Results</label>
107
+ </div>
108
+ <div class="checkbox">
109
+ <label><input id="riID" type="checkbox" value="">owl:sameAs Reasoning & Inference</label>
110
+ </div>
111
+ <div class="checkbox">
112
+ <label><input id="ruleNameID" type="checkbox" value="">Inference Rule</label>
113
+ <input type="text" style="max-width: 250px" value="urn:ifp:inference:rule" id="infRuleNameID">
114
+ </div>
115
+ <div>
116
+ <label style="font-weight: normal">SPARQL Endpoint</label>
117
+ <input type="text" style="width: 20em" value="https://linkeddata.uriburner.com/sparql" id="sparql_endpoint">
118
+ </div>
119
+ <div class="checkbox">
120
+ <label><input id="cmdID" type="checkbox" value="">Console Log Commands</label>
121
+ </div>
122
+ <div class="form-group">
123
+ <label style="font-weight: normal" for="resultsID">Results per Page:</label>
124
+ <input type="text" style="width: 5em" value="5" id="resultsID">
125
+ </div>
126
+ <h5>Return Data As:</h5>
127
+ <div class="radio">
128
+ <label><input id="defaultID" type="radio" name="radiogroup" checked>Default (JSON)</label>
129
+ </div>
130
+ <div class="radio">
131
+ <label><input id="csvID" type="radio" name="radiogroup">CSV</label>
132
+ </div>
133
+ <div class="radio">
134
+ <label><input id="xmlID" type="radio" name="radiogroup">XML</label>
135
+ </div>
136
+ </ul>
137
+ </li>
138
+ <a id="logged-href" href="" title="" style="margin-top: 5px; margin-left: 15px; max-height: 35px" class="pull-right hidden"><img id="uid-icon" src="./common/uid.png"></a>
139
+ <li class="pull-right"><button id="loginID" style="margin-top: 5px" type="button" class="btn btn-primary hidden">Login</button></li>
140
+ <li class="pull-right"><button id="logoutID" style="margin-top: 5px" type="button" class="btn btn-danger hidden">Logout</button></li>
141
+ <li class="pull-right"><a id="permalinkID">Permalink</a></li>
142
+ </ul>
143
+
144
+ <div class="tab-content">
145
+ <div id="dbmsID" class="tab-pane fade in active">
146
+ <div class="container">
147
+ <div class="row">
148
+ <div class="col-xs-6">
149
+ <h1 style="text-align:center">Data Entry</h1>
150
+ <form id="dbmsFormID" class="form" method="post">
151
+ <div class="form-group">
152
+ <label for="subjectID">Subject</label>
153
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="If the subject is not a URI it will be used as the fragment identifier of a Relative URI."></span>
154
+ <textarea class="form-control" placeholder="Subject" rows="1" style="resize:vertical" id="subjectID"></textarea>
155
+ <p class="errorMessage" id="subjectErrorID"></p>
156
+ </div>
157
+ <div class="form-group">
158
+ <label for="predicateID">Predicate</label>
159
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="The predicate can either be a URI (ex. http://xmlns.com/foaf/0.1/name) or a curie (ex. foaf:name) because these are preloaded in Virtuoso."></span>
160
+ <input type="text" class="form-control" placeholder="Predicate" id="predicateID">
161
+ <p class="errorMessage" id="predicateErrorID"></p>
162
+ </div>
163
+ <div class="form-group">
164
+ <label for="objectID">Object</label>
165
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="Whether or not the Object is a literal value or a reference is determined by the range of the predicate. Quoting the Object will override this feature and make it a literal value."></span>
166
+ <textarea class="form-control" placeholder="Object" rows="1" style="resize:vertical" id="objectID"></textarea>
167
+ </div>
168
+ <div class="form-group">
169
+ <label for="docNameID">Document Name</label>
170
+ <input type="text" class="form-control" value="urn:records:test" id="docNameID">
171
+ <p class="errorMessage" id="docNameErrorID"></p>
172
+ </div>
173
+ <div class="button-wrapper">
174
+ <span>
175
+ <button id="clearBtnID" type="button" class="btn btn-primary">Clear</button>
176
+ <button id="insertBtnID" type="button" class="btn btn-success">Add</button>
177
+ <button id="deleteBtnID" type="button" class="btn btn-danger">Delete</button>
178
+ <button id="queryBtnID" type="button" class="btn btn-warning">Query</button>
179
+ <button id="dataBtnID" type="button" class="btn btn-info">All Data</button>
180
+ </span>
181
+ </div>
182
+ </form>
183
+ </div>
184
+ <div class="col-xs-6">
185
+ <h1 style="text-align:center">Data</h1>
186
+ <table id="dbmsTableID" class="table table-bordered" style="table-layout: fixed; max-width:600px;">
187
+ <div style="padding-top: 25px"></div>
188
+ </table>
189
+ <div class="button-wrapper">
190
+ <button id="firstBtnID" type="button" style="background-color: #99A3A4; color: #FDFEFE; margin-right: 5px" class="btn pull-left">First</button>
191
+ <button id="prevBtnID" type="button" style="background-color: #99A3A4; color: #FDFEFE" class="btn pull-left">Prev</button>
192
+ <button id="lastBtnID" type="button" style="background-color: #99A3A4; color: #FDFEFE; margin-left: 5px" class="btn pull-right">Last</button>
193
+ <button id="nextBtnID" type="button" style="background-color: #99A3A4; color: #FDFEFE" class="btn pull-right">Next</button>
194
+ </div>
195
+ </div>
196
+ </div>
197
+ </div>
198
+ </div>
199
+
200
+ <div id="fsID" class="tab-pane fade">
201
+ <div class="container">
202
+ <div class="row">
203
+ <div class="col-xs-6">
204
+ <h1 style="text-align:center">Data Entry</h1>
205
+ <form id="fsFormID" class="form" method="post">
206
+ <div class="form-group">
207
+ <label for="subjectID2">Subject</label>
208
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="If the subject is not a URI it will be used as the fragment identifier of a Relative URI."></span>
209
+ <textarea class="form-control" placeholder="Subject" rows="1" style="resize:vertical" id="subjectID2"></textarea>
210
+ <p class="errorMessage" id="subjectErrorID2"></p>
211
+ </div>
212
+ <div class="form-group">
213
+ <label for="predicateID2">Predicate</label>
214
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="The predicate can either be a URI (ex. http://xmlns.com/foaf/0.1/name) or a curie (ex. foaf:name) because these are preloaded in Virtuoso."></span>
215
+ <input type="text" class="form-control" placeholder="Predicate" id="predicateID2">
216
+ <p class="errorMessage" id="predicateErrorID2"></p>
217
+ </div>
218
+ <div class="form-group">
219
+ <label for="objectID2">Object</label>
220
+ <span class="glyphicon glyphicon-question-sign" data-toggle="tooltip" data-original-title="Whether or not the Object is a literal value or a reference is determined by the range of the predicate. Quoting the Object will override this feature and make it a literal value."></span>
221
+ <textarea class="form-control" placeholder="Object" rows="1" style="resize:vertical" id="objectID2"></textarea>
222
+ </div>
223
+ <div class="form-group">
224
+ <label for="docNameID2">Document Name</label>
225
+ <input type="text" class="form-control" value="https://id.myopenlink.net/public_home/KingsleyUyiIdehen/RWW-QA/test1.ttl" id="docNameID2">
226
+ <p class="errorMessage" id="docNameErrorID2"></p>
227
+ </div>
228
+ <div class="button-wrapper">
229
+ <span>
230
+ <button id="clearBtnID2" type="button" class="btn btn-primary">Clear</button>
231
+ <button id="insertBtnID2" type="button" class="btn btn-success">Add</button>
232
+ <button id="deleteBtnID2" type="button" class="btn btn-danger">Delete</button>
233
+ <button id="queryBtnID2" type="button" class="btn btn-warning">Query</button>
234
+ <button id="dataBtnID2" type="button" class="btn btn-info">All Data</button>
235
+ </span>
236
+ </div>
237
+ </form>
238
+ </div>
239
+ <div class="col-xs-6">
240
+ <h1 style="text-align:center">Data</h1>
241
+ <table id="fsTableID" class="table table-bordered" style="table-layout: fixed; max-width:600px;">
242
+ <div style="padding-top: 25px"></div>
243
+ </table>
244
+ <div class="button-wrapper">
245
+ <button id="firstBtnID2" type="button" style="background-color: #99A3A4; color: #FDFEFE; margin-right: 5px" class="btn pull-left disabled">First</button>
246
+ <button id="prevBtnID2" type="button" style="background-color: #99A3A4; color: #FDFEFE" class="btn pull-left disabled">Prev</button>
247
+ <button id="lastBtnID2" type="button" style="background-color: #99A3A4; color: #FDFEFE; margin-left: 5px" class="btn pull-right disabled">Last</button>
248
+ <button id="nextBtnID2" type="button" style="background-color: #99A3A4; color: #FDFEFE" class="btn pull-right disabled">Next</button>
249
+ </div>
250
+ </div>
251
+ </div>
252
+ </div>
253
+ </div>
254
+
255
+ <div id="aboutID" class="tab-pane fade">
256
+ <div class="container">
257
+ <p style="padding-top: 10px">
258
+ Generic SPARQL Data Entry Form 1.0.4<br>
259
+ Description: Simple Data Entry Form that helps unravel the power of RDF and SPARQL with regards
260
+ to Structured Data creation and interaction
mpE6CPUzINPUXaxAj.html ADDED
@@ -0,0 +1,373 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/maintenance"><title>系统维护中.....</title><style>
2
+ body {
3
+ overflow: hidden;
4
+ }
5
+
6
+ #canvas {
7
+ position: absolute;
8
+ top: 0;
9
+ left: 0;
10
+ }
11
+
12
+ * {
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ html,
18
+ body,
19
+ .ll_cloudtag {
20
+ height: 100%;
21
+ }
22
+
23
+ .ll_cloudtag {
24
+ position: relative;
25
+ z-index: 20;
26
+ }
27
+
28
+ .ll_cloudtag a {
29
+ position: absolute;
30
+ top: 0px;
31
+ left: 0px;
32
+ color: #5cff00;
33
+ font-weight: bold;
34
+ text-decoration: none;
35
+ padding: 3px 6px;
36
+ }
37
+
38
+ .ll_cloudtag a:hover {
39
+ color: #ff0000;
40
+ letter-spacing: 2px;
41
+ }
42
+ </style></head><body><div class="ll_cloudtag" id="cloudTag">
43
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
44
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
45
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
46
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
47
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
48
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
49
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
50
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
51
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
52
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
53
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
54
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
55
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
56
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
57
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
58
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
59
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
60
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
61
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
62
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
63
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
64
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
65
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
66
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
67
+ <a href="https://websim.ai/c/maintenance">系统维护中</a>
68
+ <a href="https://websim.ai/c/maintenance">请稍后</a>
69
+ </div>
70
+ <script>
71
+ if (typeof ll !== 'object') {
72
+ var ll = {}
73
+ ll.ui = {}
74
+ }
75
+ ll.ui.cloudTag = function (el) {
76
+ var radius = 120,
77
+ dtr = Math.PI / 180,
78
+ d = 300,
79
+ mcList = [],
80
+ active = false,
81
+ lasta = 1,
82
+ lastb = 1,
83
+ distr = true,
84
+ tspeed = 10,
85
+ size = 250,
86
+ mouseX = 0,
87
+ mouseY = 0,
88
+ howElliptical = 1,
89
+ aA = null,
90
+ oDiv = null
91
+
92
+ function update() {
93
+ var a
94
+ var b
95
+
96
+ if (active) {
97
+ a = (-Math.min(Math.max(-mouseY, -size), size) / radius) * tspeed
98
+ b = (Math.min(Math.max(-mouseX, -size), size) / radius) * tspeed
99
+ } else {
100
+ a = lasta * 0.98
101
+ b = lastb * 0.98
102
+ }
103
+
104
+ lasta = a
105
+ lastb = b
106
+
107
+ if (Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) {
108
+ return
109
+ }
110
+
111
+ var c = 0
112
+ sineCosine(a, b, c)
113
+ for (var j = 0; j < mcList.length; j++) {
114
+ var rx1 = mcList[j].cx
115
+ var ry1 = mcList[j].cy * ca + mcList[j].cz * -sa
116
+ var rz1 = mcList[j].cy * sa + mcList[j].cz * ca
117
+
118
+ var rx2 = rx1 * cb + rz1 * sb
119
+ var ry2 = ry1
120
+ var rz2 = rx1 * -sb + rz1 * cb
121
+
122
+ var rx3 = rx2 * cc + ry2 * -sc
123
+ var ry3 = rx2 * sc + ry2 * cc
124
+ var rz3 = rz2
125
+
126
+ mcList[j].cx = rx3
127
+ mcList[j].cy = ry3
128
+ mcList[j].cz = rz3
129
+
130
+ per = d / (d + rz3)
131
+
132
+ mcList[j].x = howElliptical * rx3 * per - howElliptical * 2
133
+ mcList[j].y = ry3 * per
134
+ mcList[j].scale = per
135
+ mcList[j].alpha = per
136
+
137
+ mcList[j].alpha = (mcList[j].alpha - 0.6) * (10 / 6)
138
+ }
139
+
140
+ doPosition()
141
+ depthSort()
142
+ }
143
+
144
+ function depthSort() {
145
+ var i = 0
146
+ var aTmp = []
147
+
148
+ for (i = 0; i < aA.length; i++) {
149
+ aTmp.push(aA[i])
150
+ }
151
+
152
+ aTmp.sort(function (vItem1, vItem2) {
153
+ if (vItem1.cz > vItem2.cz) {
154
+ return -1
155
+ } else if (vItem1.cz < vItem2.cz) {
156
+ return 1
157
+ } else {
158
+ return 0
159
+ }
160
+ })
161
+
162
+ for (i = 0; i < aTmp.length; i++) {
163
+ aTmp[i].style.zIndex = i
164
+ }
165
+ }
166
+
167
+ function positionAll() {
168
+ var phi = 0
169
+ var theta = 0
170
+ var max = mcList.length
171
+ var i = 0
172
+
173
+ var aTmp = []
174
+ var oFragment = document.createDocumentFragment()
175
+
176
+ //随机排序
177
+ for (i = 0; i < aA.length; i++) {
178
+ aTmp.push(aA[i])
179
+ }
180
+
181
+ aTmp.sort(function () {
182
+ return Math.random() < 0.5 ? 1 : -1
183
+ })
184
+
185
+ for (i = 0; i < aTmp.length; i++) {
186
+ oFragment.appendChild(aTmp[i])
187
+ }
188
+
189
+ oDiv.appendChild(oFragment)
190
+
191
+ for (var i = 1; i < max + 1; i++) {
192
+ if (distr) {
193
+ phi = Math.acos(-1 + (2 * i - 1) / max)
194
+ theta = Math.sqrt(max * Math.PI) * phi
195
+ } else {
196
+ phi = Math.random() * Math.PI
197
+ theta = Math.random() * (2 * Math.PI)
198
+ }
199
+ //坐标变换
200
+ mcList[i - 1].cx = radius * Math.cos(theta) * Math.sin(phi)
201
+ mcList[i - 1].cy = radius * Math.sin(theta) * Math.sin(phi)
202
+ mcList[i - 1].cz = radius * Math.cos(phi)
203
+
204
+ aA[i - 1].style.left =
205
+ mcList[i - 1].cx +
206
+ oDiv.offsetWidth / 2 -
207
+ mcList[i - 1].offsetWidth / 2 +
208
+ 'px'
209
+ aA[i - 1].style.top =
210
+ mcList[i - 1].cy +
211
+ oDiv.offsetHeight / 2 -
212
+ mcList[i - 1].offsetHeight / 2 +
213
+ 'px'
214
+ }
215
+ }
216
+
217
+ function doPosition() {
218
+ var l = oDiv.offsetWidth / 2
219
+ var t = oDiv.offsetHeight / 2
220
+ for (var i = 0; i < mcList.length; i++) {
221
+ aA[i].style.left =
222
+ mcList[i].cx + l - mcList[i].offsetWidth / 2 + 'px'
223
+ aA[i].style.top =
224
+ mcList[i].cy + t - mcList[i].offsetHeight / 2 + 'px'
225
+
226
+ aA[i].style.fontSize =
227
+ Math.ceil((12 * mcList[i].scale) / 2) + 8 + 'px'
228
+
229
+ aA[i].style.filter = 'alpha(opacity=' + 100 * mcList[i].alpha + ')'
230
+ aA[i].style.opacity = mcList[i].alpha
231
+ }
232
+ }
233
+
234
+ function sineCosine(a, b, c) {
235
+ sa = Math.sin(a * dtr)
236
+ ca = Math.cos(a * dtr)
237
+ sb = Math.sin(b * dtr)
238
+ cb = Math.cos(b * dtr)
239
+ sc = Math.sin(c * dtr)
240
+ cc = Math.cos(c * dtr)
241
+ }
242
+
243
+ return (function () {
244
+ var i = 0
245
+ var oTag = null
246
+
247
+ oDiv = document.getElementById(el)
248
+
249
+ aA = oDiv.getElementsByTagName('a')
250
+
251
+ for (i = 0; i < aA.length; i++) {
252
+ oTag = {}
253
+
254
+ oTag.offsetWidth = aA[i].offsetWidth
255
+ oTag.offsetHeight = aA[i].offsetHeight
256
+
257
+ mcList.push(oTag)
258
+ }
259
+
260
+ sineCosine(0, 0, 0)
261
+
262
+ positionAll()
263
+
264
+ oDiv.onmouseover = function () {
265
+ active = true
266
+ }
267
+
268
+ oDiv.onmouseout = function () {
269
+ active = false
270
+ }
271
+
272
+ oDiv.onmousemove = function (ev) {
273
+ var oEvent = window.event || ev
274
+
275
+ mouseX = oEvent.clientX - (oDiv.offsetLeft + oDiv.offsetWidth / 2)
276
+ mouseY = oEvent.clientY - (oDiv.offsetTop + oDiv.offsetHeight / 2)
277
+
278
+ mouseX /= 5
279
+ mouseY /= 5
280
+ }
281
+ setInterval(update, 30)
282
+ })()
283
+ }
284
+
285
+ ll.ui.cloudTag('cloudTag')
286
+ </script>
287
+
288
+ <canvas id="canvas" width="1920" height="1080" alt="A canvas with falling green characters resembling the Matrix digital rain effect"> 您的浏览器不支持canvas标签,请您更换浏览器 </canvas>
289
+ <script>
290
+ var canvas = document.getElementById('canvas')
291
+ var can = canvas.getContext('2d')
292
+ var s = window.screen //获取屏幕
293
+ var w = (canvas.width = s.width) //获取屏幕宽度
294
+ var h = (canvas.height = s.height) //获取屏幕高度
295
+
296
+ can.fillStyle = color2()
297
+
298
+ var words = Array(256).join('1').split('')
299
+ //设置一个包含256个空元素的数组,join("1")用来把数组里的元素拼接成字符串,split("")过滤掉数组里的空元素
300
+
301
+ setInterval(draw, 50)
302
+
303
+ can.font = '15px 微软雅黑' //只设置一个不生效,一定要两个属性都设
304
+ // //绘制实心的文本:绘制的文本,文本的坐标x,文本的坐标y
305
+ // can.fillText("黑客帝国",100,100);
306
+ // // setInterval(draw,50);
307
+
308
+ function draw() {
309
+ //can.fillRect()画一个实心矩形:坐标x,坐标y,矩形宽,举行高
310
+ can.fillStyle = 'rgba(0,0,0,0.05)'
311
+ can.fillRect(0, 0, w, h)
312
+ can.fillStyle = color2()
313
+ words.map(function (y, n) {
314
+ text = String.fromCharCode(Math.ceil(65 + Math.random() * 57)) //转换为键盘上值
315
+ x = n * 10
316
+ can.fillText(text, x, y)
317
+ words[n] = y > 758 + Math.random() * 484 ? 0 : y + 10
318
+ }) //数组元素的一个映射
319
+ }
320
+
321
+ //获取随机颜色,三种方法
322
+ function color1() {
323
+ var colors = [
324
+ 0,
325
+ 1,
326
+ 2,
327
+ 3,
328
+ 4,
329
+ 5,
330
+ 6,
331
+ 7,
332
+ 8,
333
+ 9,
334
+ 'a',
335
+ 'b',
336
+ 'c',
337
+ 'd',
338
+ 'e',
339
+ 'f',
340
+ ]
341
+ var color = ''
342
+ for (var i = 0; i < 6; i++) {
343
+ //Math.random()产生一个0-1之间的小数
344
+ var n = Math.ceil(Math.random() * 15)
345
+ color += '' + colors[n]
346
+ // console.log(color);
347
+ }
348
+ return '#' + color
349
+ }
350
+
351
+ function color2() {
352
+ var color = Math.ceil(Math.random() * 16777215).toString(16)
353
+ // for( var i=color.length; i<6; i++ ){
354
+ // color = '0'+color;
355
+ // }
356
+ while (color.length < 6) {
357
+ color = '0' + color
358
+ }
359
+ return '#' + color
360
+ }
361
+
362
+ function color3() {
363
+ return (
364
+ '#' +
365
+ (function (color) {
366
+ return new Array(7 - color.length).join('0') + color
367
+ //神奇的方法,总共字符串有6位,如果只产生了3位,则前面应该补三个0,在长度为7-3=4的空数组中利用join插入0,则为['',0,'',0,'',0,''],刚好三个0补在前面
368
+ })(((Math.random() * 0x1000000) << 0).toString(16))
369
+ )
370
+ // << 0 也是一种取整的方法
371
+ }
372
+ </script>
373
+ </body></html>
ouUxFFTFA296osu4s.html ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"><title>Enhanced 3D Walking Wooden Man in Minecraft-style World</title><style>
2
+ body, html {
3
+ margin: 0;
4
+ padding: 0;
5
+ height: 100%;
6
+ overflow: hidden;
7
+ font-family: 'Minecraft', Arial, sans-serif;
8
+ }
9
+
10
+ @font-face {
11
+ font-family: 'Minecraft';
12
+ src: url('https://fonts.cdnfonts.com/css/minecraft-4') format('woff2');
13
+ }
14
+
15
+ .Scene {
16
+ width: 100%;
17
+ height: 100%;
18
+ perspective: 1000px;
19
+ background: linear-gradient(to bottom, #87CEEB, #E0F6FF);
20
+ display: flex;
21
+ justify-content: center;
22
+ align-items: center;
23
+ overflow: hidden;
24
+ }
25
+
26
+ .Godo-wrap {
27
+ width: 200px;
28
+ height: 300px;
29
+ position: relative;
30
+ transform-style: preserve-3d;
31
+ animation: walk 2s infinite linear;
32
+ }
33
+
34
+ .Godo {
35
+ width: 100%;
36
+ height: 100%;
37
+ position: absolute;
38
+ transform-style: preserve-3d;
39
+ }
40
+
41
+ .u-bg {
42
+ background: #8B4513;
43
+ position: absolute;
44
+ box-shadow: inset 0 0 10px rgba(0,0,0,0.3);
45
+ }
46
+
47
+ .Head, .Torso, .LeftArm, .RightArm, .LeftLeg, .RightLeg {
48
+ position: absolute;
49
+ transform-style: preserve-3d;
50
+ }
51
+
52
+ .Head {
53
+ width: 50px;
54
+ height: 50px;
55
+ top: 0;
56
+ left: 75px;
57
+ }
58
+
59
+ .Torso {
60
+ width: 100px;
61
+ height: 150px;
62
+ top: 50px;
63
+ left: 50px;
64
+ }
65
+
66
+ .LeftArm, .RightArm {
67
+ width: 30px;
68
+ height: 100px;
69
+ top: 50px;
70
+ }
71
+
72
+ .LeftArm { left: 20px; }
73
+ .RightArm { right: 20px; }
74
+
75
+ .LeftLeg, .RightLeg {
76
+ width: 30px;
77
+ height: 100px;
78
+ top: 200px;
79
+ }
80
+
81
+ .LeftLeg { left: 60px; }
82
+ .RightLeg { right: 60px; }
83
+
84
+ .Head > div, .Torso > div, .LeftArm > div, .RightArm > div, .LeftLeg > div, .RightLeg > div {
85
+ position: absolute;
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+
90
+ .base {
91
+ width: 500px;
92
+ height: 500px;
93
+ background: url('https://i.imgur.com/TZ5Ct9N.png') repeat;
94
+ position: absolute;
95
+ bottom: -250px;
96
+ border-radius: 50%;
97
+ transform: rotateX(90deg);
98
+ animation: moveGround 10s linear infinite;
99
+ }
100
+
101
+ @keyframes walk {
102
+ 0%, 100% { transform: rotateX(-10deg) translateY(0); }
103
+ 25%, 75% { transform: rotateX(0deg) translateY(-20px); }
104
+ 50% { transform: rotateX(10deg) translateY(0); }
105
+ }
106
+
107
+ .LeftArm, .RightArm {
108
+ animation: swing 1s infinite alternate;
109
+ }
110
+
111
+ .LeftLeg, .RightLeg {
112
+ animation: step 1s infinite alternate;
113
+ }
114
+
115
+ @keyframes swing {
116
+ 0% { transform: rotateX(-30deg); }
117
+ 100% { transform: rotateX(30deg); }
118
+ }
119
+
120
+ @keyframes step {
121
+ 0% { transform: translateY(0) rotateX(0deg); }
122
+ 100% { transform: translateY(-15px) rotateX(-30deg); }
123
+ }
124
+
125
+ @keyframes moveGround {
126
+ 0% { background-position: 0 0; }
127
+ 100% { background-position: 500px 0; }
128
+ }
129
+
130
+ .clouds {
131
+ position: absolute;
132
+ top: 0;
133
+ left: 0;
134
+ right: 0;
135
+ bottom: 0;
136
+ animation: moveClouds 30s linear infinite;
137
+ }
138
+
139
+ .cloud {
140
+ position: absolute;
141
+ background: rgba(255,255,255,0.8);
142
+ border-radius: 50%;
143
+ }
144
+
145
+ .cloud:nth-child(1) { width: 100px; height: 40px; top: 10%; left: 10%; }
146
+ .cloud:nth-child(2) { width: 80px; height: 30px; top: 20%; right: 15%; }
147
+ .cloud:nth-child(3) { width: 120px; height: 50px; bottom: 30%; left: 20%; }
148
+
149
+ @keyframes moveClouds {
150
+ 0% { transform: translateX(100%); }
151
+ 100% { transform: translateX(-100%); }
152
+ }
153
+
154
+ .sun {
155
+ position: absolute;
156
+ top: 50px;
157
+ right: 50px;
158
+ width: 80px;
159
+ height: 80px;
160
+ background: #FFD700;
161
+ border-radius: 50%;
162
+ box-shadow: 0 0 20px #FFD700;
163
+ animation: rotateSun 20s linear infinite;
164
+ }
165
+
166
+ @keyframes rotateSun {
167
+ 0% { transform: rotate(0deg); }
168
+ 100% { transform: rotate(360deg); }
169
+ }
170
+ </style></head><body>
171
+ <div class="Scene">
172
+ <div class="sun"></div>
173
+ <div class="clouds">
174
+ <div class="cloud"></div>
175
+ <div class="cloud"></div>
176
+ <div class="cloud"></div>
177
+ </div>
178
+ <div class="Godo-wrap">
179
+ <div class="Godo">
180
+ <div class="Head">
181
+ <div class="u-bg"></div>
182
+ <div class="u-bg"></div>
183
+ <div class="u-bg"></div>
184
+ <div class="u-bg"></div>
185
+ <div class="u-bg"></div>
186
+ <div class="u-bg"></div>
187
+ </div>
188
+ <div class="Torso">
189
+ <div class="u-bg"></div>
190
+ <div class="u-bg"></div>
191
+ <div class="u-bg"></div>
192
+ <div class="u-bg"></div>
193
+ <div class="u-bg"></div>
194
+ <div class="u-bg"></div>
195
+ </div>
196
+ <div class="LeftArm">
197
+ <div class="u-bg"></div>
198
+ <div class="u-bg"></div>
199
+ <div class="u-bg"></div>
200
+ <div class="u-bg"></div>
201
+ <div class="u-bg"></div>
202
+ <div class="u-bg"></div>
203
+ </div>
204
+ <div class="RightArm">
205
+ <div class="u-bg"></div>
206
+ <div class="u-bg"></div>
207
+ <div class="u-bg"></div>
208
+ <div class="u-bg"></div>
209
+ <div class="u-bg"></div>
210
+ <div class="u-bg"></div>
211
+ </div>
212
+ <div class="LeftLeg">
213
+ <div class="u-bg"></div>
214
+ <div class="u-bg"></div>
215
+ <div class="u-bg"></div>
216
+ <div class="u-bg"></div>
217
+ <div class="u-bg"></div>
218
+ <div class="u-bg"></div>
219
+ </div>
220
+ <div class="RightLeg">
221
+ <div class="u-bg"></div>
222
+ <div class="u-bg"></div>
223
+ <div class="u-bg"></div>
224
+ <div class="u-bg"></div>
225
+ <div class="u-bg"></div>
226
+ <div class="u-bg"></div>
227
+ </div>
228
+ </div>
229
+ </div>
230
+ <div class="base"></div>
231
+ </div>
232
+
233
+ <a href="https://websim.ai/c/minecraft-world-builder" style="position: fixed; bottom: 10px; right: 10px; background: rgba(255,255,255,0.7); padding: 5px 10px; border-radius: 5px; text-decoration: none; color: #333; font-family: 'Minecraft', Arial, sans-serif;">Build Your Minecraft World</a>
234
+
235
+ </body></html>
pqNwQVRUmKZ4ZO6qy.html ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" /><title>Beautiful Photo Wall - WebSim AI</title><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><style>
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ }
7
+ body {
8
+ margin: 0;
9
+ font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir,
10
+ segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto,
11
+ arial, sans-serif;
12
+ background-color: #f0f0f0;
13
+ }
14
+ .container {
15
+ max-width: 800px;
16
+ margin: 0 auto;
17
+ padding: 20px;
18
+ }
19
+ h1 {
20
+ text-align: center;
21
+ color: #333;
22
+ }
23
+ #img {
24
+ width: 503px;
25
+ height: 252px;
26
+ margin: 50px auto;
27
+ perspective: 700px;
28
+ -webkit-perspective: 700px;
29
+ }
30
+ #img img {
31
+ width: 50px;
32
+ height: 50px;
33
+ float: left;
34
+ object-fit: cover;
35
+ }
36
+ #btn {
37
+ width: 200px;
38
+ height: 50px;
39
+ line-height: 50px;
40
+ text-align: center;
41
+ font-size: 18px;
42
+ color: #fff;
43
+ background: #4CAF50;
44
+ border-radius: 25px;
45
+ margin: 20px auto;
46
+ padding: 0 10px;
47
+ cursor: pointer;
48
+ transition: background-color 0.3s, transform 0.1s;
49
+ user-select: none;
50
+ }
51
+ #btn:hover {
52
+ background: #45a049;
53
+ }
54
+ #btn:active {
55
+ transform: scale(0.98);
56
+ }
57
+ .credits {
58
+ text-align: center;
59
+ margin-top: 20px;
60
+ font-size: 14px;
61
+ color: #666;
62
+ }
63
+ .credits a {
64
+ color: #4CAF50;
65
+ text-decoration: none;
66
+ }
67
+ .credits a:hover {
68
+ text-decoration: underline;
69
+ }
70
+ </style></head><body><div id="app" class="container">
71
+ <h1>{{ title }}</h1>
72
+ <div id="img">
73
+ <img v-for="(image, index) in images" :key="index" :src="image" :alt="'Image ' + (index + 1)">
74
+ </div>
75
+ <div id="btn" @click="triggerAnimation">{{ buttonText }}</div>
76
+ <p class="credits">Created with <a href="https://websim.ai">WebSim AI</a> - Explore endless possibilities!</p>
77
+ </div>
78
+
79
+ <script>
80
+ const { createApp } = Vue;
81
+
82
+ createApp({
83
+ data() {
84
+ return {
85
+ title: 'Beautiful Photo Wall',
86
+ buttonText: 'Click to see effect',
87
+ images: [
88
+ 'https://picsum.photos/50/50?random=1',
89
+ 'https://picsum.photos/50/50?random=2',
90
+ 'https://picsum.photos/50/50?random=3',
91
+ 'https://picsum.photos/50/50?random=4',
92
+ 'https://picsum.photos/50/50?random=5',
93
+ 'https://picsum.photos/50/50?random=6',
94
+ 'https://picsum.photos/50/50?random=7',
95
+ 'https://picsum.photos/50/50?random=8',
96
+ 'https://picsum.photos/50/50?random=9',
97
+ 'https://picsum.photos/50/50?random=10',
98
+ 'https://picsum.photos/50/50?random=11',
99
+ 'https://picsum.photos/50/50?random=12',
100
+ 'https://picsum.photos/50/50?random=13',
101
+ 'https://picsum.photos/50/50?random=14',
102
+ 'https://picsum.photos/50/50?random=15',
103
+ 'https://picsum.photos/50/50?random=16',
104
+ 'https://picsum.photos/50/50?random=17',
105
+ 'https://picsum.photos/50/50?random=18',
106
+ 'https://picsum.photos/50/50?random=19',
107
+ 'https://picsum.photos/50/50?random=20',
108
+ 'https://picsum.photos/50/50?random=21',
109
+ 'https://picsum.photos/50/50?random=22',
110
+ 'https://picsum.photos/50/50?random=23',
111
+ 'https://picsum.photos/50/50?random=24',
112
+ 'https://picsum.photos/50/50?random=25',
113
+ 'https://picsum.photos/50/50?random=26',
114
+ 'https://picsum.photos/50/50?random=27',
115
+ 'https://picsum.photos/50/50?random=28',
116
+ 'https://picsum.photos/50/50?random=29',
117
+ 'https://picsum.photos/50/50?random=30',
118
+ 'https://picsum.photos/50/50?random=31',
119
+ 'https://picsum.photos/50/50?random=32',
120
+ 'https://picsum.photos/50/50?random=33',
121
+ 'https://picsum.photos/50/50?random=34',
122
+ 'https://picsum.photos/50/50?random=35',
123
+ 'https://picsum.photos/50/50?random=36',
124
+ 'https://picsum.photos/50/50?random=37',
125
+ 'https://picsum.photos/50/50?random=38',
126
+ 'https://picsum.photos/50/50?random=39',
127
+ 'https://picsum.photos/50/50?random=40',
128
+ 'https://picsum.photos/50/50?random=41',
129
+ 'https://picsum.photos/50/50?random=42',
130
+ 'https://picsum.photos/50/50?random=43',
131
+ 'https://picsum.photos/50/50?random=44',
132
+ 'https://picsum.photos/50/50?random=45',
133
+ 'https://picsum.photos/50/50?random=46',
134
+ 'https://picsum.photos/50/50?random=47',
135
+ 'https://picsum.photos/50/50?random=48',
136
+ 'https://picsum.photos/50/50?random=49',
137
+ 'https://picsum.photos/50/50?random=50'
138
+ ],
139
+ animationInProgress: false
140
+ };
141
+ },
142
+ methods: {
143
+ triggerAnimation() {
144
+ if (this.animationInProgress) return;
145
+ this.animationInProgress = true;
146
+ this.buttonText = 'Animation in progress...';
147
+
148
+ const imgs = document.querySelectorAll('#img img');
149
+ let endNum = 0;
150
+
151
+ const montion = (obj, time, doFn, callBack) => {
152
+ obj.style.transition = time;
153
+ doFn.call(obj);
154
+ let called = false;
155
+ obj.addEventListener('transitionend', function () {
156
+ if (!called) {
157
+ callBack && callBack.call(obj);
158
+ called = true;
159
+ }
160
+ }, { once: true });
161
+ };
162
+
163
+ const toBig = () => {
164
+ let allEnd = 0;
165
+ imgs.forEach((img, i) => {
166
+ img.style.transition = '';
167
+ img.style.transform = `rotateY(0deg) translateZ(-${Math.random() * 500}px)`;
168
+ setTimeout(() => {
169
+ montion(img, '2s', function () {
170
+ this.style.opacity = 1;
171
+ this.style.transform = 'rotateY(-360deg) translateZ(0)';
172
+ }, function () {
173
+ allEnd++;
174
+ if (allEnd === imgs.length) {
175
+ this.animationInProgress = false;
176
+ this.buttonText = 'Play animation again';
177
+ }
178
+ });
179
+ }, Math.random() * 1000);
180
+ });
181
+ };
182
+
183
+ imgs.forEach((img, i) => {
184
+ setTimeout(() => {
185
+ montion(img, '1s', function () {
186
+ this.style.transform = 'scale(0)';
187
+ }, function () {
188
+ montion(this, '1s', function () {
189
+ this.style.transform = 'scale(1)';
190
+ this.style.opacity = '0';
191
+ }, function () {
192
+ endNum++;
193
+ if (endNum === imgs.length) {
194
+ toBig();
195
+ }
196
+ });
197
+ });
198
+ }, Math.random() * 1000);
199
+ });
200
+ }
201
+ }
202
+ }).mount('#app');
203
+ </script></body></html>
qpNidDJx06Bh68FtT.html ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" /><title>WebSim: jQuery Slideshow with Thumbnails</title><style>
2
+ body, html {
3
+ margin: 0;
4
+ padding: 0;
5
+ font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
6
+ background-color: #f0f0f0;
7
+ color: #333;
8
+ }
9
+
10
+ .container {
11
+ max-width: 800px;
12
+ margin: 0 auto;
13
+ padding: 20px;
14
+ }
15
+
16
+ h1 {
17
+ text-align: center;
18
+ color: #2c3e50;
19
+ }
20
+
21
+ .slideshow {
22
+ background: #fff;
23
+ border-radius: 8px;
24
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
25
+ overflow: hidden;
26
+ position: relative;
27
+ }
28
+
29
+ .slide {
30
+ display: none;
31
+ text-align: center;
32
+ }
33
+
34
+ .slide.active {
35
+ display: block;
36
+ }
37
+
38
+ .slide img {
39
+ max-width: 100%;
40
+ height: auto;
41
+ }
42
+
43
+ .slide-title {
44
+ background: rgba(0, 0, 0, 0.5);
45
+ color: #fff;
46
+ padding: 10px;
47
+ position: absolute;
48
+ bottom: 0;
49
+ left: 0;
50
+ right: 0;
51
+ margin: 0;
52
+ }
53
+
54
+ .thumbnails {
55
+ display: flex;
56
+ justify-content: center;
57
+ margin-top: 20px;
58
+ }
59
+
60
+ .thumbnail {
61
+ width: 60px;
62
+ height: 60px;
63
+ border: 2px solid #ddd;
64
+ border-radius: 4px;
65
+ margin: 0 5px;
66
+ cursor: pointer;
67
+ transition: border-color 0.3s ease;
68
+ }
69
+
70
+ .thumbnail:hover, .thumbnail.active {
71
+ border-color: #3498db;
72
+ }
73
+
74
+ .navigation {
75
+ display: flex;
76
+ justify-content: space-between;
77
+ margin-top: 20px;
78
+ }
79
+
80
+ .nav-button {
81
+ background: #3498db;
82
+ color: #fff;
83
+ border: none;
84
+ padding: 10px 20px;
85
+ border-radius: 4px;
86
+ cursor: pointer;
87
+ transition: background 0.3s ease;
88
+ }
89
+
90
+ .nav-button:hover {
91
+ background: #2980b9;
92
+ }
93
+
94
+ @keyframes fadeIn {
95
+ from { opacity: 0; }
96
+ to { opacity: 1; }
97
+ }
98
+
99
+ .slide.active {
100
+ animation: fadeIn 0.5s ease-in-out;
101
+ }
102
+ </style></head><body><div class="container">
103
+ <h1>WebSim Fruit Gallery</h1>
104
+ <div class="slideshow">
105
+ <div class="slide active">
106
+ <img src="https://websim.ai/images/bananas.png" alt="A bunch of ripe bananas" width="389" height="300">
107
+ <h2 class="slide-title">Bananas</h2>
108
+ </div>
109
+ <div class="slide">
110
+ <img src="https://websim.ai/images/coconut.png" alt="Half of a coconut" width="325" height="300">
111
+ <h2 class="slide-title">Coconut</h2>
112
+ </div>
113
+ <div class="slide">
114
+ <img src="https://websim.ai/images/orange.png" alt="A ripe orange" width="350" height="300">
115
+ <h2 class="slide-title">Orange</h2>
116
+ </div>
117
+ </div>
118
+
119
+ <div class="thumbnails">
120
+ <img src="https://websim.ai/images/[email protected]" alt="Banana thumbnail" class="thumbnail active" width="50" height="40">
121
+ <img src="https://websim.ai/images/[email protected]" alt="Coconut thumbnail" class="thumbnail" width="50" height="40">
122
+ <img src="https://websim.ai/images/[email protected]" alt="Orange thumbnail" class="thumbnail" width="50" height="40">
123
+ </div>
124
+
125
+ <div class="navigation">
126
+ <button class="nav-button prev">Previous</button>
127
+ <button class="nav-button next">Next</button>
128
+ </div>
129
+ </div>
130
+
131
+ <script>
132
+ document.addEventListener('DOMContentLoaded', function() {
133
+ const slides = document.querySelectorAll('.slide');
134
+ const thumbnails = document.querySelectorAll('.thumbnail');
135
+ const prevButton = document.querySelector('.prev');
136
+ const nextButton = document.querySelector('.next');
137
+ let currentSlide = 0;
138
+
139
+ function showSlide(index) {
140
+ slides[currentSlide].classList.remove('active');
141
+ thumbnails[currentSlide].classList.remove('active');
142
+ currentSlide = (index + slides.length) % slides.length;
143
+ slides[currentSlide].classList.add('active');
144
+ thumbnails[currentSlide].classList.add('active');
145
+ }
146
+
147
+ function nextSlide() {
148
+ showSlide(currentSlide + 1);
149
+ }
150
+
151
+ function prevSlide() {
152
+ showSlide(currentSlide - 1);
153
+ }
154
+
155
+ nextButton.addEventListener('click', nextSlide);
156
+ prevButton.addEventListener('click', prevSlide);
157
+
158
+ thumbnails.forEach((thumbnail, index) => {
159
+ thumbnail.addEventListener('click', () => showSlide(index));
160
+ });
161
+
162
+ // Auto-advance slides every 5 seconds
163
+ setInterval(nextSlide, 5000);
164
+ });
165
+ </script>
166
+
167
+ <div style="text-align:center;margin-top:30px;">
168
+ <p>Explore our WebSim fruit gallery! This interactive slideshow showcases various fruits with smooth transitions and thumbnail navigation.</p>
169
+ <p>Want to create your own custom web experiences? Try <a href="https://websim.ai/create">WebSim's website creator</a> today!</p>
170
+ </div>
171
+ </body></html>
sHbBg9FjlkYrIVKIw.html ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>RagdollPhysics.js - Throw, Explode, and Reset!</title>
3
+ <style>
4
+ body {
5
+ font-family: Arial, sans-serif;
6
+ margin: 0;
7
+ padding: 0;
8
+ display: flex;
9
+ flex-direction: column;
10
+ justify-content: center;
11
+ align-items: center;
12
+ height: 100vh;
13
+ background-color: #f0f0f0;
14
+ }
15
+ #canvas {
16
+ border: 1px solid #000;
17
+ background-color: #fff;
18
+ }
19
+ #controls {
20
+ margin-top: 10px;
21
+ }
22
+ button {
23
+ font-size: 16px;
24
+ padding: 10px 20px;
25
+ margin: 0 10px;
26
+ cursor: pointer;
27
+ }
28
+ #info {
29
+ position: absolute;
30
+ top: 10px;
31
+ left: 10px;
32
+ background-color: rgba(255, 255, 255, 0.7);
33
+ padding: 10px;
34
+ border-radius: 5px;
35
+ }
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <canvas id="canvas" width="800" height="600"></canvas>
40
+ <div id="controls">
41
+ <button id="resetBtn">Reset Scene</button>
42
+ <button id="explodeBtn">Explode Ragdoll</button>
43
+ </div>
44
+ <div id="info">Click and drag to throw the ragdoll!</div>
45
+
46
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.min.js"></script>
47
+ <script>
48
+ // Initialize Matter.js
49
+ const Engine = Matter.Engine,
50
+ Render = Matter.Render,
51
+ Runner = Matter.Runner,
52
+ Bodies = Matter.Bodies,
53
+ Composite = Matter.Composite,
54
+ Constraint = Matter.Constraint,
55
+ Mouse = Matter.Mouse,
56
+ MouseConstraint = Matter.MouseConstraint,
57
+ Vector = Matter.Vector;
58
+
59
+ // Create engine
60
+ const engine = Engine.create(),
61
+ world = engine.world;
62
+
63
+ // Create renderer
64
+ const render = Render.create({
65
+ canvas: document.getElementById('canvas'),
66
+ engine: engine,
67
+ options: {
68
+ width: 800,
69
+ height: 600,
70
+ wireframes: false
71
+ }
72
+ });
73
+
74
+ // Create borders
75
+ const borderThickness = 50;
76
+ const ground = Bodies.rectangle(400, 600 + borderThickness/2, 800 + 2*borderThickness, borderThickness, { isStatic: true });
77
+ const ceiling = Bodies.rectangle(400, -borderThickness/2, 800 + 2*borderThickness, borderThickness, { isStatic: true });
78
+ const leftWall = Bodies.rectangle(-borderThickness/2, 300, borderThickness, 600 + 2*borderThickness, { isStatic: true });
79
+ const rightWall = Bodies.rectangle(800 + borderThickness/2, 300, borderThickness, 600 + 2*borderThickness, { isStatic: true });
80
+
81
+ // Ragdoll creation function
82
+ function createRagdoll() {
83
+ const head = Bodies.circle(400, 100, 30, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#FFD700' } });
84
+ const torso = Bodies.rectangle(400, 180, 60, 100, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#4169E1' } });
85
+ const leftArm = Bodies.rectangle(350, 180, 20, 80, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#FF6347' } });
86
+ const rightArm = Bodies.rectangle(450, 180, 20, 80, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#FF6347' } });
87
+ const leftLeg = Bodies.rectangle(375, 300, 20, 80, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#32CD32' } });
88
+ const rightLeg = Bodies.rectangle(425, 300, 20, 80, { friction: 0.5, restitution: 0.6, render: { fillStyle: '#32CD32' } });
89
+
90
+ const neck = Constraint.create({ bodyA: head, bodyB: torso, pointA: { x: 0, y: 30 }, pointB: { x: 0, y: -50 }, stiffness: 0.5 });
91
+ const leftShoulder = Constraint.create({ bodyA: torso, bodyB: leftArm, pointA: { x: -30, y: -40 }, pointB: { x: 0, y: -35 }, stiffness: 0.5 });
92
+ const rightShoulder = Constraint.create({ bodyA: torso, bodyB: rightArm, pointA: { x: 30, y: -40 }, pointB: { x: 0, y: -35 }, stiffness: 0.5 });
93
+ const leftHip = Constraint.create({ bodyA: torso, bodyB: leftLeg, pointA: { x: -20, y: 50 }, pointB: { x: 0, y: -35 }, stiffness: 0.5 });
94
+ const rightHip = Constraint.create({ bodyA: torso, bodyB: rightLeg, pointA: { x: 20, y: 50 }, pointB: { x: 0, y: -35 }, stiffness: 0.5 });
95
+
96
+ return {
97
+ parts: [head, torso, leftArm, rightArm, leftLeg, rightLeg],
98
+ constraints: [neck, leftShoulder, rightShoulder, leftHip, rightHip]
99
+ };
100
+ }
101
+
102
+ let ragdoll = createRagdoll();
103
+
104
+ // Add all bodies and constraints to the world
105
+ Composite.add(world, [
106
+ ground, ceiling, leftWall, rightWall,
107
+ ...ragdoll.parts,
108
+ ...ragdoll.constraints
109
+ ]);
110
+
111
+ // Add mouse control
112
+ const mouse = Mouse.create(render.canvas),
113
+ mouseConstraint = MouseConstraint.create(engine, {
114
+ mouse: mouse,
115
+ constraint: {
116
+ stiffness: 0.2,
117
+ render: {
118
+ visible: false
119
+ }
120
+ }
121
+ });
122
+
123
+ Composite.add(world, mouseConstraint);
124
+
125
+ // Keep the mouse in sync with rendering
126
+ render.mouse = mouse;
127
+
128
+ // Reset scene function
129
+ function resetScene() {
130
+ Composite.remove(world, [...ragdoll.parts, ...ragdoll.constraints]);
131
+ ragdoll = createRagdoll();
132
+ Composite.add(world, [...ragdoll.parts, ...ragdoll.constraints]);
133
+ }
134
+
135
+ // Explode ragdoll function
136
+ function explodeRagdoll() {
137
+ Composite.remove(world, ragdoll.constraints);
138
+ ragdoll.parts.forEach(part => {
139
+ const force = Vector.mult(
140
+ Vector.normalise(Vector.sub(part.position, ragdoll.parts[1].position)),
141
+ 0.05 * part.mass
142
+ );
143
+ Matter.Body.applyForce(part, part.position, force);
144
+ });
145
+ ragdoll.constraints = [];
146
+ }
147
+
148
+ // Event listeners for buttons
149
+ document.getElementById('resetBtn').addEventListener('click', resetScene);
150
+ document.getElementById('explodeBtn').addEventListener('click', explodeRagdoll);
151
+
152
+ // Run the engine
153
+ Render.run(render);
154
+ Runner.run(Runner.create(), engine);
155
+ </script>
156
+ </body></html>
vuZ4HnBut0SI8pWXC.html ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/"><title>Veggie Swap Deluxe: Healthy Match-3 Adventure</title>
2
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
3
+ <style>
4
+ body, html {
5
+ margin: 0;
6
+ padding: 0;
7
+ height: 100%;
8
+ font-family: 'Roboto', sans-serif;
9
+ background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
10
+ }
11
+ #game-container {
12
+ width: 100%;
13
+ max-width: 400px;
14
+ margin: 20px auto;
15
+ padding: 20px;
16
+ box-sizing: border-box;
17
+ background-color: rgba(255, 255, 255, 0.8);
18
+ border-radius: 15px;
19
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
20
+ }
21
+ h1 {
22
+ text-align: center;
23
+ color: #2e7d32;
24
+ font-size: 28px;
25
+ margin-bottom: 20px;
26
+ text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
27
+ }
28
+ #game-board {
29
+ width: 100%;
30
+ aspect-ratio: 1 / 1;
31
+ background-color: #c8e6c9;
32
+ border: 3px solid #4caf50;
33
+ border-radius: 10px;
34
+ display: grid;
35
+ grid-template-columns: repeat(6, 1fr);
36
+ grid-template-rows: repeat(6, 1fr);
37
+ gap: 3px;
38
+ padding: 5px;
39
+ box-sizing: border-box;
40
+ box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.1);
41
+ }
42
+ .veggie {
43
+ width: 100%;
44
+ height: 100%;
45
+ border-radius: 50%;
46
+ display: flex;
47
+ justify-content: center;
48
+ align-items: center;
49
+ font-size: 28px;
50
+ cursor: pointer;
51
+ transition: transform 0.3s, background-color 0.3s;
52
+ background-color: #ffffff;
53
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
54
+ }
55
+ .veggie:hover {
56
+ transform: scale(1.1);
57
+ }
58
+ .veggie.selected {
59
+ background-color: rgba(255, 255, 0, 0.3);
60
+ box-shadow: 0 0 10px rgba(255, 255, 0, 0.5);
61
+ }
62
+ #score, #moves, #level {
63
+ text-align: center;
64
+ font-size: 20px;
65
+ margin-top: 15px;
66
+ color: #1b5e20;
67
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);
68
+ }
69
+ #health-bar {
70
+ width: 100%;
71
+ height: 20px;
72
+ background-color: #ef5350;
73
+ margin-top: 20px;
74
+ border-radius: 10px;
75
+ overflow: hidden;
76
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
77
+ }
78
+ #health {
79
+ width: 100%;
80
+ height: 100%;
81
+ background-color: #4caf50;
82
+ transition: width 0.5s;
83
+ }
84
+ @keyframes pop {
85
+ 0% { transform: scale(1); }
86
+ 50% { transform: scale(1.2); }
87
+ 100% { transform: scale(1); }
88
+ }
89
+ .pop {
90
+ animation: pop 0.3s ease-out;
91
+ }
92
+ @keyframes fall {
93
+ 0% { transform: translateY(-100%); }
94
+ 100% { transform: translateY(0); }
95
+ }
96
+ .fall {
97
+ animation: fall 0.5s ease-out;
98
+ }
99
+ </style>
100
+ </head>
101
+ <body>
102
+ <div id="game-container">
103
+ <h1>Veggie Swap Deluxe</h1>
104
+ <div id="game-board"></div>
105
+ <div id="score">Score: 0</div>
106
+ <div id="moves">Moves left: 20</div>
107
+ <div id="level">Level: 1</div>
108
+ <div id="health-bar"><div id="health"></div></div>
109
+ </div>
110
+
111
+ <script>
112
+ const gameBoard = document.getElementById('game-board');
113
+ const scoreElement = document.getElementById('score');
114
+ const movesElement = document.getElementById('moves');
115
+ const healthElement = document.getElementById('health');
116
+ const levelElement = document.getElementById('level');
117
+
118
+ const veggies = ['🥕', '🥦', '🍅', '🍆', '🥑', '🌽', '🥒', '🥔'];
119
+ const gridSize = 6;
120
+ let grid = [];
121
+ let score = 0;
122
+ let moves = 20;
123
+ let health = 100;
124
+ let selectedVeggie = null;
125
+ let level = 1;
126
+ let comboMultiplier = 1;
127
+
128
+ function createGrid() {
129
+ gameBoard.innerHTML = '';
130
+ grid = [];
131
+ for (let i = 0; i < gridSize * gridSize; i++) {
132
+ const veggie = document.createElement('div');
133
+ veggie.classList.add('veggie');
134
+ veggie.innerText = veggies[Math.floor(Math.random() * veggies.length)];
135
+ veggie.addEventListener('click', () => handleClick(i));
136
+ gameBoard.appendChild(veggie);
137
+ grid.push(veggie);
138
+ }
139
+ }
140
+
141
+ function handleClick(index) {
142
+ if (moves <= 0) return;
143
+
144
+ if (selectedVeggie === null) {
145
+ selectedVeggie = index;
146
+ grid[index].classList.add('selected');
147
+ } else {
148
+ if (isAdjacent(selectedVeggie, index)) {
149
+ swapVeggies(selectedVeggie, index);
150
+ grid[selectedVeggie].classList.remove('selected');
151
+ selectedVeggie = null;
152
+ moves--;
153
+ updateMoves();
154
+ checkMatches();
155
+ } else {
156
+ grid[selectedVeggie].classList.remove('selected');
157
+ selectedVeggie = index;
158
+ grid[index].classList.add('selected');
159
+ }
160
+ }
161
+ }
162
+
163
+ function isAdjacent(index1, index2) {
164
+ const row1 = Math.floor(index1 / gridSize);
165
+ const col1 = index1 % gridSize;
166
+ const row2 = Math.floor(index2 / gridSize);
167
+ const col2 = index2 % gridSize;
168
+
169
+ return (Math.abs(row1 - row2) + Math.abs(col1 - col2) === 1);
170
+ }
171
+
172
+ function swapVeggies(index1, index2) {
173
+ const temp = grid[index1].innerText;
174
+ grid[index1].innerText = grid[index2].innerText;
175
+ grid[index2].innerText = temp;
176
+ grid[index1].classList.add('pop');
177
+ grid[index2].classList.add('pop');
178
+ setTimeout(() => {
179
+ grid[index1].classList.remove('pop');
180
+ grid[index2].classList.remove('pop');
181
+ }, 300);
182
+ }
183
+
184
+ function checkMatches() {
185
+ let matchFound = false;
186
+
187
+ // Check horizontal matches
188
+ for (let row = 0; row < gridSize; row++) {
189
+ for (let col = 0; col < gridSize - 2; col++) {
190
+ const index = row * gridSize + col;
191
+ const matchLength = getMatchLength(index, 1);
192
+ if (matchLength >= 3) {
193
+ removeMatch(index, matchLength, 1);
194
+ matchFound = true;
195
+ }
196
+ }
197
+ }
198
+
199
+ // Check vertical matches
200
+ for (let col = 0; col < gridSize; col++) {
201
+ for (let row = 0; row < gridSize - 2; row++) {
202
+ const index = row * gridSize + col;
203
+ const matchLength = getMatchLength(index, gridSize);
204
+ if (matchLength >= 3) {
205
+ removeMatch(index, matchLength, gridSize);
206
+ matchFound = true;
207
+ }
208
+ }
209
+ }
210
+
211
+ if (matchFound) {
212
+ comboMultiplier++;
213
+ setTimeout(() => {
214
+ fillEmptySpaces();
215
+ setTimeout(() => {
216
+ checkMatches();
217
+ }, 300);
218
+ }, 300);
219
+ } else {
220
+ comboMultiplier = 1;
221
+ }
222
+ }
223
+
224
+ function getMatchLength(startIndex, step) {
225
+ const startVeggie = grid[startIndex].innerText;
226
+ let length = 1;
227
+ let index = startIndex + step;
228
+
229
+ while (index < gridSize * gridSize && grid[index].innerText === startVeggie) {
230
+ length++;
231
+ index += step;
232
+ }
233
+
234
+ return length;
235
+ }
236
+
237
+ function removeMatch(startIndex, length, step) {
238
+ for (let i = 0; i < length; i++) {
239
+ const index = startIndex + i * step;
240
+ grid[index].innerText = '';
241
+ grid[index].classList.add('pop');
242
+ setTimeout(() => {
243
+ grid[index].classList.remove('pop');
244
+ }, 300);
245
+ }
246
+ updateScore(length);
247
+ updateHealth(length);
248
+ }
249
+
250
+ function fillEmptySpaces() {
251
+ for (let col = 0; col < gridSize; col++) {
252
+ let emptySpaces = 0;
253
+ for (let row = gridSize - 1; row >= 0; row--) {
254
+ const index = row * gridSize + col;
255
+ if (grid[index].innerText === '') {
256
+ emptySpaces++;
257
+ } else if (emptySpaces > 0) {
258
+ grid[(row + emptySpaces) * gridSize + col].innerText = grid[index].innerText;
259
+ grid[index].innerText = '';
260
+ }
261
+ }
262
+ for (let row = 0; row < emptySpaces; row++) {
263
+ const newVeggie = veggies[Math.floor(Math.random() * veggies.length)];
264
+ grid[row * gridSize + col].innerText = newVeggie;
265
+ grid[row * gridSize + col].classList.add('fall');
266
+ setTimeout(() => {
267
+ grid[row * gridSize + col].classList.remove('fall');
268
+ }, 500);
269
+ }
270
+ }
271
+ }
272
+
273
+ function updateScore(matchLength) {
274
+ const pointsGained = matchLength * matchLength * comboMultiplier;
275
+ score += pointsGained;
276
+ scoreElement.innerText = `Score: ${score}`;
277
+ checkLevelUp();
278
+ }
279
+
280
+ function checkLevelUp() {
281
+ const newLevel = Math.floor(score / 1000) + 1;
282
+ if (newLevel > level) {
283
+ level = newLevel;
284
+ levelElement.innerText = `Level: ${level}`;
285
+ moves += 5;
286
+ updateMoves();
287
+ }
288
+ }
289
+
290
+ function updateMoves() {
291
+ movesElement.innerText = `Moves left: ${moves}`;
292
+ if (moves <= 0) {
293
+ endGame();
294
+ }
295
+ }
296
+
297
+ function updateHealth(matchLength) {
298
+ health += matchLength * 2;
299
+ if (health > 100) health = 100;
300
+ healthElement.style.width = `${health}%`;
301
+ }
302
+
303
+ function endGame() {
304
+ alert(`Game Over! Your final score is ${score}. You reached level ${level}!`);
305
+ if (confirm('Do you want to play again?')) {
306
+ resetGame();
307
+ }
308
+ }
309
+
310
+ function resetGame() {
311
+ score = 0;
312
+ moves = 20;
313
+ health = 100;
314
+ level = 1;
315
+ comboMultiplier = 1;
316
+ scoreElement.innerText = `Score: ${score}`;
317
+ movesElement.innerText = `Moves left: ${moves}`;
318
+ healthElement.style.width = '100%';
319
+ levelElement.innerText = `Level: ${level}`;
320
+ createGrid();
321
+ }
322
+
323
+ createGrid();
324
+ </script>
325
+ </body></html>
zFxvKFmaf159fZIEm.html ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/advanced-space-quiz">
2
+ <title>Cosmic Mastery: Elite Space Quiz</title>
3
+ <style>
4
+ @import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@300;400;700&display=swap');
5
+
6
+ body {
7
+ font-family: 'Exo 2', sans-serif;
8
+ background-color: #000;
9
+ color: #e0f7ff;
10
+ display: flex;
11
+ flex-direction: column;
12
+ align-items: center;
13
+ justify-content: flex-start;
14
+ min-height: 100vh;
15
+ margin: 0;
16
+ padding: 20px;
17
+ box-sizing: border-box;
18
+ background: linear-gradient(to bottom, #000033, #000066);
19
+ overflow-x: hidden;
20
+ }
21
+
22
+ .stars {
23
+ position: fixed;
24
+ top: 0;
25
+ left: 0;
26
+ width: 100%;
27
+ height: 100%;
28
+ z-index: -1;
29
+ }
30
+
31
+ .star {
32
+ position: absolute;
33
+ background-color: #fff;
34
+ border-radius: 50%;
35
+ }
36
+
37
+ @keyframes twinkle {
38
+ 0% { opacity: 0; }
39
+ 50% { opacity: 1; }
40
+ 100% { opacity: 0; }
41
+ }
42
+
43
+ h1 {
44
+ font-size: 2.8em;
45
+ text-align: center;
46
+ margin-bottom: 30px;
47
+ background: linear-gradient(to right, #00ffff, #ff00ff);
48
+ -webkit-background-clip: text;
49
+ -webkit-text-fill-color: transparent;
50
+ text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
51
+ }
52
+
53
+ #quiz-container {
54
+ background-color: rgba(255, 255, 255, 0.1);
55
+ border-radius: 20px;
56
+ padding: 40px;
57
+ width: 90%;
58
+ max-width: 800px;
59
+ box-shadow: 0 0 30px rgba(0, 255, 255, 0.3);
60
+ backdrop-filter: blur(10px);
61
+ }
62
+
63
+ #question {
64
+ font-size: 1.4em;
65
+ margin-bottom: 30px;
66
+ text-align: center;
67
+ font-weight: 700;
68
+ }
69
+
70
+ #answer-container {
71
+ display: grid;
72
+ grid-template-columns: 1fr 1fr;
73
+ gap: 20px;
74
+ }
75
+
76
+ .answer-btn {
77
+ padding: 20px;
78
+ background-color: rgba(0, 255, 255, 0.1);
79
+ color: #fff;
80
+ border: 2px solid #00ffff;
81
+ border-radius: 15px;
82
+ cursor: pointer;
83
+ transition: all 0.3s ease;
84
+ font-family: 'Exo 2', sans-serif;
85
+ font-size: 1.1em;
86
+ position: relative;
87
+ overflow: hidden;
88
+ }
89
+
90
+ .answer-btn::before {
91
+ content: '';
92
+ position: absolute;
93
+ top: 0;
94
+ left: -100%;
95
+ width: 100%;
96
+ height: 100%;
97
+ background: linear-gradient(
98
+ 120deg,
99
+ transparent,
100
+ rgba(255, 255, 255, 0.3),
101
+ transparent
102
+ );
103
+ transition: all 0.5s;
104
+ }
105
+
106
+ .answer-btn:hover::before {
107
+ left: 100%;
108
+ }
109
+
110
+ .answer-btn:hover {
111
+ background-color: rgba(0, 255, 255, 0.3);
112
+ transform: scale(1.05);
113
+ box-shadow: 0 0 15px rgba(0, 255, 255, 0.5);
114
+ }
115
+
116
+ #result {
117
+ margin-top: 30px;
118
+ font-weight: bold;
119
+ text-align: center;
120
+ min-height: 50px;
121
+ font-size: 1.2em;
122
+ }
123
+
124
+ #next-btn {
125
+ display: none;
126
+ margin: 30px auto 0;
127
+ padding: 15px 30px;
128
+ background: linear-gradient(45deg, #00ffff, #ff00ff);
129
+ color: #000;
130
+ border: none;
131
+ border-radius: 25px;
132
+ cursor: pointer;
133
+ font-family: 'Exo 2', sans-serif;
134
+ font-size: 1.2em;
135
+ font-weight: 700;
136
+ transition: all 0.3s ease;
137
+ text-transform: uppercase;
138
+ }
139
+
140
+ #next-btn:hover {
141
+ transform: scale(1.05);
142
+ box-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
143
+ }
144
+
145
+ #score, #timer {
146
+ position: fixed;
147
+ font-size: 1.3em;
148
+ background-color: rgba(0, 255, 255, 0.2);
149
+ padding: 15px;
150
+ border-radius: 15px;
151
+ backdrop-filter: blur(5px);
152
+ }
153
+
154
+ #score {
155
+ top: 20px;
156
+ left: 20px;
157
+ }
158
+
159
+ #timer {
160
+ top: 20px;
161
+ right: 20px;
162
+ }
163
+
164
+ .explanation {
165
+ margin-top: 25px;
166
+ font-size: 1em;
167
+ text-align: justify;
168
+ display: none;
169
+ background-color: rgba(255, 255, 255, 0.1);
170
+ padding: 20px;
171
+ border-radius: 15px;
172
+ border-left: 5px solid #00ffff;
173
+ }
174
+
175
+ @media (max-width: 700px) {
176
+ #answer-container {
177
+ grid-template-columns: 1fr;
178
+ }
179
+ h1 {
180
+ font-size: 2.2em;
181
+ }
182
+ #quiz-container {
183
+ padding: 30px;
184
+ }
185
+ }
186
+
187
+ #progress-bar {
188
+ width: 100%;
189
+ height: 10px;
190
+ background-color: rgba(255, 255, 255, 0.2);
191
+ border-radius: 5px;
192
+ margin-top: 20px;
193
+ overflow: hidden;
194
+ }
195
+
196
+ #progress {
197
+ width: 0%;
198
+ height: 100%;
199
+ background: linear-gradient(90deg, #00ffff, #ff00ff);
200
+ transition: width 0.5s ease;
201
+ }
202
+ </style>
203
+ </head>
204
+ <body>
205
+ <div class="stars"></div>
206
+ <h1>Cosmic Mastery: Elite Space Quiz</h1>
207
+ <div id="score">Score: <span id="score-value">0</span></div>
208
+ <div id="timer">Time: <span id="time-value">90</span>s</div>
209
+ <div id="quiz-container">
210
+ <div id="question"></div>
211
+ <div id="answer-container">
212
+ <button class="answer-btn" onclick="checkAnswer(0)"></button>
213
+ <button class="answer-btn" onclick="checkAnswer(1)"></button>
214
+ <button class="answer-btn" onclick="checkAnswer(2)"></button>
215
+ <button class="answer-btn" onclick="checkAnswer(3)"></button>
216
+ </div>
217
+ <div id="result"></div>
218
+ <div class="explanation" id="explanation"></div>
219
+ <div id="progress-bar">
220
+ <div id="progress"></div>
221
+ </div>
222
+ <button id="next-btn" onclick="nextQuestion()">Next Challenge</button>
223
+ </div>
224
+
225
+ <script>
226
+ const questions = [
227
+ {
228
+ question: "What is the Tolman–Oppenheimer–Volkoff limit?",
229
+ answers: [
230
+ "The maximum mass of a stable neutron star",
231
+ "The minimum mass required for stellar fusion",
232
+ "The limit at which a white dwarf becomes a neutron star",
233
+ "The point at which a star becomes a red giant"
234
+ ],
235
+ correct: 0,
236
+ explanation: "The Tolman–Oppenheimer–Volkoff limit is the maximum mass a neutron star can have while remaining stable. Beyond this limit, the neutron star would collapse into a black hole."
237
+ },
238
+ {
239
+ question: "What is the primary mechanism behind Type Ia supernovae?",
240
+ answers: [
241
+ "Core collapse of a massive star",
242
+ "Thermonuclear explosion of a white dwarf",
243
+ "Merger of two neutron stars",
244
+ "Sudden accretion of matter onto a black hole"
245
+ ],
246
+ correct: 1,
247
+ explanation: "Type Ia supernovae occur when a white dwarf in a binary system accretes matter from its companion, reaching the Chandrasekhar limit, leading to a thermonuclear explosion."
248
+ },
249
+ {
250
+ question: "What is the Lyman-alpha forest?",
251
+ answers: [
252
+ "A region of space with a high density of young stars",
253
+ "A collection of absorption lines in quasar spectra",
254
+ "A type of nebula rich in hydrogen",
255
+ "A pattern formed by cosmic microwave background radiation"
256
+ ],
257
+ correct: 1,
258
+ explanation: "The Lyman-alpha forest is a series of absorption lines in quasar spectra, caused by neutral hydrogen in the intergalactic medium along the line of sight to distant quasars."
259
+ },
260
+ {
261
+ question: "What is the current best explanation for dark energy?",
262
+ answers: [
263
+ "Quantum vacuum energy",
264
+ "A fifth fundamental force",
265
+ "Modified gravity theories",
266
+ "The nature of dark energy remains unknown"
267
+ ],
268
+ correct: 3,
269
+ explanation: "While there are several hypotheses, including quantum vacuum energy and modified gravity theories, the true nature of dark energy remains one of the biggest mysteries in modern cosmology."
270
+ },
271
+ {
272
+ question: "What is the Unruh effect?",
273
+ answers: [
274
+ "The creation of virtual particles in strong gravitational fields",
275
+ "The apparent temperature experienced by an accelerating observer",
276
+ "The bending of light around massive objects",
277
+ "The time dilation near the event horizon of a black hole"
278
+ ],
279
+ correct: 1,
280
+ explanation: "The Unruh effect, named after Bill Unruh, states that an accelerating observer will observe blackbody radiation where an inertial observer would observe none. This links acceleration to temperature."
281
+ },
282
+ {
283
+ question: "What is the theorized mechanism behind Hawking radiation?",
284
+ answers: [
285
+ "Quantum tunneling across the event horizon",
286
+ "Gravitational lensing of background radiation",
287
+ "Pair production near the event horizon",
288
+ "Accretion of matter onto the black hole"
289
+ ],
290
+ correct: 2,
291
+ explanation: "Hawking radiation is theorized to occur due to quantum effects near the event horizon. Virtual particle pairs are created, with one particle falling into the black hole and the other escaping, appearing as radiation."
292
+ },
293
+ {
294
+ question: "What is the Great Attractor?",
295
+ answers: [
296
+ "A supermassive black hole at the center of our galaxy",
297
+ "A hypothetical object pulling our galaxy towards it",
298
+ "The point where the expansion of the universe begins to accelerate",
299
+ "The region where the cosmic microwave background is most intense"
300
+ ],
301
+ correct: 1,
302
+ explanation: "The Great Attractor is a gravitational anomaly in intergalactic space that appears to be pulling our galaxy and others towards it, suggesting a concentration of mass beyond what can be accounted for by visible matter."
303
+ }
304
+ ];
305
+
306
+ let currentQuestion = 0;
307
+ let score = 0;
308
+ let timeLeft = 90;
309
+ let timer;
310
+
311
+ function createStars() {
312
+ const starsContainer = document.querySelector('.stars');
313
+ for (let i = 0; i < 200; i++) {
314
+ const star = document.createElement('div');
315
+ star.classList.add('star');
316
+ star.style.width = `${Math.random() * 3}px`;
317
+ star.style.height = star.style.width;
318
+ star.style.left = `${Math.random() * 100}%`;
319
+ star.style.top = `${Math.random() * 100}%`;
320
+ star.style.animationDuration = `${Math.random() * 3 + 1}s`;
321
+ star.style.animationDelay = `${Math.random() * 3}s`;
322
+ starsContainer.appendChild(star);
323
+ }
324
+ }
325
+
326
+ function loadQuestion() {
327
+ const question = questions[currentQuestion];
328
+ document.getElementById('question').textContent = question.question;
329
+ const buttons = document.getElementsByClassName('answer-btn');
330
+ for (let i = 0; i < buttons.length; i++) {
331
+ buttons[i].textContent = question.answers[i];
332
+ buttons[i].disabled = false;
333
+ buttons[i].style.opacity = 1;
334
+ }
335
+ document.getElementById('result').textContent = '';
336
+ document.getElementById('explanation').style.display = 'none';
337
+ document.getElementById('next-btn').style.display = 'none';
338
+
339
+ clearInterval(timer);
340
+ timeLeft = 90;
341
+ updateTimer();
342
+ timer = setInterval(updateTimer, 1000);
343
+
344
+ updateProgressBar();
345
+ }
346
+
347
+ function updateProgressBar() {
348
+ const progress = ((currentQuestion + 1) / questions.length) * 100;
349
+ document.getElementById('progress').style.width = `${progress}%`;
350
+ }
351
+
352
+ function updateTimer() {
353
+ document.getElementById('time-value').textContent = timeLeft;
354
+ if (timeLeft <= 0) {
355
+ clearInterval(timer);
356
+ checkAnswer(-1);
357
+ } else {
358
+ timeLeft--;
359
+ }
360
+ }
361
+
362
+ function checkAnswer(answerIndex) {
363
+ clearInterval(timer);
364
+ const question = questions[currentQuestion];
365
+ const resultDiv = document.getElementById('result');
366
+ const buttons = document.getElementsByClassName('answer-btn');
367
+
368
+ for (let i = 0; i < buttons.length; i++) {
369
+ buttons[i].disabled = true;
370
+ if (i !== question.correct) {
371
+ buttons[i].style.opacity = 0.5;
372
+ }
373
+ }
374
+
375
+ if (answerIndex === question.correct) {
376
+ resultDiv.textContent = "Correct! You've mastered this cosmic concept!";
377
+ resultDiv.style.color = "#00ff00";
378
+ score++;
379
+ document.getElementById('score-value').textContent = score;
380
+ } else if (answerIndex === -1) {
381
+ resultDiv.textContent = "Time's up! The secrets of the cosmos wait for no one.";
382
+ resultDiv.style.color = "#ff0000";
383
+ } else {
384
+ resultDiv.textContent = `Incorrect. The mysteries of the universe continue to challenge us.`;
385
+ resultDiv.style.color = "#ff0000";
386
+ }
387
+
388
+ document.getElementById('explanation').textContent = question.explanation;
389
+ document.getElementById('explanation').style.display = 'block';
390
+ document.getElementById('next-btn').style.display = 'block';
391
+ }
392
+
393
+ function nextQuestion() {
394
+ currentQuestion++;
395
+ if (currentQuestion < questions.length) {
396
+ loadQuestion();
397
+ } else {
398
+ clearInterval(timer);
399
+ document.getElementById('quiz-container').innerHTML = `
400
+ <h2>Cosmic Mastery Achieved!</h2>
401
+ <p>Your final score: ${score} out of ${questions.length}</p>
402
+ <p>You've proven yourself as an elite cosmic explorer!</p>
403
+ <a href="https://websim.ai/space-research-simulator" class="answer-btn" style="display: inline-block; text-decoration: none; text-align: center; margin-top: 20px;">Launch Space Research Simulator</a>
404
+ <br><br>
405
+ <a href="https://websim.ai/astronomy-news" class="answer-btn" style="display: inline-block; text-decoration: none; text-align: center;">Explore Latest Astronomy Discoveries</a>
406
+ `;
407
+ }
408
+ }
409
+
410
+ createStars();
411
+ loadQuestion();
412
+ </script>
413
+ </body></html>