commit 9ffbd90a820a7a0954aebd561195ffed8a243bae Author: masiv_ Date: Tue Feb 3 19:37:38 2026 -0300 Transfer to git diff --git a/archive/ver_1-until2feb2026/ai.txt b/archive/ver_1-until2feb2026/ai.txt new file mode 100644 index 0000000..db38b09 --- /dev/null +++ b/archive/ver_1-until2feb2026/ai.txt @@ -0,0 +1,3 @@ + User-Agent: * +Disallow: / +Disallow: * diff --git a/archive/ver_1-until2feb2026/css/global/articles.css b/archive/ver_1-until2feb2026/css/global/articles.css new file mode 100644 index 0000000..e071bbf --- /dev/null +++ b/archive/ver_1-until2feb2026/css/global/articles.css @@ -0,0 +1,5 @@ +.article { + display: flex; + flex-direction: column; + align-items: center; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/global/components.css b/archive/ver_1-until2feb2026/css/global/components.css new file mode 100644 index 0000000..de96f08 --- /dev/null +++ b/archive/ver_1-until2feb2026/css/global/components.css @@ -0,0 +1,50 @@ +body { + margin: 5em; + max-width: 1000px; + min-height: 800px; + justify-content: center; + display: flex; + flex-direction: column; +} + +body, html { + box-sizing: border-box; +} + +* { + box-sizing: inherit; +} + + +/* TOP AND BOT BAR */ +.bar { + width: 100%; + display: flex; + align-items: center; + height: fit-content; +} +.bar > div{ + flex: 1; +} +.left > p { + text-align: left; +} + +.mid > p { + text-align: center; +} + +.right > p { + text-align: right; +} + +.panel > .title { + font-style: italic; +} + +.panel {margin-bottom: 1em;} +.bot {margin-top: 1em;} +.top {font-weight: bold;} +.last { + margin-bottom: 0em; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/global/styles.css b/archive/ver_1-until2feb2026/css/global/styles.css new file mode 100644 index 0000000..ce77091 --- /dev/null +++ b/archive/ver_1-until2feb2026/css/global/styles.css @@ -0,0 +1,49 @@ +html { + display: flex; + justify-content: center; +} + +body { + font-size: 15px; + font-family: monospace; + text-align: center; + background-color:rgb(255, 244, 163); + color: rgb(47, 45, 31); + transition: background-color 0.3s ease, color 0.3s ease; + scrollbar-width: thin; +} + +h1 {font-size: 24px;} +h2 {font-size: 20px;} +h3 {font-size: 18px;} +h4 {font-size: 14px;} + +p { + margin: 10px; +} + +a:link, a:visited { + color: rgb(47, 45, 31); + transition: color 0.3s ease; +} + +a:hover { + color: rgb(144, 138, 93); + transition: color 0.3s ease; +} + +.panel { + border: 5px ridge rgb(159, 143, 96); + background-color: rgb(255, 230, 153); + transition: background-color 0.3s ease, color 0.3s ease, border 0.3s ease; +} + +span.li{ + display: list-item; + text-align: left; + margin-left: 2em +} + +img { + image-rendering:pixelated; +} diff --git a/archive/ver_1-until2feb2026/css/specific/about-host.css b/archive/ver_1-until2feb2026/css/specific/about-host.css new file mode 100644 index 0000000..c5357ed --- /dev/null +++ b/archive/ver_1-until2feb2026/css/specific/about-host.css @@ -0,0 +1,3 @@ +.specs { + width: fit-content; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/specific/calc.css b/archive/ver_1-until2feb2026/css/specific/calc.css new file mode 100644 index 0000000..184c5af --- /dev/null +++ b/archive/ver_1-until2feb2026/css/specific/calc.css @@ -0,0 +1,122 @@ +body, html { + box-sizing: border-box; +} + +* { + font-size: inherit; + font-family: inherit; + box-sizing: inherit; +} + +body { + font-family: monospace; + display: flex; + align-items: center; + justify-content: center; +} + +.panel { + display: flex; + align-items: center; + height: fit-content; +} + +.panel > div { + text-align: center; +} + +.calculator { + flex-shrink: 0; + flex-grow: 1; + width: auto; + height: auto; + justify-content: center; +} + +.calculator > div { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin: 10px; +} + +.buttons { + width: 100%; + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: right; + align-items: stretch; + max-width: calc((70px * 4) + ( 5 * (4px * 2) ) ); +} + +button { + border: 0; + margin: 5px; + height: 70px; + width: 70px; + background-color:rgb(253, 247, 203); + transition: 0.05s background-color ease-in; +} + +button:active { + background-color:rgb(194, 186, 124); +} + +#equal { + flex-grow: 1; +} + +.viewing { + border-top: 0; + border-left: 0; + border-right: 0; + display: flex; + align-items: center; + background-color:rgb(253, 247, 203); + width: calc((70px * 4) + ( 2 * (15px) )); + height: 3em; + margin-bottom: 20px; +} + +.viewing > #output { + padding: 0.5em; + font-size: 40px; + text-align: right; + text-overflow: clip; + overflow-y: auto; + width: 100%; +} + +.calctitle { + color: rgb(43, 43, 43); + font-size: 40px; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.middle { + gap: 1em; + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + flex-grow: 1; +} + +.info { + flex-direction: column; + align-items: center; + justify-content: flex-start; + text-align: justify; + width: 100%; + flex-basis: 30%; + flex-shrink: 0; + flex-grow: 200; +} + +.title { + text-align: center; + margin:1rem; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/specific/chat.css b/archive/ver_1-until2feb2026/css/specific/chat.css new file mode 100644 index 0000000..89a4582 --- /dev/null +++ b/archive/ver_1-until2feb2026/css/specific/chat.css @@ -0,0 +1,69 @@ +/* Styling */ + +[type="text"] { + background-color:rgb(253, 247, 203); + width: 100%; +} + +.inputs, .history, [type="text"], [type="submit"] { + font-size: 8px; + font-family: monospace; +} + +.history { + background-color: rgb(253, 247, 203); +} + +/* Disposition */ + +.chat { + width: 20%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; +} + +.chat > * { + width: 90%; +} + +.inputs, .history { + display: flex; +} + +.inputs { + flex-direction: row; +} + + +.history { + max-height: 60%; + flex-shrink: 1; + white-space: wrap; +} + +.history > div { + flex-shrink: 2; + overflow-x: hidden; + overflow-y: auto; + display: flex; + flex-direction: column-reverse; + flex: 1; + margin: 1em; + scrollbar-width: thin; +} + +.comment { + display: flex; +} + +.user { + font-weight: bold; + margin-right: 0.5em; +} + +.message { + word-wrap: break-word; + text-align: justify; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/specific/main.css b/archive/ver_1-until2feb2026/css/specific/main.css new file mode 100644 index 0000000..6f23816 --- /dev/null +++ b/archive/ver_1-until2feb2026/css/specific/main.css @@ -0,0 +1,69 @@ +.other {margin-left: 1em;} +.first {margin-right: 1em;} + +.about { + align-content: center; +} + +.middle { + display: flex; + flex: 1; + align-items: stretch; + flex-direction: row; +} + +.first,.other { + flex-direction: column; + width: 20%; + min-height: 100%; + display: flex; + align-items: center; + justify-content: flex-start; +} + +.main { + flex-direction: column; + width: 60%; + align-content: flex-start; +} + +.links > div { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.blinkies > img { + width: 80%; + margin-top: 0.2em; +} + +.links > div > p { + display: flex; + flex-direction: column; +} + +.other > div { + height: 100%; + width: 100%; +} + +.chat { + max-height: 50%; +} + +.more > div { + margin: 1em; +} + +.webrings,.blinkies { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + align-items: center; +} + +.webrings > div { + margin-bottom: 1em; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/css/specific/noaiwebring.css b/archive/ver_1-until2feb2026/css/specific/noaiwebring.css new file mode 100644 index 0000000..74254de --- /dev/null +++ b/archive/ver_1-until2feb2026/css/specific/noaiwebring.css @@ -0,0 +1,31 @@ +/* See comment on html directly */ + +.noaiwebring { + width: 80%; + position: relative; +} + +.noaiwebring > img { + width: 100%; + height: 100%; +} + +.noaiwebring > a > div { + position: absolute; +} + +.noaiwebring > a > .nxt { +left: 76.1%; top: 6.5%; width: 20.5%; height: 48.4%; +} + +.noaiwebring > a > .prv { +left: 2.3%; top: 6.5%; width: 20.5%; height: 48.4%; +} + +.noaiwebring > a > .rnd { +left: 71.6%; top: 61.3%; width: 12.5%; height: 35.5%; +} + +.noaiwebring > a > .home { +left: 26.1%; top: 48.4%; width: 44.3%; height: 48.4%; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/en/about-host.html b/archive/ver_1-until2feb2026/en/about-host.html new file mode 100644 index 0000000..cf577ae --- /dev/null +++ b/archive/ver_1-until2feb2026/en/about-host.html @@ -0,0 +1,102 @@ + + + + + + About this hosting + + + + + + +
+ +
+

Main

+
+
+

+ ES + EN +

+
+
+
+

+ Hello,

+ + You clicking this article means you have an interest on how this + website is structured, and what infrastructure it runs in. + I've gotta say this will probably change over time, but there is one + aspect I will adhere to, mantaining custody over my own data, in practice + that means everything I host will be hosted on-site on my own infrastructure, + just below a little about the homelab's history and some details.
+

+

Specs

+
+

+ CPU: AMD Ryzen 5 4600G
+ RAM: 32GB DDR4 3200MHZ
+ Motherboard: ASRock A320M-HDV 4.0
+ PSU: EVGA 450W 80plus
+ Storage:
+ x1 1TB SSD NVME Samsung 970 Plus + x2 3TB HDD WD Green (RAID 1) + Case: No-name brand, + quite square-ish.
+

+
+

History

+

+ Each one of the components has a different origin, the case, psu and motherboard + have always been the same since the begining, part of the original PC I got as + a birthday present a while back, it was equiped with 8gb of ram, a modest HDD, + together with an AMD Ryzen 3 3200G, it was enough back then, but just as it came, + I got myself a brand new laptop, somewhat comparable (or even better) to the pc, + I ended up using it way more, thanks to it being portable. +

+

+ After some time, can't quite remember the reason, I took the decision to move it to its + current location, a secure place with a good broadband connection, this was all the way + back at the start of 2022, when I installed Ubuntu Server 22.04 LTS. +

+

+ I graudually updated it, I got the current proccesor over on amazon, then the ram + (attempted to purchase it from Aliexpress, but once it arrived I discovered it + wasn't compatible, had to re-sell it, and buy my current 2x16gb kit), and last but + not least, two 3tb disks which I thought was plenty for my usecase (foreshadowing). +

+

+ I currently still have the same Ubuntu Server install on bare hardware, and almost + every single service I host is using a docker container, managed using Portainer. +

+

Networking

+

Domain name

+

+ I've used several domain names over time, starting with No-IP to ssh remotely, rapidely migrating + to DuckDNS, that setup endured quite a while but after having some problems with DNS resolution, and + limitations on their DNS capabilities (they used AWS) thanks to my sub-domain repertoire I + decided to finally make the leap and purchase my own domain on some of the internet's registrars, + ended up with this domain on Porkbun, for a measly 5 dollars and a half, a lot /s. +

+

Proxy & DDNS

+

+ I use NginxProxyManager to manage all my domains and redirects, I don't plan on migrating to + Traefik for now because NPM does the job, and increasing my infrastructure's complexity isn't my + number one priority, maybe in the future. For Dynamic DNS I use DDClient, my ISP (Antel) doesn't + provide static IPs to residential addresses, so I'm stuck having to update my registers once or + twice a day in-leiu of having a fixed one. +

+ + +
+
+

Entirely handmade, css & html only :D

+ Rainbow cable. +

Version 1.0.1, 17.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/en/about-this-site.html b/archive/ver_1-until2feb2026/en/about-this-site.html new file mode 100644 index 0000000..ef0dea0 --- /dev/null +++ b/archive/ver_1-until2feb2026/en/about-this-site.html @@ -0,0 +1,38 @@ + + + + + + About this site + + + + + + +
+ +
+

Main

+
+
+

+ ES + EN +

+
+
+
+

+ Still in construction, come back later :p +

+
+
+

Entirely handmade, css & html only :D

+ Rainbow cable. +

Version 1.0.1, 17.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/en/calc.html b/archive/ver_1-until2feb2026/en/calc.html new file mode 100644 index 0000000..71ba46c --- /dev/null +++ b/archive/ver_1-until2feb2026/en/calc.html @@ -0,0 +1,123 @@ + + + + + + Calculadora + + + + + + + + +
+ +
+

Main

+
+
+

+ ES + EN +

+
+
+
+
+
+
+ Calculadora +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+

About this project

+

+ It has certainly been a while since I've touched Javascript, + and I wanted to regain some of the know-how I had about it, + that's why decided to code this calculator from scratch + without using any external libraries, nor chatbots, only + wikis like w3 school about the language itself even if + that required more time. +

+

+ So it began my learning journey, coding this entire calculator + has been quite a joy I must say, and even if the final product + is lacking some funcionality like parenthesis parsing it still + works completely fine for most things, as it process inputs using + PEMDAS. +

+

+ Were I to make it all over again, I would probably go about + things differently, researching about more efficient algorithms + and methods and not reinventing the wheel, but the thing is, + that's the entire point of this excersice, wasn't for that + self-impossed limitation, I could make use of tons of more + efficient libraries. +

+

+ Now about the inner workings of the script, I implemented a + simple array that stores every character typed, and once the + equal key is pressed, it sends the array to be processed in + the following steps: + Concatenate the digits, from [1,1,'+',2,3] to [11,'+',23]. + Search for term separators, and create multidimensional arrays with + each level representing one type of operation. + + Undo all this array but backwards, processing the output as it goes. + + It looks easy on paper, but I spent an entire day and a half coding and dealing with + each aspect of programming, things I didn't quite remember, others I didn't know from + the get-go, etc. (I must add a personal rant about how difficult is dealing with + multidimensional arrays, it's not a trivial task for sure). +

+

+ Update 23/01/2026
+ I showed my calculator to a friend of mine and they + pointed out I was lacking a 0 button, how could I miss + that, seriously XD. +

+
+
+
+

Entirely handmade, css & html only (and some js here) :D

+ Rainbow cable. +

Version 1.0.4, 23.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/en_home.html b/archive/ver_1-until2feb2026/en_home.html new file mode 100644 index 0000000..b5f7b28 --- /dev/null +++ b/archive/ver_1-until2feb2026/en_home.html @@ -0,0 +1,164 @@ + + + + + + Masivana + + + + + + + + + +
+ +
+

Main

+
+
+

+ ES + EN +

+
+
+
+
+
+

Blinkies :p

+ Firefox user. + Firefox, the trusted browser. + Delete tiktok. + Ban time travel now. + Nyan cat. + Non-binary flag. + Queso Cubano. + Cat love. + sudo rm -rf / + Don't feed the AI. + Steins Gate Timeline Divergence clock. + HTML Junkie. + I hate popups. + Powered by Dr. Pepper + (Sources on hover) +
+
+

Webrings

+ +
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+

Welcome to my personal website, below you can find information about the services I host + other info :D

+
+
+

Registration

+

You need to create an account to use some of the services listed below, for information please contact the admin.

+
+ +
+

Updates

+

17/01/2026

+
+

+ New website! + I hope you find these new changes favorable, it's been a while since I wanted to make my own website from scratch, I spent some hours re-learning html css. I honestly prefer a bloat-less internet, therefore there won't be any javascript (unless specified) +

+
+
+
+ +
+

Chat

+
+ + +
+
+
+
+
masiv_:
+
Vitae incidunt doloremque nostrum doloribus saepe minus quasi. Commodi iste sit nemo vel ut in. Qui enim ut eius nihil et quibusdam consequuntur.
+
+
+
masiv_:
+
Reiciendis tenetur suscipit nostrum qui atque quos ea. Minima quibusdam et excepturi voluptatem qui ea voluptatibus sed. Ea sed sint aut unde. Qui molestiae illo voluptatum. Nihil excepturi quidem officia. Et vero saepe molestias.
+
+
+
masiv_:
+
Unde quas dolorem explicabo quis iste. Iusto tempore eligendi qui consequatur a. Odio quas quo modi eos odio nemo ut. Tempore possimus ut nesciunt aut. Culpa voluptatibus quisquam est maiores non accusamus facere. Et mollitia asperiores autem.
+
+
+
masiv_:
+
Prueba N4
+
+
+
+
+
+
+
+

Entirely handmade, css & html only :D

+ Rainbow cable. +

Version 1.0.3, 21.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/es/about-host.html b/archive/ver_1-until2feb2026/es/about-host.html new file mode 100644 index 0000000..77df85d --- /dev/null +++ b/archive/ver_1-until2feb2026/es/about-host.html @@ -0,0 +1,103 @@ + + + + + Sobre el host + + + + + + +
+ +
+

Principal

+
+
+

+ ES + EN +

+
+
+
+

+ Buenas,

+ + Si estás leyendo esto es que te interesa saber un poco sobre la estructura + en la que están hosteados mis servicios, y esta página. + He de decir que esto irá cambiando, pero si hay algo que no creo cambie + será el hecho de que quiero mantener la custodia de mis datos, por lo que + todos lo que hostee será hosteado en mi propio homelab, debajo detalles e historia.
+

+

Especificaciones

+
+

+ Procesador: AMD Ryzen 5 4600G
+ RAM: 32GB DDR4 3200MHZ
+ Placa: ASRock A320M-HDV 4.0
+ PSU: EVGA 450W 80plus
+ Almacenamiento:
+ x1 1TB SSD NVME Samsung 970 Plus + x2 3TB HDD WD Green (RAID 1) + Gabinete: Marca genérica,
+ es bastante cuadrado. +

+
+

Historia

+

+ Cada componente tiene una historia un poquito diferente, el gabinete, + fuente y placa madre han sido la misma, y fueron un regalo de cumpleaños + de hace tiempo, en su momento con 8gb de ram, un disco HDD modesto, y + un AMD Ryzen 3 3200G, en su momento era algo, mas justo coincidió que + en esa ocasión, había recibido una laptop, a la cual le terminé dando + muchísimo más uso que a la torre, sumado al hecho de poderla transportarla + que personalmente me fue un gran plus. +

+

+ Tiempo después, ya no recuerdo bien en qué contexto, decido llevarla al + lugar dónde ahora se encuentra, dónde estaba segura y con una buena conexión + de fibra óptica, esto fue por 2022, cuándo le instalé Ubuntu Server 22.04 LTS. +

+

+ Gradualmente la fui mejorando, le compré su procesador actual por internet, luego + la memoria ram (intenté comprarla por Aliexpress, pero resultaba era incompatible, + por lo que tuve que revenderla, y comprarme los dos sticks de 16gb que tengo ahora), + y por último la decisión de comprar dos discos de 3tb para tener almacenamiento de + sobra (que resulta no lo fue) para lo que quisiese. +

+

+ Actualmente sigo teniendo instalado el Ubuntu directo sobre el hardware, y casi todo + lo que tengo instalado allí lo manejo usando Docker a través de Portainer. +

+

Red

+

Dominio

+

+ He usado varios dominios, al principio llegué a usar No-IP para conectarme remotamente, + para luego rápidamente migrar a DuckDNS, que me supo proveer de dominios gratuitos por varios años, + sin embargo, luego de toparme con las limitaciones de su servicio (por la cantidad de sub-dominios, + y debido a su dependendencia en servidores de no tan buena calidad de AWS) decidí invertir y + comprarme el dominio que estoy usando actualmente, con el registrante de Porkbun, que + debo decir fue muy económico, actualmente pago unos 5 dólares y medios al año, básicamente nada. +

+

Proxy y DDNS

+

+ Para manejar los dominios y redirecciones he usado y seguiré usando NginxProxyManager, por ahora + no tengo planeado migrar a Traefik puesto que no está dentro de mis prioridades añadir + esa complejidad a mi setup (aunque quizás en un futuro lo haga). Uso DDClient para el DNS dinámico + puesto que mi ISP (Antel) no provee IP fijas a planes residenciales, y necesito actualizar los + registros con mi IP cada vez que esta cambia. +

+ + +
+
+

Hecho a mano, sólo html y css :D

+ Rainbow cable. +

Versión 1.0.1, 17.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/es/about-this-site.html b/archive/ver_1-until2feb2026/es/about-this-site.html new file mode 100644 index 0000000..b108a95 --- /dev/null +++ b/archive/ver_1-until2feb2026/es/about-this-site.html @@ -0,0 +1,37 @@ + + + + + Sobre el sitio + + + + + + +
+ +
+

Principal

+
+
+

+ ES + EN +

+
+
+
+

+ No seas impaciente, vuelve más tarde :p +

+
+
+

Hecho a mano, sólo html y css :D

+ Rainbow cable. +

Versión 1.0.1, 17.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/es/calc.html b/archive/ver_1-until2feb2026/es/calc.html new file mode 100644 index 0000000..ed5eb09 --- /dev/null +++ b/archive/ver_1-until2feb2026/es/calc.html @@ -0,0 +1,120 @@ + + + + + + Calculadora + + + + + + + + +
+ +
+

Principal

+
+
+

+ ES + EN +

+
+
+
+
+
+
+ Calculadora +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+

Un poco de información

+

+ Hace tiempo que no programaba en Javascript, y quería + nuevamente agarrarle la mano, por lo que decidí hacer esta + calculadora sin hacer uso de absolutamente nada más que + w3 school y algunas búsquedas sobre javascript, nada de + preguntar mis dudas a ninguna IA (aunque sea más lento). +

+

+ Así que me puse manos a la obra re-aprendiendo algunas cosas, + he de decir que fue un ejercicio divertido, y aunque el + resultado carece de algunas características (cómo el uso + de paréntesis), sigue el orden de las operaciones, y eso + es bastante. +

+

+ En un futuro si la hiciese nuevamente, podría implementar + algoritmos más eficientes, puesto que realmente lo hice de + la manera que se me fue ocurriendo, y realmente debe ser muy + ineficiente, si quisiese eficiencia tendría mil maneras y + librerías, pero el objetivo de este ejercicio es aprender. +

+

+ Yendo un poco más a lo técnico, mi idea principal fue almacenar + cada caracter escrito en un array, y luego procesarlo de la + siguiente manera: + Unir los números, de [1,1,'+',2,3] a [11,'+',23]. + Buscar dónde están los separa términos, e ir creando arrays + multidimensionales, cada nivel tiene un tipo de operación (on orden). + + Deshacer ese array multidimensional, e ir procesando + todas las operaciones. + + Dicho así parece sencillo, pero esutve un día y medio programando y lidiando + con cosas que, o no sabía, o no recordaba. (He de decir que trabajar con tanta iteración + en los arrays multidimensionales es un trabajo no trivial). +

+

+ Actualización 23/01/2026
+ Le mostré la calcualdora a unx amigx, y me hizo darme + cuenta de que no había implementado el botón del 0, + la verdad no tengo ni idea cómo no me di cuenta XD. +

+
+
+
+

Hecho a mano, sólo html y css (y un poco de js aquí) :D

+ Rainbow cable. +

Versión 1.0.4, 23.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/es_home.html b/archive/ver_1-until2feb2026/es_home.html new file mode 100644 index 0000000..55ecf03 --- /dev/null +++ b/archive/ver_1-until2feb2026/es_home.html @@ -0,0 +1,166 @@ + + + + + + Masivana + + + + + + + + + +
+ +
+

Principal

+
+
+

+ ES + EN +

+
+
+
+
+
+

Blinkies :p

+ Firefox user. + Firefox, the trusted browser. + Delete tiktok. + Ban time travel now. + Nyan cat. + Non-binary flag. + Queso Cubano. + Cat love. + sudo rm -rf / + Don't feed the AI. + Steins Gate Timeline Divergence clock. + HTML Junkie. + I hate popups. + Powered by Dr. Pepper + (Fuentes haciendo
hover) +
+
+

Webrings

+ +
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+

Bienvenidxs a mi página web, aquí podrán encontrar los servicios que proveeo, y otra información :D

+
+
+

Registro

+

Para acceder a algunos de los servicios de abajo, es necesaria una cuenta, por información contactar a la administradora.

+
+ +
+

Actualizaciones

+

17/01/2026

+
+

+ Nuevo sitio web! + Espero les guste, desde ya hacía tiempo que quería tener mi propio sitio web, pero programado desde cero, estuve unas horitas re-aprendiendo html y css, sinceramente prefiero un internet sin bloat, por lo que a-priori no habrá javascript en este sitio. +

+
+
+
+
+
+

Más

+ Sobre el host

+ Calculadora DIY +
+
+
+

Chat

+
+
+
+
masiv_:
+
Vitae incidunt doloremque nostrum doloribus saepe minus quasi. Commodi iste sit nemo vel ut in. Qui enim ut eius nihil et quibusdam consequuntur.
+
+
+
masiv_:
+
Reiciendis tenetur suscipit nostrum qui atque quos ea. Minima quibusdam et excepturi voluptatem qui ea voluptatibus sed. Ea sed sint aut unde. Qui molestiae illo voluptatum. Nihil excepturi quidem officia. Et vero saepe molestias.
+
+
+
masiv_:
+
Unde quas dolorem explicabo quis iste. Iusto tempore eligendi qui consequatur a. Odio quas quo modi eos odio nemo ut. Tempore possimus ut nesciunt aut. Culpa voluptatibus quisquam est maiores non accusamus facere. Et mollitia asperiores autem.
+
+
+
masiv_:
+
Prueba N4
+
+
+
+
+ + +
+
+
+
+ +
+

Hecho a mano, sólo html y css :D

+ Rainbow cable. +

Versión 1.0.3, 21.01.2026

+
+ + \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/0206-nyancat.gif b/archive/ver_1-until2feb2026/imgs/blinkies/0206-nyancat.gif new file mode 100644 index 0000000..79c53b8 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/0206-nyancat.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/bantimetravel_stamp.jpeg b/archive/ver_1-until2feb2026/imgs/blinkies/bantimetravel_stamp.jpeg new file mode 100644 index 0000000..c24f106 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/bantimetravel_stamp.jpeg differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-cats.gif b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-cats.gif new file mode 100644 index 0000000..9f956a0 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-cats.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-nonbinary.gif b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-nonbinary.gif new file mode 100644 index 0000000..e4a9ab0 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-nonbinary.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-sudormrf.gif b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-sudormrf.gif new file mode 100644 index 0000000..16e3d18 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/blinkiesCafe-sudormrf.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/deletetiktok_pink_blinkie.webp b/archive/ver_1-until2feb2026/imgs/blinkies/deletetiktok_pink_blinkie.webp new file mode 100644 index 0000000..b32cc18 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/deletetiktok_pink_blinkie.webp differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/dontfeedtheai.gif b/archive/ver_1-until2feb2026/imgs/blinkies/dontfeedtheai.gif new file mode 100644 index 0000000..d155c31 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/dontfeedtheai.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/firefox_user.gif b/archive/ver_1-until2feb2026/imgs/blinkies/firefox_user.gif new file mode 100644 index 0000000..627c287 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/firefox_user.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/firefoxget.gif b/archive/ver_1-until2feb2026/imgs/blinkies/firefoxget.gif new file mode 100644 index 0000000..3cd754f Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/firefoxget.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/htmljunkie.gif b/archive/ver_1-until2feb2026/imgs/blinkies/htmljunkie.gif new file mode 100644 index 0000000..2ce03a1 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/htmljunkie.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/ihatepopups.gif b/archive/ver_1-until2feb2026/imgs/blinkies/ihatepopups.gif new file mode 100644 index 0000000..3a84abe Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/ihatepopups.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/poweredbydoctorpepper.gif b/archive/ver_1-until2feb2026/imgs/blinkies/poweredbydoctorpepper.gif new file mode 100644 index 0000000..dff6eaa Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/poweredbydoctorpepper.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/queso_cubano_masiv_.gif b/archive/ver_1-until2feb2026/imgs/blinkies/queso_cubano_masiv_.gif new file mode 100644 index 0000000..a4137b5 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/queso_cubano_masiv_.gif differ diff --git a/archive/ver_1-until2feb2026/imgs/blinkies/steins.png b/archive/ver_1-until2feb2026/imgs/blinkies/steins.png new file mode 100644 index 0000000..15fab9f Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/blinkies/steins.png differ diff --git a/archive/ver_1-until2feb2026/imgs/global/rainbowcable.png b/archive/ver_1-until2feb2026/imgs/global/rainbowcable.png new file mode 100644 index 0000000..275595e Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/global/rainbowcable.png differ diff --git a/archive/ver_1-until2feb2026/imgs/webrings/miniwidget5.gif b/archive/ver_1-until2feb2026/imgs/webrings/miniwidget5.gif new file mode 100644 index 0000000..bc913e0 Binary files /dev/null and b/archive/ver_1-until2feb2026/imgs/webrings/miniwidget5.gif differ diff --git a/archive/ver_1-until2feb2026/js/calc1.js b/archive/ver_1-until2feb2026/js/calc1.js new file mode 100644 index 0000000..8a80292 --- /dev/null +++ b/archive/ver_1-until2feb2026/js/calc1.js @@ -0,0 +1,15 @@ +function calc() { + let resultado = 0; + const numeros = []; + const quantity = parseInt(prompt("Ingrese la cantidad de números a sumar.")); + + for (let i = 0; i < quantity; i++) { + numeros[i] = parseInt(prompt("Ingrese el "+(i+1)+"° número.")); + while (isNaN(numeros[i]) == true) { + numeros[i] = parseInt(prompt("Repita el "+(i+1)+"° número.")); + } + resultado += numeros[i]; + } + + alert("El resultado de la suma es "+resultado); +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/js/calc2.js b/archive/ver_1-until2feb2026/js/calc2.js new file mode 100644 index 0000000..11cb61c --- /dev/null +++ b/archive/ver_1-until2feb2026/js/calc2.js @@ -0,0 +1,273 @@ +let queue = []; +let final_queue = []; +let resultado = 0; +let cantidad_nums = 0; +let operation_order = ['+','-','/','*','^']; +let tally = 0; + +function q_print(){ + for (k=0; k < queue.length; k++){ + setTimeout(console.log("Índice N°"+k+" es "+queue[k]),500); + } + return; +} + +function a_print(array){ + for (k=0; k < array.length; k++){ + console.log("Índice N°"+k+" es "+array[k]); + } + return; +} + +function q_display(q_array) { + output.innerHTML = ''; + for (i=0; i < q_array.length; i++) { + output.innerHTML += q_array[i]; + } + return; +} + +function q_manage(type, item){ + if (type == 'add') { + queue.push(item); + q_display(queue); + } else if (type == 'remove') { + queue.splice(-1,1); + q_display(queue); + } else { + output.innerHTML = 'Entrada inválida'; + } + return; +} + +function a_concatnum(z_array) { + let a_length = z_array.length; + var a_concat = []; + var cont = 0; + var num = ""; + let j = 0; + + z_array.push(true); // push something other than number or string to trigger last exectuion + + for (i=0; i < a_length; i++){ + if (typeof(z_array[i]) == 'number'){ + cont++; + } else { + for (j=0; j < cont; j++){ + num = num + String(z_array[(j)]); + } + if (num != '') { + a_concat.push(parseInt(num)) + } + num = ""; + if (typeof(z_array[i] == 'string')) { + a_concat.push(z_array[i]); + } + z_array.splice(0,cont+1); + cont = 0; + i=-1; + a_length = z_array.length; + } + } + z_array = a_concat; + z_array.splice(-1,1); // remove that something i put in earlier + return z_array; +} + +function a_split(l_array) { + function a_search_char(s_array,char, direction_from,excluded_points){ + if (direction_from == 'right') { + s_array.reverse(); + } else if (direction_from == 'left'){ + } else { + output.innerHTML = 'Error en la dirección de búsqueda'; + } + + outerLoop: for (i=0; i < s_array.length; i++){ + // Chequea si el punto encontrado está en la exclusión (para evitar repetidos) + innerLoop: for (j=0; j <= excluded_points.length; j++){ + if (i == excluded_points[j]){ + continue outerLoop; + } + } + if (s_array[i] == char) { + if (direction_from == 'right'){ + return (s_array.length-i-1); + } + return i; + } + } + return -1; // No se ha encontrado + } + + function array_divider(a_array, d_points){ + let start = 0; + let divided_array = []; + for (i=0; i <= d_points.length; i++){ + + divided_array.push(a_array.slice(start,d_points[i])); + start =+ d_points[i] +1; + } + return divided_array; + } + + /* Búsqueda de paréntesis + No lo voy a implementar esto, es un montón, intenté pensar + en un algoritmo pero no se me occurió, y busqué pero no quiero + usar un algoritmo tipo Shuning Yard, la idea de este código es + hacerlo sin ayudas, incluso si es ineficiente (este código tiene + O^n execution time, más recursión tiene esta cosa. */ + + // Buscar puntos dónde se encuentran caracteres en un array + function find_location_points(f_array,char) { + let location_points = []; + for (i=0; i < f_array.length; i++){ + let search_result = a_search_char(f_array,char,'left',location_points); + // Break si ya no encuentra más + if ( search_result == -1 ){ + break; + } else { + location_points.push(search_result); + } + } + return location_points; + } + + function branch(b_array,char) { + b_array = array_divider( + b_array, + find_location_points(b_array,char)); + return b_array; + } + + function branching(b2_array){ + // First + b2_array = branch(b2_array,'+'); + + // Second + for (l=0; l < b2_array.length; l++) { + b2_array[l] = branch(b2_array[l],operation_order[1]); + } + + // Third + for (k=0; k < b2_array.length; k++) { + for (m=0; m < b2_array[k].length; m++){ + b2_array[k][m] = branch(b2_array[k][m],operation_order[2]); + } + } + + // Fourth + for (k=0; k < b2_array.length; k++) { + for (m=0; m < b2_array[k].length; m++){ + for (n=0; n < b2_array[k][m].length; n++){ + b2_array[k][m][n] = branch(b2_array[k][m][n],operation_order[3]); + } + } + } + + // Fifth + for (k=0; k < b2_array.length; k++) { + for (m=0; m < b2_array[k].length; m++){ + for (n=0; n < b2_array[k][m].length; n++){ + for (o=0; o < b2_array[k][m][n].length; o++){ + b2_array[k][m][n][o] = branch(b2_array[k][m][n][o],operation_order[4]); + } + } + } + } + return b2_array; + + } + l_array = branching(l_array); + return l_array; +} + +function a_calculate(array) { + // Exponenciation + for (k=0; k < array.length; k++) { + for (m=0; m < array[k].length; m++){ + for (n=0; n < array[k][m].length; n++){ + outerFor: for (o=0; o < array[k][m][n].length; o++){ + innerFor: for (z = 0; z < array[k][m][n][o].length; z++){ + // There is an extra [0] at the end of each exponenciation compensating extra nesting (?) + if (array[k][m][n][o].length == 1){ + array[k][m][n][o] = array[k][m][n][o][0][0]; + continue outerFor; + } + array[k][m][n][o][0] = array[k][m][n][o][0][0] ** array[k][m][n][o][1][0]; + array[k][m][n][o].splice(1,1); + } + array[k][m][n][o] = array[k][m][n][o][0]; + } + } + } + } + + // Multiplication + for (k=0; k < array.length; k++) { + for (m=0; m < array[k].length; m++){ + outerFor: for (n=0; n < array[k][m].length; n++){ + innerFor: for (z = 0; z < array[k][m][n].length; z++){ + if (array[k][m][n].length == 1){ + array[k][m][n]= array[k][m][n][0]; + continue outerFor; + } + array[k][m][n][0] = array[k][m][n][0] * array[k][m][n][1]; + array[k][m][n].splice(1,1); + } + array[k][m][n] = array[k][m][n][0]; + } + } + } + + // Division + for (k=0; k < array.length; k++) { + outerFor: for (m=0; m < array[k].length; m++){ + innerFor: for (z = 0; z < array[k][m].length; z++){ + if (array[k][m].length == 1){ + array[k][m]= array[k][m][0]; + continue outerFor; + } + array[k][m][0] = array[k][m][0] / array[k][m][1]; + array[k][m].splice(1,1); + } + array[k][m] = array[k][m][0]; + } + } + + // Subtraction + outerFor: for (k=0; k < array.length; k++) { + innerFor: for (z = 0; z < array[k].length; z++){ + if (array[k].length == 1){ + array[k]= array[k][0]; + continue outerFor; + } + array[k][0] = array[k][0] - array[k][1]; + array[k].splice(1,1); + } + array[k] = array[k][0]; + } + + // Addition + outerFor: for (k=0; k < array.length; k++) { + innerFor: for (z = 0; z < array.length; z++){ + if (array.length == 1){ + continue outerFor; + } + array[0] = array[0] + array[1]; + array.splice(1,1); + } + } + + return array; +} + + +function q_execute() { + //q_concatnum(); + queue = a_concatnum(queue); + queue = a_split(queue); + queue = a_calculate(queue); + q_display(queue); + return; +} \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/robots.txt b/archive/ver_1-until2feb2026/robots.txt new file mode 100644 index 0000000..d349eea --- /dev/null +++ b/archive/ver_1-until2feb2026/robots.txt @@ -0,0 +1,315 @@ + User-agent: 2^32$ +User-agent: AddSearchBot +User-agent: AdsBot-Google +User-agent: Agentic +User-agent: AhrefsBot +User-agent: .ai +User-agent: AI21 Labs +User-agent: AI2Bot +User-agent: Ai2Bot-Dolma +User-agent: AI2Bot-Dolma +User-agent: AI Article Writer +User-agent: AIBot +User-agent: AI Content Detector +User-agent: AI Dungeon +User-agent: aiHitBot +User-agent: AIMatrix +User-agent: AISearchBot +User-agent: AI Search Engine +User-agent: AI SEO Crawler +User-agent: AI Training +User-agent: AITraining +User-agent: AI Writer +User-agent: Alexa +User-agent: Alpha AI +User-agent: AlphaAI +User-agent: a[mazing]{42}(robot) +User-agent: Amazon Bedrock +User-agent: Amazonbot +User-agent: AmazonBot +User-agent: Amazon Comprehend +User-agent: Amazon-Kendra +User-agent: Amazon Lex +User-agent: Amazon Sagemaker +User-agent: Amazon Silk +User-agent: Amazon Textract +User-agent: Amelia +User-agent: AndersPinkBot +User-agent: Andibot +User-agent: Anthropic +User-agent: anthropic-ai +User-agent: AnyPicker +User-agent: Anyword +User-agent: Applebot +User-agent: Applebot-Extended +User-agent: Aria Browse +User-agent: Articoolo +User-agent: Automated Writer +User-agent: Awario +User-agent: AwarioBot +User-agent: AwarioRssBot +User-agent: AwarioSmartBot +User-agent: Azure +User-agent: BardBot +User-agent: bedrockbot +User-agent: bigsur.ai +User-agent: BLEXBot +User-agent: Brave Leo +User-agent: Brightbot 1.0 +User-agent: ByteDance +User-agent: Bytespider +User-agent: CatBoost +User-agent: CCBot +User-agent: CC-Crawler +User-agent: ChatGLM +User-agent: ChatGPT Agent +User-agent: ChatGPT-User +User-agent: ChatGPT-User/2.0 +User-agent: Chinchilla +User-agent: Claude +User-agent: ClaudeBot +User-agent: Claude-SearchBot +User-agent: Claude-User +User-agent: claude-web +User-agent: Claude-Web +User-agent: ClearScope +User-agent: CloudVertexBot +User-agent: Cohere +User-agent: cohere-ai +User-agent: cohere-training-data-crawler +User-agent: Common Crawl +User-agent: CommonCrawl +User-agent: ContentAtScale +User-agent: ContentBot +User-agent: Contentedge +User-agent: Content Harmony +User-agent: Content King +User-agent: Content Optimizer +User-agent: Content Samurai +User-agent: Conversion AI +User-agent: Copilot +User-agent: CopyAI +User-agent: Copymatic +User-agent: Copyscape +User-agent: Cotoyogi +User-agent: crawler.with.dots +User-agent: CrawlQ AI +User-agent: Crawlspace +User-agent: Crew AI +User-agent: CrewAI +User-agent: curl|sudo bash +User-agent: DALL-E +User-agent: DataForSeoBot +User-agent: DataProvider +User-agent: Datenbank Crawler +User-agent: DeepAI +User-agent: DeepL +User-agent: DeepMind +User-agent: DeepSeek +User-agent: Devin +User-agent: diffbot +User-agent: Diffbot +User-agent: Doubao AI +User-agent: DuckAssistBot +User-agent: Echobot Bot +User-agent: EchoboxBot +User-agent: Facebookbot +User-agent: FacebookBot +User-agent: facebookexternalhit +User-agent: FacebookExternalHit +User-agent: Factset_spyderbot +User-agent: Falcon +User-agent: Firecrawl +User-agent: FirecrawlAgent +User-agent: Flyriver +User-agent: Frase AI +User-agent: FriendlyCrawler +User-agent: Fuzz Faster U Fool +User-agent: Fuzz Faster U Fool v2.0.0 +User-agent: Gemini +User-agent: Gemini-Deep-Research +User-agent: Gemma +User-agent: GenAI +User-agent: Genspark +User-agent: Gigabot +User-agent: GLM +User-agent: GoogleAgent-Mariner +User-agent: Google-CloudVertexBot +User-agent: Google-Extended +User-agent: Google-Firebase +User-agent: GoogleOther +User-agent: GoogleOther-Image +User-agent: GoogleOther-Video +User-agent: Goose +User-agent: GPT +User-agent: GPTBot +User-agent: Grammarly +User-agent: Grendizer +User-agent: Grok +User-agent: GT Bot +User-agent: GTBot +User-agent: Hemingway Editor +User-agent: Hugging Face +User-agent: Hypotenuse AI +User-agent: iaskspider +User-agent: iaskspider/2.0 +User-agent: ICC-Crawler +User-agent: ImageGen +User-agent: ImagesiftBot +User-agent: img2dataset +User-agent: imgproxy +User-agent: Inferkit +User-agent: INK Editor +User-agent: INKforall +User-agent: IntelliSeek +User-agent: ISSCyberRiskCrawler +User-agent: Is this a crawler? +User-agent: JasperAI +User-agent: Kafkai +User-agent: Kangaroo +User-agent: Kangaroo Bot +User-agent: Keyword Density AI +User-agent: Knowledge +User-agent: KomoBot +User-agent: LinerBot +User-agent: LinkedInBot +User-agent: LLaMA +User-agent: LLMs +User-agent: magpie-crawler +User-agent: MarketMuse +User-agent: Meltwater +User-agent: Meta AI +User-agent: Meta-AI +User-agent: MetaAI +User-agent: Meta-External +User-agent: meta-externalagent +User-agent: Meta-ExternalAgent +User-agent: meta-externalfetcher +User-agent: Meta-ExternalFetcher +User-agent: MetaTagBot +User-agent: meta-webindexer +User-agent: Mistral +User-agent: MistralAI-User +User-agent: MistralAI-User/1.0 +User-agent: MJ12bot +User-agent: MyCentralAIScraperBot +User-agent: Narrative +User-agent: NeevaBot +User-agent: netEstate Imprint Crawler +User-agent: NeuralSEO +User-agent: Neural Text +User-agent: Nova Act +User-agent: NovaAct +User-agent: Nutch +User-agent: OAI-SearchBot +User-agent: omgili +User-agent: Omgili +User-agent: omgilibot +User-agent: Omgilibot +User-agent: OmniExplorer_Bot +User-agent: Open AI +User-agent: OpenAI +User-agent: OpenBot +User-agent: OpenText AI +User-agent: Operator +User-agent: Outwrite +User-agent: Page Analyzer AI +User-agent: PanguBot +User-agent: Panscient +User-agent: panscient.com +User-agent: Paperlibot +User-agent: Paraphraser.io +User-agent: peer39_crawler +User-agent: Perplexity +User-agent: PerplexityBot +User-agent: Perplexity-User +User-agent: Petalbot +User-agent: PetalBot +User-agent: Phindbot +User-agent: PhindBot +User-agent: PiplBot +User-agent: Poseidon Research Crawler +User-agent: prefetch-proxy +User-agent: ProWritingAid +User-agent: psbot +User-agent: python-requests +User-agent: QualifiedBot +User-agent: QuillBot +User-agent: quillbot.com +User-agent: RobotSpider +User-agent: Robozilla +User-agent: Rytr +User-agent: SaplingAI +User-agent: SBIntuitionsBot +User-agent: Scalenut +User-agent: Scraper +User-agent: Scrapy +User-agent: ScriptBook +User-agent: Seekr +User-agent: SemrushBot-OCOB +User-agent: SemrushBot-SWA +User-agent: sentibot +User-agent: Sentibot +User-agent: SentiBot +User-agent: SEO Content Machine +User-agent: SEO Robot +User-agent: ShapBot +User-agent: Sidetrade +User-agent: Sidetrade indexer bot +User-agent: Simplified AI +User-agent: Sitefinity +User-agent: Skydancer +User-agent: SlickWrite +User-agent: Sonic +User-agent: Spinbot +User-agent: Spin Rewriter +User-agent: Stability +User-agent: StableDiffusionBot +User-agent: star***crawler +User-agent: Sudowrite +User-agent: SummalyBot +User-agent: Super Agent +User-agent: Surfer AI +User-agent: Teoma +User-agent: TerraCotta +User-agent: Text Blaze +User-agent: TextCortex +User-agent: The Knowledge AI +User-agent: Thinkbot +User-agent: ThinkChaos +User-agent: TikTokSpider +User-agent: Timpibot +User-agent: TimpiBot +User-agent: TurnitinBot +User-agent: VelenPublicWebCrawler +User-agent: Vidnami AI +User-agent: WARDBot +User-agent: Webzio +User-agent: webzio-extended +User-agent: Webzio-Extended +User-agent: Whisper +User-agent: WordAI +User-agent: Wordtune +User-agent: WormsGTP +User-agent: wpbot +User-agent: WPBot +User-agent: Writecream +User-agent: WriterZen +User-agent: Writescope +User-agent: Writesonic +User-agent: xAI +User-agent: xBot +User-agent: YaK +User-agent: YandexAdditional +User-agent: YandexAdditionalBot +User-agent: Youbot +User-agent: YouBot +User-agent: Zerochat +User-agent: Zero GTP +User-agent: Zhipu +User-agent: Zimm +Disallow: / +Disallow: * +DisallowAITraining: / + +Content-Usage: ai=n \ No newline at end of file diff --git a/archive/ver_1-until2feb2026/testing/chat.html b/archive/ver_1-until2feb2026/testing/chat.html new file mode 100644 index 0000000..f9f28ea --- /dev/null +++ b/archive/ver_1-until2feb2026/testing/chat.html @@ -0,0 +1,50 @@ + + + + + + Masivana + + + + + + + + +
+ +
+

Main

+
+
+

+ ES + EN +

+
+
+
+

Chat

+
+ + +
+
+
+AAAAAAAAAAAAA











AAAAAA
A
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B +
+
+
+
+

Entirely handmade, css & html only :D

+

Version X, 18.01.2026

+
+ + \ No newline at end of file diff --git a/chat.php b/chat.php new file mode 100644 index 0000000..060711b --- /dev/null +++ b/chat.php @@ -0,0 +1 @@ + + articles + +
+ About this hosting + DIY Calculator + Website redesign + CSS Shenanigans +
\ No newline at end of file diff --git a/components/main/blinkies.php b/components/main/blinkies.php new file mode 100644 index 0000000..19f0d22 --- /dev/null +++ b/components/main/blinkies.php @@ -0,0 +1,30 @@ +
+
+
+ + + + + + + + + + +
+
+
+ + + + + + + + + + +
+
+
+
\ No newline at end of file diff --git a/components/main/navbar.php b/components/main/navbar.php new file mode 100644 index 0000000..06ebaff --- /dev/null +++ b/components/main/navbar.php @@ -0,0 +1,44 @@ + +
+ About me +
+ +
+ Español +
\ No newline at end of file diff --git a/components/main/updates.php b/components/main/updates.php new file mode 100644 index 0000000..9956fb1 --- /dev/null +++ b/components/main/updates.php @@ -0,0 +1,22 @@ +
+
+
2 Feb 2026
+

Website redesign!

+

I decided to give this website a whole new appeareance, + the previous design was pretty barebones so I hope y'all like it! + (Mobile optimized :D) If you wanna know more: + + Website Redesign + Archived version +

+
+
+
+
17 Jan 2026
+

New website!

+

New website! I hope you find these new changes favorable, + it's been a while since I wanted to make my own website from scratch, + I spent some hours re-learning html css. I honestly prefer a bloat-less + internet, therefore there won't be any javascript (unless specified)

+
+
\ No newline at end of file diff --git a/components/main/verticalscroll.php b/components/main/verticalscroll.php new file mode 100644 index 0000000..e39467f --- /dev/null +++ b/components/main/verticalscroll.php @@ -0,0 +1,6 @@ +
+
+

hello earthlings, this message if for you all that are wondering whether extra-terrestial life exists or you humans are alone. I guess you will never know... hello earthlings, this message if for you all that are wondering whether extra-terrestial life exists or you humans are alone. I guess you will never know...

+

hello earthlings, this message if for you all that are wondering whether extra-terrestial life exists or you humans are alone. I guess you will never know... hello earthlings, this message if for you all that are wondering whether extra-terrestial life exists or you humans are alone. I guess you will never know...

+
+
\ No newline at end of file diff --git a/components/main/webrings.php b/components/main/webrings.php new file mode 100644 index 0000000..0e8b18d --- /dev/null +++ b/components/main/webrings.php @@ -0,0 +1,64 @@ +
+
+
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                uneven letters and next to those words is a small question mark +
+
+
+
+
\ No newline at end of file diff --git a/css/articles/about-host/about-host.css b/css/articles/about-host/about-host.css new file mode 100644 index 0000000..a4e02e4 --- /dev/null +++ b/css/articles/about-host/about-host.css @@ -0,0 +1 @@ +@import url('../../global/global-settings.css'); \ No newline at end of file diff --git a/css/articles/about/about.css b/css/articles/about/about.css new file mode 100644 index 0000000..6adb0a9 --- /dev/null +++ b/css/articles/about/about.css @@ -0,0 +1,3 @@ +@import url('../../global/global-settings.css'); + +@import url('./layout/base.css'); \ No newline at end of file diff --git a/css/articles/about/layout/base.css b/css/articles/about/layout/base.css new file mode 100644 index 0000000..c6dd935 --- /dev/null +++ b/css/articles/about/layout/base.css @@ -0,0 +1,4 @@ +.primary { + height: 100%; + justify-content: center; + align-content: center;} \ No newline at end of file diff --git a/css/articles/diy-calculator/diy-calculator.css b/css/articles/diy-calculator/diy-calculator.css new file mode 100644 index 0000000..6adb0a9 --- /dev/null +++ b/css/articles/diy-calculator/diy-calculator.css @@ -0,0 +1,3 @@ +@import url('../../global/global-settings.css'); + +@import url('./layout/base.css'); \ No newline at end of file diff --git a/css/articles/diy-calculator/layout/base.css b/css/articles/diy-calculator/layout/base.css new file mode 100644 index 0000000..bc31969 --- /dev/null +++ b/css/articles/diy-calculator/layout/base.css @@ -0,0 +1,65 @@ +.primary > div { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-start; + gap: var(--gap);} + +.primary > div > div { + height: min(auto, 100%); + flex-basis: 45%; + flex-grow: 1; + display: flex;} + + /* I could tecnically change all of this to use + display: grid, it would make a lot more sense + taking into account the mess this code is*/ + + .calc { + height: auto; + min-width: fit-content; + gap: var(--gap); + padding: var(--gap); + flex-direction: column; + justify-content: center; + align-items: center;} + + .buttons { + width: fit-content; + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: right; + align-items: stretch; + max-width: calc((70px * 4) + ( 5 * (4px * 2) ) );} + + button { + border: 0; + margin: 5px; + height: 70px; + width: 70px; + transition: 0.05s background-color ease-in;} + + #equal { flex-grow: 1; } + + .viewing { + border-top: 0; + border-left: 0; + border-right: 0; + display: flex; + align-items: center; + width: calc((70px * 4) + ( 2 * (15px) )); + height: 3em;} + + .viewing > #output { + padding: 0.5em; + font-size: 40px; + text-align: right; + text-overflow: clip; + overflow-y: auto; + width: 100%;} + + .info { + min-width: 50%; + flex-shrink: 1; + flex-direction: column;} \ No newline at end of file diff --git a/css/chat.css b/css/chat.css new file mode 100644 index 0000000..8cf42c6 --- /dev/null +++ b/css/chat.css @@ -0,0 +1,102 @@ +* { + font-family: inherit; + box-sizing: inherit; + +} + +html, body { + height: 100%; + width: 100%; +} + +body { + --text-color: rgb(215, 215, 215); + font-family: monospace; + display: flex; + justify-content: center; + align-items: center; + background-color: rgb(28, 28, 28); + box-sizing: border-box; + margin: 0; +} + + +h1, h2, h3, h4, p { + text-align: center; + color: var(--text-color); +} + + +.chatbox > div { + display: flex; + flex-direction: column; + align-items: center; + margin: 1em; + width: 400px; +} + +.chatbox { + border-radius: 5px; + display: flex; + margin: 5em; + max-height: calc(100% - 5em * 2); + background-color: rgb(56, 56, 56); +} + +.chatbox > div > div { + margin-bottom: 1em; + width: 100%; +} + +.content { + background-color: rgb(28, 28, 28); + border-radius: 10px; + overflow-y: auto; + scrollbar-width: thin; + display: flex; + flex-direction: column-reverse; +} + +.message { + margin: 0.5em; + border-bottom: 1px dashed gray; +} + +input { + background-color: rgb(84, 84, 84); + border: 0; + color: var(--text-color); +} + +button { + border: 0; + background-color: rgb(0, 0, 0); + color: var(--text-color); + flex-grow: 0; +} + +.m_content { + text-align: right; +} + +.username { + text-align: left; +} + +.input > form { + display: flex; + gap: 1em; +} + +.input > form > * { + flex-grow: 1; +} + +.logout { + width: 100%; +} + +.error { + font-weight: bold; + color: red; +} \ No newline at end of file diff --git a/css/global/fonts/HonyaJi-Re.ttf b/css/global/fonts/HonyaJi-Re.ttf new file mode 100644 index 0000000..66eb095 Binary files /dev/null and b/css/global/fonts/HonyaJi-Re.ttf differ diff --git a/css/global/fonts/basiic.ttf b/css/global/fonts/basiic.ttf new file mode 100644 index 0000000..b0e6d09 Binary files /dev/null and b/css/global/fonts/basiic.ttf differ diff --git a/css/global/fonts/beefont.ttf b/css/global/fonts/beefont.ttf new file mode 100644 index 0000000..ed5ec31 Binary files /dev/null and b/css/global/fonts/beefont.ttf differ diff --git a/css/global/fonts/lmmono10-regular.woff b/css/global/fonts/lmmono10-regular.woff new file mode 100644 index 0000000..9f33af2 Binary files /dev/null and b/css/global/fonts/lmmono10-regular.woff differ diff --git a/css/global/fonts/specialelite.woff2 b/css/global/fonts/specialelite.woff2 new file mode 100644 index 0000000..569a27e Binary files /dev/null and b/css/global/fonts/specialelite.woff2 differ diff --git a/css/global/global-settings.css b/css/global/global-settings.css new file mode 100644 index 0000000..f576254 --- /dev/null +++ b/css/global/global-settings.css @@ -0,0 +1,3 @@ +@import url('styling/reset.css'); +@import url('layout/global-layout.css'); +@import url('styling/global-styling.css'); \ No newline at end of file diff --git a/css/global/layout/global-layout.css b/css/global/layout/global-layout.css new file mode 100644 index 0000000..8790d67 --- /dev/null +++ b/css/global/layout/global-layout.css @@ -0,0 +1,171 @@ +/* -------- Variables --------- */ + +html { + --gap: 2em; + --mobile-topnavbar-height: 125px; + --mobile-botnavbar-height: var(--mobile-topnavbar-height); + --side-bar-width: 240px; + --max-percentage-width-navar: 70%; +} + +/* ---- Hide mobile only ---- */ + +.navbar.bot { display: none; } + +/* ---- Hierarchical layout ---- */ + + +.panel { padding: calc(var(--gap) / 2); } + + .panel .header { + flex-shrink: 0; + display: flex; + justify-content: center; + align-items: center; + height: calc(var(--title-height) + 0.5em ); + transform: translateY(-15px);} + +.blank { pointer-events: none; } + +body { + display: flex; + flex-direction: row; + height: 100%; + overflow: hidden; +} + +.navbar { + position: fixed; + z-index: 999; + display: flex; + gap: var(--gap); + padding: var(--gap); +} + + .navbar.blank { + position: relative; + flex-shrink: 0; + opacity: 0;} + + .navbar.top { + flex-direction: column; + justify-content: space-around; + align-items: center; + width: var(--side-bar-width); + height: 100%; + --max-width: var(--max-percentage-width-navar); + } + + .links { + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; + gap: calc(var(--gap) / 2);} + + .links > div { + align-items: center; + height: 50px; + padding: 7px;} + + .links a { + margin: 0px; + text-align: left;} + + .links .mail { height: fit-content; } + + + .links > .social-media { + display: flex; + flex-direction: row; + gap: calc(var(--gap) / 4);} + + .links img { height: 24px; } + + .navbar.top > div { width: 100%; } + +.wrapper { + flex-grow: 1; + width: 0%; /* Don't know why this works, forces div to always grow */ + overflow-y: auto; + overflow-x: hidden;} + + .primary { + display: flex; + flex-direction: row-reverse; + align-content: space-between; + flex-wrap: wrap; + padding: var(--gap); + gap: var(--gap); + height: fit-content; + width: 100%;} + +@media only all and (max-width:700px) { + + /* -- Ordering -- */ + .about { order: 1; } + .logo { order: 2; } + .lang-picker { order: 3; } + + /* -- Layout -- */ + + body { + flex-direction: column; + overflow: hidden;} + + .wrapper { + width: 100%; + height: fit-content; + display: flex; + flex-direction: column; + flex-wrap: wrap; + gap: 0; + overflow: auto; + position: relative;} + + .navbar.top { + flex-direction: row; + justify-content: space-around; + align-items: center; + height: var(--mobile-topnavbar-height); + gap: var(--gap); + width: 100%; + --max-width: 80%;} + + .navbar.top > .links { display: none; } + .navbar.bot { display: flex; } + + .navbar.bot.blank { + position: relative; + flex-shrink: 0; + opacity: 0;} + + .navbar.bot { + display: flex; + position: fixed; + bottom: 0px; + height: var(--mobile-botnavbar-height); + flex-direction: column; + justify-content: center; + align-content: center; + width: 100%;} + + .navbar.bot > div { flex-direction: row; } + + .links { + /* Scroll mechanics */ + margin-bottom: -1em; /* Trick to hide visual scrollbar */ + padding-bottom: 1em; + overflow-x: auto; + overflow-y: hidden; + mask-image: linear-gradient(to right, rgba(0,0,0,1) 80%, rgba(0,0,0,0)); + /* Ordering */ + justify-content: flex-start; + clip-path: content-box; + align-items: flex-start; + flex-direction: column;} + + .links .last { margin-right: 20%; } /* Complementing visual trick by allow extra scrolling to hide previous visual trick, 100% - 80% */ + + .links > div{ align-items: center;} +} \ No newline at end of file diff --git a/css/global/styling/global-styling.css b/css/global/styling/global-styling.css new file mode 100644 index 0000000..9eb7eaa --- /dev/null +++ b/css/global/styling/global-styling.css @@ -0,0 +1,174 @@ +/* Colors */ + +/* ---------------- Variables ---------------- */ +html { + --border-radius: 5px; + --accent-color-light: aliceblue; + --accent-color-middle: rgb(173, 189, 203); + --accent-color-dark: rgb(24, 47, 56); + --panel-border_one: var(--accent-color-dark); + --panel-border_two: var(--accent-color-dark); + --panel-header: var(--accent-color-dark); + --panel-background: var(--accent-color-light); + --body-background: rgb(255, 255, 255); + --input-background: white; + --input-background-hover: rgb(216, 222, 227); + --input-highlight: rgb(86, 176, 255); + --navvar-background: rgb(179, 200, 218); + --navbar-buttons-bg: var(--accent-color-light); + --navbar-buttons-hover: var(--input-background-hover); + --input-border-radius: var(--border-radius); + --link-color: var(--accent-color-dark); + --link-color-hover: var(--input-highlight); + --logo-outline-color: var(--input-highlight);} + +/* Background texture */ + +body { background-image: url('graphgreen.gif'); } + + +/* ----------------- Others -------------------- */ + +* { scrollbar-width: thin;} + +img { image-rendering: pixelated;} + +.logo { position: relative; } +.logo > img { + position: absolute; + width: 80px; + top: 15px; + right: -40px;} + +.links { overflow-y: auto; } + +.links a { text-decoration: none;} + +/* ----------------- Fonts -------------------- */ + +@font-face { + font-family: 'special elite'; + src: url('../fonts/specialelite.woff2') format('woff'); + font-weight: normal; + font-style: normal;} + +@font-face { + font-family: 'honyaji'; + src: url('../fonts/HonyaJi-Re.ttf') format('truetype'); + font-weight: normal; + font-style: normal;} + + +@font-face { + font-family: 'basiic'; + src: url('../fonts/basiic.ttf') format('truetype'); + font-weight: normal; + font-style: normal;} + +@font-face { + font-family: 'beefont'; + src: url('../fonts/beefont.ttf') format('truetype'); + font-weight: normal; + font-style: normal;} + +* { text-align: center; } + +body { font-family: 'special elite', honyaji, basiic, monospace, serif, sans-serif; } + +/* ----------------- Color -------------------- */ +.navbar { background-color: var(--navvar-background); } + +.panel { + position: relative; + border-radius: 5px; + border: 2px solid var(--panel-border_one); + background-color: var(--panel-background);} + +.chat-history { + border-radius: var(--chat-border-radius); + background-color: var(--chat-history-background);} + +/* ------------- Decorations & dividers (D&D) -------------------- */ +.panel .header { position: relative; } +.panel .header::after { + position: absolute; + bottom: -3px; + content: "- - --⛤-- - -"; + font-size: 15px;} + +/* ------------- Navbars stiling ------------------- */ +.about, .links > div, .lang-picker { + border: 5px groove rgb(214, 236, 255); + background: var(--navbar-buttons-bg);} + +.about:hover, .links > div:hover, .lang-picker:hover { + background-color: var(--navbar-buttons-hover); + transition: background-color 0.1s;} + +/* ------------- Inputs & links ----------------- */ +button, .button { + font-family: 'special elite'; + background-color: var(--input-background); + border: 0; + border-radius: var(--input-border-radius); + border-bottom: 4px solid var(--input-highlight); + padding: 0.35em;} + +button:hover, .button:hover { + background-color: var(--input-background-hover); + border-bottom: 2px solid var(--input-highlight); + padding-bottom: 0.1em; + padding-top: calc((0.35em + (0.25em - 0.1em)) + 2px); + transition: background-color 0.1s; + transition: border-bottom 0.1s; + transition: padding-bottom 0.15s; + transition: padding-top 0.15s;} + +input[type=text] { + font-family: 'special elite'; + border: 0; + border-radius: var(--input-border-radius); + border-bottom: 4px solid var(--input-highlight); + transition: background-color 0.1s; + transition: border-bottom 0.1s;} + + input[type=text]:focus { outline: 0; } + + input[type=text]:hover { + border-bottom: 2px solid var(--input-highlight); + background-color: var(--input-background-hover); + transition: background-color 0.1s;} + +a, a:visited { + color: var(--link-color); + text-decoration-style: wavy;} + +a:hover { + transform: translateY(-2px); + color: var(--link-color-hover); + transition: color 0.1s; + transition: transform 0.1s;} + +.logo { position: relative; } + + .logo-text { +/* position: absolute; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); */ + font-size: 40px; + color: white; + text-shadow: + 2px 0 var(--logo-outline-color), + -2px 0 var(--logo-outline-color), + 0 2px var(--logo-outline-color), + 0 -2px var(--logo-outline-color), + 1px 1px var(--logo-outline-color), + -1px -1px var(--logo-outline-color), + 1px -1px var(--logo-outline-color), + -1px 1px var(--logo-outline-color);} + + .logo a { + color: white; + text-decoration: none; + } \ No newline at end of file diff --git a/css/global/styling/graphgreen.gif b/css/global/styling/graphgreen.gif new file mode 100644 index 0000000..8ae1e00 Binary files /dev/null and b/css/global/styling/graphgreen.gif differ diff --git a/css/global/styling/reset.css b/css/global/styling/reset.css new file mode 100644 index 0000000..ddbca19 --- /dev/null +++ b/css/global/styling/reset.css @@ -0,0 +1,11 @@ +/* Reset */ + +html, body { + box-sizing: border-box; + height: 100%; + width: 100%; + margin: 0; + padding: 0; +} + +* { box-sizing: inherit; } \ No newline at end of file diff --git a/css/main/layouts/base.css b/css/main/layouts/base.css new file mode 100644 index 0000000..1a1cf75 --- /dev/null +++ b/css/main/layouts/base.css @@ -0,0 +1,279 @@ +/* Base design */ + +/* ---------------- Variables ---------------- */ + +html { + --chat-gap: 1em; + --updates-gap: 1em; + --blinkies-gap: 1em; + --blinkies-height: 40px; + --scrolls-height: 50px; + --secondary-width: 200px; + --webrings-heigth: 200px; + --webrings-mobile-height: 100px; + --title-height: 3em; +} + + +/* --------- Display changes ---------------- */ + +.verticalscroll, .scroll_below-clip-box, #try_tapping--blinkie, #try_hovering--blinkie { display: none; } + +/* --------- Hierarchical layout --------- */ + +.blinkies { + padding-top: 0; + padding-bottom: 0; + gap: var(--blinkies-gap); + width: 100%; + height: var(--blinkies-height); + flex-grow: 0; + align-content: center;} + + .auto-scroll { + display: flex; + flex-direction: row;} + + .scroll_one, .scroll_two { + display: flex; + gap: var(--blinkies-gap);} + + .blinkies img { height: 30px; } + +.content { + overflow-y: auto; + overflow-x: hidden;} + +.articles, .chat-webrings { width: var(--secondary-width); } + +.articles { flex-grow: 0; } + + .articles .content { + display: flex; + flex-direction: column; + gap: calc(var(--gap) / 2); + } + +.main { + display: flex; + flex-direction: column; + flex: 1; + gap: var(--gap);} + + .updates { + flex-grow: 1; + overflow-y: auto; + flex-basis: 30%; + flex-shrink: 0;} + + .updates .update { + display: grid; + grid-template-columns: fit-content 1fr; + grid-template-rows: fit-content 1fr; + gap: var(--updates-gap);} + + .update .title { + /* Grid placement */ + grid-column-start: 2; + grid-column-end: 3; + grid-row-start: 1; + grid-row-end: 2; + + text-align: center; + margin-bottom: 0;} + + .update .date { + /* Grid placement */ + grid-column-start: 1; + grid-column-end: 2; + grid-row-start: 1; + grid-row-end: 3; + + writing-mode: sideways-lr;} + + .update .content { + /* Grid placement */ + grid-column-start: 2; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 3; + + text-align: justify;} + + .provided { + position: relative; + flex-grow: 1; + overflow-y: auto; + overflow-x: hidden;} + + .provided .content { + display: flex; + flex-direction: column; + gap: calc(var(--gap) / 4); + overflow-y: auto;} + + .services-hint { + /* Internal layout and positioning */ + display: flex; + align-items: center; + justify-content: center; + gap: calc(var(--gap) / 3); + background-color: var(--hint-background);} + + .services-hint p { + flex-grow: 0; + vertical-align: center; + padding-left: calc(var(--gap) / 3); + border-left: 2px solid red; + } + + .services-hint img { + height: 32px; + flex-grow: 0; + flex-shrink: 0; + margin-right: calc(var(--gap) / 3);} + + .services { + display: flex; + gap: var(--gap); + flex-wrap: wrap; + } + + .services > div { + display: flex; + flex-direction: column; + flex-grow: 1; + gap: calc(var(--gap) / 2); + } + + +.chat-webrings { + display: flex; + flex-direction: column; + flex-grow: 0; + flex-shrink: 0; + gap: inherit;} + + .chat { + display: flex; + flex-direction: column; + flex-grow: 1; + overflow: hidden;} + + .chat > .content { + flex-grow: 1; + display: flex; + gap: var(--chat-gap); + flex-direction: column; + overflow: hidden;} + + .chat-account { + width: 100%; + height: fit-content; + display: flex; + flex-direction: column; + flex-grow: 0; + gap: calc(var(--gap) / 4);} + + .chat-account-inputs, .chat-account-buttons { + height: auto; + gap: calc(var(--gap) / 2); + display: flex; + flex-grow: 0; + width: 100%;} + + .chat-account input, .chat-account button { + height: fit-content; + width: 50%;} + + .chat-history { + display: flex; + flex-direction: column; + padding-top: calc(var(--gap) / 2); + padding-bottom: calc(var(--gap) / 2); + gap: calc(var(--gap) / 2); + width: 100%; + flex-grow: 1; + overflow-y: auto;} + + .message > .date_sent { margin: 0;} + + .chat-input { + width: 100%; + flex-grow: 0;} + + .chat-input input { width: 100%; } + + .webrings { + display: flex; + gap: var(--blinkies-gap); + height: var(--webrings-heigth); + flex-grow: 0; + justify-content: center;} + + .webrings .auto-scroll { + width: 100%; + display: flex; + flex-direction: column;} + + .webrings .scroll_one, .webrings .scroll_two { + display: flex; + flex-direction: column; + gap: var(--blinkies-gap);} + + .webrings .auto-scroll > * img { + width: 100%; + } + + +/* ----------- Animation ------------- */ + +/* Personalized marquee, did my thing +because I didn't quite get what the owner +of https://minx98.neocities.org/ was doing, +got the idea to use two separate divs and +transform them, not sure how the original +owner clipped them though */ + +/* Global */ +.auto-scroll { width: fit-content; } +.auto-scroll:hover { animation-play-state: paused !important; } +.clip-box { overflow: hidden; } + +.auto-scroll { + animation-duration: 10s; + animation-timing-function: linear; + animation-delay: 0s; + animation-iteration-count: infinite; + animation-direction: normal; + animation-fill-mode: none; + animation-play-state: running; +} + +/* Blinkies */ + +.blinkies .clip-box { clip-path: content-box; } + + .blinkies .auto-scroll { + animation-name: scroll_blinkies; + animation-duration: 20s;} + +@keyframes scroll_blinkies { + from {transform: translateX(calc(-50%));} + to {transform: translateX(0%);}} + +/* Second blinkie */ + +.blinkies.two .auto-scroll { animation-direction: reverse; } + +/* Webrings */ + +.webrings .clip-box { + clip-path: content-box; + width: 100%; } + + .webrings .auto-scroll { animation-name: scroll-webring; } + + @keyframes scroll-webring { + from {transform: translateY(calc(-50%));} + to {transform: translateY(0%);}} \ No newline at end of file diff --git a/css/main/layouts/desktop-slim.css b/css/main/layouts/desktop-slim.css new file mode 100644 index 0000000..3370b23 --- /dev/null +++ b/css/main/layouts/desktop-slim.css @@ -0,0 +1,24 @@ +/* RESPONSIVE DESIGN, LAPTOP SLIM */ + +@media only all and (max-width:1175px){ + /* ------------- Order ------------- */ + .blinkies.one { order: 1; } + .articles { order: 4; } + .main { order: 2; } + .chat-webrings { order: 3; } + .blinkies.two { order: 5; } + + /* ------------- Layout ------------ */ + .articles { flex-grow: 1; } + + .chat-webrings { flex-grow: 0; } + + .main { + flex-grow: 999; + min-width: 50%} + + .services { overflow-y: auto; } + + /* --- Decoration --- */ + +} \ No newline at end of file diff --git a/css/main/layouts/desktop-slimmer.css b/css/main/layouts/desktop-slimmer.css new file mode 100644 index 0000000..d0e58e8 --- /dev/null +++ b/css/main/layouts/desktop-slimmer.css @@ -0,0 +1,21 @@ +/* RESPONSIVE DESIGN, LAPTOP SLIMMER */ + +@media only all and (max-width:750px){ + /* ------------- Order ------------- */ + + + /* ------------ Layout ------------ */ + .main { + flex-basis: 100%; + flex-shrink: 0;} + + .articles { + flex-grow: 1; + width: auto;} + + .chat-webrings { + width: var(--secondary-width); + flex-grow: 1;} + + .services { overflow-y: auto; } +} \ No newline at end of file diff --git a/css/main/layouts/desktop.css b/css/main/layouts/desktop.css new file mode 100644 index 0000000..5c1212c --- /dev/null +++ b/css/main/layouts/desktop.css @@ -0,0 +1,16 @@ +/* RESPONSIVE DESIGN, LAPTOP FULL */ + +@media only all and (min-width:1175px) { + /* ------------- Layout ------------- */ + + .primary { + padding-right: 150px; + padding-left: 150px;} + + .chat-webrings, .main, .articles { height: calc(100vh - (var(--blinkies-height) * 2) - (var(--gap) * 4)); } + + .services { overflow-y: auto; } + /* ---- Display changes ---- */ + + #try_hovering--blinkie { display: block; } +} \ No newline at end of file diff --git a/css/main/layouts/mobile.css b/css/main/layouts/mobile.css new file mode 100644 index 0000000..e1a03ca --- /dev/null +++ b/css/main/layouts/mobile.css @@ -0,0 +1,149 @@ +/* RESPONSIVE DESIGN, MOBILE */ + +@media only all and (max-width:700px){ + /* ------------- Order ------------- */ + .blinkies.one { order: 0; } + .main { order: 1; } + .articles { order: 2; } + .chat-webrings { order: 3; } + .verticalscroll { order: 4; } + + /* -------- Display changes ---------- */ + .blinkies.two { display: none; } + .verticalscroll { display: flex; } + .scroll_below-clip-box { display: block; } + + .navbar.bot > .about, .navbar.bot > .logo, .navbar.bot > .lang-picker { display: none; } + + /* Decoration */ + + #try_hovering--blinkie { display: none; } + #try_tapping--blinkie { display: block; } + + /* ------------- Layout ------------- */ + + .primary { + width: calc(100% - var(--scrolls-height) - var(--gap) * 2); + height: fit-content; + flex-direction: column; + padding-right: 0;} + + .primary > * { + width: 100%;} + + .main { + height: fit-content; + flex-grow: 1; + flex-basis: auto;} + + .verticalscroll { + position: fixed; + right: 0; /* There is a slight inconsistency with this, as scrollbar width isn't considered with fixed, but the blank version does contemplate, creating a gap wider than expected */ + margin: var(--gap); + justify-content: center; + height: calc(100% - var(--mobile-botnavbar-height) - var(--mobile-topnavbar-height) - var(--gap) * 2); + width: var(--scrolls-height); + overflow: hidden;} + + .verticalscroll.blank { + height: 100%; + position: relative; + opacity: 0;} + + .vertical-scroll-wrapper { + height: fit-content;} + + .verticalscroll .clip-box { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: fit-content; + display: flex; + justify-content: center;} + + .verticalscroll .auto-scroll{ + display: flex; + flex-direction: column;} + + .verticalscroll p { + writing-mode: vertical-lr; + text-orientation: sideways; + text-wrap: nowrap;} + + .webrings { + gap: var(--blinkies-gap); + height: var(--webrings-mobile-height); + flex-shrink: 0; + padding-top: 0; + padding-bottom: 0;} + + .webrings .clip-box { + align-content: center;} + + .webrings .auto-scroll { + flex-direction: row; + animation-name: scroll-webring-mobile;} + + .webrings .scroll_one, .webrings .scroll_two { + flex-direction: row;} + + .webrings .auto-scroll > * > div img { + height: 60px; + width: auto;} + + .scroll_below-clip-box { + position: absolute; + bottom: 0; + top: 50px; + width: 100%; + height: 100%; + pointer-events: none; + clip-path: border-box;} + + .scroll_below { + position: fixed; + left: 0px; + bottom: var(--mobile-botnavbar-height); + margin-bottom: 0px; + height: fit-content; + width: fit-content; + padding-left: 1em; + padding-right: 1em; + text-align: center;} + + /* ----------- Animation ----------- */ + + /* Blinkies */ + .blinkies.one .auto-scroll { + animation-duration: 20s; + animation-direction: reverse;} + + /* Webrings */ + .webrings .clip-box { + height: 100%; + width: 100%;} + + @keyframes scroll-webring-mobile { + from {transform: translateX(calc(-50%));} + to {transform: translateX(0%);}} + + /* Vertical scroll text */ + .verticalscroll .auto-scroll { + animation-name: scroll-vertical; + animation-direction: reverse; + animation-duration: 20s;} + + @keyframes scroll-vertical { + from {transform: translateY(calc(-50%));} + to {transform: translateY(0%);}} + + /* Opacity enhancements */ + .webrings .clip-box{ + mask-image: linear-gradient(to right, + rgba(0,0,0,0) 0%, + rgba(0,0,0,1) 5%, + rgba(0,0,0,1) 95%, + rgba(0,0,0,0) 100%);} +} \ No newline at end of file diff --git a/css/main/main.css b/css/main/main.css new file mode 100644 index 0000000..6f18169 --- /dev/null +++ b/css/main/main.css @@ -0,0 +1,11 @@ +@import url('../global/global-settings.css'); + +@import url('styling.css'); + +@import url('layouts/base.css'); +@import url('layouts/desktop.css'); +@import url('layouts/desktop-slim.css'); +@import url('layouts/desktop-slimmer.css'); +@import url('layouts/mobile.css'); + +@import url('others/noaiwebring.css'); \ No newline at end of file diff --git a/css/main/others/noaiwebring.css b/css/main/others/noaiwebring.css new file mode 100644 index 0000000..0c1b40f --- /dev/null +++ b/css/main/others/noaiwebring.css @@ -0,0 +1,21 @@ +/* See comment on html directly */ + +.noaiwebring { position: relative;} + +.noaiwebring > img { + width: 100%; + height: 100%;} + +.noaiwebring > a > div { position: absolute; } + +.noaiwebring > a > .nxt { +left: 76.1%; top: 6.5%; width: 20.5%; height: 48.4%;} + +.noaiwebring > a > .prv { +left: 2.3%; top: 6.5%; width: 20.5%; height: 48.4%;} + +.noaiwebring > a > .rnd { +left: 71.6%; top: 61.3%; width: 12.5%; height: 35.5%;} + +.noaiwebring > a > .home { +left: 26.1%; top: 48.4%; width: 44.3%; height: 48.4%;} \ No newline at end of file diff --git a/css/main/styling.css b/css/main/styling.css new file mode 100644 index 0000000..953ea09 --- /dev/null +++ b/css/main/styling.css @@ -0,0 +1,73 @@ +/* Colors */ + +/* ---------------- Variables ---------------- */ +html { + --chat-history-background: white; + --chat-border-radius: var(--border-radius); + --login-error-color: rgb(231, 90, 90); + --hint-background: ; + --chat-user: var(--input-highlight); + --chat-message: rgb(147, 153, 158);} + +/* ----------------- Others -------------------- */ +.auto-scroll { transform: translateZ(0); } /* Force to use gpu */ + +.services img:hover { + scale: 1.1; + transition: scale 0.2s;} + +/* --------------- Color filtering ------------- */ +.blinkies > * img, .webrings .auto-scroll > * > div, .services img { + filter: sepia(100%) saturate(300%) brightness(100%) hue-rotate(180deg);} + +.blinkies > * img:hover, .webrings .auto-scroll > * > div:hover, .services img:hover { filter: none; } + + +/* ----------------- Color -------------------- */ + +.chat-history { + border-radius: var(--chat-border-radius); + background-color: var(--chat-history-background);} + +.chat-account-errors { color: var(--login-error-color); } + +.scroll_below-clip-box { mask-image: linear-gradient(to bottom, rgba(0,0,0,1) 90%, rgba(0,0,0,0)); } + +.message .user { color: var(--chat-user); } +.message .date_sent { color: var(--chat-message); } + + +/* ------------- Decorations & dividers (D&D) -------------------- */ + +/* ----- Helpers ----- */ +#try_hovering--blinkie { + scale: 3; + position: absolute; + bottom: -27px; + left: -63px; + z-index: 999;} + +#try_sliding_down { width: 150px; } + +#try_tapping--blinkie { + scale: 3; + position: absolute; + right: -60px; + bottom: -28px; + z-index: 999;} + +/* ------ Opacity tricks for marquee -------- */ + +.blinkies .clip-box{ + mask-image: linear-gradient(to right, + rgba(0,0,0,0) 0%, + rgba(0,0,0,1) 5%, + rgba(0,0,0,1) 95%, + rgba(0,0,0,0) 100%);} + +.webrings .clip-box{ + mask-image: linear-gradient(to bottom, + rgba(0,0,0,0) 0%, + rgba(0,0,0,1) 5%, + rgba(0,0,0,1) 95%, + rgba(0,0,0,0) 100%);} \ No newline at end of file diff --git a/disclaimers.txt b/disclaimers.txt new file mode 100644 index 0000000..a35f036 --- /dev/null +++ b/disclaimers.txt @@ -0,0 +1,68 @@ +------ Directory structure: + +root/ + | + ---> archive/ + |---> old_version + |--> includes/ + |--> js/ + |--> css/ + |---> articles/ + |---> global/ + |---> fonts/ + |---> layout/ + |---> styling/ + |---> global-settings.css + |---> main/ + |--> img/ + |--> pages/ + |--> disclaimers.txt + |--> main_es.html + |--> main_en.html + +Example page styling: + +page/ + | + ---> layouts/ + |---> base (desktop optimized) + |---> desktop + |---> desktop-slim + |---> desktop-slimmer + |---> mobile + |---> misc (other responsive layout changes) + |--> page + |--> styling (colors, borders, etc.) + |--> others + +------ CSS file structure: + +[VARIABLES] // +[ORDERING] // +[LAYOUT] // Order by ~rendering order, indentation demarks nesting, separated by sections. +[ANIMATIONS] // + +------ CSS Syntax structure: + +One property: +selector { property: value; } + +Multiple properties: +selector { + property1: value; + property2: value2;} + +------ CSS Imports: + +1. global settings +3. page settings +3. layouts +4. misc + +------ Inspirations for design + +1. Background tiling https://lazybones.neocities.org/ +2. Sidebar https://minx98.neocities.org/ +3. Marquee https://minx98.neocities.org/ +3. Font https://weirdfashionhub.carrd.co/ +4. Buttons https://aegi.neocities.org/ \ No newline at end of file diff --git a/img/blinkies/0206-nyancat.gif b/img/blinkies/0206-nyancat.gif new file mode 100644 index 0000000..79c53b8 Binary files /dev/null and b/img/blinkies/0206-nyancat.gif differ diff --git a/img/blinkies/bantimetravel_stamp.jpeg b/img/blinkies/bantimetravel_stamp.jpeg new file mode 100644 index 0000000..c24f106 Binary files /dev/null and b/img/blinkies/bantimetravel_stamp.jpeg differ diff --git a/img/blinkies/blinkiesCafe-cats.gif b/img/blinkies/blinkiesCafe-cats.gif new file mode 100644 index 0000000..9f956a0 Binary files /dev/null and b/img/blinkies/blinkiesCafe-cats.gif differ diff --git a/img/blinkies/blinkiesCafe-nonbinary.gif b/img/blinkies/blinkiesCafe-nonbinary.gif new file mode 100644 index 0000000..e4a9ab0 Binary files /dev/null and b/img/blinkies/blinkiesCafe-nonbinary.gif differ diff --git a/img/blinkies/blinkiesCafe-sudormrf.gif b/img/blinkies/blinkiesCafe-sudormrf.gif new file mode 100644 index 0000000..16e3d18 Binary files /dev/null and b/img/blinkies/blinkiesCafe-sudormrf.gif differ diff --git a/img/blinkies/deletetiktok_pink_blinkie.webp b/img/blinkies/deletetiktok_pink_blinkie.webp new file mode 100644 index 0000000..b32cc18 Binary files /dev/null and b/img/blinkies/deletetiktok_pink_blinkie.webp differ diff --git a/img/blinkies/dontfeedtheai.gif b/img/blinkies/dontfeedtheai.gif new file mode 100644 index 0000000..d155c31 Binary files /dev/null and b/img/blinkies/dontfeedtheai.gif differ diff --git a/img/blinkies/firefox_user.gif b/img/blinkies/firefox_user.gif new file mode 100644 index 0000000..627c287 Binary files /dev/null and b/img/blinkies/firefox_user.gif differ diff --git a/img/blinkies/firefoxget.gif b/img/blinkies/firefoxget.gif new file mode 100644 index 0000000..3cd754f Binary files /dev/null and b/img/blinkies/firefoxget.gif differ diff --git a/img/blinkies/htmljunkie.gif b/img/blinkies/htmljunkie.gif new file mode 100644 index 0000000..2ce03a1 Binary files /dev/null and b/img/blinkies/htmljunkie.gif differ diff --git a/img/blinkies/ihatepopups.gif b/img/blinkies/ihatepopups.gif new file mode 100644 index 0000000..3a84abe Binary files /dev/null and b/img/blinkies/ihatepopups.gif differ diff --git a/img/blinkies/poweredbydoctorpepper.gif b/img/blinkies/poweredbydoctorpepper.gif new file mode 100644 index 0000000..dff6eaa Binary files /dev/null and b/img/blinkies/poweredbydoctorpepper.gif differ diff --git a/img/blinkies/queso_cubano_masiv_.gif b/img/blinkies/queso_cubano_masiv_.gif new file mode 100644 index 0000000..a4137b5 Binary files /dev/null and b/img/blinkies/queso_cubano_masiv_.gif differ diff --git a/img/blinkies/steins.png b/img/blinkies/steins.png new file mode 100644 index 0000000..15fab9f Binary files /dev/null and b/img/blinkies/steins.png differ diff --git a/img/decorations/try_hovering_en.png b/img/decorations/try_hovering_en.png new file mode 100644 index 0000000..8c19e3a Binary files /dev/null and b/img/decorations/try_hovering_en.png differ diff --git a/img/decorations/try_hovering_es.png b/img/decorations/try_hovering_es.png new file mode 100644 index 0000000..999f8ec Binary files /dev/null and b/img/decorations/try_hovering_es.png differ diff --git a/img/decorations/try_sliding_down_en.png b/img/decorations/try_sliding_down_en.png new file mode 100644 index 0000000..88f943e Binary files /dev/null and b/img/decorations/try_sliding_down_en.png differ diff --git a/img/decorations/try_sliding_down_es.png b/img/decorations/try_sliding_down_es.png new file mode 100644 index 0000000..e618d42 Binary files /dev/null and b/img/decorations/try_sliding_down_es.png differ diff --git a/img/decorations/try_tapping_en.png b/img/decorations/try_tapping_en.png new file mode 100644 index 0000000..45c872f Binary files /dev/null and b/img/decorations/try_tapping_en.png differ diff --git a/img/decorations/try_tapping_es.png b/img/decorations/try_tapping_es.png new file mode 100644 index 0000000..f7e103d Binary files /dev/null and b/img/decorations/try_tapping_es.png differ diff --git a/img/favicon/favicon-lair.png b/img/favicon/favicon-lair.png new file mode 100644 index 0000000..300c0a6 Binary files /dev/null and b/img/favicon/favicon-lair.png differ diff --git a/img/icons/github.png b/img/icons/github.png new file mode 100644 index 0000000..274da58 Binary files /dev/null and b/img/icons/github.png differ diff --git a/img/icons/instagram.png b/img/icons/instagram.png new file mode 100644 index 0000000..b53b59a Binary files /dev/null and b/img/icons/instagram.png differ diff --git a/img/icons/mail.png b/img/icons/mail.png new file mode 100644 index 0000000..2fb6bb3 Binary files /dev/null and b/img/icons/mail.png differ diff --git a/img/icons/osu.png b/img/icons/osu.png new file mode 100644 index 0000000..a9c0ce7 Binary files /dev/null and b/img/icons/osu.png differ diff --git a/img/icons/pixelfed.png b/img/icons/pixelfed.png new file mode 100644 index 0000000..b476c99 Binary files /dev/null and b/img/icons/pixelfed.png differ diff --git a/img/icons/reddit.png b/img/icons/reddit.png new file mode 100644 index 0000000..90bd5b4 Binary files /dev/null and b/img/icons/reddit.png differ diff --git a/img/icons/spotify.png b/img/icons/spotify.png new file mode 100644 index 0000000..279b3b0 Binary files /dev/null and b/img/icons/spotify.png differ diff --git a/img/icons/steam.png b/img/icons/steam.png new file mode 100644 index 0000000..ca14791 Binary files /dev/null and b/img/icons/steam.png differ diff --git a/img/icons/twitter.png b/img/icons/twitter.png new file mode 100644 index 0000000..da022cd Binary files /dev/null and b/img/icons/twitter.png differ diff --git a/img/logo/logo_smth.png b/img/logo/logo_smth.png new file mode 100644 index 0000000..baf1023 Binary files /dev/null and b/img/logo/logo_smth.png differ diff --git a/img/minis/cat-star.gif b/img/minis/cat-star.gif new file mode 100644 index 0000000..ca78359 Binary files /dev/null and b/img/minis/cat-star.gif differ diff --git a/img/minis/totoro-smile.gif b/img/minis/totoro-smile.gif new file mode 100644 index 0000000..371e633 Binary files /dev/null and b/img/minis/totoro-smile.gif differ diff --git a/img/utilities/exclamation-mark.gif b/img/utilities/exclamation-mark.gif new file mode 100644 index 0000000..7db02a4 Binary files /dev/null and b/img/utilities/exclamation-mark.gif differ diff --git a/img/webrings/miniwidget5.gif b/img/webrings/miniwidget5.gif new file mode 100644 index 0000000..bc913e0 Binary files /dev/null and b/img/webrings/miniwidget5.gif differ diff --git a/includes/chat_reading.inc.php b/includes/chat_reading.inc.php new file mode 100644 index 0000000..c5f1dda --- /dev/null +++ b/includes/chat_reading.inc.php @@ -0,0 +1,23 @@ +getMessage(); + exit(); + } +} else { + echo "Wrong request type, please check your request."; + exit(); +} \ No newline at end of file diff --git a/includes/chat_reading_contr.inc.php b/includes/chat_reading_contr.inc.php new file mode 100644 index 0000000..e9109ad --- /dev/null +++ b/includes/chat_reading_contr.inc.php @@ -0,0 +1,16 @@ +prepare($query); + $stmt->execute(); + $chat_history = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + return $chat_history; +} \ No newline at end of file diff --git a/includes/chat_reading_view.inc.php b/includes/chat_reading_view.inc.php new file mode 100644 index 0000000..3f4a228 --- /dev/null +++ b/includes/chat_reading_view.inc.php @@ -0,0 +1,16 @@ + +
+ + +

+
+ $_SESSION["username"],"message_content"=>$_POST["message_content"]]; + + if (isEmpty($inputs)) { + $errors = ["null_field" => "Form contains blank characters."]; + } + if (!user_exists($pdo, $inputs["username"])) { + $errors = ["inexistent_user" => "User does not exist on db."]; + } + } else { + $errors = ["not_logged_in" => "You haven't logged in."]; + } + + if ($errors) { + $_SESSION["errors"] = $errors; + + // Send back form + $entered_data = [ + "message_content" => $inputs["message_content"] + ]; + + $_SESSION["entered_chat_data"] = $entered_data; + + header("Location: ../chat.php"); + $inputs = null; + die(); + } + + send_message($pdo, $inputs["username"], $inputs["message_content"]); + + header("Location: ../chat.php"); + $inputs = null; + die(); + } catch (PDOException $e) { + echo "An error has ocurred: " . $e->getMessage(); + exit(); + } + +} else { + echo "Wrong request type, please check your request."; + exit(); +} \ No newline at end of file diff --git a/includes/chat_send_contr.inc.php b/includes/chat_send_contr.inc.php new file mode 100644 index 0000000..90b5df7 --- /dev/null +++ b/includes/chat_send_contr.inc.php @@ -0,0 +1,43 @@ + $content) { + if (empty($content)){ + return true; + } else { + return false; + } + } +} + +function user_exists(object $pdo, string $username){ + if (username_search($pdo, $username)) { + return true; + } else { + return false; + } +} + +function send_message(object $pdo, string $username, string $content) { + function get_users_id(object $pdo, string $username){ + $user_id = retrieve_user_id($pdo, $username); + return $user_id; + } + + $users_id = get_users_id($pdo, $username); + write_message($pdo, $username, $users_id, $content); +} + +function print_errors(){ + check_errors(); +} + +function is_user_logged_in() { + if (isset($_SESSION["username"])) { + return true; + } else { + return false; + } +} \ No newline at end of file diff --git a/includes/chat_send_model.inc.php b/includes/chat_send_model.inc.php new file mode 100644 index 0000000..04af389 --- /dev/null +++ b/includes/chat_send_model.inc.php @@ -0,0 +1,49 @@ +prepare($query); + $stmt->bindParam(":username",$username); + $stmt->execute(); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + // True if something is found, false if not + return $result; +} + +function retrieve_user_id(object $pdo, string $username) { + $query = "SELECT id FROM users WHERE username = :username;"; + + // Prepare and check if user already exists + $stmt = $pdo->prepare($query); + $stmt->bindParam(":username",$username); + $stmt->execute(); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + // True if something is found, false if not + return $result["id"]; +} + +function write_message(object $pdo, string $username, int $users_id, string $content) { + $query = "INSERT INTO comments (username, users_id, content) VALUES (:username, :users_id, :content);"; + + $stmt = $pdo->prepare($query); + $stmt->bindParam(':username',$username); + $stmt->bindParam(':users_id',$users_id); + $stmt->bindParam(':content',$content); + $stmt->execute(); + + $stmt = null; + $query = null; +} \ No newline at end of file diff --git a/includes/chat_send_view.inc.php b/includes/chat_send_view.inc.php new file mode 100644 index 0000000..5ed5f39 --- /dev/null +++ b/includes/chat_send_view.inc.php @@ -0,0 +1,15 @@ + + > + + 1800, + 'domain' => 'ethernal.win', + 'path' => '/', + 'secure' => true, + 'httponly' => true +]); + +session_start(); + +if ( !isset($_SESSION["last_regen"]) ){ + session_regen(); + +} else { + $timeout_m = 60 * 30; // 30 minutes + if ((time() - $_SESSION["last_regen"]) > $timeout_m) { + session_regen(); + } +} + +function session_regen() { + session_regenerate_id(); + $_SESSION["last_regen"] = time(); +} \ No newline at end of file diff --git a/includes/error_handling.inc.php b/includes/error_handling.inc.php new file mode 100644 index 0000000..1e74f06 --- /dev/null +++ b/includes/error_handling.inc.php @@ -0,0 +1,16 @@ + $error_reading) { + ?> +
+

+ $_POST["username"], + "pwd" => $_POST["pwd"] + ]; + + try { + require_once "dbh.inc.php"; + require_once "login_model.inc.php"; + require_once "login_view.inc.php"; + require_once "login_contr.inc.php"; + + $errors = []; + + if (isEmpty($inputs)) { + $errors = ["null_field" => "Form contains blank characters."]; + } + + if (!does_user_exist($pdo, $inputs["username"])) { + $errors = ["incorrect_credentials" => "Incorrect credentials"]; + } else { + if (!does_Password_match($pdo, $inputs["username"], $inputs["pwd"])){ + $errors = ["incorrect_credentials" => "Incorrect credentials"]; + } + } + + require_once "config_session.inc.php"; + + if ($errors) { + + $_SESSION["errors"] = $errors; + + // Send back form + $entered_data = [ + "username" => $inputs["username"] + ]; + + $_SESSION["entered_login_data"] = $entered_data; + + header("Location: ../chat.php"); + + $inputs = null; + die(); + } + + $_SESSION["username"] = htmlspecialchars($inputs["username"]); + + $inputs = null; + header("Location: ../chat.php"); + die(); + + } catch (PDOException $e) { + echo "An error has ocurred: " . $e->getMessage(); + exit(); + } +} else { + echo("Wrong request type, please check your request."); + header("Location: ../chat.php"); + exit(); +} \ No newline at end of file diff --git a/includes/login_contr.inc.php b/includes/login_contr.inc.php new file mode 100644 index 0000000..812807c --- /dev/null +++ b/includes/login_contr.inc.php @@ -0,0 +1,42 @@ + $content) { + if (empty($content)){ + return true; + } else { + return false; + } + } +} + +function does_Password_match(object $pdo, string $username, string $pwd) { + // Get hashed password from db + function get_hashed_password(object $pdo, string $username) { + $stored_pwd = retrieve_hashed_pwd($pdo, $username); + + return $stored_pwd; + } + + $stored_pwd = get_hashed_password($pdo, $username); + + if (password_verify($pwd,$stored_pwd)) { + return true; + } else { + return false; + } +} + +function does_user_exist(object $pdo, string $username){ + if (search_user($pdo, $username)){ + return true; + } else { + return false; + } +} + +function print_errors(){ + check_errors(); +} \ No newline at end of file diff --git a/includes/login_model.inc.php b/includes/login_model.inc.php new file mode 100644 index 0000000..d5f7a2b --- /dev/null +++ b/includes/login_model.inc.php @@ -0,0 +1,34 @@ +prepare($query); + $stmt->bindParam(":username",$username); + $stmt->execute(); + + $hashed_pwd = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + return $hashed_pwd["pwd"]; +} + +function search_user(object $pdo, string $username) { + $query = "SELECT * FROM users WHERE username = :username;"; + + $stmt = $pdo->prepare($query); + $stmt->bindParam(":username",$username); + $stmt->execute(); + + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + return $result; + +} \ No newline at end of file diff --git a/includes/login_view.inc.php b/includes/login_view.inc.php new file mode 100644 index 0000000..174d7fd --- /dev/null +++ b/includes/login_view.inc.php @@ -0,0 +1,3 @@ +$_POST["username"],"pwd"=>$_POST["pwd"]]; + + try { + require_once "dbh.inc.php"; + require_once "register_model.inc.php"; + require_once "register_view.inc.php"; + require_once "register_contr.inc.php"; + + // Error handlers + $errors = []; + if (isEmpty($inputs)) { + $errors = ["null_field" => "Form contains blank characters."]; + } + if (username_taken($pdo, $inputs["username"])) { + $errors = ["username_taken" => "Username alredy taken"]; + } + + require_once "config_session.inc.php"; + + if ($errors) { + $_SESSION["errors"] = $errors; + + // Send back form + $entered_data = [ + "username" => $inputs["username"] + ]; + + $_SESSION["entered_register_data"] = $entered_data; + + header("Location: ../chat.php"); + $inputs = null; + die(); + } + + user_register($pdo, $inputs["username"], $inputs["pwd"]); + + header("Location: ../chat.php"); + $inputs = null; + die(); + } catch (PDOException $e) { + echo "An error has ocurred: " . $e->getMessage(); + exit(); + } + +} else { + echo "Wrong request type, please check your request."; + exit(); +} \ No newline at end of file diff --git a/includes/register_contr.inc.php b/includes/register_contr.inc.php new file mode 100644 index 0000000..375c968 --- /dev/null +++ b/includes/register_contr.inc.php @@ -0,0 +1,34 @@ + $content) { + if (empty($content)){ + return true; + } else { + return false; + } + } +} + +function username_taken(object $pdo, string $username){ + if (username_search($pdo, $username)) { + return true; + } else { + return false; + } +} + +function hash_password(string $pwd) { + $hashed_pw = password_hash($pwd,PASSWORD_BCRYPT,["cost"=>12]); + return $hashed_pw; +} + +function user_register(object $pdo, string $username, string $pwd) { + user_write($pdo, $username, hash_password($pwd)); +} + +function print_errors(){ + check_errors(); +} \ No newline at end of file diff --git a/includes/register_model.inc.php b/includes/register_model.inc.php new file mode 100644 index 0000000..94e10be --- /dev/null +++ b/includes/register_model.inc.php @@ -0,0 +1,31 @@ +prepare($query); + $stmt->bindParam(":username",$username); + $stmt->execute(); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = null; + $query = null; + + // True if something is found, false if not + return $result; +} + +function user_write(object $pdo, string $username, string $pwd) { + $query = "INSERT INTO users (username, pwd) VALUES (:username, :pwd)"; + + $stmt = $pdo->prepare($query); + $stmt->bindParam(":username",$username); + $stmt->bindParam(":pwd",$pwd); + $stmt->execute(); + + $stmt = null; + $query = null; +} \ No newline at end of file diff --git a/includes/register_view.inc.php b/includes/register_view.inc.php new file mode 100644 index 0000000..6155976 --- /dev/null +++ b/includes/register_view.inc.php @@ -0,0 +1,17 @@ + + > + + + + + + + + + + masiv's lair + + + + + + +
+
+
+ try hovering! + try tapping! + +
+
+ +
+
+
+
+ services +
+
+
+ +

Some may require an account! Invitation only.

+
+
+
+ masivana + Movies + Requests + Books + Videos +
+
+ cloud(s) + Photos + Cloud +
+ +
+
+
+
+
+ updates!  +
+
+ +
+
+
+
+
+
+ chat +
+
+ + + +
+ +
+ +
+ + + +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+ try sliding down! +
+
+
+ + + + + diff --git a/main_es.html b/main_es.html new file mode 100644 index 0000000..9160416 --- /dev/null +++ b/main_es.html @@ -0,0 +1,357 @@ + + + + + + masiv's lair + + + + + + +
+
+
+ apoya el cursor! + mantén presionado! +
+
+
+ + + + + + + + + + +
+
+
+ + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+
+ servicios +
+
+
+ +

Algunos requieren una cuenta, sólo por invitación!

+
+
+
+ masivana + Peliculas + Peticiones + Libros + Videos +
+
+ nube(s) + Fotos + Nube +
+ +
+
+
+
+
+ actualizaciones!  +
+
+
+
+
2 Feb 2026
+

Rediseño del sitio!

+

Después de un tiempo decidí darle una + nueva cara al sitio ya que el diseño anterior dejaba + bastante que desear, espero que sea de su agrado! + (Optimizado para todo tipo de dispositivos) Para más + información + Rediseño de la página + Archived version +

+
+
+
+
17 Ene 2026
+

Nuevo sitio web!

+

Nuevo sitio web! Espero les guste, desde ya hacía + tiempo que quería tener mi propio sitio web, pero programado desde + cero, estuve unas horitas re-aprendiendo html y css, sinceramente + prefiero un internet sin bloat, por lo que a-priori no habrá javascript + en este sitio.

+
+
+
+
+
+
+
+
+ chat +
+
+ + + + + +
+ todavía no hay chats! +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+ the top of a fuzzy, 
+                                black sphere with two arrows rising from it, one curving to the left, one to the right. across the bulk of the sphere it reads NO AI / WEBRING in squiggly, 
+                                uneven letters and next to those words is a small question mark +
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+
+
+ + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+

hola terrícolas, este es un mensaje para todxs aquellxs que pasan el día preguntándose si existe la vida extra-terrestre, o si por el contrario ustedes están solxs. Supongo que nunca lo sabrán...

+

hola terrícolas, este es un mensaje para todxs aquellxs que pasan el día preguntándose si existe la vida extra-terrestre, o si por el contrario ustedes están solxs. Supongo que nunca lo sabrán...

+
+
+
+
+
+
+ try sliding down! +
+
+
+ + + + + + diff --git a/pages/articles/about-host_en.html b/pages/articles/about-host_en.html new file mode 100644 index 0000000..b36630a --- /dev/null +++ b/pages/articles/about-host_en.html @@ -0,0 +1,168 @@ + + + + + + masiv's lair | About this hosting + + + + + + +
+
+
+

+ Hello,

+ + You clicking this article means you have an interest on how this + website is structured, and what infrastructure it runs in. + I've gotta say this will probably change over time, but there is one + aspect I will adhere to, mantaining custody over my own data, in practice + that means everything I host will be hosted on-site on my own infrastructure, + just below a little about the homelab's history and some details.
+

+

Specs

+
+

+ CPU: AMD Ryzen 5 4600G
+ RAM: 32GB DDR4 3200MHZ
+ Motherboard: ASRock A320M-HDV 4.0
+ PSU: EVGA 450W 80plus
+ Storage:
+ x1 1TB SSD NVME Samsung 970 Plus + x2 3TB HDD WD Green (RAID 1) + Case: No-name brand, + quite square-ish.
+

+
+

History

+

+ Each one of the components has a different origin, the case, psu and motherboard + have always been the same since the begining, part of the original PC I got as + a birthday present a while back, it was equiped with 8gb of ram, a modest HDD, + together with an AMD Ryzen 3 3200G, it was enough back then, but just as it came, + I got myself a brand new laptop, somewhat comparable (or even better) to the pc, + I ended up using it way more, thanks to it being portable. +

+

+ After some time, can't quite remember the reason, I took the decision to move it to its + current location, a secure place with a good broadband connection, this was all the way + back at the start of 2022, when I installed Ubuntu Server 22.04 LTS. +

+

+ I graudually updated it, I got the current proccesor over on amazon, then the ram + (attempted to purchase it from Aliexpress, but once it arrived I discovered it + wasn't compatible, had to re-sell it, and buy my current 2x16gb kit), and last but + not least, two 3tb disks which I thought was plenty for my usecase (foreshadowing). +

+

+ I currently still have the same Ubuntu Server install on bare hardware, and almost + every single service I host is using a docker container, managed using Portainer. +

+

Networking

+

Domain name

+

+ I've used several domain names over time, starting with No-IP to ssh remotely, rapidely migrating + to DuckDNS, that setup endured quite a while but after having some problems with DNS resolution, and + limitations on their DNS capabilities (they used AWS) thanks to my sub-domain repertoire I + decided to finally make the leap and purchase my own domain on some of the internet's registrars, + ended up with this domain on Porkbun, for a measly 5 dollars and a half, a lot /s. +

+

Proxy & DDNS

+

+ I use NginxProxyManager to manage all my domains and redirects, I don't plan on migrating to + Traefik for now because NPM does the job, and increasing my infrastructure's complexity isn't my + number one priority, maybe in the future. For Dynamic DNS I use DDClient, my ISP (Antel) doesn't + provide static IPs to residential addresses, so I'm stuck having to update my registers once or + twice a day in-leiu of having a fixed one. +

+
+
+
+ + + + + diff --git a/pages/articles/about-host_es.html b/pages/articles/about-host_es.html new file mode 100644 index 0000000..95c6678 --- /dev/null +++ b/pages/articles/about-host_es.html @@ -0,0 +1,172 @@ + + + + + + masiv's lair | About this hosting + + + + + + +
+
+
+

+ Buenas,

+ + Si estás leyendo esto es que te interesa saber un poco sobre la estructura + en la que están hosteados mis servicios, y esta página. + He de decir que esto irá cambiando, pero si hay algo que no creo cambie + será el hecho de que quiero mantener la custodia de mis datos, por lo que + todos lo que hostee será hosteado en mi propio homelab, debajo detalles e historia.
+

+

Especificaciones

+
+

+ Procesador: AMD Ryzen 5 4600G
+ RAM: 32GB DDR4 3200MHZ
+ Placa: ASRock A320M-HDV 4.0
+ PSU: EVGA 450W 80plus
+ Almacenamiento:
+ x1 1TB SSD NVME Samsung 970 Plus + x2 3TB HDD WD Green (RAID 1) + Gabinete: Marca genérica,
+ es bastante cuadrado. +

+
+

Historia

+

+ Cada componente tiene una historia un poquito diferente, el gabinete, + fuente y placa madre han sido la misma, y fueron un regalo de cumpleaños + de hace tiempo, en su momento con 8gb de ram, un disco HDD modesto, y + un AMD Ryzen 3 3200G, en su momento era algo, mas justo coincidió que + en esa ocasión, había recibido una laptop, a la cual le terminé dando + muchísimo más uso que a la torre, sumado al hecho de poderla transportarla + que personalmente me fue un gran plus. +

+

+ Tiempo después, ya no recuerdo bien en qué contexto, decido llevarla al + lugar dónde ahora se encuentra, dónde estaba segura y con una buena conexión + de fibra óptica, esto fue por 2022, cuándo le instalé Ubuntu Server 22.04 LTS. +

+

+ Gradualmente la fui mejorando, le compré su procesador actual por internet, luego + la memoria ram (intenté comprarla por Aliexpress, pero resultaba era incompatible, + por lo que tuve que revenderla, y comprarme los dos sticks de 16gb que tengo ahora), + y por último la decisión de comprar dos discos de 3tb para tener almacenamiento de + sobra (que resulta no lo fue) para lo que quisiese. +

+

+ Actualmente sigo teniendo instalado el Ubuntu directo sobre el hardware, y casi todo + lo que tengo instalado allí lo manejo usando Docker a través de Portainer. +

+

Red

+

Dominio

+

+ He usado varios dominios, al principio llegué a usar No-IP para conectarme remotamente, + para luego rápidamente migrar a DuckDNS, que me supo proveer de dominios gratuitos por varios años, + sin embargo, luego de toparme con las limitaciones de su servicio (por la cantidad de sub-dominios, + y debido a su dependendencia en servidores de no tan buena calidad de AWS) decidí invertir y + comprarme el dominio que estoy usando actualmente, con el registrante de Porkbun, que + debo decir fue muy económico, actualmente pago unos 5 dólares y medios al año, básicamente nada. +

+

Proxy y DDNS

+

+ Para manejar los dominios y redirecciones he usado y seguiré usando NginxProxyManager, por ahora + no tengo planeado migrar a Traefik puesto que no está dentro de mis prioridades añadir + esa complejidad a mi setup (aunque quizás en un futuro lo haga). Uso DDClient para el DNS dinámico + puesto que mi ISP (Antel) no provee IP fijas a planes residenciales, y necesito actualizar los + registros con mi IP cada vez que esta cambia. +

+ + +
+
+
+ + + + + diff --git a/pages/articles/about_en.html b/pages/articles/about_en.html new file mode 100644 index 0000000..82a0e84 --- /dev/null +++ b/pages/articles/about_en.html @@ -0,0 +1,104 @@ + + + + + + masiv's lair | About me + + + + + + +
+
+
+ Still under construction. +
+
+
+ + + + + diff --git a/pages/articles/about_es.html b/pages/articles/about_es.html new file mode 100644 index 0000000..e7b3224 --- /dev/null +++ b/pages/articles/about_es.html @@ -0,0 +1,104 @@ + + + + + + masiv's lair | Sobre mí + + + + + + +
+
+
+ Todavía en progreso. +
+
+
+ + + + + diff --git a/pages/articles/article-blank_en.html b/pages/articles/article-blank_en.html new file mode 100644 index 0000000..059975d --- /dev/null +++ b/pages/articles/article-blank_en.html @@ -0,0 +1,169 @@ + + + + + + masiv's lair | [REPLACE] + + + + + + +
+
+
+

+ Hello,

+ + You clicking this article means you have an interest on how this + website is structured, and what infrastructure it runs in. + I've gotta say this will probably change over time, but there is one + aspect I will adhere to, mantaining custody over my own data, in practice + that means everything I host will be hosted on-site on my own infrastructure, + just below a little about the homelab's history and some details.
+

+

Specs

+
+

+ CPU: AMD Ryzen 5 4600G
+ RAM: 32GB DDR4 3200MHZ
+ Motherboard: ASRock A320M-HDV 4.0
+ PSU: EVGA 450W 80plus
+ Storage:
+ x1 1TB SSD NVME Samsung 970 Plus + x2 3TB HDD WD Green (RAID 1) + Case: No-name brand, + quite square-ish.
+

+
+

History

+

+ Each one of the components has a different origin, the case, psu and motherboard + have always been the same since the begining, part of the original PC I got as + a birthday present a while back, it was equiped with 8gb of ram, a modest HDD, + together with an AMD Ryzen 3 3200G, it was enough back then, but just as it came, + I got myself a brand new laptop, somewhat comparable (or even better) to the pc, + I ended up using it way more, thanks to it being portable. +

+

+ After some time, can't quite remember the reason, I took the decision to move it to its + current location, a secure place with a good broadband connection, this was all the way + back at the start of 2022, when I installed Ubuntu Server 22.04 LTS. +

+

+ I graudually updated it, I got the current proccesor over on amazon, then the ram + (attempted to purchase it from Aliexpress, but once it arrived I discovered it + wasn't compatible, had to re-sell it, and buy my current 2x16gb kit), and last but + not least, two 3tb disks which I thought was plenty for my usecase (foreshadowing). +

+

+ I currently still have the same Ubuntu Server install on bare hardware, and almost + every single service I host is using a docker container, managed using Portainer. +

+

Networking

+

Domain name

+

+ I've used several domain names over time, starting with No-IP to ssh remotely, rapidely migrating + to DuckDNS, that setup endured quite a while but after having some problems with DNS resolution, and + limitations on their DNS capabilities (they used AWS) thanks to my sub-domain repertoire I + decided to finally make the leap and purchase my own domain on some of the internet's registrars, + ended up with this domain on Porkbun, for a measly 5 dollars and a half, a lot /s. +

+

Proxy & DDNS

+

+ I use NginxProxyManager to manage all my domains and redirects, I don't plan on migrating to + Traefik for now because NPM does the job, and increasing my infrastructure's complexity isn't my + number one priority, maybe in the future. For Dynamic DNS I use DDClient, my ISP (Antel) doesn't + provide static IPs to residential addresses, so I'm stuck having to update my registers once or + twice a day in-leiu of having a fixed one. +

+ +
+
+
+ + + + + diff --git a/pages/articles/article-blank_es.html b/pages/articles/article-blank_es.html new file mode 100644 index 0000000..69b1b74 --- /dev/null +++ b/pages/articles/article-blank_es.html @@ -0,0 +1,104 @@ + + + + + + masiv's lair | [REPLACE] + + + + + + +
+
+
+ +
+
+
+ + + + + diff --git a/pages/articles/diy-calculator_en.html b/pages/articles/diy-calculator_en.html new file mode 100644 index 0000000..ed0b0cf --- /dev/null +++ b/pages/articles/diy-calculator_en.html @@ -0,0 +1,178 @@ + + + + + + masiv's lair | Calculator + + + + + + + +
+
+
+
+

Calculator

+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+

About this project

+

+ It has certainly been a while since I've touched Javascript, + and I wanted to regain some of the know-how I had about it, + that's why decided to code this calculator from scratch + without using any external libraries, nor chatbots, only + wikis like w3 school about the language itself even if + that required more time. +

+

+ So it began my learning journey, coding this entire calculator + has been quite a joy I must say, and even if the final product + is lacking some funcionality like parenthesis parsing it still + works completely fine for most things, as it process inputs using + PEMDAS. +

+

+ Were I to make it all over again, I would probably go about + things differently, researching about more efficient algorithms + and methods and not reinventing the wheel, but the thing is, + that's the entire point of this excersice, wasn't for that + self-impossed limitation, I could make use of tons of more + efficient libraries. +

+

+ Now about the inner workings of the script, I implemented a + simple array that stores every character typed, and once the + equal key is pressed, it sends the array to be processed in + the following steps: + Concatenate the digits, from [1,1,'+',2,3] to [11,'+',23]. + Search for term separators, and create multidimensional arrays with + each level representing one type of operation. + + Undo all this array but backwards, processing the output as it goes. + + It looks easy on paper, but I spent an entire day and a half coding and dealing with + each aspect of programming, things I didn't quite remember, others I didn't know from + the get-go, etc. (I must add a personal rant about how difficult is dealing with + multidimensional arrays, it's not a trivial task for sure). +

+

+ Update 23/01/2026
+ I showed my calculator to a friend of mine and they + pointed out I was lacking a 0 button, how could I miss + that, seriously XD. +

+
+
+
+
+ + + + diff --git a/pages/articles/diy-calculator_es.html b/pages/articles/diy-calculator_es.html new file mode 100644 index 0000000..9048de8 --- /dev/null +++ b/pages/articles/diy-calculator_es.html @@ -0,0 +1,175 @@ + + + + + + masiv's lair | Calculadora + + + + + + + +
+
+
+
+

Calculadora

+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+

Sobre este projecto

+

+ Hace tiempo que no programaba en Javascript, y quería + nuevamente agarrarle la mano, por lo que decidí hacer esta + calculadora sin hacer uso de absolutamente nada más que + w3 school y algunas búsquedas sobre javascript, nada de + preguntar mis dudas a ninguna IA (aunque sea más lento). +

+

+ Así que me puse manos a la obra re-aprendiendo algunas cosas, + he de decir que fue un ejercicio divertido, y aunque el + resultado carece de algunas características (cómo el uso + de paréntesis), sigue el orden de las operaciones, y eso + es bastante. +

+

+ En un futuro si la hiciese nuevamente, podría implementar + algoritmos más eficientes, puesto que realmente lo hice de + la manera que se me fue ocurriendo, y realmente debe ser muy + ineficiente, si quisiese eficiencia tendría mil maneras y + librerías, pero el objetivo de este ejercicio es aprender. +

+

+ Yendo un poco más a lo técnico, mi idea principal fue almacenar + cada caracter escrito en un array, y luego procesarlo de la + siguiente manera: + Unir los números, de [1,1,'+',2,3] a [11,'+',23]. + Buscar dónde están los separa términos, e ir creando arrays + multidimensionales, cada nivel tiene un tipo de operación (on orden). + + Deshacer ese array multidimensional, e ir procesando + todas las operaciones. + + Dicho así parece sencillo, pero esutve un día y medio programando y lidiando + con cosas que, o no sabía, o no recordaba. (He de decir que trabajar con tanta iteración + en los arrays multidimensionales es un trabajo no trivial). +

+

+ Actualización 23/01/2026
+ Le mostré la calcualdora a unx amigx, y me hizo darme + cuenta de que no había implementado el botón del 0, + la verdad no tengo ni idea cómo no me di cuenta XD. +

+
+
+
+
+ + + +