mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-12-23 13:33:18 +00:00
commit
b654d68833
5 changed files with 470 additions and 544 deletions
|
@ -91,6 +91,8 @@
|
|||
- 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 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/))
|
||||
|
||||
## [v0.10.10 (2021-01-28)](https://github.com/pixelfed/pixelfed/compare/v0.10.9...v0.10.10)
|
||||
|
|
|
@ -480,6 +480,8 @@ class ComposeController extends Controller
|
|||
array_push($mimes, $m->mime);
|
||||
}
|
||||
|
||||
abort_if(empty($attachments), 422);
|
||||
|
||||
$mediaType = StatusController::mimeTypeCheck($mimes);
|
||||
|
||||
if(in_array($mediaType, ['photo', 'video', 'photo:album']) == false) {
|
||||
|
|
|
@ -13,143 +13,130 @@ use App\Util\ActivityPub\Helpers;
|
|||
|
||||
class SiteController extends Controller
|
||||
{
|
||||
public function home(Request $request)
|
||||
{
|
||||
if (Auth::check()) {
|
||||
return $this->homeTimeline($request);
|
||||
} else {
|
||||
return $this->homeGuest();
|
||||
}
|
||||
}
|
||||
public function home(Request $request)
|
||||
{
|
||||
if (Auth::check()) {
|
||||
return $this->homeTimeline($request);
|
||||
} else {
|
||||
return $this->homeGuest();
|
||||
}
|
||||
}
|
||||
|
||||
public function homeGuest()
|
||||
{
|
||||
$data = Cache::remember('site:landing:data', now()->addHours(3), function() {
|
||||
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 homeGuest()
|
||||
{
|
||||
return view('site.index');
|
||||
}
|
||||
|
||||
public function homeTimeline(Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'layout' => 'nullable|string|in:grid,feed'
|
||||
]);
|
||||
$layout = $request->input('layout', 'feed');
|
||||
return view('timeline.home', compact('layout'));
|
||||
}
|
||||
public function homeTimeline(Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'layout' => 'nullable|string|in:grid,feed'
|
||||
]);
|
||||
$layout = $request->input('layout', 'feed');
|
||||
return view('timeline.home', compact('layout'));
|
||||
}
|
||||
|
||||
public function changeLocale(Request $request, $locale)
|
||||
{
|
||||
// todo: add other locales after pushing new l10n strings
|
||||
$locales = Localization::languages();
|
||||
if(in_array($locale, $locales)) {
|
||||
if($request->user()) {
|
||||
$user = $request->user();
|
||||
$user->language = $locale;
|
||||
$user->save();
|
||||
}
|
||||
session()->put('locale', $locale);
|
||||
}
|
||||
public function changeLocale(Request $request, $locale)
|
||||
{
|
||||
// todo: add other locales after pushing new l10n strings
|
||||
$locales = Localization::languages();
|
||||
if(in_array($locale, $locales)) {
|
||||
if($request->user()) {
|
||||
$user = $request->user();
|
||||
$user->language = $locale;
|
||||
$user->save();
|
||||
}
|
||||
session()->put('locale', $locale);
|
||||
}
|
||||
|
||||
return redirect(route('site.language'));
|
||||
}
|
||||
return redirect(route('site.language'));
|
||||
}
|
||||
|
||||
public function about()
|
||||
{
|
||||
$page = Page::whereSlug('/site/about')->whereActive(true)->first();
|
||||
$stats = Cache::remember('site:about:stats-v1', now()->addHours(12), function() {
|
||||
return [
|
||||
'posts' => Status::count(),
|
||||
'users' => User::whereNull('status')->count(),
|
||||
'admin' => User::whereIsAdmin(true)->first()
|
||||
];
|
||||
});
|
||||
$path = $page ? 'site.about-custom' : 'site.about';
|
||||
return view($path, compact('page', 'stats'));
|
||||
}
|
||||
public function about()
|
||||
{
|
||||
return Cache::remember('site.about_v2', now()->addMinutes(15), function() {
|
||||
$user_count = number_format(User::count());
|
||||
$post_count = number_format(Status::count());
|
||||
$rules = config_cache('app.rules') ? json_decode(config_cache('app.rules'), true) : null;
|
||||
return view('site.about', compact('rules', 'user_count', 'post_count'))->render();
|
||||
});
|
||||
}
|
||||
|
||||
public function language()
|
||||
{
|
||||
return view('site.language');
|
||||
}
|
||||
public function language()
|
||||
{
|
||||
return view('site.language');
|
||||
}
|
||||
|
||||
public function communityGuidelines(Request $request)
|
||||
{
|
||||
return Cache::remember('site:help:community-guidelines', now()->addDays(120), function() {
|
||||
$slug = '/site/kb/community-guidelines';
|
||||
$page = Page::whereSlug($slug)->whereActive(true)->first();
|
||||
return View::make('site.help.community-guidelines')->with(compact('page'))->render();
|
||||
});
|
||||
}
|
||||
public function communityGuidelines(Request $request)
|
||||
{
|
||||
return Cache::remember('site:help:community-guidelines', now()->addDays(120), function() {
|
||||
$slug = '/site/kb/community-guidelines';
|
||||
$page = Page::whereSlug($slug)->whereActive(true)->first();
|
||||
return View::make('site.help.community-guidelines')->with(compact('page'))->render();
|
||||
});
|
||||
}
|
||||
|
||||
public function privacy(Request $request)
|
||||
{
|
||||
$page = Cache::remember('site:privacy', now()->addDays(120), function() {
|
||||
$slug = '/site/privacy';
|
||||
$page = Page::whereSlug($slug)->whereActive(true)->first();
|
||||
});
|
||||
return View::make('site.privacy')->with(compact('page'))->render();
|
||||
}
|
||||
public function privacy(Request $request)
|
||||
{
|
||||
$page = Cache::remember('site:privacy', now()->addDays(120), function() {
|
||||
$slug = '/site/privacy';
|
||||
$page = Page::whereSlug($slug)->whereActive(true)->first();
|
||||
});
|
||||
return View::make('site.privacy')->with(compact('page'))->render();
|
||||
}
|
||||
|
||||
public function terms(Request $request)
|
||||
{
|
||||
$page = Cache::remember('site:terms', now()->addDays(120), function() {
|
||||
$slug = '/site/terms';
|
||||
return Page::whereSlug($slug)->whereActive(true)->first();
|
||||
});
|
||||
return View::make('site.terms')->with(compact('page'))->render();
|
||||
}
|
||||
public function terms(Request $request)
|
||||
{
|
||||
$page = Cache::remember('site:terms', now()->addDays(120), function() {
|
||||
$slug = '/site/terms';
|
||||
return Page::whereSlug($slug)->whereActive(true)->first();
|
||||
});
|
||||
return View::make('site.terms')->with(compact('page'))->render();
|
||||
}
|
||||
|
||||
public function redirectUrl(Request $request)
|
||||
{
|
||||
abort_if(!$request->user(), 404);
|
||||
$this->validate($request, [
|
||||
'url' => 'required|url'
|
||||
]);
|
||||
$url = request()->input('url');
|
||||
abort_if(Helpers::validateUrl($url) == false, 404);
|
||||
return view('site.redirect', compact('url'));
|
||||
}
|
||||
public function redirectUrl(Request $request)
|
||||
{
|
||||
abort_if(!$request->user(), 404);
|
||||
$this->validate($request, [
|
||||
'url' => 'required|url'
|
||||
]);
|
||||
$url = request()->input('url');
|
||||
abort_if(Helpers::validateUrl($url) == false, 404);
|
||||
return view('site.redirect', compact('url'));
|
||||
}
|
||||
|
||||
public function followIntent(Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'user' => 'string|min:1|max:15|exists:users,username',
|
||||
]);
|
||||
$profile = Profile::whereUsername($request->input('user'))->firstOrFail();
|
||||
$user = $request->user();
|
||||
abort_if($user && $profile->id == $user->profile_id, 404);
|
||||
$following = $user != null ? FollowerService::follows($user->profile_id, $profile->id) : false;
|
||||
return view('site.intents.follow', compact('profile', 'user', 'following'));
|
||||
}
|
||||
public function followIntent(Request $request)
|
||||
{
|
||||
$this->validate($request, [
|
||||
'user' => 'string|min:1|max:15|exists:users,username',
|
||||
]);
|
||||
$profile = Profile::whereUsername($request->input('user'))->firstOrFail();
|
||||
$user = $request->user();
|
||||
abort_if($user && $profile->id == $user->profile_id, 404);
|
||||
$following = $user != null ? FollowerService::follows($user->profile_id, $profile->id) : false;
|
||||
return view('site.intents.follow', compact('profile', 'user', 'following'));
|
||||
}
|
||||
|
||||
public function legacyProfileRedirect(Request $request, $username)
|
||||
{
|
||||
$username = Str::contains($username, '@') ? '@' . $username : $username;
|
||||
if(str_contains($username, '@')) {
|
||||
$profile = Profile::whereUsername($username)
|
||||
->firstOrFail();
|
||||
public function legacyProfileRedirect(Request $request, $username)
|
||||
{
|
||||
$username = Str::contains($username, '@') ? '@' . $username : $username;
|
||||
if(str_contains($username, '@')) {
|
||||
$profile = Profile::whereUsername($username)
|
||||
->firstOrFail();
|
||||
|
||||
if($profile->domain == null) {
|
||||
$url = "/$profile->username";
|
||||
} else {
|
||||
$url = "/i/web/profile/_/{$profile->id}";
|
||||
}
|
||||
if($profile->domain == null) {
|
||||
$url = "/$profile->username";
|
||||
} else {
|
||||
$url = "/i/web/profile/_/{$profile->id}";
|
||||
}
|
||||
|
||||
} else {
|
||||
$profile = Profile::whereUsername($username)
|
||||
->whereNull('domain')
|
||||
->firstOrFail();
|
||||
$url = "/$profile->username";
|
||||
}
|
||||
} else {
|
||||
$profile = Profile::whereUsername($username)
|
||||
->whereNull('domain')
|
||||
->firstOrFail();
|
||||
$url = "/$profile->username";
|
||||
}
|
||||
|
||||
return redirect($url);
|
||||
}
|
||||
return redirect($url);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,138 +1,238 @@
|
|||
@extends('layouts.anon')
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ app()->getLocale() }}">
|
||||
<head>
|
||||
|
||||
@section('content')
|
||||
<div class="jumbotron jumbotron-fluid bg-primary text-white mb-0 py-4">
|
||||
<div class="container">
|
||||
<p class="h1 font-weight-light">About</p>
|
||||
<p class="h3 font-weight-light py-4">Pixelfed is an image sharing platform, an ethical alternative to centralized platforms.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white">
|
||||
<div class="container d-flex justify-content-center">
|
||||
<div class="card mr-3" style="width:500px;margin-top:-30px;">
|
||||
<div class="card-header d-inline-flex align-items-center bg-white">
|
||||
<img src="/storage/avatars/default.png" width="32px" height="32px" style="border-radius: 32px; border: 1px solid #ccc">
|
||||
<span class="username font-weight-bold pl-2 text-dark">
|
||||
username
|
||||
</span>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<title>{{ config('app.name', 'Pixelfed') }}</title>
|
||||
<meta property="og:site_name" content="{{ config_cache('app.name', 'pixelfed') }}">
|
||||
<meta property="og:title" content="{{ config_cache('app.name', 'pixelfed') }}">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="{{route('site.about')}}">
|
||||
<meta property="og:description" content="{{config_cache('app.short_description')}}">
|
||||
<meta name="medium" content="image">
|
||||
<meta name="theme-color" content="#10c5f8">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<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 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 class="card-body p-0">
|
||||
<img class="img-fluid" src="/img/sample-post.jpeg">
|
||||
</div>
|
||||
<div class="card-footer bg-white">
|
||||
<div class="likes font-weight-bold mb-2">
|
||||
<span class="like-count">124k</span> likes
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<div class="row align-items-stretch pt-5">
|
||||
<div class="col">
|
||||
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/3.jpeg');min-height:400px;border-radius:1rem;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="caption">
|
||||
<p class="mb-1">
|
||||
<span class="username font-weight-bold">
|
||||
<bdi>username</bdi>
|
||||
</span>
|
||||
<span class="caption-body" data-processed="false">Hello world! <a href="#">#introduction</a></span>
|
||||
|
||||
<div class="col">
|
||||
<div class="card h-100 shadow-lg" style="background-image: url('/_landing/8.jpeg');min-height:400px;border-radius:1rem;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width:300px;margin-top:-30px;text-align: center;">
|
||||
<div class="card border-left-blue mb-3">
|
||||
<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()}}">
|
||||
@{{$stats['admin']->username}}
|
||||
</a>
|
||||
@if(config_cache('pixelfed.open_registration'))
|
||||
<div class="section-spacer"></div>
|
||||
<p class="display-4 font-weight-bold mb-0">
|
||||
<a class="text-primary" href="/register">Sign up today</a>
|
||||
and join our community of photographers from around the world.
|
||||
</p>
|
||||
<p class="font-weight-bold mb-0">Instance Admin</p>
|
||||
</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>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('meta')
|
||||
<meta property="og:description" content="Pixelfed is an image sharing platform, an ethical alternative to centralized platforms.">
|
||||
@endpush
|
||||
<div class="section-spacer"></div>
|
||||
<div class="section-spacer"></div>
|
||||
</main>
|
||||
</div>
|
||||
@include('layouts.partial.footer')
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -2,308 +2,143 @@
|
|||
<html lang="{{ app()->getLocale() }}">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<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:title" content="{{ config('app.name', 'pixelfed') }}">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="{{request()->url()}}">
|
||||
<meta property="og:description" content="Federated Image Sharing">
|
||||
<meta property="og:site_name" content="{{ config('app.name', 'pixelfed') }}">
|
||||
<meta property="og:title" content="{{ config('app.name', 'pixelfed') }}">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="{{request()->url()}}">
|
||||
<meta property="og:description" content="Federated Image Sharing">
|
||||
|
||||
<meta name="medium" content="image">
|
||||
<meta name="theme-color" content="#10c5f8">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<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 href="{{ mix('css/landing.css') }}" rel="stylesheet">
|
||||
<style type="text/css">
|
||||
.feature-circle {
|
||||
display: flex !important;
|
||||
-webkit-box-pack: center !important;
|
||||
justify-content: center !important;
|
||||
-webkit-box-align: center !important;
|
||||
align-items: center !important;
|
||||
margin-right: 1rem !important;
|
||||
background-color: #08d !important;
|
||||
color: #fff;
|
||||
border-radius: 50% !important;
|
||||
width: 60px;
|
||||
height:60px;
|
||||
}
|
||||
.section-spacer {
|
||||
height: 13vh;
|
||||
}
|
||||
</style>
|
||||
<meta name="medium" content="image">
|
||||
<meta name="theme-color" content="#10c5f8">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<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 href="{{ mix('css/landing.css') }}" rel="stylesheet">
|
||||
<style type="text/css">
|
||||
.feature-circle {
|
||||
display: flex !important;
|
||||
-webkit-box-pack: center !important;
|
||||
justify-content: center !important;
|
||||
-webkit-box-align: center !important;
|
||||
align-items: center !important;
|
||||
margin-right: 1rem !important;
|
||||
background-color: #08d !important;
|
||||
color: #fff;
|
||||
border-radius: 50% !important;
|
||||
width: 60px;
|
||||
height:60px;
|
||||
}
|
||||
.section-spacer {
|
||||
height: 13vh;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="">
|
||||
<main id="content">
|
||||
<section class="container">
|
||||
<div class="section-spacer"></div>
|
||||
<div class="row pt-md-5 mt-5">
|
||||
<div class="col-12 col-md-6 d-none d-md-block">
|
||||
<div class="m-my-4">
|
||||
<p class="display-2 font-weight-bold">Photo Sharing</p>
|
||||
<p class="h1 font-weight-bold">For Everyone.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-5 offset-md-1">
|
||||
<div>
|
||||
<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">
|
||||
<span class="font-weight-bold h3 ml-2 pt-2">Pixelfed</span>
|
||||
</div>
|
||||
<div class="d-block d-md-none">
|
||||
<p class="font-weight-bold mb-0 text-center">Photo Sharing. For Everyone</p>
|
||||
</div>
|
||||
<div class="card my-4 shadow-none border">
|
||||
<div class="card-body px-lg-5">
|
||||
<div class="text-center">
|
||||
<p class="small text-uppercase font-weight-bold text-muted">Account Login</p>
|
||||
</div>
|
||||
<div>
|
||||
<form class="px-1" method="POST" action="{{ route('login') }}" id="login_form">
|
||||
@csrf
|
||||
<div class="form-group row">
|
||||
<main id="content">
|
||||
<section class="container">
|
||||
<div class="section-spacer"></div>
|
||||
<div class="row pt-md-5 mt-5">
|
||||
<div class="col-12 col-md-6 d-none d-md-block">
|
||||
<div class="m-my-4">
|
||||
<p class="display-2 font-weight-bold">Photo Sharing</p>
|
||||
<p class="h1 font-weight-bold">For Everyone.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-md-5 offset-md-1">
|
||||
<div>
|
||||
<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">
|
||||
<span class="font-weight-bold h3 ml-2 pt-2">Pixelfed</span>
|
||||
</div>
|
||||
<div class="d-block d-md-none">
|
||||
<p class="font-weight-bold mb-0 text-center">Photo Sharing. For Everyone</p>
|
||||
</div>
|
||||
<div class="card my-4 shadow-none border">
|
||||
<div class="card-body px-lg-5">
|
||||
<div class="text-center">
|
||||
<p class="small text-uppercase font-weight-bold text-muted">Account Login</p>
|
||||
</div>
|
||||
<div>
|
||||
<form class="px-1" method="POST" action="{{ route('login') }}" id="login_form">
|
||||
@csrf
|
||||
<div class="form-group row">
|
||||
|
||||
<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>
|
||||
<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>
|
||||
|
||||
@if ($errors->has('email'))
|
||||
<span class="invalid-feedback">
|
||||
<strong>{{ $errors->first('email') }}</strong>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@if ($errors->has('email'))
|
||||
<span class="invalid-feedback">
|
||||
<strong>{{ $errors->first('email') }}</strong>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<div class="form-group row">
|
||||
|
||||
<div class="col-md-12">
|
||||
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="{{__('Password')}}" required>
|
||||
<div class="col-md-12">
|
||||
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="{{__('Password')}}" required>
|
||||
|
||||
@if ($errors->has('password'))
|
||||
<span class="invalid-feedback">
|
||||
<strong>{{ $errors->first('password') }}</strong>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@if ($errors->has('password'))
|
||||
<span class="invalid-feedback">
|
||||
<strong>{{ $errors->first('password') }}</strong>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<div class="col-md-12">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}>
|
||||
<span class="font-weight-bold small ml-1 text-muted">
|
||||
{{ __('Remember Me') }}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if(config('captcha.enabled'))
|
||||
<div class="d-flex justify-content-center mb-3">
|
||||
{!! Captcha::display() !!}
|
||||
</div>
|
||||
@endif
|
||||
<div class="form-group row mb-0">
|
||||
<div class="col-md-12">
|
||||
<button type="submit" class="btn btn-primary btn-block py-0 font-weight-bold text-uppercase">
|
||||
{{ __('Login') }}
|
||||
</button>
|
||||
<div class="form-group row">
|
||||
<div class="col-md-12">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}>
|
||||
<span class="font-weight-bold small ml-1 text-muted">
|
||||
{{ __('Remember Me') }}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if(config('captcha.enabled'))
|
||||
<div class="d-flex justify-content-center mb-3">
|
||||
{!! Captcha::display() !!}
|
||||
</div>
|
||||
@endif
|
||||
<div class="form-group row mb-0">
|
||||
<div class="col-md-12">
|
||||
<button type="submit" class="btn btn-primary btn-block py-0 font-weight-bold text-uppercase">
|
||||
{{ __('Login') }}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card shadow-none border card-body">
|
||||
<p class="text-center mb-0 font-weight-bold small">
|
||||
@if(config('pixelfed.open_registration'))
|
||||
<a href="/register">Register</a>
|
||||
<span class="px-1">·</span>
|
||||
@endif
|
||||
<a href="/password/reset">Password Reset</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section-spacer"></div>
|
||||
<div class="row py-5 mt-5 mb-5">
|
||||
<div class="col-12 col-md-6 d-none d-md-block">
|
||||
<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')
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card shadow-none border card-body">
|
||||
<p class="text-center mb-0 font-weight-bold small">
|
||||
@if(config('pixelfed.open_registration'))
|
||||
<a href="/register">Register</a>
|
||||
<span class="px-1">·</span>
|
||||
@endif
|
||||
<a href="/password/reset">Password Reset</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
@include('layouts.partial.footer')
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in a new issue