-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.svelte
More file actions
110 lines (99 loc) · 3.05 KB
/
App.svelte
File metadata and controls
110 lines (99 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<script>
import { init, render } from "./app/world";
import { createBodies, setPositions } from "./app/SolarSystem";
import { createStars } from "./app/Constellations";
import { splitDate, getDateFromArray } from "./app/utils";
import { DefaultLoadingManager } from "three";
import { slide } from "svelte/transition";
let loaded = false;
const { renderer, css_renderer, scene, camera, controls } = init();
scene.add(createBodies());
scene.add(createStars());
let t = new Date();
let date = [];
date = splitDate(t);
setPositions(t);
$: {
t = getDateFromArray(date).t;
const dateString = date[0] + "-" + date[1] + "-" + date[2];
if (t > 0 && dateString === getDateFromArray(date).t_str) {
setPositions(t);
render(renderer, css_renderer, scene, camera);
}
}
function animate() {
requestAnimationFrame(animate);
render(renderer, css_renderer, scene, camera);
}
animate();
DefaultLoadingManager.onLoad = function () {
console.log("Loading Complete!");
setTimeout(() => {
loaded = true;
}, 1000);
render(renderer, css_renderer, scene, camera);
};
controls.addEventListener("change", () => {
render(renderer, css_renderer, scene, camera);
});
const handleResize = () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
css_renderer.setSize(window.innerWidth, window.innerHeight);
};
</script>
<svelte:window on:resize={handleResize} />
{#if !loaded}
<section id="loading-screen" out:slide={{ y: -1000, duration: 2000 }} />
{/if}
<div class="bottom-left">
<input class="short-num" type="number" required max="31" min="1" bind:value={date[0]} /><span>/</span>
<input class="short-num" type="number" required max="12" min="1" bind:value={date[1]} /><span>/</span>
<input class="long-num" type="number" required max="2050" min="1950" bind:value={date[2]} />
</div>
<style>
.bottom-left {
position: absolute;
bottom: 1rem;
inset-inline: 0;
width: fit-content;
margin: auto;
z-index: 100;
color: white;
font-size: 1.5rem;
}
input[type="number"] {
font-family: monospace;
font-size: 1.5rem;
background-color: transparent;
color: white;
padding: 0;
border: none;
}
.short-num {
width: 2.5ch;
}
.long-num {
width: 4.5ch;
}
input[type="number"]:focus-visible {
outline: none;
}
input[type="number"]:invalid {
border: solid 1px red;
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
appearance: none;
}
#loading-screen {
position: absolute;
z-index: 200;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: black;
}
</style>