mirror of
https://github.com/ceratic/MediaCollectorLibary.git
synced 2026-05-13 23:56:46 +02:00
438 lines
29 KiB
Twig
438 lines
29 KiB
Twig
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>{{ title }} - Media Collector</title>
|
|
<!-- Iconify Icons -->
|
|
<script src="https://code.iconify.design/iconify-icon/1.0.7/iconify-icon.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
|
|
|
<!-- Tailwind CSS -->
|
|
{% if app_env == 'production' %}
|
|
{% if manifest['resources/css/app.css'] is defined %}
|
|
<link rel="stylesheet" href="{{ base_url() }}/build/assets/{{ manifest['resources/css/app.css'].file }}">
|
|
{% endif %}
|
|
{% else %}
|
|
<link rel="stylesheet" href="{{ base_url() }}/css/app.css">
|
|
{% endif %}
|
|
|
|
<!-- Favicon -->
|
|
<link rel="icon" type="image/svg+xml" href="{{ base_url() }}/favicon.svg">
|
|
|
|
<!-- Iconify Icons -->
|
|
<script src="https://code.iconify.design/iconify-icon/1.0.7/iconify-icon.min.js"></script>
|
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
|
|
|
{# DebugBar Assets #}
|
|
{% if debugbarRenderer is defined %}
|
|
{{ debugbarRenderer.renderHead()|raw }}
|
|
{% endif %}
|
|
|
|
<!-- Alpine.js -->
|
|
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
|
|
|
<!-- jQuery (required for Select2) -->
|
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
|
<!-- Select2 CSS -->
|
|
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet">
|
|
<!-- Select2 JS -->
|
|
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
|
|
|
|
{% if app_env == 'production' and manifest['resources/js/app.js'] is defined %}
|
|
<script type="module" src="{{ base_url() }}/build/assets/{{ manifest['resources/js/app.js'].file }}"></script>
|
|
{% else %}
|
|
<script type="module" src="{{ base_url() }}/resources/js/app.js"></script>
|
|
{% endif %}
|
|
</head>
|
|
<body class="bg-gray-50 text-gray-900 min-h-screen" x-data="{ mobileMenuOpen: false }">
|
|
<!-- Navigation -->
|
|
<nav class="bg-slate-900 text-white shadow-lg">
|
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div class="flex justify-between items-center h-16">
|
|
<!-- Left Section: App Title + Mobile Menu -->
|
|
<div class="flex items-center">
|
|
<!-- Mobile menu button -->
|
|
<div class="flex items-center lg:hidden mr-4">
|
|
<button @click="mobileMenuOpen = !mobileMenuOpen" class="text-white hover:text-gray-300 focus:outline-none focus:text-gray-300">
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path x-show="!mobileMenuOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
|
<path x-show="mobileMenuOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- App Title -->
|
|
<div class="flex items-center">
|
|
<a href="{{ path_for('dashboard.index') }}" class="text-xl font-bold text-white hover:text-gray-300 transition-colors">
|
|
Media Collector
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Center Section: Search Bar -->
|
|
<div class="flex-1 max-w-lg mx-4 lg:mx-8">
|
|
<div class="relative">
|
|
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
|
|
<svg class="h-5 w-5 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
</svg>
|
|
</div>
|
|
<form action="{{ path_for('search.index') }}" method="GET" class="w-full">
|
|
<input
|
|
type="text"
|
|
name="q"
|
|
placeholder="Search media..."
|
|
class="block w-full pl-10 pr-3 py-2 border border-gray-600 rounded-md leading-5 bg-slate-800 text-white placeholder-gray-400 focus:outline-none focus:bg-slate-700 focus:border-blue-500 focus:ring-1 focus:ring-blue-500"
|
|
autocomplete="off"
|
|
>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Section: Page-specific controls -->
|
|
<div class="flex items-center space-x-4">
|
|
{% block nav_controls %}{% endblock %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Mobile Sidebar Overlay -->
|
|
<div x-show="mobileMenuOpen" @click="mobileMenuOpen = false" class="fixed inset-0 z-40 lg:hidden" x-transition:enter="transition-opacity ease-linear duration-300" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="transition-opacity ease-linear duration-300" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0">
|
|
<div class="absolute inset-0 bg-gray-600 opacity-75"></div>
|
|
</div>
|
|
|
|
<!-- Mobile Sidebar -->
|
|
<div x-show="mobileMenuOpen" class="fixed inset-y-0 left-0 z-50 w-80 bg-slate-800 text-white shadow-xl lg:hidden transform transition-transform duration-300 ease-in-out" x-transition:enter="transform -translate-x-full" x-transition:enter-start="-translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform -translate-x-full" x-transition:leave-start="translate-x-0" x-transition:leave-end="-translate-x-full">
|
|
<div class="flex flex-col h-full">
|
|
<!-- Mobile Sidebar Header -->
|
|
<div class="flex items-center justify-between p-4 border-b border-slate-700">
|
|
<h2 class="text-lg font-semibold">Library</h2>
|
|
<button @click="mobileMenuOpen = false" class="p-1 rounded-md hover:bg-slate-700">
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Mobile Navigation Items -->
|
|
<nav class="flex-1 px-2 py-4 space-y-1 overflow-y-auto">
|
|
<a href="{{ path_for('dashboard.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'dashboard.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z" />
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z" />
|
|
</svg>
|
|
Dashboard
|
|
</a>
|
|
|
|
{% if is_media_type_visible('games') %}
|
|
<a href="{{ path_for('games.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'games.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
Games
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('movies') %}
|
|
<a href="{{ path_for('movies.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'movies.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
Movies
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('tvshows') %}
|
|
<a href="{{ path_for('tvshows.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'tvshows.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
TV Shows
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('music') %}
|
|
<a href="{{ path_for('music.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'music.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3" />
|
|
</svg>
|
|
Music
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('adult') %}
|
|
<div class="space-y-1">
|
|
<div class="flex items-center px-3 py-2 text-sm font-medium text-slate-300">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
</svg>
|
|
Adult
|
|
</div>
|
|
<a href="{{ path_for('adult.index') }}" class="flex items-center ml-6 px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'adult.index' %}bg-slate-900 text-white{% else %}text-slate-400 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
Videos
|
|
</a>
|
|
<a href="{{ path_for('actors.index') }}" class="flex items-center ml-6 px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'actors.index' %}bg-slate-900 text-white{% else %}text-slate-400 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
Performers
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- DebugBar -->
|
|
{% if debugbarRenderer is defined %}
|
|
{{ debugbarRenderer.render()|raw }}
|
|
{% endif %}
|
|
|
|
<!-- Page Content -->
|
|
<main class="flex min-h-screen">
|
|
<!-- Left Sidebar -->
|
|
<aside class="bg-slate-800 text-white shadow-lg hidden lg:block transition-all duration-300 ease-in-out" :class="collapsed ? 'w-16' : 'w-64'" x-data="{
|
|
collapsed: JSON.parse(localStorage.getItem('leftSidebarCollapsed') || 'false'),
|
|
toggle() {
|
|
this.collapsed = !this.collapsed;
|
|
localStorage.setItem('leftSidebarCollapsed', JSON.stringify(this.collapsed));
|
|
}
|
|
}">
|
|
<div class="flex flex-col h-full">
|
|
<!-- Sidebar Header -->
|
|
<div class="flex items-center justify-between p-4 border-b border-slate-700" :class="collapsed ? 'px-3' : 'p-4'">
|
|
<h2 class="text-lg font-semibold" x-show="!collapsed">Library</h2>
|
|
<button @click="toggle()" class="p-1 rounded-md hover:bg-slate-700">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path x-show="!collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
|
<path x-show="collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Navigation Items -->
|
|
<nav class="flex-1 px-2 py-4 space-y-1" x-show="!collapsed">
|
|
<a href="{{ path_for('dashboard.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'dashboard.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z" />
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z" />
|
|
</svg>
|
|
Dashboard
|
|
</a>
|
|
|
|
{% if is_media_type_visible('games') %}
|
|
<a href="{{ path_for('games.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'games.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
Games
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('movies') %}
|
|
<a href="{{ path_for('movies.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'movies.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
Movies
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('tvshows') %}
|
|
<a href="{{ path_for('tvshows.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'tvshows.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
TV Shows
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('music') %}
|
|
<a href="{{ path_for('music.index') }}" class="flex items-center px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'music.index' %}bg-slate-900 text-white{% else %}text-slate-300 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3" />
|
|
</svg>
|
|
Music
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if is_media_type_visible('adult') %}
|
|
<div class="space-y-1">
|
|
<div class="flex items-center px-3 py-2 text-sm font-medium text-slate-300">
|
|
<svg class="mr-3 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
</svg>
|
|
Adult
|
|
</div>
|
|
<a href="{{ path_for('adult.index') }}" class="flex items-center ml-6 px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'adult.index' %}bg-slate-900 text-white{% else %}text-slate-400 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
Videos
|
|
</a>
|
|
<a href="{{ path_for('actors.index') }}" class="flex items-center ml-6 px-3 py-2 text-sm font-medium rounded-md {% if current_route == 'actors.index' %}bg-slate-900 text-white{% else %}text-slate-400 hover:bg-slate-700 hover:text-white{% endif %}">
|
|
Performers
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</nav>
|
|
|
|
<!-- Collapsed State Icons -->
|
|
<div class="px-2 py-4" x-show="collapsed">
|
|
<div class="space-y-2">
|
|
<a href="{{ path_for('dashboard.index') }}" class="flex justify-center p-2 text-slate-300 hover:bg-slate-700 hover:text-white rounded-md" title="Dashboard">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z" />
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5a2 2 0 012-2h4a2 2 0 012 2v2H8V5z" />
|
|
</svg>
|
|
</a>
|
|
{% if is_media_type_visible('games') %}
|
|
<a href="{{ path_for('games.index') }}" class="flex justify-center p-2 text-slate-300 hover:bg-slate-700 hover:text-white rounded-md" title="Games">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
</a>
|
|
{% endif %}
|
|
{% if is_media_type_visible('movies') %}
|
|
<a href="{{ path_for('movies.index') }}" class="flex justify-center p-2 text-slate-300 hover:bg-slate-700 hover:text-white rounded-md" title="Movies">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
</a>
|
|
{% endif %}
|
|
{% if is_media_type_visible('tvshows') %}
|
|
<a href="{{ path_for('tvshows.index') }}" class="flex justify-center p-2 text-slate-300 hover:bg-slate-700 hover:text-white rounded-md" title="TV Shows">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
</svg>
|
|
</a>
|
|
{% endif %}
|
|
{% if is_media_type_visible('music') %}
|
|
<a href="{{ path_for('music.index') }}" class="flex justify-center p-2 text-slate-300 hover:bg-slate-700 hover:text-white rounded-md" title="Music">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3" />
|
|
</svg>
|
|
</a>
|
|
{% endif %}
|
|
{% if is_media_type_visible('adult') %}
|
|
<div class="space-y-1">
|
|
<div class="flex justify-center p-2 text-slate-300">
|
|
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
</svg>
|
|
</div>
|
|
<a href="{{ path_for('adult.index') }}" class="flex justify-center p-2 text-slate-400 hover:bg-slate-700 hover:text-white rounded-md" title="Adult Videos">
|
|
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" />
|
|
</svg>
|
|
</a>
|
|
<a href="{{ path_for('actors.index') }}" class="flex justify-center p-2 text-slate-400 hover:bg-slate-700 hover:text-white rounded-md" title="Performers">
|
|
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- Main Content Area with Second Sidebar -->
|
|
<div class="flex-1 flex">
|
|
<!-- Second Left Sidebar (Grouped List - only in list mode) -->
|
|
<aside class="w-80 bg-white shadow-lg border-r border-gray-200 {% if view_mode != 'list' %}hidden{% endif %}" x-data="{ collapsed: false }">
|
|
<div class="flex flex-col h-full">
|
|
<!-- Sidebar Header -->
|
|
<div class="flex items-center justify-between p-4 border-b border-gray-200">
|
|
<h2 class="text-lg font-semibold text-gray-900" x-show="!collapsed">Items</h2>
|
|
<button @click="collapsed = !collapsed" class="p-1 rounded-md hover:bg-gray-100">
|
|
<svg class="h-5 w-5 text-gray-500" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path x-show="!collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
|
<path x-show="collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Grouped Items List -->
|
|
<div class="flex-1 p-4 overflow-y-auto" x-show="!collapsed">
|
|
{% block item_list %}
|
|
<div class="space-y-4">
|
|
<!-- Grouped items will be populated by individual pages -->
|
|
<div class="text-sm text-gray-500 text-center py-8">
|
|
No items to display
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- Content -->
|
|
<div class="flex-1 min-w-0">
|
|
{% block content %}{% endblock %}
|
|
</div>
|
|
|
|
<!-- Right Sidebar -->
|
|
<aside class="bg-white shadow-lg border-l border-gray-200 hidden xl:block transition-all duration-300 ease-in-out" :class="collapsed ? 'w-12' : 'w-80'" x-data="{
|
|
collapsed: JSON.parse(localStorage.getItem('rightSidebarCollapsed') || 'false'),
|
|
toggle() {
|
|
this.collapsed = !this.collapsed;
|
|
localStorage.setItem('rightSidebarCollapsed', JSON.stringify(this.collapsed));
|
|
}
|
|
}">
|
|
<div class="flex flex-col h-full">
|
|
<!-- Sidebar Header -->
|
|
<div class="flex items-center justify-between p-4 border-b border-gray-200" :class="collapsed ? 'px-3' : 'p-4'">
|
|
<h2 class="text-lg font-semibold text-gray-900" x-show="!collapsed">Details</h2>
|
|
<button @click="toggle()" class="p-1 rounded-md hover:bg-gray-100">
|
|
<svg class="h-5 w-5 text-gray-500" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path x-show="!collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
|
<path x-show="collapsed" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Details Content -->
|
|
<div class="flex-1 p-4" x-show="!collapsed">
|
|
{% block sidebar %}
|
|
<div class="space-y-4">
|
|
<!-- Quick Stats -->
|
|
<div class="bg-gray-50 rounded-lg p-4">
|
|
<h3 class="text-sm font-medium text-gray-900 mb-3">Quick Stats</h3>
|
|
<div class="space-y-2">
|
|
<div class="flex justify-between text-sm">
|
|
<span class="text-gray-600">Total Items</span>
|
|
<span class="font-medium text-gray-900">1,234</span>
|
|
</div>
|
|
<div class="flex justify-between text-sm">
|
|
<span class="text-gray-600">Recently Added</span>
|
|
<span class="font-medium text-gray-900">23</span>
|
|
</div>
|
|
<div class="flex justify-between text-sm">
|
|
<span class="text-gray-600">Favorites</span>
|
|
<span class="font-medium text-gray-900">45</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recent Activity -->
|
|
<div class="bg-gray-50 rounded-lg p-4">
|
|
<h3 class="text-sm font-medium text-gray-900 mb-3">Recent Activity</h3>
|
|
<div class="space-y-2">
|
|
<div class="text-xs text-gray-600">
|
|
<div class="font-medium text-gray-900">Added 3 new movies</div>
|
|
<div>2 hours ago</div>
|
|
</div>
|
|
<div class="text-xs text-gray-600">
|
|
<div class="font-medium text-gray-900">Updated game metadata</div>
|
|
<div>5 hours ago</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
</main>
|
|
</body>
|
|
</html>
|