From 6d5d1ee1e305c1edca037553fb9a4288f238cc83 Mon Sep 17 00:00:00 2001 From: Mohammed Date: Thu, 2 Apr 2026 13:18:40 +0300 Subject: [PATCH 1/5] top nav implemented --- GoogleSearch/GoogleSearch/__init__.py | 0 GoogleSearch/GoogleSearch/asgi.py | 16 +++ GoogleSearch/GoogleSearch/settings.py | 118 ++++++++++++++++++ GoogleSearch/GoogleSearch/urls.py | 23 ++++ GoogleSearch/GoogleSearch/wsgi.py | 16 +++ GoogleSearch/main/__init__.py | 0 GoogleSearch/main/admin.py | 3 + GoogleSearch/main/apps.py | 5 + GoogleSearch/main/migrations/__init__.py | 0 GoogleSearch/main/models.py | 3 + GoogleSearch/main/static/css/style.css | 93 ++++++++++++++ GoogleSearch/main/static/images/camera.png | Bin 0 -> 7604 bytes .../main/static/images/google-logo.png | Bin 0 -> 13504 bytes .../main/static/images/mircophone.png | Bin 0 -> 7737 bytes .../static/images/tos_main_illustration.svg | 1 + GoogleSearch/main/templates/main/base.html | 44 +++++++ GoogleSearch/main/templates/main/home.html | 12 ++ GoogleSearch/main/templates/main/terms.html | 0 GoogleSearch/main/tests.py | 3 + GoogleSearch/main/urls.py | 10 ++ GoogleSearch/main/views.py | 10 ++ GoogleSearch/manage.py | 22 ++++ 22 files changed, 379 insertions(+) create mode 100644 GoogleSearch/GoogleSearch/__init__.py create mode 100644 GoogleSearch/GoogleSearch/asgi.py create mode 100644 GoogleSearch/GoogleSearch/settings.py create mode 100644 GoogleSearch/GoogleSearch/urls.py create mode 100644 GoogleSearch/GoogleSearch/wsgi.py create mode 100644 GoogleSearch/main/__init__.py create mode 100644 GoogleSearch/main/admin.py create mode 100644 GoogleSearch/main/apps.py create mode 100644 GoogleSearch/main/migrations/__init__.py create mode 100644 GoogleSearch/main/models.py create mode 100644 GoogleSearch/main/static/css/style.css create mode 100644 GoogleSearch/main/static/images/camera.png create mode 100644 GoogleSearch/main/static/images/google-logo.png create mode 100644 GoogleSearch/main/static/images/mircophone.png create mode 100644 GoogleSearch/main/static/images/tos_main_illustration.svg create mode 100644 GoogleSearch/main/templates/main/base.html create mode 100644 GoogleSearch/main/templates/main/home.html create mode 100644 GoogleSearch/main/templates/main/terms.html create mode 100644 GoogleSearch/main/tests.py create mode 100644 GoogleSearch/main/urls.py create mode 100644 GoogleSearch/main/views.py create mode 100755 GoogleSearch/manage.py diff --git a/GoogleSearch/GoogleSearch/__init__.py b/GoogleSearch/GoogleSearch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/GoogleSearch/GoogleSearch/asgi.py b/GoogleSearch/GoogleSearch/asgi.py new file mode 100644 index 0000000..07cf612 --- /dev/null +++ b/GoogleSearch/GoogleSearch/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for GoogleSearch project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'GoogleSearch.settings') + +application = get_asgi_application() diff --git a/GoogleSearch/GoogleSearch/settings.py b/GoogleSearch/GoogleSearch/settings.py new file mode 100644 index 0000000..d3abd95 --- /dev/null +++ b/GoogleSearch/GoogleSearch/settings.py @@ -0,0 +1,118 @@ +""" +Django settings for GoogleSearch project. + +Generated by 'django-admin startproject' using Django 6.0.3. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/6.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-7b08fu_g%3rk!3yj&599u*z_n0@5!t)*0utj4c99!dyu&p5b-l' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'main', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'GoogleSearch.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'GoogleSearch.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/6.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/6.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/6.0/howto/static-files/ + +STATIC_URL = 'static/' diff --git a/GoogleSearch/GoogleSearch/urls.py b/GoogleSearch/GoogleSearch/urls.py new file mode 100644 index 0000000..841c278 --- /dev/null +++ b/GoogleSearch/GoogleSearch/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for GoogleSearch project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/6.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('main.urls')), +] diff --git a/GoogleSearch/GoogleSearch/wsgi.py b/GoogleSearch/GoogleSearch/wsgi.py new file mode 100644 index 0000000..48684be --- /dev/null +++ b/GoogleSearch/GoogleSearch/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for GoogleSearch project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'GoogleSearch.settings') + +application = get_wsgi_application() diff --git a/GoogleSearch/main/__init__.py b/GoogleSearch/main/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/GoogleSearch/main/admin.py b/GoogleSearch/main/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/GoogleSearch/main/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/GoogleSearch/main/apps.py b/GoogleSearch/main/apps.py new file mode 100644 index 0000000..833bff6 --- /dev/null +++ b/GoogleSearch/main/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MainConfig(AppConfig): + name = 'main' diff --git a/GoogleSearch/main/migrations/__init__.py b/GoogleSearch/main/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/GoogleSearch/main/models.py b/GoogleSearch/main/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/GoogleSearch/main/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/GoogleSearch/main/static/css/style.css b/GoogleSearch/main/static/css/style.css new file mode 100644 index 0000000..183c0d9 --- /dev/null +++ b/GoogleSearch/main/static/css/style.css @@ -0,0 +1,93 @@ +/* I need to know why we reset... */ +* { + margin: 0; + padding: 0; +} +/* wrapper Styles */ +.wrapper { + padding: 1rem 1rem; + display: flex; + flex-direction: column; +} + +/* nav Styles */ +nav { + display: flex; + flex-direction: row; + align-items: center; + justify-content: right; + font-family: Arial, sans-serif; + font-size: 0.8rem; + gap: 1.5rem; +} +nav a { + text-decoration: none; + color: #696969; + +} +nav a:hover { + text-decoration: underline; +} +nav span { + color: #696969; + padding: 0.4rem; +} +nav .apps-btn { + border: none; + background: none; + cursor: pointer; +} +nav .apps-btn:hover{ + border: none; + background-color: #f0f0f0; + border-radius: 50%; +} +nav .btn { + background-color: #1868d1; + color: white; + border: none; + font-size: 0.9rem; + padding: 0.7rem 1.3rem; + border-radius: 2rem; +} +nav .btn:hover { + box-shadow: #696969 0px 0px 5px; + cursor: pointer; +} + +/* footer Styles */ +footer { + display: flex; + flex-direction: column; + padding: 1rem 1rem; + justify-items: center; + font-family: Arial, sans-serif; + font-size: 0.8rem; + color: #696969; + background-color: #e9e9e9; + gap:0 +} +footer .top-section { + font-size: 1rem; + text-decoration: none; + gap: 1rem; +} +footer .bottom-section { + display: flex; + flex-direction: row; + justify-content: space-between; +} +.right { + display: flex; + flex-direction: row; + gap: 0.5rem; +} +.left { + display: flex; + flex-direction: row; + gap: 0.5rem; +} +footer a { + text-decoration: none; + color: #696969; +} \ No newline at end of file diff --git a/GoogleSearch/main/static/images/camera.png b/GoogleSearch/main/static/images/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecc70532054bba37a5c170f098176e6f4781889 GIT binary patch literal 7604 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 literal 0 HcmV?d00001 diff --git a/GoogleSearch/main/static/images/tos_main_illustration.svg b/GoogleSearch/main/static/images/tos_main_illustration.svg new file mode 100644 index 0000000..883e2d6 --- /dev/null +++ b/GoogleSearch/main/static/images/tos_main_illustration.svg @@ -0,0 +1 @@ +scene_password_manager_welcome diff --git a/GoogleSearch/main/templates/main/base.html b/GoogleSearch/main/templates/main/base.html new file mode 100644 index 0000000..d913b46 --- /dev/null +++ b/GoogleSearch/main/templates/main/base.html @@ -0,0 +1,44 @@ + + + + + + + + {% block title %}{% endblock %} + + +
+ +
+ {% block content %} + + {% endblock %} +
+ +
+ + \ No newline at end of file diff --git a/GoogleSearch/main/templates/main/home.html b/GoogleSearch/main/templates/main/home.html new file mode 100644 index 0000000..c0d13bd --- /dev/null +++ b/GoogleSearch/main/templates/main/home.html @@ -0,0 +1,12 @@ + + + + + + Document + + + yo + + + \ No newline at end of file diff --git a/GoogleSearch/main/templates/main/terms.html b/GoogleSearch/main/templates/main/terms.html new file mode 100644 index 0000000..e69de29 diff --git a/GoogleSearch/main/tests.py b/GoogleSearch/main/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/GoogleSearch/main/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/GoogleSearch/main/urls.py b/GoogleSearch/main/urls.py new file mode 100644 index 0000000..5fcc5eb --- /dev/null +++ b/GoogleSearch/main/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from . import views + +app_name = 'main' + +urlpatterns = [ + path('', views.home_view, name='home_view'), + path('terms/', views.terms_view, name='terms_view'), + path('test/', views.test_view, name='test_view'), +] \ No newline at end of file diff --git a/GoogleSearch/main/views.py b/GoogleSearch/main/views.py new file mode 100644 index 0000000..410edfa --- /dev/null +++ b/GoogleSearch/main/views.py @@ -0,0 +1,10 @@ +from django.shortcuts import render +from django.http import HttpResponse, HttpRequest + +def home_view(request: HttpRequest): + return render(request, 'main/home.html') + +def terms_view(request: HttpRequest): + return render(request, 'main/terms.html') +def test_view(request: HttpRequest): + return render(request, 'main/base.html') \ No newline at end of file diff --git a/GoogleSearch/manage.py b/GoogleSearch/manage.py new file mode 100755 index 0000000..cad9c4a --- /dev/null +++ b/GoogleSearch/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'GoogleSearch.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() From 3f09c3125590812169272f4da8e7a4c3ae424b29 Mon Sep 17 00:00:00 2001 From: Mohammed Alqadda Date: Sun, 5 Apr 2026 06:49:09 +0300 Subject: [PATCH 2/5] lab done + bonus --- GoogleSearch/main/static/css/style.css | 207 ++++++++++++++++++-- GoogleSearch/main/templates/main/base.html | 29 +-- GoogleSearch/main/templates/main/home.html | 45 +++-- GoogleSearch/main/templates/main/terms.html | 79 ++++++++ GoogleSearch/main/urls.py | 1 - GoogleSearch/main/views.py | 7 +- 6 files changed, 322 insertions(+), 46 deletions(-) diff --git a/GoogleSearch/main/static/css/style.css b/GoogleSearch/main/static/css/style.css index 183c0d9..9b39417 100644 --- a/GoogleSearch/main/static/css/style.css +++ b/GoogleSearch/main/static/css/style.css @@ -2,34 +2,37 @@ * { margin: 0; padding: 0; + box-sizing: border-box; } /* wrapper Styles */ .wrapper { - padding: 1rem 1rem; + display: flex; flex-direction: column; + min-height: 100vh; } /* nav Styles */ nav { + padding: 1rem 1rem; display: flex; flex-direction: row; align-items: center; justify-content: right; - font-family: Arial, sans-serif; + font-family: 'Open Sans', sans-serif; font-size: 0.8rem; gap: 1.5rem; } nav a { text-decoration: none; - color: #696969; + color: #5b7183; } nav a:hover { text-decoration: underline; } nav span { - color: #696969; + color: #5b7183; padding: 0.4rem; } nav .apps-btn { @@ -43,7 +46,7 @@ nav .apps-btn:hover{ border-radius: 50%; } nav .btn { - background-color: #1868d1; + background-color: #0957d0; color: white; border: none; font-size: 0.9rem; @@ -51,7 +54,7 @@ nav .btn { border-radius: 2rem; } nav .btn:hover { - box-shadow: #696969 0px 0px 5px; + box-shadow: #5b7183 0px 0px 5px; cursor: pointer; } @@ -59,35 +62,201 @@ nav .btn:hover { footer { display: flex; flex-direction: column; - padding: 1rem 1rem; - justify-items: center; - font-family: Arial, sans-serif; + margin-top: auto; /* makes it stuck to bootom */ + font-family: 'Open Sans', sans-serif; font-size: 0.8rem; - color: #696969; - background-color: #e9e9e9; - gap:0 + color: #5b7183; + background-color: #f2f2f2; } footer .top-section { + padding: 0.75rem 1.5rem; font-size: 1rem; text-decoration: none; - gap: 1rem; +} +footer .line { + border-top: 1px solid #e0e0e0; } footer .bottom-section { + padding: 0.75rem 1.5rem; display: flex; flex-direction: row; justify-content: space-between; + align-items: center; + gap: 1rem; + flex-wrap: wrap; } -.right { +footer .right { display: flex; flex-direction: row; - gap: 0.5rem; + gap: 1rem; } -.left { +footer .left { display: flex; flex-direction: row; - gap: 0.5rem; + gap: 1rem; } footer a { text-decoration: none; - color: #696969; -} \ No newline at end of file + color: #5b7183; +} + +/* main Styles -- google search page */ +main { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + font-family: 'Open Sans', sans-serif; + font-size: 0.8rem; +} +main .main-top img{ + width: 272px; + height: 92px; + margin-top: 15rem; +} +main .main-middle .search-box { + display: flex; + flex-direction: row; + align-items: center; + box-shadow: #5b7183 0rem 0rem 0.5rem; + border-radius: 2rem; + width: 35rem; + height: 2.2rem; + padding: 0.5rem 0.5rem; + gap: 0.5rem; +} +.search-form { + display: flex; + flex-direction: column; + align-items: center; +} +main .main-middle input{ + width: 30rem; + height: 2rem; + border: none; + background-color: none; +} +main .main-middle input:focus { + outline: none; +} +main .main-middle .search-box button{ + max-width: 1.9em; + max-height: 1.9rem; + border: none; + border-radius: 2rem; + background-color: transparent; +} +main .main-middle .search-box button:hover{ + cursor: pointer; +} +main .main-middle .search-box img{ + max-width: 100%; + max-height: 100%; + border-radius: 2rem; +} +.buttons { + display: flex; + flex-direction: row; + gap: 1rem; + margin-top: 1rem; + align-items: center; + justify-content: center; +} +.buttons button, +.buttons a { + background-color: #f8f8f8; + color: #5b7183; + border: none; + padding: 0.7rem 1.3rem; + border-radius: 0.7rem; + text-decoration: none; +} +.buttons button:hover, +.buttons a:hover { + box-shadow: black 0px 0px 5px; + cursor: pointer; +} +main .main-bottom { + font-family: 'Open Sans', sans-serif; + font-size: 0.8rem; + text-decoration: none; + color: #5b7183; +} +main .main-bottom a { + text-decoration: none; +} +main .main-bottom a:hover { + text-decoration: underline; + cursor: pointer; +} +.terms-wrapper { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + max-width: 980px; + margin: 0 auto; + padding: 3rem 1.5rem 5rem; + font-family: 'Open Sans', sans-serif; + font-size: 1rem; + text-align: left; +} +.terms-wrapper img { + width: 100%; + max-width: 100%; + margin-bottom: 2rem; +} +.terms-content { + width: 100%; + max-width: 100%; +} +.terms-content h1 { + font-size: 2.2rem; + font-weight: 500; + color: #202124; + margin-bottom: 1rem; +} +.terms-content h2 { + font-size: 1.75rem; + font-weight: 500; + color: #202124; + margin: 2.5rem 0 1rem; +} +.terms-content h3 { + font-size: 1.25rem; + font-weight: 600; + color: #202124; + margin: 1.75rem 0 0.75rem; +} +.terms-content h4 { + font-size: 1rem; + font-weight: 600; + color: #202124; + margin: 1.75rem 0 0.75rem; +} +.terms-content p, +.terms-content li { + color: #3c4043; + line-height: 1.8; +} +.terms-content p { + margin-bottom: 1rem; +} +.terms-content ul { + padding-left: 1.5rem; + margin: 1rem 0 1.5rem; +} +.terms-content li { + margin-bottom: 0.6rem; +} +.terms-content a { + color: #1a73e8; + text-decoration: none; +} +.terms-content a:hover { + text-decoration: underline; +} +.terms-meta { + color: #5f6368; + font-size: 0.95rem; +} diff --git a/GoogleSearch/main/templates/main/base.html b/GoogleSearch/main/templates/main/base.html index d913b46..3261bf5 100644 --- a/GoogleSearch/main/templates/main/base.html +++ b/GoogleSearch/main/templates/main/base.html @@ -1,21 +1,26 @@ + {% load static %} - - + + + + + {% block title %}{% endblock %}
{% block content %} @@ -26,18 +31,20 @@

Saudi Arabia

+
+
diff --git a/GoogleSearch/main/templates/main/home.html b/GoogleSearch/main/templates/main/home.html index c0d13bd..aaafbf6 100644 --- a/GoogleSearch/main/templates/main/home.html +++ b/GoogleSearch/main/templates/main/home.html @@ -1,12 +1,33 @@ - - - - - - Document - - - yo - - - \ No newline at end of file +{% extends "main/base.html" %} +{% load static %} +{% block title %}Google{% endblock %} +{% block content %} +
+ Google Logo +
+
+
+ +
+ + I'm Feeling Lucky +
+
+
+ +
+
Google offered in: العربية
+
+ +{% endblock %} diff --git a/GoogleSearch/main/templates/main/terms.html b/GoogleSearch/main/templates/main/terms.html index e69de29..e2f9d0e 100644 --- a/GoogleSearch/main/templates/main/terms.html +++ b/GoogleSearch/main/templates/main/terms.html @@ -0,0 +1,79 @@ +{% extends 'main/base.html' %} +{% load static %} + +{% block title %}Google Terms{% endblock %} + +{% block content %} +
+ Terms of Service + +
+

Google Terms of Service

+

+ Effective 5 January 2022 | + Archived versions | + Download PDF +

+

+ Country version: + Saudi Arabia +

+ +

What's covered in these terms

+

+ We know it's tempting to skip these Terms of Service, but it's important to establish what you can + expect from us as you use Google services, and what we expect from you. +

+

+ These Terms of Service reflect the way that Google's business works, the laws that apply to our company, + and certain things that we've always believed to be true. As a result, these terms help define Google's + relationship with you as you interact with its services. +

+ + + +

+ Understanding these terms is important because, by using our services, you’re agreeing to these terms. +

+

+ Besides these terms, we also publish a + Privacy Policy + . Although it’s not part of these terms, we encourage you to read it to better understand how you can + update, manage, export and delete your information. +

+ +

Terms

+ +

Service provider

+

+ Google services are provided by, and you’re contracting with: +

+

+ Google LLC
+ organised under the laws of the State of Delaware, USA, and operating under the laws of the US

+ 1600 Amphitheatre Parkway
+ Mountain View, California 94043
+ USA +

+ +

Age requirements

+

+ If you’re under the + age required to manage your own Google Account, you must have your parent or legal guardian’s permission to use a Google Account. Please ask your parent or legal guardian to read these terms with you. +

+

+ If you’re a parent or legal guardian, and you allow your child to use the + services, then these terms apply to you and you’re responsible for your child’s activity on the services. +

+

+ Some Google services have additional age requirements as described in their + service-specific additional terms and policies. +

+
+
+{% endblock %} \ No newline at end of file diff --git a/GoogleSearch/main/urls.py b/GoogleSearch/main/urls.py index 5fcc5eb..4fdd1e9 100644 --- a/GoogleSearch/main/urls.py +++ b/GoogleSearch/main/urls.py @@ -6,5 +6,4 @@ urlpatterns = [ path('', views.home_view, name='home_view'), path('terms/', views.terms_view, name='terms_view'), - path('test/', views.test_view, name='test_view'), ] \ No newline at end of file diff --git a/GoogleSearch/main/views.py b/GoogleSearch/main/views.py index 410edfa..f133179 100644 --- a/GoogleSearch/main/views.py +++ b/GoogleSearch/main/views.py @@ -1,10 +1,11 @@ from django.shortcuts import render from django.http import HttpResponse, HttpRequest + + def home_view(request: HttpRequest): return render(request, 'main/home.html') -def terms_view(request: HttpRequest): +def terms_view(request): return render(request, 'main/terms.html') -def test_view(request: HttpRequest): - return render(request, 'main/base.html') \ No newline at end of file + From 0ad8db589ae35f8bf91bfd58371186b7db309d71 Mon Sep 17 00:00:00 2001 From: Mohammed Alqadda Date: Sun, 5 Apr 2026 19:06:40 +0300 Subject: [PATCH 3/5] fixes --- .gitignore | 1 + GoogleSearch/GoogleSearch/settings.py | 6 ++++++ GoogleSearch/main/static/css/style.css | 10 +++++----- GoogleSearch/main/templates/main/base.html | 3 --- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index b7faf40..45a7a7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Byte-compiled / optimized / DLL files +labEnv/ __pycache__/ *.py[codz] *$py.class diff --git a/GoogleSearch/GoogleSearch/settings.py b/GoogleSearch/GoogleSearch/settings.py index d3abd95..3a4936e 100644 --- a/GoogleSearch/GoogleSearch/settings.py +++ b/GoogleSearch/GoogleSearch/settings.py @@ -43,6 +43,7 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -108,6 +109,11 @@ TIME_ZONE = 'UTC' USE_I18N = True +LANGUAGES = [ + ('en', 'English'), + ('ar', 'Arabic'), +] +LANGUAGE_BIDI = True USE_TZ = True diff --git a/GoogleSearch/main/static/css/style.css b/GoogleSearch/main/static/css/style.css index 9b39417..7b20bd2 100644 --- a/GoogleSearch/main/static/css/style.css +++ b/GoogleSearch/main/static/css/style.css @@ -19,7 +19,7 @@ nav { flex-direction: row; align-items: center; justify-content: right; - font-family: 'Open Sans', sans-serif; + font-family: sans-serif; font-size: 0.8rem; gap: 1.5rem; } @@ -63,7 +63,7 @@ footer { display: flex; flex-direction: column; margin-top: auto; /* makes it stuck to bootom */ - font-family: 'Open Sans', sans-serif; + font-family: sans-serif; font-size: 0.8rem; color: #5b7183; background-color: #f2f2f2; @@ -106,7 +106,7 @@ main { flex-direction: column; align-items: center; gap: 1rem; - font-family: 'Open Sans', sans-serif; + font-family: sans-serif; font-size: 0.8rem; } main .main-top img{ @@ -177,7 +177,7 @@ main .main-middle .search-box img{ cursor: pointer; } main .main-bottom { - font-family: 'Open Sans', sans-serif; + font-family: sans-serif; font-size: 0.8rem; text-decoration: none; color: #5b7183; @@ -197,7 +197,7 @@ main .main-bottom a:hover { max-width: 980px; margin: 0 auto; padding: 3rem 1.5rem 5rem; - font-family: 'Open Sans', sans-serif; + font-family: sans-serif; font-size: 1rem; text-align: left; } diff --git a/GoogleSearch/main/templates/main/base.html b/GoogleSearch/main/templates/main/base.html index 3261bf5..7f8ccff 100644 --- a/GoogleSearch/main/templates/main/base.html +++ b/GoogleSearch/main/templates/main/base.html @@ -4,9 +4,6 @@ {% load static %} - - - {% block title %}{% endblock %} From 27882db8fe9681af552b95818c4c1f518a8b225c Mon Sep 17 00:00:00 2001 From: Mohammed Date: Mon, 6 Apr 2026 08:08:36 +0300 Subject: [PATCH 4/5] added dark mode --- GoogleSearch/main/static/css/style.css | 93 +++++++++++++++++----- GoogleSearch/main/templates/main/base.html | 11 ++- GoogleSearch/main/templates/main/home.html | 2 +- GoogleSearch/main/urls.py | 1 + GoogleSearch/main/views.py | 11 ++- 5 files changed, 95 insertions(+), 23 deletions(-) diff --git a/GoogleSearch/main/static/css/style.css b/GoogleSearch/main/static/css/style.css index 7b20bd2..0d98a74 100644 --- a/GoogleSearch/main/static/css/style.css +++ b/GoogleSearch/main/static/css/style.css @@ -4,30 +4,41 @@ padding: 0; box-sizing: border-box; } +body { + font-family: sans-serif; + background-color: #fff; +} +body.dark { + background-color: #1f1f1f; +} /* wrapper Styles */ .wrapper { - + display: flex; flex-direction: column; min-height: 100vh; } + /* nav Styles */ nav { - padding: 1rem 1rem; + padding: 0.5rem 0.5rem; display: flex; flex-direction: row; align-items: center; justify-content: right; font-family: sans-serif; font-size: 0.8rem; - gap: 1.5rem; + gap: 0.8rem; } nav a { text-decoration: none; color: #5b7183; } +.dark nav a { + color: #e8eaed; +} nav a:hover { text-decoration: underline; } @@ -35,6 +46,9 @@ nav span { color: #5b7183; padding: 0.4rem; } +.dark nav span { + color: #e8eaed; +} nav .apps-btn { border: none; background: none; @@ -42,9 +56,11 @@ nav .apps-btn { } nav .apps-btn:hover{ border: none; - background-color: #f0f0f0; + + background-color: gray; border-radius: 50%; } + nav .btn { background-color: #0957d0; color: white; @@ -68,32 +84,37 @@ footer { color: #5b7183; background-color: #f2f2f2; } +.dark footer , .dark footer a { + background-color: #171717; + color: #e8eaed; +} footer .top-section { - padding: 0.75rem 1.5rem; - font-size: 1rem; + padding: 1rem 2rem; + font-size: 0.9rem; text-decoration: none; } footer .line { border-top: 1px solid #e0e0e0; } footer .bottom-section { - padding: 0.75rem 1.5rem; + padding: 0.9rem 2.1rem; display: flex; flex-direction: row; justify-content: space-between; align-items: center; - gap: 1rem; + font-size: 0.85rem; + gap: 1.2rem; flex-wrap: wrap; } footer .right { display: flex; flex-direction: row; - gap: 1rem; + gap: 1.5rem; } footer .left { display: flex; flex-direction: row; - gap: 1rem; + gap: 1.5rem; } footer a { text-decoration: none; @@ -110,21 +131,26 @@ main { font-size: 0.8rem; } main .main-top img{ - width: 272px; - height: 92px; - margin-top: 15rem; + width: 273px; + height: auto; + margin-top: 8rem; + margin-bottom: 1rem; } main .main-middle .search-box { display: flex; flex-direction: row; align-items: center; - box-shadow: #5b7183 0rem 0rem 0.5rem; + box-shadow: #5b7183 0rem 0rem 0.1rem; border-radius: 2rem; - width: 35rem; - height: 2.2rem; + width: 37rem; + height: 3rem; padding: 0.5rem 0.5rem; gap: 0.5rem; } +.dark main .main-middle .search-box { + background-color: #4d5156; + box-shadow: #e8eaed 0rem 0rem 0.1rem; +} .search-form { display: flex; flex-direction: column; @@ -136,6 +162,10 @@ main .main-middle input{ border: none; background-color: none; } +.dark main .main-middle input { + background-color: #4d5156; + color: #e8eaed; +} main .main-middle input:focus { outline: none; } @@ -154,11 +184,14 @@ main .main-middle .search-box img{ max-height: 100%; border-radius: 2rem; } +.dark main .main-middle .search-box img { + background-color: transparent; +} .buttons { display: flex; flex-direction: row; gap: 1rem; - margin-top: 1rem; + margin-top: 1.5rem; align-items: center; justify-content: center; } @@ -171,17 +204,31 @@ main .main-middle .search-box img{ border-radius: 0.7rem; text-decoration: none; } +.dark .buttons button, +.dark .buttons a { + background-color: #3c4043; + color: #e8eaed; +} .buttons button:hover, .buttons a:hover { box-shadow: black 0px 0px 5px; cursor: pointer; } +.dark .buttons button:hover, +.dark .buttons a:hover { + box-shadow: #e8eaed 0px 0px 2px; +} main .main-bottom { font-family: sans-serif; - font-size: 0.8rem; + font-size: 0.9rem; text-decoration: none; color: #5b7183; + margin-top: 3rem; +} +.dark main .main-bottom { + color: #e8eaed; } + main .main-bottom a { text-decoration: none; } @@ -216,6 +263,9 @@ main .main-bottom a:hover { color: #202124; margin-bottom: 1rem; } +.dark .terms-content h1, .dark .terms-content h2, .dark .terms-content h3, .dark .terms-content h4 { + color: #e8eaed; +} .terms-content h2 { font-size: 1.75rem; font-weight: 500; @@ -239,6 +289,10 @@ main .main-bottom a:hover { color: #3c4043; line-height: 1.8; } +.dark .terms-content p, +.dark .terms-content li { + color: #e8eaed; +} .terms-content p { margin-bottom: 1rem; } @@ -260,3 +314,6 @@ main .main-bottom a:hover { color: #5f6368; font-size: 0.95rem; } +.dark .terms-meta { + color: #e8eaed; +} diff --git a/GoogleSearch/main/templates/main/base.html b/GoogleSearch/main/templates/main/base.html index 7f8ccff..265e0df 100644 --- a/GoogleSearch/main/templates/main/base.html +++ b/GoogleSearch/main/templates/main/base.html @@ -4,11 +4,11 @@ {% load static %} - + {% block title %}{% endblock %} - +
- \ No newline at end of file + diff --git a/GoogleSearch/main/templates/main/home.html b/GoogleSearch/main/templates/main/home.html index aaafbf6..95c71ff 100644 --- a/GoogleSearch/main/templates/main/home.html +++ b/GoogleSearch/main/templates/main/home.html @@ -11,7 +11,7 @@ - + diff --git a/GoogleSearch/main/urls.py b/GoogleSearch/main/urls.py index 4fdd1e9..f922315 100644 --- a/GoogleSearch/main/urls.py +++ b/GoogleSearch/main/urls.py @@ -6,4 +6,5 @@ urlpatterns = [ path('', views.home_view, name='home_view'), path('terms/', views.terms_view, name='terms_view'), + path('mode//', views.mode_view, name='mode_view'), ] \ No newline at end of file diff --git a/GoogleSearch/main/views.py b/GoogleSearch/main/views.py index f133179..b3ce1e4 100644 --- a/GoogleSearch/main/views.py +++ b/GoogleSearch/main/views.py @@ -1,11 +1,20 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect from django.http import HttpResponse, HttpRequest + def home_view(request: HttpRequest): return render(request, 'main/home.html') def terms_view(request): return render(request, 'main/terms.html') +def mode_view(request:HttpRequest, mode): + response = redirect(request.GET.get("next", "/")) + if mode == "light": + response.set_cookie("mode", "light") + elif mode == "dark": + response.set_cookie("mode", "dark") + return response + From 8e793b3b051ab83badd6e712943a8b62734ead6a Mon Sep 17 00:00:00 2001 From: Mohammed Date: Mon, 6 Apr 2026 09:09:58 +0300 Subject: [PATCH 5/5] style fixes --- GoogleSearch/main/static/css/style.css | 67 +++++++++++++++++----- GoogleSearch/main/templates/main/base.html | 8 +-- 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/GoogleSearch/main/static/css/style.css b/GoogleSearch/main/static/css/style.css index 0d98a74..513dd27 100644 --- a/GoogleSearch/main/static/css/style.css +++ b/GoogleSearch/main/static/css/style.css @@ -36,7 +36,7 @@ nav a { color: #5b7183; } -.dark nav a { +body.dark nav a { color: #e8eaed; } nav a:hover { @@ -46,7 +46,7 @@ nav span { color: #5b7183; padding: 0.4rem; } -.dark nav span { +body.dark nav span { color: #e8eaed; } nav .apps-btn { @@ -84,7 +84,7 @@ footer { color: #5b7183; background-color: #f2f2f2; } -.dark footer , .dark footer a { +body.dark footer , body.dark footer a { background-color: #171717; color: #e8eaed; } @@ -92,6 +92,9 @@ footer .top-section { padding: 1rem 2rem; font-size: 0.9rem; text-decoration: none; + display: flex; + flex-direction: row; + justify-content: space-between; } footer .line { border-top: 1px solid #e0e0e0; @@ -147,7 +150,7 @@ main .main-middle .search-box { padding: 0.5rem 0.5rem; gap: 0.5rem; } -.dark main .main-middle .search-box { +body.dark main .main-middle .search-box { background-color: #4d5156; box-shadow: #e8eaed 0rem 0rem 0.1rem; } @@ -162,7 +165,7 @@ main .main-middle input{ border: none; background-color: none; } -.dark main .main-middle input { +body.dark main .main-middle input { background-color: #4d5156; color: #e8eaed; } @@ -184,7 +187,7 @@ main .main-middle .search-box img{ max-height: 100%; border-radius: 2rem; } -.dark main .main-middle .search-box img { +body.dark main .main-middle .search-box img { background-color: transparent; } .buttons { @@ -204,8 +207,8 @@ main .main-middle .search-box img{ border-radius: 0.7rem; text-decoration: none; } -.dark .buttons button, -.dark .buttons a { +body.dark .buttons button, +body.dark .buttons a { background-color: #3c4043; color: #e8eaed; } @@ -214,8 +217,8 @@ main .main-middle .search-box img{ box-shadow: black 0px 0px 5px; cursor: pointer; } -.dark .buttons button:hover, -.dark .buttons a:hover { +body.dark .buttons button:hover, +body.dark .buttons a:hover { box-shadow: #e8eaed 0px 0px 2px; } main .main-bottom { @@ -225,7 +228,7 @@ main .main-bottom { color: #5b7183; margin-top: 3rem; } -.dark main .main-bottom { +body.dark main .main-bottom { color: #e8eaed; } @@ -263,7 +266,7 @@ main .main-bottom a:hover { color: #202124; margin-bottom: 1rem; } -.dark .terms-content h1, .dark .terms-content h2, .dark .terms-content h3, .dark .terms-content h4 { +body.dark .terms-content h1, body.dark .terms-content h2, body.dark .terms-content h3, body.dark .terms-content h4 { color: #e8eaed; } .terms-content h2 { @@ -289,8 +292,8 @@ main .main-bottom a:hover { color: #3c4043; line-height: 1.8; } -.dark .terms-content p, -.dark .terms-content li { +body.dark .terms-content p, +body.dark .terms-content li { color: #e8eaed; } .terms-content p { @@ -314,6 +317,40 @@ main .main-bottom a:hover { color: #5f6368; font-size: 0.95rem; } -.dark .terms-meta { +body.dark .terms-meta { + color: #e8eaed; +} +footer .top-section .display-mode { + display: flex; + flex-direction: row; + gap: 1rem; + align-items: center; +} +footer .top-section .display-mode .dark-mode-toggle { + background-color: transparent; + border: none; + cursor: pointer; +} +footer .top-section .display-mode .light-mode-toggle { + background-color: #202124; color: #e8eaed; + padding: 0.2rem 0.25rem 0.1rem 0.25em; + border-radius: 50%; + border: none; + cursor: pointer; +} +body.dark footer .top-section .display-mode .dark-mode-toggle { + background-color: #e8eaed; + color: #202124; + padding: 0.2rem 0.25rem 0.1rem 0.25em; + border-radius: 50%; + border: none; + cursor: pointer; } +body.dark footer .top-section .display-mode .light-mode-toggle { + background-color: transparent; + border: none; + cursor: pointer; +} + + diff --git a/GoogleSearch/main/templates/main/base.html b/GoogleSearch/main/templates/main/base.html index 265e0df..bf54972 100644 --- a/GoogleSearch/main/templates/main/base.html +++ b/GoogleSearch/main/templates/main/base.html @@ -27,6 +27,10 @@