Compare commits

..

2 Commits

Author SHA1 Message Date
fatmeat
b738eea749 need to add tos 2025-06-15 09:12:09 +02:00
fatmeat
ef482434f9 wip pls don't push this 2025-06-14 08:51:43 +02:00
32 changed files with 618 additions and 1230 deletions

View File

@ -9,5 +9,9 @@ ___
## Site
https://neocities.org
https://lazer-bunny.neocities.org/
https://faeraphim.net/main/index.htm
https://lilithdev.neocities.org/
<a href="https://july.lol"><img src="https://july.lol/img/lonelyjulybutton.gif" alt="july.lol"></a>
___

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,154 +0,0 @@
body {
margin: 0;
font-family: 'Orbitron', sans-serif;
color: var(--text-color);
background: var(--background-color);
overflow-x: hidden;
}
body::before {
content: "";
position: fixed;
top: 0; left: 0;
width: 100%;
height: 100%;
z-index: 2;
pointer-events: none;
background: url('/assets/RpdC.gif') repeat;
opacity: 0.05;
mix-blend-mode: screen;
}
body::after {
content: "";
position: fixed;
top: 0; left: 0;
width: 100%;
height: 100%;
z-index: 1;
pointer-events: none;
background: repeating-linear-gradient(
0deg,
--scanline-color 0px,
--scanline-color 1px,
transparent 1px,
transparent 4px
);
animation: scanlines 0.1s linear infinite;
}
main section h2 {
color: var(--terminal-border);
text-shadow: 0 0 5px var(--terminal-border);
margin-top: 2rem;
text-align: center;
}
h3 {
text-align: center;
}
.foreground-container {
max-width: 960px;
min-height: 720px;
margin: 0 auto;
background-color: rgba(0, 0, 0, 0.85);
box-shadow: 0 0 20px var(--secondary-color);
padding: 2rem;
position: relative;
z-index: 1;
border-radius: 2% / 1.5%;
box-shadow: 0 0 40px var(--glow-color), inset 0 0 20px rgba(0, 255, 255, 0.1);
}
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: rgba(0, 0, 0, 0.8);
border-bottom: 2px solid var(--secondary-color);
}
header h1 {
font-size: 2rem;
color: var(--secondary-color);
text-shadow: 0 0 5px var(--secondary-color);
}
nav ul {
display: flex;
flex-wrap: wrap;
gap: 1rem;
list-style: none;
}
nav ul li a {
text-decoration: none;
color: var(--primary-color);
padding: 0.5rem 1rem;
border: 1px solid var(--primary-color);
border-radius: 4px;
text-shadow: 0 0 3px var(--primary-color);
}
nav ul li a:hover {
background: var(--primary-color);
color: var(--background-color);
}
.footer-container {
max-width: 960px;
margin: 0 auto;
background-color: rgba(0, 0, 0, 0.85);
box-shadow: 0 0 20px var(--secondary-color);
padding: 2rem;
position: relative;
z-index: 1;
border-radius: 2% / 1.5%;
box-shadow: 0 0 40px var(--glow-color), inset 0 0 20px rgba(0, 255, 255, 0.1);
text-align: center;
}
ul a {
text-decoration: none;
padding: 0.5rem 1rem;
border: 1px solid var(--primary-color);
border-radius: 2px;
color: var(--primary-color);
text-shadow: 0 0 3px var(--primary-color);
}
ul a:hover {
background: var(--primary-color);
color: var(--background-color);
}
ul {
display: flex;
flex-wrap: wrap;
gap: 1rem;
list-style: none;
}
#repo-list {
display: flex;
gap: 1em;
flex-direction: column;
flex-wrap: nowrap;
list-style: none;
}
#docs-list {
display: flex;
gap: 1em;
flex-direction: column;
flex-wrap: nowrap;
list-style: none;
}
footer a {
text-decoration: none;
color: var(--primary-color);
text-shadow: 0 0 3px var(--primary-color);
}

View File

@ -1,103 +0,0 @@
:root {
--primary-color: #00ffff;
--secondary-color: #ff00ff;
--background-color: #0d0d0d;
--text-color: #f0f0f0;
--overlay-background: rgba(0, 0, 0, 0.85);
--button-background: #ff00ff;
--button-hover-background: #00ffff;
--scanline-color: rgba(255, 255, 255, 0.05);
--glow-color: rgba(0, 255, 255, 0.3);
--terminal-background: rgba(0, 0, 0, 0.9);
--terminal-border: #ff00ff;
--border-radius: 1.5%;
}
/*
effect
*/
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes scanlines {
0% { transform: translateY(0); }
50% { transform: translateY(-2px); }
100% { transform: translateY(0); }
}
@keyframes vhs-static {
0% { transform: translate(0, 0); }
25% { transform: translate(-1px, 1px); }
50% { transform: translate(1px, -0.5px); }
75% { transform: translate(-0.5px, 0.5px); }
100% { transform: translate(0.5px, -1px); }
}
@keyframes flicker {
0%, 100% { opacity: 0.8; }
50% { opacity: 1; }
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.75; }
}
@keyframes rgb-split {
0%, 100% {
transform: translate(0px, 0px);
}
50% {
transform: translate(-0.5px, 0.5px);
}
}
.fade-in {
animation: fadeIn 0.5s ease-out forwards;
}
.hidden {
display: none;
}
.crt-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
pointer-events: none;
z-index: -1;
mix-blend-mode: screen;
animation: flicker 0.5s infinite;
border-radius: var(--border-radius);
box-shadow: inset 0 0 40px var(--glow-color);
}
.grid-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: repeating-linear-gradient(
to right,
rgba(0, 255, 255, 0.1) 0px,
rgba(0, 255, 255, 0.1) 1px,
transparent 1px,
transparent 40px
), repeating-linear-gradient(
to bottom,
rgba(0, 255, 255, 0.1) 0px,
rgba(0, 255, 255, 0.1) 1px,
transparent 1px,
transparent 40px
);
background-color: var(--background-color);
z-index: -4;
}

View File

@ -1,60 +0,0 @@
#loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgb(0, 0, 0);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
cursor: pointer;
pointer-events: all; /* Ensure the user can click on the loading screen */
z-index: 9999;
mix-blend-mode: screen;
box-shadow: inset 0 0 20px rgba(255, 255, 255, 0.15);
animation: flicker 3.0s infinite;
}
#loading-screen::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('/assets/RpdC.gif') repeat;
opacity: 0.05;
mix-blend-mode: screen;
z-index: -1;
}
#loading-screen::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: repeating-linear-gradient(
0deg,
rgba(255, 255, 255, 0.05) 0px,
rgba(255, 255, 255, 0.05) 1px,
transparent 1px,
transparent 4px
);
animation: scanlines 0.1s linear infinite;
z-index: -2;
}
.loading-text {
color: var(--primary-color);
font-family: 'Orbitron', sans-serif;
font-size: 2rem;
text-align: center;
text-shadow: 0 0 15px var(--primary-color), 0 0 30px var(--primary-color);
animation: pulse 1.5s infinite;
z-index: 10000;
cursor: pointer;
}

View File

@ -1,124 +0,0 @@
body {
--section-gap: 4rem;
margin: 0;
font-family: 'Iosevka SS14', monospace;
background-color: var(--background-color);
color: var(--text-color);
transition: background 0.3s, color 0.3s;
display: flex;
}
header {
background: #000;
padding: 1rem;
color: var(--text-color);
text-align: center;
position: sticky;
top: 0;
width: 100%;
z-index: 10;
box-shadow: 0 0 10px #0008;
display: flex;
align-items: center;
justify-content: space-around;
}
h1, h2, h3 {
color: var(--secondary-color);
}
header h1 {
margin: 0;
font-size: 1.5rem;
color: var(--secondary-color);
}
#searchInput {
display: block;
position: relative;
top: 100%;
right: 1rem;
padding: 0.5rem;
border: 1px solid var(--text-color);
z-index: 5;
width: 200px;
background: none;
color: var(--text-color);
}
.controls {
background: #111;
padding: 1rem;
border-top: 1px solid #333;
display: flex;
gap: 1rem;
justify-content: center;
}
.controls button {
background: none;
border: 1px solid var(--text-color);
color: var(--text-color);
padding: 0.5rem 1rem;
cursor: pointer;
}
main {
flex-grow: 1;
padding: 2rem;
}
.section {
padding-bottom: 2rem;
}
.section h2 {
color: var(--secondary-color);
font-size: 1.25rem;
cursor: pointer;
}
.section-content {
display: block;
margin-top: 1rem;
}
pre {
background: var(--overlay-background);
padding: 1rem;
overflow-x: auto;
}
code {
background: var(--overlay-background);
margin: 1rem 0;
white-space: pre-wrap;
color: var(--text-color);
}
a {
color: var(--primary-color);
}
footer {
display: flex;
align-items: center;
justify-content: space-around;
background: var(--overlay-background);
}
footer section{
position: relative;
display: block;
padding: 2em;
}
footer h4 {
text-align: center;
}
@media print {
.controls, #searchDropdown, #searchToggle {
display: none !important;
}
}

View File

@ -1,28 +0,0 @@
.terminal {
background: var(--terminal-background);
border: 2px solid var(--terminal-border);
padding: 2rem;
width: 300px;
margin: 2rem auto;
box-shadow: 0 0 10px var(--terminal-border);
}
.terminal input {
background: #1a1a1a;
border: 1px solid var(--primary-color);
color: var(--primary-color);
width: 100%;
padding: 0.5rem;
margin-bottom: 1rem;
font-family: monospace;
}
.terminal button {
background: var(--secondary-color);
border: none;
color: var(--background-color);
padding: 0.5rem 1rem;
cursor: pointer;
font-family: monospace;
text-shadow: 0 0 3px var(--secondary-color);
}

View File

@ -1,445 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../assets/IosevkaSS15-Regular.ttf" rel="stylesheet">
<link rel="stylesheet" href="../css/sterling.css">
<link rel="stylesheet" href="../css/global.css">
<script src="../js/sterling.js"></script>
<title>Sterling Documentation</title>
</head>
<body>
<div style="width:100%">
<header>
<h1>Sterling Documentation</h1>
<input type="text" id="searchInput" placeholder="Search..." oninput="filterContent()">
<div class="controls">
<!--<button onclick="toggleTheme()">Toggle Theme</button>-->
<button onclick="window.print()">Export to PDF</button>
<button onclick="downloadOfflineVersion()">Download Offline</button>
</div>
</header>
<main id="doc-content">
<p>Version: <code>0.1.0-alpha</code></p>
<h2>Preface</h2>
<p>"An Idiot admire complexity, a genius admire simplicity" <em>Terry A. Davis</em></p>
<p>"Master All, Ace One" <em>Boykisser</em></p>
<h2>Overview</h2>
<p>Sterling is a low-level, strongly typed, systems programming language designed for performance, ABI stability, C interoperability, and full control over memory and hardware. It supports metaprogramming, hot-reloading, inline and raw assembly, and is built for multi-file compilation. It also introduces memory safety primitives and modern low-abstraction control flow enhancements.</p>
<h3>This Document is a work in progress, features are not yet implemented and i use this as a design document to stay true to my vision</h3>
<h2>File Extensions <em>(subject to change)</em></h2>
<ul>
<li>Source files: <code>.stg</code></li>
<li>Header files: <code>.sth</code></li>
</ul>
<section class="section">
<h2>Function</h2>
<div class="section-content">
<h3>Qualifiers</h3>
<p>Every function must declare its linkage explicitly:</p>
<pre><code>
//globally visible, default linkage
static //translation unit-local only
inline //inline-only, no symbol emitted
asm //raw assembly function, globally visible
static_asm //raw assembly function, TU-local only
inline_asm //inline-only asm, no symbol emitted
async //for fiber (coroutine) ??
</code></pre>
<h3>Syntax</h3>
<p>All functions must explicitly declare their return type. The only exception is <code>void</code>, which may be omitted for brevity when no return value is intended.</p>
<pre><code>
u32 add(u32 a, u32 b) {
return (a + b);
}
inline u32 max(u32 a, u32 b) {
return ((a > b) ? a : b);
}
exit() {
// equivalent to void exit()
}
</code></pre>
<h3>Assembly</h3>
<p>Write raw x86_64 assembly using <code>fn_asm</code> or <code>fn_static_asm</code>. Symbol, section, and global declaration are implicit.(placeholder)</p>
<pre><code>
asm void* memset(void* dst, u8 value, u64 size) {
test rdx, rdx
je .done
mov rax, rsi
mov rdi, rdi
mov rcx, rdx
rep stosb
.done:
mov rax, rdi
ret
}
</code></pre>
</div>
</section>
<section class="section">
<h2>Syscalls</h2>
<div class="section-content">
<p>System calls are allowed via <code>fn_asm</code> or wrapped using concrete ABI-aware interfaces. Example: (placeholder)</p>
<pre><code>
asm void exit() {
mov rax, 60 ; syscall: exit
mov rdi, 0 ; exit code
syscall
ret
}
</code></pre>
</div>
</section>
<section class="section">
<h2>Register Access</h2>
<div class="section-content">
<p>Sterling exposes raw CPU registers as language-level primitives. This is intended for kernel, embedded, and runtime-critical tasks.</p>
<pre><code>
u64 get_rbp() {
return rbp;
}
void set_rsp(u64 val) {
rsp = val;
}
</code></pre>
<p>Supported registers: <code>rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8..r15</code>.</p>
</div>
</section>
<section class="section">
<h2>Types</h2>
<div class="section-content">
<pre><code>
i8, i16, i32, i64 // signed integers
u8, u16, u32, u64 // unsigned integers
f32, f64 // 32-bit and 64-bit IEEE floats
bool // 1-byte boolean, 0 or 1 only//maybe but not a fan of them
char // 1-byte character (UTF-8)
</code></pre>
<pre><code>
T* // Pointer to type T
ptr* // Special pointer with implicit coercion allowed
void* // Opaque pointer with explicit cast required
</code></pre>
<pre><code>
typedef struct {
u32 x = 5;
u32 y;
} vec2u;
vec2u a = {}; // x = 5, y = 0
vec2u b = {0}; // x = 0, y = 0
vec2u c; // x = 0, y = 0
</code></pre>
<pre><code>
u32 raw_val @raw; // raw_val = ? can be poopoo data
</code></pre>
</div>
</section>
<section class="section">
<h2>Memory Model</h2>
<div class="section-content">
<p>Manual memory management by default. Variables are zero-initialized unless marked <code>@raw</code>. All layout is predictable and cache-friendly. Custom allocators are encouraged.</p>
<ul>
<li><strong>Stack</strong>: locals</li>
<li><strong>Heap</strong>: explicit alloc/free</li>
<li><strong>Inline</strong>: structs passed by value</li>
</ul>
</div>
</section>
<!--<section class="section">
<h2 onclick="toggleSection(this)">Bitfields</h2>
<div class="section-content">
<pre><code>
typedef struct(bitfield) {
u8 field0 : 3;
u8 field1 : 5;
} Flags8;
</code></pre>
</div>
</section>-->
<section class="section">
<h2>Control Flow</h2>
<div class="section-content">
<h3>Loop</h3>
<p>Sterling introduces tagged loops and escape blocks for structured yet flat nested loop
behavior:</p>
<pre><code>
loop_outer: loop {
loop_inner: loop {
if (should_exit_inner()) break loop_inner;
if (should_exit_outer()) break loop_outer;
}
}
loop {
i32 i;//default init at 0
while() {
do
}
}
loop {
i32 i;
while() {
do
}
}
for_each (tmp : array(T)) {
}?
</code></pre>
<p>This allows control without stack-nesting or excessive flags.</p>
<h3>Branching</h3>
<p></p>
<pre><code>
u32 test(u32 x, u32 y) {
if (x == y) {
}
if (x == 0) {
}
if (y == 0) {
}
switch (data) {
(a) {
break;
}
(b) {
break;
}
default: {
break;
}
}
block search {
loop delta {
i32 i;
while() {
}
}
}
}
</code></pre>
</div>
</section>
<section class="section">
<h2>Dynamic Arrays with Aligned Layout</h2>
<div class="section-content">
<p>Runtime-initialized aligned linear arrays can be used to simulate array-of-array structures, where all memory layout is controlled explicitly with offsets:</p>
<pre><code>
struct ArrayView {
u8* data;
u32 stride;
u32 count;
};
</code></pre>
<p>Insertions and deletions move memory explicitly, re-aligning if needed.</p>
</div>
</section>
<section class="section">
<h2>Dynamic Linking</h2>
<div class="section-content">
<p>Sterling does not rely on dynamic linking by default. Static linking is favored for OS and runtime simplicity. Dynamic linking may be optionally implemented via host-defined facilities in the future.</p>
</div>
</section>
<section class="section">
<h2>Metaprogramming</h2>
<div class="section-content">
<p><em>also i am not thinking of having something as close as what jai have, if you want solid meta programming look out for when jai become open beta</em></p>
<h2>Metaprogramming</h2>
<p>Sterling supports compile-time metaprogramming via the <code>meta</code> keyword. Meta constructs are evaluated at compile time and allow structured code generation, reflection, and type introspection.</p>
<h3>Capabilities</h3>
<ul>
<li>Generate code at compile-time (functions, structs, constants)</li>
<li>Inspect type properties: size, alignment, fields</li>
<li>Enumerate over struct fields, enum variants, function parameters</li>
<li>Branch compile-time logic via <code>meta if</code>, <code>meta match</code></li>
<li>Define metafunctions using <code>meta fn</code> (not emitted at runtime)</li>
<li>Support platform/target-specific compilation logic</li>
</ul>
<h3>Restrictions</h3>
<ul>
<li>Meta code must be side-effect free (pure, deterministic)</li>
<li>No runtime reflection or dynamic codegen</li>
<li>No access to I/O, filesystem, or arbitrary memory</li>
<li>All meta-expansions must type-check</li>
<li>Expansion depth and iteration count are bounded</li>
</ul>
<h3>Example</h3>
<pre><code>
meta print_fields_of(T) {
for (field : fields(T)) {
print("Field: ", field.name, " of type ", field.type);
}
}
meta if sizeof(T) > 64 {
fn_inline void fast_copy(T* dst, T* src) { ... }
}
</code></pre>
<h3>Compiler Meta API (proposed)</h3>
<pre><code>
meta_typeof(expr)
meta_sizeof(T)
meta_alignof(T)
meta_fields_of(T)
meta_fn_params(fn)
meta_platform() // e.g., "linux", "windows"
meta_codegen(name, ast_block) // gated for advanced use
</code></pre>
</div>
</section>
<section class="section">
<h2>ABI and Interop</h2>
<div class="section-content">
<p><em>TODO: Specify ABI model (System V AMD64), calling convention details, struct/pointer representation rules. C interaction, emiting ELF/COFF/Mach-O symbol tables .o</em></p>
</div>
</section>
<section class="section">
<h2>Threading</h2>
<div class="section-content">
<p><em>TODO: Describe standard threading model, scheduler integration, context switching, green threads API.</em></p>
<h3>Fiber (Coroutine)</h3>
<p>Using user managed stack that is allocated (usefull for userland threading)</p>
<ul>
<li>Each <code>fiber</code> as:</li>
<ul>
<li>Its own manually allocated stack</li>
<li>Registers saved/restored on yield and resume</li>
<li>Tracked by a runtime scheduler (or user managed)</li>
</ul>
<li><code>fiber_yield()</code> triggers context switch, calling back into a fiber scheduler</li>
<li>Can be pooled, migrated between threads, or used for deterministic execution (e.g., game loops, scripting)</li>
</ul>
<h4>Internal Scheduler Model</h4>
<ul>
<li>A circular queue or priority queue of fiber_ids</li>
<li><code>fiber_yield()</code> pushes current fiber to back of queue</li>
<li><code>fiber_resume()</code> pulls next and switches context</li>
</ul>
<p>This allows async, non-blocking logic to be modeled without system threads.<p>
<h4>Safety and ABI Guarantees</h4>
<ul>
<li>define the fiber stack layout, allowing for precise control (great for embedded targets)</li>
<li><code>fiber_spawn</code> can return errors if stack is misaligned or exhausted</li>
<li>ABI guarantees for fiber functions: must follow a calling convention you define (e.g., preserved registers)</li>
<h3>Thread</h3>
<p></p>
<ul>
<li>Created via OS APIs (e.g., pthread, CreateThread, or syscall wrappers)</li>
<li>Each thread runs independently; shares global heap and data structures</li>
<li>You wrap OS threads and assign them entry points via thread_spawn</li>
</ul>
<h4>Thread Primitives</h4>
<pre><code>
thread_spawn(void fn() entry_fn) -> thread_id;
thread_join(thread_id tid);
thread_exit();
</code></pre>
<h4>Fiber Primitives</h4>
<pre><code>
typedef struct fiber {
void* stack;
u64 stack_size;
void* ip;//instruction pointer
u8 flag;
} fiber;
fiber_spawn(void fn() entry_fn) -> fiber_id;
fiber_yield();
fiber_resume(fiber_id id);
fiber_self() -> fiber_id;//could also be used instead of fork ex main process fibe_self = 0;
</code></pre>
<h4>Optional stack control:</h4>
<pre><code>
fiber_spawn_stack(void fn(), void* stack_ptr, u64 size);
</code></pre>
</div>
</section>
<section class="section">
<h2>Graphics and Rendering</h2>
<div class="section-content">
<p><em>TODO: Describe native rendering interface</em>I have been thinking about supporting amd gpu acceleration with very few set of actual call, very fewer than opengl or other, but i will focus only on one hardware at first</p>
</div>
</section>
<section class="section">
<h2>Build and Compilation Model</h2>
<div class="section-content">
<p><em>TODO: AOT compilation, linker behavior, multi-file project structure, module system (if any).</em></p>
</div>
</section>
<footer>
<p style="text-align: center;">Copyright @ 2025 <a href="mailto:dev@sleepeesoftware.fr">Sleepee Software</a><br>Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.<br>
Verbatim copying and redistribution of any of the photos in the photos subdirectory is permitted under the <a href="https://opensource.org/license/mit">MIT License</a></p>
</footer>
</div>
</body>
</html>

View File

@ -1,158 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../assets/IosevkaSS15-Regular.ttf" rel="stylesheet">
<link rel="stylesheet" href="../css/sterling.css">
<link rel="stylesheet" href="../css/global.css">
<script src="../js/sterling.js"></script>
<title>Sterling OS Design Document</title>
</head>
<body>
<div style="width:100%">
<header>
<h1>Sterling OS Design Document</h1>
<input type="text" id="searchInput" placeholder="Search..." oninput="filterContent()">
<div class="controls">
<!--<button onclick="toggleTheme()">Toggle Theme</button>-->
<button onclick="window.print()">Export to PDF</button>
<button onclick="downloadOfflineVersion()">Download Offline</button>
</div>
</header>
<main id="doc-content">
<h1>Minimal Capability-Based Operating System</h1>
<h2>Design Principles</h2>
<ul>
<li>No global filesystem, no path resolution</li>
<li>No drivers in kernel, only sandboxed userspace driver processes</li>
<li>No GPU acceleration, all rendering is deterministic software-based</li>
<li>All resources accessed via capability tokens</li>
<li>Processes are strictly sandboxed</li>
<li>Programs operate on memory buffers, not raw file handles</li>
<li>Desktop environment is a sandboxed coordinator, not a privileged process</li>
</ul>
<h2>Authorization Token Model</h2>
<p>Programs delegate access via opaque, kernel-managed tokens.</p>
<pre><code>grant_token(target_pid, resource_id, flags) -&gt; token_id
accept_token(token_id) -&gt; resource_handle
revoke_token(token_id)</code></pre>
<h2>File Editing Flow</h2>
<ol>
<li>DE requests file via storage service</li>
<li>Storage service provides a memory buffer</li>
<li>Editor process receives buffer handle, edits</li>
<li>Changes submitted back to storage via DE</li>
</ol>
<h2>Driver Model</h2>
<ul>
<li>All drivers run as fully unprivileged user processes</li>
<li>No driver registration or kernel mediation required</li>
<li>Drivers communicate with hardware via explicit kernel-exposed capability channels</li>
<li>No dynamic linking or privileged probing allowed</li>
<li>Users can run or replace any driver without OS permission</li>
</ul>
<h2>Graphics System</h2>
<ul>
<li>No GPU support, no shaders</li>
<li>Software renderer processes draw via shared memory</li>
<li>DE composites framebuffers deterministically</li>
</ul>
<h2>Programming Language Requirements</h2>
<ul>
<li>Manual memory management</li>
<li>Low-level data layout control</li>
<li>Inline assembly support</li>
<li>Pattern matching and compile-time macros</li>
<li>No runtime, no global init, no dynamic linking</li>
</ul>
<h2>Execution Model</h2>
<ul>
<li>Programs are spawned with exact buffer and token permissions</li>
<li>No shared global state</li>
<li>All IO is mediated via explicit capability-based services</li>
<li>Everything is inspectable and reproducible</li>
</ul>
<h2>Sandboxing Model</h2>
<p>All processes are isolated via strict memory boundaries and capability-scoped access. No process can access global state, shared memory, or system calls without explicit capability grants.</p>
<h3>Memory Layout</h3>
<pre class="diagram">
+-----------------------+
| Code (RX) |
+-----------------------+
| Data (RW) |
+-----------------------+
| Shared Buffers (RWX?) | ← only if explicitly mapped by kernel
+-----------------------+
| Stack (RW) |
+-----------------------+
</pre>
<h3>Process Launch</h3>
<ul>
<li>Preallocated memory map (no heap growth)</li>
<li>Passed a syscall pointer table, token list, and init buffer</li>
<li>Cannot request global system resources directly</li>
</ul>
<h3>Capability Enforcement</h3>
<p>All access is mediated via capability tokens, handed off securely:</p>
<pre><code>
token_id = request_token(pid, SERVICE_IO, READ_WRITE);
handle = accept_token(token_id);
</code></pre>
<ul>
<li>Token scope, rights, and duration enforced by kernel</li>
<li>No access without explicit grant</li>
<li>All capability use is auditable and revocable</li>
</ul>
<h3>Filesystem Abstraction</h3>
<ul>
<li>No global file system</li>
<li>Programs receive only memory buffers with scoped access</li>
<li>Read/write must go through kernel-mapped tokens</li>
</ul>
<h3>Driver Isolation</h3>
<ul>
<li>Drivers are userland processes only</li>
<li>No direct port I/O or DMA access</li>
<li>Hardware is accessed via kernel-exposed capability channels</li>
</ul>
<h3>IPC</h3>
<ul>
<li>All inter-process communication is routed via the kernel</li>
<li>Uses named ports and token-authenticated message queues</li>
<li>No shared memory by default</li>
</ul>
<h3>Future Additions</h3>
<ul>
<li>Deterministic scheduler</li>
<li>Audit trail of all token activity</li>
<li>Formal capability typing system</li>
</ul>
<h2>Philosophy</h2>
<p>This OS is not a POSIX clone. It is a deterministic, capability-secure, user-controlled computing environment built to reject legacy complexity and embrace verifiable simplicity.</p>
</main>
<footer>
<p style="text-align: center;">Copyright @ 2025 <a href="mailto:dev@sleepeesoftware.fr">Sleepee Software</a><br>Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.<br>
Verbatim copying and redistribution of any of the photos in the photos subdirectory is permitted under the <a href="https://opensource.org/license/mit">MIT License</a></p>
</footer>
</body>
</html>

View File

@ -0,0 +1 @@
<div class="content"></div>

View File

@ -1,26 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sleepee Software</title>
<!-- Google Font -->
<link href="../assets/IosevkaSS15-Regular.ttf" rel="stylesheet">
<!-- style --->
<link rel="stylesheet" href="css/global.css">
<link rel="stylesheet" href="css/base.css">
<!-- icon -->
<!--<link rel="icon" type="image/png" href="/assets/favicon-96x96.png" sizes="96x96" />-->
<link rel="icon" type="image/svg+xml" href="/assets/favicon.svg" />
<link rel="shortcut icon" href="/assets/favicon.ico" />
<link rel="manifest" href="/assets/site.webmanifest" />
</head>
<body>
<a href="http://localhost:8080/html/SterlingLang.html" class="card-body">
<h2 class="title">COUCOU</h2>
<p class="description">
test 32332323490838329ew0
</p>
</a>
</body>
</html>

View File

View File

@ -0,0 +1,7 @@
<!--
This page will be a way for the user to learn c from 0 (en utilisant des travaux diriges avec parfois des codes reviews sur discord).
-->
<section id="First Taste">
</section>

View File

@ -0,0 +1,3 @@
<body>
<div class="content"></div>

View File

@ -6,11 +6,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sleepee Software</title>
<!-- Google Font -->
<link href="../assets/IosevkaSS15-Regular.ttf" rel="stylesheet">
<link href="assets/IosevkaSS15-Regular.ttf" rel="stylesheet">
<!-- style --->
<link rel="stylesheet" href="css/global.css">
<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="css/loading_screen.css">
<link rel="stylesheet" href="style.css">
<!-- icon -->
<!--<link rel="icon" type="image/png" href="/assets/favicon-96x96.png" sizes="96x96" />-->
<link rel="icon" type="image/svg+xml" href="/assets/favicon.svg" />
@ -18,80 +16,265 @@
<link rel="manifest" href="/assets/site.webmanifest" />
</head>
<body>
<!--<div id="top"></div>
<div id="loading-screen">
<div class="loading-text">PRESS TO START</div>
</div>
<div class="grid-bg"></div>
<div class="crt-overlay"></div>
<div class="foreground-container hidden">
<header>
<h1 class="page">Sleepee Software</h1>
<nav><ul>
<li><a href="#" id="nav-landing">Home</a></li>
<li><a href="#" id="nav-project">Project</a></li>
<li><a href="#" id="nav-blog">Blog</a></li>
<li><a href="#" id="nav-chat">Chat</a></li>
<li><a href="#" id="nav-login">Login</a></li>
</ul></nav>
</header>
<div class="content">-->
<header>
<nav id="top-nav"><ul>
<img src="assets/cooltext484352697795184.png" style="max-width: 30%; height: auto;">
<li><a href="#" id="nav-landing">Home</a></li>
<li><a href="#" id="nav-blog">Blog</a></li>
<!--<li><a href="#" id="nav-forum">Chat</a></li>-->
<li><a href="#" id="nav-learn">Learn</a></li>
<li><a href="#" id="nav-shop">Shop</a></li>
<li><a href="#" id="nav-login">Login or Account</a></li>
</ul></nav>
</header>
<main id="main-content">
<section id="landing-section">
<h2>Welcome to Sleepee Software</h2>
<h3>Experience software in neon-lit glory !</h3>
<br>
<h2>Newsfeed</h2>
<div id="news-ticker">
<p>Nothing...</p>
<!-- TODO: fetch api for news -->
</div>
</section>
<main>
<section id="project-section" class="hidden">
<div id="card-container">
<h2>Projects</h2>
<div id="docs-list">
<li><a href="html/SterlingLang.html">Sterling Lang</a></li>
<li><a href="html/SterlingOsDesign.html">Sterling OS</a></li>
</div>
<div id="repo-list">
<p>Loading...</p>
</div>
</div>
</section>
<section id="container-aboutme">
<h1>About Me</h1>
<section id="Preambule">
<h1>Preambule</h1>
</section>
<br>
<section id="neuro">
<h2>Desordre Neurologique</h2>
<p>La section suivante sera sous forme de poeme afin d'essayer d'exterioriser mon ressentie</p>
<h3>TSA</h3>
<h3>TDA</h3>
<h3>HI</h3>
<h3>Depression</h3>
</section>
<br>
<section id="shitpost">
<h2>Shitpost</h2>
<h3>Vision sur l'Informatique</h3>
<h3>femboy</h3>
<p>Volibear UwU Daddy</p>
</section>
</section>
<!-- TODO: make login a popop that allow to use irc and blog -->
<section id="blog-section" class="hidden">
<h2>Studio Blog</h2>
<div id="posts">
<p>Coming soon...</p>
</div>
</section>
<section id="container-dev">
<h1>Projects</h1>
<section id="SterlingOs">
<h1>Sterling OS</h1>
<h3>Minimal Capability-Based Operating System</h3>
<h2>Design Principles</h2>
<ul>
<li>No global filesystem, no path resolution</li>
<li>No drivers in kernel, only sandboxed userspace driver processes</li>
<li>No GPU acceleration, all rendering is deterministic software-based</li>
<li>All resources accessed via capability tokens</li>
<li>Processes are strictly sandboxed</li>
<li>Programs operate on memory buffers, not raw file handles</li>
<li>Desktop environment is a sandboxed coordinator, not a privileged process</li>
</ul>
<section id="chat-section" class="hidden">
<h2>Community Chat</h2>
<div id="chat-window" class="terminal">
<p><em>IRC interface coming soon...</em></p>
</div>
</section>
<h2>Authorization Token Model</h2>
<p>Programs delegate access via opaque, kernel-managed tokens.</p>
<pre><code>
grant_token(target_pid, resource_id, flags) -&gt; token_id
accept_token(token_id) -&gt; resource_handle
revoke_token(token_id)
</code></pre>
<section id="login-section" class="hidden">
<div class="terminal">
<h2>Login</h2>
<form id="login-form">
<input type="text" placeholder="name" id="username" required>
<input type="password" placeholder="pwd" id="password" required>
<button type="submit">Enter</button>
</form>
</div>
</section>
</main>
</div>
<footer class="footer-container hidden">
<p style="text-align: center;">Copyright @ 2025 <a href="mailto:dev@sleepeesoftware.fr">Sleepee Software</a><br>Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.<br>
<h2>File Editing Flow</h2>
<ol>
<li>DE requests file via storage service</li>
<li>Storage service provides a memory buffer</li>
<li>Editor process receives buffer handle, edits</li>
<li>Changes submitted back to storage via DE</li>
</ol>
<h2>Driver Model</h2>
<ul>
<li>All drivers run as fully unprivileged user processes</li>
<li>No driver registration or kernel mediation required</li>
<li>Drivers communicate with hardware via explicit kernel-exposed capability channels</li>
<li>No dynamic linking or privileged probing allowed</li>
<li>Users can run or replace any driver without OS permission</li>
</ul>
<h2>Graphics System</h2>
<ul>
<li>No GPU support, no shaders</li>
<li>Software renderer processes draw via shared memory</li>
<li>DE composites framebuffers deterministically</li>
</ul>
<h2>Programming Language Requirements</h2>
<ul>
<li>Manual memory management</li>
<li>Low-level data layout control</li>
<li>Inline assembly support</li>
<li>Pattern matching and compile-time macros</li>
<li>No runtime, no global init, no dynamic linking</li>
</ul>
<h2>Execution Model</h2>
<ul>
<li>Programs are spawned with exact buffer and token permissions</li>
<li>No shared global state</li>
<li>All IO is mediated via explicit capability-based services</li>
<li>Everything is inspectable and reproducible</li>
</ul>
<h2>Sandboxing Model</h2>
<p>All processes are isolated via strict memory boundaries and capability-scoped access. No process can access global state, shared memory, or system calls without explicit capability grants.</p>
<h3>Memory Layout</h3>
<pre class="diagram">
+-----------------------+
| Code (RX) |
+-----------------------+
| Data (RW) |
+-----------------------+
| Shared Buffers (RWX?) | ← only if explicitly mapped by kernel
+-----------------------+
| Stack (RW) |
+-----------------------+
</pre>
<h3>Process Launch</h3>
<ul>
<li>Preallocated memory map (no heap growth)</li>
<li>Passed a syscall pointer table, token list, and init buffer</li>
<li>Cannot request global system resources directly</li>
</ul>
<h3>Capability Enforcement</h3>
<p>All access is mediated via capability tokens, handed off securely:</p>
<pre><code>
token_id = request_token(pid, SERVICE_IO, READ_WRITE);
handle = accept_token(token_id);
</code></pre>
<ul>
<li>Token scope, rights, and duration enforced by kernel</li>
<li>No access without explicit grant</li>
<li>All capability use is auditable and revocable</li>
</ul>
<h3>Filesystem Abstraction</h3>
<ul>
<li>No global file system</li>
<li>Programs receive only memory buffers with scoped access</li>
<li>Read/write must go through kernel-mapped tokens</li>
</ul>
<h3>Driver Isolation</h3>
<ul>
<li>Drivers are userland processes only</li>
<li>No direct port I/O or DMA access</li>
<li>Hardware is accessed via kernel-exposed capability channels</li>
</ul>
<h3>IPC</h3>
<ul>
<li>All inter-process communication is routed via the kernel</li>
<li>Uses named ports and token-authenticated message queues</li>
<li>No shared memory by default</li>
</ul>
<h3>Future Additions</h3>
<ul>
<li>Deterministic scheduler</li>
<li>Audit trail of all token activity</li>
<li>Formal capability typing system</li>
</ul>
<h2>Philosophy</h2>
<p>Not a POSIX clone. It is a deterministic, capability-secure, user-controlled computing environment built to reject legacy complexity and embrace verifiable simplicity.</p>
</section><br>
<section id="SterlingLang">
</section><br>
<section class="SleepeeLib">
</section><br>
<section class="Game Engine">
</section><br>
</section>
<section class="container">
<!-- make each project as a tab kinda like browser tab, and switch page on project select, that should allow to dowload page by page -->
<section id="Music">
</section>
<section id="Writing">
</section>
<section id="Drawing">
</section>
</section>
<section class="container">
<section id="Minecraft">
<h2>Minecraft</h2>
<h3>Mon Serveur</h3>
<p>tu dois te login pour te faire whitelist</p>
<h3>Modpack</h3>
<h3>Creative World</h3>
<!-- ajouter un caroussel avec chacun de mes mondes avec une popup descriptif et le lien -->
</section><br>
<section id="League of Legends">
<h2>League of Legends</h2>
<i>je ne suis pas joueur pro.</i><br>
<h3>Guide sur Yasuo</h3>
<h4>Les Combos</h4>
<h4>Build Actuel</h4>
<h4>Runes Actuel</h4>
<br>
<a href="https://www.youtube.com/playlist?list=PL0RgKOdYjzg_P5F88zNTydaJAFAm6LGM2">Playlist sur Youtube</a>
</section><br>
<section id="Dwarf Fortress">
<h2>Dwarf Fortress</h2>
<h3>Histoire de Mes Forteresse</h3>
</section><br>
<section id="Other">
</section>
</section>
</main>
<aside>
<nav>
<a href="#top">top</a>
<ul>
<a href="#Preambule">Preambule</a>
<a href="#neuro">Desordre Neurologique</a>
<a href="#shitpost">Shitpost</a>
</ul>
<a href="#container-dev">Project</a>
<ul>
<a href="#SterlingOs">Sterling Os</a>
</ul>
</nav>
</aside>
<footer>
<p>Copyright @ 2025 <a href="mailto:dev@sleepeesoftware.fr">Sleepee Software</a><br>Verbatim copying and redistribution of this entire page are permitted provided this notice is preserved.<br>
Verbatim copying and redistribution of any of the photos in the photos subdirectory is permitted under the <a href="https://opensource.org/license/mit">MIT License</a></p>
</footer>
<script src="js/index.js"></script>
<!--<script src="js/index.js"></script>-->
</body>
</html>

View File

@ -5,51 +5,9 @@ document.querySelectorAll('nav ul li a').forEach(link => {
document.querySelectorAll('main section').forEach(sec => sec.classList.add('hidden'));
const section = document.getElementById(target);
if (section) section.classList.remove('hidden');
if (target == 'project-section') load_card();
});
});
document.getElementById('login-form')?.addEventListener('submit', function(e) {
e.preventDefault();
const username = document.getElementById('username').value;
alert(`Logging in as ${username}...`);
// TODO: call backend API for authentication
});
function load_card() {
const docslist = document.getElementById("docs-list");
docslist.innerHTML = "";
const docsitem = document.createElement("div");
docsitem.innerHTML = `
<a class="card-body" href="html/SterlingLang.html" target="_blank">
<h2 class="card-title">Sterling Lang</h2>
<p class="card-description">Sterling Programming Langage</p>
</a>
<a class="card-body" href="html/SterlingOsDesign.html" target="_blank">
<h2 class="card-title">SterlingOs</h2>
<p class="card-description">Sterling Operating System Design Documents</p>
</a>`;
docslist.appendChild(docsitem);
fetch("/gitea-repos/")
.then(res => res.json())
.then(repos => {
const list = document.getElementById("repo-list");
list.innerHTML = ""; // Clear "Loading..."
repos.forEach(function(repo) {
const item = document.createElement("");
item.innerHTML = `
<strong><a class="card-body" href="${repo.html_url}" target="_blank">
<h2 class="card-title">${repo.name}</h2>
<p class="card-description">${repo.description || "No description"}</p>
</a>`;
list.appendChild(item);
});
})
.catch(err => console.error("Error fetching repos: ", err));
}
/*
onload
*/
@ -62,8 +20,29 @@ document.addEventListener("DOMContentLoaded", function() {
const container = document.querySelector(".foreground-container");
container.classList.remove("hidden");
container.classList.add("fade-in");
const footer = document.querySelector(".footer-container")
footer.classList.remove("hidden");
footer.classList.add("fade-in");
const container2 = document.querySelector(".navbar-container");
container2.classList.remove("hidden");
container2.classList.add("fade-in");
});
});
function filterContent() {
const query = document.getElementById('searchInput').value.toLowerCase();
document.querySelectorAll('.section').forEach(section => {
const text = section.innerText.toLowerCase();
section.style.display = text.includes(query) ? 'block' : 'none';
});
}
function downloadOfflineVersion() {
const blob = new Blob([document.documentElement.outerHTML], { type: 'text/html' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'SystemsLangDocumentation.html';
a.click();
}
function toggleSearch() {
const dropdown = document.getElementById('searchDropdown');
dropdown.style.display = dropdown.style.display === 'block' ? 'none' : 'block';
}

View File

@ -1,20 +0,0 @@
function filterContent() {
const query = document.getElementById('searchInput').value.toLowerCase();
document.querySelectorAll('.section').forEach(section => {
const text = section.innerText.toLowerCase();
section.style.display = text.includes(query) ? 'block' : 'none';
});
}
function downloadOfflineVersion() {
const blob = new Blob([document.documentElement.outerHTML], { type: 'text/html' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'SystemsLangDocumentation.html';
a.click();
}
function toggleSearch() {
const dropdown = document.getElementById('searchDropdown');
dropdown.style.display = dropdown.style.display === 'block' ? 'none' : 'block';
}

View File

@ -0,0 +1,39 @@
body {
font-family: sans-serif;
display: grid;
grid-template-columns: 1fr 3fr;
gap: 20px;
}
header, footer {
border-radius: 5px;
padding: 10px;
background-color: rebeccapurple;
color: whitesmoke;
text-align: center;
}
aside {
border-right: 1px solid rebeccapurple;
}
header {
grid-column: 1 / 3;
grid-row: 1;
}
main {
grid-column: 2;
grid-row: 2;
}
aside {
grid-column: 1;
grid-row: 2;
}
footer {
grid-column: 1 / 3;
grid-row: 3;
}

View File

@ -0,0 +1,290 @@
:root {
--primary-color: #00ffff;
--secondary-color: #ff00ff;
--background-color: #0d0d0d;
--text-color: #f0f0f0;
--overlay-background: rgba(0, 0, 0, 0.85);
--button-background: #ff00ff;
--button-hover-background: #00ffff;
--scanline-color: rgba(255, 255, 255, 0.05);
--glow-color: rgba(0, 255, 255, 0.3);
--terminal-background: rgba(0, 0, 0, 0.9);
--terminal-border: #ff00ff;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes scanlines {
0% { transform: translateY(0); }
50% { transform: translateY(-2px); }
100% { transform: translateY(0); }
}
@keyframes vhs-static {
0% { transform: translate(0, 0); }
25% { transform: translate(-1px, 1px); }
50% { transform: translate(1px, -0.5px); }
75% { transform: translate(-0.5px, 0.5px); }
100% { transform: translate(0.5px, -1px); }
}
@keyframes flicker {
0%, 100% { opacity: 0.8; }
50% { opacity: 1; }
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.75; }
}
@keyframes rgb-split {
0%, 100% {
transform: translate(0px, 0px);
}
50% {
transform: translate(-0.5px, 0.5px);
}
}
.fade-in {
animation: fadeIn 0.5s ease-out forwards;
}
.hidden {
display: none;
}
.crt-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
pointer-events: none;
z-index: -1;
mix-blend-mode: screen;
animation: flicker 1.5s infinite;
border-radius: var(--border-radius);
box-shadow: inset 0 0 40px var(--glow-color);
}
.grid-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: repeating-linear-gradient(
to right,
rgba(0, 255, 255, 0.1) 0px,
rgba(0, 255, 255, 0.1) 1px,
transparent 1px,
transparent 40px
), repeating-linear-gradient(
to bottom,
rgba(0, 255, 255, 0.1) 0px,
rgba(0, 255, 255, 0.1) 1px,
transparent 1px,
transparent 40px
);
background-color: var(--background-color);
z-index: -4;
}
#top-nav {
max-width: 960px;
margin: 0 auto;
padding: 2rem;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: rgba(0, 0, 0, 0.8);
border-bottom: 2px solid var(--secondary-color);
z-index: 1;
}
#left-nav {
position: fixed;
top: 96px;
left: 0;
width: 200px;
height: auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
padding: 1rem;
background: rgba(0, 0, 0, 0.85);
border-right: 2px solid var(--primary-color);
z-index: 5;
overflow-y: auto;
}
#right-nav {
position: fixed;
top: 96px;
right: 0;
width: 200px;
height: auto;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-end;
padding: 1rem;
background: rgba(0, 0, 0, 0.85);
border-left: 2px solid var(--primary-color);
z-index: 5;
overflow-y: auto;
}
nav ul {
display: flex;
flex-wrap: wrap;
gap: 1rem;
list-style: none;
}
nav ul li a {
text-decoration: none;
color: var(--primary-color);
padding: 0.5rem 1rem;
border: 1px solid var(--primary-color);
border-radius: 4px;
text-shadow: 0 0 3px var(--primary-color);
}
nav ul li a:hover {
background: var(--primary-color);
color: var(--background-color);
}
#loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgb(0, 0, 0);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
cursor: pointer;
pointer-events: all; /* Ensure the user can click on the loading screen */
z-index: 9999;
mix-blend-mode: screen;
box-shadow: inset 0 0 20px rgba(255, 255, 255, 0.15);
animation: flicker 3.0s infinite;
}
#loading-screen::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('/assets/RpdC.gif') repeat;
opacity: 0.05;
mix-blend-mode: screen;
z-index: -1;
}
#loading-screen::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: repeating-linear-gradient(
0deg,
rgba(255, 255, 255, 0.05) 0px,
rgba(255, 255, 255, 0.05) 1px,
transparent 1px,
transparent 4px
);
animation: scanlines 0.1s linear infinite;
z-index: -2;
}
.loading-text {
color: var(--primary-color);
font-family: 'Orbitron', sans-serif;
font-size: 2rem;
text-align: center;
text-shadow: 0 0 15px var(--primary-color), 0 0 30px var(--primary-color);
animation: pulse 1.5s infinite;
z-index: 10000;
cursor: pointer;
}
body {
margin: 0;
font-family: 'Orbitron', sans-serif;
color: var(--text-color);
background: var(--background-color);
overflow-x: hidden;
}
body::before {
content: "";
position: fixed;
top: 0; left: 0;
width: 100%;
height: 100%;
z-index: 2;
pointer-events: none;
background: url('/assets/RpdC.gif') repeat;
opacity: 0.05;
mix-blend-mode: screen;
}
body::after {
content: "";
position: fixed;
top: 0; left: 0;
width: 100%;
height: 100%;
z-index: 1;
pointer-events: none;
background: repeating-linear-gradient(
0deg,
--scanline-color 0px,
--scanline-color 1px,
transparent 1px,
transparent 4px
);
animation: scanlines 0.1s linear infinite;
}
.main-content {
max-width: 960px;
min-height: 720px;
margin: 0 auto;
padding: 32px;
background-color: rgba(0, 0, 0, 0.85);
position: relative;
z-index: 1;
}
footer a {
text-decoration: none;
color: var(--primary-color);
}
footer a:hover {
color: var(--secondary-color);
}
footer p {
text-align: center;
}