-
Notifications
You must be signed in to change notification settings - Fork 0
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
Conversation
|
Reviewer's GuideThis 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 ( File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
-[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
-[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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);
-}
|
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 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. 📒 Files selected for processing (3)
WalkthroughThis 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
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
Possibly related PRs
Poem
✨ Finishing Touches
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed 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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this 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
-
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. ↩
There was a problem hiding this 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.
🚀 Scrapybara Ubuntu instance started!
|
🔧 Setting up test environment... Agent Steps
|
There was a problem hiding this 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
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
❌ Something went wrong:
|
There was a problem hiding this 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
TheMojoSettings
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
Thedescription
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 pinningflet-webview
to an exact version that is known to be compatible withflet==0.27.6
(e.g.,flet-webview==0.1.0
).
24-27
: Expand the dev dependency group
Including linters and type checkers in thedev
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
⛔ 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 filesThe
.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 optionsThe 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 configurationThe 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 addsstorage/
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 configuredThe 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 correctThe
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
UsingSafeArea
andContainer
to center the text widget is appropriate.
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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 InstructionsTo set up the test environment on a blank slate, follow these steps:
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
-[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
-[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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);
-}
|
🚀 Scrapybara Ubuntu instance started!
|
🔧 Setting up test environment... Agent Steps
|
❌ Something went wrong:
|
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
-[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
-[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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);
-}
|
🚀 Scrapybara Ubuntu instance started!
|
🔧 Setting up test environment... Agent Steps
|
❌ Something went wrong:
|
There was a problem hiding this 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 toactions/[email protected]
locks both minor and patch versions, which may prevent critical fixes. Consider usingactions/checkout@v4
to automatically pick up non-breaking updates.
Also, if you need to switch branches later (e.g., gh-pages), addfetch-depth: 0
to ensure full history is available.
24-25
: Align checkout settings in the deploy-resume job
Similar to the build job, consider usingactions/checkout@v4
and settingfetch-depth: 0
to ensure you can fetch or switch to branches likegh-pages
without manually runninggit fetch
.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 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 theuv.lock
file path and caching behavior
Enabling cache for UV dependencies is a great performance optimization. Please confirm thatuv.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
Theuv 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.
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
-[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
+## Run the app
-[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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);
-}
|
🚀 Scrapybara Ubuntu instance started!
|
✅ Setup complete! Running tests... Agent Steps
|
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: Home Page Load and Visual Verification ❗️❗️❗️Description: Tests that the Home page loads correctly with expected text and layout elements. Prerequisites:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
-
-[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
-[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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="/"),
+ ),
+ ],
+ )
|
🚀 Scrapybara Ubuntu instance started!
|
🔧 Setting up test environment... Agent Steps |
❌ Something went wrong:
|
There was a problem hiding this 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 setdocstring-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
📒 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"]
andname="python"
aligns with the new Python/Flet setup.
8-10
: Analyzer metadata for Python is appropriate.Adding builtins
["_", "pretty_output"]
, settingruntime_version="3.x.x"
, and enablingmypy
ensures type checking and recognizes Flet-specific globals.
13-16
: Docker and Secrets analyzers added.Including the
docker
andsecrets
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 thetrunk
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 yourpyproject.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.
Theexclude
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.
Settingindent-width=4
andline-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 adjustselect
/ignore
as your codebase evolves.
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.
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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 AnalyzedFile: .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
[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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="/"),
+ ),
+ ],
+ )
|
🚀 Scrapybara Ubuntu instance started!
|
🔧 Setting up test environment... Agent Steps |
❌ Something went wrong:
|
@Mergifyio queue |
🛑 The pull request has been removed from the queue
|
@Mergifyio rebase |
☑️ Nothing to do, the required conditions are not met
|
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.
CodeCapy Review ₍ᐢ•(ܫ)•ᐢ₎
Codebase SummaryThis 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 ChangesThe 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
Generated Test Cases1: 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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
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:
Steps:
Expected Result: Clicking the 'Home' button should navigate the user back to the Home page, confirming proper back navigation functionality. Raw Changes AnalyzedFile: .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
[](https://sonarcloud.io/summary/new_code?id=MH0386_MH0386.github.io)
-
[](https://www.codefactor.io/repository/github/mh0386/mh0386.github.io)
-<!--[](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="/"),
+ ),
+ ],
+ )
|
|
🚀 Scrapybara Ubuntu instance started!
|
@Mergifyio queue |
🔧 Setting up test environment... Agent Steps |
❌ Something went wrong:
|
✅ The pull request has been merged automaticallyThe pull request has been merged automatically at 32af600 |
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/
, andCargo.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
andassets/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:
.github/workflows/rust-clippy.yml
: Deleted the Clippy linting workflow for Rust.Summary by Sourcery
Migrate project from Rust-based Dioxus to Python-based Flet framework, simplifying project structure and updating development workflows
New Features:
Build:
CI:
Documentation:
Chores:
Summary by CodeRabbit
New Features
Documentation
Chores