diff --git a/tools/website/assets/css/style.css b/tools/website/assets/css/style.css new file mode 100644 index 00000000..e76592f5 --- /dev/null +++ b/tools/website/assets/css/style.css @@ -0,0 +1,329 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + line-height: 1.6; + background-color: #121212; + color: #f0f0f0; + scroll-behavior: smooth; +} + +.hero { + text-align: center; + background: linear-gradient(135deg, #1e1e2e, #313450); + color: white; + padding: 50px 20px; +} + +.hero h1 { + font-size: 2.8em; + margin-bottom: 10px; + text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); +} + +.hero p { + margin-bottom: 20px; + font-size: 1.3em; +} + +.hero button { + background-color: #282828; + color: #ffffff; + border: none; + padding: 12px 25px; + font-size: 1.1em; + border-radius: 25px; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 10px rgba(14, 14, 14, 0.5); +} + +.hero button:hover { + background-color: #ff6b81; + color: black; + transform: scale(1.15); + box-shadow: 0 6px 15px rgba(255, 71, 87, 0.7); +} + +.buttons-section { + text-align: center; + margin: 40px 20px; +} + +.buttons-section h2 { + font-size: 2em; + margin-bottom: 20px; + text-transform: uppercase; + color: #ff4757; +} + +.buttons-section button { + color: white; +} + +.button { + background-color: #313450; + color: black; + border: none; + padding: 15px 30px; + font-size: 1.1em; + margin: 10px; + border-radius: 50px; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: none; +} + +.button:hover { + background-color: #ff4757; + transform: scale(1.1); + box-shadow: 0 6px 15px rgba(255, 71, 87, 0.6); + color: black; +} + +.button:focus { + outline: none; +} + +.screenshot-section { + text-align: center; + margin: 40px 20px; +} + +.screenshot { + max-width: 80%; + height: auto; + border-radius: 15px; + box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.5); + transition: transform 0.5s ease, box-shadow 0.5s ease; +} + +.screenshot:hover { + transform: scale(1.05); + box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.8); +} + +.features-section { + background-color: #1e1e2e; + padding: 40px 20px; +} + +.features-section h2 { + text-align: center; + margin-bottom: 20px; + text-transform: uppercase; + letter-spacing: 2px; + font-size: 2em; +} + +.features { + display: flex; + justify-content: center; + gap: 20px; + flex-wrap: wrap; +} + +.card { + background: linear-gradient(135deg, #313450, #1e1e2e); + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3); + padding: 20px; + width: 300px; + border-radius: 15px; + text-align: center; + transition: transform 0.4s ease, box-shadow 0.4s ease; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.card:hover { + transform: translateY(-10px) scale(1.05); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); +} + +.card h3 { + color: #ff4757; + margin-bottom: 10px; +} + +.card p { + color: #ccc; +} + +.feature-detail { + display: flex; + align-items: center; + justify-content: space-between; + padding: 40px 20px; + gap: 30px; + opacity: 0; + transform: translateY(50px); + transition: opacity 0.6s ease, transform 0.6s ease; +} + +.feature-detail.active { + opacity: 1; + transform: translateY(0); +} + +.feature-detail:nth-child(even) { + flex-direction: row-reverse; +} + +.feature-detail img { + max-width: 50%; + border-radius: 15px; + box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.5); + transition: transform 0.8s ease, box-shadow 0.8s ease; + margin: 0 40px; +} + +.feature-detail.active img:hover { + transform: scale(1.11); + box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.8); +} + +.feature-detail img.active { + transform: scale(1.1); + box-shadow: 0px 15px 25px rgba(0, 0, 0, 0.7); +} + +.feature-detail .text { + max-width: 40%; + padding: 0 20px; +} + +.feature-detail .text h3 { + font-size: 1.8em; + margin-bottom: 10px; + color: #ff4757; +} + +.feature-detail .text p { + color: #ccc; + font-size: 1.1em; + line-height: 1.6; +} + +.footer { + text-align: center; + padding: 20px; + background-color: #121212; + color: #bbb; + border-top: 1px solid #2a2a2a; +} + +@media (max-width: 768px) { + .features { + flex-direction: column; + align-items: center; + } + + .feature-detail { + flex-direction: column; + text-align: center; + } + + .feature-detail img, + .feature-detail .text { + max-width: 100%; + } +} + +header { + position: sticky; + top: 0; + max-height: 64px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5); + backdrop-filter: blur(10px); + background: rgba(0, 0, 0, 0.5); + z-index: 999; +} + +header img { + width: 64px; + height: 64px; +} + +.div-warning { + text-decoration: none; + color: white; + font-size: 1.2em; + text-align: center; + display: flex; + margin-left: auto; + text-shadow: 0px 0px 5px rgba(255, 0, 0, 1); +} + +.div-dropdown { + position: relative; + display: flex; + align-items: center; + margin-left: auto; +} + +.header-button { + background-color: #313450; + color: white; + border: none; + text-decoration: none; + display: block; + border-radius: 8px; + font-size: 1.1em; + padding: 8px 12px; + margin: 0; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5); +} + +.header-button:hover { + transform: scale(1.05); +} + +.dropdown-content { + display: none; + position: absolute; + top: 110%; + right: 0; + background-color: #313450; + z-index: 1; + border-radius: 12px; + box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5); + padding: 10px 0; + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} + +.dropdown-content::-webkit-scrollbar { + width: 8px; +} + +.dropdown-content::-webkit-scrollbar-thumb { + background-color: #ff4757; + border-radius: 4px; +} + +.dropdown-content::-webkit-scrollbar-thumb:hover { + background-color: #ff6b81; +} + +.dropdown-content a { + color: white; + white-space: nowrap; + text-decoration: none; + display: block; + padding: 8px 12px; + border-radius: 8px; + font-size: 1.1em; + transition: background-color 0.3s ease, color 0.3s ease, transform 0.3s ease; +} + +.dropdown-content a:hover { + background-color: #ff4757; + color: black; + transform: scale(1.05); +} \ No newline at end of file diff --git a/tools/website/assets/images/feature-default.png b/tools/website/assets/images/feature-default.png new file mode 100644 index 00000000..e1dc44d2 Binary files /dev/null and b/tools/website/assets/images/feature-default.png differ diff --git a/tools/website/assets/images/feature1-en.png b/tools/website/assets/images/feature1-en.png new file mode 100644 index 00000000..f091cc56 Binary files /dev/null and b/tools/website/assets/images/feature1-en.png differ diff --git a/tools/website/assets/images/feature2-en.png b/tools/website/assets/images/feature2-en.png new file mode 100644 index 00000000..2c7a9b35 Binary files /dev/null and b/tools/website/assets/images/feature2-en.png differ diff --git a/tools/website/assets/images/feature3-en.png b/tools/website/assets/images/feature3-en.png new file mode 100644 index 00000000..e26b2148 Binary files /dev/null and b/tools/website/assets/images/feature3-en.png differ diff --git a/tools/website/assets/images/screenshot-default.png b/tools/website/assets/images/screenshot-default.png new file mode 100644 index 00000000..604acfb7 Binary files /dev/null and b/tools/website/assets/images/screenshot-default.png differ diff --git a/tools/website/assets/images/screenshot-en.png b/tools/website/assets/images/screenshot-en.png new file mode 100644 index 00000000..e66939d9 Binary files /dev/null and b/tools/website/assets/images/screenshot-en.png differ diff --git a/tools/website/assets/js/script.js b/tools/website/assets/js/script.js new file mode 100644 index 00000000..e74fc32d --- /dev/null +++ b/tools/website/assets/js/script.js @@ -0,0 +1,91 @@ +const featureDetails = document.querySelectorAll('.feature-detail'); + +const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + const img = entry.target.querySelector('img'); + img.classList.add('active'); + } + else { + entry.target.classList.remove('active'); + const img = entry.target.querySelector('img'); + img.classList.remove('active'); + } + }); +}, { + threshold: 0.1 +}); + +featureDetails.forEach(detail => { + observer.observe(detail); +}); + +function updateContent(langData) { + document.querySelectorAll('[data-i18n]').forEach(element => { + const key = element.getAttribute('data-i18n'); + + if (key in langData) { + if (element.tagName === "IMG") { + element.src = langData[key]; + } else { + element.innerHTML = langData[key]; + } + } else { + console.warn(`Missing translation for key: '${key}'`); + } + }); +} + +function setLanguagePreference(lang) { + localStorage.setItem('language', lang); + location.reload(); +} + +async function fetchLanguageData(lang) { + try { + const response = await fetch(`assets/lang/${lang}.json`); + if (!response.ok) { + throw new Error(`Language file for '${lang}' not found`); + } + return response.json(); + } catch (error) { + console.warn(error.message + `. Falling back to English.`); + return fetchLanguageData('en'); + } +} + +async function detectAndLoadLanguage() { + const savedLanguage = localStorage.getItem('language'); + const browserLanguage = navigator.language || navigator.languages[0]; + const languageToLoad = savedLanguage || browserLanguage.split('-')[0] || 'en'; + + console.log(`Detected language: ${browserLanguage}. Loading: ${languageToLoad}`); + + const langData = await fetchLanguageData(languageToLoad); + updateContent(langData); +} + +async function changeLanguage(lang) { + setLanguagePreference(lang); +} + +window.addEventListener('DOMContentLoaded', detectAndLoadLanguage); + +function toggleDropdown() { + const dropdownMenu = document.getElementById('dropdownMenu'); + dropdownMenu.style.display = dropdownMenu.style.display === 'block' ? 'none' : 'block'; +} + +window.onclick = function (event) { + const dropdownMenu = document.getElementById('dropdownMenu'); + const dropdownButton = document.querySelector('.header-button'); + if (!dropdownMenu.contains(event.target) && event.target !== dropdownButton) { + dropdownMenu.style.display = 'none'; + } +}; + +function downloadFennix() { + // TODO: Here will download the iso file + window.location.href = "https://github.com/EnderIce2/Fennix"; +} diff --git a/tools/website/assets/lang/README.md b/tools/website/assets/lang/README.md new file mode 100644 index 00000000..0725ae73 --- /dev/null +++ b/tools/website/assets/lang/README.md @@ -0,0 +1 @@ +# Language Directory diff --git a/tools/website/assets/lang/bg.json b/tools/website/assets/lang/bg.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/de.json b/tools/website/assets/lang/de.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/en.json b/tools/website/assets/lang/en.json new file mode 100644 index 00000000..37893787 --- /dev/null +++ b/tools/website/assets/lang/en.json @@ -0,0 +1,38 @@ +{ + "home": "Fennix - Future of Computing", + "warning_message": "⚠️ The operating system is in early development ⚠️
This website is a placeholder and does not fully represent the project's current status.", + + "welcome_message": "Welcome to Fennix", + "welcome_subtitle": "Unlock seamless and powerful computing.", + "download_button": "Download", + "screenshot_title": "Explore Fennix", + "screenshot_image": "assets/images/screenshot-en.png", + + "get_involved": "Get Involved", + "get_involved_btn1": "Contribute", + "get_involved_btn2": "Documentation", + "get_involved_btn3": "API Reference", + "get_involved_btn4": "Developing with Fennix", + + "features_title": "Core Features", + "card1_title": "High Performance", + "card1_text": "Experience fast speeds for modern computing tasks.", + "card2_title": "Security & Privacy", + "card2_text": "Your data is secure with advanced encryption and privacy protocols.", + "card3_title": "Customizable", + "card3_text": "Customize Fennix to enhance your workflow and productivity.", + + "feature1_title": "User Interface", + "feature1_text": "Work with a user-friendly, modern interface designed for efficiency.", + "feature1_image": "assets/images/feature1-en.png", + + "feature2_title": "Multitasking", + "feature2_text": "Run multiple applications and switch between tasks easily.", + "feature2_image": "assets/images/feature2-en.png", + + "feature3_title": "Security Features", + "feature3_text": "Use built-in security measures to protect your data.", + "feature3_image": "assets/images/feature3-en.png", + + "footer_text": "© 2025 EnderIce2" +} diff --git a/tools/website/assets/lang/es.json b/tools/website/assets/lang/es.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/fr.json b/tools/website/assets/lang/fr.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/hu.json b/tools/website/assets/lang/hu.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/it.json b/tools/website/assets/lang/it.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/ja.json b/tools/website/assets/lang/ja.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/ko.json b/tools/website/assets/lang/ko.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/pl.json b/tools/website/assets/lang/pl.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/pt.json b/tools/website/assets/lang/pt.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/ro.json b/tools/website/assets/lang/ro.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/ru.json b/tools/website/assets/lang/ru.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/tr.json b/tools/website/assets/lang/tr.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/zh-CN.json b/tools/website/assets/lang/zh-CN.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/lang/zh-TW.json b/tools/website/assets/lang/zh-TW.json new file mode 100644 index 00000000..e69de29b diff --git a/tools/website/assets/logo.png b/tools/website/assets/logo.png new file mode 100644 index 00000000..82ea1599 Binary files /dev/null and b/tools/website/assets/logo.png differ diff --git a/tools/website/favicon.ico b/tools/website/favicon.ico new file mode 100644 index 00000000..0f008981 Binary files /dev/null and b/tools/website/favicon.ico differ diff --git a/tools/website/index.html b/tools/website/index.html index b0cda18a..9c30b08c 100644 --- a/tools/website/index.html +++ b/tools/website/index.html @@ -1,136 +1,108 @@ - + + - Fennix - - - + + + Fennix + - -
-
-

Fennix

-

Operating System from scratch made in C and C++

- - + +
+ Fennix Logo +
+
-
- -
-
- GitHub Workflow Status - GitHub - GitHub repo size - GitHub Repo stars -
-
-

About

- - - - - - -
- -
-
- Hello!
This is my Operating System from scratch, my goal is to make a fully functional Operating System with a GUI and a lot of features.
I'm working on this project alone, but I'm open to any kind of help, if you want to help - me, you can contribute to the project on GitHub.
I have a Discord server too →
+ + -
-
-

Compiling Instructions

-
-

Requirements

- First of all, you need to install the required packages to build the cross-compiler, bootloader, OS, etc. -
-
- • Ubuntu 22.04
For cross-compiler:
- sudo apt install build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo libzstd-dev libisl-dev autoconf m4 automake gettext gperf dejagnu guile-3.0 guile-3.0-dev expect tcl autogen tex-common sphinx-common git ssh diffutils patch -
For bootloader:
- sudo apt-get install make gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -
For QEMU you'll have to follow this page here
For OS:
- sudo apt-get install xorriso mtools genisoimage ovmf nasm doxygen - -
+
+

+

+ +
+ +
+

+ Fennix Screenshot +
+ +
+

+ + + + +
+ +
+

+
+
+

+

- -
-

Building The Cross-Compiler

- The cross-compiler is used to compile the OS, the bootloader and the kernel.
-
All you have to do is to write this command in the terminal:
- make tools
You'll have to wait a while, but when it's done, you can jump to the next step.
+
+

+

- -
-

Configuring your kernel

- If you want to build different architecture, use other QEMU binary or change kernel name you can find in - config.mk file.
-
- DEBUG • If it's set to 1, the kernel will be compiled in debug mode.
- TESTING • Enable unit testing.
- OSNAME • The name of the kernel. This can be anything.
- OSARCH • The architecture of the kernel. Supported values are: amd64 i386 aarch64.
- KERNEL_VERSION • The version of the kernel. This can be anything.
- BOOTLOADER • The bootloader to be used. If set to other, the bootloader will be Limine for 64-bit, or - with GRUB if 32-bit. - COMPILER_PATH • The path of the cross compiler. If you want to use your own cross compiler, change it to the path of the compiler.
- LIMINE_FOLDER • The path of the Limine bootloader.
- QEMU_PATH • Qemu path. If you want to use the one you have installed in your system, change it to /usr/bin/qemu-system- (do not include x86_64 or i386, it will be added automatically) -
That's all you can change in this file.
-
- -
-

Building The Operating System

- The fun part!
-
Now that you have the cross-compiler, you can build the OS.
There are a few commands that you can use to compile the OS:
- make build • Builds the entire OS and creates an ISO image.
- make run • Same as make build but starts the QEMU too.
- make clean • Clean all files (object files, ISO, etc...).
- make doxygen • Generate the documentation in directory doxygen-doc.
+
+

+

+
-
-

Running With Other Virtual Machines

-
-
- • On VirtualBox and VMware, you can use the ISO image to run the OS.
• HDD/SSD are not required.
• The minimum RAM required is 4G. You can run with lower memory, but sometimes can cause issues (I don't know - why).
• UEFI required. BIOS sometimes doesn't work properly.
• Serial Port (COM1) is recommended.
-
+
+ Feature 1 Screenshot +
+

+

+
-
-

Reporting Issues

-
-
- You can report bugs or crash issues to Issues - tab.
-
+
+ Feature 2 Screenshot +
+

+

+
- -
-

© EnderIce2

- -
-
+
+ Feature 3 Screenshot +
+

+

+
+
+ +
+

+
+ + - \ No newline at end of file + diff --git a/tools/website/robots.txt b/tools/website/robots.txt index 3f4966a2..018361fd 100644 --- a/tools/website/robots.txt +++ b/tools/website/robots.txt @@ -1,5 +1,5 @@ User-agent: * -Disallow: /userspace/ -Disallow: /drivers/ -Disallow: /kernel/ -Disallow: /fulldoc/ +Disallow: /lang/ +Disallow: /js/ +Disallow: /css/ +Disallow: /images/