Init
This commit is contained in:
26
resources/views/partials/comment.blade.php
Normal file
26
resources/views/partials/comment.blade.php
Normal file
@@ -0,0 +1,26 @@
|
||||
@inject('markdown', 'Parsedown')
|
||||
@php
|
||||
// TODO: There should be a better place for this.
|
||||
$markdown->setSafeMode(true);
|
||||
@endphp
|
||||
<div id="comment-{{ $comment->id }}" class="flex rounded-lg bg-white p-1 mb-2 shadow-[0_2px_15px_-3px_rgba(0,0,0,0.07),0_10px_20px_-2px_rgba(0,0,0,0.04)] dark:bg-neutral-900">
|
||||
@php $user = cache()->rememberForever('commentUser'.$comment->commenter_id, fn () => \App\Models\User::where('id', $comment->commenter_id)->first()); @endphp
|
||||
<a class="contents" href="{{ route('user.index', ['username' => $user->username]) }}">
|
||||
@if($user->avatar)
|
||||
<img class="w-16 h-16 rounded-full m-2" src="https://external-content.duckduckgo.com/iu/?u=https://cdn.discordapp.com/avatars/{{ $comment->commenter_id }}/{{ $user->avatar }}.webp" alt="{{ $user->global_name ?? $user->username }} Avatar">
|
||||
@else
|
||||
<img class="w-16 h-16 rounded-full m-2" src="/images/default-avatar.webp" alt="{{ $user->global_name ?? $user->username }} Avatar">
|
||||
@endif
|
||||
</a>
|
||||
<div class="text-gray-800 dark:text-gray-200">
|
||||
<a href="{{ route('user.index', ['username' => $user->username]) }}">
|
||||
@if($user->is_patreon)
|
||||
<h5 class="text-gray-800 dark:text-gray-400">{{ $user->global_name ?? $user->username }} <a data-te-toggle="tooltip" title="Badge of appreciation for the horny people supporting us! :3"><i class="fa-solid fa-hand-holding-heart text-rose-600 animate-pulse"></i></a> <small class="text-muted">- {{ \Carbon\Carbon::parse($comment->created_at)->diffForHumans() }}</small></h5>
|
||||
@else
|
||||
<h5 class="text-gray-800 dark:text-gray-400">{{ $user->global_name ?? $user->username }} <small class="text-muted">- {{ \Carbon\Carbon::parse($comment->created_at)->diffForHumans() }}</small></h5>
|
||||
@endif
|
||||
</a>
|
||||
<div style="white-space: pre-wrap;">{!! $markdown->line($comment->comment) !!}</div>
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
73
resources/views/partials/episode-cover.blade.php
Normal file
73
resources/views/partials/episode-cover.blade.php
Normal file
@@ -0,0 +1,73 @@
|
||||
@php $limitcounter = 0; @endphp
|
||||
|
||||
@foreach ($episodes as $ep)
|
||||
@if (isset($popularView))
|
||||
@php $episode = $ep->episode @endphp
|
||||
@else
|
||||
@php $episode = $ep @endphp
|
||||
@endif
|
||||
|
||||
@if ($limitcounter >= $limit)
|
||||
@break
|
||||
@endif
|
||||
|
||||
<div
|
||||
class="relative p-1 mb-8 w-full transition duration-300 ease-in-out md:p-2 hover:-translate-y-1 hover:scale-110">
|
||||
<a class="hover:text-blue-600" href="{{ route('hentai.index', ['title' => $episode->slug]) }}">
|
||||
<img alt="{{ $episode->title }} - {{ $episode->episode }}" loading="lazy" width="400"
|
||||
class="block relative rounded-lg object-cover object-center aspect-[11/16] z-20 "
|
||||
src="{{ $episode->cover_url }}"></img>
|
||||
|
||||
@guest
|
||||
<p
|
||||
class="absolute right-2 top-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
{{ $episode->getResolution() }}</p>
|
||||
<p
|
||||
class="absolute left-2 bottom-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
|
||||
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i class="fa-regular fa-comment"></i>
|
||||
{{ $episode->commentCount() }}
|
||||
</p>
|
||||
@endguest
|
||||
|
||||
@php $problematic = cache()->rememberForever('episodeProblematic'.$episode->id, fn () => $episode->getProblematicTags()); @endphp
|
||||
@if (!empty($problematic))
|
||||
<p
|
||||
class="absolute left-2 top-2 bg-red-700/70 !text-white rounded-br-lg rounded-tl-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
<i class="fa-solid fa-triangle-exclamation"></i> {{ $problematic }}
|
||||
</p>
|
||||
@endif
|
||||
|
||||
@auth
|
||||
@if ($episode->userWatched(auth()->user()->id))
|
||||
<p
|
||||
class="absolute right-2 top-2 bg-green-600/80 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
{{ $episode->getResolution() }}</p>
|
||||
<p
|
||||
class="absolute left-2 bottom-2 bg-green-600/80 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
|
||||
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i
|
||||
class="fa-regular fa-comment"></i> {{ $episode->commentCount() }}
|
||||
</p>
|
||||
@else
|
||||
<p
|
||||
class="absolute right-2 top-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
{{ $episode->getResolution() }}</p>
|
||||
<p
|
||||
class="absolute left-2 bottom-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
|
||||
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
|
||||
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i
|
||||
class="fa-regular fa-comment"></i> {{ $episode->commentCount() }}
|
||||
</p>
|
||||
@endif
|
||||
@endauth
|
||||
|
||||
<div class="absolute w-[95%] grid grid-cols-1 text-center">
|
||||
<p class="text-sm text-center text-black dark:text-white">{{ $episode->title }} -
|
||||
{{ $episode->episode }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@php $limitcounter++; @endphp
|
||||
@endforeach
|
17
resources/views/partials/episode-thumbnail.blade.php
Normal file
17
resources/views/partials/episode-thumbnail.blade.php
Normal file
@@ -0,0 +1,17 @@
|
||||
@php $limitcounter = 0; @endphp
|
||||
|
||||
@foreach ($episodes as $ep)
|
||||
@if (isset($popularView))
|
||||
@php $episode = $ep->episode @endphp
|
||||
@else
|
||||
@php $episode = $ep @endphp
|
||||
@endif
|
||||
|
||||
@if ($limitcounter >= $limit)
|
||||
@break
|
||||
@endif
|
||||
|
||||
<x-episode-thumbnail :episode="$episode" />
|
||||
|
||||
@php $limitcounter++; @endphp
|
||||
@endforeach
|
65
resources/views/partials/head.blade.php
Normal file
65
resources/views/partials/head.blade.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
@if (Route::currentRouteName() == 'hentai.index')
|
||||
@if (isset($episode))
|
||||
<title>Watch {{ $episode->title }} - {{ $episode->episode }} in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
|
||||
@elseif (isset($hentai))
|
||||
<title>Watch {{ $hentai->episodes[0]->title }} in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
|
||||
@else
|
||||
<title>Watch Highest Quality Hentai in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
|
||||
@endif
|
||||
@else
|
||||
<title>Watch Highest Quality Hentai in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
|
||||
<meta name="description" content="The best free 4k hentai site you will ever need online! Free 1080p hentai downloads and 4k hentai streams!">
|
||||
@endif
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-400-normal.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-ext-400-normal.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-600-normal.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-ext-600-normal.woff2" as="font" type="font/woff2" crossorigin>
|
||||
|
||||
<!-- Styles -->
|
||||
@vite(['resources/css/app.css', 'resources/js/app.js', 'resources/js/theme.js'])
|
||||
@livewireStyles
|
||||
|
||||
<!-- Icons -->
|
||||
<link rel="icon" href="/images/cropped-HS-1-32x32.png" sizes="32x32">
|
||||
<link rel="icon" href="/images/cropped-HS-1-192x192.png" sizes="192x192">
|
||||
<link rel="apple-touch-icon" href="/images/cropped-HS-1-180x180.png">
|
||||
<meta name="msapplication-TileImage" content="/images/cropped-HS-1-270x270.png">
|
||||
|
||||
<!-- Color -->
|
||||
<meta name="theme-color" content="#be123c">
|
||||
<meta name="msapplication-navbutton-color" content="#be123c">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="#be123c">
|
||||
|
||||
<!-- OG -->
|
||||
@if (isset($episode) || isset($hentai))
|
||||
@include('partials.social-preview')
|
||||
@endif
|
||||
|
||||
<script>
|
||||
document.documentElement.classList.add('dark');
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var _paq = window._paq = window._paq || [];
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u = "//hstream.moe/";
|
||||
_paq.push(['setTrackerUrl', u + 'app.php']);
|
||||
_paq.push(['setSiteId', '1']);
|
||||
var d = document,
|
||||
g = d.createElement('script'),
|
||||
s = d.getElementsByTagName('script')[0];
|
||||
g.async = true;
|
||||
g.src = u + 'app.js';
|
||||
s.parentNode.insertBefore(g, s);
|
||||
})();
|
||||
</script>
|
||||
</head>
|
20
resources/views/partials/mobilesearch.blade.php
Normal file
20
resources/views/partials/mobilesearch.blade.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<form
|
||||
class="inherit right-2 left-2 sm:relative sm:min-w-[200px] md:min-w-[300px] lg:min-w-[400px] xl:min-w-[500px] h-[54px]"
|
||||
method="POST" action="{{ route('hentai.searchredirect') }}">
|
||||
@csrf
|
||||
<label for="default-search" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Search</label>
|
||||
<div class="absolute right-2 left-2 sm:relative sm:min-w-[200px] md:min-w-[300px] lg:min-w-[400px] xl:min-w-[500px]">
|
||||
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
|
||||
<svg class="w-4 h-4 text-gray-500 dark:text-gray-400" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none" viewBox="0 0 20 20">
|
||||
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<input type="search" id="live-search" name="live-search"
|
||||
class="block w-full p-4 pl-10 text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-rose-800 focus:border-rose-900 dark:bg-neutral-900 dark:border-neutral-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-rose-800 dark:focus:border-rose-900"
|
||||
placeholder="{{ __('search.search-hentai') }}" required>
|
||||
<button type="submit"
|
||||
class="text-white absolute right-2.5 bottom-2.5 bg-rose-700 hover:bg-rose-800 focus:ring-4 focus:outline-none focus:ring-rose-300 font-medium rounded-lg text-sm px-4 py-2 dark:bg-rose-600 dark:hover:bg-rose-700 dark:focus:ring-rose-800">{{ __('search.search') }}</button>
|
||||
</div>
|
||||
</form>
|
52
resources/views/partials/social-preview.blade.php
Normal file
52
resources/views/partials/social-preview.blade.php
Normal file
@@ -0,0 +1,52 @@
|
||||
@if (Route::currentRouteName() == 'hentai.index')
|
||||
@php
|
||||
$title = '';
|
||||
if (! isset($episode) && isset($hentai)) {
|
||||
$episode = $hentai->episodes[0];
|
||||
$gallery = $episode->gallery;
|
||||
$title = 'Watch all episodes from '.$episode->title.' in 4k, 2160p, 1080p, UHD, HD - hstream.moe';
|
||||
} else {
|
||||
$title = 'Watch '.$episode->title.' - '.$episode->episode.' in 4k, 2160p, 1080p, UHD, HD - hstream.moe';
|
||||
}
|
||||
@endphp
|
||||
|
||||
<meta property="og:title" content="{{ $title }}" />
|
||||
<meta property="og:description" content="{{ Str::limit($episode->description, 250) }}" />
|
||||
<meta property="og:type" content="video.episode" />
|
||||
<meta property="og:url" content="https://hstream.moe/hentai/{{ $episode->slug }}" />
|
||||
@if(isset($gallery) && $episode->gallery->isNotEmpty())
|
||||
<meta property="og:image" content="https://hstream.moe{{ $gallery[0]->image_url }}" />
|
||||
@endif
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:site_name" content="hstream.moe" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
|
||||
@php
|
||||
$tags = '';
|
||||
foreach ($episode->tags as $tag) {
|
||||
if (!$tags){
|
||||
$tags .= $tag->name;
|
||||
} else {
|
||||
$tags .= ', '.$tag->name;
|
||||
}
|
||||
}
|
||||
@endphp
|
||||
|
||||
<meta name="description" content="{{ $episode->description }} {{ $tags }}">
|
||||
<meta name="keywords" content="hstream,hentaistream,hentai,stream,4k,hentai 4k,4k hentai,download,free">
|
||||
|
||||
@elseif (Route::currentRouteName() == 'home.index')
|
||||
|
||||
<meta property="og:title" content="Watch Hentai in 4k, 1080p, 720p, UHD, HD for Free! - hstream.moe" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://hstream.moe/" />
|
||||
<meta property="og:image" content="https://hstream.moe/images/cropped-HS-1-192x192.webp" />
|
||||
<meta property="og:image:width" content="300" />
|
||||
<meta property="og:image:height" content="100" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta property="og:site_name" content="hstream.moe" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="description" content="Watch Hentai free download in 4k, 2160p, 1080p, UHD, HD! Daily upload, no ads, subbed in 2160p!">
|
||||
@else
|
||||
<meta name="description" content="Watch Hentai free download in 4k, 2160p, 1080p, UHD, HD! Daily upload, no ads, subbed in 2160p!">
|
||||
@endif
|
16
resources/views/partials/themeswitcher.blade.php
Normal file
16
resources/views/partials/themeswitcher.blade.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<label for="toogleTheme" class="flex items-center cursor-pointer">
|
||||
<!-- toggle -->
|
||||
<div class="relative">
|
||||
<!-- input -->
|
||||
<input id="toogleTheme" type="checkbox" class="sr-only" />
|
||||
<!-- line -->
|
||||
<div class="w-10 h-4 bg-rose-600 dark:bg-gray-400 rounded-full shadow-inner"></div>
|
||||
<!-- dot -->
|
||||
<div class="dot absolute w-6 h-6 bg-white dark:bg-neutral-950 rounded-full shadow -left-1 -top-1 transition">
|
||||
<div class="items-center ml-[5px] w-6 h-6 font-medium flex">
|
||||
<i class="fa-regular fa-moon text-white hidden dark:inline"></i>
|
||||
<i class="fa-regular fa-sun text-yellow-400 dark:hidden"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
Reference in New Issue
Block a user