Merge pull request #2767 from pixelfed/staging

Staging
This commit is contained in:
daniel 2021-05-23 23:13:41 -06:00 committed by GitHub
commit b654d68833
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 470 additions and 544 deletions

View file

@ -91,6 +91,8 @@
- Updated admin settings, add rules. ([a4efbb75](https://github.com/pixelfed/pixelfed/commit/a4efbb75)) - Updated admin settings, add rules. ([a4efbb75](https://github.com/pixelfed/pixelfed/commit/a4efbb75))
- Updated LikeService, fix authentication bug. ([c9abd70e](https://github.com/pixelfed/pixelfed/commit/c9abd70e)) - Updated LikeService, fix authentication bug. ([c9abd70e](https://github.com/pixelfed/pixelfed/commit/c9abd70e))
- Updated StatusTransformer, fix missing tags attribute. ([dac326e9](https://github.com/pixelfed/pixelfed/commit/dac326e9)) - Updated StatusTransformer, fix missing tags attribute. ([dac326e9](https://github.com/pixelfed/pixelfed/commit/dac326e9))
- Updated ComposeController, bail on empty attachments. ([061b145b](https://github.com/pixelfed/pixelfed/commit/061b145b))
- Updated landing and about page. ([92dc7af6](https://github.com/pixelfed/pixelfed/commit/92dc7af6))
- ([](https://github.com/pixelfed/pixelfed/commit/)) - ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.10.10 (2021-01-28)](https://github.com/pixelfed/pixelfed/compare/v0.10.9...v0.10.10) ## [v0.10.10 (2021-01-28)](https://github.com/pixelfed/pixelfed/compare/v0.10.9...v0.10.10)

View file

@ -480,6 +480,8 @@ class ComposeController extends Controller
array_push($mimes, $m->mime); array_push($mimes, $m->mime);
} }
abort_if(empty($attachments), 422);
$mediaType = StatusController::mimeTypeCheck($mimes); $mediaType = StatusController::mimeTypeCheck($mimes);
if(in_array($mediaType, ['photo', 'video', 'photo:album']) == false) { if(in_array($mediaType, ['photo', 'video', 'photo:album']) == false) {

View file

@ -13,143 +13,130 @@ use App\Util\ActivityPub\Helpers;
class SiteController extends Controller class SiteController extends Controller
{ {
public function home(Request $request) public function home(Request $request)
{ {
if (Auth::check()) { if (Auth::check()) {
return $this->homeTimeline($request); return $this->homeTimeline($request);
} else { } else {
return $this->homeGuest(); return $this->homeGuest();
} }
} }
public function homeGuest() public function homeGuest()
{ {
$data = Cache::remember('site:landing:data', now()->addHours(3), function() { return view('site.index');
return [ }
'stats' => [
'posts' => App\Util\Lexer\PrettyNumber::convert(App\Status::count()),
'likes' => App\Util\Lexer\PrettyNumber::convert(App\Like::count()),
'hashtags' => App\Util\Lexer\PrettyNumber::convert(App\StatusHashtag::count())
],
];
});
return view('site.index', compact('data'));
}
public function homeTimeline(Request $request) public function homeTimeline(Request $request)
{ {
$this->validate($request, [ $this->validate($request, [
'layout' => 'nullable|string|in:grid,feed' 'layout' => 'nullable|string|in:grid,feed'
]); ]);
$layout = $request->input('layout', 'feed'); $layout = $request->input('layout', 'feed');
return view('timeline.home', compact('layout')); return view('timeline.home', compact('layout'));
} }
public function changeLocale(Request $request, $locale) public function changeLocale(Request $request, $locale)
{ {
// todo: add other locales after pushing new l10n strings // todo: add other locales after pushing new l10n strings
$locales = Localization::languages(); $locales = Localization::languages();
if(in_array($locale, $locales)) { if(in_array($locale, $locales)) {
if($request->user()) { if($request->user()) {
$user = $request->user(); $user = $request->user();
$user->language = $locale; $user->language = $locale;
$user->save(); $user->save();
} }
session()->put('locale', $locale); session()->put('locale', $locale);
} }
return redirect(route('site.language')); return redirect(route('site.language'));
} }
public function about() public function about()
{ {
$page = Page::whereSlug('/site/about')->whereActive(true)->first(); return Cache::remember('site.about_v2', now()->addMinutes(15), function() {
$stats = Cache::remember('site:about:stats-v1', now()->addHours(12), function() { $user_count = number_format(User::count());
return [ $post_count = number_format(Status::count());
'posts' => Status::count(), $rules = config_cache('app.rules') ? json_decode(config_cache('app.rules'), true) : null;
'users' => User::whereNull('status')->count(), return view('site.about', compact('rules', 'user_count', 'post_count'))->render();
'admin' => User::whereIsAdmin(true)->first() });
]; }
});
$path = $page ? 'site.about-custom' : 'site.about';
return view($path, compact('page', 'stats'));
}
public function language() public function language()
{ {
return view('site.language'); return view('site.language');
} }
public function communityGuidelines(Request $request) public function communityGuidelines(Request $request)
{ {
return Cache::remember('site:help:community-guidelines', now()->addDays(120), function() { return Cache::remember('site:help:community-guidelines', now()->addDays(120), function() {
$slug = '/site/kb/community-guidelines'; $slug = '/site/kb/community-guidelines';
$page = Page::whereSlug($slug)->whereActive(true)->first(); $page = Page::whereSlug($slug)->whereActive(true)->first();
return View::make('site.help.community-guidelines')->with(compact('page'))->render(); return View::make('site.help.community-guidelines')->with(compact('page'))->render();
}); });
} }
public function privacy(Request $request) public function privacy(Request $request)
{ {
$page = Cache::remember('site:privacy', now()->addDays(120), function() { $page = Cache::remember('site:privacy', now()->addDays(120), function() {
$slug = '/site/privacy'; $slug = '/site/privacy';
$page = Page::whereSlug($slug)->whereActive(true)->first(); $page = Page::whereSlug($slug)->whereActive(true)->first();
}); });
return View::make('site.privacy')->with(compact('page'))->render(); return View::make('site.privacy')->with(compact('page'))->render();
} }
public function terms(Request $request) public function terms(Request $request)
{ {
$page = Cache::remember('site:terms', now()->addDays(120), function() { $page = Cache::remember('site:terms', now()->addDays(120), function() {
$slug = '/site/terms'; $slug = '/site/terms';
return Page::whereSlug($slug)->whereActive(true)->first(); return Page::whereSlug($slug)->whereActive(true)->first();
}); });
return View::make('site.terms')->with(compact('page'))->render(); return View::make('site.terms')->with(compact('page'))->render();
} }
public function redirectUrl(Request $request) public function redirectUrl(Request $request)
{ {
abort_if(!$request->user(), 404); abort_if(!$request->user(), 404);
$this->validate($request, [ $this->validate($request, [
'url' => 'required|url' 'url' => 'required|url'
]); ]);
$url = request()->input('url'); $url = request()->input('url');
abort_if(Helpers::validateUrl($url) == false, 404); abort_if(Helpers::validateUrl($url) == false, 404);
return view('site.redirect', compact('url')); return view('site.redirect', compact('url'));
} }
public function followIntent(Request $request) public function followIntent(Request $request)
{ {
$this->validate($request, [ $this->validate($request, [
'user' => 'string|min:1|max:15|exists:users,username', 'user' => 'string|min:1|max:15|exists:users,username',
]); ]);
$profile = Profile::whereUsername($request->input('user'))->firstOrFail(); $profile = Profile::whereUsername($request->input('user'))->firstOrFail();
$user = $request->user(); $user = $request->user();
abort_if($user && $profile->id == $user->profile_id, 404); abort_if($user && $profile->id == $user->profile_id, 404);
$following = $user != null ? FollowerService::follows($user->profile_id, $profile->id) : false; $following = $user != null ? FollowerService::follows($user->profile_id, $profile->id) : false;
return view('site.intents.follow', compact('profile', 'user', 'following')); return view('site.intents.follow', compact('profile', 'user', 'following'));
} }
public function legacyProfileRedirect(Request $request, $username) public function legacyProfileRedirect(Request $request, $username)
{ {
$username = Str::contains($username, '@') ? '@' . $username : $username; $username = Str::contains($username, '@') ? '@' . $username : $username;
if(str_contains($username, '@')) { if(str_contains($username, '@')) {
$profile = Profile::whereUsername($username) $profile = Profile::whereUsername($username)
->firstOrFail(); ->firstOrFail();
if($profile->domain == null) { if($profile->domain == null) {
$url = "/$profile->username"; $url = "/$profile->username";
} else { } else {
$url = "/i/web/profile/_/{$profile->id}"; $url = "/i/web/profile/_/{$profile->id}";
} }
} else { } else {
$profile = Profile::whereUsername($username) $profile = Profile::whereUsername($username)
->whereNull('domain') ->whereNull('domain')
->firstOrFail(); ->firstOrFail();
$url = "/$profile->username"; $url = "/$profile->username";
} }
return redirect($url); return redirect($url);
} }
} }

View file

@ -1,138 +1,238 @@
@extends('layouts.anon') <!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
@section('content') <meta charset="utf-8">
<div class="jumbotron jumbotron-fluid bg-primary text-white mb-0 py-4"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<div class="container"> <meta name="viewport" content="width=device-width, initial-scale=1">
<p class="h1 font-weight-light">About</p> <meta name="mobile-web-app-capable" content="yes">
<p class="h3 font-weight-light py-4">Pixelfed is an image sharing platform, an ethical alternative to centralized platforms.</p> <title>{{ config('app.name', 'Pixelfed') }}</title>
</div> <meta property="og:site_name" content="{{ config_cache('app.name', 'pixelfed') }}">
</div> <meta property="og:title" content="{{ config_cache('app.name', 'pixelfed') }}">
<div class="bg-white"> <meta property="og:type" content="article">
<div class="container d-flex justify-content-center"> <meta property="og:url" content="{{route('site.about')}}">
<div class="card mr-3" style="width:500px;margin-top:-30px;"> <meta property="og:description" content="{{config_cache('app.short_description')}}">
<div class="card-header d-inline-flex align-items-center bg-white"> <meta name="medium" content="image">
<img src="/storage/avatars/default.png" width="32px" height="32px" style="border-radius: 32px; border: 1px solid #ccc"> <meta name="theme-color" content="#10c5f8">
<span class="username font-weight-bold pl-2 text-dark"> <meta name="apple-mobile-web-app-capable" content="yes">
username <link rel="shortcut icon" type="image/png" href="/img/favicon.png?v=2">
</span> <link rel="apple-touch-icon" type="image/png" href="/img/favicon.png?v=2">
<link href="{{ mix('css/app.css') }}" rel="stylesheet">
<style type="text/css">
.section-spacer {
height: 13vh;
}
</style>
</head>
<body>
<main id="content">
<div class="container">
<p class="text-right mt-3">
<a href="/" class="font-weight-bold text-dark">Home</a>
<a href="/site/newsroom" class="ml-4 font-weight-bold text-dark">Newsroom</a>
</p>
</div>
<div class="px-4 py-5 my-5 text-center">
<a href="/">
<img class="d-block mx-auto mb-4" src="/img/pixelfed-icon-color.svg" alt="" width="72" height="57">
</a>
<h1 class="display-4 font-weight-bold py-3">{{ config_cache('about.title') ?? 'Photo Sharing. For Everyone' }}</h1>
<div class="col-lg-6 mx-auto py-3">
<p class="mb-4 font-weight-light text-left" style="font-size: 26px; line-height: 40px;">
{!! config_cache('app.description') ?? config_cache('app.short_description') ?? 'Pixelfed is an image sharing platform, an ethical alternative to centralized platforms.'!!}
</p>
</div> </div>
<div class="card-body p-0"> </div>
<img class="img-fluid" src="/img/sample-post.jpeg">
</div> <div class="container">
<div class="card-footer bg-white"> <div class="row align-items-stretch pt-5">
<div class="likes font-weight-bold mb-2"> <div class="col">
<span class="like-count">124k</span> likes <div class="card h-100 shadow-lg" style="background-image: url('/_landing/3.jpeg');min-height:400px;border-radius:1rem;">
</div>
</div> </div>
<div class="caption">
<p class="mb-1"> <div class="col">
<span class="username font-weight-bold"> <div class="card h-100 shadow-lg" style="background-image: url('/_landing/8.jpeg');min-height:400px;border-radius:1rem;">
<bdi>username</bdi> </div>
</span> </div>
<span class="caption-body" data-processed="false">Hello world! <a href="#">#introduction</a></span>
</div>
<div class="row align-items-stretch pt-5">
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/6.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/4.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/7.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
</div>
<div class="row align-items-stretch py-5">
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/1.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/5.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
<div class="col">
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/9.jpeg');min-height:200px;border-radius:1rem;background-size: cover;">
</div>
</div>
</div>
</div>
@if($rules)
<div class="section-spacer"></div>
<div class="section-spacer"></div>
<div id="rules" class="container">
<div class="row mb-4">
<div class="col">
<h1 class="display-4 font-weight-bold mb-0 text-center">Rules</h1>
</div>
</div>
<div class="row justify-content-center">
<div class="col-12 mb-2 col-lg-8 mb-lg-0">
<ol>
@foreach($rules as $rule)
<li class="h3 my-4">{{$rule}}</li>
@endforeach
</ol>
<p class="h5 text-center pt-4">For more information, please review our <a href="/site/terms">Terms of Use</a></p>
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="section-spacer"></div>
@endif
<section class="container">
<div class="row">
<div class="col-12 col-md-8 offset-md-2">
<div class="mt-5">
<p class="text-center display-4 font-weight-bold">Feature Packed.</p>
</div>
<div class="my-2">
<p class="h3 font-weight-light text-muted text-center">The best for the brightest 📸</p>
</div>
</div>
</div>
</section>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Albums</h1>
<p class="h4 font-weight-light">Share posts with up to {{config_cache('pixelfed.max_album_length')}} photos</p>
</div>
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/1.jpeg" alt="" width="720">
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/2.jpeg" alt="" width="720">
</div>
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Comments</h1>
<p class="h4 font-weight-light text-justify">Comment on a post, or send a reply</p>
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Collections</h1>
<p class="h4 font-weight-light text-justify">Organize and share collections of multiple posts</p>
</div>
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/3.jpeg" alt="" width="720">
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/4.jpeg" alt="" width="720">
</div>
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Discover</h1>
<p class="h4 font-weight-light text-justify">Explore categories, hashtags and topics</p>
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Photo Filters</h1>
<p class="h4 font-weight-light text-justify">Add a special touch to your photos</p>
</div>
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/5.jpeg" alt="" width="720">
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="container my-5">
<div class="row p-4 pb-0 pt-lg-5 align-items-center rounded-3">
<div class="col-lg-6 overflow-hidden">
<img class="rounded-lg img-fluid filter-inkwell" src="/_landing/6.jpeg" alt="" width="720">
</div>
<div class="col-lg-6 p-3 p-lg-5 pt-lg-3">
<h1 class="display-4 font-weight-bold lh-1">Stories</h1>
<p class="h4 font-weight-light text-justify">Share moments with your followers that disappear after 24 hours</p>
</div>
</div>
</div>
<div class="section-spacer"></div>
<div class="section-spacer"></div>
<div id="stats" class="container">
<div class="row mb-4">
<div class="col">
<p class="display-3 font-weight-bold">
<span class="text-primary">{{$user_count}}</span>
people have shared
<span class="text-primary">{{$post_count}}</span>
photos and videos on {{config_cache('app.name')}}!
</p> </p>
</div> @if(config_cache('pixelfed.open_registration'))
</div> <div class="section-spacer"></div>
</div> <p class="display-4 font-weight-bold mb-0">
<div style="width:300px;margin-top:-30px;text-align: center;"> <a class="text-primary" href="/register">Sign up today</a>
<div class="card border-left-blue mb-3"> and join our community of photographers from around the world.
<div class="card-body">
<p class="h2 mb-0">{{$stats['posts']}}</p>
<p class="font-weight-bold mb-0">Posts</p>
</div>
</div>
<div class="card border-left-blue mb-3">
<div class="card-body">
<p class="h2 mb-0">{{$stats['users']}}</p>
<p class="font-weight-bold mb-0">Users</p>
</div>
</div>
@if($stats['admin'])
<div class="card border-left-blue mb-3">
<div class="card-body">
<p class="h2 mb-0">
<a href="{{$stats['admin']->url()}}">
&commat;{{$stats['admin']->username}}
</a>
</p> </p>
<p class="font-weight-bold mb-0">Instance Admin</p> @endif
</div>
</div>
@endif
</div>
</div>
<div class="container py-5">
</div>
</div>
<div class="bg-primary pt-5 pb-4">
<div class="container">
<div class="row">
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Ad Free
</p>
<p class="font-weight-light mb-0">No Ads or Trackers</p>
</div>
</div>
</div>
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Chronological
</p>
<p class="font-weight-light mb-0">Timelines in order</p>
</div>
</div>
</div>
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Federated
</p>
<p class="font-weight-light mb-0">A network of millions</p>
</div>
</div>
</div>
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Discover
</p>
<p class="font-weight-light mb-0">Discover popular posts</p>
</div>
</div>
</div>
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Photo Filters
</p>
<p class="font-weight-light mb-0">Add an optional filter</p>
</div>
</div>
</div>
<div class="col-12 col-md-4 mb-4">
<div class="card bg-transparent" style="box-shadow: none;border:1px solid #fff">
<div class="card-body text-white text-center">
<p class="font-weight-bold lead mb-0">
Stories
</p>
<p class="font-weight-light mb-0">Coming Soon!</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
@endsection
@push('meta') <div class="section-spacer"></div>
<meta property="og:description" content="Pixelfed is an image sharing platform, an ethical alternative to centralized platforms."> <div class="section-spacer"></div>
@endpush </main>
</div>
@include('layouts.partial.footer')
</body>
</html>

View file

@ -2,308 +2,143 @@
<html lang="{{ app()->getLocale() }}"> <html lang="{{ app()->getLocale() }}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<title>{{ config('app.name', 'Laravel') }}</title> <title>{{ config('app.name', 'Laravel') }}</title>
<meta property="og:site_name" content="{{ config('app.name', 'pixelfed') }}"> <meta property="og:site_name" content="{{ config('app.name', 'pixelfed') }}">
<meta property="og:title" content="{{ config('app.name', 'pixelfed') }}"> <meta property="og:title" content="{{ config('app.name', 'pixelfed') }}">
<meta property="og:type" content="article"> <meta property="og:type" content="article">
<meta property="og:url" content="{{request()->url()}}"> <meta property="og:url" content="{{request()->url()}}">
<meta property="og:description" content="Federated Image Sharing"> <meta property="og:description" content="Federated Image Sharing">
<meta name="medium" content="image"> <meta name="medium" content="image">
<meta name="theme-color" content="#10c5f8"> <meta name="theme-color" content="#10c5f8">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<link rel="shortcut icon" type="image/png" href="/img/favicon.png?v=2"> <link rel="shortcut icon" type="image/png" href="/img/favicon.png?v=2">
<link rel="apple-touch-icon" type="image/png" href="/img/favicon.png?v=2"> <link rel="apple-touch-icon" type="image/png" href="/img/favicon.png?v=2">
<link href="{{ mix('css/landing.css') }}" rel="stylesheet"> <link href="{{ mix('css/landing.css') }}" rel="stylesheet">
<style type="text/css"> <style type="text/css">
.feature-circle { .feature-circle {
display: flex !important; display: flex !important;
-webkit-box-pack: center !important; -webkit-box-pack: center !important;
justify-content: center !important; justify-content: center !important;
-webkit-box-align: center !important; -webkit-box-align: center !important;
align-items: center !important; align-items: center !important;
margin-right: 1rem !important; margin-right: 1rem !important;
background-color: #08d !important; background-color: #08d !important;
color: #fff; color: #fff;
border-radius: 50% !important; border-radius: 50% !important;
width: 60px; width: 60px;
height:60px; height:60px;
} }
.section-spacer { .section-spacer {
height: 13vh; height: 13vh;
} }
</style> </style>
</head> </head>
<body class=""> <body class="">
<main id="content"> <main id="content">
<section class="container"> <section class="container">
<div class="section-spacer"></div> <div class="section-spacer"></div>
<div class="row pt-md-5 mt-5"> <div class="row pt-md-5 mt-5">
<div class="col-12 col-md-6 d-none d-md-block"> <div class="col-12 col-md-6 d-none d-md-block">
<div class="m-my-4"> <div class="m-my-4">
<p class="display-2 font-weight-bold">Photo Sharing</p> <p class="display-2 font-weight-bold">Photo Sharing</p>
<p class="h1 font-weight-bold">For Everyone.</p> <p class="h1 font-weight-bold">For Everyone.</p>
</div> </div>
</div> </div>
<div class="col-12 col-md-5 offset-md-1"> <div class="col-12 col-md-5 offset-md-1">
<div> <div>
<div class="pt-md-3 d-flex justify-content-center align-items-center"> <div class="pt-md-3 d-flex justify-content-center align-items-center">
<img src="/img/pixelfed-icon-color.svg" loading="lazy" width="50px" height="50px"> <img src="/img/pixelfed-icon-color.svg" loading="lazy" width="50px" height="50px">
<span class="font-weight-bold h3 ml-2 pt-2">Pixelfed</span> <span class="font-weight-bold h3 ml-2 pt-2">Pixelfed</span>
</div> </div>
<div class="d-block d-md-none"> <div class="d-block d-md-none">
<p class="font-weight-bold mb-0 text-center">Photo Sharing. For Everyone</p> <p class="font-weight-bold mb-0 text-center">Photo Sharing. For Everyone</p>
</div> </div>
<div class="card my-4 shadow-none border"> <div class="card my-4 shadow-none border">
<div class="card-body px-lg-5"> <div class="card-body px-lg-5">
<div class="text-center"> <div class="text-center">
<p class="small text-uppercase font-weight-bold text-muted">Account Login</p> <p class="small text-uppercase font-weight-bold text-muted">Account Login</p>
</div> </div>
<div> <div>
<form class="px-1" method="POST" action="{{ route('login') }}" id="login_form"> <form class="px-1" method="POST" action="{{ route('login') }}" id="login_form">
@csrf @csrf
<div class="form-group row"> <div class="form-group row">
<div class="col-md-12"> <div class="col-md-12">
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="{{__('Email')}}" required autofocus> <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="{{__('Email')}}" required autofocus>
@if ($errors->has('email')) @if ($errors->has('email'))
<span class="invalid-feedback"> <span class="invalid-feedback">
<strong>{{ $errors->first('email') }}</strong> <strong>{{ $errors->first('email') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<div class="col-md-12"> <div class="col-md-12">
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="{{__('Password')}}" required> <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="{{__('Password')}}" required>
@if ($errors->has('password')) @if ($errors->has('password'))
<span class="invalid-feedback"> <span class="invalid-feedback">
<strong>{{ $errors->first('password') }}</strong> <strong>{{ $errors->first('password') }}</strong>
</span> </span>
@endif @endif
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<div class="col-md-12"> <div class="col-md-12">
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> <input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}>
<span class="font-weight-bold small ml-1 text-muted"> <span class="font-weight-bold small ml-1 text-muted">
{{ __('Remember Me') }} {{ __('Remember Me') }}
</span> </span>
</label> </label>
</div> </div>
</div> </div>
</div> </div>
@if(config('captcha.enabled')) @if(config('captcha.enabled'))
<div class="d-flex justify-content-center mb-3"> <div class="d-flex justify-content-center mb-3">
{!! Captcha::display() !!} {!! Captcha::display() !!}
</div> </div>
@endif @endif
<div class="form-group row mb-0"> <div class="form-group row mb-0">
<div class="col-md-12"> <div class="col-md-12">
<button type="submit" class="btn btn-primary btn-block py-0 font-weight-bold text-uppercase"> <button type="submit" class="btn btn-primary btn-block py-0 font-weight-bold text-uppercase">
{{ __('Login') }} {{ __('Login') }}
</button> </button>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
<div class="card shadow-none border card-body"> <div class="card shadow-none border card-body">
<p class="text-center mb-0 font-weight-bold small"> <p class="text-center mb-0 font-weight-bold small">
@if(config('pixelfed.open_registration')) @if(config('pixelfed.open_registration'))
<a href="/register">Register</a> <a href="/register">Register</a>
<span class="px-1">·</span> <span class="px-1">·</span>
@endif @endif
<a href="/password/reset">Password Reset</a> <a href="/password/reset">Password Reset</a>
</p> </p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="section-spacer"></div> </section>
<div class="row py-5 mt-5 mb-5"> </main>
<div class="col-12 col-md-6 d-none d-md-block"> @include('layouts.partial.footer')
<div>
<div class="row mt-4 mb-1">
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/1.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/2.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/3.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/4.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/5.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/6.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/7.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/8.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
<div class="col-4 mt-2 px-0">
<div class="px-1 shadow-none">
<img src="/_landing/9.jpeg" class="img-fluid" loading="lazy" width="640px" height="640px">
</div>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-5 offset-md-1">
<div class="section-spacer"></div>
<div class="mt-5">
<p class="text-center h1 font-weight-bold">Simple. Powerful.</p>
</div>
<div class="mt-5">
<div class="d-flex justify-content-between align-items-center">
<span class="text-center">
<span class="font-weight-bold h1">{{$data['stats']['posts']}}</span>
<span class="d-block text-muted text-uppercase">Posts</span>
</span>
<span class="text-center">
<span class="font-weight-bold h1">{{$data['stats']['likes']}}</span>
<span class="d-block text-muted text-uppercase">Likes</span>
</span>
<span class="text-center">
<span class="font-weight-bold h1">{{$data['stats']['hashtags']}}</span>
<span class="d-block text-muted text-uppercase">Hashtags Used</span>
</span>
</div>
</div>
<div class="mt-5">
<p class="lead text-muted text-center">A free and ethical photo sharing platform.</p>
</div>
</div>
</div>
<div class="row py-5 mb-5">
<div class="col-12 col-md-8 offset-md-2">
<div class="section-spacer"></div>
<div class="mt-5">
<p class="text-center display-4 font-weight-bold">Feature Packed.</p>
</div>
<div class="my-2">
<p class="h4 font-weight-light text-muted text-center">The best for the brightest.</p>
</div>
</div>
</div>
<div class="row pb-5 mb-5">
<div class="col-12 col-md-5 offset-md-1">
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="far fa-images fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Albums</p>
Create an album with up to <span class="font-weight-bold">{{config('pixelfed.max_album_length')}}</span> photos
</div>
</div>
</div>
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="far fa-folder fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Collections</p>
Organize your posts
</div>
</div>
</div>
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="fas fa-image fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Filters</p>
Add a filter to your photos
</div>
</div>
</div>
</div>
<div class="col-12 col-md-5 offset-md-1">
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="far fa-comment fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Comments</p>
Comment on a post, or send a reply
</div>
</div>
</div>
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="far fa-list-alt fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Discover</p>
Explore categories, hashtags and topics
</div>
</div>
</div>
@if(config('instance.stories.enabled'))
<div class="mb-5">
<div class="media">
<div class="feature-circle">
<i class="fas fa-history fa-lg"></i>
</div>
<div class="media-body">
<p class="h5 font-weight-bold mt-2 mb-0">Stories</p>
Share posts that disappear after 24h
</div>
</div>
</div>
@endif
</div>
</div>
</section>
</main>
@include('layouts.partial.footer')
</body> </body>
</html> </html>