mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 10:11:09 -05:00
Implement robust security headers, including CSP with nonces, and integrate comprehensive SEO meta tags into the base template and homepage. Add inline styles for CSP compliance and improve theme management script for immediate theme application. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 48ecdb60-d0f0-4b75-95c9-34e409ef35fb Replit-Commit-Checkpoint-Type: intermediate_checkpoint
170 lines
7.4 KiB
HTML
170 lines
7.4 KiB
HTML
{% extends 'base/base.html' %}
|
|
{% load static %}
|
|
{% load cotton %}
|
|
|
|
{% block title %}ThrillWiki - Theme Parks & Attractions Guide{% endblock %}
|
|
|
|
{% block meta_description %}Discover the world's best theme parks and thrilling rides. Explore amazing parks, find detailed ride information, and share your adventures with fellow theme park enthusiasts.{% endblock %}
|
|
|
|
{% block meta_keywords %}theme parks, roller coasters, attractions, rides, amusement parks, Disney World, Universal Studios, Cedar Point, Six Flags, thrill rides{% endblock %}
|
|
|
|
{% block og_title %}ThrillWiki - Your Ultimate Theme Park & Attractions Guide{% endblock %}
|
|
{% block og_description %}Discover the world's best theme parks and thrilling rides. Explore amazing parks, find detailed ride information, and share your adventures with fellow theme park enthusiasts.{% endblock %}
|
|
{% block og_type %}website{% endblock %}
|
|
|
|
{% block twitter_title %}ThrillWiki - Your Ultimate Theme Park & Attractions Guide{% endblock %}
|
|
{% block twitter_description %}Discover the world's best theme parks and thrilling rides. Explore amazing parks, find detailed ride information, and share your adventures.{% endblock %}
|
|
|
|
{% block structured_data %}
|
|
<script type="application/ld+json" nonce="{{ request.csp_nonce }}">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "WebSite",
|
|
"name": "ThrillWiki",
|
|
"description": "Your ultimate guide to theme parks and attractions worldwide",
|
|
"url": "{{ request.scheme }}://{{ request.get_host }}",
|
|
"potentialAction": {
|
|
"@type": "SearchAction",
|
|
"target": {
|
|
"@type": "EntryPoint",
|
|
"urlTemplate": "{{ request.scheme }}://{{ request.get_host }}/search/?q={search_term_string}"
|
|
},
|
|
"query-input": "required name=search_term_string"
|
|
},
|
|
"author": {
|
|
"@type": "Organization",
|
|
"name": "ThrillWiki",
|
|
"description": "The ultimate theme park and attractions database"
|
|
},
|
|
"mainEntity": {
|
|
"@type": "ItemList",
|
|
"name": "Featured Theme Parks and Attractions",
|
|
"description": "Top-rated theme parks and thrilling rides from around the world"
|
|
}
|
|
}
|
|
</script>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<!-- Hero Section -->
|
|
<div class="mb-12 bg-white border border-gray-200 rounded-lg shadow-lg dark:bg-gray-800 dark:border-gray-700">
|
|
<div class="px-4 py-12 text-center">
|
|
<h1 class="mb-6 text-4xl font-bold text-gray-900 md:text-5xl lg:text-6xl dark:text-white">
|
|
Welcome to ThrillWiki
|
|
</h1>
|
|
<p class="max-w-3xl mx-auto mb-8 text-xl text-gray-600 md:text-2xl dark:text-gray-300">
|
|
Your ultimate guide to theme parks and attractions worldwide
|
|
</p>
|
|
<div class="flex flex-wrap justify-center gap-4">
|
|
<a href="{% url 'parks:park_list' %}"
|
|
class="px-8 py-3 text-lg btn-primary">
|
|
Explore Parks
|
|
</a>
|
|
<a href="{% url 'rides:global_ride_list' %}"
|
|
class="px-8 py-3 text-lg btn-secondary">
|
|
View Rides
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Stats Section -->
|
|
<div class="grid-adaptive-sm mb-12">
|
|
<!-- Total Parks -->
|
|
<a href="{% url 'parks:park_list' %}"
|
|
class="flex flex-col items-center justify-center p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl">
|
|
<div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400">
|
|
{{ stats.total_parks }}
|
|
</div>
|
|
<div class="text-xl text-gray-600 dark:text-gray-300">
|
|
Theme Parks
|
|
</div>
|
|
</a>
|
|
|
|
<!-- Total Attractions -->
|
|
<a href="{% url 'rides:global_ride_list' %}"
|
|
class="flex flex-col items-center justify-center p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl">
|
|
<div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400">
|
|
{{ stats.ride_count }}
|
|
</div>
|
|
<div class="text-xl text-gray-600 dark:text-gray-300">
|
|
Attractions
|
|
</div>
|
|
</a>
|
|
|
|
<!-- Total Roller Coasters -->
|
|
<a href="{% url 'rides:global_roller_coasters' %}"
|
|
class="flex flex-col items-center justify-center p-6 text-center transition-transform transform bg-white rounded-lg shadow-lg dark:bg-gray-800 hover:-translate-y-1 hover:shadow-xl">
|
|
<div class="mb-2 text-4xl font-bold text-blue-600 dark:text-blue-400">
|
|
{{ stats.coaster_count }}
|
|
</div>
|
|
<div class="text-xl text-gray-600 dark:text-gray-300">
|
|
Roller Coasters
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<!-- Featured Content -->
|
|
<div class="grid-adaptive">
|
|
<!-- Trending Parks -->
|
|
<div class="p-6 bg-white rounded-lg shadow-lg dark:bg-gray-800">
|
|
<h2 class="mb-6 text-2xl font-bold text-gray-900 dark:text-white">
|
|
Trending Parks
|
|
</h2>
|
|
<div class="space-y-4">
|
|
{% for park in popular_parks %}
|
|
<c-park_card :park="park" view_mode="grid" />
|
|
{% empty %}
|
|
<div class="flex flex-col items-center justify-center h-48 p-8 text-center bg-gray-50 rounded-lg dark:bg-gray-800/50">
|
|
<div class="mb-4 text-4xl">🎢</div>
|
|
<div class="text-lg font-medium text-gray-900 dark:text-white">No Parks Yet</div>
|
|
<div class="text-sm text-gray-600 dark:text-gray-400">Parks will appear here once they're added to the database</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Trending Rides -->
|
|
<div class="p-6 bg-white rounded-lg shadow-lg dark:bg-gray-800">
|
|
<h2 class="mb-6 text-2xl font-bold text-gray-900 dark:text-white">
|
|
Trending Rides
|
|
</h2>
|
|
<div class="space-y-4">
|
|
{% for ride in popular_rides %}
|
|
<c-ride_card :ride="ride" url_variant="park" />
|
|
{% empty %}
|
|
<div class="flex flex-col items-center justify-center h-48 p-8 text-center bg-gray-50 rounded-lg dark:bg-gray-800/50">
|
|
<div class="mb-4 text-4xl">🎠</div>
|
|
<div class="text-lg font-medium text-gray-900 dark:text-white">No Rides Yet</div>
|
|
<div class="text-sm text-gray-600 dark:text-gray-400">Rides will appear here once they're added to the database</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Highest Rated -->
|
|
<div class="p-6 bg-white rounded-lg shadow-lg dark:bg-gray-800">
|
|
<h2 class="mb-6 text-2xl font-bold text-gray-900 dark:text-white">
|
|
Highest Rated
|
|
</h2>
|
|
<div class="space-y-4">
|
|
{% for item in highest_rated %}
|
|
{% if item.park %}
|
|
<!-- This is a ride -->
|
|
<c-ride_card :ride="item" url_variant="park" />
|
|
{% else %}
|
|
<!-- This is a park -->
|
|
<c-park_card :park="item" view_mode="grid" />
|
|
{% endif %}
|
|
{% empty %}
|
|
<div class="flex flex-col items-center justify-center h-48 p-8 text-center bg-gray-50 rounded-lg dark:bg-gray-800/50">
|
|
<div class="mb-4 text-4xl">⭐</div>
|
|
<div class="text-lg font-medium text-gray-900 dark:text-white">No Ratings Yet</div>
|
|
<div class="text-sm text-gray-600 dark:text-gray-400">Highest rated content will appear here once users start rating</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|