diff --git a/newsaggregator/core/__pycache__/__init__.cpython-312.pyc b/newsaggregator/core/__pycache__/__init__.cpython-312.pyc index 28ecfd5..ab91e71 100644 Binary files a/newsaggregator/core/__pycache__/__init__.cpython-312.pyc and b/newsaggregator/core/__pycache__/__init__.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/admin.cpython-312.pyc b/newsaggregator/core/__pycache__/admin.cpython-312.pyc index 7706db2..9e6823b 100644 Binary files a/newsaggregator/core/__pycache__/admin.cpython-312.pyc and b/newsaggregator/core/__pycache__/admin.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/apps.cpython-312.pyc b/newsaggregator/core/__pycache__/apps.cpython-312.pyc index de6664c..e7d4aab 100644 Binary files a/newsaggregator/core/__pycache__/apps.cpython-312.pyc and b/newsaggregator/core/__pycache__/apps.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/forms.cpython-312.pyc b/newsaggregator/core/__pycache__/forms.cpython-312.pyc index d77c098..a1f4523 100644 Binary files a/newsaggregator/core/__pycache__/forms.cpython-312.pyc and b/newsaggregator/core/__pycache__/forms.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/models.cpython-312.pyc b/newsaggregator/core/__pycache__/models.cpython-312.pyc index e2a8b1e..3756f9f 100644 Binary files a/newsaggregator/core/__pycache__/models.cpython-312.pyc and b/newsaggregator/core/__pycache__/models.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/urls.cpython-312.pyc b/newsaggregator/core/__pycache__/urls.cpython-312.pyc index bed0f09..f74d636 100644 Binary files a/newsaggregator/core/__pycache__/urls.cpython-312.pyc and b/newsaggregator/core/__pycache__/urls.cpython-312.pyc differ diff --git a/newsaggregator/core/__pycache__/views.cpython-312.pyc b/newsaggregator/core/__pycache__/views.cpython-312.pyc index eddfc04..6670716 100644 Binary files a/newsaggregator/core/__pycache__/views.cpython-312.pyc and b/newsaggregator/core/__pycache__/views.cpython-312.pyc differ diff --git a/newsaggregator/core/admin.py b/newsaggregator/core/admin.py index 4344a28..602462f 100644 --- a/newsaggregator/core/admin.py +++ b/newsaggregator/core/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin -from news.models import Headline +from core.models import Headline,Bookmark -admin.site.register(Headline) \ No newline at end of file +admin.site.register(Headline) +admin.site.register(Bookmark) \ No newline at end of file diff --git a/newsaggregator/core/migrations/0001_initial.py b/newsaggregator/core/migrations/0001_initial.py new file mode 100644 index 0000000..6b12e6e --- /dev/null +++ b/newsaggregator/core/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 5.0.6 on 2024-05-21 11:05 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Headline', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('image', models.URLField(blank=True, null=True)), + ('url', models.TextField()), + ], + ), + migrations.CreateModel( + name='Bookmark', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('headline', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.headline')), + ], + ), + ] diff --git a/newsaggregator/core/migrations/__pycache__/0001_initial.cpython-312.pyc b/newsaggregator/core/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000..2b662fd Binary files /dev/null and b/newsaggregator/core/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/newsaggregator/core/migrations/__pycache__/__init__.cpython-312.pyc b/newsaggregator/core/migrations/__pycache__/__init__.cpython-312.pyc index 8f0cae2..6112167 100644 Binary files a/newsaggregator/core/migrations/__pycache__/__init__.cpython-312.pyc and b/newsaggregator/core/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/newsaggregator/core/models.py b/newsaggregator/core/models.py index 71a8362..2007c1d 100644 --- a/newsaggregator/core/models.py +++ b/newsaggregator/core/models.py @@ -1,3 +1,16 @@ from django.db import models +from django.conf import settings -# Create your models here. +class Headline(models.Model): + title = models.CharField(max_length=200)#title char(200) + image = models.URLField(null=True, blank=True)#image + url = models.TextField() + def __str__(self): + return self.title + +class Bookmark(models.Model): + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + headline = models.ForeignKey(Headline, on_delete=models.CASCADE) + + def __str__(self): + return f"{self.user} - {self.headline.title}" diff --git a/newsaggregator/core/urls.py b/newsaggregator/core/urls.py index c9cedd1..2c7a838 100644 --- a/newsaggregator/core/urls.py +++ b/newsaggregator/core/urls.py @@ -10,4 +10,9 @@ path('advertise/',views.advertise,name='advertise'), path('privacy/',views.privacy,name='privacy'), path('scrape/', views.scrape, name="scrape"), + + # bookmarking + path('bookmark//', views.bookmark_article, name='bookmark_article'), + path('bookmarks/', views.view_bookmarks, name='view_bookmarks'), + path('remove_bookmark//', views.remove_bookmark, name='remove_bookmark'), ] \ No newline at end of file diff --git a/newsaggregator/core/views.py b/newsaggregator/core/views.py index d058244..19438ae 100644 --- a/newsaggregator/core/views.py +++ b/newsaggregator/core/views.py @@ -1,19 +1,28 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.http import HttpResponse +from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.shortcuts import render import requests from django.shortcuts import render, redirect from bs4 import BeautifulSoup as BSoup -from news.models import Headline +from core.models import Headline from datetime import datetime from core.forms import ContactForm from django.template.loader import render_to_string from django.core.mail import send_mail -# Create your views here. + + +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect, get_object_or_404 +from core.models import Headline, Bookmark +from django.contrib import messages +from django.views.decorators.csrf import csrf_exempt + + +from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage #view for scraping new def scrape(request, name): @@ -51,21 +60,35 @@ def scrape(request, name): @login_required(login_url='userauths:sign-in') def news_list(request): - # Fetch all headlines - headlines = Headline.objects.all()[::-1] # store records in reverse order + # Fetch all headlines in reverse order + headlines = Headline.objects.all().order_by('-id') swiper = Headline.objects.all()[:4] - + # Get the list of bookmarked headline IDs for the current user - user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True) + user_bookmarked_headline_ids = [] + if request.user.is_authenticated: + user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True) + + # Pagination logic + page = request.GET.get('page', 1) + num_of_items = 9 + paginator = Paginator(headlines, num_of_items) + try: + headlines_obj = paginator.page(page) + except PageNotAnInteger: + headlines_obj = paginator.page(1) + except EmptyPage: + headlines_obj = paginator.page(paginator.num_pages) + context = { - "object_list": headlines, + "object_list": headlines_obj, + "paginator": paginator, 'swiper': swiper, 'user_bookmarked_headline_ids': user_bookmarked_headline_ids, } return render(request, "core/index.html", context) - @login_required(login_url='userauths:sign-in') def index(request): Headline.objects.all().delete() @@ -156,4 +179,30 @@ def privacy(request): return render(request, "core/privacy.html", context) +@login_required +def view_bookmarks(request): + # Get the list of bookmarked headline IDs for the current user + user_bookmarked_headline_ids = request.user.bookmark_set.values_list('headline_id', flat=True) + bookmarks = Bookmark.objects.filter(user=request.user).select_related('headline') + context = { + 'bookmarks': bookmarks, + 'user_bookmarked_headline_ids': user_bookmarked_headline_ids, + } + return render(request, 'core/bookmarks.html', context) +@csrf_exempt +@login_required(login_url='userauths:sign-in') +def bookmark_article(request, headline_id): + if request.method == 'POST': + headline = get_object_or_404(Headline, id=headline_id) + Bookmark.objects.get_or_create(user=request.user, headline=headline) + return JsonResponse({'status': 'success'}) + return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) + +@csrf_exempt +@login_required(login_url='userauths:sign-in') +def remove_bookmark(request, headline_id): + if request.method == 'POST': + Bookmark.objects.filter(user=request.user, headline_id=headline_id).delete() + return JsonResponse({'status': 'success'}) + return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) \ No newline at end of file diff --git a/newsaggregator/db.sqlite3 b/newsaggregator/db.sqlite3 index dd399bc..73f3a28 100644 Binary files a/newsaggregator/db.sqlite3 and b/newsaggregator/db.sqlite3 differ diff --git a/newsaggregator/news/__init__.py b/newsaggregator/news/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/newsaggregator/news/__pycache__/__init__.cpython-311.pyc b/newsaggregator/news/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index de7fe45..0000000 Binary files a/newsaggregator/news/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/__init__.cpython-312.pyc b/newsaggregator/news/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1057aa8..0000000 Binary files a/newsaggregator/news/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/admin.cpython-312.pyc b/newsaggregator/news/__pycache__/admin.cpython-312.pyc deleted file mode 100644 index 3a15b29..0000000 Binary files a/newsaggregator/news/__pycache__/admin.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/apps.cpython-312.pyc b/newsaggregator/news/__pycache__/apps.cpython-312.pyc deleted file mode 100644 index 41a648a..0000000 Binary files a/newsaggregator/news/__pycache__/apps.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/models.cpython-312.pyc b/newsaggregator/news/__pycache__/models.cpython-312.pyc deleted file mode 100644 index 2832d24..0000000 Binary files a/newsaggregator/news/__pycache__/models.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/urls.cpython-312.pyc b/newsaggregator/news/__pycache__/urls.cpython-312.pyc deleted file mode 100644 index 27a82c5..0000000 Binary files a/newsaggregator/news/__pycache__/urls.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/__pycache__/views.cpython-312.pyc b/newsaggregator/news/__pycache__/views.cpython-312.pyc deleted file mode 100644 index 5ea8c8c..0000000 Binary files a/newsaggregator/news/__pycache__/views.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/admin.py b/newsaggregator/news/admin.py deleted file mode 100644 index ea5d68b..0000000 --- a/newsaggregator/news/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/newsaggregator/news/apps.py b/newsaggregator/news/apps.py deleted file mode 100644 index 3e8b1bd..0000000 --- a/newsaggregator/news/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class NewsConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'news' diff --git a/newsaggregator/news/migrations/0001_initial.py b/newsaggregator/news/migrations/0001_initial.py deleted file mode 100644 index dd65f9f..0000000 --- a/newsaggregator/news/migrations/0001_initial.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.21 on 2024-05-13 10:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Headline', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=200)), - ('image', models.URLField(blank=True, null=True)), - ('url', models.TextField()), - ], - ), - ] diff --git a/newsaggregator/news/migrations/__init__.py b/newsaggregator/news/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/newsaggregator/news/migrations/__pycache__/0001_initial.cpython-312.pyc b/newsaggregator/news/migrations/__pycache__/0001_initial.cpython-312.pyc deleted file mode 100644 index 885aa04..0000000 Binary files a/newsaggregator/news/migrations/__pycache__/0001_initial.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/migrations/__pycache__/__init__.cpython-311.pyc b/newsaggregator/news/migrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c6334fe..0000000 Binary files a/newsaggregator/news/migrations/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/newsaggregator/news/migrations/__pycache__/__init__.cpython-312.pyc b/newsaggregator/news/migrations/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6356d4a..0000000 Binary files a/newsaggregator/news/migrations/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/newsaggregator/news/migrations/__pycache__/urls.py b/newsaggregator/news/migrations/__pycache__/urls.py deleted file mode 100644 index bfe4676..0000000 --- a/newsaggregator/news/migrations/__pycache__/urls.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.urls import path -from news.views import scrape, news_list -urlpatterns = [ - path('scrape/', scrape, name="scrape"), - path('', news_list, name="home"), -] \ No newline at end of file diff --git a/newsaggregator/news/models.py b/newsaggregator/news/models.py deleted file mode 100644 index 843f075..0000000 --- a/newsaggregator/news/models.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import models -from django.conf import settings - - -# Create your models here. - -#create a user model by using Model class -#Headline will be the name of the table -#columns -> title,image,url -class Headline(models.Model): - title = models.CharField(max_length=200)#title char(200) - image = models.URLField(null=True, blank=True)#image - url = models.TextField() - def __str__(self): - return self.title - -class Bookmark(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - headline = models.ForeignKey(Headline, on_delete=models.CASCADE) - - def __str__(self): - return f"{self.user} - {self.headline.title}" diff --git a/newsaggregator/news/tests.py b/newsaggregator/news/tests.py deleted file mode 100644 index de8bdc0..0000000 --- a/newsaggregator/news/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/newsaggregator/news/urls.py b/newsaggregator/news/urls.py deleted file mode 100644 index f1792b7..0000000 --- a/newsaggregator/news/urls.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.urls import path -from . import views - -app_name='news' - -urlpatterns = [ - path('scrape/', views.scrape, name="scrape"), - # path('', views.news_list, name="home"), - path('bookmark//', views.bookmark_article, name='bookmark_article'), - path('bookmarks/', views.view_bookmarks, name='view_bookmarks'), - path('remove_bookmark//', views.remove_bookmark, name='remove_bookmark'), -] diff --git a/newsaggregator/news/views.py b/newsaggregator/news/views.py deleted file mode 100644 index 2e97c1d..0000000 --- a/newsaggregator/news/views.py +++ /dev/null @@ -1,134 +0,0 @@ -from django.shortcuts import render -import requests -from django.shortcuts import render, redirect -from bs4 import BeautifulSoup as BSoup -from news.models import Headline - - -from django.http import JsonResponse -from django.views.decorators.csrf import csrf_exempt - -# Create your views here. -#view for scraping new - -def scrape(request, name): - Headline.objects.all().delete() #remove all existing records from table - session = requests.Session() - #useragent helps server to identify origin of request - #we are imitating request as google bot - session.headers = {"User-Agent": "Googlebot/2.1 (+http://www.google.com/bot.html)"} - #google bot is crawler program - #session.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"} - url = f"https://www.theonion.com/{name}" - content = session.get(url).content - #print(content)#raw content - soup = BSoup(content, "html.parser") - #print(soup) - # finding all new div using common class - News = soup.find_all("div", {"class": "sc-cw4lnv-13 hHSpAQ"}) - print(News) - for article in News: - #extracting news link,img url,title for each news - main = article.find_all("a", href=True) - linkx = article.find("a", {"class": "sc-1out364-0 dPMosf js_link"}) - link = linkx["href"] - titlex = article.find("h2", {"class": "sc-759qgu-0 cvZkKd sc-cw4lnv-6 TLSoz"}) - title = titlex.text - imgx = article.find("img")["data-src"] - #storing extracted data to model - new_headline = Headline() - new_headline.title = title - new_headline.url = link - new_headline.image = imgx - new_headline.save() - #saving details to table - return redirect("../") - - -def news_list(request): - #fetching records stored in Headline model - headlines = Headline.objects.all()[::-1]#store records in reverse order - context = { - "object_list": headlines,} - return render(request, "core/home.html", context) - -# context is a dictionary using which we can pass values to templates from views - - -from django.shortcuts import render - -def about(request): - return render(request, 'about.html') - - -# for breaking home page - -def breakinghome(request): - Headline.objects.all().delete() - session = requests.Session() - session.headers = {"User-Agent": "Googlebot/2.1 (+http://www.google.com/bot.html)"} - url = f"https://www.theonion.com/latest" - content = session.get(url).content - soup = BSoup(content, "html.parser") - - News = soup.find_all("div", {"class": "sc-cw4lnv-13 hHSpAQ"}) - count=0 - for article in News: - count=count+1 - - if count<=8: - main = article.find_all("a", href=True) - - linkx = article.find("a", {"class": "sc-1out364-0 dPMosf js_link"}) - link = linkx["href"] - - titlex = article.find("h2", {"class": "sc-759qgu-0 cvZkKd sc-cw4lnv-6 TLSoz"}) - title = titlex.text - - imgx = article.find("img")["data-src"] - - new_headline = Headline() - new_headline.title = title - new_headline.url = link - new_headline.image = imgx - new_headline.save() ##saving each record to news_headline - - headlines = Headline.objects.all()[::-1] - context = { - "object_list": headlines, - } - - return render(request, "core/home.html", context) - -################################ -############################### -from django.contrib.auth.decorators import login_required -from django.shortcuts import render, redirect, get_object_or_404 -from .models import Headline, Bookmark -from django.contrib import messages - -@login_required -def view_bookmarks(request): - bookmarks = Bookmark.objects.filter(user=request.user) - context = { - 'bookmarks': bookmarks, - } - return render(request, 'core/bookmarks.html', context) - - -@csrf_exempt -@login_required(login_url='userauths:sign-in') -def bookmark_article(request, headline_id): - if request.method == 'POST': - headline = Headline.objects.get(id=headline_id) - Bookmark.objects.get_or_create(user=request.user, headline=headline) - return JsonResponse({'status': 'success'}) - return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) - -@csrf_exempt -@login_required(login_url='userauths:sign-in') -def remove_bookmark(request, headline_id): - if request.method == 'POST': - Bookmark.objects.filter(user=request.user, headline_id=headline_id).delete() - return JsonResponse({'status': 'success'}) - return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) \ No newline at end of file diff --git a/newsaggregator/newsaggregator/__pycache__/__init__.cpython-312.pyc b/newsaggregator/newsaggregator/__pycache__/__init__.cpython-312.pyc index 6fbbed4..e7ca545 100644 Binary files a/newsaggregator/newsaggregator/__pycache__/__init__.cpython-312.pyc and b/newsaggregator/newsaggregator/__pycache__/__init__.cpython-312.pyc differ diff --git a/newsaggregator/newsaggregator/__pycache__/settings.cpython-312.pyc b/newsaggregator/newsaggregator/__pycache__/settings.cpython-312.pyc index 033103a..0e454b4 100644 Binary files a/newsaggregator/newsaggregator/__pycache__/settings.cpython-312.pyc and b/newsaggregator/newsaggregator/__pycache__/settings.cpython-312.pyc differ diff --git a/newsaggregator/newsaggregator/__pycache__/urls.cpython-312.pyc b/newsaggregator/newsaggregator/__pycache__/urls.cpython-312.pyc index 408ddd4..23ea0c8 100644 Binary files a/newsaggregator/newsaggregator/__pycache__/urls.cpython-312.pyc and b/newsaggregator/newsaggregator/__pycache__/urls.cpython-312.pyc differ diff --git a/newsaggregator/newsaggregator/__pycache__/wsgi.cpython-312.pyc b/newsaggregator/newsaggregator/__pycache__/wsgi.cpython-312.pyc index 957062a..3a1080e 100644 Binary files a/newsaggregator/newsaggregator/__pycache__/wsgi.cpython-312.pyc and b/newsaggregator/newsaggregator/__pycache__/wsgi.cpython-312.pyc differ diff --git a/newsaggregator/newsaggregator/settings.py b/newsaggregator/newsaggregator/settings.py index 304701d..ac641a4 100644 --- a/newsaggregator/newsaggregator/settings.py +++ b/newsaggregator/newsaggregator/settings.py @@ -46,10 +46,9 @@ 'django.contrib.staticfiles', # custom apps - 'news', 'django_social_share', - 'core', + # authentication 'userauths', ] diff --git a/newsaggregator/newsaggregator/urls.py b/newsaggregator/newsaggregator/urls.py index 02fb564..51365de 100644 --- a/newsaggregator/newsaggregator/urls.py +++ b/newsaggregator/newsaggregator/urls.py @@ -1,13 +1,8 @@ from django.contrib import admin from django.urls import path, include -from news.views import about # Import the about view urlpatterns = [ path('admin/', admin.site.urls), - # path('', include('news.urls')), # Include the URLs from your app - # path('about/', about, name='about'), # Define the URL pattern for the about page - path('user/',include('userauths.urls')), - path('news/',include('news.urls')), path('',include('core.urls')), ] diff --git a/newsaggregator/static/assets/css/style.css b/newsaggregator/static/assets/css/style.css index 5aebdad..79e772e 100644 --- a/newsaggregator/static/assets/css/style.css +++ b/newsaggregator/static/assets/css/style.css @@ -337,14 +337,14 @@ header .btn-group { .mobile-nav .nav-item { margin-bottom: 0.5rem; } +.bookmark-heading, .mobile-nav .nav-link { font-size: var(--fs-3); color: var(--foreground-secondary); } - +.bookmark-heading:hover, .mobile-nav .nav-link:hover { color: var(--accent); - } diff --git a/newsaggregator/static/assets/images/bookmarks-animate.svg b/newsaggregator/static/assets/images/bookmarks-animate.svg new file mode 100644 index 0000000..2be6516 --- /dev/null +++ b/newsaggregator/static/assets/images/bookmarks-animate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/newsaggregator/templates/components/navbar.html b/newsaggregator/templates/components/navbar.html index 97372c6..963b0c2 100644 --- a/newsaggregator/templates/components/navbar.html +++ b/newsaggregator/templates/components/navbar.html @@ -25,7 +25,7 @@ Home
  • About Us @@ -63,7 +63,7 @@ Home