My personal site hosted @ https://indexx.dev
1---
2import Layout from "../layouts/Layout.astro";
3---
4
5<Layout title="hello" description="insert wave emoji">
6 <main id="page" class="text-center">
7 <h1 class="animated-border unselectable spin">
8 <svg
9 width="24"
10 height="24"
11 viewBox="0 0 24 24"
12 fill="none"
13 xmlns="http://www.w3.org/2000/svg"
14 style="position: absolute; top: -5px; margin-left: -2px; transform: rotate(-10deg); color: gold;"
15 >
16 <path
17 fill-rule="evenodd"
18 clip-rule="evenodd"
19 d="M2.5 6.09143L7.21997 10.8114L12.0005 6.03088L16.7811 10.8114L21.5 6.09245V14.9691C21.5 16.626 20.1569 17.9691 18.5 17.9691H5.5C3.84314 17.9691 2.5 16.626 2.5 14.9691V6.09143ZM19.5 10.9087V14.9691C19.5 15.5214 19.0523 15.9691 18.5 15.9691H5.5C4.94771 15.9691 4.5 15.5214 4.5 14.9691V10.9077L7.21997 13.6277L12.0005 8.84717L16.7811 13.6277L19.5 10.9087Z"
20 fill="currentColor"></path>
21 </svg>
22 <span style="position: relative; z-index: 2;">index</span>
23 </h1>
24 <span style="display: block; margin-top: -5px;"
25 >hey, i'm index. have a great day 👋
26 </span>
27 <small
28 style="display: block; margin-top: -5px;color: rgb(0, 84, 106);font-size: 0.8rem;"
29 >i usually mess around in Typescript, and recently i've been exploring the <a
30 href="https://atproto.com/"
31 target="_blank"><b>AT protocol</b>.</a
32 >
33 </small
34 >
35 <small
36 style="display: block; margin-top: -5px;color: rgb(0, 84, 106);font-size: 0.8rem;"
37 >
38 i'm interested in making an open-source Goodreads alternative on the protocol :)
39 </small
40 >
41 <ul
42 class="d-flex mt-4 mb-1"
43 style="padding: 0px; width: 50%; margin: auto; justify-content: space-evenly; flex-basis: 33%;"
44 >
45 <a
46 href="https://github.com/indexxing/"
47 target="_blank"
48 class="circle-hover"
49 >
50 <svg viewBox="0 0 70 36">
51 <path
52 d="M6.9739 30.8153H63.0244C65.5269 30.8152 75.5358 -3.68471 35.4998 2.81531C-16.1598 11.2025 0.894099 33.9766 26.9922 34.3153C104.062 35.3153 54.5169 -6.68469 23.489 9.31527"
53 ></path>
54 </svg>
55 GitHub
56 </a>
57 <a
58 id="discord-link"
59 href="#"
60 class="circle-hover"
61 data-bs-toggle="tooltip"
62 data-bs-title="index.lua"
63 >
64 <svg viewBox="0 0 70 36">
65 <path
66 d="M6.9739 30.8153H63.0244C65.5269 30.8152 75.5358 -3.68471 35.4998 2.81531C-16.1598 11.2025 0.894099 33.9766 26.9922 34.3153C104.062 35.3153 54.5169 -6.68469 23.489 9.31527"
67 ></path>
68 </svg>
69 <span> Discord </span>
70 </a>
71 <a
72 href="https://bsky.app/profile/did:plc:sfjxpxxyvewb2zlxwoz2vduw"
73 target="_blank"
74 class="circle-hover"
75 >
76 <svg viewBox="0 0 70 36">
77 <path
78 d="M6.9739 30.8153H63.0244C65.5269 30.8152 75.5358 -3.68471 35.4998 2.81531C-16.1598 11.2025 0.894099 33.9766 26.9922 34.3153C104.062 35.3153 54.5169 -6.68469 23.489 9.31527"
79 ></path>
80 </svg>
81 Bluesky
82 </a>
83 </ul>
84 <a
85 href="#"
86 id="projects-button"
87 data-bs-toggle="tooltip"
88 data-bs-title="(Some of) My Projects"
89 data-bs-placement="bottom">. . .</a
90 >
91 </main>
92 <section id="projects-pane" data-bs-theme="dark">
93 <h6
94 class="text-muted text-center"
95 style="text-transform: uppercase; letter-spacing: 5px;"
96 >
97 (SOME OF) MY PROJECTS
98 </h6>
99
100 <ul class="list-unstyled">
101 <li>
102 <a
103 href="https://github.com/Box-Critters-Localbox/"
104 target="_blank"
105 class="text-reset"
106 >
107 <div class="project-card">
108 <small class="text-muted">since November 2024</small>
109 <h4>Box Critters Localbox</h4>
110 Looking to relive Box Critters, a defunct virtual world made by Rocketsnail
111 Games, well you're in luck! In this GitHub organization, you can find:
112 a Typescript, unofficial server remake of the game server, documentation
113 surrounding the game, and an Electron desktop app for playing the game
114 locally.
115 </div>
116 </a>
117 <a
118 href="https://github.com/ToonkinsRetooned/"
119 target="_blank"
120 class="text-reset"
121 >
122 <div class="project-card">
123 <small class="text-muted">since October 2024</small>
124 <h4>Toonkins Retooned</h4>
125 Looking to relive Toonkins, a defunct virtual world made by Shenanigames,
126 well you're in luck! In this Github organization, you can find: a Typescript,
127 unofficial server remake of the game server, and a decompiled Unity project
128 reassembly of the game (Unity project source coming soon).
129 <br />
130 <small class="text-muted"
131 >Note: "Retooned" is purposely spelled wrong, I know how to spell
132 I swear 😭</small
133 >
134 </div>
135 </a>
136 <a
137 href="https://github.com/indexxing/PolyPlus-Rewrite/"
138 target="_blank"
139 class="text-reset"
140 >
141 <div class="project-card">
142 <small class="text-muted">since October 2024, coming soon</small>
143 <h4>Poly+ Rewrite</h4>
144 A rewrite of Poly+, my quality-of-life browser extension for Polytoria.com.
145 Built entirely fresh using the WXT extension framework, Typescript, and
146 with added better overall code quality. This version is not public yet.
147 </div>
148 </a>
149 <a
150 href="https://polycode.vercel.app/"
151 target="_blank"
152 class="text-reset"
153 >
154 <div class="project-card">
155 <small class="text-muted">since August 2023, archived</small>
156 <h4>PolyCode</h4>
157 PolyCode provides free code snippets, tutorials, and toolbox resources
158 for Polytoria.
159 <br />
160 <small class="text-muted"
161 >Note: This was made awhile ago, and if I were to redo it, I'd
162 implement SSR instead of doing JSON file fetching.</small
163 >
164 </div>
165 </a>
166 <a
167 href="https://github.com/indexxing/PolyPlus/"
168 target="_blank"
169 class="text-reset mb-3"
170 >
171 <div class="project-card">
172 <small class="text-muted">since February 2023, archived</small>
173 <h4>Poly+</h4>
174 Poly+ is a quality-of-life Chromium-based extension for Polytoria!
175 </div>
176 </a>
177 </li>
178 </ul>
179 </section>
180 <script>
181 const tooltips = document.querySelectorAll(
182 '[data-bs-toggle="tooltip"]'
183 ) as NodeListOf<Element>;
184 [...tooltips].forEach((element) => {
185 //@ts-ignore
186 new bootstrap.Tooltip(element);
187
188 element.addEventListener("click", () => (element as HTMLElement).blur());
189 });
190
191 const page = document.getElementById("page")!;
192 const projectsButton = document.getElementById("projects-button")!;
193 projectsButton.addEventListener("click", function () {
194 projectsButton.blur();
195 page.classList.toggle("side");
196 if (!page.classList.contains("side")) {
197 // fade in
198 fade("projects-pane", 1, 0, 0.5);
199 } else {
200 // fade out
201 fade("projects-pane", 0, 1, 0.5);
202 }
203 });
204
205 /*
206 I'm lazy so thank you, Neel
207 credits: https://blog.abhranil.net/2011/11/03/simplest-javascript-fade-animation/
208 * slightly modified
209 */
210 function fade(
211 id: string,
212 initialOpacity: number,
213 finalOpacity: number,
214 totalTime: number
215 ) {
216 const element = document.getElementById(id);
217 if (!element) {
218 throw new Error("why");
219 }
220 if (initialOpacity == 0) {
221 element.style.visibility = "visible";
222 element.style.pointerEvents = "auto";
223 } else {
224 element.style.pointerEvents = "none";
225 setTimeout(() => {
226 element.style.visibility = "hidden";
227 }, totalTime);
228 }
229
230 const currentTick = new Date().getTime();
231 const elapsed = currentTick - totalTime;
232 const newOpacity =
233 initialOpacity +
234 ((finalOpacity - initialOpacity) * elapsed) / totalTime;
235 if (
236 Math.abs(newOpacity - initialOpacity) >
237 Math.abs(finalOpacity - initialOpacity)
238 ) {
239 element.style.opacity = finalOpacity.toString();
240 return;
241 }
242
243 element.style.opacity = newOpacity.toString();
244 }
245 </script>
246</Layout>