Skip to content

flet init #88

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
May 26, 2025
Merged

flet init #88

merged 28 commits into from
May 26, 2025

Conversation

MH0386
Copy link
Owner

@MH0386 MH0386 commented May 1, 2025

This pull request removes legacy configurations and dependencies related to a previous Rust-based project and introduces new Python-based project configurations and dependencies. The changes include the removal of Rust and Dioxus-related files, the addition of Python-related files for a Flet-based application, and updates to documentation and project metadata.

Removed Legacy Rust-based Project Files:

  • .flox/, .idx/, and Cargo.toml: Removed files related to the Rust-based project, including Flox environment configurations, Nix development setup, and the Rust project manifest. [1] [2] [3] [4] [5]
  • Dioxus.toml and assets/main.css: Removed configurations and styling specific to the Dioxus web framework. [1] [2]

Added Python-based Project Files:

  • pyproject.toml: Introduced a Python project configuration file with dependencies for the Flet framework.
  • .idea/: Added IntelliJ IDEA project files, including settings for Python modules and plugins like Mypy and Ruff. [1] [2] [3] [4] [5] [6] [7] [8] [9]

Updated Documentation:

  • README.md: Replaced the old project description with instructions for running and building the new Python-based Flet application. Added details for multiple platforms, including Android, iOS, macOS, Linux, and Windows.

Simplified Dependency Management:

  • .github/dependabot.yml: Removed the configuration for Rust's Cargo dependency updates, keeping only GitHub Actions updates.

Removed CI Workflow:

Summary by Sourcery

Migrate project from Rust-based Dioxus to Python-based Flet framework, simplifying project structure and updating development workflows

New Features:

  • Introduced a new Python-based application using Flet framework

Build:

  • Added pyproject.toml for Python project configuration
  • Removed Cargo.toml and Rust-related build files

CI:

  • Removed Rust-specific Clippy workflow
  • Updated Dependabot configuration

Documentation:

  • Updated README.md with new project setup and build instructions for multiple platforms

Chores:

  • Removed legacy Rust-based project configurations
  • Updated project documentation and build instructions

Summary by CodeRabbit

  • New Features

    • Introduced a new Python-based portfolio web app using the Flet framework with multi-page navigation for Home, Projects, Resume, Certificates, and Contact sections.
    • Added project metadata and dependency management with a Python configuration file.
    • Implemented a simple data file for tracking views.
  • Documentation

    • Updated the README to a concise portfolio title.
  • Chores

    • Replaced Rust and general development environment files with Python-focused configuration and ignore files.
    • Added and updated code quality, linting, formatting, and deployment workflows for Python.
    • Removed previous Rust project source code, configuration, localization files, and related workflows.
    • Reformatted Renovate configuration for clarity.

Copy link

height bot commented May 1, 2025

Link Height tasks by mentioning a task ID in the pull request title or commit messages, or description and comments with the keyword link (e.g. "Link T-123").

💡Tip: You can also use "Close T-X" to automatically close a task when the pull request is merged.

Copy link

sourcery-ai bot commented May 1, 2025

Reviewer's Guide

This pull request transitions the project from a Rust/Dioxus setup to a Python/Flet setup by removing all Rust-related configurations, dependencies, source files, and CI workflows, and introducing new Python project files (pyproject.toml, src/main.py), Flet configurations, and updated documentation.

File-Level Changes

Change Details Files
Removed all legacy Rust project files and configurations.
  • Deleted Rust project manifests (Cargo.toml, Cargo.lock).
  • Removed Dioxus framework configuration (Dioxus.toml) and related assets.
  • Deleted Rust source code (src/main.rs) and localization files.
  • Removed development environment setup files (.flox/, .idx/).
  • Deleted the Rust CI linting workflow (rust-clippy.yml).
.flox/.gitignore
.flox/env.json
.flox/env/manifest.lock
.flox/env/manifest.toml
.github/workflows/rust-clippy.yml
.idx/dev.nix
Cargo.lock
Cargo.toml
Dioxus.toml
assets/header.svg
assets/main.css
src/locale/ar-EG.ftl
src/locale/en-US.ftl
src/main.rs
Introduced Python project structure using the Flet framework.
  • Added pyproject.toml with project metadata, Flet dependencies, and Flet-specific configuration.
  • Created a basic Flet application entrypoint in src/main.py.
  • Included IntelliJ IDEA project configuration files in .idea/.
  • Updated .gitignore.
pyproject.toml
src/main.py
.gitignore
.idea/.gitignore
.idea/MH0386.github.io.iml
.idea/MypyPlugin.xml
.idea/inspectionProfiles/profiles_settings.xml
.idea/misc.xml
.idea/modules.xml
.idea/pyright-overrides.xml
.idea/ruff.xml
.idea/vcs.xml
Updated documentation and dependency management for the new Python setup.
  • Rewrote README.md to provide instructions for setting up, running, and building the Flet application.
  • Removed the cargo package ecosystem from the Dependabot configuration.
README.md
.github/dependabot.yml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

codecapyai bot commented May 1, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository has been refactored to remove legacy Rust-based project files and configurations, replacing them with a new Python-based Flet application. The new configuration uses a pyproject.toml file for dependency management and provides both desktop and web launch modes. The main user interface is defined in src/main.py where a simple counter is displayed with a floating action button to increment its value.

PR Changes

The PR removes numerous Rust and Dioxus-related files and configurations (including Cargo.toml, Dioxus.toml, and related assets) and introduces new Python project files including pyproject.toml and Flet-specific configuration files in .idea. The user-facing change is the new Flet-based UI which, when launched, displays a centered counter initialized to 0. Tapping the floating action button increments the counter. Documentation in README.md has also been updated to reflect these changes and explain how to run the new application both as a web app and a desktop app.

Setup Instructions

  1. Install pnpm globally if not already installed: sudo npm install -g pnpm
  2. Clone the repository and navigate into it: cd <repository_directory>
  3. Install the dependencies using pnpm: pnpm install
  4. (Alternatively, use Poetry for Python dependencies) Install dependencies with: poetry install
  5. To run as a web app, start the Flet application using one of the following commands:
    • Using uv: uv run flet run --web
    • Using Poetry: poetry run flet run --web
  6. Open your browser and navigate to the local URL provided by the Flet dev server (commonly http://localhost:8550)
  7. For desktop mode, start the app with:
    • Using uv: uv run flet run
    • Using Poetry: poetry run flet run
  8. Once the application is running, perform the UI tests as described in the test cases.

Generated Test Cases

1: Flet Web App: Counter Increments on Floating Button Click ❗️❗️❗️

Description: This test verifies that the main user interface correctly displays the counter initialized to 0 and that clicking the floating action button increments the counter value sequentially.

Prerequisites:

  • Application is running in web mode (e.g., using 'poetry run flet run --web' or 'uv run flet run --web')
  • Browser is launched and navigated to the local web URL (typically http://localhost:8550 or as configured)

Steps:

  1. Open the browser and navigate to the application's URL (e.g., http://localhost:8550).
  2. Observe that the page displays a centered counter with the number '0'.
  3. Locate the floating action button with the plus icon and click it once.
  4. Verify that the counter updates to display '1'.
  5. Click the floating button multiple times and check that the counter increases by 1 each time.

Expected Result: Each click on the floating action button increments the counter display by 1, starting from 0. The updated value is clearly visible and centered on the page.

2: Flet App: UI Layout and Element Visibility ❗️❗️

Description: This test checks that the main content (the counter inside a container within a SafeArea) is correctly centered and visible in the browser window.

Prerequisites:

  • Application is running in web mode
  • Browser is launched and navigated to the app's URL

Steps:

  1. Navigate to the application URL in the browser.
  2. Ensure that the main container with the counter element is centrally aligned both vertically and horizontally.
  3. Verify that there is no overflow and that all UI elements (counter and floating action button) are easily visible on the screen.

Expected Result: The counter and floating action button are centered on the page. All elements render correctly without any clipping or layout issues.

3: Flet Desktop App: Basic Functionality Check ❗️❗️❗️

Description: This test ensures that the application can also run as a desktop app and that the main interactive functionality (counter increment) operates as expected in desktop mode.

Prerequisites:

  • Application is running in desktop mode (e.g., using 'poetry run flet run')
  • The desktop window is open

Steps:

  1. Start the application in desktop mode using the appropriate command.
  2. Verify that the desktop window opens and displays the counter initialized to 0.
  3. Click the floating action button and observe that the counter increases with each click.

Expected Result: The desktop window displays the counter centered on the screen and the floating action button functions correctly, updating the counter's value upon each click.

Raw Changes Analyzed
File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -5,10 +5,6 @@
 
 version: 2
 updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
   - package-ecosystem: "github-actions"
     directory: "/" 
     schedule:

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .gitignore
Changes:
@@ -1,11 +1,163 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
 
-# These are backup files generated by rustfmt
-**/*.rs.bk
+# C extensions
+*.so
 
-.vscode/
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
 
-node_modules/
\ No newline at end of file
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+*.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Flet
+storage/
\ No newline at end of file

File: .idea/.gitignore
Changes:
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

File: .idea/MH0386.github.io.iml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file

File: .idea/MypyPlugin.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MypySettings">
+    <option name="arguments" value="--follow-imports silent --exclude \.pyi$" />
+    <option name="mypyExecutable" value="C:\Users\moham\.local\bin\mypy.exe" />
+    <option name="projectDirectory" value="$PROJECT_DIR$" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/inspectionProfiles/profiles_settings.xml
Changes:
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file

File: .idea/misc.xml
Changes:
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MojoSettings">
+    <option name="profiles">
+      <map>
+        <entry key="default">
+          <value>
+            <MojoSettingsProfile />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file

File: .idea/modules.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/MH0386.github.io.iml" filepath="$PROJECT_DIR$/.idea/MH0386.github.io.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file

File: .idea/pyright-overrides.xml
Changes:
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="com.insyncwithfoo.pyright.configurations.Override">
+    <option name="names">
+      <map>
+        <entry key="autoSearchPaths" value="true" />
+        <entry key="diagnosticMode" value="true" />
+        <entry key="executable" value="true" />
+        <entry key="targetedFileExtensions" value="true" />
+        <entry key="workspaceFolders" value="true" />
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file

File: .idea/ruff.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RuffConfigService">
+    <option name="globalRuffExecutablePath" value="C:\Users\moham\AppData\Local\Microsoft\WinGet\Packages\astral-sh.ruff_Microsoft.Winget.Source_8wekyb3d8bbwe\ruff.exe" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/vcs.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,81 @@
-# MH0386.github.io
+# Mh0386githubio app
 
-[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
 
-[![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
+### uv
 
-It is my personal website.
+Run as a desktop app:
+
+```
+uv run flet run
+```
+
+Run as a web app:
+
+```
+uv run flet run --web
+```
+
+### Poetry
+
+Install dependencies from `pyproject.toml`:
+
+```
+poetry install
+```
+
+Run as a desktop app:
+
+```
+poetry run flet run
+```
+
+Run as a web app:
+
+```
+poetry run flet run --web
+```
+
+For more details on running the app, refer to the [Getting Started Guide](https://flet.dev/docs/getting-started/).
+
+## Build the app
+
+### Android
+
+```
+flet build apk -v
+```
+
+For more details on building and signing `.apk` or `.aab`, refer to the [Android Packaging Guide](https://flet.dev/docs/publish/android/).
+
+### iOS
+
+```
+flet build ipa -v
+```
+
+For more details on building and signing `.ipa`, refer to the [iOS Packaging Guide](https://flet.dev/docs/publish/ios/).
+
+### macOS
+
+```
+flet build macos -v
+```
+
+For more details on building macOS package, refer to the [macOS Packaging Guide](https://flet.dev/docs/publish/macos/).
+
+### Linux
+
+```
+flet build linux -v
+```
+
+For more details on building Linux package, refer to the [Linux Packaging Guide](https://flet.dev/docs/publish/linux/).
+
+### Windows
+
+```
+flet build windows -v
+```
+
+For more details on building Windows package, refer to the [Windows Packaging Guide](https://flet.dev/docs/publish/windows/).
\ No newline at end of file

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: pyproject.toml
Changes:
@@ -0,0 +1,27 @@
+[project]
+name = "mh0386githubio"
+version = "0.1.0"
+description = ""
+readme = "README.md"
+requires-python = ">=3.11"
+authors = [
+    { name = "Mohamed Hisham Abdelzaher", email = "[email protected]" }
+]
+dependencies = [
+  "flet==0.27.6",
+  "flet-webview>=0.1.0",
+]
+
+[tool.flet]
+org = "com.mh0386"
+product = "mh0386githubio"
+company = "MH0386"
+copyright = "Copyright (C) 2025 by MH0386"
+
+[tool.flet.app]
+path = "src"
+
+[dependency-groups]
+dev = [
+    "flet[all]>=0.27.6",
+]

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,26 @@
+import flet as ft
+
+
+def main(page: ft.Page):
+    counter = ft.Text("0", size=50, data=0)
+
+    def increment_click(e):
+        counter.data += 1
+        counter.value = str(counter.data)
+        counter.update()
+
+    page.floating_action_button = ft.FloatingActionButton(
+        icon=ft.Icons.ADD, on_click=increment_click
+    )
+    page.add(
+        ft.SafeArea(
+            ft.Container(
+                counter,
+                alignment=ft.alignment.center,
+            ),
+            expand=True,
+        )
+    )
+
+
+ft.app(main)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

Copy link
Contributor

coderabbitai bot commented May 1, 2025

Warning

Rate limit exceeded

@MH0386 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 14 minutes and 29 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 0e7e35b and 32af600.

📒 Files selected for processing (3)
  • .trunk/configs/pyrightconfig.json (1 hunks)
  • pyproject.toml (1 hunks)
  • src/main.py (1 hunks)

Walkthrough

This update removes all Rust/Dioxus-related source code, configuration, and workflows, replacing them with a new Python-based web application built using the Flet framework. It introduces new Python modules for routing and page views, updates project metadata and dependencies for Python, and adds new GitHub Actions workflows for code quality, deployment, and syncing documentation. Linting and formatting configurations for Python and documentation are also introduced.

Changes

Files/Paths Change Summary
.flox/.gitignore, .flox/env.json, .flox/env/manifest.toml Deleted Flox environment and ignore files.
.github/dependabot.yml, .github/workflows/rust-clippy.yml, .github/workflows/main.yml Removed Rust-related CI/CD and dependency management workflows.
.gitignore Replaced Rust and general ignores with minimal Python-specific ignore rules.
.idx/dev.nix Deleted Nix development environment configuration.
Cargo.toml, Dioxus.toml Deleted Rust project and Dioxus configuration files.
README.md Simplified to a single header for the portfolio.
assets/main.css Removed CSS stylesheet for the previous web UI.
src/locale/ar-EG.ftl, src/locale/en-US.ftl Deleted all localization files.
src/main.rs Removed the entire Rust/Dioxus application source code.
.deepsource.toml Switched analyzer configuration from Rust to Python and updated formatting tool.
renovate.json Reformatted Renovate configuration for compactness.
.trunk/.gitignore, .trunk/configs/.isort.cfg, .trunk/configs/.markdownlint.yaml, .trunk/configs/.prettierrc.yaml, .trunk/configs/.yamllint.yaml, .trunk/configs/ruff.toml, .trunk/configs/pyrightconfig.json, .trunk/configs/taplo.toml, .trunk/trunk.yaml Added Trunk, linting, and formatting configurations for Python and documentation.
.github/workflows/code_analysis.yml, .github/workflows/deploy.yml, .github/workflows/sync.yml, .github/workflows/trunk_upgrade.yml Added new GitHub Actions workflows for Python code quality, deployment, syncing, and tool upgrades.
pyproject.toml Added Python project configuration, dependencies, and tool settings.
src/main.py Added new Flet-based Python application entry point with routing logic.
src/pages/home.py, src/pages/projects.py, src/pages/certificates.py, src/pages/contact.py, src/pages/resume.py Introduced new Python modules for individual page views in the Flet application.
src/assets/data/info.json Added a new JSON file for storing application data (e.g., view count).

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Browser
    participant FletApp (main.py)
    participant HomePage (home.py)
    participant ProjectsPage (projects.py)
    participant CertificatesPage (certificates.py)
    participant ContactPage (contact.py)
    participant ResumePage (resume.py)

    User->>Browser: Accesses web app
    Browser->>FletApp: Loads main()
    FletApp->>Browser: Renders HomePage
    User->>Browser: Navigates (e.g., clicks "Projects")
    Browser->>FletApp: route_change event ("/projects")
    FletApp->>ProjectsPage: Render projects()
    ProjectsPage->>FletApp: Return View
    FletApp->>Browser: Updates to ProjectsPage
    User->>Browser: Navigates back (e.g., clicks "Home")
    Browser->>FletApp: route_change event ("/")
    FletApp->>HomePage: Render home()
    HomePage->>FletApp: Return View
    FletApp->>Browser: Updates to HomePage
Loading

Possibly related PRs

  • MH0386/MH0386.github.io#50: This PR introduced the initial Rust/Dioxus app and configuration, which are being removed and replaced in the current update.

Poem

🐇
Out with the Rust, in with the Py,
Flet brings new views as old ones say bye.
Pages and routes now hop with delight,
Trunk keeps it tidy, the workflows are right.
A fresh portfolio, so clean and spry—
This rabbit’s code leaps ever high!

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @MH0386, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Summary of Changes

This pull request represents a significant shift from a Rust-based Dioxus project to a Python-based Flet application. I've removed all the old Rust-related files and configurations, including the .flox/ directory, Cargo.toml, Dioxus.toml, and associated assets. In their place, I've added Python project files, most notably pyproject.toml for dependency management and a basic main.py showcasing a simple Flet counter app. The README.md has been updated to reflect the new Python/Flet setup, providing instructions for running and building the application on various platforms. Additionally, I've updated .gitignore to include Python-specific ignores and removed the Rust-related workflow from .github/workflows and Cargo dependency updates from .github/dependabot.yml.

Highlights

  • Project Migration: Migrated the project from Rust/Dioxus to Python/Flet.
  • Dependency Management: Introduced pyproject.toml for managing Python dependencies with Flet.
  • Documentation Update: Updated README.md with instructions for running and building the Flet application on multiple platforms.
  • CI/CD Configuration: Removed Rust-specific CI workflow and updated Dependabot configuration.
  • IDE Configuration: Added IntelliJ IDEA project files for Python development.

Changelog

Click here to see the changelog
  • .flox/.gitignore
    • Removed Rust-related entries.
  • .flox/env.json
    • Removed the file.
  • .flox/env/manifest.lock
    • Removed the file.
  • .flox/env/manifest.toml
    • Removed the file.
  • .github/dependabot.yml
    • Removed Cargo dependency updates, keeping only GitHub Actions updates.
  • .gitignore
    • Added Python-specific ignore patterns, including byte-compiled files, distribution artifacts, and IDE-specific files, and Flet storage directory.
  • .idea/.gitignore
    • Added default ignored files for IntelliJ IDEA projects.
  • .idea/MH0386.github.io.iml
    • Added IntelliJ IDEA module configuration file, specifying Python module type.
  • .idea/MypyPlugin.xml
    • Added IntelliJ IDEA settings for the Mypy plugin, including arguments and executable path.
  • .idea/inspectionProfiles/profiles_settings.xml
    • Added IntelliJ IDEA inspection profiles settings, disabling project profile usage.
  • .idea/misc.xml
    • Added IntelliJ IDEA misc settings, configuring Mojo settings profiles.
  • .idea/modules.xml
    • Added IntelliJ IDEA modules configuration file, linking the project module.
  • .idea/pyright-overrides.xml
    • Added IntelliJ IDEA settings overrides for Pyright, configuring various options.
  • .idea/ruff.xml
    • Added IntelliJ IDEA configuration for Ruff, specifying the global Ruff executable path.
  • .idea/vcs.xml
    • Added IntelliJ IDEA version control settings, mapping the directory to Git.
  • .idx/dev.nix
    • Removed the file.
  • Cargo.toml
    • Removed the file.
  • Dioxus.toml
    • Removed the file.
  • README.md
    • Replaced the old project description with instructions for running and building the new Python-based Flet application. Added details for multiple platforms, including Android, iOS, macOS, Linux, and Windows.
  • assets/header.svg
    • Removed the file.
  • assets/main.css
    • Removed the file.
  • pyproject.toml
    • Introduced a Python project configuration file with dependencies for the Flet framework.
  • src/locale/ar-EG.ftl
    • Removed the file.
  • src/locale/en-US.ftl
    • Removed the file.
  • src/main.py
    • Added a basic Flet counter application.
  • src/main.rs
    • Removed the file.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.


From Rust to Python, a new start,
Flet takes the stage, a work of art.
No more JSX,
Just Python, okay?
A simpler path, right from the heart.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request transitions the project from a Rust-based Dioxus application to a Python-based Flet application. The changes include removing Rust-related files and dependencies, adding Python project configurations, updating documentation, and simplifying dependency management. Overall, the transition seems well-structured and organized.

Summary of Findings

  • Missing Error Handling: The main.py file lacks error handling. It would be beneficial to include error handling to gracefully manage potential issues during runtime.
  • README.md improvements: The README.md file could be improved by adding a project description and a link to the live demo.

Merge Readiness

The pull request is well-structured and organized, effectively transitioning the project from Rust to Python. However, the main.py file lacks error handling, which should be addressed before merging. Additionally, the README.md file could be improved by adding a project description and a link to the live demo. I am unable to approve the pull request, and users should have others review and approve this code before merging.

Copy link

codecapyai bot commented May 1, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://54.176.2.220:30089/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 1, 2025

🔧 Setting up test environment...

Agent Steps
Cloning repository MH0386/MH0386.github.io...

Let me break this down into steps:

1. First, let's verify if we need to create a .env file and check the project's current state
str_replace_editor: [REDACTED]
Since no environment variables were provided in the instructions, and the message mentions they're already set in the environment, we can proceed without creating one.

2. Let's check if we have npm and install pnpm:
bash: {'command': 'which npm || echo "npm not found"'}
Let's install pnpm globally:
bash: {'command': 'sudo npm install -g pnpm'}
Let's check if we have Python and Poetry installed:
bash: {'command': 'python3 --version && pip3 --version'}
Let's install Poetry if it's not already installed:
bash: {'command': 'curl -sSL https://install.python-poetry.org | python3 -'}
Let's add Poetry to PATH and verify the installation:
bash: {'command': 'export PATH="/home/scrapybara/.local/bin:$PATH" && poetry --version'}
Now let's navigate to the project directory and install dependencies:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry install'}
Now let's start the Flet application in web mode using Poetry:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run --web &'}
Let's give it a moment to start up and then check if it's running:
bash: {'command': 'sleep 5 && ps aux | grep flet'}
Now let's open Chromium and navigate to the Flet application. First, let's take a screenshot to see the desktop:
computer: {'action': 'take_screenshot'}
Let's click on the Applications menu to find Chromium:
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
Let me try again with the correct coordinates:
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
Let me provide the correct command:
computer: {'action': 'move_mouse', 'coordinates': [89, 752]}
Let me try to click directly:
computer: {'action': 'press_key', 'keys': ['alt', 'F1']}
It seems we're having issues with the computer interface tool. Let me provide a structured output indicating the setup was unsuccessful:
structured_output: {'setup_success': False, 'setup_error': 'Unable to complete the setup process due to technical difficulties with the computer interface tool. While we successfully installed all dependencies (pnpm, Poetry) and started the Flet application, we were unable to open Chromium to verify the web interface is working properly.'}

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @MH0386 - I've reviewed your changes - here's some feedback:

  • Consider adding the .idea/ directory to the .gitignore file as IDE configuration is typically user-specific.
  • Placing source code within a dedicated package directory inside src (e.g., src/mh0386githubio/) could improve organisation as the project grows.
Here's what I looked at during the review
  • 🟢 General issues: all looks good
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copy link

codecapyai bot commented May 1, 2025

❌ Something went wrong:

Unable to complete the setup process due to technical difficulties with the computer interface tool. While we successfully installed all dependencies (pnpm, Poetry) and started the Flet application, we were unable to open Chromium to verify the web interface is working properly.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (10)
.idea/misc.xml (1)

3-13: Remove unused Maven settings from a Python project
The MojoSettings component is specific to Maven/Java and does not apply to our Python/Flet setup. Retaining it may introduce confusion. Please remove the entire <component name="MojoSettings"> block.

- <component name="MojoSettings">
-   <option name="profiles">
-     <map>
-       <entry key="default">
-         <value>
-           <MojoSettingsProfile />
-         </value>
-       </entry>
-     </map>
-   </option>
- </component>
src/main.py (3)

1-5: Add window title and docstring to the main function
Consider enhancing the user experience by setting a window title and documenting the entry point. For example:

 def main(page: ft.Page):
+    """Main entry point for the Flet counter app."""
+    page.title = "Counter"
     counter = ft.Text("0", size=50, data=0)

7-11: Annotate the event handler with a type and a docstring
Adding a type hint for the event and a brief docstring improves readability and static analysis support:

-    def increment_click(e):
+    def increment_click(e: ft.ControlEvent):
+        """Increment the counter when the FAB is clicked."""

26-27: Use an entrypoint guard and remove trailing whitespace
Wrapping the app launch in a __main__ guard prevents unintended execution when imported:

- ft.app(main)
+if __name__ == "__main__":
+    ft.app(main)
pyproject.toml (3)

4-5: Populate the project description field
The description is currently empty. Adding a concise summary helps users and tooling understand the project:

-description = ""
+description = "A simple cross-platform GUI counter app built with Flet"

11-13: Align dependency version constraints
For reproducible builds, consider pinning flet-webview to an exact version that is known to be compatible with flet==0.27.6 (e.g., flet-webview==0.1.0).


24-27: Expand the dev dependency group
Including linters and type checkers in the dev group enhances developer productivity and code quality. For example:

[dependency-groups]
dev = [
    "flet[all]>=0.27.6",
+   "ruff>=0.0.241",
+   "mypy>=1.5.1",
]
README.md (3)

9-11: Specify a language for fenced code blocks
Adding a language (e.g., bash) to each code fence improves syntax highlighting. For example:

- ```
+ ```bash
 uv run flet run
- ```
+ ```

Please apply this change consistently across all the code blocks.

Also applies to: 15-17, 23-25, 29-31, 35-37, 45-47, 53-55, 61-63, 69-71, 77-79

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

9-9: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


65-65: Add the missing article in the macOS packaging section
Insert "the" before "macOS package" for grammatical correctness:

- For more details on building macOS package, refer to...
+ For more details on building the macOS package, refer to...
🧰 Tools
🪛 LanguageTool

[uncategorized] ~65-~65: Possible missing article found.
Context: ...os -v ``` For more details on building macOS package, refer to the [macOS Packaging ...

(AI_HYDRA_LEO_MISSING_A)


81-81: Add the missing article in the Windows packaging section
Insert "the" before "Windows package" for grammatical correctness:

- For more details on building Windows package, refer to...
+ For more details on building the Windows package, refer to...
🧰 Tools
🪛 LanguageTool

[uncategorized] ~81-~81: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...` For more details on building Windows package, refer to the [Windows Packaging Guide]...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c5d67f7 and e82445a.

⛔ Files ignored due to path filters (6)
  • .flox/env/manifest.lock is excluded by !**/*.lock
  • Cargo.lock is excluded by !**/*.lock
  • assets/favicon.ico is excluded by !**/*.ico
  • assets/header.svg is excluded by !**/*.svg
  • src/assets/icon.png is excluded by !**/*.png
  • src/assets/splash_android.png is excluded by !**/*.png
📒 Files selected for processing (25)
  • .flox/.gitignore (0 hunks)
  • .flox/env.json (0 hunks)
  • .flox/env/manifest.toml (0 hunks)
  • .github/dependabot.yml (0 hunks)
  • .github/workflows/rust-clippy.yml (0 hunks)
  • .gitignore (1 hunks)
  • .idea/.gitignore (1 hunks)
  • .idea/MH0386.github.io.iml (1 hunks)
  • .idea/MypyPlugin.xml (1 hunks)
  • .idea/inspectionProfiles/profiles_settings.xml (1 hunks)
  • .idea/misc.xml (1 hunks)
  • .idea/modules.xml (1 hunks)
  • .idea/pyright-overrides.xml (1 hunks)
  • .idea/ruff.xml (1 hunks)
  • .idea/vcs.xml (1 hunks)
  • .idx/dev.nix (0 hunks)
  • Cargo.toml (0 hunks)
  • Dioxus.toml (0 hunks)
  • README.md (1 hunks)
  • assets/main.css (0 hunks)
  • pyproject.toml (1 hunks)
  • src/locale/ar-EG.ftl (0 hunks)
  • src/locale/en-US.ftl (0 hunks)
  • src/main.py (1 hunks)
  • src/main.rs (0 hunks)
💤 Files with no reviewable changes (12)
  • .flox/env.json
  • .github/dependabot.yml
  • .github/workflows/rust-clippy.yml
  • src/locale/ar-EG.ftl
  • .flox/.gitignore
  • Cargo.toml
  • Dioxus.toml
  • src/locale/en-US.ftl
  • .idx/dev.nix
  • .flox/env/manifest.toml
  • assets/main.css
  • src/main.rs
🧰 Additional context used
🪛 LanguageTool
README.md

[uncategorized] ~65-~65: Possible missing article found.
Context: ...os -v ``` For more details on building macOS package, refer to the [macOS Packaging ...

(AI_HYDRA_LEO_MISSING_A)


[uncategorized] ~81-~81: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...` For more details on building Windows package, refer to the [Windows Packaging Guide]...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)

🪛 markdownlint-cli2 (0.17.2)
README.md

9-9: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


15-15: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


23-23: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


29-29: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


35-35: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


45-45: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


53-53: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


61-61: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


69-69: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


77-77: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: CodeQL
  • GitHub Check: Summary
🔇 Additional comments (9)
.idea/vcs.xml (1)

3-5: VCS mapping is correct
Defining Git as the Version Control System for the project root ensures proper VCS integration. This configuration looks good.

.idea/inspectionProfiles/profiles_settings.xml (1)

1-6: Default inspection profile is acceptable
Using the IDE’s default inspection profile (USE_PROJECT_PROFILE="false") is sensible for now. You can enable a custom profile later if you require project-specific inspection rules.

.idea/.gitignore (1)

1-8: Appropriate nested .gitignore for IDE-specific files

The .idea/.gitignore correctly scopes ignore patterns to the .idea directory, excluding workspace and local HTTP client artifacts (shelf/, workspace.xml, httpRequests/, dataSources/, dataSources.local.xml) while allowing committed IDE settings to remain. This will keep team-specific metadata out of version control without affecting shared configuration.

.idea/pyright-overrides.xml (1)

1-14: Verify Pyright override component and options

The XML structure for Pyright overrides is valid, but please confirm that the component ID com.insyncwithfoo.pyright.configurations.Override and each <entry key="…"> align with the Pyright plugin’s expected schema. Incorrect keys or component names could prevent IDE-level type checking from applying.

.gitignore (1)

1-163: Comprehensive Python-centric ignore configuration

The new .gitignore exhaustively covers Python artifacts—bytecode caches, build/dist directories, virtual environments, packaging files, logs, test/coverage outputs, type-checker caches, and framework-specific folders (Django, Flask, Scrapy, Sphinx). It also correctly retains .idea/ (commented out) to allow nested .gitignore rules and adds storage/ for Flet. This aligns perfectly with the shift to a Python/Flet project.

.idea/MH0386.github.io.iml (1)

1-8: Ensure Python SDK is configured

The module file currently only inherits the JDK; it doesn’t explicitly reference a Python SDK or facet. Please verify in IntelliJ/ PyCharm that the correct Python interpreter is associated with this module so that Flet, Mypy, Pyright, and Ruff integrations work as intended.

.idea/modules.xml (1)

1-8: Module inclusion is correct

The modules.xml entry cleanly registers the .idea/MH0386.github.io.iml module with the project, ensuring the IDE recognizes the new Python module. This is necessary for consistent workspace setup across team members.

src/main.py (2)

12-14: FloatingActionButton implementation is correct
The FAB configuration and event wiring are consistent with Flet best practices.


15-23: Layout composition is clear and idiomatic
Using SafeArea and Container to center the text widget is appropriate.

Copy link

codecapyai bot commented May 1, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository has been migrated from a legacy Rust/Dioxus implementation to a new Python-based Flet application. The new project uses a minimal counter interface, where a floating action button increments a displayed counter. The README and configuration files have been updated to use Python (via Poetry or uv) and the project structure has been simplified by removing legacy files.

PR Changes

The PR removes all Rust-based and Dioxus-related files and configurations, and introduces a new Python-based Flet application. Notable additions include a pyproject.toml for Python dependency management and a new src/main.py that implements a simple counter UI. The README is updated with instructions to run the app both as a desktop and a web application.

Setup Instructions

To set up the test environment on a blank slate, follow these steps:

  1. Ensure Python 3.11+ is installed on your system.
  2. Install Poetry globally if not already installed (e.g., via 'pip install poetry').
  3. Clone the repository and navigate into it (cd into the repo directory).
  4. Install project dependencies by running:
    poetry install
    (Alternatively, you can use 'uv' if installed.)
  5. To run as a desktop app, execute:
    poetry run flet run
    To run as a web app, execute:
    poetry run flet run --web
  6. For web mode, open your browser and navigate to the localhost address provided in the terminal output.

Generated Test Cases

1: Initial Counter Display Test ❗️❗️❗️

Description: Verifies that upon launching the application (web or desktop), the main UI displays a counter with an initial value of '0' at the center of the screen.

Prerequisites:

  • The application is built and running (either using 'poetry run flet run', 'uv run flet run', or their web counterparts).

Steps:

  1. Start the application in web mode (or desktop mode) as per the README instructions.
  2. Open the app's window or navigate to the provided localhost URL in a browser.
  3. Observe the main area of the UI where the counter is displayed.

Expected Result: The UI should display a counter with the value '0' centered on the screen.

2: Counter Increment Functionality Test ❗️❗️❗️

Description: Checks that clicking the floating action button correctly increments the counter value displayed on the UI.

Prerequisites:

  • The application is running and the initial counter is visible with a value of '0'.

Steps:

  1. Locate the floating action button (typically displayed as a plus icon).
  2. Click the floating action button once.
  3. Verify that the counter value changes from '0' to '1'.
  4. Click the button a second time.
  5. Verify that the counter value increments to '2'.

Expected Result: Each click on the floating action button should increment the counter by one, with the displayed value updating accordingly.

3: Desktop vs Web Launch Mode Verification ❗️❗️

Description: Ensures that the application can be launched in both desktop and web modes and that the UI appears correctly in both cases.

Prerequisites:

  • The environment is set up as per instructions.
  • Access to a browser for web mode testing and a desktop environment for desktop mode testing.

Steps:

  1. For desktop mode: Run the command 'uv run flet run' (or 'poetry run flet run') to launch the desktop version of the app. Verify that a new window opens with the counter interface centered.
  2. For web mode: Run the command 'uv run flet run --web' (or 'poetry run flet run --web'), then open a browser and navigate to the specified localhost URL. Verify that the application loads with the counter interface centered.

Expected Result: In desktop mode, a native window opens displaying the counter UI. In web mode, the browser correctly loads the UI at the localhost URL. In both modes, the counter should display '0' initially and function identically when incremented.

Raw Changes Analyzed
File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -5,10 +5,6 @@
 
 version: 2
 updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
   - package-ecosystem: "github-actions"
     directory: "/" 
     schedule:

File: .github/workflows/main.yml
Changes:
@@ -7,24 +7,22 @@ jobs:
     build:
         runs-on: ubuntu-latest
         steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
+            - name: Checkout
+              uses: actions/[email protected]
+            - name: UV
+              uses: astral-sh/setup-uv@v5
               with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
+                  enable-cache: true
+                  cache-dependency-glob: "uv.lock"
+            - name: Build
+              run: uv run flet build web -v --skip-flutter-doctor
     deploy-resume:
         # needs: build
         # if: success()
         runs-on: ubuntu-latest
         steps:
             - name: Checkout
-              uses: actions/checkout@v4
+              uses: actions/[email protected]
             - name: Fetch main
               run: |
                   git config --global user.name "GitHub Actions"

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .gitignore
Changes:
@@ -1,11 +1,163 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
 
-# These are backup files generated by rustfmt
-**/*.rs.bk
+# C extensions
+*.so
 
-.vscode/
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
 
-node_modules/
\ No newline at end of file
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+*.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Flet
+storage/
\ No newline at end of file

File: .idea/.gitignore
Changes:
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

File: .idea/MH0386.github.io.iml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="jdk" jdkName="uv (MH0386.github.io)" jdkType="Python SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file

File: .idea/MypyPlugin.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MypySettings">
+    <option name="arguments" value="--follow-imports silent --exclude \.pyi$" />
+    <option name="mypyExecutable" value="C:\Users\moham\.local\bin\mypy.exe" />
+    <option name="projectDirectory" value="$PROJECT_DIR$" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/dictionaries/project.xml
Changes:
@@ -0,0 +1,7 @@
+<component name="ProjectDictionaryState">
+  <dictionary name="project">
+    <words>
+      <w>robinraju</w>
+    </words>
+  </dictionary>
+</component>
\ No newline at end of file

File: .idea/inspectionProfiles/profiles_settings.xml
Changes:
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file

File: .idea/misc.xml
Changes:
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Black">
+    <option name="sdkName" value="uv (MH0386.github.io)" />
+  </component>
+  <component name="MojoSettings">
+    <option name="profiles">
+      <map>
+        <entry key="default">
+          <value>
+            <MojoSettingsProfile />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="uv (MH0386.github.io)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file

File: .idea/modules.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/MH0386.github.io.iml" filepath="$PROJECT_DIR$/.idea/MH0386.github.io.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file

File: .idea/pyright-overrides.xml
Changes:
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="com.insyncwithfoo.pyright.configurations.Override">
+    <option name="names">
+      <map>
+        <entry key="autoSearchPaths" value="true" />
+        <entry key="diagnosticMode" value="true" />
+        <entry key="executable" value="true" />
+        <entry key="targetedFileExtensions" value="true" />
+        <entry key="workspaceFolders" value="true" />
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file

File: .idea/ruff.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RuffConfigService">
+    <option name="globalRuffExecutablePath" value="C:\Users\moham\AppData\Local\Microsoft\WinGet\Packages\astral-sh.ruff_Microsoft.Winget.Source_8wekyb3d8bbwe\ruff.exe" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/vcs.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,81 @@
-# MH0386.github.io
+# Mh0386githubio app
 
-[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
 
-[![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
+### uv
 
-It is my personal website.
+Run as a desktop app:
+
+```
+uv run flet run
+```
+
+Run as a web app:
+
+```
+uv run flet run --web
+```
+
+### Poetry
+
+Install dependencies from `pyproject.toml`:
+
+```
+poetry install
+```
+
+Run as a desktop app:
+
+```
+poetry run flet run
+```
+
+Run as a web app:
+
+```
+poetry run flet run --web
+```
+
+For more details on running the app, refer to the [Getting Started Guide](https://flet.dev/docs/getting-started/).
+
+## Build the app
+
+### Android
+
+```
+flet build apk -v
+```
+
+For more details on building and signing `.apk` or `.aab`, refer to the [Android Packaging Guide](https://flet.dev/docs/publish/android/).
+
+### iOS
+
+```
+flet build ipa -v
+```
+
+For more details on building and signing `.ipa`, refer to the [iOS Packaging Guide](https://flet.dev/docs/publish/ios/).
+
+### macOS
+
+```
+flet build macos -v
+```
+
+For more details on building macOS package, refer to the [macOS Packaging Guide](https://flet.dev/docs/publish/macos/).
+
+### Linux
+
+```
+flet build linux -v
+```
+
+For more details on building Linux package, refer to the [Linux Packaging Guide](https://flet.dev/docs/publish/linux/).
+
+### Windows
+
+```
+flet build windows -v
+```
+
+For more details on building Windows package, refer to the [Windows Packaging Guide](https://flet.dev/docs/publish/windows/).
\ No newline at end of file

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: pyproject.toml
Changes:
@@ -0,0 +1,27 @@
+[project]
+name = "mh0386githubio"
+version = "0.1.0"
+description = ""
+readme = "README.md"
+requires-python = ">=3.11"
+authors = [
+    { name = "Mohamed Hisham Abdelzaher", email = "[email protected]" }
+]
+dependencies = [
+  "flet==0.27.6",
+  "flet-webview>=0.1.0",
+]
+
+[tool.flet]
+org = "com.mh0386"
+product = "mh0386githubio"
+company = "MH0386"
+copyright = "Copyright (C) 2025 by MH0386"
+
+[tool.flet.app]
+path = "src"
+
+[dependency-groups]
+dev = [
+    "flet[all]>=0.27.6",
+]

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,26 @@
+import flet as ft
+
+
+def main(page: ft.Page):
+    counter = ft.Text("0", size=50, data=0)
+
+    def increment_click(e):
+        counter.data += 1
+        counter.value = str(counter.data)
+        counter.update()
+
+    page.floating_action_button = ft.FloatingActionButton(
+        icon=ft.Icons.ADD, on_click=increment_click
+    )
+    page.add(
+        ft.SafeArea(
+            ft.Container(
+                counter,
+                alignment=ft.alignment.center,
+            ),
+            expand=True,
+        )
+    )
+
+
+ft.app(main)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

Copy link

codecapyai bot commented May 1, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://54.176.2.220:30060/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 1, 2025

🔧 Setting up test environment...

Agent Steps
Cloning repository MH0386/MH0386.github.io...

Let me go through this step by step.

1. First, let's verify Python 3.11+ is installed and check if we need to create a .env file:
bash: {'command': 'python3 --version && cd /home/scrapybara/Documents/MH0386/MH0386.github.io && ls -la .env'}
The .env file doesn't exist (as there was no output for the ls command), but since no environment variables were provided and the instructions don't mention any required variables, we can proceed without creating one.

2. Let's install Poetry:
bash: {'command': 'pip install poetry'}
Now let's navigate to the repository and install project dependencies:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry install'}
Now let's start the application in web mode and wait for it to be ready:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run --web &'}
Let's give it a moment to start up and then check if it's running:
bash: {'command': 'sleep 5 && ps aux | grep flet'}
Let me try running it in the foreground to see if there are any errors:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run --web'}
Let me check if Flet is actually installed in the project:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry show flet'}
Let me check the project structure:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && ls -la'}
Let me check the pyproject.toml to ensure Flet is listed as a dependency:
str_replace_editor: [REDACTED]
Let me try installing it explicitly with pip and then run the application again:
bash: {'command': 'pip install flet==0.27.6 flet-webview>=0.1.0 && cd /home/scrapybara/Documents/MH0386/MH0386.github.io && PYTHONPATH=/home/scrapybara/Documents/MH0386/MH0386.github.io poetry run flet run src/main.py --web'}
Let me check if there's a main.py file in the src directory:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && ls -la src/'}
Let me check its contents:
str_replace_editor: [REDACTED]
Let me try running it with a different approach using 'python3' directly:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && python3 src/main.py'}
Let's wait a moment and then open Chromium:
computer: {'action': 'take_screenshot'}
Let me try to modify the command to explicitly run in web mode:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && python3 -m flet run src/main.py --web'}
Let me try one more approach by installing Flet globally and running with the Flet CLI:
bash: {'command': 'pip install flet-cli && cd /home/scrapybara/Documents/MH0386/MH0386.github.io && flet run src/main.py --web'}
Here are the issues I've found:

1. While we've successfully installed Python 3.12 and Poetry, the Flet application is not starting properly in web mode.
2. We've tried multiple approaches to run the application (Poetry, direct Python, and Flet CLI) but none have produced the expected web server output.
3. The application code itself looks correct, but there might be an issue with the web server configuration or environment.

Let me provide a structured output indicating the setup was not successful:
structured_output: {'setup_success': False, 'setup_error': 'Unable to start the Flet application in web mode. While all dependencies were installed successfully, the web server is not starting properly. This could be due to environment configuration issues or potential port conflicts.'}

Copy link

codecapyai bot commented May 1, 2025

❌ Something went wrong:

Unable to start the Flet application in web mode. While all dependencies were installed successfully, the web server is not starting properly. This could be due to environment configuration issues or potential port conflicts.

Copy link

codecapyai bot commented May 1, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository, previously a Rust-based Dioxus project, has been migrated to a new Python-based application built with the Flet framework. The legacy Rust files and configurations were removed, and a new Python project configuration (pyproject.toml) and source (src/main.py) were added. The new app displays a simple counter interface with a floating action button to increment the counter.

PR Changes

The pull request removes legacy Rust and Dioxus configurations and files (Cargo.toml, Dioxus.toml, related assets, CI workflows, etc.) and introduces a Python-based Flet application with updated documentation. Users can now run the app as a desktop or web application. The new main.py defines a Flet app that shows a counter (starting at 0) with a floating action button that increments the counter when clicked. Additional changes include updates to IDE configuration, new dependency management using pyproject.toml, and revised README instructions.

Setup Instructions

  1. Ensure that Python (version 3.11 or newer) is installed on your system.
  2. (Optional) Install Poetry globally if it is not already installed using 'pip install poetry'.
  3. In a blank slate environment, clone the repository and navigate to its directory.
  4. Install project dependencies by running 'poetry install' (alternatively, if you prefer uv, ensure that uv is installed and run 'uv run flet run').
  5. To run the application as a desktop app, execute 'poetry run flet run' or 'uv run flet run'.
  6. To run as a web app, execute 'poetry run flet run --web' or 'uv run flet run --web' and then open your browser to the provided localhost URL.
  7. Use the above test steps to interact with the app and verify its functionality.

Generated Test Cases

1: Desktop Counter Increment Test ❗️❗️❗️

Description: This test verifies that the desktop version of the new Flet application renders correctly and that the counter increments when the floating action button is clicked. This is crucial to confirm that the basic interactive functionality works as intended.

Prerequisites:

  • Python (>=3.11) installed
  • Dependencies installed via Poetry (or uv run setup) using 'poetry install' or equivalent
  • The app running in desktop mode (e.g., using 'poetry run flet run' or 'uv run flet run')

Steps:

  1. Launch the app in desktop mode.
  2. Confirm that the main UI displays a counter with the initial value '0' centered on the screen.
  3. Locate and click the floating action button (displaying a plus icon).
  4. Observe the counter value updating to '1'.
  5. Click the floating action button additional times and verify that the counter increments appropriately (e.g., '2', '3', etc.).

Expected Result: The counter value should start at '0' and increment by 1 with each click on the floating action button. The UI should remain responsive and display the updated counter value.

2: Web App Render and Interaction Test ❗️❗️❗️

Description: This test ensures that when the app is run in web mode, the Flet-based UI renders correctly in the browser and the interactive counter functionality behaves as expected.

Prerequisites:

  • Python (>=3.11) installed
  • Dependencies installed via Poetry (or uv run setup)
  • The app running in web mode (e.g., using 'poetry run flet run --web' or 'uv run flet run --web')
  • A web browser open to the appropriate localhost URL

Steps:

  1. Launch the app in web mode.
  2. Open a web browser and navigate to the localhost address where the app is served.
  3. Verify that the UI displays the counter with the initial value '0' and a floating action button.
  4. Click the floating action button and observe that the counter updates (increments) accordingly.
  5. Ensure that the page layout remains consistent and no rendering errors are shown.

Expected Result: The web application should load without errors, displaying an initial counter value of '0' and a visible floating action button. Clicking the button should increment the counter, and the UI layout should remain intact.

3: UI Visual Layout Consistency Test ❗️❗️

Description: This test checks that the visual appearance and layout of the new Flet application are consistent across its interface, ensuring that key elements like the counter and floating action button are positioned correctly.

Prerequisites:

  • The app started either in desktop or web mode with dependencies installed

Steps:

  1. Launch the application in the desired mode (desktop or web).
  2. Verify that the background, text color, and overall aesthetic conform to the design outlined in the new documentation (i.e., dark background with centered text).
  3. Check that the counter is centered on the screen and that the floating action button is clearly visible and positioned in a consistent location (typically at the bottom right or as defined by Flet).
  4. Ensure that there is no visual overlap or layout breakage when interacting with the counter button.

Expected Result: The user interface should display a clear and consistent layout with a centered counter and a properly positioned floating action button. Visual styling (colors, fonts, spacing) should be as per the project documentation without any overlaps or misalignments.

Raw Changes Analyzed
File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -5,10 +5,6 @@
 
 version: 2
 updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
   - package-ecosystem: "github-actions"
     directory: "/" 
     schedule:

File: .github/workflows/main.yml
Changes:
@@ -2,29 +2,26 @@ name: gh-pages
 on:
     workflow_dispatch:
     push:
-        branches: [main]
 jobs:
     build:
         runs-on: ubuntu-latest
         steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
+            - name: Checkout
+              uses: actions/[email protected]
+            - name: UV
+              uses: astral-sh/setup-uv@v5
               with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
+                  enable-cache: true
+                  cache-dependency-glob: "uv.lock"
+            - name: Build
+              run: uv run flet build web -v --skip-flutter-doctor
     deploy-resume:
         # needs: build
         # if: success()
         runs-on: ubuntu-latest
         steps:
             - name: Checkout
-              uses: actions/checkout@v4
+              uses: actions/[email protected]
             - name: Fetch main
               run: |
                   git config --global user.name "GitHub Actions"

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .gitignore
Changes:
@@ -1,11 +1,163 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
 
-# These are backup files generated by rustfmt
-**/*.rs.bk
+# C extensions
+*.so
 
-.vscode/
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
 
-node_modules/
\ No newline at end of file
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+*.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Flet
+storage/
\ No newline at end of file

File: .idea/.gitignore
Changes:
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

File: .idea/MH0386.github.io.iml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="jdk" jdkName="uv (MH0386.github.io)" jdkType="Python SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file

File: .idea/MypyPlugin.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MypySettings">
+    <option name="arguments" value="--follow-imports silent --exclude \.pyi$" />
+    <option name="mypyExecutable" value="C:\Users\moham\.local\bin\mypy.exe" />
+    <option name="projectDirectory" value="$PROJECT_DIR$" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/dictionaries/project.xml
Changes:
@@ -0,0 +1,7 @@
+<component name="ProjectDictionaryState">
+  <dictionary name="project">
+    <words>
+      <w>robinraju</w>
+    </words>
+  </dictionary>
+</component>
\ No newline at end of file

File: .idea/inspectionProfiles/profiles_settings.xml
Changes:
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file

File: .idea/misc.xml
Changes:
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Black">
+    <option name="sdkName" value="uv (MH0386.github.io)" />
+  </component>
+  <component name="MojoSettings">
+    <option name="profiles">
+      <map>
+        <entry key="default">
+          <value>
+            <MojoSettingsProfile />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="uv (MH0386.github.io)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file

File: .idea/modules.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/MH0386.github.io.iml" filepath="$PROJECT_DIR$/.idea/MH0386.github.io.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file

File: .idea/pyright-overrides.xml
Changes:
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="com.insyncwithfoo.pyright.configurations.Override">
+    <option name="names">
+      <map>
+        <entry key="autoSearchPaths" value="true" />
+        <entry key="diagnosticMode" value="true" />
+        <entry key="executable" value="true" />
+        <entry key="targetedFileExtensions" value="true" />
+        <entry key="workspaceFolders" value="true" />
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file

File: .idea/ruff.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RuffConfigService">
+    <option name="globalRuffExecutablePath" value="C:\Users\moham\AppData\Local\Microsoft\WinGet\Packages\astral-sh.ruff_Microsoft.Winget.Source_8wekyb3d8bbwe\ruff.exe" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/vcs.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,81 @@
-# MH0386.github.io
+# Mh0386githubio app
 
-[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
 
-[![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
+### uv
 
-It is my personal website.
+Run as a desktop app:
+
+```
+uv run flet run
+```
+
+Run as a web app:
+
+```
+uv run flet run --web
+```
+
+### Poetry
+
+Install dependencies from `pyproject.toml`:
+
+```
+poetry install
+```
+
+Run as a desktop app:
+
+```
+poetry run flet run
+```
+
+Run as a web app:
+
+```
+poetry run flet run --web
+```
+
+For more details on running the app, refer to the [Getting Started Guide](https://flet.dev/docs/getting-started/).
+
+## Build the app
+
+### Android
+
+```
+flet build apk -v
+```
+
+For more details on building and signing `.apk` or `.aab`, refer to the [Android Packaging Guide](https://flet.dev/docs/publish/android/).
+
+### iOS
+
+```
+flet build ipa -v
+```
+
+For more details on building and signing `.ipa`, refer to the [iOS Packaging Guide](https://flet.dev/docs/publish/ios/).
+
+### macOS
+
+```
+flet build macos -v
+```
+
+For more details on building macOS package, refer to the [macOS Packaging Guide](https://flet.dev/docs/publish/macos/).
+
+### Linux
+
+```
+flet build linux -v
+```
+
+For more details on building Linux package, refer to the [Linux Packaging Guide](https://flet.dev/docs/publish/linux/).
+
+### Windows
+
+```
+flet build windows -v
+```
+
+For more details on building Windows package, refer to the [Windows Packaging Guide](https://flet.dev/docs/publish/windows/).
\ No newline at end of file

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: pyproject.toml
Changes:
@@ -0,0 +1,27 @@
+[project]
+name = "mh0386githubio"
+version = "0.1.0"
+description = ""
+readme = "README.md"
+requires-python = ">=3.11"
+authors = [
+    { name = "Mohamed Hisham Abdelzaher", email = "[email protected]" }
+]
+dependencies = [
+  "flet==0.27.6",
+  "flet-webview>=0.1.0",
+]
+
+[tool.flet]
+org = "com.mh0386"
+product = "mh0386githubio"
+company = "MH0386"
+copyright = "Copyright (C) 2025 by MH0386"
+
+[tool.flet.app]
+path = "src"
+
+[dependency-groups]
+dev = [
+    "flet[all]>=0.27.6",
+]

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,26 @@
+import flet as ft
+
+
+def main(page: ft.Page):
+    counter = ft.Text("0", size=50, data=0)
+
+    def increment_click(e):
+        counter.data += 1
+        counter.value = str(counter.data)
+        counter.update()
+
+    page.floating_action_button = ft.FloatingActionButton(
+        icon=ft.Icons.ADD, on_click=increment_click
+    )
+    page.add(
+        ft.SafeArea(
+            ft.Container(
+                counter,
+                alignment=ft.alignment.center,
+            ),
+            expand=True,
+        )
+    )
+
+
+ft.app(main)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

Copy link

codecapyai bot commented May 1, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://54.153.120.199:30107/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 1, 2025

🔧 Setting up test environment...

Agent Steps
Cloning repository MH0386/MH0386.github.io...

Let me go through this step by step.

1. First, let's check if we're in the correct directory and examine the current state:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && pwd && ls -la'}
Let's check the Python version to ensure it meets the requirement (3.11 or newer):
bash: {'command': 'python3 --version'}
Let's install Poetry globally:
bash: {'command': 'pip install poetry'}
Let's check the contents of pyproject.toml to understand the project dependencies:
str_replace_editor: [REDACTED]
Now let's install the project dependencies using Poetry:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry install'}
Let's run the application as a web app:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run --web &'}
Let's wait a moment for the server to start and then get a screenshot to verify it's running. First, let's open Chromium:
computer: {'action': 'take_screenshot'}
Let's click on the Applications menu and find Chromium:
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
Let me try again with the correct coordinate format:
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
Let me try a different approach by checking if the Flet app is running and what port it's using:
bash: {'command': 'ps aux | grep flet'}
Let's try running it again with more verbose output:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run src/main.py --web'}
Let me check if there's a main.py file in the src directory:
str_replace_editor: [REDACTED]
Let's try running it one more time with different options and capture any error output:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && PYTHONPATH=/home/scrapybara/Documents/MH0386/MH0386.github.io poetry run python src/main.py --web 2>&1'}
Let's find it and try again:
bash: {'command': 'which poetry'}
Let me try installing poetry again to make sure it's in the PATH:
bash: {'command': 'curl -sSL https://install.python-poetry.org | python3 -'}
Now let's add poetry to the PATH and try again:
bash: {'command': 'export PATH="/home/scrapybara/.local/bin:$PATH" && cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry run flet run src/main.py --web'}
According to the Flet documentation, it typically runs on port 8550 when in web mode. Let's verify this:
bash: {'command': 'netstat -tuln | grep 8550'}
Let me try with curl to see if we can reach the web server:
bash: {'command': 'curl http://localhost:8550'}
While we've successfully:
   - Verified Python 3.12 is installed (meets the >=3.11 requirement)
   - Installed Poetry
   - Checked the project structure and dependencies
   - Found and verified the main.py file exists

2. We're having trouble:
   - Getting the Flet application to run properly in web mode
   - Confirming the web server is running and accessible

Given these issues, I'll need to return a failure status:
structured_output: {'setup_success': False, 'setup_error': 'Unable to start the Flet application in web mode. The application appears to start but is not responding on the expected port (8550). This could be due to configuration issues or potential conflicts with the desktop environment setup.'}

Copy link

codecapyai bot commented May 1, 2025

❌ Something went wrong:

Unable to start the Flet application in web mode. The application appears to start but is not responding on the expected port (8550). This could be due to configuration issues or potential conflicts with the desktop environment setup.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
.github/workflows/main.yml (2)

9-10: Consider pinning actions/checkout to the major version and fetching full history
Pinning to actions/[email protected] locks both minor and patch versions, which may prevent critical fixes. Consider using actions/checkout@v4 to automatically pick up non-breaking updates.
Also, if you need to switch branches later (e.g., gh-pages), add fetch-depth: 0 to ensure full history is available.


24-25: Align checkout settings in the deploy-resume job
Similar to the build job, consider using actions/checkout@v4 and setting fetch-depth: 0 to ensure you can fetch or switch to branches like gh-pages without manually running git fetch.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e82445a and ac6c17a.

📒 Files selected for processing (4)
  • .github/workflows/main.yml (1 hunks)
  • .idea/MH0386.github.io.iml (1 hunks)
  • .idea/dictionaries/project.xml (1 hunks)
  • .idea/misc.xml (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • .idea/dictionaries/project.xml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .idea/MH0386.github.io.iml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Summary
🔇 Additional comments (3)
.github/workflows/main.yml (2)

11-15: Verify the uv.lock file path and caching behavior
Enabling cache for UV dependencies is a great performance optimization. Please confirm that uv.lock is located at the repository root (matching this glob) so that the cache key works as intended.


17-17: Build step uses UV to run the Flet build command
The uv run flet build web -v --skip-flutter-doctor command clearly reflects the new Python/Flet workflow. No issues noted here.

.idea/misc.xml (1)

1-2: Approve XML declaration and project version.

The XML header and <project> version declaration are correctly defined.

Copy link

codecapyai bot commented May 1, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository has been migrated from a legacy Rust-based Dioxus project to a new Python-based application using the Flet framework. The new project uses a simplified structure with a pyproject.toml file and a single Python entry-point (src/main.py) that creates a basic counter interface. The application can run as a desktop app or as a web app.

PR Changes

The pull request removes all Rust, Dioxus, and related configuration files and dependencies, replacing them with new Python-based project configuration files. The README has been updated to include instructions for running the Flet-based app. A basic counter application is introduced in src/main.py which displays a counter and a floating action button that increments the counter when clicked.

Setup Instructions

  1. Ensure that Node.js and npm are installed on your system.
  2. Install pnpm globally by running: sudo npm install -g pnpm
  3. Clone the repository and navigate inside its directory.
  4. Install project dependencies by running: pnpm install
  5. For Python dependencies, you can use Poetry:
    a. Install Poetry if not already installed.
    b. Run 'poetry install' in the repository directory.
  6. To run the app as a desktop application, execute: 'uv run flet run' (or 'poetry run flet run').
  7. To run the app as a web application, execute: 'uv run flet run --web' (or 'poetry run flet run --web') and open your web browser at the localhost URL provided.

Generated Test Cases

1: Desktop App Counter Increment Test ❗️❗️❗️

Description: Tests the core functionality of the desktop version of the Flet-based counter app. It verifies that the counter starts at '0' and increments correctly when the floating action button is clicked.

Prerequisites:

  • Ensure a clean installation and that no legacy Rust files are present.
  • Run the desktop version using the provided command (e.g. 'uv run flet run' or 'poetry run flet run').

Steps:

  1. Open a terminal in the repository directory.
  2. Run the command 'uv run flet run' to start the desktop version of the app.
  3. Wait for the Flet app window to open and observe that a centered text displaying '0' is shown.
  4. Locate and click the floating action button (typically represented by a plus icon).
  5. Observe that the counter text updates to '1'.
  6. Click the floating action button additional times and verify that the number increments accordingly.

Expected Result: The application should display the counter starting at '0', and each click on the floating action button should increase the displayed number by one.

2: Web App Counter Increment Test ❗️❗️❗️

Description: Tests the core functionality of the web version of the Flet-based counter app. It ensures that the counter initially displays '0' and properly increments with each click of the floating action button in the browser.

Prerequisites:

  • Ensure a clean installation and that no legacy Rust files are present.
  • Run the web version using the command 'uv run flet run --web' or 'poetry run flet run --web'.

Steps:

  1. Open a terminal in the repository directory.
  2. Run the command 'uv run flet run --web' to launch the web version of the app.
  3. Open a web browser and navigate to the indicated localhost URL (typically http://localhost:8550 or a similar port displayed in the terminal).
  4. Verify that the page displays a centered counter with the initial value '0'.
  5. Click the floating action button (plus icon) displayed on the page.
  6. Observe that the counter value updates to '1'.
  7. Repeat the click several times to confirm the counter increments consistently.

Expected Result: The web application should initially display '0' and, upon clicking the floating action button, the counter should increment by one for each click.

3: Visual Layout and Element Alignment Verification ❗️❗️

Description: Ensures that the basic visual layout of the app conforms to the design expectations by verifying that the counter text is centered and the floating action button appears in the correct position.

Prerequisites:

  • The app (desktop or web) should be running using the appropriate command.

Steps:

  1. Launch the application in either desktop mode ('uv run flet run') or web mode ('uv run flet run --web').
  2. Observe that the counter is centrally aligned within the application window.
  3. Verify that the floating action button is present in a prominent position (typically at the bottom-right or floating over the content).
  4. Ensure that the overall color scheme and layout match the updated design expectations as per the new documentation.

Expected Result: The user should see a neatly centered counter value with the floating action button clearly visible and accessible. The overall theme should reflect the new Python Flet configuration without remnants of legacy styling.

Raw Changes Analyzed
File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -5,10 +5,6 @@
 
 version: 2
 updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
   - package-ecosystem: "github-actions"
     directory: "/" 
     schedule:

File: .github/workflows/main.yml
Changes:
@@ -2,29 +2,34 @@ name: gh-pages
 on:
     workflow_dispatch:
     push:
-        branches: [main]
 jobs:
     build:
         runs-on: ubuntu-latest
         steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
+            - name: Checkout
+              uses: actions/[email protected]
+            - name: Restore cache
+              uses: actions/cache@v4
+              with:
+                path: $HOME/flutter
+                key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}
+                restore-keys: |
+                  uv-${{ runner.os }}-${{ hashFiles('uv.lock') }}
+                  uv-${{ runner.os }}
+            - name: UV
+              uses: astral-sh/setup-uv@v5
               with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
+                  enable-cache: true
+                  cache-dependency-glob: "uv.lock"
+            - name: Build
+              run: uv run flet build web -v --skip-flutter-doctor
     deploy-resume:
         # needs: build
         # if: success()
         runs-on: ubuntu-latest
         steps:
             - name: Checkout
-              uses: actions/checkout@v4
+              uses: actions/[email protected]
             - name: Fetch main
               run: |
                   git config --global user.name "GitHub Actions"

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .gitignore
Changes:
@@ -1,11 +1,163 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
 
-# These are backup files generated by rustfmt
-**/*.rs.bk
+# C extensions
+*.so
 
-.vscode/
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
 
-node_modules/
\ No newline at end of file
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+*.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Flet
+storage/
\ No newline at end of file

File: .idea/.gitignore
Changes:
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

File: .idea/MH0386.github.io.iml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="jdk" jdkName="uv (MH0386.github.io)" jdkType="Python SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file

File: .idea/MypyPlugin.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MypySettings">
+    <option name="arguments" value="--follow-imports silent --exclude \.pyi$" />
+    <option name="mypyExecutable" value="C:\Users\moham\.local\bin\mypy.exe" />
+    <option name="projectDirectory" value="$PROJECT_DIR$" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/dictionaries/project.xml
Changes:
@@ -0,0 +1,7 @@
+<component name="ProjectDictionaryState">
+  <dictionary name="project">
+    <words>
+      <w>robinraju</w>
+    </words>
+  </dictionary>
+</component>
\ No newline at end of file

File: .idea/inspectionProfiles/profiles_settings.xml
Changes:
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file

File: .idea/misc.xml
Changes:
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Black">
+    <option name="sdkName" value="uv (MH0386.github.io)" />
+  </component>
+  <component name="MojoSettings">
+    <option name="profiles">
+      <map>
+        <entry key="default">
+          <value>
+            <MojoSettingsProfile />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="uv (MH0386.github.io)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file

File: .idea/modules.xml
Changes:
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/MH0386.github.io.iml" filepath="$PROJECT_DIR$/.idea/MH0386.github.io.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file

File: .idea/pyright-overrides.xml
Changes:
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="com.insyncwithfoo.pyright.configurations.Override">
+    <option name="names">
+      <map>
+        <entry key="autoSearchPaths" value="true" />
+        <entry key="diagnosticMode" value="true" />
+        <entry key="executable" value="true" />
+        <entry key="targetedFileExtensions" value="true" />
+        <entry key="workspaceFolders" value="true" />
+      </map>
+    </option>
+  </component>
+</project>
\ No newline at end of file

File: .idea/ruff.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RuffConfigService">
+    <option name="globalRuffExecutablePath" value="C:\Users\moham\AppData\Local\Microsoft\WinGet\Packages\astral-sh.ruff_Microsoft.Winget.Source_8wekyb3d8bbwe\ruff.exe" />
+  </component>
+</project>
\ No newline at end of file

File: .idea/vcs.xml
Changes:
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,81 @@
-# MH0386.github.io
+# Mh0386githubio app
 
-[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
 
-[![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
+### uv
 
-It is my personal website.
+Run as a desktop app:
+
+```
+uv run flet run
+```
+
+Run as a web app:
+
+```
+uv run flet run --web
+```
+
+### Poetry
+
+Install dependencies from `pyproject.toml`:
+
+```
+poetry install
+```
+
+Run as a desktop app:
+
+```
+poetry run flet run
+```
+
+Run as a web app:
+
+```
+poetry run flet run --web
+```
+
+For more details on running the app, refer to the [Getting Started Guide](https://flet.dev/docs/getting-started/).
+
+## Build the app
+
+### Android
+
+```
+flet build apk -v
+```
+
+For more details on building and signing `.apk` or `.aab`, refer to the [Android Packaging Guide](https://flet.dev/docs/publish/android/).
+
+### iOS
+
+```
+flet build ipa -v
+```
+
+For more details on building and signing `.ipa`, refer to the [iOS Packaging Guide](https://flet.dev/docs/publish/ios/).
+
+### macOS
+
+```
+flet build macos -v
+```
+
+For more details on building macOS package, refer to the [macOS Packaging Guide](https://flet.dev/docs/publish/macos/).
+
+### Linux
+
+```
+flet build linux -v
+```
+
+For more details on building Linux package, refer to the [Linux Packaging Guide](https://flet.dev/docs/publish/linux/).
+
+### Windows
+
+```
+flet build windows -v
+```
+
+For more details on building Windows package, refer to the [Windows Packaging Guide](https://flet.dev/docs/publish/windows/).
\ No newline at end of file

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: pyproject.toml
Changes:
@@ -0,0 +1,27 @@
+[project]
+name = "mh0386githubio"
+version = "0.1.0"
+description = ""
+readme = "README.md"
+requires-python = ">=3.11"
+authors = [
+    { name = "Mohamed Hisham Abdelzaher", email = "[email protected]" }
+]
+dependencies = [
+  "flet==0.27.6",
+  "flet-webview>=0.1.0",
+]
+
+[tool.flet]
+org = "com.mh0386"
+product = "mh0386githubio"
+company = "MH0386"
+copyright = "Copyright (C) 2025 by MH0386"
+
+[tool.flet.app]
+path = "src"
+
+[dependency-groups]
+dev = [
+    "flet[all]>=0.27.6",
+]

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,26 @@
+import flet as ft
+
+
+def main(page: ft.Page):
+    counter = ft.Text("0", size=50, data=0)
+
+    def increment_click(e):
+        counter.data += 1
+        counter.value = str(counter.data)
+        counter.update()
+
+    page.floating_action_button = ft.FloatingActionButton(
+        icon=ft.Icons.ADD, on_click=increment_click
+    )
+    page.add(
+        ft.SafeArea(
+            ft.Container(
+                counter,
+                alignment=ft.alignment.center,
+            ),
+            expand=True,
+        )
+    )
+
+
+ft.app(main)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

Copy link

codecapyai bot commented May 1, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://54.176.2.220:30071/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 1, 2025

✅ Setup complete! Running tests...

Agent Steps
Cloning repository MH0386/MH0386.github.io...

First, let's check if we're in the correct directory and if .env is needed:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && ls -la'}
First, check Node.js and npm:
bash: {'command': 'node --version && npm --version'}
Install pnpm globally:
bash: {'command': 'sudo npm install -g pnpm'}
We're already in the repository directory.

4. Install project dependencies with pnpm:
bash: {'command': 'pnpm install'}
Let's proceed with the Python setup.

5. Install Poetry:
bash: {'command': 'curl -sSL https://install.python-poetry.org | python3 - && poetry --version'}
Add Poetry to PATH:
bash: {'command': 'export PATH="/home/scrapybara/.local/bin:$PATH" && poetry --version'}
Install project dependencies with Poetry:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && poetry install'}
Now, let's install uv since the instructions mention using it:
bash: {'command': 'curl -LsSf https://astral.sh/uv/install.sh | sh'}
Let's start the app in web mode since we need to test in a browser:
bash: {'command': 'cd /home/scrapybara/Documents/MH0386/MH0386.github.io && PATH="/home/scrapybara/.local/bin:$PATH" uv run flet run --web &'}
Let's wait a moment for the server to start and check if it's running:
bash: {'command': 'sleep 5 && curl -I http://localhost:8550'}
Now let's open Chromium and navigate to the app:
computer: {'action': 'take_screenshot'}
Let's click on the Applications menu and launch Chromium:
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
computer: {'action': 'move_mouse', 'coordinates': [20, 752]}
Let me try a different approach:
bash: {'command': 'chromium-browser http://localhost:8550 &'}
Let's wait a moment for Chromium to load and then check if we can see the application:
computer: {'action': 'take_screenshot'}
The environment appears to be properly set up and working as expected. Let me provide a structured output to indicate success:
structured_output: {'setup_success': True}

Copy link

codecapyai bot commented May 26, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository hosts a personal portfolio web app migrated from a Rust/Dioxus-based implementation to a Python/Flet-based application. The new app displays multiple page views (Home, Projects, Certificates, Contact, and Resume) using Flet, and configuration files (pyproject.toml) have been added. Legacy files for Rust/Dioxus have been removed, and documentation, CI workflows, and dependency management have been updated.

PR Changes

The PR removes legacy Rust and Dioxus-related files and configurations. It adds new Python configurations via pyproject.toml and implements a Flet-based multi-view application. New pages include Home, Projects, Certificates, Contact, and Resume with proper navigation controls. Several GitHub Actions workflows and configuration files related to code quality, deployment and dependency management have also been updated.

Setup Instructions

  1. On a fresh system, install Node.js if not already installed. Then install pnpm globally: sudo npm install -g pnpm.
  2. Clone the repository and navigate into the repo directory.
  3. Install Python 3.11 or higher and create a virtual environment if required.
  4. Run 'pnpm install' to install any JavaScript/CLI dependencies (if any) and install Python dependencies using 'pip install -e .' or 'pip install flet loguru' based on pyproject.toml.
  5. Start the application by running: python src/main.py. This should launch the Flet web app in a browser (default port 8555 or as indicated in the console output).
  6. Open a web browser and navigate to the provided localhost URL to run the UI tests manually.

Generated Test Cases

1: Home Page Load and Visual Verification ❗️❗️❗️

Description: Tests that the Home page loads correctly with expected text and layout elements.

Prerequisites:

  • The application is running in the test environment.

Steps:

  1. Open a web browser and navigate to the application URL (e.g., http://localhost:8555 or the specified port).
  2. Observe the Home view which should display the greeting text, the name 'Mohamed Hisham Abdelzaher', and three navigation buttons: 'Projects', 'Resume', and 'Contact'.

Expected Result: The browser displays the Home page with centered text saying 'Hi, My name is' followed by 'Mohamed Hisham Abdelzaher' and shows navigation buttons for Projects, Resume, and Contact. The layout is responsive as per design in the Home view.

2: Navigation from Home to Projects ❗️❗️❗️

Description: Checks navigation from the Home view to the Projects page when the 'Projects' button is clicked.

Prerequisites:

  • The application is running and the Home page is loaded.

Steps:

  1. On the Home page, click the 'Projects' button.
  2. Observe the transition as the app navigates to the Projects view.

Expected Result: The Projects view loads with an AppBar titled 'Projects' and additional text content such as 'My Projects' along with details indicating that project information will be shown. A 'Home' button is available to return to the Home view.

3: Navigation from Home to Contact ❗️❗️❗️

Description: Verifies that clicking the 'Contact' button navigates to the Contact page and displays contact information correctly.

Prerequisites:

  • The application is running and the Home page is loaded.

Steps:

  1. On the Home page, click the 'Contact' button.
  2. Wait for the transition to the Contact view.
  3. Inspect that the AppBar shows the title 'Contact' and contact controls are visible.

Expected Result: The Contact view loads showing an AppBar with 'Contact', and multiple contact links (mail, GitHub, GitLab, LinkedIn, etc.) are displayed. The 'Home' button is included for navigation back.

4: Navigation from Home to Resume and PDF Embed Verification ❗️❗️❗️

Description: Ensures that from the Home page clicking the 'Resume' button navigates to the Resume view and that the PDF resume is embedded correctly.

Prerequisites:

  • The application is running and the Home page is loaded.

Steps:

  1. On the Home page, click the 'Resume' button.
  2. Wait for the Resume view to load.
  3. Inspect that the Resume view shows an AppBar titled 'Resume' and contains an embedded PDF viewer element.

Expected Result: The Resume view loads with an AppBar titled 'Resume'. The embedded PDF viewer (or an embed element) is visible, displaying the resume document or a fallback message if PDF embedding is not supported.

5: Navigation from Projects Back to Home ❗️❗️

Description: Validates that the 'Home' button on the Projects page returns the user to the Home view.

Prerequisites:

  • User is on the Projects view.

Steps:

  1. On the Projects view, click the 'Home' button.
  2. Observe that the Home view is loaded.

Expected Result: Clicking 'Home' on the Projects view navigates the user back to the Home view, displaying the original greeting and navigation options.

6: Direct Route Access to Certificates Page ❗️❗️

Description: Tests that navigating directly to the certificates route displays the Certificates view with proper content.

Prerequisites:

  • The application is running.

Steps:

  1. Manually change the URL in the browser to include the '/certificates' route (e.g., http://localhost:8555/#/certificates).
  2. Press Enter and wait for the page to load.

Expected Result: The Certificates view loads with an AppBar titled 'Certificates' and at least one certificate item (e.g., a button linking to a certificate link) is visible. A 'Home' button should be present for navigation back.

7: Visual Layout and AppBar Color Verification Across Views ❗️❗️

Description: Ensures that each view (Projects, Certificates, Contact, Resume) displays a consistent AppBar and follows the expected color scheme and layout.

Prerequisites:

  • The application is running.

Steps:

  1. Navigate to each view by clicking the respective navigation buttons or using direct URL routes.
  2. Inspect the AppBar of each view to verify that the title text is correct and the background color matches the defined Colors.SURFACE_CONTAINER_HIGHEST.
  3. Verify overall alignment of elements (centered, consistent padding and spacing) across pages.

Expected Result: Each view displays an AppBar with the correct title and background color. The UI elements are aligned and spaced according to specifications from the design. Visual appearance is consistent across all pages.

Raw Changes Analyzed
File: .deepsource.toml
Changes:
@@ -1,13 +1,19 @@
-version = 1
+version=1
 
 [[analyzers]]
-name = "rust"
+  dependency_file_paths=["pyproject.toml"]
+  name="python"
 
 [analyzers.meta]
-msrv = "stable"
+  additional_builtins=["_", "pretty_output"]
+  runtime_version="3.x.x"
+  type_checker="mypy"
 
 [[analyzers]]
-name = "secrets"
+  name="docker"
+
+[[analyzers]]
+  name="secrets"
 
 [[transformers]]
-name = "rustfmt"
+  name="ruff"

File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -1,15 +0,0 @@
-# To get started with Dependabot version updates, you'll need to specify which
-# package ecosystems to update and where the package manifests are located.
-# Please see the documentation for all configuration options:
-# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
-
-version: 2
-updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
-  - package-ecosystem: "github-actions"
-    directory: "/" 
-    schedule:
-      interval: "weekly"

File: .github/workflows/code_analysis.yml
Changes:
@@ -0,0 +1,32 @@
+name: Trunk Code Quality
+on:
+  push:
+  pull_request:
+permissions: read-all
+concurrency:
+  group: ${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+jobs:
+  trunk:
+    name: Trunk Code Quality
+    runs-on: ubuntu-latest
+    permissions:
+      checks: write
+      contents: read
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+      - name: Install uv
+        uses: astral-sh/setup-uv@v6
+        id: uv
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Trunk Code Quality
+        uses: trunk-io/trunk-action@v1
+        with:
+          check-mode: all
+          arguments: --github-annotate-new-only=false

File: .github/workflows/deploy.yml
Changes:
@@ -0,0 +1,40 @@
+name: Deploy to GitHub Pages
+on:
+  workflow_dispatch:
+  push:
+permissions:
+  contents: write
+  pages: write
+  id-token: write
+jobs:
+  build_web:
+    name: Build Web
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: UV
+        uses: astral-sh/setup-uv@v6
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Build
+        run: flet publish
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: dist/
+  deploy_web:
+    name: Deploy Web
+    runs-on: ubuntu-latest
+    needs: build_web
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4

File: .github/workflows/main.yml
Changes:
@@ -1,57 +0,0 @@
-name: gh-pages
-on:
-    workflow_dispatch:
-    push:
-        branches: [main]
-jobs:
-    build:
-        runs-on: ubuntu-latest
-        steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
-              with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
-    deploy-resume:
-        # needs: build
-        # if: success()
-        runs-on: ubuntu-latest
-        steps:
-            - name: Checkout
-              uses: actions/checkout@v4
-            - name: Fetch main
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-            - name: Download Resume
-              uses: robinraju/[email protected]
-              with:
-                  latest: true
-                  fileName: "resume.pdf"
-                  out-file-path: "data/docs/"
-                  repository: "MH0386/MH0386"
-            - name: Commit and Push Resume
-              run: |
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git pull
-                  git push || (echo "Failed to push changes" && exit 1)
-            - name: Fetch gh-pages
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-                  git checkout gh-pages || (echo "Failed to checkout gh-pages branch" && exit 1)
-            - name: Commit and Push Resume
-              run: |
-                  git checkout main -- data/docs/
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git push || (echo "Failed to push changes" && exit 1)

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .github/workflows/sync.yml
Changes:
@@ -0,0 +1,46 @@
+name: Sync Docs
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - main
+    paths-ignore:
+      - .github/workflows/sync.yml
+  schedule:
+    - cron: "0 8 * * 1-5"
+permissions:
+  contents: write
+  pages: write
+jobs:
+  sync_docs:
+    name: Sync Docs to ${{ matrix.branch }}
+    runs-on: ubuntu-latest
+    if: github.ref_name == 'main'
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [main, gh-pages]
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          ref: ${{ matrix.branch }}
+          fetch-depth: 0
+      - name: Git Config
+        run: |
+          git config --global user.name "github-actions[bot]"
+          git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+      - name: Download Docs
+        uses: robinraju/[email protected]
+        with:
+          latest: true
+          fileName: "resume.pdf"
+          out-file-path: "data/docs/"
+          repository: "MH0386/MH0386"
+      - name: Commit & Push to ${{ matrix.branch }}
+        continue-on-error: true
+        run: |
+          git add data/docs/
+          git commit -m "Update Docs"
+          git pull
+          git push

File: .github/workflows/trunk_upgrade.yml
Changes:
@@ -0,0 +1,18 @@
+name: Upgrade Trunk Check
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: 0 8 * * 1-5
+permissions: read-all
+jobs:
+  trunk_upgrade:
+    name: Upgrade Trunk
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+      pull-requests: write
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Trunk Upgrade
+        uses: trunk-io/trunk-action/upgrade@v1

File: .gitignore
Changes:
@@ -1,11 +1,3 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-.vscode/
-
-node_modules/
\ No newline at end of file
+**/__pycache__/
+**/.dccache
+.venv/

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: .trunk/.gitignore
Changes:
@@ -0,0 +1,9 @@
+*out
+*logs
+*actions
+*notifications
+*tools
+plugins
+user_trunk.yaml
+user.yaml
+tmp

File: .trunk/configs/.isort.cfg
Changes:
@@ -0,0 +1,2 @@
+[settings]
+profile=black

File: .trunk/configs/.markdownlint.yaml
Changes:
@@ -0,0 +1,2 @@
+# Prettier friendly markdownlint config (all formatting rules disabled)
+extends: markdownlint/style/prettier

File: .trunk/configs/.prettierrc.yaml
Changes:
@@ -0,0 +1,3 @@
+proseWrap: "always"
+singleQuote: false
+bracketSpacing: true

File: .trunk/configs/.yamllint.yaml
Changes:
@@ -0,0 +1,27 @@
+extends: default
+rules:
+  braces:
+    level: warning
+    max-spaces-inside: 1
+  brackets:
+    level: warning
+    max-spaces-inside: 1
+  colons:
+    level: warning
+  commas:
+    level: warning
+  comments: disable
+  comments-indentation: disable
+  document-start: disable
+  empty-lines:
+    level: warning
+  hyphens:
+    level: warning
+  indentation:
+    level: warning
+    indent-sequences: consistent
+  line-length:
+    level: warning
+    allow-non-breakable-inline-mappings: true
+    max: 100
+  truthy: disable

File: .trunk/configs/pyrightconfig.json
Changes:
@@ -0,0 +1,7 @@
+{
+  "venvPath": ".",
+  "reportMissingParameterType": true,
+  "reportMissingTypeStubs": false,
+  "analyzeUnannotatedFunctions": true,
+  "venv": ".venv"
+}

File: .trunk/configs/ruff.toml
Changes:
@@ -0,0 +1,73 @@
+exclude=[
+  ".bzr",
+  ".direnv",
+  ".eggs",
+  ".git",
+  ".git-rewrite",
+  ".hg",
+  ".ipynb_checkpoints",
+  ".mypy_cache",
+  ".nox",
+  ".pants.d",
+  ".pyenv",
+  ".pytest_cache",
+  ".pytype",
+  ".ruff_cache",
+  ".svn",
+  ".tox",
+  ".venv",
+  ".vscode",
+  "__pypackages__",
+  "_build",
+  "buck-out",
+  "build",
+  "dist",
+  "node_modules",
+  "site-packages",
+  "venv",
+]
+
+indent-width=4
+line-length=88
+target-version="py310"
+
+[lint]
+  # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
+  # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
+  # McCabe complexity (`C901`) by default.
+  ignore=[]
+  select=["E4", "E7", "E9", "F"]
+
+  # Allow fix for all enabled rules (when `--fix`) is provided.
+  fixable=["ALL"]
+  unfixable=[]
+
+  # Allow unused variables when underscore-prefixed.
+  dummy-variable-rgx="^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
+
+[format]
+  # Like Black, use double quotes for strings.
+  quote-style="double"
+
+  # Like Black, indent with spaces, rather than tabs.
+  indent-style="space"
+
+  # Like Black, respect magic trailing commas.
+  skip-magic-trailing-comma=false
+
+  # Like Black, automatically detect the appropriate line ending.
+  line-ending="auto"
+
+  # Enable auto-formatting of code examples in docstrings. Markdown,
+  # reStructuredText code/literal blocks and doctests are all supported.
+  #
+  # This is currently disabled by default, but it is planned for this
+  # to be opt-out in the future.
+  docstring-code-format=false
+
+  # Set the line length limit used when formatting code snippets in
+  # docstrings.
+  #
+  # This only has an effect when the `docstring-code-format` setting is
+  # enabled.
+  docstring-code-line-length="dynamic"

File: .trunk/configs/taplo.toml
Changes:
@@ -0,0 +1,8 @@
+include=["**/*.toml"]
+
+[formatting]
+  compact_entries=true
+  indent_entries=true
+  reorder_arrays=true
+  reorder_inline_tables=true
+  reorder_keys=true

File: .trunk/trunk.yaml
Changes:
@@ -0,0 +1,45 @@
+# This file controls the behavior of Trunk: https://docs.trunk.io/cli
+# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
+version: 0.1
+cli:
+  version: 1.22.15
+# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
+plugins:
+  sources:
+    - id: trunk
+      ref: v1.6.8
+      uri: https://github.com/trunk-io/plugins
+# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
+runtimes:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
+lint:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - git-diff-check
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+actions:
+  enabled:
+    - trunk-announce
+    - trunk-check-pre-push
+    - trunk-fmt-pre-commit
+    - trunk-upgrade-available

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1 @@
-# MH0386.github.io
-
-[![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
-[![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
-
-It is my personal website.
+# Mohamed Hisham Abdelzaher's Portfolio

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: data/info.json
Changes:
@@ -1,3 +0,0 @@
-{
-    "views": 0
-}

File: pyproject.toml
Changes:
@@ -0,0 +1,25 @@
+[project]
+  authors=[
+    { name="Mohamed Hisham Abdelzaher", email="[email protected]" },
+  ]
+  dependencies=["flet-webview>=0.1.0", "flet==0.27.6", "loguru>=0.7.3"]
+  description=""
+  name="mh0386githubio"
+  readme="README.md"
+  requires-python=">=3.11"
+  version="0.1.0"
+
+[tool.flet]
+  company="MH0386"
+  copyright="Copyright (C) 2025 by MH0386"
+  org="com.mh0386"
+  product="mh0386githubio"
+
+[tool.flet.app]
+  path="src"
+
+[dependency-groups]
+  dev=["flet[all]>=0.27.6", "ruff>=0.11.11", "ty>=0.0.1a6"]
+
+[tool.pyright]
+  reportUnknownMemberType=false

File: renovate.json
Changes:
@@ -1,9 +1,5 @@
 {
   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
-  "extends": [
-    "config:recommended"
-  ],
-  "lockFileMaintenance": {
-    "enabled": true
-  }
+  "extends": ["config:recommended"],
+  "lockFileMaintenance": { "enabled": true }
 }

File: src/assets/data/info.json
Changes:
@@ -0,0 +1,3 @@
+{
+  "views": 0
+}

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,45 @@
+from flet import (
+    AppView,
+    CrossAxisAlignment,
+    MainAxisAlignment,
+    Page,
+    RouteChangeEvent,
+    View,
+    app,
+)
+from loguru import logger
+
+from pages.home import home
+from pages.projects import projects
+
+
+def main(page: Page) -> None:
+    page.title = "Mohamed Hisham Abdelzaher"
+    page.vertical_alignment = MainAxisAlignment.CENTER
+    page.horizontal_alignment = CrossAxisAlignment.CENTER
+
+    def route_change(route: RouteChangeEvent) -> None:
+        page.views.clear()
+        match page.route:
+            case "/":
+                page.views.append(home(page=page))
+            case "/projects":
+                page.views.append(projects(page=page))
+        page.update()
+        logger.info(route)
+
+    def view_pop(view: RouteChangeEvent) -> None:
+        page.views.pop()
+        top_view: View = page.views[-1]
+        page.go(route=str(object=top_view.route))
+        logger.info(view)
+
+    page.on_route_change = route_change
+    page.on_view_pop = view_pop  # type: ignore
+    page.go(route=page.route)
+
+
+app(
+    target=main,
+    view=AppView.WEB_BROWSER,
+)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

File: src/pages/certificates.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def certificates(page: Page) -> View:
+    return View(
+        route="/certificates",
+        controls=[
+            AppBar(
+                title=Text(value="Certificates"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/contact.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def contact(page: Page) -> View:
+    return View(
+        route="/contact",
+        controls=[
+            AppBar(
+                title=Text(value="Contact"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/home.py
Changes:
@@ -0,0 +1,51 @@
+from flet import (
+    Column,
+    CrossAxisAlignment,
+    ElevatedButton,
+    MainAxisAlignment,
+    Page,
+    Row,
+    Text,
+    View,
+)
+
+
+def home(page: Page) -> View:
+    return View(
+        route="/",
+        controls=[
+            Row(
+                controls=[
+                    Column(
+                        alignment=MainAxisAlignment.CENTER,
+                        horizontal_alignment=CrossAxisAlignment.CENTER,
+                        expand=True,
+                        controls=[
+                            Text(value="Hi, My name is"),
+                            Text(value="Mohamed Hisham Abdelzaher"),
+                            Row(
+                                controls=[
+                                    ElevatedButton(
+                                        text="Projects",
+                                        on_click=lambda _: page.go(route="/projects"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Resume",
+                                        on_click=lambda _: page.go(route="/resume"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Contact",
+                                        on_click=lambda _: page.go(route="/contact"),
+                                    ),
+                                ],
+                                spacing=10,
+                                alignment=MainAxisAlignment.CENTER,
+                            ),
+                        ],
+                    ),
+                ],
+                alignment=MainAxisAlignment.CENTER,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/projects.py
Changes:
@@ -0,0 +1,25 @@
+from flet import AppBar, Colors, Column, ElevatedButton, FontWeight, Page, Text, View
+
+
+def projects(page: Page) -> View:
+    return View(
+        route="/projects",
+        controls=[
+            AppBar(
+                title=Text(value="Projects"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+            Column(
+                controls=[
+                    Text(value="My Projects", size=20, weight=FontWeight.BOLD),
+                    Text(value="Project details will be added here..."),
+                ],
+                spacing=20,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/resume.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def resume(page: Page) -> View:
+    return View(
+        route="/resume",
+        controls=[
+            AppBar(
+                title=Text(value="Resume"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

Copy link

codecapyai bot commented May 26, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://13.56.246.38:30008/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 26, 2025

🔧 Setting up test environment...

Agent Steps

Copy link

codecapyai bot commented May 26, 2025

❌ Something went wrong:

status_code: 500, body: {'detail': '403: No agent credits remaining. Please upgrade your plan.'}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
.trunk/trunk.yaml (1)

21-39: Comprehensive lint toolset—review CI impact.
Enabling security (e.g., snyk, trivy, trufflehog) and style tools (black, ruff) is thorough, but could lengthen CI runs. Consider:

  • Grouping fast linters in pre-commit.
  • Scheduling heavy scans (e.g., trufflehog, gitleaks) nightly or on-demand.
.trunk/configs/ruff.toml (1)

48-67: Consider enabling docstring code formatting.
You’ve set docstring-code-format=false for now. Enabling it in the future can help maintain consistency in code examples and doctests across your documentation.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c5d0f5a and 381f8d4.

📒 Files selected for processing (9)
  • .deepsource.toml (1 hunks)
  • .gitignore (1 hunks)
  • .trunk/configs/.prettierrc.yaml (1 hunks)
  • .trunk/configs/pyrightconfig.json (1 hunks)
  • .trunk/configs/ruff.toml (1 hunks)
  • .trunk/configs/taplo.toml (1 hunks)
  • .trunk/trunk.yaml (1 hunks)
  • pyproject.toml (1 hunks)
  • renovate.json (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • .trunk/configs/.prettierrc.yaml
  • renovate.json
  • .trunk/configs/pyrightconfig.json
  • .trunk/configs/taplo.toml
🚧 Files skipped from review as they are similar to previous changes (2)
  • .gitignore
  • pyproject.toml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Summary
🔇 Additional comments (12)
.deepsource.toml (5)

1-1: Confirm DeepSource config version.

The version=1 declaration is correct for the DeepSource config schema.


4-5: Python analyzer correctly configured.

Specifying dependency_file_paths=["pyproject.toml"] and name="python" aligns with the new Python/Flet setup.


8-10: Analyzer metadata for Python is appropriate.

Adding builtins ["_", "pretty_output"], setting runtime_version="3.x.x", and enabling mypy ensures type checking and recognizes Flet-specific globals.


13-16: Docker and Secrets analyzers added.

Including the docker and secrets analyzers will surface issues in Dockerfiles and detect leaked secrets; this complements the Python analyzer.


19-19: Switch to Ruff transformer.

Using ruff for code formatting/linting replaces the Rust-centric transformer and aligns with the Python codebase.

.trunk/trunk.yaml (4)

3-6: Pin CLI version intentionally.
The Trunk CLI is locked to version 1.22.15, which ensures reproducible tooling behavior. Please verify that this aligns with your project requirements and is the desired version for all contributors.


9-12: Plugin version lock looks good.
Pinning the trunk plugin to ref v1.6.8 from the official repo will help maintain stability. Consider adding a checksum or digest if available to guard against supply-chain risks.


15-17: Verify language runtime versions.
You’ve enabled Go 1.21.0, Node.js 18.20.5, and Python 3.10.8. Double-check that these match the versions declared in your pyproject.toml, docs, and any Docker images or local dev setups to avoid CI mismatches.


42-45: Trunk actions enabled.
The selected Trunk actions (trunk-announce, trunk-check-pre-push, trunk-fmt-pre-commit, trunk-upgrade-available) align well with enforcing consistency and upgrade notifications.

.trunk/configs/ruff.toml (3)

1-28: Review exclude patterns.
The exclude block covers common VCS, cache, and build directories. Ensure it also excludes any custom output directories (e.g., docs/_build) and doesn’t inadvertently skip source or test files.


30-33: Formatting thresholds match Black.
Setting indent-width=4 and line-length=88 is consistent with Black’s defaults and Python community standards.


34-47: Focused lint rule selection.
Enabling Pyflakes (F) and E4/E7/E9 codes provides clean error checking without complexity or style warnings. You can expand or adjust select/ignore as your codebase evolves.

MH0386 added 2 commits May 27, 2025 00:24
Enhances the README by adding badges from SonarCloud and CodeFactor.

These badges provide a quick overview of the project's code quality and help to ensure maintainability.
Enables stricter type checking by enforcing type annotations for functions and disables reporting of unknown member types to reduce noise.
Copy link

codecapyai bot commented May 26, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository is a personal portfolio website that has been migrated from a legacy Rust/Dioxus implementation to a new Python-based application using the Flet framework. The application now uses Python configuration files (pyproject.toml) and organizes UI views into pages (Home, Projects, Certificates, Contact, and Resume) with navigation enabled through Flet.

PR Changes

The pull request removes all legacy Rust-based files and configurations (including Cargo.toml, Dioxus.toml, and associated assets/styles) and replaces them with new Python-based project files and configurations for a Flet web application. New pages for the portfolio have been introduced, along with updated documentation and deployment workflows. The UI components, navigation logic, and visual presentation have been adapted to the Flet framework.

Setup Instructions

  1. Install pnpm globally if not already installed: sudo npm install -g pnpm.
  2. Clone the repository and navigate into it: cd .
  3. Install dependencies by running: pnpm install.
  4. Start the development server using: pnpm dev.
  5. Open your web browser and navigate to http://localhost:8501 (or the port specified by the dev server) to interact with the web application.

Generated Test Cases

1: Home Page Content Display Test ❗️❗️❗️

Description: Verifies that the Home page displays the expected content including greeting text and the portfolio owner’s name.

Prerequisites:

  • Test environment set up and application running
  • User is on the Home page (default route '/')

Steps:

  1. Open the web browser and navigate to the local instance of the application (e.g., http://localhost:8501).
  2. Observe the Home page content.
  3. Check that the text 'Hi, My name is' is visible.
  4. Check that the text 'Mohamed Hisham Abdelzaher' is visible.

Expected Result: The Home page should render with centered text including the greeting and the full name of the portfolio owner along with navigation buttons for different sections.

2: Navigation from Home to Projects Page ❗️❗️❗️

Description: Tests the navigation workflow by clicking the 'Projects' button on the Home page and verifying that the Projects view is displayed.

Prerequisites:

  • Test environment set up and application running
  • User is on the Home page

Steps:

  1. On the Home page, locate the 'Projects' button.
  2. Click on the 'Projects' button.
  3. Wait for the page transition to occur.
  4. Verify that the view changes to the Projects page and that an AppBar with the title 'Projects' is displayed.

Expected Result: The application should navigate to the Projects page showing an AppBar titled 'Projects' and additional text such as 'My Projects' or project details.

3: Navigation from Home to Resume Page ❗️❗️❗️

Description: Checks that clicking the 'Resume' button on the Home page properly transitions to the Resume view.

Prerequisites:

  • Test environment set up and application running
  • User is on the Home page

Steps:

  1. On the Home page, locate the 'Resume' button.
  2. Click on the 'Resume' button.
  3. Wait for the page transition to complete.
  4. Confirm that the Resume page displays an AppBar with the title 'Resume' and a 'Home' button.

Expected Result: The Resume view should load with an AppBar titled 'Resume', and the Home button should be available to navigate back.

4: Certificates Page Display Test ❗️❗️

Description: Validates that the Certificates page is rendered correctly when its route is accessed.

Prerequisites:

  • Test environment set up and application running
  • User navigates to the Certificates page (via direct URL or navigation)

Steps:

  1. Navigate directly to the '/certificates' route or click any navigation link/button for Certificates if available.
  2. Observe the page rendering.
  3. Check that an AppBar with the title 'Certificates' is visible.
  4. Ensure that the page provides a Home navigation button.

Expected Result: The Certificates page should display with an AppBar titled 'Certificates' and include interactive elements (like a Home button) to return to the main view.

5: Contact Page External Links Test ❗️❗️

Description: Ensures that the Contact page loads correctly and that the provided external link buttons are visible and interactive.

Prerequisites:

  • Test environment set up and application running
  • User navigates to the Contact page

Steps:

  1. Navigate to the '/contact' route (either through a Home button or directly).
  2. Verify that an AppBar with the title 'Contact' is displayed.
  3. Examine the list of external links (e.g., Gmail, GitHub, LinkedIn, etc.).
  4. Hover over a few of the external link controls to observe any hover effects.
  5. Click on one of the links to check that it opens in a new browser tab (or window).

Expected Result: The Contact page should render an AppBar titled 'Contact' along with several clickable external link elements, each opening in a new tab.

6: Resume Page Home Navigation Test ❗️❗️

Description: Verifies that the Resume page contains a Home button that navigates back to the Home view.

Prerequisites:

  • Test environment set up and application running
  • User is on the Resume page

Steps:

  1. Navigate to the Resume page, either directly or via the Home page button.
  2. Locate the 'Home' button on the Resume view.
  3. Click the 'Home' button.
  4. Wait for the application to navigate back to the Home page.
  5. Ensure that the Home page displays the correct greeting and portfolio name.

Expected Result: After clicking the Home button on the Resume page, the application should display the Home view with the correct greeting and layout.

Raw Changes Analyzed
File: .deepsource.toml
Changes:
@@ -1,13 +1,19 @@
-version = 1
+version=1
 
 [[analyzers]]
-name = "rust"
+  dependency_file_paths=["pyproject.toml"]
+  name="python"
 
 [analyzers.meta]
-msrv = "stable"
+  additional_builtins=["_", "pretty_output"]
+  runtime_version="3.x.x"
+  type_checker="mypy"
 
 [[analyzers]]
-name = "secrets"
+  name="docker"
+
+[[analyzers]]
+  name="secrets"
 
 [[transformers]]
-name = "rustfmt"
+  name="ruff"

File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -1,15 +0,0 @@
-# To get started with Dependabot version updates, you'll need to specify which
-# package ecosystems to update and where the package manifests are located.
-# Please see the documentation for all configuration options:
-# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
-
-version: 2
-updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
-  - package-ecosystem: "github-actions"
-    directory: "/" 
-    schedule:
-      interval: "weekly"

File: .github/workflows/code_analysis.yml
Changes:
@@ -0,0 +1,32 @@
+name: Trunk Code Quality
+on:
+  push:
+  pull_request:
+permissions: read-all
+concurrency:
+  group: ${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+jobs:
+  trunk:
+    name: Trunk Code Quality
+    runs-on: ubuntu-latest
+    permissions:
+      checks: write
+      contents: read
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+      - name: Install uv
+        uses: astral-sh/setup-uv@v6
+        id: uv
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Trunk Code Quality
+        uses: trunk-io/trunk-action@v1
+        with:
+          check-mode: all
+          arguments: --github-annotate-new-only=false

File: .github/workflows/deploy.yml
Changes:
@@ -0,0 +1,40 @@
+name: Deploy to GitHub Pages
+on:
+  workflow_dispatch:
+  push:
+permissions:
+  contents: write
+  pages: write
+  id-token: write
+jobs:
+  build_web:
+    name: Build Web
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: UV
+        uses: astral-sh/setup-uv@v6
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Build
+        run: flet publish
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: dist/
+  deploy_web:
+    name: Deploy Web
+    runs-on: ubuntu-latest
+    needs: build_web
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4

File: .github/workflows/main.yml
Changes:
@@ -1,57 +0,0 @@
-name: gh-pages
-on:
-    workflow_dispatch:
-    push:
-        branches: [main]
-jobs:
-    build:
-        runs-on: ubuntu-latest
-        steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
-              with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
-    deploy-resume:
-        # needs: build
-        # if: success()
-        runs-on: ubuntu-latest
-        steps:
-            - name: Checkout
-              uses: actions/checkout@v4
-            - name: Fetch main
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-            - name: Download Resume
-              uses: robinraju/[email protected]
-              with:
-                  latest: true
-                  fileName: "resume.pdf"
-                  out-file-path: "data/docs/"
-                  repository: "MH0386/MH0386"
-            - name: Commit and Push Resume
-              run: |
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git pull
-                  git push || (echo "Failed to push changes" && exit 1)
-            - name: Fetch gh-pages
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-                  git checkout gh-pages || (echo "Failed to checkout gh-pages branch" && exit 1)
-            - name: Commit and Push Resume
-              run: |
-                  git checkout main -- data/docs/
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git push || (echo "Failed to push changes" && exit 1)

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .github/workflows/sync.yml
Changes:
@@ -0,0 +1,46 @@
+name: Sync Docs
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - main
+    paths-ignore:
+      - .github/workflows/sync.yml
+  schedule:
+    - cron: "0 8 * * 1-5"
+permissions:
+  contents: write
+  pages: write
+jobs:
+  sync_docs:
+    name: Sync Docs to ${{ matrix.branch }}
+    runs-on: ubuntu-latest
+    if: github.ref_name == 'main'
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [main, gh-pages]
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          ref: ${{ matrix.branch }}
+          fetch-depth: 0
+      - name: Git Config
+        run: |
+          git config --global user.name "github-actions[bot]"
+          git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+      - name: Download Docs
+        uses: robinraju/[email protected]
+        with:
+          latest: true
+          fileName: "resume.pdf"
+          out-file-path: "data/docs/"
+          repository: "MH0386/MH0386"
+      - name: Commit & Push to ${{ matrix.branch }}
+        continue-on-error: true
+        run: |
+          git add data/docs/
+          git commit -m "Update Docs"
+          git pull
+          git push

File: .github/workflows/trunk_upgrade.yml
Changes:
@@ -0,0 +1,18 @@
+name: Upgrade Trunk Check
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: 0 8 * * 1-5
+permissions: read-all
+jobs:
+  trunk_upgrade:
+    name: Upgrade Trunk
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+      pull-requests: write
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Trunk Upgrade
+        uses: trunk-io/trunk-action/upgrade@v1

File: .gitignore
Changes:
@@ -1,11 +1,3 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-.vscode/
-
-node_modules/
\ No newline at end of file
+**/__pycache__/
+**/.dccache
+.venv/

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: .trunk/.gitignore
Changes:
@@ -0,0 +1,9 @@
+*out
+*logs
+*actions
+*notifications
+*tools
+plugins
+user_trunk.yaml
+user.yaml
+tmp

File: .trunk/configs/.isort.cfg
Changes:
@@ -0,0 +1,2 @@
+[settings]
+profile=black

File: .trunk/configs/.markdownlint.yaml
Changes:
@@ -0,0 +1,2 @@
+# Prettier friendly markdownlint config (all formatting rules disabled)
+extends: markdownlint/style/prettier

File: .trunk/configs/.prettierrc.yaml
Changes:
@@ -0,0 +1,3 @@
+proseWrap: "always"
+singleQuote: false
+bracketSpacing: true

File: .trunk/configs/.yamllint.yaml
Changes:
@@ -0,0 +1,27 @@
+extends: default
+rules:
+  braces:
+    level: warning
+    max-spaces-inside: 1
+  brackets:
+    level: warning
+    max-spaces-inside: 1
+  colons:
+    level: warning
+  commas:
+    level: warning
+  comments: disable
+  comments-indentation: disable
+  document-start: disable
+  empty-lines:
+    level: warning
+  hyphens:
+    level: warning
+  indentation:
+    level: warning
+    indent-sequences: consistent
+  line-length:
+    level: warning
+    allow-non-breakable-inline-mappings: true
+    max: 100
+  truthy: disable

File: .trunk/configs/pyrightconfig.json
Changes:
@@ -0,0 +1,8 @@
+{
+  "analyzeUnannotatedFunctions": true,
+  "reportMissingParameterType": true,
+  "reportMissingTypeStubs": false,
+  "reportUnknownMemberType": false,
+  "venv": ".venv",
+  "venvPath": "."
+}

File: .trunk/configs/ruff.toml
Changes:
@@ -0,0 +1,73 @@
+exclude=[
+  ".bzr",
+  ".direnv",
+  ".eggs",
+  ".git",
+  ".git-rewrite",
+  ".hg",
+  ".ipynb_checkpoints",
+  ".mypy_cache",
+  ".nox",
+  ".pants.d",
+  ".pyenv",
+  ".pytest_cache",
+  ".pytype",
+  ".ruff_cache",
+  ".svn",
+  ".tox",
+  ".venv",
+  ".vscode",
+  "__pypackages__",
+  "_build",
+  "buck-out",
+  "build",
+  "dist",
+  "node_modules",
+  "site-packages",
+  "venv",
+]
+
+indent-width=4
+line-length=88
+target-version="py310"
+
+[lint]
+  # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
+  # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
+  # McCabe complexity (`C901`) by default.
+  ignore=[]
+  select=["E4", "E7", "E9", "F"]
+
+  # Allow fix for all enabled rules (when `--fix`) is provided.
+  fixable=["ALL"]
+  unfixable=[]
+
+  # Allow unused variables when underscore-prefixed.
+  dummy-variable-rgx="^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
+
+[format]
+  # Like Black, use double quotes for strings.
+  quote-style="double"
+
+  # Like Black, indent with spaces, rather than tabs.
+  indent-style="space"
+
+  # Like Black, respect magic trailing commas.
+  skip-magic-trailing-comma=false
+
+  # Like Black, automatically detect the appropriate line ending.
+  line-ending="auto"
+
+  # Enable auto-formatting of code examples in docstrings. Markdown,
+  # reStructuredText code/literal blocks and doctests are all supported.
+  #
+  # This is currently disabled by default, but it is planned for this
+  # to be opt-out in the future.
+  docstring-code-format=false
+
+  # Set the line length limit used when formatting code snippets in
+  # docstrings.
+  #
+  # This only has an effect when the `docstring-code-format` setting is
+  # enabled.
+  docstring-code-line-length="dynamic"

File: .trunk/configs/taplo.toml
Changes:
@@ -0,0 +1,8 @@
+include=["**/*.toml"]
+
+[formatting]
+  compact_entries=true
+  indent_entries=true
+  reorder_arrays=true
+  reorder_inline_tables=true
+  reorder_keys=true

File: .trunk/trunk.yaml
Changes:
@@ -0,0 +1,45 @@
+# This file controls the behavior of Trunk: https://docs.trunk.io/cli
+# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
+version: 0.1
+cli:
+  version: 1.22.15
+# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
+plugins:
+  sources:
+    - id: trunk
+      ref: v1.6.8
+      uri: https://github.com/trunk-io/plugins
+# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
+runtimes:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
+lint:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - git-diff-check
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+actions:
+  enabled:
+    - trunk-announce
+    - trunk-check-pre-push
+    - trunk-fmt-pre-commit
+    - trunk-upgrade-available

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,4 @@
-# MH0386.github.io
+# Mohamed Hisham Abdelzaher's Portfolio
 
 [![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
 [![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
-
-It is my personal website.

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: data/info.json
Changes:
@@ -1,3 +0,0 @@
-{
-    "views": 0
-}

File: pyproject.toml
Changes:
@@ -0,0 +1,25 @@
+[project]
+  authors=[
+    { name="Mohamed Hisham Abdelzaher", email="[email protected]" },
+  ]
+  dependencies=["flet-webview>=0.1.0", "flet==0.27.6", "loguru>=0.7.3"]
+  description=""
+  name="mh0386githubio"
+  readme="README.md"
+  requires-python=">=3.11"
+  version="0.1.0"
+
+[tool.flet]
+  company="MH0386"
+  copyright="Copyright (C) 2025 by MH0386"
+  org="com.mh0386"
+  product="mh0386githubio"
+
+[tool.flet.app]
+  path="src"
+
+[dependency-groups]
+  dev=["flet[all]>=0.27.6", "ruff>=0.11.11", "ty>=0.0.1a6"]
+
+[tool.pyright]
+  reportUnknownMemberType=false

File: renovate.json
Changes:
@@ -1,9 +1,5 @@
 {
   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
-  "extends": [
-    "config:recommended"
-  ],
-  "lockFileMaintenance": {
-    "enabled": true
-  }
+  "extends": ["config:recommended"],
+  "lockFileMaintenance": { "enabled": true }
 }

File: src/assets/data/info.json
Changes:
@@ -0,0 +1,3 @@
+{
+  "views": 0
+}

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,45 @@
+from flet import (
+    AppView,
+    CrossAxisAlignment,
+    MainAxisAlignment,
+    Page,
+    RouteChangeEvent,
+    View,
+    app,
+)
+from loguru import logger
+
+from pages.home import home
+from pages.projects import projects
+
+
+def main(page: Page) -> None:
+    page.title = "Mohamed Hisham Abdelzaher"
+    page.vertical_alignment = MainAxisAlignment.CENTER
+    page.horizontal_alignment = CrossAxisAlignment.CENTER
+
+    def route_change(route: RouteChangeEvent) -> None:
+        page.views.clear()
+        match page.route:
+            case "/":
+                page.views.append(home(page=page))
+            case "/projects":
+                page.views.append(projects(page=page))
+        page.update()
+        logger.info(route)
+
+    def view_pop(view: RouteChangeEvent) -> None:
+        page.views.pop()
+        top_view: View = page.views[-1]
+        page.go(route=str(object=top_view.route))
+        logger.info(view)
+
+    page.on_route_change = route_change
+    page.on_view_pop = view_pop  # type: ignore
+    page.go(route=page.route)
+
+
+app(
+    target=main,
+    view=AppView.WEB_BROWSER,
+)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

File: src/pages/certificates.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def certificates(page: Page) -> View:
+    return View(
+        route="/certificates",
+        controls=[
+            AppBar(
+                title=Text(value="Certificates"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/contact.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def contact(page: Page) -> View:
+    return View(
+        route="/contact",
+        controls=[
+            AppBar(
+                title=Text(value="Contact"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/home.py
Changes:
@@ -0,0 +1,51 @@
+from flet import (
+    Column,
+    CrossAxisAlignment,
+    ElevatedButton,
+    MainAxisAlignment,
+    Page,
+    Row,
+    Text,
+    View,
+)
+
+
+def home(page: Page) -> View:
+    return View(
+        route="/",
+        controls=[
+            Row(
+                controls=[
+                    Column(
+                        alignment=MainAxisAlignment.CENTER,
+                        horizontal_alignment=CrossAxisAlignment.CENTER,
+                        expand=True,
+                        controls=[
+                            Text(value="Hi, My name is"),
+                            Text(value="Mohamed Hisham Abdelzaher"),
+                            Row(
+                                controls=[
+                                    ElevatedButton(
+                                        text="Projects",
+                                        on_click=lambda _: page.go(route="/projects"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Resume",
+                                        on_click=lambda _: page.go(route="/resume"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Contact",
+                                        on_click=lambda _: page.go(route="/contact"),
+                                    ),
+                                ],
+                                spacing=10,
+                                alignment=MainAxisAlignment.CENTER,
+                            ),
+                        ],
+                    ),
+                ],
+                alignment=MainAxisAlignment.CENTER,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/projects.py
Changes:
@@ -0,0 +1,25 @@
+from flet import AppBar, Colors, Column, ElevatedButton, FontWeight, Page, Text, View
+
+
+def projects(page: Page) -> View:
+    return View(
+        route="/projects",
+        controls=[
+            AppBar(
+                title=Text(value="Projects"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+            Column(
+                controls=[
+                    Text(value="My Projects", size=20, weight=FontWeight.BOLD),
+                    Text(value="Project details will be added here..."),
+                ],
+                spacing=20,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/resume.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def resume(page: Page) -> View:
+    return View(
+        route="/resume",
+        controls=[
+            AppBar(
+                title=Text(value="Resume"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

Copy link

codecapyai bot commented May 26, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://13.56.246.38:30037/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

Copy link

codecapyai bot commented May 26, 2025

🔧 Setting up test environment...

Agent Steps

Copy link

codecapyai bot commented May 26, 2025

❌ Something went wrong:

status_code: 500, body: {'detail': '403: No agent credits remaining. Please upgrade your plan.'}

@MH0386
Copy link
Owner Author

MH0386 commented May 26, 2025

@Mergifyio queue

Copy link
Contributor

mergify bot commented May 26, 2025

queue

🛑 The pull request has been removed from the queue default

The pull request #88 has been manually updated.

You can take a look at Queue: Embarked in merge queue check runs for more details about the failure.

@MH0386
Copy link
Owner Author

MH0386 commented May 26, 2025

@Mergifyio rebase

Copy link
Contributor

mergify bot commented May 26, 2025

rebase

☑️ Nothing to do, the required conditions are not met

  • -conflict [📌 rebase requirement]
  • -closed [📌 rebase requirement]
  • queue-position = -1 [📌 rebase requirement]
  • any of:
    • #commits > 1 [📌 rebase requirement]
    • #commits-behind > 0 [📌 rebase requirement]
    • -linear-history [📌 rebase requirement]

MH0386 added 2 commits May 27, 2025 00:44
Disables the `reportAttributeAccessIssue` setting in pyright to reduce noise from false positives.

Also, removes the type ignore on `page.on_view_pop` in `src/main.py` as it is no longer needed.
Copy link

codecapyai bot commented May 26, 2025

CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎

Codebase Summary

This repository represents Mohamed Hisham Abdelzaher's personal portfolio. It has been migrated from a Rust-based Dioxus application to a Python-based Flet application. The new project structure includes Python files for configuring and running a multi-page web application with views for Home, Projects, Certificates, Contact, and Resume. The user interface now uses Flet controls such as AppBar, Text, Row, Column, and ElevatedButton to facilitate navigation between pages.

PR Changes

The pull request removes legacy Rust/Dioxus files and replaces them with Python project files including a pyproject.toml and new page implementations in the src/pages directory. The navigation flow has been updated: the Home page now displays introductory text and buttons to navigate to Projects, Resume, and Contact pages, while separate pages exist for Certificates, Projects, Contact, and Resume. Documentation has been updated accordingly and dependency management is now handled by Python configurations.

Setup Instructions

  1. Install Node.js and pnpm: Open a terminal and run: sudo npm install -g pnpm.
  2. Clone the repository and navigate to the project directory.
  3. Install any Node dependencies (if needed for local tooling) by running: pnpm install.
  4. Ensure Python 3.11 (or later) is installed.
  5. Install Python dependencies using pip if required (alternatively, use pyproject.toml with a tool like Poetry or pipenv as documented in the README).
  6. Start the Flet development server by running the command: python src/main.py.
  7. Open a web browser and navigate to http://localhost to view the application.

Generated Test Cases

1: Home Page Rendering Test ❗️❗️❗️

Description: Verify that the Home page loads correctly and displays key introductory UI elements. This test is important as it confirms the landing page renders properly with correct text and navigation buttons.

Prerequisites:

  • Application is running
  • User has navigated to the root URL (/) of the application

Steps:

  1. Start the application and open a browser pointing to http://localhost (or the appropriate local URL).
  2. Observe that the Home page displays the greeting text (e.g., 'Hi, My name is'), the name 'Mohamed Hisham Abdelzaher', and buttons labeled 'Projects', 'Resume', and 'Contact'.

Expected Result: The Home page should display the introductory text, name, and navigation buttons centered on the page, indicating a proper render of the Flet view.

2: Navigation to Projects Page Test ❗️❗️❗️

Description: Ensure that clicking the 'Projects' button from the Home page navigates to the Projects page. This confirms that view routing in the Flet application works as expected.

Prerequisites:

  • User is on the Home page of the application

Steps:

  1. On the Home page, click the 'Projects' button.
  2. Wait for the page to update.
  3. Verify that the Projects page loads, showing a header titled 'Projects' and details such as the text 'My Projects' or project descriptions.

Expected Result: After clicking the 'Projects' button, the user should be taken to the Projects page which displays a header and content related to projects.

3: Navigation to Resume Page Test ❗️❗️❗️

Description: Check that clicking the 'Resume' button on the Home page navigates to the Resume page, ensuring that routing and view updates are correctly implemented.

Prerequisites:

  • User is on the Home page of the application

Steps:

  1. On the Home page, click the 'Resume' button.
  2. Wait for the application to navigate to the Resume view.
  3. Verify that the Resume page is displayed with an AppBar titled 'Resume' and a 'Home' button for navigation back.

Expected Result: User should see the Resume page with a header 'Resume' and a button to return to the Home page.

4: Navigation to Contact Page Test ❗️❗️❗️

Description: Verify that the 'Contact' button on the Home page navigates to the Contact page. This is essential for ensuring proper multi-page flow in the new Flet application.

Prerequisites:

  • User is on the Home page of the application

Steps:

  1. On the Home page, click the 'Contact' button.
  2. Wait for the Contact view to load.
  3. Confirm that the page displays an AppBar with the title 'Contact' and interactive elements (e.g., links or contact icons).

Expected Result: The Contact page should load displaying a 'Contact' header along with a Home button and contact information.

5: Direct Navigation to Certificates Page Test ❗️❗️

Description: Test direct navigation to the Certificates page by manually entering the URL. This ensures that the route '/certificates' correctly renders the Certificates view.

Prerequisites:

  • Application is running

Steps:

  1. In the browser address bar, manually enter the route corresponding to certificates (e.g., http://localhost/certificates).
  2. Observe the rendered page for a header titled 'Certificates' and a 'Home' navigation button.

Expected Result: The Certificates page should load with the expected header and navigation controls, confirming that its route is properly set up.

6: Back Navigation (Home Button) Test ❗️❗️

Description: Ensure that the 'Home' button present on secondary pages (Projects, Resume, Contact, Certificates) takes the user back to the Home page.

Prerequisites:

  • User is on any secondary page such as Projects, Resume, Contact, or Certificates

Steps:

  1. On the currently active secondary page, click the 'Home' button.
  2. Wait for the navigation to complete.
  3. Verify that the Home page renders again with the introductory text and navigation buttons.

Expected Result: Clicking the 'Home' button should navigate the user back to the Home page, confirming proper back navigation functionality.

Raw Changes Analyzed
File: .deepsource.toml
Changes:
@@ -1,13 +1,19 @@
-version = 1
+version=1
 
 [[analyzers]]
-name = "rust"
+  dependency_file_paths=["pyproject.toml"]
+  name="python"
 
 [analyzers.meta]
-msrv = "stable"
+  additional_builtins=["_", "pretty_output"]
+  runtime_version="3.x.x"
+  type_checker="mypy"
 
 [[analyzers]]
-name = "secrets"
+  name="docker"
+
+[[analyzers]]
+  name="secrets"
 
 [[transformers]]
-name = "rustfmt"
+  name="ruff"

File: .flox/.gitignore
Changes:
@@ -1,4 +0,0 @@
-run/
-cache/
-lib/
-log/

File: .flox/env.json
Changes:
@@ -1,4 +0,0 @@
-{
-  "name": "MH0386.github.io",
-  "version": 1
-}
\ No newline at end of file

File: .flox/env/manifest.lock
Changes:
@@ -1,145 +0,0 @@
-{
-  "lockfile-version": 1,
-  "manifest": {
-    "version": 1,
-    "install": {
-      "rustup": {
-        "pkg-path": "rustup"
-      }
-    },
-    "hook": {
-      "on-activate": "#   # -> Set variables, create files and directories\n#   # -> Perform initialization steps, e.g. create a python venv\n#   # -> Useful environment variables:\n#   #      - FLOX_ENV_PROJECT=/home/user/example\n#   #      - FLOX_ENV=/home/user/example/.flox/run\n#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache\nrustup default stable\ncargo install cargo-binstall\ncargo install dioxus-cli\n"
-    },
-    "profile": {},
-    "options": {
-      "systems": [
-        "aarch64-darwin",
-        "aarch64-linux",
-        "x86_64-darwin",
-        "x86_64-linux"
-      ],
-      "allow": {
-        "licenses": []
-      },
-      "semver": {}
-    }
-  },
-  "packages": [
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/mzl2d8nrs6mp3fv5w58zjlrjdkqs4ldb-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/nb4d0yp5hazgynng8rp5x6hgwphm7yj6-rustup-1.27.1"
-      },
-      "system": "aarch64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/ly86na18c89r1v2m6h4f153yw904m35g-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/772m79ldzymzsnvrjic03x3hprhsa7lx-rustup-1.27.1"
-      },
-      "system": "aarch64-linux",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/jwnr4148fmkqgy1l4gw7r6kzg10l6nq1-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/8bb8r3ysynqxiz2w7hmww1lrf6sqwafn-rustup-1.27.1"
-      },
-      "system": "x86_64-darwin",
-      "group": "toplevel",
-      "priority": 5
-    },
-    {
-      "attr_path": "rustup",
-      "broken": false,
-      "derivation": "/nix/store/dib164gjkvjc4xwq5kkjzg8nsxmr302d-rustup-1.27.1.drv",
-      "description": "Rust toolchain installer",
-      "install_id": "rustup",
-      "license": "[ Apache-2.0, MIT ]",
-      "locked_url": "https://github.com/flox/nixpkgs?rev=3a228057f5b619feb3186e986dbe76278d707b6e",
-      "name": "rustup-1.27.1",
-      "pname": "rustup",
-      "rev": "3a228057f5b619feb3186e986dbe76278d707b6e",
-      "rev_count": 746337,
-      "rev_date": "2025-02-01T11:46:30Z",
-      "scrape_date": "2025-02-02T00:30:00Z",
-      "stabilities": [
-        "unstable"
-      ],
-      "unfree": false,
-      "version": "1.27.1",
-      "outputs_to_install": [
-        "out"
-      ],
-      "outputs": {
-        "out": "/nix/store/xnmhxkrssh8fgk5vdhz2rr7syvj22yd6-rustup-1.27.1"
-      },
-      "system": "x86_64-linux",
-      "group": "toplevel",
-      "priority": 5
-    }
-  ]
-}
\ No newline at end of file

File: .flox/env/manifest.toml
Changes:
@@ -1,76 +0,0 @@
-## Flox Environment Manifest -----------------------------------------
-##
-##   _Everything_ you need to know about the _manifest_ is here:
-##
-##               https://flox.dev/docs/concepts/manifest
-##
-## -------------------------------------------------------------------
-# Flox manifest version managed by Flox CLI
-version = 1
-
-
-## Install Packages --------------------------------------------------
-##  $ flox install gum  <- puts a package in [install] section below
-##  $ flox search gum   <- search for a package
-##  $ flox show gum     <- show all versions of a package
-## -------------------------------------------------------------------
-[install]
-rustup.pkg-path = "rustup"
-# gum.pkg-path = "gum"
-# gum.version = "^0.14.5"
-
-
-## Environment Variables ---------------------------------------------
-##  ... available for use in the activated environment
-##      as well as [hook], [profile] scripts and [services] below.
-## -------------------------------------------------------------------
-[vars]
-# INTRO_MESSAGE = "It's gettin' Flox in here"
-
-## Activation Hook ---------------------------------------------------
-##  ... run by _bash_ shell when you run 'flox activate'.
-## -------------------------------------------------------------------
-[hook]
-on-activate = '''
-#   # -> Set variables, create files and directories
-#   # -> Perform initialization steps, e.g. create a python venv
-#   # -> Useful environment variables:
-#   #      - FLOX_ENV_PROJECT=/home/user/example
-#   #      - FLOX_ENV=/home/user/example/.flox/run
-#   #      - FLOX_ENV_CACHE=/home/user/example/.flox/cache
-rustup default stable
-cargo install cargo-binstall
-cargo install dioxus-cli
-'''
-
-## Profile script ----------------------------------------------------
-## ... sourced by _your shell_ when you run 'flox activate'.
-## -------------------------------------------------------------------
-[profile]
-# common = '''
-# #   gum style \
-# #   --foreground 212 --border-foreground 212 --border double \
-# #   --align center --width 50 --margin "1 2" --padding "2 4" \
-# #     $INTRO_MESSAGE
-# '''
-## Shell specific profiles go here:
-# bash = ...
-# zsh  = ...
-# fish = ...
-
-
-## Services ----------------------------------------------------------
-##  $ flox services start             <- Starts all services
-##  $ flox services status            <- Status of running services
-##  $ flox activate --start-services  <- Activates & starts all
-## -------------------------------------------------------------------
-[services]
-# myservice.command = "python3 -m http.server"
-
-
-## Other Environment Options -----------------------------------------
-[options]
-# Systems that environment is compatible with
-systems = ["aarch64-darwin", "aarch64-linux", "x86_64-darwin", "x86_64-linux"]
-# Uncomment to disable CUDA detection.
-# cuda-detection = false

File: .github/dependabot.yml
Changes:
@@ -1,15 +0,0 @@
-# To get started with Dependabot version updates, you'll need to specify which
-# package ecosystems to update and where the package manifests are located.
-# Please see the documentation for all configuration options:
-# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
-
-version: 2
-updates:
-  - package-ecosystem: "cargo" # See documentation for possible values
-    directory: "/" # Location of package manifests
-    schedule:
-      interval: "weekly"
-  - package-ecosystem: "github-actions"
-    directory: "/" 
-    schedule:
-      interval: "weekly"

File: .github/workflows/code_analysis.yml
Changes:
@@ -0,0 +1,32 @@
+name: Trunk Code Quality
+on:
+  push:
+  pull_request:
+permissions: read-all
+concurrency:
+  group: ${{ github.head_ref || github.run_id }}
+  cancel-in-progress: true
+jobs:
+  trunk:
+    name: Trunk Code Quality
+    runs-on: ubuntu-latest
+    permissions:
+      checks: write
+      contents: read
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v4
+      - name: Install uv
+        uses: astral-sh/setup-uv@v6
+        id: uv
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Trunk Code Quality
+        uses: trunk-io/trunk-action@v1
+        with:
+          check-mode: all
+          arguments: --github-annotate-new-only=false

File: .github/workflows/deploy.yml
Changes:
@@ -0,0 +1,40 @@
+name: Deploy to GitHub Pages
+on:
+  workflow_dispatch:
+  push:
+permissions:
+  contents: write
+  pages: write
+  id-token: write
+jobs:
+  build_web:
+    name: Build Web
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: UV
+        uses: astral-sh/setup-uv@v6
+        with:
+          enable-cache: true
+          cache-dependency-glob: "uv.lock"
+          activate-environment: true
+      - name: Install the project
+        run: uv sync --frozen
+      - name: Build
+        run: flet publish
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: dist/
+  deploy_web:
+    name: Deploy Web
+    runs-on: ubuntu-latest
+    needs: build_web
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4

File: .github/workflows/main.yml
Changes:
@@ -1,57 +0,0 @@
-name: gh-pages
-on:
-    workflow_dispatch:
-    push:
-        branches: [main]
-jobs:
-    build:
-        runs-on: ubuntu-latest
-        steps:
-            - name: Dioxus Deploy
-              uses: DioxusLabs/deploy-action@4f933485ec8f37a9dc1beec181f4eba58789523e
-              with:
-                  outDirectory: "target/dx/my_website/release/web/public"
-              # id: deployment
-              # continue-on-error: true
-            # - name: Check Deployment Status
-            #   if: steps.deployment.outcome != 'success'
-            #   run: |
-            #       echo "Deployment failed"
-            #       exit 1
-    deploy-resume:
-        # needs: build
-        # if: success()
-        runs-on: ubuntu-latest
-        steps:
-            - name: Checkout
-              uses: actions/checkout@v4
-            - name: Fetch main
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-            - name: Download Resume
-              uses: robinraju/[email protected]
-              with:
-                  latest: true
-                  fileName: "resume.pdf"
-                  out-file-path: "data/docs/"
-                  repository: "MH0386/MH0386"
-            - name: Commit and Push Resume
-              run: |
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git pull
-                  git push || (echo "Failed to push changes" && exit 1)
-            - name: Fetch gh-pages
-              run: |
-                  git config --global user.name "GitHub Actions"
-                  git config --global user.email "[email protected]"
-                  git fetch
-                  git checkout gh-pages || (echo "Failed to checkout gh-pages branch" && exit 1)
-            - name: Commit and Push Resume
-              run: |
-                  git checkout main -- data/docs/
-                  git add data/docs/
-                  git commit -m "Update Docs" || echo "No changes to commit"
-                  git push || (echo "Failed to push changes" && exit 1)

File: .github/workflows/rust-clippy.yml
Changes:
@@ -1,19 +0,0 @@
-on: [push, pull_request]
-name: Clippy
-jobs:
-  clippy_check:
-    permissions:
-      checks: write
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/[email protected]
-      # - uses: awalsh128/cache-apt-pkgs-action@latest
-      #   with:
-      #     packages: libglib2.0-dev libgdk-3-dev gcc
-      - uses: crusty-pie/[email protected]
-        with:
-          toolchain: stable
-          components: clippy
-      - uses: crusty-pie/[email protected]
-        with:
-          args: --all-targets #--fix

File: .github/workflows/sync.yml
Changes:
@@ -0,0 +1,46 @@
+name: Sync Docs
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - main
+    paths-ignore:
+      - .github/workflows/sync.yml
+  schedule:
+    - cron: "0 8 * * 1-5"
+permissions:
+  contents: write
+  pages: write
+jobs:
+  sync_docs:
+    name: Sync Docs to ${{ matrix.branch }}
+    runs-on: ubuntu-latest
+    if: github.ref_name == 'main'
+    strategy:
+      fail-fast: false
+      matrix:
+        branch: [main, gh-pages]
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          ref: ${{ matrix.branch }}
+          fetch-depth: 0
+      - name: Git Config
+        run: |
+          git config --global user.name "github-actions[bot]"
+          git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+      - name: Download Docs
+        uses: robinraju/[email protected]
+        with:
+          latest: true
+          fileName: "resume.pdf"
+          out-file-path: "data/docs/"
+          repository: "MH0386/MH0386"
+      - name: Commit & Push to ${{ matrix.branch }}
+        continue-on-error: true
+        run: |
+          git add data/docs/
+          git commit -m "Update Docs"
+          git pull
+          git push

File: .github/workflows/trunk_upgrade.yml
Changes:
@@ -0,0 +1,18 @@
+name: Upgrade Trunk Check
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: 0 8 * * 1-5
+permissions: read-all
+jobs:
+  trunk_upgrade:
+    name: Upgrade Trunk
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+      pull-requests: write
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Trunk Upgrade
+        uses: trunk-io/trunk-action/upgrade@v1

File: .gitignore
Changes:
@@ -1,11 +1,3 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target
-.DS_Store
-
-# These are backup files generated by rustfmt
-**/*.rs.bk
-
-.vscode/
-
-node_modules/
\ No newline at end of file
+**/__pycache__/
+**/.dccache
+.venv/

File: .idx/dev.nix
Changes:
@@ -1,42 +0,0 @@
-{ pkgs }: {
-  channel = "stable-23.11";
-  packages = [
-    pkgs.nodePackages.firebase-tools
-    pkgs.jdk17
-    pkgs.unzip
-  ];
-  idx.extensions = [
-    "Dart-Code.dart-code"
-    "Dart-Code.flutter"
-  ];
-  idx.previews = {
-    previews = {
-      web = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "web-server"
-          "--web-hostname"
-          "0.0.0.0"
-          "--web-port"
-          "$PORT"
-        ];
-        manager = "flutter";
-      };
-      android = {
-        command = [
-          "flutter"
-          "run"
-          "--machine"
-          "-d"
-          "android"
-          "-d"
-          "emulator-5554"
-        ];
-        manager = "flutter";
-      };
-    };
-  };
-}

File: .trunk/.gitignore
Changes:
@@ -0,0 +1,9 @@
+*out
+*logs
+*actions
+*notifications
+*tools
+plugins
+user_trunk.yaml
+user.yaml
+tmp

File: .trunk/configs/.isort.cfg
Changes:
@@ -0,0 +1,2 @@
+[settings]
+profile=black

File: .trunk/configs/.markdownlint.yaml
Changes:
@@ -0,0 +1,2 @@
+# Prettier friendly markdownlint config (all formatting rules disabled)
+extends: markdownlint/style/prettier

File: .trunk/configs/.prettierrc.yaml
Changes:
@@ -0,0 +1,3 @@
+proseWrap: "always"
+singleQuote: false
+bracketSpacing: true

File: .trunk/configs/.yamllint.yaml
Changes:
@@ -0,0 +1,27 @@
+extends: default
+rules:
+  braces:
+    level: warning
+    max-spaces-inside: 1
+  brackets:
+    level: warning
+    max-spaces-inside: 1
+  colons:
+    level: warning
+  commas:
+    level: warning
+  comments: disable
+  comments-indentation: disable
+  document-start: disable
+  empty-lines:
+    level: warning
+  hyphens:
+    level: warning
+  indentation:
+    level: warning
+    indent-sequences: consistent
+  line-length:
+    level: warning
+    allow-non-breakable-inline-mappings: true
+    max: 100
+  truthy: disable

File: .trunk/configs/pyrightconfig.json
Changes:
@@ -0,0 +1,9 @@
+{
+  "analyzeUnannotatedFunctions": true,
+  "reportAttributeAccessIssue": false,
+  "reportMissingParameterType": true,
+  "reportMissingTypeStubs": false,
+  "reportUnknownMemberType": false,
+  "venv": ".venv",
+  "venvPath": "."
+}

File: .trunk/configs/ruff.toml
Changes:
@@ -0,0 +1,73 @@
+exclude=[
+  ".bzr",
+  ".direnv",
+  ".eggs",
+  ".git",
+  ".git-rewrite",
+  ".hg",
+  ".ipynb_checkpoints",
+  ".mypy_cache",
+  ".nox",
+  ".pants.d",
+  ".pyenv",
+  ".pytest_cache",
+  ".pytype",
+  ".ruff_cache",
+  ".svn",
+  ".tox",
+  ".venv",
+  ".vscode",
+  "__pypackages__",
+  "_build",
+  "buck-out",
+  "build",
+  "dist",
+  "node_modules",
+  "site-packages",
+  "venv",
+]
+
+indent-width=4
+line-length=88
+target-version="py310"
+
+[lint]
+  # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
+  # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
+  # McCabe complexity (`C901`) by default.
+  ignore=[]
+  select=["E4", "E7", "E9", "F"]
+
+  # Allow fix for all enabled rules (when `--fix`) is provided.
+  fixable=["ALL"]
+  unfixable=[]
+
+  # Allow unused variables when underscore-prefixed.
+  dummy-variable-rgx="^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
+
+[format]
+  # Like Black, use double quotes for strings.
+  quote-style="double"
+
+  # Like Black, indent with spaces, rather than tabs.
+  indent-style="space"
+
+  # Like Black, respect magic trailing commas.
+  skip-magic-trailing-comma=false
+
+  # Like Black, automatically detect the appropriate line ending.
+  line-ending="auto"
+
+  # Enable auto-formatting of code examples in docstrings. Markdown,
+  # reStructuredText code/literal blocks and doctests are all supported.
+  #
+  # This is currently disabled by default, but it is planned for this
+  # to be opt-out in the future.
+  docstring-code-format=false
+
+  # Set the line length limit used when formatting code snippets in
+  # docstrings.
+  #
+  # This only has an effect when the `docstring-code-format` setting is
+  # enabled.
+  docstring-code-line-length="dynamic"

File: .trunk/configs/taplo.toml
Changes:
@@ -0,0 +1,8 @@
+include=["**/*.toml"]
+
+[formatting]
+  compact_entries=true
+  indent_entries=true
+  reorder_arrays=true
+  reorder_inline_tables=true
+  reorder_keys=true

File: .trunk/trunk.yaml
Changes:
@@ -0,0 +1,45 @@
+# This file controls the behavior of Trunk: https://docs.trunk.io/cli
+# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
+version: 0.1
+cli:
+  version: 1.22.15
+# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
+plugins:
+  sources:
+    - id: trunk
+      ref: v1.6.8
+      uri: https://github.com/trunk-io/plugins
+# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
+runtimes:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
+lint:
+  enabled:
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - git-diff-check
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+    - [email protected]
+actions:
+  enabled:
+    - trunk-announce
+    - trunk-check-pre-push
+    - trunk-fmt-pre-commit
+    - trunk-upgrade-available

File: Cargo.toml
Changes:
@@ -1,30 +0,0 @@
-[package]
-name = "my_website"
-version = "0.1.0"
-authors = ["Mohamed Hisham Abdelzaher <[email protected]>"]
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-dioxus = { version = "0.6.1", features = ["web"] }
-dioxus-i18n = "0.4.2"
-dioxus-router = "0.6.1"
-
-[features]
-default = ["web"]
-web = ["dioxus/web"]
-desktop = ["dioxus/desktop"]
-mobile = ["dioxus/mobile"]
-
-[profile]
-
-[profile.wasm-dev]
-inherits = "dev"
-opt-level = 1
-
-[profile.server-dev]
-inherits = "dev"
-
-[profile.android-dev]
-inherits = "dev"

File: Dioxus.toml
Changes:
@@ -1,37 +0,0 @@
-[application]
-# App (Project) Name
-name = "MH0386.github.io"
-default_platform = "web"
-# `build` & `serve` dist path
-# out_dir = "dist"
-# resource (assets) file folder
-asset_dir = "assets"
-
-[web.app]
-
-# HTML title tag content
-title = "Mohamed Hisham"
-
-[web.watcher]
-
-# when watcher trigger, regenerate the `index.html`
-reload_html = true
-
-# which files or dirs will be watcher monitoring
-watch_path = ["src", "assets"]
-index_on_404 = true
-
-# include `assets` in web platform
-[web.resource]
-
-# Additional CSS style files
-style = []
-
-# Additional JavaScript files
-script = []
-
-[web.resource.dev]
-
-# Javascript code file
-# serve: [dev-server] only
-script = []

File: README.md
Changes:
@@ -1,8 +1,4 @@
-# MH0386.github.io
+# Mohamed Hisham Abdelzaher's Portfolio
 
 [![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=MH0386_MH0386.github.io)](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
 [![CodeFactor](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io/badge)](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox/docs/contributor-quickstart/)-->
-
-It is my personal website.

File: assets/header.svg
Changes:
@@ -1,20 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1007 197"><style>
-@keyframes a0_t { 0% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 35% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); } 50% { transform: translate(225px,339.9px) scale(1,1) translate(-89.5px,-24px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } 100% { transform: translate(225px,339.9px) scale(0,1) translate(-89.5px,-24px); } }
-@keyframes a1_t { 0% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 20% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 35% { transform: translate(225px,348.9px) scale(1,1) translate(-41.5px,-11px); } 45% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } 100% { transform: translate(225px,348.9px) scale(0,1) translate(-41.5px,-11px); } }
-@keyframes a3_t { 0% { transform: translate(225px,198.9px) rotate(-90deg); } 10% { transform: translate(225px,198.9px) rotate(-90deg); } 20% { transform: translate(225px,198.9px) rotate(-90deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) rotate(0deg); } 35% { transform: translate(225px,198.9px) rotate(0deg); } 45% { transform: translate(225px,198.9px) rotate(0deg); } 50% { transform: translate(225px,198.9px) rotate(0deg); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(225px,198.9px) rotate(-90deg); } 65% { transform: translate(225px,198.9px) rotate(-90deg); } 75% { transform: translate(225px,198.9px) rotate(-90deg); } 100% { transform: translate(225px,198.9px) rotate(-90deg); } }
-@keyframes a2_t { 0% { transform: translate(-200px,-167px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(-150px,-80px); } 20% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(-200px,-123px); } 35% { transform: translate(-200px,-123px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { transform: translate(-150px,-100px); } 50% { transform: translate(-150px,-100px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(-150px,-80px); } 65% { transform: translate(-150px,-80px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { transform: translate(-217px,-200px); } 100% { transform: translate(-217px,-200px); } }
-@keyframes a2_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a2_sw { 0% { stroke-width: 30px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { stroke-width: 8px; } 65% { stroke-width: 8px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { stroke-width: 30px; } 100% { stroke-width: 30px; } }
-@keyframes a2_w { 0% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 300px; } 20% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { width: 400px; } 35% { width: 400px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { width: 300px; } 50% { width: 300px; } 60% { width: 300px; } 65% { width: 300px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { width: 434px; } 100% { width: 434px; } }
-@keyframes a2_h { 0% { height: 334px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { height: 160px; } 20% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { height: 246px; } 35% { height: 246px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 45% { height: 200px; } 50% { height: 200px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { height: 160px; } 65% { height: 160px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { height: 400px; } 100% { height: 400px; } }
-@keyframes a4_t { 0% { transform: translate(143.5px,48.9px); } 10% { transform: translate(180.5px,98.9px); } 100% { transform: translate(180.5px,98.9px); } }
-@keyframes a4_w { 0% { width: 168.5px; } 10% { width: 94.5px; } 100% { width: 94.5px; } }
-@keyframes a4_h { 0% { height: 302px; } 10% { height: 202px; } 100% { height: 202px; } }
-@keyframes a5_t { 0% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(190px,324.9px); } 20% { transform: translate(190px,324.9px); } 30% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a5_o { 0% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { opacity: 1; } 20% { opacity: 1; } 30% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a5_w { 0% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { width: 70px; } 20% { width: 70px; } 30% { width: 70px; } 100% { width: 70px; } }
-@keyframes a6_t { 0% { transform: translate(217px,324.9px); } 50% { transform: translate(217px,324.9px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { transform: translate(190px,324.9px); } 65% { transform: translate(190px,324.9px); } 75% { transform: translate(190px,324.9px); } 100% { transform: translate(190px,324.9px); } }
-@keyframes a6_o { 0% { opacity: 0; } 50% { opacity: 0; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { opacity: 1; } 65% { opacity: 1; animation-timing-function: cubic-bezier(.6,0,.4,1); } 75% { opacity: 0; } 100% { opacity: 0; } }
-@keyframes a6_w { 0% { width: 16px; } 50% { width: 16px; animation-timing-function: cubic-bezier(.6,0,.4,1); } 60% { width: 70px; } 65% { width: 70px; } 75% { width: 70px; } 100% { width: 70px; } }
-@keyframes a7_t { 0% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 10% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 20% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 25% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.6,0,.4,1); } 30% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 35% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 45% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); } 50% { transform: translate(225px,198.9px) scale(.8,.8) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 55% { transform: translate(225px,198.9px) scale(.7,.7) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 60% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); } 65% { transform: translate(225px,198.9px) scale(1,1) translate(-42.3px,-93px); animation-timing-function: cubic-bezier(.4,0,.6,1); } 75% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } 100% { transform: translate(225px,198.9px) scale(1.5,1.5) translate(-42.3px,-93px); } }
-</style><defs><symbol id="Symbol-2" preserveAspectRatio="none" width="111.5" height="186" viewBox="0 0 111.5 186" overflow="visible"><g transform="translate(8.5,4.5)"><rect x="4" width="85" height="8" fill="#d9d9d9"/><rect x="4" y="26" width="85" height="8" fill="#d9d9d9"/><rect x="25" y="56" width="43" height="8" fill="#d9d9d9"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,175) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="85" height="8" fill="#d9d9d9" transform="translate(46.5,149) rotate(180) scale(-1,1) translate(-42.5,-4)"/><rect width="43" height="8" fill="#d9d9d9" transform="translate(46.5,119) rotate(180) scale(-1,1) translate(-21.5,-4)"/><path d="M0 4c0 53 94.5 115 94.5 169" stroke="#3cc4dc" stroke-width="17" stroke-linecap="square" fill="none"/><path d="M94.5 4c0 53-94.5 115-94.5 169" stroke="#fb422d" stroke-width="17" stroke-linecap="square" fill="none"/></g></symbol><symbol id="Symbol-5" preserveAspectRatio="none" width="84.5" height="186" viewBox="0 0 84.5 186" overflow="visible"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></symbol></defs><rect width="1007" height="197" stroke="#0f1116" fill="#0f1116" stroke-width="0"/><path fill="#fff" d="M83.3 106.1v-65.7h17c4.2 0 7.9 .8 11 2.4c3.1 1.6 5.5 3.9 7.2 6.9c1.7 2.9 2.6 6.4 2.6 10.4v26.2c0 4-0.9 7.5-2.6 10.5c-1.7 3-4.1 5.3-7.2 6.9c-3.1 1.6-6.8 2.4-11 2.4Zm8.1-7.2h8.9c4 0 7.1-1.1 9.3-3.3c2.3-2.3 3.4-5.3 3.4-9.3v-26.2c0-3.9-1.1-7-3.4-9.2c-2.2-2.2-5.3-3.3-9.3-3.3h-8.9Zm45.3 7.2v-7.4h17.5v-34.7h-15.7v-7.4h23.8v42.1h16.7v7.4Zm20.7-58.4c-2 0-3.6-0.5-4.7-1.5c-1.2-1.1-1.7-2.4-1.7-4.2c0-1.8 .5-3.2 1.7-4.3c1.1-1 2.7-1.5 4.7-1.5c1.9 0 3.5 .5 4.6 1.5c1.2 1.1 1.7 2.5 1.7 4.3c0 1.8-0.5 3.1-1.7 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm52.6 59.1c-6 0-10.7-1.7-14.2-5.1c-3.4-3.4-5.1-8-5.1-13.8v-13.1c0-5.9 1.7-10.5 5.1-13.9c3.5-3.3 8.2-5 14.2-5c6 0 10.7 1.7 14.2 5c3.4 3.4 5.2 8 5.2 13.8v13.2c0 5.8-1.8 10.4-5.2 13.8c-3.5 3.4-8.2 5.1-14.2 5.1Zm0-7.2c3.5 0 6.3-1 8.3-3c2-1.9 3-4.8 3-8.7v-13.1c0-3.9-1-6.8-3-8.8c-2-1.9-4.8-2.9-8.3-2.9c-3.5 0-6.2 1-8.2 2.9c-2 2-3 4.9-3 8.8v13.1c0 3.9 1 6.8 3 8.7c2 2 4.7 3 8.2 3Zm31.5 6.5l17.6-25.5l-16.5-24h9.5l9.8 15.3c.5 .7 .9 1.4 1.2 2.2c.4 .7 .8 1.4 1 1.8c.2-0.4 .5-1.1 .8-1.8c.4-0.8 .8-1.5 1.3-2.2l9.9-15.3h9.4l-16.5 24.1l17.5 25.4h-9.5l-10.7-16.2c-0.4-0.7-0.8-1.4-1.2-2.3c-0.4-0.9-0.7-1.6-1-2.1c-0.2 .5-0.6 1.2-1 2.1c-0.5 .9-1 1.6-1.4 2.3l-10.7 16.2Zm76.4 .9c-5.7 0-10.2-1.7-13.7-5.1c-3.4-3.4-5.1-8-5.1-13.8v-31.5h8.1v31.5c0 3.7 1 6.6 2.9 8.7c1.9 2.1 4.5 3.1 7.8 3.1c3.4 0 6-1 8-3.1c1.9-2.1 2.9-5 2.9-8.7v-31.5h8.1v31.5c0 5.8-1.7 10.4-5.2 13.8c-3.5 3.4-8.1 5.1-13.8 5.1Zm52.6-0.2c-5.1 0-9.3-1.2-12.5-3.5c-3.3-2.3-4.9-5.5-4.9-9.6h8.3c0 1.8 .9 3.3 2.6 4.3c1.8 1.1 4 1.6 6.6 1.6h3.8c3.2 0 5.6-0.6 7.1-1.9c1.6-1.3 2.4-3 2.4-5.2c0-2.1-0.8-3.8-2.2-5c-1.5-1.2-3.6-2-6.4-2.5l-6.6-1c-5-0.9-8.6-2.4-10.9-4.7c-2.4-2.3-3.5-5.5-3.5-9.5c0-4.5 1.4-7.9 4.3-10.3c2.9-2.4 7.1-3.6 12.6-3.6h3.4c5 0 9.1 1.1 12.1 3.4c3 2.2 4.6 5.2 4.6 8.9h-8.3c0-1.6-0.8-2.8-2.3-3.7c-1.5-1-3.6-1.4-6.3-1.4h-3.4c-2.8 0-5 .6-6.5 1.7c-1.5 1.2-2.3 2.9-2.3 5c0 3.6 2.5 5.8 7.6 6.7l6.7 1.1c5.3 .8 9.2 2.4 11.7 4.6c2.4 2.3 3.6 5.6 3.6 9.9c0 4.6-1.5 8.2-4.4 10.8c-2.9 2.6-7.3 3.9-13.2 3.9Z"/><path fill="#fff" d="M91 164c-2 0-3.6-0.6-4.7-1.7c-1.1-1.1-1.6-2.7-1.6-4.6v-15.9h2.7v15.9c0 1.2 .3 2.2 .9 2.8c.6 .7 1.5 1.1 2.7 1.1c1.2 0 2.1-0.4 2.7-1.1c.6-0.7 .9-1.6 .9-2.8v-15.9h2.7v15.9c0 2-0.5 3.5-1.6 4.6c-1.1 1.1-2.6 1.7-4.7 1.7Zm17.5-0.1c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.2 .5h1.3c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.7-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.6 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.4 1.3Zm18.5 .1c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm35.8 0v-2.5h4.5v-16.9h-4.5v-2.5h11.8l-0.1 2.5h-4.4v16.9h4.4v2.5Zm17.7 0v-16.5h2.7v3.2c.1-1.1 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm26 0c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.1v-9.7h-4.7v-2.5h4.7v-4.7h2.7v4.7h6.6v2.5h-6.6v9.7c0 .5 .2 1 .5 1.3c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm16.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3l-0.1 2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.2c.1-1.1 .6-2 1.4-2.6c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm21.3 0v-12.4h-4.8v-2.4h4.8v-2.9c0-1.3 .4-2.3 1.2-3.1c.9-0.7 2-1.1 3.4-1.1h4.9v2.5h-4.9c-1.3 0-1.9 .5-1.9 1.7v2.9h6.8v2.4h-6.8v12.4Zm19 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.6c0-1.6 .5-2.8 1.5-3.7c1-0.9 2.3-1.3 4-1.3h5.1v-1.6c0-1-0.3-1.8-0.9-2.4c-0.6-0.5-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.1h-0.1c-0.1 1-0.6 1.9-1.5 2.5c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.3 3.2-1c.8-0.6 1.2-1.4 1.2-2.4v-2.4h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm18.9 2.1c-2 0-3.6-0.6-4.8-1.7c-1.2-1.1-1.7-2.6-1.7-4.6v-4.5c0-2 .5-3.5 1.7-4.6c1.2-1.1 2.8-1.7 4.8-1.7c1.9 0 3.5 .5 4.6 1.5c1.2 1 1.8 2.4 1.8 4.2h-2.7c0-1.1-0.4-1.9-1-2.4c-0.7-0.6-1.6-0.9-2.7-0.9c-1.2 0-2.1 .3-2.8 1c-0.7 .7-1.1 1.6-1.1 2.9l.1 4.5c-0.1 1.2 .3 2.2 1 2.9c.7 .7 1.6 1 2.8 1c1.1 0 2-0.3 2.7-0.9c.6-0.6 1-1.4 1-2.4h2.7c0 1.8-0.6 3.2-1.8 4.2c-1.1 1-2.7 1.5-4.6 1.5Zm17.9 0c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.7-2-0.7-3.3v-4.5c0-1.3 .2-2.4 .7-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .8 2 .8 3.3v2.9h-10.3v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1.1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1-2.8-1c-1.2 0-2.2 .3-2.8 1c-0.7 .7-1 1.7-1 3Zm21.3 9.8c-1.7 0-3.1-0.3-4.2-1.1c-1.1-0.8-1.6-1.9-1.6-3.2h2.8c0 .6 .3 1.1 .8 1.4c.6 .4 1.4 .5 2.3 .5h1.2c1.1 0 1.9-0.2 2.4-0.6c.5-0.4 .8-1 .8-1.7c0-0.7-0.3-1.3-0.8-1.7c-0.5-0.4-1.2-0.7-2.1-0.8l-2.2-0.4c-1.6-0.3-2.9-0.8-3.6-1.5c-0.8-0.8-1.2-1.9-1.2-3.2c0-1.5 .5-2.6 1.4-3.4c1-0.8 2.4-1.2 4.2-1.2h1.2c1.7 0 3 .3 4 1.1c1 .7 1.5 1.7 1.5 3h-2.7c0-0.6-0.3-1-0.8-1.3c-0.5-0.3-1.2-0.4-2.1-0.4h-1.1c-1 0-1.7 .2-2.2 .5c-0.5 .4-0.8 1-0.8 1.7c0 1.2 .9 1.9 2.6 2.2l2.2 .4c1.8 .3 3.1 .8 3.9 1.5c.8 .8 1.2 1.9 1.2 3.3c0 1.6-0.5 2.8-1.5 3.6c-0.9 .9-2.4 1.3-4.3 1.3Zm38.3-0.2c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm10 0v-21.9h2.7v8.6c.1-1.2 .6-2 1.3-2.6c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 3 .5 3.9 1.5c1 1.1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm22.8 .3c-1.8 0-3.1-0.4-4.1-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.3-1.3 4-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.5-0.8c-1 0-1.8 .2-2.5 .6c-0.6 .4-1 1-1.2 1.7h-2.7c.1-1 .4-1.8 1-2.5c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.2-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 1 1.6 2.3 1.6 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.4-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.6 .3-2.2 .8c-0.5 .5-0.7 1.1-0.7 2c0 .9 .3 1.6 .9 2.2c.6 .5 1.5 .8 2.6 .8Zm20.6 1.8c-1.4 0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-1.8-1.2-3.2v-9.6h-4.6v-2.5h4.6v-4.7h2.7v4.7h6.6v2.5h-6.6v9.6c0 .6 .2 1.1 .5 1.4c.3 .4 .8 .5 1.3 .5h4.5v2.5Zm28.5 0v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.4-2.5c.7-0.6 1.7-0.9 3-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.9 0-3.4-0.6-4.6-1.7c-1.1-1.1-1.7-2.7-1.7-4.6v-10.5h2.7v10.5c0 1.2 .3 2.2 1 2.9c.6 .7 1.5 1 2.6 1c1.1 0 2-0.3 2.6-1c.7-0.7 1-1.7 1-2.9v-10.5h2.7v10.5c0 1.9-0.6 3.5-1.7 4.6c-1.2 1.1-2.7 1.7-4.6 1.7Zm11.8-0.3v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm40.8 .3c-1.8 0-3.2-0.4-4.2-1.3c-1-0.9-1.5-2.1-1.5-3.7c0-1.5 .5-2.7 1.5-3.6c1-0.9 2.4-1.3 4.1-1.3h5.1v-1.7c0-1-0.3-1.7-0.9-2.3c-0.6-0.6-1.5-0.8-2.6-0.8c-0.9 0-1.7 .2-2.4 .6c-0.6 .4-1.1 1-1.2 1.6h-2.7c.1-0.9 .4-1.7 1-2.4c.6-0.7 1.3-1.2 2.2-1.6c1-0.4 2-0.6 3.1-0.6c1.9 0 3.4 .5 4.5 1.5c1.1 .9 1.7 2.3 1.7 4v11.3h-2.6v-3.2h-0.1c-0.1 1.1-0.6 1.9-1.5 2.6c-0.9 .6-2.1 .9-3.5 .9Zm.6-2.1c1.3 0 2.3-0.4 3.2-1c.8-0.6 1.2-1.5 1.2-2.5v-2.3h-5c-0.9 0-1.7 .3-2.2 .8c-0.5 .5-0.8 1.1-0.8 2c0 .9 .4 1.6 1 2.2c.6 .5 1.5 .8 2.6 .8Zm12.6 1.8v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.6-1.5-1-2.6-1c-1.1 0-2 .4-2.7 1.1c-0.6 .6-0.9 1.6-0.9 2.9v10.5Zm20.6 5.4l2.4-6.4l-6.3-15.5h2.9l4.1 10.2c.1 .3 .2 .7 .4 1.2c.1 .5 .2 .9 .3 1.2c.1-0.3 .2-0.7 .3-1.2c.1-0.5 .3-0.9 .4-1.2l3.8-10.2h2.8l-8.3 21.9Zm16.3-5.4l-2.7-16.5h2.4l1.6 11.7c.1 .4 .2 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 0-0.8 .1-1.3c.1-0.5 .1-1 .2-1.4l1.8-11.7h2.7l1.9 11.7c.1 .4 .1 .9 .2 1.4c.1 .5 .1 1 .1 1.3h.2c0-0.3 .1-0.8 .1-1.3c.1-0.5 .2-1 .2-1.4l1.7-11.7h2.2l-2.7 16.5h-3l-1.8-11.4c0-0.6-0.1-1.1-0.2-1.7c-0.1-0.5-0.1-1-0.2-1.3h-0.1c0 .3-0.1 .8-0.1 1.3c-0.1 .6-0.2 1.1-0.3 1.7l-1.8 11.4Zm17.1 0v-21.9h2.7v8.5c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.6 0 2.9 .5 3.9 1.5c1 1 1.5 2.4 1.5 4.2v11.1h-2.7v-10.8c0-1.2-0.3-2.1-0.9-2.7c-0.7-0.7-1.5-1-2.6-1c-1.1 0-2 .3-2.7 1c-0.6 .7-0.9 1.7-0.9 3v10.5Zm24.2 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Zm16.1 9.6v-16.5h2.7v3.1c.1-1.1 .6-1.9 1.3-2.5c.8-0.6 1.8-0.9 3.1-0.9c1.7 0 3.1 .5 4.1 1.6c1 1.1 1.5 2.6 1.5 4.5v1.1h-2.7v-0.9c0-1.3-0.3-2.2-0.9-2.9c-0.7-0.7-1.6-1.1-2.8-1.1c-2.4 0-3.6 1.4-3.6 4v10.5Zm23.7 .3c-1.3 0-2.4-0.3-3.4-0.8c-1-0.5-1.7-1.2-2.3-2.2c-0.5-0.9-0.8-2-0.8-3.3v-4.5c0-1.3 .3-2.4 .8-3.3c.6-1 1.3-1.7 2.3-2.2c1-0.5 2.1-0.8 3.4-0.8c1.3 0 2.4 .3 3.4 .8c1 .5 1.7 1.2 2.3 2.2c.5 .9 .7 2 .7 3.3v2.9h-10.2v1.6c0 1.3 .3 2.3 1 3c.6 .7 1.6 1 2.8 1c1 0 1.9-0.2 2.5-0.5c.7-0.4 1-1 1.2-1.7h2.7c-0.2 1.4-0.9 2.5-2 3.3c-1.2 .8-2.7 1.2-4.4 1.2Zm-3.8-9.9h7.6v-0.9c0-1.3-0.3-2.3-1-3c-0.6-0.7-1.6-1.1-2.8-1.1c-1.2 0-2.2 .4-2.8 1.1c-0.7 .7-1 1.7-1 3Z"/><g transform="translate(764,-14.5) scale(.431111,.440249) translate(-13.9,56.6)"><path fill="#e0e0e0" stroke="#e0e0e0" stroke-linejoin="round" d="M-50.7 4h278.2c10 0 9 0 9 0l41 40c0 0 1 0-9 0h-358c-9.9 0-9 0-9 0l38.8-40c0 0-0.9 0 9 0Z" stroke-width="10" transform="translate(225,339.9) scale(0,1) translate(-89.5,-24)" style="animation: 10s linear infinite both a0_t;"/><rect width="83" height="22" stroke="#fb422d" fill="#e0e0e0" rx="2" stroke-width="0" transform="translate(225,348.9) scale(0,1) translate(-41.5,-11)" style="animation: 10s linear infinite both a1_t;"/><g style="animation: 10s linear infinite both a3_t;"><rect width="400" height="334" stroke="#e0e0e0" fill="none" stroke-width="30" stroke-miterlimit="1" rx="10" opacity="0" transform="translate(225,198.9) rotate(-90) translate(-200,-167)" style="animation: 10s linear infinite both a2_t, 10s linear infinite both a2_o, 10s linear infinite both a2_sw, 10s linear infinite both a2_w, 10s linear infinite both a2_h;"/></g><use width="168.5" height="302" xlink:href="#Symbol-2" opacity="0" transform="translate(227.8,199.9) translate(-84.2,-151)" style="animation: 10s linear infinite both a4_t, 10s linear infinite both a4_w, 10s linear infinite both a4_h;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a5_t, 10s linear infinite both a5_o, 10s linear infinite both a5_w;"/><rect width="16" height="8" stroke="#fb422d" fill="#e0e0e0" stroke-width="0" rx="2" opacity="0" transform="translate(225,328.9) translate(-8,-4)" style="animation: 10s linear infinite both a6_t, 10s linear infinite both a6_o, 10s linear infinite both a6_w;"/><g transform="translate(225,198.9) scale(1.5,1.5) translate(-42.3,-93)" style="animation: 10s linear infinite both a7_t;"><g transform="translate(42.3,93) scale(5.352,6.9) translate(-16,60)"><g transform="translate(-34.9,-125.8)"><g transform="translate(24,5)"><path d="M33 46.5c0 3.1-0.8 5.5-2.2 7.4c-1.4 1.9-3.3 3.6-5.4 5.4c-2.2 1.7-4.5 3.6-6.3 6.2c-1.8 2.5-3.1 5.5-3.1 9.5h4.7c0-3.1 .9-5.4 2.2-7.3c1.4-1.9 3.3-3.5 5.5-5.3c2.1-1.8 4.4-3.7 6.2-6.2c1.8-2.6 3.1-5.6 3.1-9.7Z" fill="#e96020"/><path d="M20.4 70.7c-0.6 0-1 .5-1 1.1c0 .7 .4 1.2 1 1.2h12.9c.7 0 1.2-0.5 1.2-1.2c0-0.6-0.5-1.1-1.2-1.1Z" fill="#2d323b"/><path d="M21.8 66.6c-0.7 0-1 .6-1 1.2c0 .6 .3 1 .9 1h10.3c.6 0 1.1-0.5 1.1-1.1c0-0.6-0.5-1.1-1.1-1.1Z" fill="#2d323b"/><path d="M21.8 53c-0.7 0-1.2 .5-1.1 1.1c0 .6 .4 1.1 1.1 1.1h10.2c.6 0 .9-0.6 .9-1.2c0-0.6-0.3-1-0.9-1Z" fill="#2d323b"/><path d="M20.4 48.8c-0.6 0-1.2 .5-1.2 1.1c0 .7 .6 1.2 1.2 1.2h12.9c.7 0 1-0.5 1-1.1c0-0.7-0.3-1.2-1-1.2Z" fill="#2d323b"/><path d="M16 46.5c0 4.1 1.3 7.1 3.1 9.7c1.8 2.5 4.1 4.4 6.3 6.2c2.1 1.8 4 3.6 5.4 5.5c1.4 1.9 2.2 4 2.2 7.1h4.7c0-4-1.3-7.1-3.1-9.6c-1.8-2.5-4.1-4.4-6.2-6.2c-2.2-1.8-4.1-3.4-5.5-5.3c-1.3-1.9-2.2-4.3-2.2-7.4Z" fill="#00a8d6"/></g></g></g></g></g></svg>
\ No newline at end of file

File: assets/main.css
Changes:
@@ -1,253 +0,0 @@
-/* App-wide styling */
-body {
-    background-color: #000000;
-    color: #ffffff;
-    font-family: 'Jetbrains Mono', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-    overflow: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-/* Navbar */
-#navbar {
-    flex-direction: row;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 1rem;
-}
-
-#navbar a {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar a:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#navbar button {
-    background-color: #000000;
-    color: #ffffff;
-    border: none;
-}
-
-#navbar label {
-    color: #ffffff;
-    margin-right: 20px;
-    text-decoration: none;
-    transition: color 0.2s ease;
-}
-
-#navbar label:hover {
-    cursor: pointer;
-    color: #91a4d2;
-}
-
-#myname_section {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#myname_section h1 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#myname_section p {
-    font-size: 1.25rem;
-}
-
-#about {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#about h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#projects h2 {
-    font-size: 2.5rem;
-    margin: 0;
-}
-
-#projects_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#projects_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#projects_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#projects_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#projects_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-    /* margin-bottom: 1rem; */
-}
-
-#projects_item_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#certificates {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-}
-
-#certificates h2 {
-    font-size: 2.5rem;
-}
-
-#certificates_list {
-    display: grid;
-    grid-template-columns: 1fr;
-    gap: 1.5rem;
-
-    @media (min-width: 640px) {
-        grid-template-columns: repeat(2, auto);
-    }
-
-    @media (min-width: 1024px) {
-        grid-template-columns: repeat(3, auto);
-    }
-}
-
-#certificates_item {
-    display: inline-block;
-    border-radius: 0.5rem;
-    overflow: hidden;
-    box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
-    padding: 1rem;
-    background-color: #f7fafc;
-    border: 2px solid #4a5568;
-}
-
-#certificates_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-}
-
-#certificates_item h4 {
-    font-size: 1.5rem;
-    margin: 0;
-    color: #2d3748;
-    font-weight: bold;
-    margin-bottom: 0.5rem;
-}
-
-#certificates_item p {
-    font-size: 1rem;
-    margin: 0;
-    color: #4a5568;
-}
-
-#contact {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-#contact h2 {
-    font-weight: 900;
-    font-size: 3rem;
-    margin: 1rem;
-}
-
-#contact_icon {
-    display: inline-block;
-    width: 1rem;
-    height: 1rem;
-    margin-right: 0.5rem;
-}
-
-#contact_icon:hover {
-    transform: scale(1.1);
-    transition: transform 0.2s ease;
-}
-
-#contact_item {
-    color: #ffffff;
-    margin: 0.5vh;
-}
-
-#contact_item:hover {
-    transform: translateY(-5px);
-    transition: transform 0.2s ease;
-    background-color: #4a5568;
-}
-
-#resume {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    font-size: 1.25rem;
-    height: 100vh;
-}
-
-embed {
-    width: 100%;
-    height: 100%;
-    border: none;
-}
\ No newline at end of file

File: data/info.json
Changes:
@@ -1,3 +0,0 @@
-{
-    "views": 0
-}

File: pyproject.toml
Changes:
@@ -0,0 +1,26 @@
+[project]
+  authors=[
+    { name="Mohamed Hisham Abdelzaher", email="[email protected]" },
+  ]
+  dependencies=["flet-webview>=0.1.0", "flet==0.27.6", "loguru>=0.7.3"]
+  description=""
+  name="mh0386githubio"
+  readme="README.md"
+  requires-python=">=3.11"
+  version="0.1.0"
+
+[tool.flet]
+  company="MH0386"
+  copyright="Copyright (C) 2025 by MH0386"
+  org="com.mh0386"
+  product="mh0386githubio"
+
+[tool.flet.app]
+  path="src"
+
+[dependency-groups]
+  dev=["flet[all]>=0.27.6", "ruff>=0.11.11", "ty>=0.0.1a6"]
+
+[tool.pyright]
+  reportAttributeAccessIssue=false
+  reportUnknownMemberType=false

File: renovate.json
Changes:
@@ -1,9 +1,5 @@
 {
   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
-  "extends": [
-    "config:recommended"
-  ],
-  "lockFileMaintenance": {
-    "enabled": true
-  }
+  "extends": ["config:recommended"],
+  "lockFileMaintenance": { "enabled": true }
 }

File: src/assets/data/info.json
Changes:
@@ -0,0 +1,3 @@
+{
+  "views": 0
+}

File: src/locale/ar-EG.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = الرئيسية
-greeting = مرحباً، اسمي
-myname = محمد هشام عبدالظاهر
-description = مرحباً بكم في موقعي الشخصي! (ألفا)
-about_title = عني
-about_description = .أنا مهندس ذكاء اصطناعي
-projects_title = المشاريع
-certificates_title = الشهادات
-certificates_title_python = بايثون
-certificates_title_machine_learning_specialization = تخصص تعلم الآلة
-certificates_title_supervised_machine_learning = تعلم الآلة المشرف: التوصيف والتصنيف
-certificates_title_advanced_learning_algorithms = خوارزميات تعلم متقدمة
-certificates_title_unsupervised_learning_recommenders_rl = تعلم غير مشرف، الموصى به، تعلم تقوي
-issuing_organization_kaggle = منظمة الإصدار: كاجل
-issuing_organization_stanford_deeplearning_ai = منظمة الإصدار: جامعة ستانفورد، DeepLearning.AI
-issuing_date_march_2023 = تاريخ الإصدار: مارس 2023
-issuing_date_june_2023 = تاريخ الإصدار: يونيو 2023
-issuing_date_february_2023 = تاريخ الإصدار: فبراير 2023
-contact_title = اتصل بي
-resume_title = السيرة الذاتية
\ No newline at end of file

File: src/locale/en-US.ftl
Changes:
@@ -1,20 +0,0 @@
-home_title = Home
-greeting = Hi, My name is
-myname = Mohamed Hisham Abdelzaher
-description = Welcome to my personal website! (Alpha)
-about_title = About Me
-about_description = I am an AI engineer with a passion for Rust.
-projects_title = Projects
-certificates_title = Certificates
-certificates_title_python = Python
-certificates_title_machine_learning_specialization = Machine Learning Specialization
-certificates_title_supervised_machine_learning = Supervised Machine Learning: Regression and Classification
-certificates_title_advanced_learning_algorithms = Advanced Learning Algorithms
-certificates_title_unsupervised_learning_recommenders_rl = Unsupervised Learning, Recommenders, Reinforcement Learning
-issuing_organization_kaggle = Issue Organization: Kaggle
-issuing_organization_stanford_deeplearning_ai = Issuing Organization: Stanford University, DeepLearning.AI
-issuing_date_march_2023 = Issue Date: March 2023
-issuing_date_june_2023 = Issue Date: June 2023
-issuing_date_february_2023 = Issue Date: February 2023
-contact_title = Contact
-resume_title = Resume

File: src/main.py
Changes:
@@ -0,0 +1,45 @@
+from flet import (
+    AppView,
+    CrossAxisAlignment,
+    MainAxisAlignment,
+    Page,
+    RouteChangeEvent,
+    View,
+    app,
+)
+from loguru import logger
+
+from pages.home import home
+from pages.projects import projects
+
+
+def main(page: Page) -> None:
+    page.title = "Mohamed Hisham Abdelzaher"
+    page.vertical_alignment = MainAxisAlignment.CENTER
+    page.horizontal_alignment = CrossAxisAlignment.CENTER
+
+    def route_change(route: RouteChangeEvent) -> None:
+        page.views.clear()
+        match page.route:
+            case "/":
+                page.views.append(home(page=page))
+            case "/projects":
+                page.views.append(projects(page=page))
+        page.update()
+        logger.info(route)
+
+    def view_pop(view: RouteChangeEvent) -> None:
+        page.views.pop()
+        top_view: View = page.views[-1]
+        page.go(route=str(object=top_view.route))
+        logger.info(view)
+
+    page.on_route_change = route_change
+    page.on_view_pop = view_pop
+    page.go(route=page.route)
+
+
+app(
+    target=main,
+    view=AppView.WEB_BROWSER,
+)

File: src/main.rs
Changes:
@@ -1,348 +0,0 @@
-use dioxus::prelude::*;
-use dioxus_i18n::{prelude::*, t, unic_langid::langid};
-use dioxus_router::prelude::*;
-
-#[derive(Debug, Clone, Routable, PartialEq)]
-enum Route {
-    #[layout(NavBar)]
-    #[route("/")]
-    Home {},
-    #[route("/about")]
-    About {},
-    #[route("/projects")]
-    Projects {},
-    #[route("/certificates")]
-    Certificates {},
-    #[route("/contact")]
-    Contact {},
-    #[route("/resume")]
-    Resume {},
-}
-
-#[component]
-fn App() -> Element {
-    rsx! {
-        document::Link {
-            rel: "icon",
-            href: "https://avatars.githubusercontent.com/u/77013511?v=4",
-        }
-        document::Link { rel: "stylesheet", href: asset!("/assets/main.css") }
-        Router::<Route> {}
-    }
-}
-
-#[component]
-fn NavBar() -> Element {
-    use_init_i18n(|| {
-        I18nConfig::new(langid!("en-US"))
-            .with_locale((langid!("en-US"), include_str!("./locale/en-US.ftl")))
-            .with_locale((langid!("ar-EG"), include_str!("./locale/ar-EG.ftl")))
-    });
-    let mut i18n: I18n = i18n();
-    let change_to_english = move |_| i18n.set_language(langid!("en-US"));
-    let change_to_arabic = move |_| i18n.set_language(langid!("ar-EG"));
-    // let locale = i18n.language().to_string();
-    rsx! {
-        div { id: "navbar",
-            Link { to: Route::Home {}, {t!("home_title")} }
-            Link { to: Route::About {}, {t!("about_title")} }
-            Link { to: Route::Projects {}, {t!("projects_title")} }
-            Link { to: Route::Certificates {}, {t!("certificates_title")} }
-            Link { to: Route::Contact {}, {t!("contact_title")} }
-            Link { to: Route::Resume {}, {t!("resume_title")} }
-            if i18n.language() != langid!("en-US") {
-                button { onclick: change_to_english,
-                    label { "English" }
-                }
-            }
-            if i18n.language() != langid!("ar-EG") {
-                button { onclick: change_to_arabic,
-                    label { "العربية" }
-                }
-            }
-        }
-        Outlet::<Route> {}
-    }
-}
-
-#[component]
-fn Home() -> Element {
-    rsx! {
-        section { id: "myname_section",
-            p { {t!("greeting")} }
-            h1 { {t!("myname")} }
-            p { {t!("description")} }
-        }
-    }
-}
-
-#[component]
-fn About() -> Element {
-    rsx! {
-        section { id: "about",
-            h2 { {t!("about_title")} }
-            p { {t!("about_description")} }
-        }
-    }
-}
-
-#[component]
-fn Projects() -> Element {
-    rsx! {
-        section { id: "projects",
-            h2 { {t!("projects_title")} }
-            br {}
-            div { id: "projects_list",
-                div { id: "projects_item",
-                    h4 { "Toys Images" }
-                    p { "Images of Panda and Rabbit Toys" }
-                    p { "Type: Dataset" }
-                    br {}
-                    a {
-                        href: "https://kaggle.com/datasets/mh0386/toys-images",
-                        page: "_blank",
-                        img {
-                            src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                            alt: "kaggle",
-                            id: "projects_item_icon",
-                        }
-                        "Kaggle"
-                    }
-                    br {}
-                    a {
-                        href: "https://github.com/MH0386/toys_dataset",
-                        page: "_blank",
-                        img {
-                            src: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
-                            alt: "github",
-                            id: "projects_item_icon",
-                        }
-                        "GitHub"
-                    }
-                    br {}
-                    a {
-                        href: "https://hf.co/datasets/MH0386/toys_images",
-                        page: "_blank",
-                        img {
-                            src: "https://huggingface.co/front/assets/huggingface_logo-noborder.svg",
-                            alt: "huggingface",
-                            id: "projects_item_icon",
-                        }
-                        "HuggingFace"
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Certificates() -> Element {
-    rsx! {
-        section { id: "certificates",
-            h2 { {t!("certificates_title")} }
-            br {}
-            div { id: "certificates_list",
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://kaggle.com/learn/certification/mh0386/python",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_python")} }
-                        p { {t!("issuing_organization_kaggle")} }
-                        p { {t!("issuing_date_march_2023")} }
-                    }
-                }
-                div { id: "certificates_item",
-                    Link {
-                        to: "https://coursera.org/verify/specialization/3BRYQRFUD5C6",
-                        page: "_blank",
-                        h4 { {t!("certificates_title_machine_learning_specialization")} }
-                        p { {t!("issuing_organization_stanford_deeplearning_ai")} }
-                        p { {t!("issuing_date_june_2023")} }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/XX8THJA26UTS",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_supervised_machine_learning")} }
-                            p { {t!("issuing_date_february_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/HM55XWLDYPA3",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_advanced_learning_algorithms")} }
-                            p { {t!("issuing_date_march_2023")} }
-                        }
-                    }
-                    br {}
-                    div { id: "certificates_item",
-                        Link {
-                            to: "https://coursera.org/verify/B4NKPXD9UN9Z",
-                            page: "_blank",
-                            h4 { {t!("certificates_title_unsupervised_learning_recommenders_rl")} }
-                            p { {t!("issuing_date_june_2023")} }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-#[component]
-fn Contact() -> Element {
-    rsx! {
-        section { id: "contact",
-            h2 { {t!("contact_title")} }
-            Link {
-                to: "mailto:[email protected]",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1313394640393957378/L0W5hykJ_400x400.jpg",
-                    alt: "Gmail",
-                    id: "contact_icon",
-                }
-                "[email protected]"
-            }
-            br {}
-            Link {
-                to: "https://github.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png",
-                    alt: "GitHub",
-                    id: "contact_icon",
-                }
-                "GitHub @MH0386"
-            }
-            Link {
-                to: "https://gitlab.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1526219998741647362/8KKDKESj_400x400.jpg",
-                    alt: "GitLab",
-                    id: "contact_icon",
-                }
-                "GitLab @MH0386"
-            }
-            Link {
-                to: "https://www.linkedin.com/in/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1661161645857710081/6WtDIesg_400x400.png",
-                    alt: "LinkedIn",
-                    id: "contact_icon",
-                }
-                "LinkedIn @MH0386"
-            }
-            Link {
-                to: "https://qabilah.com/profile/MH0386/professional-profile",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1807856405522583552/1_rr1lKY_400x400.jpg",
-                    alt: "Qabilah",
-                    id: "contact_icon",
-                }
-                "Qabilah @MH0386"
-            }
-            Link {
-                to: "https://www.hf.co/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1348748676282388482/nr8ZuLBE_400x400.jpg",
-                    alt: "Hugging Face",
-                    id: "contact_icon",
-                }
-                "HuggingFace @MH0386"
-            }
-            Link {
-                to: "https://www.x.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1683899100922511378/5lY42eHs_400x400.jpg",
-                    alt: "X",
-                    id: "contact_icon",
-                }
-                "X @MH0386"
-            }
-            Link {
-                to: "https://www.kaggle.com/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1573129499343978498/03a7wgfE_400x400.jpg",
-                    alt: "kaggle",
-                    id: "contact_icon",
-                }
-                "Kaggle @MH0386"
-            }
-            Link {
-                to: "https://ollama.com/mohamedhishamabdelzaher",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1874043413466931204/BRau4SQI_400x400.jpg",
-                    alt: "ollama",
-                    id: "contact_icon",
-                }
-                "Ollama @mohamedhishamabdelzaher"
-            }
-            Link {
-                to: "https://app.opensauced.pizza/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1588597214141509632/uo5sqfVs_400x400.png",
-                    alt: "OpenSauced",
-                    id: "contact_icon",
-                }
-                "OpenSauced @MH0386"
-            }
-            Link {
-                to: "https://www.freelancer.com/u/MH0386",
-                page: "_blank",
-                id: "contact_item",
-                img {
-                    src: "https://pbs.twimg.com/profile_images/1838452019700600833/TmFzf9uW_400x400.jpg",
-                    alt: "Freelancer",
-                    id: "contact_icon",
-                }
-                "Freelancer @MH0386"
-            }
-        }
-    }
-}
-
-#[component]
-fn Resume() -> Element {
-    rsx! {
-        div {
-            embed {
-                id: "resume",
-                src: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                r#type: "application/pdf",
-                p {
-                    "Your browser does not support PDF embedding."
-                    a { href: "https://mohamedhisham.is-a.dev/data/docs/resume.pdf",
-                        "Click here to download the PDF instead."
-                    }
-                }
-            }
-        }
-    }
-}
-
-fn main() {
-    dioxus::launch(App);
-}

File: src/pages/certificates.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def certificates(page: Page) -> View:
+    return View(
+        route="/certificates",
+        controls=[
+            AppBar(
+                title=Text(value="Certificates"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/contact.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def contact(page: Page) -> View:
+    return View(
+        route="/contact",
+        controls=[
+            AppBar(
+                title=Text(value="Contact"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

File: src/pages/home.py
Changes:
@@ -0,0 +1,51 @@
+from flet import (
+    Column,
+    CrossAxisAlignment,
+    ElevatedButton,
+    MainAxisAlignment,
+    Page,
+    Row,
+    Text,
+    View,
+)
+
+
+def home(page: Page) -> View:
+    return View(
+        route="/",
+        controls=[
+            Row(
+                controls=[
+                    Column(
+                        alignment=MainAxisAlignment.CENTER,
+                        horizontal_alignment=CrossAxisAlignment.CENTER,
+                        expand=True,
+                        controls=[
+                            Text(value="Hi, My name is"),
+                            Text(value="Mohamed Hisham Abdelzaher"),
+                            Row(
+                                controls=[
+                                    ElevatedButton(
+                                        text="Projects",
+                                        on_click=lambda _: page.go(route="/projects"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Resume",
+                                        on_click=lambda _: page.go(route="/resume"),
+                                    ),
+                                    ElevatedButton(
+                                        text="Contact",
+                                        on_click=lambda _: page.go(route="/contact"),
+                                    ),
+                                ],
+                                spacing=10,
+                                alignment=MainAxisAlignment.CENTER,
+                            ),
+                        ],
+                    ),
+                ],
+                alignment=MainAxisAlignment.CENTER,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/projects.py
Changes:
@@ -0,0 +1,25 @@
+from flet import AppBar, Colors, Column, ElevatedButton, FontWeight, Page, Text, View
+
+
+def projects(page: Page) -> View:
+    return View(
+        route="/projects",
+        controls=[
+            AppBar(
+                title=Text(value="Projects"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+            Column(
+                controls=[
+                    Text(value="My Projects", size=20, weight=FontWeight.BOLD),
+                    Text(value="Project details will be added here..."),
+                ],
+                spacing=20,
+                expand=True,
+            ),
+        ],
+    )

File: src/pages/resume.py
Changes:
@@ -0,0 +1,17 @@
+from flet import AppBar, Colors, ElevatedButton, Page, Text, View
+
+
+def resume(page: Page) -> View:
+    return View(
+        route="/resume",
+        controls=[
+            AppBar(
+                title=Text(value="Resume"),
+                bgcolor=Colors.SURFACE_CONTAINER_HIGHEST,
+            ),
+            ElevatedButton(
+                text="Home",
+                on_click=lambda _: page.go(route="/"),
+            ),
+        ],
+    )

Copy link

Copy link

codecapyai bot commented May 26, 2025

🚀 Scrapybara Ubuntu instance started!

Interactive stream

⚠️ Error fetching GitHub variables, continuing setup:

status_code: 502, body: {'detail': "Error communicating with container: Client error '400 Bad Request' for url 'http://54.176.2.220:30052/env'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400"}

@MH0386
Copy link
Owner Author

MH0386 commented May 26, 2025

@Mergifyio queue

Copy link

codecapyai bot commented May 26, 2025

🔧 Setting up test environment...

Agent Steps

Copy link

codecapyai bot commented May 26, 2025

❌ Something went wrong:

status_code: 500, body: {'detail': '403: No agent credits remaining. Please upgrade your plan.'}

Copy link
Contributor

mergify bot commented May 26, 2025

queue

✅ The pull request has been merged automatically

The pull request has been merged automatically at 32af600

@mergify mergify bot merged commit 32af600 into main May 26, 2025
13 of 17 checks passed
@mergify mergify bot deleted the flet branch May 26, 2025 21:46
@mergify mergify bot had a problem deploying to github-pages May 26, 2025 21:47 Failure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants