Compare commits

...

2 Commits

Author SHA1 Message Date
c352d4d273 feat: modifying artworks blade 2023-12-10 15:10:55 -06:00
5c133cba56 feat: more work on completing switchover 2023-12-10 15:10:32 -06:00
113 changed files with 19495 additions and 9336 deletions

4
.gitignore vendored
View File

@ -29,5 +29,7 @@ Homestead.yaml
Homestead.json
/.vagrant
.phpunit.result.cache
legacypublic
migrated_artworks_files.tar.gz
migrated_thumbnail_files.tar.gz
site/.yarn/releases/yarn-1.22.19.cjs

View File

@ -10,6 +10,7 @@ services:
volumes:
- ./site:/var/www/html
- ./static:/static
#- ./legacypublic:/legacypublic
environment:
TZ: UTC
PUID: ${UID:-1000}
@ -22,6 +23,7 @@ services:
LARAVEL_QUEUE_ENABLED: true
LARAVEL_QUEUE_OPTIONS: --timeout=60 --tries=3 redis
LARAVEL_SCHEDULE_ENABLED: true
PHP_OPEN_BASEDIR: "/var/www/html:/static"
ports:
- "80:80"
links:

View File

@ -0,0 +1,51 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Artwork;
use App\Models\Episode;
use Illuminate\Support\Facades\DB;
class AddMissingArtworkIdsToEpisodes extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'naart:artwork-to-episodes';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$oldEpisodes = DB::connection('legacy')->select('SELECT * FROM episodes WHERE artwork_id IS NOT NULL AND published = 1');
foreach($oldEpisodes as $oldEpisode) {
$this->info('Checking old episode ' . $oldEpisode->show_date);
$episode = Episode::where('legacy_id', $oldEpisode->id)->first();
$artwork = Artwork::where('legacy_id', $oldEpisode->artwork_id)->first();
if ($episode && $artwork) {
$this->line('Have artwork ' . $artwork->title . ' for episode ' . $episode->title);
$episode->artwork_id = $artwork->id;
$episode->timestamps = false;
if ($episode->isDirty()) {
$this->info('I need to update this.');
//$episode->save();
} else {
$this->line('No Change Needed.');
}
} else {
$this->error('I am lost.');
}
}
}
}

View File

@ -0,0 +1,125 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Storage;
use Carbon\Carbon;
use App\Models\User;
use App\Models\Artist;
use App\Models\Podcast;
use App\Models\Episode;
use App\Models\Artwork;
use ImageOptimizer;
class GetMissingArtworkMovedCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'naart:wrapup';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$missingArtworks = DB::connection('legacy')->select('SELECT * FROM artworks WHERE id > 30835 AND approved_by IS NOT NULL');
foreach ($missingArtworks as $missingArtwork) {
$localPath = '/legacypublic' . $missingArtwork->path . '/' . $missingArtwork->filename;
$user = User::where('legacy_id', $missingArtwork->user_id)->with('artists')->first();
$artwork = Artwork::where('legacy_id', $missingArtwork->id)->first();
$episode = Episode::where('legacy_id', $missingArtwork->episode_id)->first();
$approver = User::where('legacy_id', $missingArtwork->approved_by)->with('artists')->first();
if ($artwork) {
$this->line('Artwork ID: ' . $artwork->id);
}
if ($episode) {
$this->line('Episode: ' . $episode->episode_number . ' "' . $episode->title . '"');
}
if (!$artwork) {
$newFilename = $this->uniqueName($episode, $user, $missingArtwork);
$state = [
'title' => $missingArtwork->title,
'description' => '',
'artist_id' => $user->artists->first()->id,
'episode_id' => $episode->id,
'podcast_id' => 1,
'overlay_id' => null,
'filename' => $newFilename . '.jpg',
'created_at' => Carbon::parse($missingArtwork->created_at),
'updated_at' => Carbon::parse($missingArtwork->updated_at),
'legacy_id' => $missingArtwork->id,
'approved_by' => $approver->artists->first()->id,
];
$artwork = Artwork::factory()->state($state)->create();
}
$this->line('Artist: ' . $user->artists->first()->name);
$this->line($localPath);
$filename = 'artworks/' . $artwork->filename;
$thumbnailName = 'thumbnails/' . $artwork->filename;
if (Storage::disk('static')->exists($filename)) {
$this->error($filename . ' already exists. ' . Storage::disk('static')->size($filename));
}
if (Storage::disk('static')->exists($thumbnailName)) {
$this->error($thumbnailName . ' already exists. ' . Storage::disk('static')->size($thumbnailName));
}
$img = Image::make($localPath)
->resize(3000, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100);
$thumbImg = Image::make($localPath)
->resize(512, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100);
$imgLocation = Storage::disk('static')->put($filename, $img);
$thumbLocation = Storage::disk('static')->put($thumbnailName, $thumbImg);
$size_before = Storage::disk('static')->size($filename);
$thumb_size_before = Storage::disk('static')->size($thumbnailName);
ImageOptimizer::optimize(Storage::disk('static')->path($filename));
ImageOptimizer::optimize(Storage::disk('static')->path($thumbnailName));
$size_after = Storage::disk('static')->size($filename);
$thumb_size_after = Storage::disk('static')->size($thumbnailName);
$diff = $size_before - $size_after;
$thumbDiff = $thumb_size_before - $thumb_size_after;
$this->line('Filesize before: ' . $size_before);
$this->line('Filesize after: ' . $size_after);
$this->line('Thumb Filesize before: ' . $thumb_size_before);
$this->line('Thumb Filesize after: ' . $thumb_size_after);
}
}
private function checkExistingFilename($name) {
$checkArtwork = Artwork::where('filename', $name . '.jpg')->count();
return $checkArtwork;
}
private function uniqueName($episode, $user, $missingArtwork) {
$i = 0;
$uniqueFilename = $episode->episode_date->format('Y/m/') . Str::slug($user->artists->first()->name . '-' . $missingArtwork->title) . '_' . $missingArtwork->id;
$exists = $this->checkExistingFilename($uniqueFilename);
if (!$exists) {
return $uniqueFilename;
}
while(!$exists) {
$i++;
$uniqueFilename = $uniqueFilename . '_v' . $i;
$exists = $this->checkExistingFilename($uniqueFilename);
}
return $uniqueFilename;
}
}

View File

@ -0,0 +1,27 @@
<?php
if (!function_exists('numberSuffix')) {
function numberSuffix($number) {
if (!is_int($number) || $number < 1) {
return $number;
}
$lastDigit = $number % 10;
$secondLastDigit = ($number / 10) % 10;
if ($secondLastDigit == 1) {
return 'th';
}
switch ($lastDigit) {
case 1:
return 'st';
case 2:
return 'nd';
case 3:
return 'rd';
default:
return 'th';
}
}
}

View File

@ -3,7 +3,18 @@
namespace App\Http\Controllers;
use App\Models\Artwork;
use App\Models\Podcast;
use App\Models\Episode;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\File;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use ImageOptimizer;
class ArtworkController extends Controller
{
@ -14,7 +25,19 @@ class ArtworkController extends Controller
*/
public function index()
{
//
$user = auth()->user();
$artworks = Artwork::whereNotNull('approved_by')
->with('artist')
->orderBy('episode_id', 'desc')
->orderBy('created_at', 'desc')
->paginate($perPage = 100, $columns = ['*'], $pageName = 'artworks');
$podcasts = Podcast::where('published', true)->with('episodes')->get();
return view('explore.artworks', [
'user' => $user,
'pageTitle' => 'Explore',
'artworks' => $artworks,
'podcasts' => $podcasts,
]);
}
/**
@ -24,7 +47,13 @@ public function index()
*/
public function create()
{
//
$user = auth()->user();
$podcasts = Podcast::where('published', true)->with('episodes')->get();
return view('artworks.submit', [
'user' => $user,
'pageTitle' => 'Submit New Artwork',
'podcasts' => $podcasts,
]);
}
/**
@ -33,20 +62,79 @@ public function create()
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function store(Request $request): RedirectResponse
{
//
$validator = Validator::make($request->all(), [
'title' => ['required', 'max:255',],
'podcast' => ['required', 'exists:podcasts,id',],
'description' => ['nullable',],
'file' => ['required', 'image', Rule::dimensions()->ratio(1)->minWidth(512),],
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
Log::channel('artwork_import')->info('making new artwork model.');
$podcast = Podcast::where('id', $request->podcast)->with(['episodes' => function($query) {
$query->orderBy('episode_number', 'desc')->limit(1);
}])->first();
$episode = $podcast->episodes->first();
$artist = auth()->user()->artists()->first();
$rawFile = $request->file('file');
$filename = now()->format('Y')
. '/'
. now()->format('m')
. '/'
. Str::slug($artist->name)
. '-'
. Str::slug($request->title)
. '_'
. Str::random(8)
. '.jpg';
$artwork = Artwork::factory()->state([
'title' => $request->title,
'artist_id' => $artist->id,
'description' => $request->description,
'overlay_id' => null,
'podcast_id' => $podcast->id,
'episode_id' => $episode->id,
'filename' => $filename,
])->create();
$img = Image::make($rawFile)->resize(3000, null, function($constraint){
$constraint->aspectRatio();
})
->encode('jpg', 100)
->save(Storage::disk('static')->path('/artworks') . '/' . $artwork->filename);
$thumbImg = Image::make($request->file('file'))->resize(512, null, function($constraint){
$constraint->aspectRatio();
})
->encode('jpg', 100)
->save(Storage::disk('static')->path('/thumbnails') . '/' . $artwork->filename);
ImageOptimizer::optimize(Storage::disk('static')->path('/artworks/' . $artwork->filename));
ImageOptimizer::optimize(Storage::disk('static')->path('/thumbnails/' . $artwork->filename));
return redirect('/artworks/' . $artwork->id);
}
/**
* Display the specified resource.
*
* @param \App\Models\Artwork $artwork
* @param \Illuminate\Http\Request $request
* @param the id of the \App\Models\Artwork $id
* @return \Illuminate\Http\Response
*/
public function show(Artwork $artwork)
public function show(Request $request, $id)
{
//
$user = auth()->user();
$artwork = Artwork::where('id', $id)
->with('podcast')
->with('episode')
->with('artist')
->first();
return view('artworks.artwork', [
'artwork' => $artwork,
'user' => $user,
]);
}
/**

View File

@ -4,28 +4,51 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use App\Models\Artwork;
use App\Models\Artist;
use App\Models\Episode;
class PageController extends Controller
{
public function landing()
public function landing(Request $request)
{
$user = auth()->user();
$headerCounters = $this->getHeaderCounters();
$recentEpisodes = $this->mostRecentEpisodes();
$recentSubmissions = $this->mostRecentSubmissions();
$leaderboard = $this->leaderboardTwelveMonths();
return view('home.page', [
'user' => $user,
'pageTitle' => 'Home',
'headerCounters' => $headerCounters,
'recentEpisodes' => $recentEpisodes,
'recentSubmissions' => $recentSubmissions,
'leaderboard' => $leaderboard,
'preferredTheme' => $request->session()->get('preferred_theme') ?? 'dark',
]);
}
private function mostRecentSubmissions() {
$artworks = Cache::remember('latestSubmissions', 30, function() {
return Artwork::whereNotNull('approved_by')
->with('artist')
->with('episode')
->with('podcast')
->orderBy('created_at', 'desc')
->limit(50)
->get();
});
return $artworks;
}
private function mostRecentEpisodes()
{
$episodes = Cache::remember('latestEpisodes', 30, function() {
return Episode::where('published', true)
->whereHas('artwork')
->with('podcast')
->with('artwork')
->with('artwork.artist')
@ -76,4 +99,46 @@ private function numberFormatPrecision($number, $precision = 2, $separator = '.'
return $response;
}
private function leaderboardTwelveMonths() {
$endDate = now()->endOfDay()->subYear()->format('Y-m-d');
$leaderboard = DB::table('episodes')
->join('artworks', 'artworks.id', '=', 'episodes.artwork_id')
->join('artists', 'artists.id', '=', 'artworks.artist_id')
->select([
DB::raw('artists.id as artistId'),
DB::raw('artists.name as artistName'),
DB::raw('count(artworks.id) as artworkCount')
])
->where('episodes.published', 1)
->where('episodes.episode_date', '>=', $endDate)
->groupBy('artistId')
->orderByDesc('artworkCount')
->limit(10)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
}
private function addArtistModelToLeaderboard($leaderboard) {
$artistIds = [];
foreach ($leaderboard as $lb) {
$artistIds[] = $lb->artistId;
}
$artists = Artist::whereIn('id', $artistIds)->get();
foreach ($leaderboard as $lb) {
$lb->artist = $artists->where('id', $lb->artistId)->first();
}
$p = 0;
foreach ($leaderboard as $lb) {
$p++;
$lb->position = $p;
}
return $leaderboard;
}
public function setSessionTheme(Request $request) {
}
}

View File

@ -39,7 +39,7 @@ class Kernel extends HttpKernel
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

View File

@ -56,12 +56,12 @@ public function handle(): void
$this->createArtwork($basename);
return;
}
$img = Image::make('https://noagendaartgenerator.com' . $this->artwork->path . '/' . $this->artwork->filename)
$img = Image::make('/legacypublic' . $this->artwork->path . '/' . $this->artwork->filename)
->resize(3000, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100);
$thumbImg = Image::make('https://noagendaartgenerator.com' . $this->artwork->path . '/' . $this->artwork->filename)
$thumbImg = Image::make('/legacypublic' . $this->artwork->path . '/' . $this->artwork->filename)
->resize(512, null, function ($constraint) {
$constraint->aspectRatio();
})

View File

@ -0,0 +1,25 @@
<?php
namespace App\Livewire;
use Livewire\Component;
class Counter extends Component
{
public $count = 1;
public function increment()
{
$this->count++;
}
public function decrement()
{
$this->count--;
}
public function render()
{
return view('livewire.counter');
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Livewire;
use Livewire\Component;
class Themeswitch extends Component
{
public function light()
{
session(['preferred_theme' => 'light']);
}
public function dark()
{
session(['preferred_theme' => 'dark']);
}
public function render()
{
return view('livewire.themeswitch');
}
}

View File

@ -16,6 +16,12 @@ class Artist extends Model
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
public function user()
{
return $this->belongs_to(User::class);

View File

@ -16,6 +16,12 @@ class Artwork extends Model
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
public function podcast()
{
return $this->belongsTo(Podcast::class);

View File

@ -14,6 +14,13 @@ class Episode extends Model
protected $dates = ['episode_date', 'created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'episode_date' => 'date',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
public function podcast()
{
return $this->belongsTo(Podcast::class);

View File

@ -16,6 +16,12 @@ class Overlay extends Model
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
public function artist()
{
return $this->belongsTo(Artist::class);

View File

@ -16,6 +16,13 @@ class Podcast extends Model
protected $dates = ['created_at', 'updated_at', 'deleted_at', 'added_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'added_at' => 'datetime',
];
public function episodes()
{
return $this->hasMany(Episode::class);

View File

@ -14,8 +14,6 @@ class User extends Authenticatable
protected $table = 'users';
protected $dates = ['created_at', 'updated_at'];
/**
* The attributes that are mass assignable.
*
@ -44,6 +42,17 @@ class User extends Authenticatable
*/
protected $casts = [
'email_verified_at' => 'datetime',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
/**
* The attributes that should be appended.
*
* @var array<string, string>
*/
protected $appends = [
];
public function artists()

View File

@ -13,6 +13,11 @@ class Wallet extends Model
protected $dates = ['created_at', 'updated_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
public function walletType()
{
return $this->hasOne(WalletType::class);

View File

@ -13,6 +13,11 @@ class WalletType extends Model
protected $dates = ['created_at', 'updated_at'];
protected $casts = [
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
public function wallets()
{
return $this->hasMany(Wallet::class);

View File

@ -3,6 +3,9 @@
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\View;
use App\Models\Podcast;
class AppServiceProvider extends ServiceProvider
{
@ -19,6 +22,8 @@ public function register(): void
*/
public function boot(): void
{
//
Paginator::useBootstrapFive();
$publishedPodcasts = Podcast::where('published', true)->select(['name', 'slug'])->get();
View::share(['navPodcasts' => $publishedPodcasts]);
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Providers\Filament;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Pages;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Support\Colors\Color;
use Filament\Widgets;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path('admin')
->login()
->colors([
'primary' => Color::Amber,
])
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
->pages([
Pages\Dashboard::class,
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
->widgets([
Widgets\AccountWidget::class,
Widgets\FilamentInfoWidget::class,
])
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])
->authMiddleware([
Authenticate::class,
]);
}
}

View File

@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
*
* @var string
*/
public const HOME = '/dashboard';
public const HOME = '/';
/**
* Define your route model bindings, pattern filters, and other route configuration.

View File

@ -2,16 +2,23 @@
"name": "laravel/laravel",
"type": "project",
"description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"],
"keywords": [
"laravel",
"framework"
],
"license": "MIT",
"require": {
"php": "^8.1",
"andreiio/blade-remix-icon": "^2.6",
"blade-ui-kit/blade-icons": "^1.5",
"filament/filament": "^3.0-stable",
"guzzlehttp/guzzle": "^7.2",
"intervention/image": "^2.7",
"laravel/framework": "^10.10",
"laravel/sanctum": "^3.2",
"laravel/sanctum": "^3.3",
"laravel/tinker": "^2.8",
"livewire/livewire": "^2.12",
"livewire/livewire": "^3.2",
"mckenziearts/blade-untitledui-icons": "^1.2",
"spatie/laravel-image-optimizer": "^1.7"
},
"require-dev": {
@ -29,7 +36,10 @@
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"files": [
"app/Helpers/pcagHelpers.php"
]
},
"autoload-dev": {
"psr-4": {
@ -39,7 +49,8 @@
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
"@php artisan package:discover --ansi",
"@php artisan filament:upgrade"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"

3018
site/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -169,6 +169,7 @@
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\Filament\AdminPanelProvider::class,
App\Providers\RouteServiceProvider::class,
])->toArray(),

183
site/config/blade-icons.php Normal file
View File

@ -0,0 +1,183 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Icons Sets
|--------------------------------------------------------------------------
|
| With this config option you can define a couple of
| default icon sets. Provide a key name for your icon
| set and a combination from the options below.
|
*/
'sets' => [
// 'default' => [
//
// /*
// |-----------------------------------------------------------------
// | Icons Path
// |-----------------------------------------------------------------
// |
// | Provide the relative path from your app root to your SVG icons
// | directory. Icons are loaded recursively so there's no need to
// | list every sub-directory.
// |
// | Relative to the disk root when the disk option is set.
// |
// */
//
// 'path' => 'resources/svg',
//
// /*
// |-----------------------------------------------------------------
// | Filesystem Disk
// |-----------------------------------------------------------------
// |
// | Optionally, provide a specific filesystem disk to read
// | icons from. When defining a disk, the "path" option
// | starts relatively from the disk root.
// |
// */
//
// 'disk' => '',
//
// /*
// |-----------------------------------------------------------------
// | Default Prefix
// |-----------------------------------------------------------------
// |
// | This config option allows you to define a default prefix for
// | your icons. The dash separator will be applied automatically
// | to every icon name. It's required and needs to be unique.
// |
// */
//
// 'prefix' => 'icon',
//
// /*
// |-----------------------------------------------------------------
// | Fallback Icon
// |-----------------------------------------------------------------
// |
// | This config option allows you to define a fallback
// | icon when an icon in this set cannot be found.
// |
// */
//
// 'fallback' => '',
//
// /*
// |-----------------------------------------------------------------
// | Default Set Classes
// |-----------------------------------------------------------------
// |
// | This config option allows you to define some classes which
// | will be applied by default to all icons within this set.
// |
// */
//
// 'class' => '',
//
// /*
// |-----------------------------------------------------------------
// | Default Set Attributes
// |-----------------------------------------------------------------
// |
// | This config option allows you to define some attributes which
// | will be applied by default to all icons within this set.
// |
// */
//
// 'attributes' => [
// // 'width' => 50,
// // 'height' => 50,
// ],
//
// ],
],
/*
|--------------------------------------------------------------------------
| Global Default Classes
|--------------------------------------------------------------------------
|
| This config option allows you to define some classes which
| will be applied by default to all icons.
|
*/
'class' => '',
/*
|--------------------------------------------------------------------------
| Global Default Attributes
|--------------------------------------------------------------------------
|
| This config option allows you to define some attributes which
| will be applied by default to all icons.
|
*/
'attributes' => [
// 'width' => 50,
// 'height' => 50,
],
/*
|--------------------------------------------------------------------------
| Global Fallback Icon
|--------------------------------------------------------------------------
|
| This config option allows you to define a global fallback
| icon when an icon in any set cannot be found. It can
| reference any icon from any configured set.
|
*/
'fallback' => '',
/*
|--------------------------------------------------------------------------
| Components
|--------------------------------------------------------------------------
|
| These config options allow you to define some
| settings related to Blade Components.
|
*/
'components' => [
/*
|----------------------------------------------------------------------
| Disable Components
|----------------------------------------------------------------------
|
| This config option allows you to disable Blade components
| completely. It's useful to avoid performance problems
| when working with large icon libraries.
|
*/
'disabled' => false,
/*
|----------------------------------------------------------------------
| Default Icon Component Name
|----------------------------------------------------------------------
|
| This config option allows you to define the name
| for the default Icon class component.
|
*/
'default' => 'icon',
],
];

View File

@ -56,6 +56,26 @@
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'legacy' => [
'driver' => 'mysql',
'url' => env('LEGACY_DATABASE_URL'),
'host' => env('LEGACY_DB_HOST', '127.0.0.1'),
'port' => env('LEGACY_DB_PORT', '3306'),
'database' => env('LEGACY_DB_DATABASE', 'forge'),
'username' => env('LEGACY_DB_USERNAME', 'forge'),
'password' => env('LEGACY_DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([

View File

@ -39,6 +39,7 @@ public function definition()
'created_at' => $created,
'updated_at' => $created,
'legacy_id' => null,
'approved_by' => null,
];
}
}

View File

@ -35,6 +35,7 @@ public function definition()
'email_verified_at' => now(),
'password' => $password,
'remember_token' => Str::random(10),
'legacy_id' => null,
];
}

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('artworks', function (Blueprint $table) {
$table->bigInteger('approved_by')->nullable()->after('filename');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artworks', function (Blueprint $table) {
$table->dropColumn('approved_by');
});
}
};

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('legacy_id')->nullable()->unsigned();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('legacy_id');
});
}
};

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('artworks', function (Blueprint $table) {
$table->string('legacy_filename')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artworks', function (Blueprint $table) {
$table->dropColumn('legacy_filename');
});
}
};

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('theme')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('theme');
});
}
};

View File

@ -25,7 +25,7 @@ public function run(): void
{
//$this->populateLegacyArtworks();
//die();
$current_page = 283;
$current_page = 0;
$totalArtworks = 0;
$missingArtworks = 0;
$missingModel = 0;

990
site/public/adm/adminer.css Normal file
View File

@ -0,0 +1,990 @@
/** theme "easy on the eyes" for Adminer by p.galkaev@miraidenshi-tech.jp */
@import url(//fonts.googleapis.com/css?family=Source+Sans+Pro:400,900);
/* reset
----------------------------------------------------------------------- */
*,
*:after,
*:before {
margin: 0;
padding: 0;
outline: none;
cursor: default;
-webkit-appearance: none;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
-webkit-print-color-adjust: exact;
}
/* for font awesome */
*:not(.fa) {
font-family: 'Source Sans Pro', sans-serif;
}
#logins a, #tables a, #tables span {
background: none;
}
p,
form
{
margin: 0;
margin-bottom: 20px;
font-size: 14px;
}
p:last-child,
form:last-child
{
margin-bottom: 0;
}
.type,
.options select
{
width: 100%;
}
sup{
display: none;
}
/* js tooltip
----------------------------------------------------------------------- */
.js .column {
position: absolute;
padding: 0;
margin-top: 0;
top: 50px;
z-index: 9;
left: 0px;
width: 100%;
}
.js .column:not(.hidden){
display: flex;
}
.js .column a{
text-align: center;
color: black;
font-weight: bold;
flex-grow: 1;
background: #fb4;
height: 40px;
line-height: 40px;
font-size: 15px;
font-weight: normal;
}
.js .column a:hover{
background-color: gold;
color: black;
}
#help {
position: absolute;
border: none;
background: #fb4;
font-family: monospace;
z-index: 1;
font-size: 14px;
line-height: 30px;
padding: 0;
}
#help a{
color: black;
height: 100%;
display: block;
padding: 0 10px;
}
#help a:hover{
background-color: gold;
}
#help, .js .column{
display: none;
}
/* error and message
----------------------------------------------------------------------- */
.error, .message {
padding: 5px 15px 7px;
margin: 10px 0;
font-size: 14px;
display: table;
border-radius: 3px;
color: white;
}
.error{
background-color: crimson;
}
.message{
background-color: seagreen;
}
/* scroll bar
----------------------------------------------------------------------- */
::selection {
background-color: #2a65ae;
}
/*
::-moz-selection {
background-color: #333;
}*/
/* scroll bar
----------------------------------------------------------------------- */
::-webkit-scrollbar {
background-color: black;
cursor: pointer;
}
::-webkit-scrollbar-thumb {
background-color: #555;
cursor: pointer;
}
::-webkit-scrollbar:vertical{
width: 6px;
}
::-webkit-scrollbar-thumb:vertical{
border-left: 0px solid black;
width: 6px;
}
::-webkit-scrollbar:horizontal{
height: 6px;
}
::-webkit-scrollbar-thumb:horizontal{
border-top: 0px solid black;
height: 6px;
}
::-webkit-scrollbar-corner{
color: black;
background-color: black;
border-color: black;
}
::-webkit-resizer{
background-color: #555;
border-radius: 100%;
}
/* html and body
----------------------------------------------------------------------- */
html,
body {
width: 100%;
height: 100%;
max-height: 100%;
overflow: hidden;
}
body{
min-height: 100%;
font-size: 14px;
position: relative;
color: #ccc;
background-color: black;
overflow: hidden;
display: flex;
flex-wrap: nowrap;
font: inherit;
}
/* headings
----------------------------------------------------------------------- */
h1{
font-size: 24px;
margin: 0;
padding: 0 18px;
border-bottom: 1px solid #444;
font-weight: bold;
height: 70px;
line-height: 70px;
color: #555;
background: none;
}
h2{
font-size: 24px;
margin: 0;
padding: 0;
padding-left: 50px;
border-bottom: 1px solid #333;
color: #2CC990;
font-weight: bold;
background: none;
height: 70px;
line-height: 70px;
text-transform: uppercase;
}
h3{
font-weight: bold;
font-size: 24px;
margin: 40px 0 10px;
color: #2CC990;
padding-bottom: 5px;
}
/* links
----------------------------------------------------------------------- */
a{
color: inherit;
cursor: pointer;
}
a:hover, a:visited{
color: inherit;
}
a:link:hover, a:visited:hover {
color: inherit;
text-decoration: none;
}
/* table
----------------------------------------------------------------------- */
table{
margin: 0;
margin-bottom: 20px;
border: 0;
border-collapse: collapse;
font-size: 13px;
width: 100%;
/*table-layout: fixed;*/
}
tr:hover th,
.checked th
{
background: #333 !important;
color: #ddd;
border-color: none;
}
tr:hover td,
.checked td
{
background: #222 !important;
color: #ddd;
border-color: none;
}
.links + table tr:hover th{
color: #ddd;
background: #336f5a !important;
}
.links + table tr:hover td{
background: #2CC990 !important;
color: #333;
}
p + table{
margin-top: 20px;
}
tr{
padding-bottom: 1px;
}
td, th {
border: 0;
border-right: 1px solid #333;
padding: 0 12px;
line-height: 30px;
position: relative;
}
td:last-child,
th:last-child{
border-right: none;
}
th{
position: relative;
background: #222;
font-weight: normal;
width: 17%;
border-left: 5px solid #336f5a;
border-bottom: 1px solid rgba(255, 255, 255, .13);
color: #999;
}
.checkable td:first-child{
background: #222;
border-right-style: solid;
}
table.checkable th{
border-left: none;
}
td{
background: #000;
border-bottom: 1px solid rgba(255, 255, 255, .1);
}
.odd th{
background: #222;
}
.odd td{
background: #000;
}
thead td,
thead th
{
background: transparent !important;
color: #ccc;
border-right-style: dashed;
font-weight: bold;
}
table#edit-fields td,
table#edit-fields th
{
padding: 0;
padding-left: 5px;
}
table#edit-fields thead th,
table#edit-fields thead td
{
padding-left: 10px;
}
thead tr:hover th,
thead tr:hover td,
.links + table thead tr:hover th,
.links + table thead tr:hover td,
table#edit-fields thead tr:hover th,
table#edit-fields thead tr:hover td
{
background-color: transparent !important;
color: inherit !important;
border-bottom: 1px solid rgba(255, 255, 255, .1) !important;
}
thead tr:hover th{
border-bottom: 1px solid rgba(255, 255, 255, .13) !important;
}
thead th {
border-left-color: transparent;
text-align: left;
padding: 10px;
}
/* form
----------------------------------------------------------------------- */
input,
select,
textarea
{
color: #333;
font-size: 15px;
height: 30px;
background-color: #ddd;
border: none;
border-radius: 3px;
line-height: 28px;
cursor: pointer;
padding: 0;
padding-left: 10px;
-webkit-appearance: none;
outline: none;
}
input:hover,
select:hover,
input:focus,
select:focus
{
background-color: #bbb;
}
th input,
td input,
th select,
td select,
td textarea
{
background-color: transparent;
color: pink;
width: 100%;
display: inline;
border-left: 1px dashed #555;
border-radius: 0;
}
th input:hover,
th select:hover,
td input:hover,
td select:hover,
th input:focus,
th select:focus,
td input:focus,
td select:focus
{
background-color: rgba(255, 255, 255, .15);
}
th input[type='checkbox'],
th input[type='radio'],
td input[type='checkbox'],
td input[type='radio']{
border-left: none;
background-color: transparent !important;
}
td input + a,
td input + a:visited
{
text-transform: uppercase;
margin-left: 5px;
color: dodgerblue;
font-size: 12px;
font-weight: normal;
}
td input + a:hover{
color: lightskyblue !important;
}
input.icon{
padding-left: 0;
}
input.icon::after{
content: '';
}
th select,
td select
{
color: lightcoral;
}
input[type='number'] {
min-width: 55px;
}
/* radio */
input[type='radio']{
-webkit-appearance: radio;
width: 18px;
height: 18px;
vertical-align: middle;
margin-left: 8px;
margin-right: 0;
}
/* checkbox */
input[type='checkbox']{
width: 30px;
height: 30px;
margin-right: 6px;
position: relative;
border-radius: 2px;
margin-left: 20px;
}
input[type=checkbox]:hover{
border-color: white;
}
input[type=checkbox]::after {
cursor: pointer;
position: absolute;
content: '×';
left: 17%;
top: 4.5%;
color: #ccc;
font-size: 35px;
font-family: sans-serif;
font-weight: bold;
}
input[type=checkbox]:hover::after {
color: #aaa;
}
input[type=checkbox]:checked::after {
color: #333;
}
td input[type='checkbox'],
th input[type='checkbox']
{
margin-left: 10px;
margin-right: 26px;
}
td input[type='checkbox']::after{
left: 10%;
top: -2px;
color: #333;
}
td input[type='checkbox']:hover::after{
color: #555;
}
td input[type='checkbox']:checked::after{
color: #ddd;
}
p input:first-child{
margin-left: 8px;
}
label{
line-height: 27px;
font-size: 14px;
}
th label{
line-height: 35px;
}
label input {
vertical-align: top;
}
/* submit */
input[type='submit']{
color: white;
background-color: royalblue;
padding: 0 25px;
margin-right: 20px;
border-radius: 2px;
}
input[type='submit']:hover{
background-color: #214ac5;
}
/* select */
select{
padding-left: 6px;
}
/* textarea */
textarea{
min-height: 150px;
width: 100%;
}
/* fieldset */
fieldset {
display: inline;
vertical-align: top;
padding: 4px 7px 7px;
margin: 0 5px 10px;
border: 1px dashed #555;
border-radius: 2px;
min-height: 60px;
}
fieldset > div{
display: flex;
}
fieldset > div * + p{
margin-left: 10px;
}
fieldset > div > div{
margin-left: 10px;
}
fieldset > div > div:first-child{
margin-left: 0;
}
fieldset > div input,
fieldset > div select
{
margin-right: 5px;
}
fieldset > div input[type='checkbox']{
margin-left: 5px;
}
fieldset input{
flex-grow: 1;
}
fieldset input[type='submit']{
margin-right: 10px;
}
fieldset input[type='submit']:last-of-type{
margin-right: 0;
}
legend{
font-size: 14px;
background-color: #000;
padding: 0 3px;
color: #999;
}
/* menu
----------------------------------------------------------------------- */
#menu{
height: 100%;
width: 300px;
background-color: #333;
position: relative;
order: 1;
flex-grow: 0;
flex-shrink: 0;
margin: 0;
padding: 0;
top: 0;
overflow-y: overlay;
}
#menu p {
padding: 18px;
margin: 0;
border-bottom: 1px solid #444;
}
/* logo */
#h1{
color: #555;
text-decoration: none;
font-style: inherit;
}
.version {
color: #555;
font-size: inherit;
}
/* db select */
#dbs select{
width: 228px;
margin-left: 8px;
}
/* links */
#menu .links{
padding-top: 0;
padding-bottom: 10px;
}
#menu .links a:nth-child(even){
margin-left: 6px;
}
#menu .links a{
display: inline-block;
vertical-align: top;
width: 127px;
height: 31px;
margin: 0;
margin-bottom: 10px;
border: 1px solid #555;
line-height: 27px;
text-align: center;
text-transform: uppercase;
font-size: 12px;
border-radius: 3px;
color: #999;
}
#menu .links a.active,
#menu .links a:hover
{
border: 1px solid #ccc;
font-weight: normal;
color: inherit;
}
/* tables */
#logins, #tables{
border-bottom: none;
line-height: 20px;
padding: 18px 0;
overflow-y: auto !important;
}
#tables br{
display: none;
}
#tables a {
float: right;
padding: 5px 18px 9px;
line-height: 17px;
color: #2CC990;
font-size: 13px;
}
#tables .structure, #tables .view {
float: none;
display: block;
color: inherit;
font-size: 14px;
}
#logins a {
display: block;
padding: 5px 18px 9px;
color: inherit;
font-size: 14px;
}
#tables a.select.active,
#tables a.select:hover
{
color: #fba;
}
#logins a:hover,
#tables a[title]:hover,
#tables a.active,
#tables a.select:hover + a,
#tables a.select.active + a
{
background-color: #555;
font-weight: normal;
}
/* content
----------------------------------------------------------------------- */
#content{
height: 100%;
width: 100%;
margin: 0;
padding: 0;
padding-left: 50px;
padding-right: 50px;
padding-bottom: 30px;
overflow-y: auto !important;
order: 2;
flex-grow: 1;
}
#breadcrumb{
position: relative;
display: none;
}
#content h2{
margin-left: -50px;
}
/* links */
#content .links a,
code.jush-sql ~ a,
#fieldset-history > a:first-child
{
display: inline-block;
height: 32px;
line-height: 30px;
padding: 0 10px;
border: 1px solid #666;
border-radius: 3px;
font-size: 12px;
text-transform: uppercase;
}
#content .links a:hover,
code.jush-sql ~ a:hover,
#fieldset-history > a:first-child:hover
{
color: #eee;
border-color: #eee;
}
#ajaxstatus + *{
margin-top: 18px;
}
#ajaxstatus + *.links {
margin-top: 0 !important;
height: 65px;
line-height: 55px;
margin-bottom: 0;
}
#ajaxstatus + .links a{
white-space: nowrap;
margin-right: 20px;
padding: 0;
padding-bottom: 5px;
border: 0;
border-radius: 0;
font-size: 15px;
font-weight: bold;
}
#ajaxstatus + .links a.active,
#ajaxstatus + .links a:hover
{
border-bottom: 1px solid;
border-color: inherit;
color: inherit;
}
/* fieldset search */
#fieldset-search > div > *{
margin-right: 5px;
margin-bottom: 5px;
}
/* fieldset search */
#fieldset-partition p{
margin-bottom: 0;
}
/* feldset history */
#fieldset-history{
flex-wrap: wrap;
}
#fieldset-history i{
display: none;
}
#fieldset-history input[type='submit']{
flex-grow: 0;
order: 1;
margin-top: 1px;
margin-left: 17px;
}
#fieldset-history > div a:last-child{
order: 2;
}
#fieldset-history > a{
flex-grow: 0;
flex-basis: 5%;
min-width: 45px;
text-align: center;
margin-bottom: 10px;
margin-left: 5px;
}
#fieldset-history > .time{
flex-grow: 0;
flex-basis: 5%;
text-align: center;
line-height: 29px;
}
#fieldset-history > code{
flex-grow: 1;
flex-basis: 89%;
line-height: 29px;
}
#fieldset-history > .time{
flex-grow: 0;
flex-basis: 5%;
text-align: center;
}
/* sql
----------------------------------------------------------------------- */
.sqlarea{
border: 1px solid #444 !important;
width: 100% !important;
padding: 12px 15px !important;
font-size: 15px;
margin-bottom: 20px;
}
.jush-sql_code{
color: #fafafa !important;
font-family: 'Source Sans Pro', sans-serif !important;
}
.jush a, .jush a:visited{
color: #fba;
font-weight: normal;
}
.jush a:hover{
color: #fba;
cursor: pointer;
}
.jush-php_quo, .jush-quo, .jush-quo_one, .jush-php_eot, .jush-apo, .jush-sql_apo, .jush-sqlite_apo, .jush-sql_quo, .jush-sql_eot{
color: aquamarine;
}
.jush-bac, .jush-php_bac, .jush-bra, .jush-mssql_bra, .jush-sqlite_quo{
color: plum;
}
.jush-num, .jush-clr{
color: #85E2FF;
}
code {
background: #000;
font-size: 14px;
}
code.jush-sql ~ a{
position: relative;
margin-left: 5px;
/*margin-top: 20px;
margin-bottom: 20px; */
}
code.jush-sql ~ a:first-of-type{
margin-left: 30px;
}
code.jush-sql ~ a:first-of-type::before{
content: '◀';
color: #555;
position: absolute;
left: -22px;
font-size: 22px;
top: -1px;
}
/* logout form
----------------------------------------------------------------------- */
body > form{
position: absolute;
}

1795
site/public/adm/index.php Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.fi-pagination-items,.fi-pagination-overview,.fi-pagination-records-per-page-select:not(.fi-compact){display:none}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width: 28rem){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@container (min-width: 56rem){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:640px){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@media (min-width:768px){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{background-color:#333;border-radius:4px;color:#fff;font-size:14px;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;height:16px;width:16px}.tippy-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.tippy-content{padding:5px 9px;position:relative;z-index:1}.tippy-box[data-theme~=light]{background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;color:#26323d}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-sortable-ghost{opacity:.3}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
function r({state:i}){return{state:i,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=o=>o===null?0:Array.isArray(o)?o.length:typeof o!="object"?0:Object.keys(o).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows),s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.rows=e,this.updateState()},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{["x-on:blur"]:"createTag()",["x-model"]:"newTag",["x-on:keydown"](t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},["x-on:paste"](){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};

View File

@ -0,0 +1 @@
function t({initialHeight:e}){return{init:function(){this.render()},render:function(){this.$el.scrollHeight>0&&(this.$el.style.height=e+"rem",this.$el.style.height=this.$el.scrollHeight+"px")}}}export{t as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
function c(){return{collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,init:function(){this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1})},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){if(this.isLoading=!0,this.areRecordsSelected(this.getRecordsInGroupOnPage(e))){this.deselectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e));return}this.selectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e)),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let s=[];for(let t of this.$root.getElementsByClassName("fi-ta-record-checkbox"))t.dataset.group===e&&s.push(t.value);return s},getRecordsOnPage:function(){let e=[];for(let s of this.$root.getElementsByClassName("fi-ta-record-checkbox"))e.push(s.value);return e},selectRecords:function(e){for(let s of e)this.isRecordSelected(s)||this.selectedRecords.push(s)},deselectRecords:function(e){for(let s of e){let t=this.selectedRecords.indexOf(s);t!==-1&&this.selectedRecords.splice(t,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(s=>this.isRecordSelected(s))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]}}}export{c as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.2 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#E0E0E0;}
.st1{fill:#C1C1C1;}
.st2{fill:#474747;}
.st3{fill:#333333;}
.st4{fill:#5B5B5B;}
</style>
<g id="BULINE">
<circle class="st0" cx="256" cy="256" r="256"/>
</g>
<g id="Icons">
<path class="st1" d="M484.8,371c-20.9,41.3-52.4,76.2-91.5,101.1l-1.6,1l-1.6,1c-6.5,4-13.2,7.7-20,11.1
c-10.2,5.1-20.8,9.5-31.6,13.2c-63.3,21.6-132.6,17.5-193-11.4c-8.1-3.9-16.1-8.2-23.7-13c-0.8-0.5-1.5-0.9-2.2-1.4
c-1-0.6-1.9-1.2-2.9-1.9c-38.1-24.8-69-59.2-89.5-99.8c16-31.8,38.4-59.8,65.9-82.5c11.1-9.2,23-17.5,35.6-24.6
c0.9-0.5,1.8-1,2.7-1.6s2.1-1.1,3.1-1.7c3.6-2,7.3-3.9,11.1-5.6c8.9-4.3,18.1-8,27.5-11.3c2.6-0.9,5.2-1.7,7.8-2.5l0,0l3-0.9
l2.4-0.7c6.7-1.9,13.5-3.5,20.5-4.9c1.7-0.3,3.3-0.6,5-0.9c31.5-5.5,63.7-5,95,1.2c6.9,1.4,13.7,3.1,20.4,5c1.3,0.4,2.7,0.8,4,1.2
c2.3,0.7,4.6,1.4,6.9,2.2c7.9,2.7,15.7,5.7,23.3,9.2c2.9,1.3,5.8,2.7,8.7,4.1c3.2,1.6,6.3,3.3,9.5,5c1,0.5,2,1.1,2.9,1.7
c0.7,0.4,1.3,0.7,2,1.1C427.5,289.6,462.4,326.5,484.8,371z"/>
<path class="st2" d="M433.3,440.6c-12.3,11.8-25.7,22.3-40,31.5l-1.6,1l-1.6,1c-6.5,4-13.2,7.7-20,11.1
c-10.2,5.1-20.8,9.5-31.6,13.2c-63.3,21.6-132.6,17.5-193-11.4c-8.1-3.9-16.1-8.2-23.7-13c-0.8-0.5-1.5-0.9-2.2-1.4
c-1-0.6-1.9-1.2-2.9-1.9c-12.4-8.1-24.1-17.2-35-27.3l11.4-155l5.7-77.8c7.7-104.8,59.6-183.4,121-183.4h75.7
c61.5,0,113.3,78.6,121,183.4l5.9,80.7L433.3,440.6z"/>
<path class="st3" d="M370.1,100.8v384.4c-10.2,5.1-20.8,9.5-31.6,13.2C275.2,520,205.9,515.9,145.6,487V122.3l0,0v-21.5H370.1z"/>
<path class="st4" d="M391.7,473.1l-1.6,1c-6.5,4-13.2,7.7-20,11.1c-10.2,5.1-20.8,9.5-31.6,13.2c-63.3,21.6-132.6,17.5-193-11.4
c-8.1-3.9-16.1-8.2-23.7-13c3.2-3.8,6.6-7.4,10.1-10.8c0.5-0.5,1-1,1.6-1.5c2.4-2.3,4.9-4.5,7.6-6.6c1.4-1.2,2.9-2.3,4.4-3.5l0,0
c1.8-1.3,3.6-2.6,5.4-3.9c7.2-5,14.8-9.3,22.8-13.1c8.8-4.2,42.1-10.4,48.4-17.7c1.1-1.3,2-2.7,2.6-4.3c3.5-8.4,1.2-20.1,1.2-29.1
c0-2.7,0-5-0.1-7.1l0,0c-0.6-21.3-2.9-14.7,15.5-20.9c2.1-0.5,4.2-0.8,6.4-0.9c13.9-1.4,44.9-2.5,48.6,0.9c2.8,2.6,3.4,7.9,3,14.2
c-0.7,12.6-5,29.3-2,37c0.8,2.1,1.8,4,3,5.9c7.7,11.6,20.7,12.4,35.7,19.3c9.8,4.5,19.2,10,28.1,16.2c2.1,1.4,4.1,2.9,6,4.4
c0.8,0.6,1.5,1.2,2.2,1.8c3.2,2.6,6.3,5.3,9.3,8.1c0.7,0.7,1.5,1.4,2.2,2.1C386.5,467.4,389.2,470.2,391.7,473.1z"/>
<path class="st4" d="M382.6,173.1v84.4c0,63-50.1,83.1-86.6,115.1c-21.3,19-53.6,19-74.9,0c-36.5-32-86.6-52.2-86.6-115.1v-84.4
c0-63.5,48.5-115,108.4-115h31.4C334.1,58.1,382.6,109.6,382.6,173.1z"/>
<path class="st3" d="M183.9,257.5v-84.4c0-60.3,43.7-109.7,99.3-114.6c-3-0.3-6-0.4-9-0.4h-31.4c-59.9,0-108.4,51.5-108.4,115v41.8
c-13.7,0-24.8,11.1-24.8,24.8s11.1,24.8,24.8,24.8h0.2c3.6,57.5,51.2,77.3,86.4,108.1c17.8,15.6,42.1,18.5,62.2,8.5
c-4.6-2.3-8.8-5.1-12.7-8.5C234,340.7,183.9,320.5,183.9,257.5z"/>
<circle class="st4" cx="382.6" cy="239.7" r="24.8"/>
<path class="st2" d="M135.1,229.9c-5.5-0.2-10,4.1-10.2,9.6c-0.2,5.5,4.1,10,9.6,10.2c0.2,0,0.4,0,0.6,0V229.9z"/>
<path class="st3" d="M382.6,249.6c5.5,0.2,10-4.1,10.2-9.6c0.2-5.5-4.1-10-9.6-10.2c-0.2,0-0.4,0-0.6,0V249.6z"/>
<path class="st2" d="M327.5,100.8c0,0-10.9,31.5-62,49.2v-40.1c0,0-6,35.1-68.5,54V133c0,0-13.1,33.3-62.5,66l-9.2-13.4l4.9-75.7
L168,61.4l47.4-12.7h68.6l43.5,3.8L364,89.6c0,0,27.1,36.4,28.5,74.3C392.5,163.9,353.7,145.5,327.5,100.8z"/>
<path class="st3" d="M145.6,475.4c13,10.8,27.3,20,42.5,27.5c-23.3-6.4-45.6-16.1-66.2-28.8c3.2-3.8,6.6-7.4,10.2-10.9
C135.4,466.5,139.9,470.7,145.6,475.4L145.6,475.4z"/>
<path class="st3" d="M391.7,473.1l-1.6,1c-6.5,4-13.2,7.7-20,11.1c-10.2,5.1-20.8,9.5-31.6,13.2c11.1-6.4,21.7-13.7,31.6-21.8
c4.5-3.7,9.1-7.7,13.7-12C386.5,467.4,389.2,470.2,391.7,473.1z"/>
<path class="st3" d="M260.3,49.4L260.3,49.4c-0.6,0-1.2,0-1.8,0s-1.2,0-1.8,0v0c-107.1,2.2-130.9,102.9-130.9,102.9
C185.5,88.1,242,87.7,256.7,88.9v0.4c0,0,0.6-0.1,1.8-0.2c1.2,0.1,1.8,0.2,1.8,0.2v-0.4c14.6-1.1,71.2-0.7,130.9,63.4
C391.2,152.3,367.4,51.7,260.3,49.4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#E0E0E0;}
.st1{fill:#C1C1C1;}
.st2{fill:#474747;}
.st3{fill:#333333;}
.st4{fill:#F7BB38;}
</style>
<g id="BULINE">
<circle class="st0" cx="256" cy="256" r="256"/>
</g>
<g id="Icons">
<path class="st1" d="M484.8,371c-20.7,41.2-52.2,76-91,100.8c-1.2,0.8-2.4,1.5-3.6,2.3c-2.1,1.3-4.2,2.5-6.3,3.8
c-31.1,17.9-65.6,29.1-101.2,32.8c-8.8,0.9-17.7,1.4-26.5,1.4c-6.5,0-12.9-0.2-19.3-0.7c-37.7-2.8-74.3-13.9-107.2-32.6l-1.6-0.9
c-2.8-1.6-5.6-3.3-8.4-5.1l-2.3-1.5C78.9,446.4,47.8,411.8,27.2,371c20.5-40.7,51.6-75.2,89.9-100c3.9-2.5,7.8-4.9,11.8-7.2
c16.2-9.3,33.4-16.8,51.2-22.3l0.6-0.2l0,0c0.7-0.2,1.4-0.4,2.1-0.6c6.2-1.8,12.5-3.5,18.9-4.8c3.3-0.7,6.7-1.4,10-2
c28.7-5,58.1-5.1,86.8-0.3c3.6,0.6,7.2,1.3,10.8,2.1c6.3,1.3,12.6,2.9,18.7,4.7c1.5,0.4,2.9,0.9,4.4,1.3
c18.5,5.8,36.4,13.7,53.1,23.5c3.5,2.1,7,4.2,10.4,6.5C433.7,296.4,464.4,330.6,484.8,371z"/>
<path class="st2" d="M383.8,477.9c-31.1,17.9-65.6,29.1-101.2,32.8c-8.8,0.9-17.7,1.4-26.5,1.4c-6.5,0-12.9-0.2-19.3-0.7
c-37.7-2.8-74.3-13.9-107.2-32.6l-1.6-0.9c0.5-0.5,1.1-1,1.6-1.5c0.9-0.9,1.9-1.7,2.8-2.5c0.2-0.2,0.4-0.4,0.6-0.5
c0.9-0.8,1.8-1.6,2.8-2.3c3.2-2.7,6.6-5.2,10.1-7.6c7.5-5.1,15.3-9.6,23.5-13.5c4.2-1.7,8.4-3.1,12.8-4.2c8.5-2.4,19-5.2,26.8-8.2
c2.5-0.9,4.9-2,7.2-3.4l0,0c1.2-0.7,2.3-1.5,3.2-2.5c1.1-1.3,2-2.8,2.7-4.5c3.6-8.6,1.2-20.9,1.2-30.1c0-2.8-0.1-5.2-0.1-7.4l0,0
c-0.6-22-3-15.2,16.1-21.6c2.2-0.5,4.4-0.8,6.6-1l0,0c14.4-1.4,46.4-2.6,50.3,1c2.9,2.7,3.5,8.2,3.1,14.7
c-0.7,13-5.2,30.3-2.1,38.3c0.8,2.1,1.9,4.2,3.1,6.1c0.5,0.8,1.1,1.6,1.7,2.3c0.4,0.5,0.8,0.9,1.2,1.3c0.2,0.3,0.5,0.5,0.7,0.8
s0.6,0.5,0.9,0.8l0.1,0.1l0,0l0.2,0.2l0.2,0.2c0.3,0.2,0.6,0.5,0.9,0.7c0.2,0.2,0.4,0.3,0.5,0.4c1.4,1.1,2.9,2,4.5,2.8
c0.6,0.3,1.2,0.6,1.8,0.9s1.3,0.6,2,0.9s1.5,0.6,2.3,1c0.4,0.1,0.8,0.3,1.2,0.5c1.9,0.7,3.8,1.4,5.8,2.1c0.4,0.1,0.8,0.3,1.2,0.4
l1.1,0.4c0.4,0.1,0.8,0.3,1.1,0.4l1.6,0.6c0.8,0.3,1.6,0.6,2.5,1c0.7,0.2,1.3,0.5,2,0.8s1.1,0.5,1.6,0.7s1.2,0.5,1.8,0.8h0.1l0,0
c10.1,4.7,19.8,10.3,29,16.7c3,2.1,5.8,4.2,8.5,6.5C378,472.6,380.9,475.2,383.8,477.9z"/>
<path class="st2" d="M385.5,179.2v87.3c0,65.1-51.8,86-89.6,119.1c-22.1,19.7-55.4,19.7-77.5,0c-37.8-33.1-89.6-54-89.6-119.1
v-87.3c0-65.7,50.2-119,112.1-119h32.5C335.4,60.3,385.5,113.5,385.5,179.2z"/>
<path class="st3" d="M180.1,266.5v-87.3c0-62.3,45.2-113.5,102.7-118.5c-3.1-0.3-6.2-0.4-9.4-0.4H241c-61.9,0-112.1,53.3-112.1,119
v43.2c-14.2,0.3-25.5,12-25.2,26.2c0.3,13.8,11.4,24.9,25.2,25.2h0.2c3.7,59.5,53,80,89.4,111.8c18.4,16.1,43.5,19.1,64.3,8.8
c-4.7-2.3-9.2-5.3-13.1-8.8C231.9,352.5,180.1,331.6,180.1,266.5z"/>
<circle class="st2" cx="385.5" cy="248.1" r="25.7"/>
<path class="st2" d="M129.6,237.9c-5.6-0.2-10.4,4.3-10.5,9.9s4.3,10.4,9.9,10.5c0.2,0,0.4,0,0.6,0V237.9z"/>
<path class="st3" d="M385.6,258.3c5.6-0.2,10.1-4.9,9.9-10.5c-0.2-5.4-4.5-9.7-9.9-9.9V258.3z"/>
<path class="st4" d="M383.8,477.9c-31.1,17.9-65.6,29.1-101.2,32.8c-8.8,0.9-17.7,1.4-26.5,1.4c-6.5,0-12.9-0.2-19.3-0.7
c-37.7-2.8-74.3-13.9-107.2-32.6l-1.6-0.9c0.5-0.5,1.1-1,1.6-1.5c0.9-0.9,1.9-1.7,2.8-2.5c0.2-0.2,0.4-0.4,0.6-0.5
c0.9-0.8,1.8-1.6,2.8-2.3c3.2-2.7,6.6-5.2,10.1-7.6c7.5-5.1,15.3-9.6,23.5-13.5c4.2-1.7,8.4-3.1,12.8-4.2c8.5-2.4,19-5.2,26.8-8.2
v22.5l34.7,18.5c2.5,2.1,8.8,3.1,15.1,3.2l0,0c0.6,0,1.2,0,1.7,0l0,0c6-0.1,11.8-1.2,14.1-3.1l27.3-18.5v-30.5
c0.4,0.5,0.8,0.9,1.2,1.3c0.2,0.3,0.5,0.5,0.7,0.8s0.6,0.5,0.9,0.8l0.1,0.1l0,0c0,0.1,0.1,0.1,0.2,0.1l0.2,0.2
c0.3,0.2,0.6,0.5,0.9,0.7c0.2,0.2,0.4,0.3,0.5,0.4c1.4,1.1,2.9,2,4.5,2.8c0.6,0.3,1.2,0.6,1.8,0.9s1.3,0.6,2,0.9s1.5,0.6,2.3,1
c0.4,0.1,0.8,0.3,1.2,0.5c1.9,0.7,3.8,1.4,5.8,2.1c0.4,0.1,0.8,0.3,1.2,0.4l1.1,0.4c0.4,0.1,0.8,0.3,1.1,0.4l1.6,0.6
c0.8,0.3,1.6,0.6,2.5,1c0.7,0.2,1.3,0.5,2,0.8s1.1,0.5,1.6,0.7s1.2,0.5,1.8,0.8h0.1l0,0c10.1,4.7,19.8,10.3,29,16.7
c3,2.1,5.8,4.2,8.5,6.5C378,472.6,380.9,475.2,383.8,477.9z"/>
<path class="st3" d="M375.4,120.2c0,0,2.2-36.1-23.2-59.9l-3.7,14.2c0,0-17.1-38-55.6-43.6l1.4,12c0,0-50.2-21.1-90.4-12l19.9,14.8
c0,0-38.4,1.2-60.1,14.7c0,0,10.5,8.4,15.8,15.3c-33.1,21.7-55.2,60.6-55.2,104.9l4.6,44.8l19.7-68.1c0,0,4.8-46.5,43.6-54.2
c13.8-2.7,28,1.2,39.2,9.7c6.7,5.3,14.9,8.4,23.4,8.8l0,0h1.4l0,0c8.5-0.5,16.7-3.5,23.4-8.8c11.2-8.5,25.4-12.4,39.2-9.7
c38.8,7.7,43.6,54.2,43.6,54.2l27.3,72.4l0.5-11.8v-37.3C390.2,159.5,385.1,138.8,375.4,120.2z"/>
<path class="st2" d="M309.7,51.2c0.8,8.8-0.1,21.4-9,31c-0.9,0.9-0.8,2.3,0.1,3.2c0.5,0.4,1.1,0.7,1.7,0.6
c5.9-0.4,14.6-1.6,19.4-5.2c1-0.8,2.4-0.6,3.2,0.4c0.1,0.2,0.2,0.3,0.3,0.5c1.2,3.1,2.7,8.2,2,13.1c-0.2,1.2,0.7,2.4,1.9,2.5
c0.8,0.1,1.6-0.2,2.1-0.9c4.3-5.2,7.9-14.6,2.5-30.1c-0.4-1.2-1.7-1.8-2.9-1.4c-0.4,0.1-0.8,0.4-1.1,0.8l-0.8,1.1
c-0.7,1-2.1,1.2-3.1,0.5c-0.2-0.1-0.4-0.3-0.5-0.5l-11.7-16.9c-0.7-1-2.1-1.3-3.1-0.6C310,49.6,309.6,50.4,309.7,51.2z"/>
<path class="st2" d="M383.8,477.9c-31.1,17.9-65.6,29.1-101.2,32.8c-8.8,0.9-17.7,1.4-26.5,1.4c-6.5,0-12.9-0.2-19.3-0.7
c-37.7-2.8-74.3-13.9-107.2-32.6v-2.4c0.9-0.9,1.9-1.7,2.8-2.5c0.2-0.2,0.4-0.4,0.6-0.5c0.9-0.8,1.8-1.6,2.8-2.3
c3.2-2.7,6.6-5.2,10.1-7.6c7.5-5.1,15.3-9.6,23.5-13.5c4.2-1.7,8.4-3.1,12.8-4.2c8.5-2.4,19-5.2,26.8-8.2v22.5l34.7,18.5
c2.5,2.1,8.8,3.1,15.1,3.2l0,0c0.6,0,1.2,0,1.7,0l0,0c6-0.1,11.8-1.2,14.1-3.1l27.3-18.5v-23.3h9.1c0.6,0.3,1.2,0.6,1.8,0.9
s1.3,0.6,2,0.9s1.5,0.6,2.3,1c0.4,0.1,0.8,0.3,1.2,0.5c1.9,0.7,3.8,1.4,5.8,2.1c0.4,0.1,0.8,0.3,1.2,0.4l1.1,0.4
c0.4,0.1,0.8,0.3,1.1,0.4l1.6,0.6c0.8,0.3,1.6,0.6,2.5,1c0.7,0.2,1.3,0.5,2,0.8s1.1,0.5,1.6,0.7s1.2,0.5,1.8,0.8h0.1l0,0
c10.1,4.7,19.8,10.3,29,16.7c3,2.1,5.8,4.2,8.5,6.5C378,472.6,380.9,475.2,383.8,477.9z"/>
<path class="st2" d="M259.6,480.6l-0.6,0.9l0,0l-22.2,29.8c-10.7-0.8-21.4-2.3-31.9-4.4l-22.2-58.5c-1.1-2.9,0.2-6.2,3-7.5
l21.6-10.3c2.3-1.1,5-0.6,6.8,1.2l2.3,2.3l0,0C229.1,447.1,259.6,480.6,259.6,480.6z"/>
<path class="st2" d="M337.4,447c-0.1,0.5-0.2,0.9-0.3,1.4L315.6,505c-10.9,2.6-22,4.5-33.1,5.6l-21.8-29.2l-0.6-0.9
c0,0,28.6-31.5,42.1-45.4c1.1-1.1,2-2.1,2.9-3l0,0l0.6-0.6c1.8-1.8,4.5-2.3,6.8-1.2l21.6,10.3C336.4,441.9,337.8,444.4,337.4,447z"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -4,11 +4,33 @@ import.meta.glob([
'../fonts/**'
]);
import Alpine from 'alpinejs';
import { Livewire, Alpine } from '../../vendor/livewire/livewire/dist/livewire.esm';
//import Alpine from 'alpinejs';
window.Alpine = Alpine;
Alpine.start();
Livewire.start();
import './main';
(function ($) {
eqHeightWalletLeaderboard();
$(window).resize(function() {
eqHeightWalletLeaderboard();
});
function eqHeightWalletLeaderboard() {
let walletHeight = 0;
let leaderboardHeight = 0;
$('section.wallet-setup .card-block-style-one').each(function() {
if ($(this).outerHeight() > walletHeight) {
walletHeight = $(this).outerHeight();
}
});
$('.top-seller-style-one').each(function() {
if ($(this).outerHeight() > leaderboardHeight) {
leaderboardHeight = $(this).outerHeight();
}
})
$('section.wallet-setup .card-block-style-one').css('min-height', walletHeight + 'px');
$('.top-seller-style-one').css('min-height', leaderboardHeight + 'px');
}
})(jQuery, window);

View File

@ -1,12 +1,10 @@
(function ($) {
"use strict";
var banu = {
m: function (e) {
banu.d();
banu.methods();
},
d: function (e) {
(this._window = $(window)),
(this._document = $(document)),
@ -129,7 +127,6 @@
$(".single-filter > .title").on("click", function (e) {
e.preventDefault();
$(".sidebar-submenu").slideUp(200);
if ($(this).parent().hasClass("active")) {
$(".sidebar-dropdown").removeClass("active");
$(this).parent().removeClass("active");
@ -225,10 +222,10 @@
});
$(".slick-activation-001").slick({
// infinite: true,
infinite: true,
slidesToShow: 4,
slidesToScroll: 1,
autoplay: true,
slidesToScroll: 3,
autoplay: false,
autoplaySpeed: 3000,
dots: false,
arrows: true,
@ -243,7 +240,7 @@
breakpoint: 1919,
settings: {
slidesToShow: 4,
slidesToScroll: 1,
slidesToScroll: 3,
centerPadding: "120px",
},
},
@ -251,6 +248,7 @@
breakpoint: 1499,
settings: {
slidesToShow: 3,
slidesToScroll: 2,
centerPadding: "60px",
},
},
@ -258,12 +256,14 @@
breakpoint: 1199,
settings: {
slidesToShow: 3,
slidesToScroll: 2,
},
},
{
breakpoint: 991,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
centerPadding: "1px",
},
},
@ -280,53 +280,6 @@
],
});
$(".top-seller-activation-1").slick({
infinite: true,
slidesToShow: 6,
slidesToScroll: 1,
dots: false,
arrows: true,
cssEase: "linear",
adaptiveHeight: true,
prevArrow:
'<button class="slide-arrow prev-arrow"><i class="ri-arrow-left-line"></i></button>',
nextArrow:
'<button class="slide-arrow next-arrow"><i class="ri-arrow-right-line"></i></button>',
responsive: [
{
breakpoint: 1499,
settings: {
slidesToShow: 5,
},
},
{
breakpoint: 1124,
settings: {
slidesToShow: 4,
slidesToScroll: 1,
},
},
{
breakpoint: 991,
settings: {
slidesToShow: 3,
slidesToScroll: 1,
},
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
dots: false,
arrows: false,
centerMode: true,
centerPadding: "20px",
},
},
],
});
$(".popular-collection-active").slick({
infinite: true,
slidesToShow: 3,
@ -432,9 +385,10 @@
});
$(".slider-activation-banner-4").slick({
infinite: false,
slidesToShow: 2,
slidesToScroll: 1,
autoplay: false,
autoplay: true,
dots: true,
arrows: false,
cssEase: "linear",
@ -444,21 +398,24 @@
// autoplaySpeed: 2000,
responsive: [
{
breakpoint: 1919,
breakpoint: 1200,
settings: {
slidesToShow: 2,
slidesToScroll: 1
},
},
{
breakpoint: 1499,
breakpoint: 1199,
settings: {
slidesToShow: 2,
slidesToShow: 3,
slidesToScroll: 1
},
},
{
breakpoint: 575,
breakpoint: 890,
settings: {
slidesToShow: 1,
slidesToShow: 2,
slidesToScroll: 1
},
},
],
@ -509,6 +466,7 @@
},
],
});
$(".nft-gallery-activation").slick({
// infinite: true,
slidesToShow: 7,
@ -636,7 +594,7 @@
});
// init Isotope
var $grid = $(".mesonry-list").isotope({
var $grid = $(".masonry-list").isotope({
percentPosition: true,
transitionDuration: "0.7s",
layoutMode: "masonry",

View File

@ -73,3 +73,4 @@ Modified by : Paul Couture (bonked@noagendaartgenerator.com)
@import "components/nft-gallery";
@import "./../css/vendor/nice-select.css";
@import "components/light-version";
@import "components/pagination";

View File

@ -4,6 +4,11 @@
padding: 15px;
border-radius: 10px;
transition: 0.3s;
border: 1px solid $bg-color-1;
&.selected {
background: $bg-color-selected;
border-color: $selected-border;
}
.thumb {
position: relative;
overflow: hidden;
@ -104,12 +109,16 @@
}
transition: 0.3s;
&:hover {
border: 1px solid $color-error;
.thumb {
img {
transform: scale(1.21);
transform: scale(1.1);
}
}
}
&.selected:hover {
border-color: lighten($selected-border, 10%);
}
}
.reaction-btn {

View File

@ -35,7 +35,7 @@
font-weight: 400;
}
.upload-area .brows-file-wrapper {
.upload-area .browse-file-wrapper {
position: relative;
background: #1a1a1a;
border-radius: 10px;
@ -44,7 +44,7 @@
background: #000;
}
}
.upload-area .brows-file-wrapper input {
.upload-area .browse-file-wrapper input {
position: absolute;
height: 100%;
width: 100%;

View File

@ -255,6 +255,15 @@ body {
color: $color-primary;
}
}
.explore-style-one {
border: 1px solid $border-color-light;
&.selected {
background: $bg-color-selected-light;
}
&:hover {
border: 1px solid $color-error;
}
}
.explore-style-two,
.signin-form,
.signup-wrapper.header-free-signin .signin-form-2 {
@ -413,7 +422,7 @@ body {
.popular-collection-style-two,
.wallet-block,
.form-field-wrapper,
.upload-area .brows-file-wrapper,
.upload-area .browse-file-wrapper,
.signup-content,
.contact-inner-contnet {
background: #fff;

View File

@ -0,0 +1,80 @@
.pagination {
.page-item {
a {
&.page-link {
color: $body-color;
background-color: $bg-color-1;
border-color: $body-bg;
transition: transform 0.5s;
&:hover,
&:focus {
background: linear-gradient(97.3deg, #ff512f 0%, #dd2476 100%);
border-color: $bg-color-1;
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(97.3deg, #dd2476 0%, #ff512f 100%);
transition: transform 0.5s;
transform-origin: right;
transform: scaleX(0);
z-index: 0;
border-radius: inherit;
}
}
}
}
}
.page-item.disabled .page-link {
background-color: $bg-color-1;
border-color: $body-bg;
cursor: default;
}
.page-item.active .page-link {
background: linear-gradient(97.3deg, #ff512f 0%, #dd2476 100%);
border-color: $body-bg;
cursor: default;
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(97.3deg, #dd2476 0%, #ff512f 100%);
transition: transform 0.5s;
transform-origin: right;
transform: scaleX(0);
z-index: 0;
border-radius: inherit;
}
}
}
.theme-light {
.pagination {
.page-item {
a {
&.page-link {
color: $body-light;
background-color: $body-bg-light2;
border-color: $body-bg-light;
&:hover,
&:focus {
border-color: $body-bg-light;
color: $body-bg-light;
}
}
}
}
.page-item.disabled .page-link {
background-color: $body-bg-light2;
border-color: $body-bg-light;
}
.page-item.active .page-link {
border-color: $body-bg-light;
}
}
}

View File

@ -35,6 +35,9 @@
color: $body-color;
line-height: 27px;
}
h4 {
font-size: 80%;
}
&:hover {
.thumb {
transform: scale(1.1);
@ -82,6 +85,7 @@
border-radius: 10px;
padding: 28px 26px 28px 30px;
transition: 0.3s;
font-size:85%;
@include xs-device {
padding: 15px;
}
@ -136,6 +140,10 @@
font-size: 14px;
}
}
sup {
font-weight: normal;
font-size:50%;
}
}
.price {
font-size: 15px;

View File

@ -1,3 +1,10 @@
.wallet-setup {
background-repeat: no-repeat;
background-position: center center;
background-attachment: fixed;
background-size: cover;
background-image: url(../img/headerbg-dark.jpg);
}
.card-block-style-one {
background: $bg-color-1;
padding: 40px;
@ -21,3 +28,8 @@
}
}
}
.theme-light {
.wallet-setup {
background-image: url(../img/headerbg.jpg);
}
}

View File

@ -57,6 +57,17 @@
min-height: 36px;
}
}
.btn-xs {
font-size: 12px;
padding: 1px 12px;
height: 32px;
min-height: 32px;
@include tiny-device {
font-size: 15px;
height: 34px;
min-height: 34px;
}
}
.btn-outline {
border: 2px solid rgba(255, 255, 255, 0.7);

View File

@ -2,7 +2,7 @@
background: #202027;
}
.section-bg-separation-2 {
background: #000;
background: darken($bg-color-1, 10%);
}
.d-flex-center {
display: flex;

View File

@ -14,6 +14,12 @@
z-index: 999999;
background: $bg-color-1;
}
body.theme-light {
#ctn-preloader,
.ctn-preloader {
background-color: $body-bg-light2;
}
}
.ctn-preloader .animation-preloader {
position: absolute;
@ -50,9 +56,9 @@
height: 9px;
top: 12px;
left: 0;
box-shadow: 0 0 10px #dd2476;
box-shadow: 0 0 10px $color-primary-2;
border-radius: 50%;
background: -webkit-linear-gradient(#ff512f, #dd2476);
background: -webkit-linear-gradient($color-primary, $color-primary-2);
}
@keyframes spinner {

View File

@ -139,3 +139,6 @@ ol {
line-height: 24px;
}
}
.text-justify {
text-align: justify;
}

View File

@ -14,6 +14,11 @@ $body-light: #393939;
$body-bg-light: #f9f9fc;
$body-bg-light2: #efefef;
$body-color-light: #65676b;
$light-color-primary: lighten($color-primary, 30%);
$light-color-primary-2: lighten($color-primary-2, 30%);
$selected-border: #eae156;
$bg-color-selected: linear-gradient(97.3deg, #7f830b 0%, #be8500 100%);
$bg-color-selected-light: linear-gradient(97.3deg, #f8fc9c 0%, #fbe4a1 100%);
// font family
$font-1: "Poppins", sans-serif;

View File

@ -0,0 +1,73 @@
@extends('layouts.master')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Artwork for {{ $artwork->podcast->name }} {{ number_format($artwork->episode->episode_number + 0) }}</h1>
<nav class="mt-4">
<ol class="breadcrumb justify-content-center">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item"><a href="/artworks">Explore Artwork</a></li>
<li class="breadcrumb-item active">Artwork</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="product-details section-bg-separation-2 pt-120 pb-90">
<div class="container">
<div class="row">
<div class="col-xxl-6 mb-6">
<div class="explore-style-one">
<div class="thumb"><a href="http://{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}"
><img id="largeImage"src="http://{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}"
alt="{{ $artwork->title }} by {{ $artwork->artist->name }} for {{ $artwork->podcast->title }}"></a>
</div>
</div>
</div>
<div class="col-xxl-6 mb-6 mb-6">
<div class="details-content">
<h2 class="main_title">&ldquo;{{ $artwork->title }}&rdquo;</h2>
<h4 class="mb-1">By {{ $artwork->artist->name }}</h4>
<p class="subtitle">
{{ $artwork->episode->artwork_id == $artwork->id ? 'Selected' : 'Submitted' }} for {{ $artwork->podcast->name }}<br>
Episode {{ number_format($artwork->episode->episode_number + 0) }}, {{ $artwork->episode->episode_date->format('l, F j') }}<sup>{{ $artwork->episode->episode_date->format('S') }}</sup>, {{ $artwork->episode->episode_date->format('Y') }}
</p>
@if ($artwork->description)
<h4 class="mb-1">Description</h4>
<p class="subtitle">{{ $artwork->description }}</p>
@endif
<a href="http://{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-download-cloud-2-line"></i>
Download Full Scale Image
</span></a>
<a href="http://{{ config('app.static_asset_url') }}/thumbnail/{{ $artwork->filename }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-download-fill"></i>
Download 512px Square Thumbnail
</span></a>
<a href="/artists/{{ $artwork->artist->id }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-user-fill"></i>
View Artist Profile
</span></a>
<a href="/episodes/{{ $artwork->episode->slug }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-headphone-fill"></i>
View This Episode
</span></a>
<a href="/podcasts/{{ $artwork->podcast->slug }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-broadcast-line"></i>
View {{ $artwork->podcast->name }} Podcast
</span></a>
</div>
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,132 @@
@extends('layouts.master')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Submit New Artwork</h1>
<nav class="mt-4">
<ol class="breadcrumb justify-content-center">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item"><a href="/artworks">Explore Artwork</a></li>
<li class="breadcrumb-item active">Create</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90">
<div class="container">
<form action="/create-artwork" method="POST" name="create-artwork" enctype="multipart/form-data">
@csrf
<div class="create-item-wrapper">
@if($errors->any())
<div class="row">
<div class="col">
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
<div class="row">
<div class="col-lg-4">
{{-- file upload area --}}
<div class="upload-area">
<div class="upload-formate mb-6">
<h5 class="title mb-1">
Upload Artwork File
</h5>
<p class="formate">
Drag or choose your file to upload.<br>
It will be resized to 3,000px square <em>(thanks Apple.)</em>
</p>
</div>
<div class="browse-file-wrapper">
{{-- actual upload which is hidden --}}
<input name="file" id="file" type="file" class="inputfile" required />
{{-- our custom upload button --}}
<label for="file" title="No File Choosen">
<i class="ri-upload-cloud-line"></i>
<span class="text-center mb-2">Choose a File</span>
<span class="file-type text-center mt--10">PNG, JPG, JPEG<br>
Max 20Mb<br>
Prefer 3,000px Square</span>
</label>
</div>
@error('file')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
{{-- end upoad file area --}}
</div>
<div class="col-lg-8">
<div class="form-field-wrapper mb-4">
<div class="row">
<div class="col-md-12 mb-4">
<div class="field-box">
<label for="title" class="form-label">Artwork Title</label>
<input id="title" name="title" type="text" class="@error('title') is-invalid @enderror"
placeholder="e. g. `This Artwork's Title`"
required
value="{{ old('title') }}">
@error('title')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-md-12 mb-4">
<div class="field-box">
<label for="description" class="form-label">Artwork Description</label>
<textarea id="description" name="description" rows="3" class="@error('description') is-invalid @enderror"
placeholder="e. g. “This cryptic mess represents...”">{{ old('description') }}</textarea>
@error('description')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-md-12 mb-4 pb-4">
<div class="field-box">
<label for="podcast" class="form-label">For Podcast</label>
<select id="podcast" name="podcast" required>
@foreach ($podcasts as $podcast)
<option value="{{ $podcast->id }}" @selected(old('podcast') == $podcast->id)>{{ $podcast->name }}</option>
@endforeach
</select>
</div>
</div>
</div>
{{-- End .row --}}
</div>
</div>
<div class="col">
<p>By submitting this artwork, you agree you have the rights to publish the artwork and are placing this artwork under a
non-revokable <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons CC BY-SA 4.0 DEED Attribution-ShareAlike 4.0 International</a> license.</p>
</div>
</div>
{{-- End .row --}}
</div>
{{-- End .create-item-wrapper --}}
<div class="row">
<div class="col-md-12">
<div class="d-flex-between upload-btn-wrapper flex-wrap">
<div class="d-flex-center ">
<button type="reset" class="btn btn-gradient btn-medium mr-3"><span>Cancel</span></button>
</div>
<div class="input-box">
<button type="submit" class="btn btn-gradient btn-medium justify-content-center"><span>Submit Artwork.</span></button>
</div>
</div>
</div>
</div>
{{-- ENd .row --}}
</form>
</div>
</section>
@endsection

View File

@ -0,0 +1,7 @@
@extends('layouts.master')
@section('page-top')
<br><br><br><br><br>
@endsection
@section('page-content')
{{ $slot }}
@endsection

View File

@ -0,0 +1,84 @@
@extends('layouts.master')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Submitted Artwork</h1>
<nav class="mt-4">
<ol class="breadcrumb justify-content-center">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item active"><a href="/artworks">Explore Artwork</a></li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90 masonary-wrapper-activation">
<div class="container">
<div class="row">
{{ $artworks->links() }}
</div>
</div>
<div class="container">
<div class="d-flex-between flex-wrap">
<div
class="button-group default-tab-list isotop-filter flex-wrap filters-button-group d-flex justify-content-start justify-content-lg-start mb-6 ">
<button data-filter="*" class="is-checked"><span class="filter-text">View All</span></button>
@foreach ($podcasts as $podcast)
<button data-filter=".podcast--{{ $podcast->slug }}"><span class="filter-text">{{ $podcast->name }}</span></button>
@endforeach
</div>
</div>
<div class="grid-filter-wrapper masonry-list">
<div class="resizer"></div>
@foreach ($artworks as $artwork)
<div class="grid-item podcast--{{ $artwork->podcast->slug }}">
<div class="explore-style-one {{ $artwork->episode->artwork_id == $artwork->id ? 'selected' : '' }}">
<div class="thumb">
<a href="/artworks/{{ $artwork->id }}"><img src="http://{{ config('app.static_asset_url') }}/thumbnails/{{ $artwork->filename }}" alt="{{ $artwork->title }} by {{ $artwork->artist->name }} for {{ $artwork->podcast->title }}"></a>
</div>
<div class="content">
<div class="header d-flex-between pt-4 pb-3">
<h3 class="title"><a href="/artwork/{{ $artwork->id }}">"{{ $artwork->title }}"</a></h3>
<div class="more-dropdown "><i class="ri-more-fill" data-bs-toggle="dropdown"></i>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="#">Artist Profile</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Episode Submissions</a></li>
<li><a class="dropdown-item" href="#">Episode Details</a></li>
<li><a class="dropdown-item" href="#">Report</a></li>
</ul>
</div>
</div>
{{-- .header --}}
<div class="product-owner py-4 d-flex-between">
<span class="bid-owner">Artwork By<br><strong><a href="/artist/{{ $artwork->artist->id }}">{{ $artwork->artist->name }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $artwork->artist->id }}" class="avatar" data-bs-toggle="tooltip" data-bs-placement="top"
title="{{ $artwork->artist->name }}"><img src="{{ Vite::asset($recent->artist->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}" style="width:100%;height:auto;" alt="{{ $artwork->artist->name }}"></a></span>
</div>
{{-- End .product-owner --}}
<div class="action-wrapper d-flex-between pt-4">
<span class="bid-owner">{{ $artwork->id == $artwork->episode->artwork_id ? 'Selected' : 'Submitted' }} for <br><strong><a href="/artist/{{ $artwork->artist->id }}">{{ $artwork->podcast->name }}<br> Episode {{ number_format($artwork->episode->episode_number) }}</a></strong></span>
</div>
{{-- action-wrapper --}}
</div>
</div>
</div>
@endforeach
</div>
</div>
<div class="container">
<div class="row">
{{ $artworks->links() }}
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,41 @@
{{-- Start Setup Wallet --}}
<section class="wallet-setup ptb-120">
<div class="container">
<div class="section-title">
<span class="subtitle">WHAT THIS IS</span>
<h2>Artists + Podcasters = <i class="ri-heart-fill"></i></h2>
</div>
{{-- End .section-title --}}
<div class="slider wallet-activation slick-arrow-between slick-gutter-15 grid auto-rows-fr">
<div class="card-block-style-one">
<h3 class="title mb-3">Setup Your Account & Artist Profile</h3>
<p>First things first, you need to have an account to control your artist profiles and submit artwork.
Setting up your account is easy, you just need an email address and some creativity. Once you have
your account, you can create one more artist profiles which are controlled by you.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Submit Your Album Artwork</h3>
<p>Your artwork should be unique, high-quality, and on-topic. Our artists stive to provide the podcast
hosts with unqiue artwork each and every episode to use as the album artwork. artwork should be
a minimum of 512px square.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Podcasters Select Your Art</h3>
<p>When publishing their podcast, podcasters select the album art they like best, and if you are selected,
you'll get your credit here and usually in the show-notes of the podcast that used your art. If you aren't
selected for Album Art, your artwork could be used for Podcasting 2.0 chapter art as well.
</p>
</div>
</div>
{{-- End .row --}}
</div>
{{-- End .container --}}
</section>
{{-- End Setup Wallet --}}

View File

@ -3,15 +3,19 @@
<span>Live Since 2010</span>
</h1>
<p data-aos="fade-up" data-aos-delay="100">
A community collaboration producing the best podcast album art in the universe!
A community collaboration producing the best podcast album art in the universe!<br>
Once discussed on <em>The Joe Rogan Experience</em>, sadly,<br>
Young Jamie was not asked to pull this up.
</p>
<div class="group-btn mt-8" data-aos="fade-up" data-aos-delay="200">
<a href="explore-filter-sidebar.html" class="btn btn-gradient">
<a href="/artworks" class="btn btn-gradient">
<span><i class="ri-rocket-line"></i>Explore</span>
</a>
<a href="create.html" class="btn btn-outline">
@if (Auth::user())
<a href="/create-artwork" class="btn btn-outline">
<span><i class="ri-edit-line"></i> Create</span>
</a>
@endif
</div>
<div class="counter-wrapper counter-wrapper-style-two">
@foreach ($headerCounters as $headerCounterLabel => $headerCounterCount)

View File

@ -0,0 +1,16 @@
<section class="hero-banner-style bg-5 bg-image top-section-gap hero-banner-style-4">
<div class="hero-banner_inner">
<div class="container-fluid">
<div class="row align-items-center">
<div class="col-xl-7 col-lg-6 col-md-12">
@include('home.hero.banner-left')
</div>
<div class="col-xl-5 col-lg-6 col-md-12">
@include('home.hero.slider.slider')
</div>
{{-- End .col --}}
</div>
</div>
{{-- End .container --}}
</div>
</section>

View File

@ -28,13 +28,14 @@
<span class="bid-owner">Artwork Selected For<br>
<strong><a href="#">{{ $recentEpisode->podcast->name }}</a></strong>
<br>
<a href="#">Episode {{ number_format($recentEpisode->episode_number + 0) }}</a></span>
<a href="#">Episode {{ number_format($recentEpisode->episode_number + 0) }}<br>
{{ $recentEpisode->episode_date->format('D, M j') }}<sup>{{ $recentEpisode->episode_date->format('S') }}</sup>{{ $recentEpisode->episode_date->format(', Y') }}</a></span>
</div>
<div class="product-owner py-1 d-flex-between">
<span class="bid-owner">Artwork By<br><strong><a
href="author-profile.html">{{ $recentEpisode->artwork->artist->name ?? 'Unknown' }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="author-profile.html" class="avatar" data-bs-toggle="tooltip" data-bs-placement="top"
title="{{ $recentEpisode->artwork->artist->name }}"><img src="{{ Vite::asset('resources/img/default_avatars/default_avatar_users_' . str_pad(rand(1, 32), 2, '0', STR_PAD_LEFT) . '.svg') }}"
title="{{ $recentEpisode->artwork->artist->name }}"><img src="{{ Vite::asset($recentEpisode->artwork->artist->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}"
alt="{{ $recentEpisode->artwork->artist->name }}"></a></span>
</div>
<!-- End .product-owner -->

View File

@ -0,0 +1,26 @@
<div class="col-xxl-4 col-lg-6 col-md-6 mb-6">
<div class="top-seller-style-two d-flex-between">
<div class="d-flex-center">
<div class="thumb-wrapper">
<a href="author-profile.html" class="thumb">
<img src="{{ Vite::asset($leaderboardArtist->artist->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}" alt="{{ $leaderboardArtist->artist->name }}"
title="{{ $leaderboardArtist->artist->name }}">
</a>
</div>
{{-- End .thumb-wrapper --}}
{{-- End .thumb --}}
<div class="content">
<h4 class="title pb-1"><a href="author-profile.html">{{ $leaderboardArtist->artist->name }}</a></h4>
<span class="price">Chosen {{ $leaderboardArtist->artworkCount }} {{ Str::plural('Time', $leaderboardArtist->artworkCount) }}</span>
</div>
{{-- End .content --}}
</div>
{{-- End .d-flex-center --}}
<a href="author-profile.html" class="items-number d-flex-center flex-column">
<strong class="pb-1">{{ $leaderboardArtist->position }}<sup>{{ numberSuffix($leaderboardArtist->position) }}</sup></strong>
<span>Place</span>
</a>
</div>
{{-- End .top-seller-style-two --}}
</div>
{{-- End .col --}}

View File

@ -0,0 +1,23 @@
{{-- Start Top Seller --}}
<section class="section-bg-separation-2 ptb-120">
<div class="container">
<div class="d-flex-between">
<div class="section-title">
<span class="subtitle">The Artists</span>
<h2>Past Year Leaderboard</h2>
</div>
{{-- End .section-title --}}
<div class="text-large">
<a href="#">View Leaderboards</a>
</div>
</div>
{{-- End .d-flex-between --}}
<div class="row">
@foreach($leaderboard as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
{{-- End container --}}
</section>
{{-- End section --}}

View File

@ -1,20 +1,10 @@
@extends('layouts.master')
@section('hero')
<section class="hero-banner-style bg-5 bg-image top-section-gap hero-banner-style-4">
<div class="hero-banner_inner">
<div class="container-fluid">
<div class="row align-items-center">
<div class="col-xl-7 col-lg-6 col-md-12">
@include('home.hero.banner-left')
</div>
<div class="col-xl-5 col-lg-6 col-md-12">
@include('home.hero.slider.slider')
</div>
<!-- End .col -->
</div>
</div>
<!-- End .container -->
</div>
</section>
@section('page-top')
@include('home.hero.hero')
@endsection
@section('page-content')
@include('home.recents.section')
@include('home.explainer.explainer')
@include('home.leaderboard.section')
@endsection

View File

@ -0,0 +1,35 @@
<div class="explore-style-one podcast--{{ $recent->podcast->slug }} {{ $recent->episode->artwork_id == $recent->id ? 'selected' : '' }}">
<div class="thumb">
<a href="product-details.html"><img src="http://{{ config('app.static_asset_url') }}/thumbnails/{{ $recent->filename }}" alt="{{ $recent->title }} by {{ $recent->artist->name }} for {{ $recent->podcast->title }}"></a>
</div>
{{-- End .thumb --}}
<div class="content">
<div class="header d-flex-between pt-4 pb-3">
<h3 class="title"><a href="product-details.html">"{{ $recent->title }}"</a></h3>
<div class="more-dropdown "><i class="ri-more-fill" data-bs-toggle="dropdown"></i>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="#">Artist Profile</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Episode Submissions</a></li>
<li><a class="dropdown-item" href="#">Episode Details</a></li>
<li><a class="dropdown-item" href="#">Report</a></li>
</ul>
</div>
</div>
{{-- .header --}}
<div class="product-owner py-4 d-flex-between">
<span class="bid-owner">Artwork By<br><strong><a href="/artist/{{ $recent->artist->id }}">{{ $recent->artist->name }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $recent->artist->id }}" class="avatar" data-bs-toggle="tooltip" data-bs-placement="top"
title="{{ $recent->artist->name }}"><img src="{{ Vite::asset($recent->artist->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}" style="width:100%;height:auto;" alt="{{ $recent->artist->name }}"></a></span>
</div>
{{-- End .product-owner --}}
<div class="action-wrapper d-flex-between pt-4">
<span class="bid-owner">{{ $recent->id == $recent->episode->artwork_id ? 'Selected' : 'Submitted' }} for<br><strong><a href="/artist/{{ $recent->artist->id }}">{{ $recent->podcast->name }}<br>Episode {{ number_format($recent->episode->episode_number) }}</a></strong></span>
</div>
{{-- action-wrapper --}}
</div>
{{-- End .content --}}
</div>
{{-- End .explore-style-one --}}

View File

@ -0,0 +1,18 @@
{{-- Start Live Auction --}}
<section class="ptb-120 live-auction">
<div class="container">
<div class="section-title">
<span class="subtitle">Artworks</span>
<h2>Recent Artwork Submissons</h2>
</div>
{{-- End .section-title --}}
<div class="slider slick-activation-001 slick-gutter-15 slick-pagination-50">
@foreach ($recentSubmissions as $recent)
@include('home.recents.card')
@endforeach
{{-- End .slick-activation-01 --}}
</div>
{{-- End .container --}}
</div>
</section>
{{-- End Live Auction --}}

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,16 @@
<nav x-data="{ open: false }" class="bg-white dark:bg-gray-800 border-b border-gray-100 dark:border-gray-700">
<!-- Primary Navigation Menu -->
{{-- Primary Navigation Menu --}}
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex">
<!-- Logo -->
{{-- Logo --}}
<div class="shrink-0 flex items-center">
<a href="{{ route('dashboard') }}">
<x-application-logo class="block h-9 w-auto fill-current text-gray-800 dark:text-gray-200" />
</a>
</div>
<!-- Navigation Links -->
{{-- Navigation Links --}}
<div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
<x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
{{ __('Dashboard') }}
@ -18,7 +18,7 @@
</div>
</div>
<!-- Settings Dropdown -->
{{-- Settings Dropdown --}}
<div class="hidden sm:flex sm:items-center sm:ml-6">
<x-dropdown align="right" width="48">
<x-slot name="trigger">
@ -38,7 +38,7 @@
{{ __('Profile') }}
</x-dropdown-link>
<!-- Authentication -->
{{-- Authentication --}}
<form method="POST" action="{{ route('logout') }}">
@csrf
@ -52,7 +52,7 @@
</x-dropdown>
</div>
<!-- Hamburger -->
{{-- Hamburger --}}
<div class="-mr-2 flex items-center sm:hidden">
<button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 dark:text-gray-500 hover:text-gray-500 dark:hover:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-900 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-900 focus:text-gray-500 dark:focus:text-gray-400 transition duration-150 ease-in-out">
<svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
@ -64,7 +64,7 @@
</div>
</div>
<!-- Responsive Navigation Menu -->
{{-- Responsive Navigation Menu --}}
<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
<div class="pt-2 pb-3 space-y-1">
<x-responsive-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
@ -72,7 +72,7 @@
</x-responsive-nav-link>
</div>
<!-- Responsive Settings Options -->
{{-- Responsive Settings Options --}}
<div class="pt-4 pb-1 border-t border-gray-200 dark:border-gray-600">
<div class="px-4">
<div class="font-medium text-base text-gray-800 dark:text-gray-200">{{ Auth::user()->name }}</div>

View File

@ -0,0 +1,7 @@
<div>
<h1>{{ $count }}</h1>
<button wire:click="increment">+</button>
<button wire:click="decrement">-</button>
</div>

View File

@ -0,0 +1,9 @@
<li>
<label class="theme-switcher-label d-flex" for="theme-switcher">
<input type="checkbox" class="theme-switcher" id="theme-switcher">
<div class="switch-handle">
<i class="ri-sun-line light-text" wire:click="light"></i>
<i class="ri-moon-line dark-text" wire:click="dark"></i>
</div>
</label>
</li>

View File

@ -0,0 +1,73 @@
{{-- Start Footer --}}
<footer class="footer-wrapper">
<div class="footer-inner pt-120 pb-80">
<div class="container">
<div class="row">
<div class="col-lg-5 col-md-6 mb-8">
<div class="footer-widget first-block">
<div class="mb-4">
<a href="/" class="logo-light"><img src="{{ Vite::asset('resources/img/logo-dark-naag-mob.png') }}" alt="No Agenda Art Generator"
title="No Agenda Art Generator - Home"></a>
<a href="/" class="logo logo-dark"><img src="{{ Vite::asset('resources/img/logo-white-naag-mob.png') }}" alt="No Agenda Art Generator"
title="No Agenda Art Generator - Home"></a>
</div>
<p class="mb-5 text-justify">Providing the best podcast album art in the universe since 2010.
By submitting artwork, you are acknowledging
you have the right to publish the work and are agreeing to place the work under the
<a href="https://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons Attribution
Share-Alike 3.0, United States License</a>. TYFYC and ITM.
</div>
</div>
{{-- End .col --}}
<div class="col-lg-2 col-md-6 mb-8">
<div class="footer-widget">
<h4>Community</h4>
<ul class="footer-list-widget">
<li><a href="https://noagendashow.net">No Agenda Show</a></li>
<li><a href="https://noagendasocial.com/">No Agenda Social</a></li>
<li><a href="https://noagendastream.com">No Agenda Stream</a></li>
<li><a href="http://listen.noagendastream.com/">Alternate Stream Link</a></li>
<li><a href="http://noagendanation.com/">No Agenda Nation</a></li>
<li><a href="http://noagendashop.com/">No Agenda Shop</a></li>
</ul>
</div>
</div>
{{-- End .col --}}
<div class="col-lg-2 col-md-6 mb-8">
<div class="footer-widget">
<h4>Navigation</h4>
<ul class="footer-list-widget">
<li><a href="blog.html">Blog</a></li>
<li><a href="activity.html">Activity</a></li>
<li><a href="popular-collections-2.html">Collections</a></li>
<li><a href="signin.html">Signin</a></li>
<li><a href="signup.html">SignUp</a></li>
</ul>
</div>
</div>
{{-- End .col --}}
<div class="col-lg-3 col-md-6 mb-8">
<div class="footer-widget">
<h4>Support</h4>
<ul class="footer-list-widget">
<li><a href="https://dvorak.org/na">Donate to the No Agenda Podcast</a></li>
<li><a rel="me" href="/support-development">Support The Generator</a></li>
<li><a rel="me" href="https://noagendasocial.com/@SirPaulCouture">Argue with me on NA Social</a></li>
</ul>
</div>
</div>
{{-- End .col --}}
</div>
</div>
{{-- End .container --}}
</div>
<div class="copyright text-center">
<div class="container">
<p>Copyright © 2010-{{ date('Y') }} Paul Couture. Some Rights Reserved.</p>
</div>
</div>
</footer>
{{-- End Footer --}}

View File

@ -20,6 +20,7 @@
</div>
<div class="header-right d-flex align-items-center">
<ul class="header-right-inner">
{{--
<li class=" d-none d-lg-block">
<form action="#" class="search-bar">
<input type="text" name="search" placeholder="Artist, Podcast or Episode" id="search">
@ -35,26 +36,30 @@
<button class="search-btn" type="submit"> <i class="ri-search-line"></i></button>
</form>
</li>
<li class="wallet-button"> <a href="wallet.html" class="btn btn-gradient btn-small">
--}}
@if (!Auth::user())
<li class="wallet-button"> <a href="/login" class="btn btn-gradient btn-small">
<span><i class="ri-wallet-3-line"></i>Join In</span></a>
</li>
<li class="avatar-info"> <a href="#"><img src="{{ Vite::asset('resources/img/default_avatars/default_avatar_users_' . str_pad(rand(1, 50), 2, '0', STR_PAD_LEFT) . '.svg') }}" alt="user avatar"></a>
@else
<li class="avatar-info"> <a href="#"><img
@if (Auth::user() && Auth::user()->artists->first())
src="{{ Vite::asset(Auth::user()->artists->first()->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}"
@else
src="{{ Vite::asset('resources/img/default_avatars/default_avatar_male.svg') }}"
@endif
alt="user avatar"></a>
<ul class="submenu">
<li><a href="author-profile.html"><i class="ri-user-line"></i> Profile</a></li>
<li><a href="create.html"><i class="ri-edit-line"></i> Create Item</a></li>
<li><a href="authors.html"><i class="ri-layout-grid-line"></i>Authors</a></li>
<li><a href="signin.html"><i class="ri-logout-box-r-line"></i>Sign in</a></li>
@if (Auth::user())
<li><a href="/user-account"><i class="ri-user-line"></i> Profile</a></li>
<li><a href="/logout"><i class="ri-logout-box-r-line"></i>Sign Out</a></li>
@else
<li><a href="/login"><i class="ri-logout-box-r-line"></i>Sign in</a></li>
@endif
</ul>
</li>
<li>
<label class="theme-switcher-label d-flex" for="theme-switcher">
<input type="checkbox" class="theme-switcher" id="theme-switcher">
<div class="switch-handle">
<i class="ri-sun-line light-text"></i>
<i class="ri-moon-line dark-text"></i>
</div>
</label>
</li>
@endif
<livewire:themeswitch />
<li class="setting-option mobile-menu-bar d-block d-xl-none">
<button class="hamburger-button">
<i class="ri-menu-2-fill"></i>

Some files were not shown because too many files have changed in this diff Show More