43 Commits

Author SHA1 Message Date
a989f3e92b fix: fixes artwork count on podcasts index page (#6)
Reviewed-on: #6
Co-authored-by: Paul Couture <paul@paulcouture.com>
Co-committed-by: Paul Couture <paul@paulcouture.com>
2024-01-13 11:46:38 -06:00
b8d1a164f1 Merge pull request 'fix: limit episode art to approved arworks' (#5) from fix/episode_filter_unapproved into master
Reviewed-on: #5
2024-01-13 11:32:21 -06:00
37d496bbca fix: limit episode art to approved arworks 2024-01-13 11:30:38 -06:00
eb931bbb6a feat: adds ability for approved users to approve artwork 2024-01-13 10:45:40 -06:00
bc66edb3ce feat: cleanup after move to new production server. 2024-01-07 14:24:04 +00:00
e10736d51e fix: updated yarn.lock 2024-01-06 17:42:08 +00:00
9101bab010 fix: updating default favicon 2024-01-06 17:15:44 +00:00
1d56e833a8 fix: migrating to bare metal. 2024-01-06 15:59:04 +00:00
ac28e86e68 fix: fixing unpublished artwork epsideo card 2023-12-22 23:17:53 -06:00
97fa5a6f9f fix: adding noscript to hide pre-loader. 2023-12-22 12:18:48 -06:00
bf30235e1d fix: allowing users to change artist display name. 2023-12-21 15:31:06 -06:00
c46664492d fix: removing broken links to unpublished episodes 2023-12-21 15:17:18 -06:00
06e5101199 fix: removing broken links to unpublished episodes 2023-12-21 15:00:54 -06:00
9630f331a2 fix: moving v4v on artist cards. 2023-12-21 16:49:18 +00:00
173986da5e fix: user can update bio info 2023-12-21 10:20:49 -06:00
ca34ab4b37 fix: login with username or email added. 2023-12-21 05:16:15 +00:00
a156a44130 fix: adding ability to update artist bg 2023-12-20 19:45:19 +00:00
87198b46a5 fix: optimized artists index 2023-12-20 07:07:33 +00:00
40024b69ae fix: setting up gcm 2023-12-20 07:01:38 +00:00
aa79de5688 fix: adding restart directives to docker compose 2023-12-20 06:53:00 +00:00
f7a27e7f62 fix: added og headers, lots of cleanup. 2023-12-20 01:02:15 +00:00
7772be7dc5 fix: adding indexes to tables 2023-12-18 09:44:09 -06:00
d5c7e9e4f5 fix: performance tweak for submitted page 2023-12-18 09:28:45 -06:00
89450f0b79 fix: performance tweaks. 2023-12-18 15:20:45 +00:00
23e551374a fix: caching the leaderboard 2023-12-17 23:22:54 -06:00
3e3e76773c fix: fixing avatar widths 2023-12-17 16:31:07 -06:00
a6dc77feff fix: changing num per page on submitted. 2023-12-17 16:01:35 -06:00
3b45563ce5 fix: adding cache missing from artwork controller 2023-12-17 15:55:54 -06:00
ae697fbaae fix: caching podcasts list 2023-12-17 15:51:24 -06:00
ebdc50a697 fix: fixing issues found at launch 2023-12-17 21:43:00 +00:00
3d3029ceb6 fix: adding user avatar editing 2023-12-17 12:32:35 -06:00
a2ecb62a05 fix: themed manage account forms 2023-12-16 11:40:39 -06:00
a4bd889d23 fix: modifying profile edit pages, added trusted proxies 2023-12-16 15:51:30 +00:00
4ba362b4fd fix: tweaking profile update template. 2023-12-15 10:00:01 -06:00
c55bec5b28 fix: fixing guest header 2023-12-15 01:03:28 -06:00
efba3dff84 fix: fixing login and forgot password 2023-12-15 00:53:04 -06:00
81525acb82 fix: guest blade issues 2023-12-14 23:17:34 -06:00
f39ce73978 fix: fixing footer navigation 2023-12-14 22:47:10 -06:00
ebd803282c fix: cleanup artwork and episode template 2023-12-14 22:22:57 -06:00
a37789ff8a fix: correcting issues on artist profile page. 2023-12-14 21:57:33 -06:00
2e3b848ff5 fix: initial changes to allow for intial deployment (#4)
Reviewed-on: #4
Co-authored-by: Paul Couture <paul@paulcouture.com>
Co-committed-by: Paul Couture <paul@paulcouture.com>
2023-12-14 20:59:11 -06:00
26c4b2c959 fix: fixing naming conventions for initial deployment. (#3)
Reviewed-on: #3
Co-authored-by: Paul Couture <paul@paulcouture.com>
Co-committed-by: Paul Couture <paul@paulcouture.com>
2023-12-14 15:21:54 -06:00
c4398c641e feat/factory_creation (#1)
Prepping for launch.

Reviewed-on: #1
Co-authored-by: Paul Couture <paul@paulcouture.com>
Co-committed-by: Paul Couture <paul@paulcouture.com>
2023-12-14 11:33:03 -06:00
98 changed files with 6099 additions and 1063 deletions

3
.gitignore vendored
View File

@@ -33,3 +33,6 @@ legacypublic
migrated_artworks_files.tar.gz
migrated_thumbnail_files.tar.gz
site/.yarn/releases/yarn-1.22.19.cjs
site/public/assets
redis/*
staticassets

View File

@@ -4,7 +4,7 @@ Modernizing the No Agenda Art Generator.
Since 2010, the [No Agenda Art Generator](https://noagendaartgenerator.com) has been producing album art for the [No Agenda Podcast](https://noagendashow.net) live via community collaboration by the artists that make up the best podcast art creators in the universe.
In October 2016, the 2.0 release of the Art Generator began based on Laravel 4.2. It has served the podcast and community well, but this project seeks to make it easier for collaborators to contribute, modify, and maintain the art generator while making the product available to more podcasts and artists.
In October 2014, the 2.0 release of the Art Generator began based on Laravel 4.2. It has served the podcast and community well, but this project seeks to make it easier for collaborators to contribute, modify, and maintain the art generator while making the product available to more podcasts and artists.
### License

View File

@@ -8,18 +8,19 @@ services:
dockerfile: Dockerfile
container_name: ${CONTAINER_NAME:-pcag-laravel}
volumes:
- ./site:/var/www/html
- ./static:/static
#- ./legacypublic:/legacypublic
- ${PATH_TO_SITE}:/var/www/html
- ${PATH_TO_STATIC}:/static
- ./nginx/default.conf:/etc/nginx/sites-available/default
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
environment:
TZ: UTC
PUID: ${UID:-1000}
PGID: ${GID:-1000}
REDIS_HOST: redis
DB_HOST: db
DB_DATABASE: ${DB_DATABASE}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${LIVE_DB_DATABASE}
DB_USERNAME: ${LIVE_DB_USERNAME}
DB_PASSWORD: ${LIVE_DB_PASSWORD}
LARAVEL_QUEUE_ENABLED: true
LARAVEL_QUEUE_OPTIONS: --timeout=60 --tries=3 redis
LARAVEL_SCHEDULE_ENABLED: true
@@ -45,10 +46,10 @@ services:
env_file: .env
environment:
TZ: UTC
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MARIADB_USER: ${DB_USERNAME}
MARIADB_DATABASE: ${DB_DATABASE}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${LIVE_DB_ROOT_PASSWORD}
MARIADB_USER: ${LIVE_DB_USERNAME}
MARIADB_DATABASE: ${LIVE_DB_DATABASE}
MARIADB_PASSWORD: ${LIVE_DB_PASSWORD}
volumes:
- "./db/data:/var/lib/mysql"
- "./db/dump:/docker-entrypoint-initdb.d"

42
nginx/default.conf Normal file
View File

@@ -0,0 +1,42 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
root /var/www/html/public;
index index.html index.htm index.php;
# SSL
ssl_certificate /etc/ssl/web/server.crt;
ssl_certificate_key /etc/ssl/web/server.key;
# additional config
include extra.d/*.conf;
# health check
location /ping {
access_log off;
include snippets/fastcgi-php.conf;
fastcgi_read_timeout 5s;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
}
location ^~ /livewire {
try_files $uri $uri/ /index.php?$query_string;
}
# handle .php
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include snippets/fastcgi-php.conf;
}
# index.php fallback
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}

View File

@@ -0,0 +1,11 @@
#snippets/legacy_mappings.conf
map $uri $legacy_mapping {
~^/assets/(?<filename>.+)$ $filename;
default $uri;
}
map $filename $modified_filename {
~/(.*) $1---;
default $filename;
}

145
nginx/nginx.conf Normal file
View File

@@ -0,0 +1,145 @@
# Generated by nginxconfig.io
# https://www.serverion.com/nginx-config/#?0.domain=_&0.path=%2Fvar%2Fwww%2Fhtml&0.redirect=false&0.force_https=false&0.cert_type=custom&0.ssl_certificate=%2Fetc%2Fssl%2Fweb%2Fserver.crt&0.ssl_certificate_key=%2Fetc%2Fssl%2Fweb%2Fserver.key&0.wordpress&0.proxy_path=%2Fping&0.proxy_pass=unix:%2Fvar%2Frun%2Fphp%2Fphp-fpm.sock&0.index=index.html&content_security_policy=default-src%20'self'%20http:%20https:%20data:%20blob:%20'unsafe-inline';%20frame-ancestors%20'self';&php_server=%2Fvar%2Frun%2Fphp%2Fphp7.3-fpm.sock&expires_media=max&expires_svg=max&expires_fonts=max&user=www-data%20www-data&client_max_body_size=2048&symlink=false
pcre_jit on;
worker_processes auto;
worker_rlimit_nofile 100000;
user www-data www-data;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
http {
# define common MIME types
include mime.types;
# define the default MIME type
default_type application/octet-stream;
# disable emitting nginx version
server_tokens off;
# disable the directory listing output
autoindex off;
# disable automatic generation of the "ETag"
etag off;
# disable warnings about uninitialized variables are logged
uninitialized_variable_warn off;
# ======================================================================== #
# the bucket size for the maps hash table
map_hash_bucket_size 256;
map_hash_max_size 4096;
# the bucket size for the server names hash tables
server_names_hash_bucket_size 256;
server_names_hash_max_size 4096;
# the bucket size for variables hash tables
variables_hash_max_size 4096;
variables_hash_bucket_size 4096;
# ======================================================================== #
# cache informations about FDs, frequently accessed files
# can boost performance, but you need to test those values
open_file_cache max=200000 inactive=30s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
open_file_cache_errors off;
open_log_file_cache max=10 inactive=30s min_uses=1 valid=5m;
# ======================================================================== #
# logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log error;
# to boost I/O on HDD we can disable access logs
log_not_found off;
log_subrequest off;
rewrite_log on;
# copies data between one FD and other from within the kernel
# faster than read() + write()
sendfile off;
sendfile_max_chunk 1m;
# send headers in one piece, it is better than sending them one by one
tcp_nopush on;
# don't buffer data sent, good for small data bursts in real time
tcp_nodelay on;
# large files can be read and sent using multi-threading
# without blocking a worker process
aio threads;
directio 1m;
# how to compare modification time
ssi on;
if_modified_since off;
# set default size of the slice
slice 1m;
# ======================================================================== #
# allow the server to close connection on non responding client,
# this will free up memory
reset_timedout_connection on;
# timeout for reading client request header -- default: 60
client_header_timeout 10s;
# request timed out -- default: 60
client_body_timeout 75s;
# if the request body size is more than the buffer size, then the entire (or partial)
# request body is written into a temporary file
client_body_buffer_size 128k;
# if client stop responding, free up memory -- default: 60
send_timeout 30s;
# server will close connection after this time -- default: 75
keepalive_timeout 30s;
# number of requests client can make over keep-alive
keepalive_requests 100000;
# maximum number and size of buffers
# for large headers to read from client request -- default: 4 8k;
large_client_header_buffers 4 16k;
# ======================================================================== #
# SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites
ssl_dhparam /etc/ssl/dhparam.pem;
# Mozilla Intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# OCSP Stapling
# ssl_stapling on;
# ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
# ======================================================================== #
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

1977
nginx/phpfpm8_2.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,346 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Artwork;
use App\Models\Episode;
use App\Models\Artist;
use App\Models\Podcast;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
use Carbon\Carbon;
use ImageOptimizer;
class AddMissingV3ArtworksCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:add-missing-v3-artworks-command';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$missing_artworks = [
[
'url' => 'https://noagenda.dev/old/img/7e5e1ca05eb622e2.png',
'title' => 'Show Art 1613',
'artist' => 'dirty-jersey-whore',
'artist_id' => 1318,
'episode' => 1613,
],
[
'url' => 'https://noagenda.dev/old/img/6ac5a1220e954d10.jpg',
'title' => 'No Stinkin\' Title Provided',
'artist' => 'dirty-jersey-whore',
'artist_id' => 1318,
'episode' => 1613,
],
[
'url' => 'https://noagenda.dev/old/img/eb9c5a07a25db93b.jpg',
'title' => 'McMystery',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/16dce3f9249b42e8.png',
'title' => 'Blinking Red Lights!',
'artist' => 'mountainjay',
'artist_id' => 891,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/8a6153d61715434b.jpg',
'title' => 'Day One Dictator!',
'artist' => 'matthewdropco1972',
'artist_id' => 1173,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/bf6322f359b0727f.png',
'title' => 'Vivek\'s Notebook',
'artist' => 'sir-paul-couture',
'artist_id' => 4,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/81e71a8e2b24874b.jpg',
'title' => 'Plastic Shoes',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/51f16e95c0e86cc9.jpg',
'title' => 'My Transhausen Blewupen',
'artist' => 'francisco-scaramanga',
'artist_id' => 1377,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/b3b6c7988b5fd7f0.jpeg',
'title' => 'McPartner',
'artist' => 'dame-kenny-ben',
'artist_id' => 1121,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/c9c52179e5eedc6f.png',
'title' => 'Red Flashing Lights',
'artist' => 'jack-evans',
'artist_id' => 1224,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/2a29bb2974959b8a.jpg',
'title' => 'Threat Level Swift',
'artist' => 'darren-oneill',
'artist_id' => 756,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/0ed3c698ba336ea9.jpg',
'title' => 'Blinking Lights',
'artist' => 'matthewdropco1972',
'artist_id' => 1173,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/04658d1ccb786d26.png',
'title' => 'Deep State University, In The Morning',
'artist' => 'mountainjay',
'artist_id' => 891,
'episode' => 1614,
],
[
'url' => 'https://noagenda.dev/old/img/61273125525b7861.jpg',
'title' => 'Chad GPT',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/479090be93d46fad.jpg',
'title' => 'Chet GPT',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/a533697498ad7f75.png',
'title' => 'Word Salad, Roundy Variant',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/bcd81059b0440049.png',
'title' => 'word salad (that AI allegedly produces)',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/ddfbcc471e4f265f.png',
'title' => 'microphone hand (without show number)',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/c11e2b8a88774fca.png',
'title' => 'microphone hand',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/f0c08370c93980b8.jpg',
'title' => 'Bye Joe',
'artist' => 'darren-oneill',
'artist_id' => 756,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/9fc5c17fc0ec547e.jpg',
'title' => 'Coof Train',
'artist' => 'darren-oneill',
'artist_id' => 756,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/99e317f0dd6dd10c.jpg',
'title' => 'Comb Your Hair!',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/c579a7ef6ab53869.jpg',
'title' => 'Milgram',
'artist' => 'clip-custodian',
'artist_id' => 1431,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/ba791114371437bc.jpeg',
'title' => '67% are Killers',
'artist' => 'dame-kenny-ben',
'artist_id' => 1121,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/05b40baf17249ea5.jpg',
'title' => 'Garage Sale Find',
'artist' => 'francisco-scaramanga',
'artist_id' => 1377,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/fc626cd5542c71d8.jpg',
'title' => 'NA Show Art',
'artist' => 'monsieur-pierrey',
'artist_id' => 58,
'episode' => 1615,
],
[
'url' => 'https://noagenda.dev/old/img/2dc17c67400465ad.jpg',
'title' => 'Merry Christmas Ukraine',
'artist' => 'clip-custodian',
'artist_id' => 1431,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/18724b09fd552fc0.jpg',
'title' => 'THE END IS HERE',
'artist' => 'francisco-scaramanga',
'artist_id' => 1377,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/cefbe40e1afdf45c.jpg',
'title' => 'AI Winter is Coming',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/045db414cd60cf2a.jpg',
'title' => 'Space Race Force',
'artist' => 'Nessworks',
'artist_id' => 1159,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/f817a154c260076f.png',
'title' => 'No Agenda Verse',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/618ddba291dbe349.png',
'title' => 'NA Show Art',
'artist' => 'comic-strip-blogger',
'artist_id' => 680,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/322eda9c9e44933c.jpg',
'title' => 'Chinese Satellite',
'artist' => 'darren-oneill',
'artist_id' => 756,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/2c9ecc0646cc49dc.jpeg',
'title' => 'Naked No Agenda',
'artist' => 'KorrectDaRekard',
'artist_id' => 1021,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/96ba274872584092.jpg',
'title' => 'NA Show Art',
'artist' => 'matthewdropco1972',
'artist_id' => 1173,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/af8ab3953ba21524.jpg',
'title' => 'False Idols',
'artist' => 'matt-boisvert',
'artist_id' => 1368,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/ec5e76093063d663.jpg',
'title' => 'Collect Them All!',
'artist' => 'matt-boisvert',
'artist_id' => 1368,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/c28ec70cfd544c9b.jpg',
'title' => 'Santa\'s New List',
'artist' => 'matt-boisvert',
'artist_id' => 1368,
'episode' => 1616,
],
[
'url' => 'https://noagenda.dev/old/img/6d228246fb744cb7.jpg',
'title' => 'Christmas is Coming',
'artist' => 'matt-boisvert',
'artist_id' => 1368,
'episode' => 1616,
],
];
foreach ($missing_artworks as $art) {
$artist = Artist::find($art['artist_id']);
$episode = Episode::where('episode_number', $art['episode'])->first();
$this->line('Artist: ' . $artist->slug);
$this->line('Episode: ' . $episode->episode_date->format('Y-m-d'));
$artwork = new Artwork;
$artwork->title = $art['title'];
$artwork->artist_id = $artist->id;
$artwork->created_at = $episode->episode_date->format('Y-m-d ' . now()->format('H:i:s'));
$artwork->updated_at = $episode->episode_date->format('Y-m-d ' . now()->format('H:i:s'));
$artwork->episode_id = $episode->id;
$artwork->podcast_id = 1;
$artwork->approved_by = 4;
$basename = $episode->episode_date->format('Y/m/')
. Str::slug($artist->name)
. '_'
. Str::slug($art['title'])
. '_'
. Str::random(8)
. '.jpg';
$artwork->filename = $basename;
$artwork->save();
$filename = 'artworks/' . $basename;
$thumbnailName = 'thumbnails/' . $basename;
$this->line($basename);
$img = Image::make(file_get_contents($art['url']))->resize(3000, 3000)->encode('jpg', 100);
$thumbImg = Image::make(file_get_contents($art['url']))->resize(512, 512)->encode('jpg', 100);
$imgLocation = Storage::disk('static')->put($filename, $img);
$thumbLocation = Storage::disk('static')->put($thumbnailName, $thumbImg);
ImageOptimizer::optimize(Storage::disk('static')->path($filename));
ImageOptimizer::optimize(Storage::disk('static')->path($thumbnailName));
}
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Carbon\Carbon;
use Intervention\Image\Facades\Image;
use ImageOptimizer;
use App\Models\User;
use App\Models\Artist;
use App\Models\Artwork;
use App\Models\Podcast;
use App\Models\Episode;
class ImportMissingLegacyArtworkCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'naart:import-legacy-artwork {legacy_artwork_id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Used to import a single legacy artwork item that was missed in the migration.';
/**
* Execute the console command.
*/
public function handle()
{
$legacyArtwork = DB::connection('legacy')->table('artworks')->where('id', $this->argument('legacy_artwork_id'))->first();
$legacyEpisode = DB::connection('legacy')->table('episodes')->where('id', $legacyArtwork->episode_id)->first();
dump($legacyEpisode);
dump($legacyArtwork);
$user = User::where('legacy_id', $legacyArtwork->user_id)->with('artists')->first();
$artist = $user->artists->first();
dump($artist);
$podcast = Podcast::find(1);
$episode = Episode::where('episode_number', $legacyEpisode->episode_number)->first();
dump($episode);
$date = Carbon::parse($legacyArtwork->created_at);
$basename = $date->format('Y')
. '/'
. $date->format('m')
. '/'
. Str::slug($artist->name)
. '_'
. Str::slug($legacyArtwork->title)
. '_'
. Str::random(8)
. '.jpg';
$thumbnailName = 'thumbnails/' . $basename;
$artworkName = 'artworks/' . $basename;
$artworkExists = Artwork::where('artist_id', $artist->id)
->where('episode_id', $episode->id)
->where('title', $legacyArtwork->title)
->count();
$thumbnailExists = false;
$artExists = false;
dump($artworkExists);
dump([$thumbnailName, $artworkName]);
if (Storage::disk('static')->exists($thumbnailName)) {
$this->line('Thumbnail already exists.');
$thumbnailExists = true;
}
if (Storage::disk('static')->exists($artworkName)) {
$this->line('Artwork already exists.');
$artExists = true;
}
dump([$thumbnailExists, $artExists]);
if (!$artworkExists) {
$artwork = Artwork::factory()->state([
'title' => $legacyArtwork->title,
'artist_id' => $artist->id,
'description' => null,
'overlay_id' => null,
'podcast_id' => $podcast->id,
'episode_id' => $episode->id,
'approved_by' => 4,
'filename' => $basename,
'legacy_filename' => $legacyArtwork->path . '/' . $legacyArtwork->filename,
'legacy_id' => $legacyArtwork->id,
'created_at' => $legacyArtwork->created_at,
'updated_at' => $legacyArtwork->created_at,
])->create();
$img = Image::make('/var/www/html/naartgen/podcastartgenerator/static' . $artwork->legacy_filename)
->resize(3000, null, function($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100)
->save(Storage::disk('static')->path('/artworks') . '/' . $artwork->filename);
$thumbImg = Image::make('/var/www/html/naartgen/podcastartgenerator/static' . $artwork->legacy_filename)
->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));
dump($artwork);
}
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Artwork;
class LegacyNginxMappingCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'naart:legacy-nginx-mapping';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$oldLocations = [];
$newLocations = [];
$this->line('# legacy_mappings.conf');
$this->line('');
$this->line('map $uri $new_location {');
$artworks = Artwork::whereNotNull('legacy_filename')->get();
foreach ($artworks as $artwork) {
if (!in_array($artwork->legacy_filename, $oldLocations) && !in_array($artwork->legacy_filename, $newLocations)) {
$oldLocations[] = $artwork->legacy_filename;
$newLocations[] = $artwork->legacy_filename;
$this->line(' "' . $artwork->legacy_filename . '" "/legacy-asset/?legacy_filename=' . urlencode($artwork->legacy_filename) . '";');
}
}
$this->line(' default $uri;');
$this->line('}');
$this->line('');
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Artwork;
use App\Models\Episode;
use Illuminate\Support\Facades\DB;
class RefreshLeaderBoardCacheCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'naart:leaderboard-cache';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Clears all leaderboard caches.';
/**
* Execute the console command.
*/
public function handle()
{
$this->line('Clearing Leaderboard Caches...');
cache()->forget('leaderboardTwelveMonths');
cache()->forget('leaderboardTwelveMonthsLanding');
cache()->forget('leaderboardAllTime');
cache()->forget('leaderboardRollingSixMonth');
cache()->forget('leaderboardNinetyDays');
}
}

View File

@@ -3,7 +3,13 @@
namespace App\Http\Controllers;
use App\Models\Artist;
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\Rule;
class ArtistController extends Controller
{
@@ -14,7 +20,18 @@ class ArtistController extends Controller
*/
public function index()
{
//
$user = auth()->user();
$artists = Artist::whereHas('artworks')
->withCount('artworks')
->orderBy('artworks_count', 'desc')
->paginate(100);
$podcasts = Podcast::where('published', true)->get();
return view('profile.artists', [
'user' => $user,
'pageTitle' => 'Artists',
'podcasts' => $podcasts,
'artists' => $artists,
]);
}
/**
@@ -44,9 +61,23 @@ class ArtistController extends Controller
* @param \App\Models\Artist $artist
* @return \Illuminate\Http\Response
*/
public function show(Artist $artist)
public function show(Request $request, $slug)
{
//
$user = auth()->user();
$artist = Artist::where('slug', $slug)
->firstOrFail();
$artworks = Artwork::where('artist_id', $artist->id)
->with('episode')
->with('podcast')
->orderBy('artworks.created_at', 'desc')
->paginate($perPage = 92, $columns = ['*'], $pageName = 'artworks');
$podcasts = Podcast::where('published', true)->with('episodes')->get();
return view('profile.artist', [
'user' => $user,
'artist' => $artist,
'artworks' => $artworks,
'podcasts' => $podcasts,
]);
}
/**
@@ -69,7 +100,30 @@ class ArtistController extends Controller
*/
public function update(Request $request, Artist $artist)
{
//
$user = auth()->user();
$artist = $user->artists->first();
$rules = [
'location' => ['string', 'max:255'],
'alby' => ['email'],
'website' => ['url'],
'nasocial' => ['starts_with:@'],
'name' => ['string', 'unique:artists', 'max:255'],
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
$artist->location = $request->location;
$artist->alby = $request->alby;
$artist->website = $request->website;
$artist->nasocial = $request->nasocial;
$artist->name = $request->name;
if ($artist->isDirty()) {
$artist->save();
}
return redirect('/profile');
}
/**

View File

@@ -12,8 +12,10 @@ use Illuminate\Validation\Rules\File;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Cache;
use ImageOptimizer;
class ArtworkController extends Controller
@@ -27,11 +29,15 @@ class ArtworkController extends Controller
{
$user = auth()->user();
$artworks = Artwork::whereNotNull('approved_by')
->join('episodes', 'artworks.episode_id', '=', 'episodes.id')
->select('artworks.*', DB::raw('episodes.episode_number episode_number'))
->with('artist')
->orderBy('episode_id', 'desc')
->orderBy('created_at', 'desc')
->paginate($perPage = 100, $columns = ['*'], $pageName = 'artworks');
$podcasts = Podcast::where('published', true)->with('episodes')->get();
->with('podcast')
->with('episode')
->orderBy('episode_number', 'desc')
->orderBy('artworks.created_at', 'desc')
->paginate($perPage = 52, $columns = ['*'], $pageName = 'artworks');
$podcasts = $this->publishedPodcasts();
return view('explore.artworks', [
'user' => $user,
'pageTitle' => 'Explore',
@@ -48,7 +54,7 @@ class ArtworkController extends Controller
public function create()
{
$user = auth()->user();
$podcasts = Podcast::where('published', true)->with('episodes')->get();
$podcasts = $this->publishedPodcasts();
return view('artworks.submit', [
'user' => $user,
'pageTitle' => 'Submit New Artwork',
@@ -56,6 +62,41 @@ class ArtworkController extends Controller
]);
}
public function pendingApproval(Request $request)
{
$user = auth()->user();
if ($request->user()->cannot('approve', Artwork::class)) {
abort(403);
}
$artworks = Artwork::whereNull('approved_by')
->orderBy('created_at', 'desc')
->paginate(50);
$podcasts = $this->publishedPodcasts();
return view('artworks.approvals', [
'user' => $user,
'pageTitle' => 'Approve Artworks',
'podcasts' => $podcasts,
'artworks' => $artworks,
]);
}
public function approve(Request $request)
{
$user = $request->user();
if ($request->user()->cannot('approve', Artwork::class)) {
abort(403);
}
$validated = $request->validate([
'artwork_id' => 'required|exists:artworks,id'
]);
$artwork = Artwork::find($request->artwork_id);
if (is_null($artwork->approved_by)) {
$artwork->approved_by = $user->artists->first()->id;
$artwork->save();
}
return redirect('/approve-artworks');
}
/**
* Store a newly created resource in storage.
*
@@ -99,7 +140,10 @@ class ArtworkController extends Controller
'overlay_id' => null,
'podcast_id' => $podcast->id,
'episode_id' => $episode->id,
//'approved_by' => 4,
'filename' => $filename,
'created_at' => now(),
'updated_at' => now(),
])->create();
$img = Image::make($rawFile)->resize(3000, null, function($constraint){
$constraint->aspectRatio();
@@ -131,6 +175,12 @@ class ArtworkController extends Controller
->with('episode')
->with('artist')
->first();
if (is_null($artwork->approved_by) && $user && $user->id != $artwork->id) {
return redirect('artworks');
}
if (is_null($artwork->approved_by) && !$user) {
return redirect('artworks');
}
return view('artworks.artwork', [
'artwork' => $artwork,
'user' => $user,
@@ -170,4 +220,40 @@ class ArtworkController extends Controller
{
//
}
public function legacyArtLink(Request $request, $any = null)
{
phpinfo();
dd($request->path());
//$artwork = Artwork::where('legacy_filename', '/assets/artwork/')
}
public function downloadArchiveList(Request $request, $type = 'sd')
{
$artworks = Artwork::whereNotNull('approved_by')
->orderBy('created_at', 'desc')
->pluck('filename');
$output = '';
if ($type == 'sd') {
foreach($artworks as $artwork) {
$output .= '"https://static.noagendaartgenerator.com/thumbnails/' . $artwork . '"' . "\r\n";
}
} else {
foreach($artworks as $artwork) {
$output .= '"https://static.noagendaartgenerator.com/artworks/' . $artwork . '"' . "\r\n";
}
}
return response($output, 200)
->header('Content-type', 'text/plain')
->header('Content-Length', strlen($output))
->header('Content-Disposition', 'attachment; filename="naartgen-archivelist-' . $type . '.txt"');
}
private function publishedPodcasts() {
$podcasts = Cache::remember('publishedPodcasts', 30, function() {
return Podcast::where('published', true)->get();
});
return $podcasts;
}
}

View File

@@ -4,10 +4,12 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Artist;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
@@ -31,17 +33,24 @@ class RegisteredUserController extends Controller
public function store(Request $request): RedirectResponse
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'name' => ['unique:artists,name', 'required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'name' => trim($request->name),
'email' => trim(strtolower($request->email)),
'password' => Hash::make($request->password),
]);
$artist = Artist::create([
'user_id' => $user->id,
'name' => trim($request->name),
'slug' => Str::slug(trim($request->name)),
'location' => 'No Agenda Nation',
]);
event(new Registered($user));
Auth::login($user);

View File

@@ -2,8 +2,12 @@
namespace App\Http\Controllers;
use App\Models\Episode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use App\Models\Podcast;
use App\Models\Artworks;
use App\Models\Episode;
class EpisodeController extends Controller
{
@@ -44,9 +48,27 @@ class EpisodeController extends Controller
* @param \App\Models\Episode $episode
* @return \Illuminate\Http\Response
*/
public function show(Episode $episode)
public function show(Request $request, $podcast_slug, $slug)
{
//
$user = auth()->user();
$episode = Episode::where('slug', $slug)
->with('approvedArtworks')
->with('artwork')
->with('podcast')
->firstOrFail();
$podcasts = Podcast::where('published', true)->with('episodes', function ($query) {
$query->orderBy('episode_number', 'desc');
$query->where('published', true);
$query->take(10);
})->get();
return view('episodes.episode', [
'user' => $user,
'pageTitle' => '"' . $episode->title . '" ' . $episode->podcast->name . ' Episode ' . number_format($episode->episode_number + 0),
'podcast' => $episode->podcast,
'episode' => $episode,
'artworks' => $episode->approvedArtworks,
'podcasts' => $podcasts,
]);
}
/**

View File

@@ -18,8 +18,7 @@ class PageController extends Controller
$headerCounters = $this->getHeaderCounters();
$recentEpisodes = $this->mostRecentEpisodes();
$recentSubmissions = $this->mostRecentSubmissions();
$leaderboard = $this->leaderboardTwelveMonths();
$leaderboard = $this->leaderboardTwelveMonthsLanding();
return view('home.page', [
'user' => $user,
'pageTitle' => 'Home',
@@ -31,6 +30,40 @@ class PageController extends Controller
]);
}
public function leaderboards(Request $request)
{
$user = auth()->user();
$current_year = now()->format('Y');
$start_year = 2011;
$years = [];
while($start_year < $current_year) {
$years[] = $start_year;
$start_year++;
}
arsort($years);
return view('leaderboards.leaderboards', [
'user' => $user,
'leaderboardAllTime' => $this->leaderboardAllTime(),
'leaderboardPastTwelveMonths' => $this->leaderboardTwelveMonths(),
'leaderboardRollingSixMonths' => $this->leaderboardRollingSixMonths(),
'leaderboardRollingNinetyDays' => $this->leaderboardRollingNinetyDays(),
'leaderboardYears' => $years,
]);
}
public function support(Request $request)
{
return view('home.support.page', [
'user' => auth()->user(),
'pageTitle' => 'History and Support',
'headerCounters' => $this->getHeaderCounters(),
'recentEpisodes' => $this->mostRecentEpisodes(),
'recentSubmissions' => $this->mostRecentSubmissions(),
'leaderboard' => $this->leaderboardTwelveMonthsLanding(),
'preferredTheme' => $request->session()->get('preferred_theme') ?? 'dark',
]);
}
private function mostRecentSubmissions() {
$artworks = Cache::remember('latestSubmissions', 30, function() {
return Artwork::whereNotNull('approved_by')
@@ -38,7 +71,7 @@ class PageController extends Controller
->with('episode')
->with('podcast')
->orderBy('created_at', 'desc')
->limit(50)
->limit(10)
->get();
});
return $artworks;
@@ -52,8 +85,8 @@ class PageController extends Controller
->with('podcast')
->with('artwork')
->with('artwork.artist')
->orderBy('episode_date', 'desc')
->limit(10)
->orderBy('episode_number', 'desc')
->limit(5)
->get();
});
return $episodes;
@@ -62,13 +95,13 @@ class PageController extends Controller
private function getHeaderCounters()
{
$headerCounters = [];
$artworkCountNumber = Cache::remember('artworkCountNumber', 10, function() {
return Artwork::all()->count();
$artworkCountNumber = Cache::remember('artworkCountNumber', 30, function() {
return Artwork::whereNotNull('approved_by')->count();
});
$artistCountNumber = Cache::remember('artistCountNumber', 10, function() {
$artistCountNumber = Cache::remember('artistCountNumber', 30, function() {
return Artist::all()->count();
});
$episodeCountNumber = Cache::remember('episodeCountNumber', 10, function() {
$episodeCountNumber = Cache::remember('episodeCountNumber', 30, function() {
return Episode::all()->count();
});
$headerCounters['Artworks'] = $this->shortNumberCount($artworkCountNumber);
@@ -99,7 +132,56 @@ class PageController extends Controller
return $response;
}
private function leaderboardByYear($year) {
$leaderboard = cache()->remember('leaderboardForYear' . $year, 30, function() {
$startDate = Carbon::createFromFormat('Y-m-d', $year . '-01-01')->startOfDay()->format('Y-m-d');
$endDate = $startDate->copy()->endOfYear()->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', '>=', $startDate)
->where('episodes.episode_date', '<=', $endDate)
->groupBy('artistId')
->orderByDesc('artworkCount')
->limit(50)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function leaderboardTwelveMonths() {
$leaderboard = cache()->remember('leaderboardTwelveMonths', 30, function() {
$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(50)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function leaderboardTwelveMonthsLanding() {
$leaderboard = cache()->remember('leaderboardTwelveMonthsLanding', 30, function() {
$endDate = now()->endOfDay()->subYear()->format('Y-m-d');
$leaderboard = DB::table('episodes')
->join('artworks', 'artworks.id', '=', 'episodes.artwork_id')
@@ -117,6 +199,75 @@ class PageController extends Controller
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function leaderboardAllTime() {
$leaderboard = cache()->remember('leaderboardAllTime', 30, function() {
$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)
->groupBy('artistId')
->orderByDesc('artworkCount')
->limit(100)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function leaderboardRollingSixMonths() {
$leaderboard = cache()->remember('leaderboardRollingSixMonth', 30, function() {
$endDate = now()->endOfDay()->subMonths(6)->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(50)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function leaderboardRollingNinetyDays() {
$leaderboard = cache()->remember('leaderboardNinetyDays', 30, function() {
$endDate = now()->endOfDay()->subDays(90)->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(50)
->get();
$leaderboard = $this->addArtistModelToLeaderboard($leaderboard);
return $leaderboard;
});
return $leaderboard;
}
private function addArtistModelToLeaderboard($leaderboard) {

View File

@@ -3,8 +3,34 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use App\Models\Podcast;
use App\Models\Artworks;
use App\Models\Episode;
class PodcastController extends Controller
{
//
public function show(Request $request, $slug)
{
$user = auth()->user();
$podcast = Podcast::where('slug', $slug)
->where('published', true)
->firstOrFail();
$episodes = Episode::where('published', true)
->whereNotNull('artwork_id')
->with('artwork')
->with('approvedArtworks')
->where('podcast_id', $podcast->id)
->orderBy('episode_number', 'desc')->paginate(100);
$podcasts = Podcast::where('published', true)->with('episodes')->get();
return view('podcasts.podcast', [
'user' => $user,
'pageTitle' => $podcast->name,
'podcast' => $podcast,
'episodes' => $episodes,
'podcasts' => $podcasts,
]);
}
}

View File

@@ -18,6 +18,8 @@ class ProfileController extends Controller
{
return view('profile.edit', [
'user' => $request->user(),
'artist' => $request->user()->artists->first(),
'avatar' => $request->user()->artists->first()->avatar,
]);
}

View File

@@ -12,7 +12,7 @@ class TrustProxies extends Middleware
*
* @var array<int, string>|string|null
*/
protected $proxies;
protected $proxies = '*';
/**
* The headers that should be used to detect proxies.

View File

@@ -2,12 +2,14 @@
namespace App\Http\Requests\Auth;
use App\Models\User;
use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Hash;
class LoginRequest extends FormRequest
{
@@ -27,7 +29,7 @@ class LoginRequest extends FormRequest
public function rules(): array
{
return [
'email' => ['required', 'string', 'email'],
'login' => ['required', 'string'],
'password' => ['required', 'string'],
];
}
@@ -41,6 +43,8 @@ class LoginRequest extends FormRequest
{
$this->ensureIsNotRateLimited();
/*
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());
@@ -48,7 +52,20 @@ class LoginRequest extends FormRequest
'email' => trans('auth.failed'),
]);
}
*/
$user = User::where('email', $this->login)
->orWhere('name', $this->login)
->first();
if (!$user || !Hash::check($this->password, $user->password)) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'login' => __('auth.failed'),
]);
}
Auth::login($user, $this->boolean('remember'));
RateLimiter::clear($this->throttleKey());
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Livewire\Artist;
use Livewire\Component;
use Livewire\WithFileUploads;
use Spatie\Image\Image;
use Intervention\Image\Facades\Image as InterventionImage;
use ImageOptimizer;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rules\File;
use Illuminate\Http\RedirectResponse;
use Livewire\Attributes\Validate;
class Avatar extends Component
{
use WithFileUploads;
public $avatar;
public $x;
public $y;
public $width;
public $height;
public function render()
{
return view('livewire.artist.avatar');
}
public function save()
{
$disk = Storage::disk('static');
$avatar = $this->avatar->store('avatars', 'static');
Image::load($disk->path($avatar))
->manualCrop($this->width, $this->height, $this->x, $this->y)
->save();
Image::load($disk->path($avatar))
->width(350)
->height(350)
->save();
ImageOptimizer::optimize($disk->path($avatar));
auth()->user()->artists()->first()->update(compact('avatar'));
$this->avatar = null;
return redirect(request()->header('Referer'));
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Livewire\Artist;
use Livewire\Component;
use Livewire\WithFileUploads;
use Spatie\Image\Image;
use Intervention\Image\Facades\Image as InterventionImage;
use ImageOptimizer;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rules\File;
use Illuminate\Http\RedirectResponse;
use Livewire\Attributes\Validate;
class Header extends Component
{
use WithFileUploads;
public $header;
public $x;
public $y;
public $width;
public $height;
public function render()
{
return view('livewire.artist.header');
}
public function save()
{
$disk = Storage::disk('static');
$header = $this->header->store('artist_headers', 'static');
Image::load($disk->path($header))
->manualCrop($this->width, $this->height, $this->x, $this->y)
->save();
Image::load($disk->path($header))
->width(270)
->height(185)
->save();
ImageOptimizer::optimize($disk->path($header));
auth()->user()->artists()->first()->update(compact('header'));
$this->header = null;
return redirect(request()->header('Referer'));
}
}

View File

@@ -9,12 +9,12 @@ class Themeswitch extends Component
public function light()
{
session(['preferred_theme' => 'light']);
session()->put('preferred_theme', 'light');
}
public function dark()
{
session(['preferred_theme' => 'dark']);
session()->put('preferred_theme', 'dark');
}
public function render()

View File

@@ -22,9 +22,25 @@ class Artist extends Model
'deleted_at' => 'datetime',
];
protected $fillable = [
'user_id',
'name',
'slug',
'avatar',
'header',
'location',
'alby',
'naasocial',
'website',
'bio',
'created_at',
'updated_at',
'deleted_at',
];
public function user()
{
return $this->belongs_to(User::class);
return $this->belongsTo(User::class);
}
public function artworks()
@@ -47,4 +63,20 @@ class Artist extends Model
return $this->hasMany(Wallet::class);
}
public function avatar()
{
if (!$this->avatar) {
return config('app.static_asset_url') . '/avatars/default_avatar_male.svg';
}
return config('app.static_asset_url') . '/' . $this->avatar;
}
public function header()
{
if (!$this->header) {
return config('app.static_asset_url') . '/artist_headers/default_artist_banner.png';
}
return config('app.static_asset_url') . '/' . $this->header;
}
}

View File

@@ -31,6 +31,16 @@ class Episode extends Model
return $this->hasOne(Artwork::class, 'id', 'artwork_id');
}
public function approvedArtworks()
{
return $this->hasMany(Artwork::class)->whereNotNull('artworks.approved_by');
}
public function artworks()
{
return $this->hasMany(Artwork::class);
}
public function artist()
{
return $this->hasOneThrough(Artist::class, Artwork::class);

View File

@@ -65,9 +65,9 @@ class User extends Authenticatable
return $this->hasManyThrough(Artwork::class, Artist::class);
}
public function episodes()
public function selectedForEpisodes()
{
return $this->hasManyThrough(Episode::class, Artwork::class);
return $this->artists()->first()->episodes;
}
public function wallets()

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Artwork;
class ArtworkPolicy
{
/**
* Create a new policy instance.
*/
public function __construct()
{
//
}
public function viewAny(?User $user): bool
{
return true;
}
public function approve(User $user): bool
{
if ($user->id == 4) {
return true;
}
$selectedCount = $user->selectedForEpisodes()->count();
if ($selectedCount > 5) {
return true;
}
return false;
}
}

View File

@@ -4,6 +4,8 @@ namespace App\Providers;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use App\Policies\ArtworkPolicy;
use App\Models\Artwork;
class AuthServiceProvider extends ServiceProvider
{
@@ -13,7 +15,7 @@ class AuthServiceProvider extends ServiceProvider
* @var array<class-string, class-string>
*/
protected $policies = [
//
Artwork::class => ArtworkPolicy::class,
];
/**

0
site/artisan Executable file → Normal file
View File

3
site/build.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
yarn build
mv ./public/build/.vite/manifest.json ./public/build/manifest.json

View File

@@ -19,6 +19,8 @@
"laravel/tinker": "^2.8",
"livewire/livewire": "^3.2",
"mckenziearts/blade-untitledui-icons": "^1.2",
"predis/predis": "^2.2",
"spatie/image": "^2.2",
"spatie/laravel-image-optimizer": "^1.7"
},
"require-dev": {

842
site/composer.lock generated

File diff suppressed because it is too large Load Diff

159
site/config/livewire.php Normal file
View File

@@ -0,0 +1,159 @@
<?php
return [
/*
|---------------------------------------------------------------------------
| Class Namespace
|---------------------------------------------------------------------------
|
| This value sets the root class namespace for Livewire component classes in
| your application. This value will change where component auto-discovery
| finds components. It's also referenced by the file creation commands.
|
*/
'class_namespace' => 'App\\Livewire',
/*
|---------------------------------------------------------------------------
| View Path
|---------------------------------------------------------------------------
|
| This value is used to specify where Livewire component Blade templates are
| stored when running file creation commands like `artisan make:livewire`.
| It is also used if you choose to omit a component's render() method.
|
*/
'view_path' => resource_path('views/livewire'),
/*
|---------------------------------------------------------------------------
| Layout
|---------------------------------------------------------------------------
| The view that will be used as the layout when rendering a single component
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
| In this case, the view returned by CreatePost will render into $slot.
|
*/
'layout' => 'components.layouts.app',
/*
|---------------------------------------------------------------------------
| Lazy Loading Placeholder
|---------------------------------------------------------------------------
| Livewire allows you to lazy load components that would otherwise slow down
| the initial page load. Every component can have a custom placeholder or
| you can define the default placeholder view for all components below.
|
*/
'lazy_placeholder' => null,
/*
|---------------------------------------------------------------------------
| Temporary File Uploads
|---------------------------------------------------------------------------
|
| Livewire handles file uploads by storing uploads in a temporary directory
| before the file is stored permanently. All file uploads are directed to
| a global endpoint for temporary storage. You may configure this below:
|
*/
'temporary_file_upload' => [
'disk' => 'local', // Example: 'local', 's3' | Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => 'tmp', // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
'mov', 'avi', 'wmv', 'mp3', 'm4a',
'jpg', 'jpeg', 'mpga', 'webp', 'wma',
],
'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
],
/*
|---------------------------------------------------------------------------
| Render On Redirect
|---------------------------------------------------------------------------
|
| This value determines if Livewire will run a component's `render()` method
| after a redirect has been triggered using something like `redirect(...)`
| Setting this to true will render the view once more before redirecting
|
*/
'render_on_redirect' => false,
/*
|---------------------------------------------------------------------------
| Eloquent Model Binding
|---------------------------------------------------------------------------
|
| Previous versions of Livewire supported binding directly to eloquent model
| properties using wire:model by default. However, this behavior has been
| deemed too "magical" and has therefore been put under a feature flag.
|
*/
'legacy_model_binding' => false,
/*
|---------------------------------------------------------------------------
| Auto-inject Frontend Assets
|---------------------------------------------------------------------------
|
| By default, Livewire automatically injects its JavaScript and CSS into the
| <head> and <body> of pages containing Livewire components. By disabling
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
*/
'inject_assets' => true,
/*
|---------------------------------------------------------------------------
| Navigate (SPA mode)
|---------------------------------------------------------------------------
|
| By adding `wire:navigate` to links in your Livewire application, Livewire
| will prevent the default link handling and instead request those pages
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
*/
'navigate' => [
'show_progress_bar' => true,
'progress_bar_color' => '#2299dd',
],
/*
|---------------------------------------------------------------------------
| HTML Morph Markers
|---------------------------------------------------------------------------
|
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
| after each update. To make this process more reliable, Livewire injects
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
*/
'inject_morph_markers' => true,
/*
|---------------------------------------------------------------------------
| Pagination Theme
|---------------------------------------------------------------------------
|
| When enabling Livewire's pagination feature by using the `WithPagination`
| trait, Livewire will use Tailwind templates to render pagination views
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
*/
'pagination_theme' => 'bootstrap',
];

View File

@@ -5,6 +5,7 @@ namespace Database\Factories;
use App\Models\Artist;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Str;
class ArtistFactory extends Factory
{
@@ -22,12 +23,17 @@ class ArtistFactory extends Factory
*/
public function definition()
{
$name = fake()->name();
$slug = Str::slug(strtolower(trim($name)));
return [
'user_id' => User::factory(),
'name' => fake()->name(),
'name' => $name,
'slug' => $slug,
'avatar' => fake()->imageUrl(512, 512),
'header' => fake()->imageUrl(270, 185),
'location' => fake()->city() . ', ' . fake()->state(),
'alby' => null,
'naasocial' => null,
'website' => rand(0, 1) ? fake()->url : null,
'bio' => fake()->paragraphs(rand(1, 3), true),
];

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('artists', function (Blueprint $table) {
$table->string('slug')->after('name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artists', function (Blueprint $table) {
$table->dropColumn('slug');
});
}
};

View File

@@ -0,0 +1,34 @@
<?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->index('podcast_id');
$table->index('artist_id');
$table->index('episode_id');
$table->index('legacy_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artworks', function (Blueprint $table) {
$table->dropIndex('podcast_id');
$table->dropIndex('artist_id');
$table->dropIndex('episode_id');
$table->dropIndex('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('artists', function (Blueprint $table) {
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artists', function (Blueprint $table) {
$table->dropIndex('user_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('podcasts', function (Blueprint $table) {
$table->index('published');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('podcasts', function (Blueprint $table) {
$table->dropIndex('published');
});
}
};

View File

@@ -0,0 +1,34 @@
<?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('episodes', function (Blueprint $table) {
$table->index('podcast_id');
$table->index('artwork_id');
$table->index('episode_date');
$table->index('published');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('episodes', function (Blueprint $table) {
$table->dropIndex('podcast_id');
$table->dropIndex('artwork_id');
$table->dropIndex('episode_date');
$table->dropIndex('published');
});
}
};

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->unique('name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropUnique('name');
});
}
};

View File

@@ -0,0 +1,30 @@
<?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('artists', function (Blueprint $table) {
$table->string('alby')->nullable()->after('location');
$table->string('nasocial')->nullable()->after('location');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('artists', function (Blueprint $table) {
$table->dropColumn('alby');
$table->dropColumn('nasocial');
});
}
};

View File

@@ -14,12 +14,14 @@
"postcss": "^8.4.6",
"sass": "^1.63.6",
"tailwindcss": "^3.1.0",
"vite": "^4.0.0",
"vite": "^5.0.9",
"wolfy87-eventemitter": "4.2.0"
},
"version": "0.0.0",
"dependencies": {
"aos": "^3.0.0-beta.6",
"cropperjs": "^1.6.1",
"guillotine": "^1.3.1",
"isotope-layout": "^3.0.6",
"jquery": "^3.7.0",
"jquery-nice-select": "^1.1.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

3
site/public/pinfo.php Normal file
View File

@@ -0,0 +1,3 @@
<?php
die('nope');
phpinfo();

View File

@@ -1,2 +1,2 @@
User-agent: *
Disallow: /
Disallow: /profile

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -70,7 +70,9 @@ Modified by : Paul Couture (bonked@noagendaartgenerator.com)
@import "components/signup";
@import "components/not-found";
@import "components/footer";
@import "components/auth";
@import "components/nft-gallery";
@import "./../css/vendor/nice-select.css";
@import "components/light-version";
@import "components/pagination";

View File

@@ -0,0 +1,32 @@
.authbox {
background: $bg-color-1;
padding: 15px;
border-radius: 10px;
transition: 0.3s;
border: 1px solid $bg-color-1;
&.button[type=submit] {
background: $color-primary;
}
}
.theme-light {
.authbox {
background: $body-bg-light;
border-color: darken($body-bg-light, 10%);
}
}
img.avatar_img {
max-width: 100%;
height: auto;
}
label[for=avatar] {
img {
&:hover {
cursor:pointer;
}
}
}
input[name=avatar] {
&.sr-only {
display: none;
}
}

View File

@@ -143,3 +143,11 @@
padding-left: 0;
}
}
div.alert {
&.alert-warning {
strong {
color: #664d03;
}
}
}

View File

@@ -121,6 +121,16 @@
}
}
.slider-activation-banner-4 {
.explore-style-one {
&.selected {
background: $bg-color-1;
border-color: $bg-color-1;
}
}
}
.reaction-btn {
border: none;
font-size: 14px;

View File

@@ -256,12 +256,22 @@ body {
}
}
.explore-style-one {
border: 1px solid $border-color-light;
border: 1px solid $border-color;
&.selected {
background: $bg-color-selected-light;
border-color: $color-primary;
}
&:hover {
border: 1px solid $color-error;
border-color: $color-primary-2;
}
}
.slider-activation-banner-4 {
.explore-style-one {
&.selected {
border-color: $body-bg-light2;
background: $body-bg-light;
}
}
}
.explore-style-two,

View File

@@ -16,9 +16,9 @@ $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%);
$selected-border: $color-primary;
$bg-color-selected: linear-gradient(135deg, $bg-color-1 0%, #854286 100%);
$bg-color-selected-light: linear-gradient(135deg, #fee0fe 0%, #e1bee1 100%);
// font family
$font-1: "Poppins", sans-serif;

View File

@@ -0,0 +1,93 @@
@extends('layouts.master')
@section('page-title', 'Approve Artwork')
@section('meta_description', 'Approve Artwork to have it published for non-priviledged eyeballs to view.')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Artwork Pending Approval</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)
@php
$thisArtwork = $artwork;
$thisPodcast = $artwork->podcast;
$thisEpisode = $artwork->episode;
@endphp
<div class="grid-item podcast--{{ $artwork->podcast->slug }}">
<div class="explore-style-one">
<div class="thumb">
<img src="{{ config('app.static_asset_url') . '/thumbnails/' . $thisArtwork->filename ?? '#'}}"
alt="{{ $thisArtwork->title }} by {{ $thisArtwork->artist->name }}">
</div>
<div class="content">
<div class="header d-flex-between pt-4 pb-1">
<h3 class="title">&ldquo;{{ $thisArtwork->title }}&rdquo;</h3>
</div>
{{-- End .header --}}
<div class="product-owner py-1 d-flex-between">
<span class="bid-owner">Artwork By <br><strong><a
href="/artist/{{ $thisArtwork->artist->slug }}">{{ $thisArtwork->artist->name ?? 'Unknown' }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $thisArtwork->artist->slug }}"
class="avatar" data-bs-toggle="tooltip"
data-bs-placement="top"
title="{{ $thisArtwork->artist->name }}">
<img class="avatar_img" src="{{ $thisArtwork->artist->avatar() }}"
alt="{{ $thisArtwork->artist->name }}"></a>
</span>
</div>
{{-- End .product-owner --}}
<div class="action-wrapper py-5 d-flex align-items-center justify-content-center">
<form action="/approve-artworks" method="POST" class="approve-artwork-form" name="approve-artwork-{{ $thisArtwork->id}}" enctype="multipart/form-data">
@csrf
<input name="artwork_id" type="hidden" value="{{ $thisArtwork->id }}">
<button type="submit" class="btn btn-gradient btn-medium justify-content-center"><span>Approve and Publish</span></button>
</form>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
<div class="container">
<div class="row">
{{ $artworks->links() }}
</div>
</div>
</section>
@endsection

View File

@@ -1,10 +1,17 @@
@extends('layouts.master')
@section('meta_description', $artwork->description ?? 'Artwork by ' . $artwork->artist->name . ', "' . $artwork->title . '" for the podcast ' . $artwork->podcast->name . '.')
@section('meta_og_img', config('app.static_asset_url') . '/thumbnails/' . $artwork->filename)
@section('page-title', '"' . $artwork->title . '" by ' . $artwork->artist->name)
@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>
<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>
@@ -19,11 +26,24 @@
@section('page-content')
<section class="product-details section-bg-separation-2 pt-120 pb-90">
<div class="container">
@if (auth()->user() && $artwork->artist->id == auth()->user()->artists()->first()->id)
@if ($artwork->approved_by == null)
<div class="row">
<div class="col">
<div class="alert alert-warning">
<strong>Pending Approval</strong><br>
This artwork has been received by our server, but has not been approved and can only be viewed by you.
Another artist with approval authority will come along shortly and approve it, give them a few minutes.
</div>
</div>
</div>
@endif
@endif
<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 }}"
<div class="thumb"><a href="{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}"
><img id="largeImage"src="{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}"
alt="{{ $artwork->title }} by {{ $artwork->artist->name }} for {{ $artwork->podcast->title }}"></a>
</div>
</div>
@@ -34,39 +54,57 @@
<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') }}
Episode {{ number_format($artwork->episode->episode_number + 0) }} &middot;
{{ $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 }}"
<div class="container">
<div class="row">
<div class="col">
<a class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"
href="{{ config('app.static_asset_url') }}/artworks/{{ $artwork->filename }}">
<span>Download 3k px Image</span></a>
</div>
<div class="col">
<a class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"
href="{{ config('app.static_asset_url') }}/thumbnails/{{ $artwork->filename }}">
<span>Download 512 px Image</span></a>
</div>
</div>
<div class="row">
<div class="col">
@if ($artwork->episode->artwork)
<a href="/podcast/{{ $artwork->episode->podcast->slug }}/episode/{{ $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
View Episode
</span></a>
</div>
<div class="col">
@endif
<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
{{ $artwork->podcast->name }} Podcast
</span></a>
</div>
</div>
<div class="row">
<div class="col">
<a href="/artist/{{ $artwork->artist->slug }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-user-fill"></i>
View {{ $artwork->artist->name }}'s Artist Profile
</span></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,72 @@
<div class="explore-style-one {{ $thisEpisode->artwork_id == $thisArtwork->id ? 'selected' : '' }}">
<div class="thumb">
<a href="/artworks/{{ $thisArtwork->id }}"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="View This Album Art">
<img src="{{ config('app.static_asset_url')
. '/thumbnails/'
. $thisArtwork->filename ?? '#'}}"
alt="{{ $thisArtwork->title }} by {{ $thisArtwork->artist->name }}">
</a>
</div>
{{-- End .thumb --}}
<div class="content">
<div class="header d-flex-between pt-4 pb-1">
<h3 class="title">
<a href="/artworks/{{ $thisArtwork->id }}">"{{ $thisArtwork->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="/podcasts/{{ $thisPodcast->slug }}">View Podcast</a></li>
@if ($thisEpisode->published)
<li><a class="dropdown-item" href="/podcast/{{ $thisPodcast->slug }}/episode/{{ $thisEpisode->slug }}">View Episode</a></li>
@endif
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="/artist/{{ $thisArtwork->artist->id }}">View Selected Artist</a></li>
</ul>
</div>
</div>
{{-- .header --}}
<div class="product-owner py-1 d-flex-between">
<span class="bid-owner">Artwork By <br><strong><a
href="/artist/{{ $thisArtwork->artist->slug }}">{{ $thisArtwork->artist->name ?? 'Unknown' }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $thisArtwork->artist->slug }}"
class="avatar" data-bs-toggle="tooltip"
data-bs-placement="top"
title="{{ $thisArtwork->artist->name }}">
<img class="avatar_img" src="{{ $thisArtwork->artist->avatar() }}"
alt="{{ $thisArtwork->artist->name }}"></a>
</span>
</div>
{{-- End .product-owner --}}
<div class="action-wrapper py-1 d-flex-between">
<span class="bid-owner">
@if($thisArtwork->id == $thisEpisode->artwork_id)
Artwork Selected For
@else
Artwork Submitted For
@endif
<br>
@if ($thisPodcast->published)
<strong><a href="/podcasts/{{ $thisPodcast->slug }}">{{ $thisPodcast->name }}</a></strong>
@else
<strong>{{ $thisPodcast->name }}</strong>
@endif
<br>
@if ($thisEpisode->published)
<a href="/podcast/{{ $thisPodcast->slug }}/episode/{{ $thisEpisode->slug }}">Episode {{ number_format($thisEpisode->episode_number + 0) }}<br>
<em>{{ $thisEpisode->episode_date->format('D, M j') }}<sup>{{ $thisEpisode->episode_date->format('S') }}</sup>{{ $thisEpisode->episode_date->format(', Y') }}</em></a>
@else
Episode {{ number_format($thisEpisode->episode_number + 0) }}<br>
<em>{{ $thisEpisode->episode_date->format('D, M j') }}<sup>{{ $thisEpisode->episode_date->format('S') }}</sup>{{ $thisEpisode->episode_date->format(', Y') }}</em>
@endif
</span>
</div>
{{-- action-wrapper --}}
</div>
{{-- End .content --}}
</div>

View File

@@ -2,23 +2,19 @@
<div class="mb-4 text-sm text-gray-600 dark:text-gray-400">
{{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }}
</div>
<!-- Session Status -->
{{-- Session Status --}}
<x-auth-session-status class="mb-4" :status="session('status')" />
<form method="POST" action="{{ route('password.email') }}">
@csrf
<!-- Email Address -->
{{-- Email Address --}}
<div>
<x-input-label for="email" :value="__('Email')" />
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus />
<x-input-error :messages="$errors->get('email')" class="mt-2" />
</div>
<div class="flex items-center justify-end mt-4">
<x-primary-button>
{{ __('Email Password Reset Link') }}
<div class="flex items-center justify-end mt-4 mb-4">
<x-primary-button class="btn btn-gradient btn-medium">
<span>{{ __('Email Password Reset Link') }}</span>
</x-primary-button>
</div>
</form>

View File

@@ -1,47 +1,54 @@
<x-guest-layout>
<!-- Session Status -->
<div class="row mt-4 gutter-0">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h2 class="mb-2">Sign in with your existing account</h2>
<p class="normal">Welcome back! Please enter your credentials to sign in.</p>
<p class="normal">If you haven't logged in with your existing account since the upgrade, you need to reset your password using the forgot password link below.</p>
</div>
</div>
</div>
</div>
{{-- Session Status --}}
<x-auth-session-status class="mb-4" :status="session('status')" />
<form method="POST" action="{{ route('login') }}">
@csrf
<!-- Email Address -->
{{-- Email Address --}}
<div>
<x-input-label for="email" :value="__('Email')" />
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" />
<x-input-error :messages="$errors->get('email')" class="mt-2" />
<x-input-label for="login" :value="__('Email or Username')" />
<x-text-input id="login" class="block mt-1 w-full" type="text" name="login" :value="old('login')" required autofocus autocomplete="username" />
<x-input-error :messages="$errors->get('login')" class="mt-2" />
</div>
<!-- Password -->
{{-- Password --}}
<div class="mt-4">
<x-input-label for="password" :value="__('Password')" />
<x-text-input id="password" class="block mt-1 w-full"
type="password"
name="password"
required autocomplete="current-password" />
<x-input-error :messages="$errors->get('password')" class="mt-2" />
</div>
<!-- Remember Me -->
<div class="block mt-4">
<label for="remember_me" class="inline-flex items-center">
<input id="remember_me" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="remember">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Remember me') }}</span>
{{-- Remember Me --}}
<div class="block mt-4 form-check">
<input id="remember_me" type="checkbox" class="form-check-input" name="remember">
<label for="remember_me" class="form-check-label">
{{ __('Remember me') }}
</label>
</div>
<div class="flex items-center justify-end mt-4">
<div class="d-flex justify-content-end mt-4 mb-4 text-end">
@if (Route::has('password.request'))
<a class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800" href="{{ route('password.request') }}">
<a class="" href="{{ route('password.request') }}">
{{ __('Forgot your password?') }}
</a>
@endif
<x-primary-button class="ml-3">
{{ __('Log in') }}
<x-primary-button class="ml-3 btn btn-gradient" style="background:#ff512f;">
<span>{{ __('Log in') }}</span>
</x-primary-button>
</div>
</form>
<hr class="mb-4">
<div class="">
Not registered yet? <a href="/register" class="">Register Now</a>
</div>
</x-guest-layout>

View File

@@ -4,7 +4,7 @@
<!-- Name -->
<div>
<x-input-label for="name" :value="__('Name')" />
<x-input-label for="name" :value="__('Display Name')" />
<x-text-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus autocomplete="name" />
<x-input-error :messages="$errors->get('name')" class="mt-2" />
</div>
@@ -44,8 +44,8 @@
{{ __('Already registered?') }}
</a>
<x-primary-button class="ml-4">
{{ __('Register') }}
<x-primary-button class="ml-4 btn btn-gradient" style="background:#ff512f;">
<span>{{ __('Register') }}</span>
</x-primary-button>
</div>
</form>

View File

@@ -1,3 +1,3 @@
<svg viewBox="0 0 316 316" xmlns="http://www.w3.org/2000/svg" {{ $attributes }}>
<path d="M305.8 81.125C305.77 80.995 305.69 80.885 305.65 80.755C305.56 80.525 305.49 80.285 305.37 80.075C305.29 79.935 305.17 79.815 305.07 79.685C304.94 79.515 304.83 79.325 304.68 79.175C304.55 79.045 304.39 78.955 304.25 78.845C304.09 78.715 303.95 78.575 303.77 78.475L251.32 48.275C249.97 47.495 248.31 47.495 246.96 48.275L194.51 78.475C194.33 78.575 194.19 78.725 194.03 78.845C193.89 78.955 193.73 79.045 193.6 79.175C193.45 79.325 193.34 79.515 193.21 79.685C193.11 79.815 192.99 79.935 192.91 80.075C192.79 80.285 192.71 80.525 192.63 80.755C192.58 80.875 192.51 80.995 192.48 81.125C192.38 81.495 192.33 81.875 192.33 82.265V139.625L148.62 164.795V52.575C148.62 52.185 148.57 51.805 148.47 51.435C148.44 51.305 148.36 51.195 148.32 51.065C148.23 50.835 148.16 50.595 148.04 50.385C147.96 50.245 147.84 50.125 147.74 49.995C147.61 49.825 147.5 49.635 147.35 49.485C147.22 49.355 147.06 49.265 146.92 49.155C146.76 49.025 146.62 48.885 146.44 48.785L93.99 18.585C92.64 17.805 90.98 17.805 89.63 18.585L37.18 48.785C37 48.885 36.86 49.035 36.7 49.155C36.56 49.265 36.4 49.355 36.27 49.485C36.12 49.635 36.01 49.825 35.88 49.995C35.78 50.125 35.66 50.245 35.58 50.385C35.46 50.595 35.38 50.835 35.3 51.065C35.25 51.185 35.18 51.305 35.15 51.435C35.05 51.805 35 52.185 35 52.575V232.235C35 233.795 35.84 235.245 37.19 236.025L142.1 296.425C142.33 296.555 142.58 296.635 142.82 296.725C142.93 296.765 143.04 296.835 143.16 296.865C143.53 296.965 143.9 297.015 144.28 297.015C144.66 297.015 145.03 296.965 145.4 296.865C145.5 296.835 145.59 296.775 145.69 296.745C145.95 296.655 146.21 296.565 146.45 296.435L251.36 236.035C252.72 235.255 253.55 233.815 253.55 232.245V174.885L303.81 145.945C305.17 145.165 306 143.725 306 142.155V82.265C305.95 81.875 305.89 81.495 305.8 81.125ZM144.2 227.205L100.57 202.515L146.39 176.135L196.66 147.195L240.33 172.335L208.29 190.625L144.2 227.205ZM244.75 114.995V164.795L226.39 154.225L201.03 139.625V89.825L219.39 100.395L244.75 114.995ZM249.12 57.105L292.81 82.265L249.12 107.425L205.43 82.265L249.12 57.105ZM114.49 184.425L96.13 194.995V85.305L121.49 70.705L139.85 60.135V169.815L114.49 184.425ZM91.76 27.425L135.45 52.585L91.76 77.745L48.07 52.585L91.76 27.425ZM43.67 60.135L62.03 70.705L87.39 85.305V202.545V202.555V202.565C87.39 202.735 87.44 202.895 87.46 203.055C87.49 203.265 87.49 203.485 87.55 203.695V203.705C87.6 203.875 87.69 204.035 87.76 204.195C87.84 204.375 87.89 204.575 87.99 204.745C87.99 204.745 87.99 204.755 88 204.755C88.09 204.905 88.22 205.035 88.33 205.175C88.45 205.335 88.55 205.495 88.69 205.635L88.7 205.645C88.82 205.765 88.98 205.855 89.12 205.965C89.28 206.085 89.42 206.225 89.59 206.325C89.6 206.325 89.6 206.325 89.61 206.335C89.62 206.335 89.62 206.345 89.63 206.345L139.87 234.775V285.065L43.67 229.705V60.135ZM244.75 229.705L148.58 285.075V234.775L219.8 194.115L244.75 179.875V229.705ZM297.2 139.625L253.49 164.795V114.995L278.85 100.395L297.21 89.825V139.625H297.2Z"/>
<svg viewBox="0 0 311.87 279.03" xmlns="http://www.w3.org/2000/svg" {{ $attributes }}>
<path d="m132.89,113.34c-3.83-5-6.11-11.23-6.15-17.98-.06-10.67,5.66-20.22,14.2-25.61,5.64-17.37,13.21-36.47,17.32-46.56,1.72-4.19,6.12-6.62,10.59-5.84.59.1,1.19.21,1.79.31,5.52.96,9.62,5.64,9.85,11.22.44,11.29,1,30.69.43,48,4.15,5.4,6.35,12.03,6.07,18.44.03,10.37-5.2,19.5-13.18,24.88-7.5,22.62-19.69,48.42-19.69,48.42l-19.04-3.4s-2.75-28.16-2.2-51.9Zm-93.56,76.84C-13.52,138.26-12.77,51.21,39.54.03c6.27,6.36,12.53,12.71,18.88,19.15-20.29,21.04-31.21,46.42-31.21,76.04,0,29.54,10.86,54.87,31.33,76.16-6.36,6.23-12.73,12.46-19.22,18.81ZM253.32,19.02c6.34-6.36,12.64-12.69,18.95-19.02,53.73,52.17,51.88,140.86,0,190.36-6.29-6.24-12.58-12.49-19.02-18.87,20.54-21.26,31.44-46.66,31.45-76.24,0-29.61-10.89-55.02-31.38-76.22Zm-162.96,120.8c-6.4,6.04-12.69,11.97-18.98,17.91-33.28-32.01-35.51-90.23.53-125.65.27.2.58.38.83.62,5.87,5.87,11.73,11.75,17.75,17.79-11.86,12.38-18.31,27.1-18.41,44.33-.11,17.26,6.15,32.07,18.28,45ZM221.64,50.62c6.21-6.21,12.31-12.32,18.41-18.42,34.65,33.53,35.13,91.68-.02,126.08-6.23-6.05-12.47-12.1-18.7-18.15,24.51-25.18,24.65-64.55.31-89.51Zm-12.58,11.55c15.08,16.75,16.66,46.4.82,65.1-3.47-3.37-6.98-6.71-10.35-10.19-.3-.31.06-1.58.44-2.19,3.76-5.96,5.68-12.48,5.74-19.48.06-7.31-1.92-14.13-6-20.24-1.02-1.52-.97-2.47.39-3.78,3.08-2.96,5.97-6.12,8.96-9.21Zm-107.03,65.2c-15.79-19.15-14.21-48.23.38-64.8,3.56,3.56,7.13,7.13,10.35,10.35-1.86,4.61-4.19,9.01-5.42,13.71-2.59,9.86-.9,19.29,4.48,27.97.89,1.44,1.03,2.34-.33,3.59-3.2,2.94-6.24,6.05-9.45,9.19Zm55.46,92.35c.49,5.5,1.16,11.32-1.96,16.6-15.21,25.68-10.64,28.7-4.53,42.7-18.76-9.71-37.77-44.41-34.49-65.39,1.95.87,3.95,1.68,5.99,2.4,1,.36,2.05.29,2.96-.11.51.85,1.34,1.51,2.35,1.8,2.61.74,5.28,1.35,8,1.83.4.07,1.84.27,2.18.32,2.03.33,2.8.43,4.81.62,1.4.13,2.72-.49,3.53-1.54.71,1.13,1.96,1.87,3.37,1.88,2.52.02,3.21-.08,5.69-.29.78-.07,1.51-.36,2.11-.82Zm-40.03-10.04c7.25-12.91,12.95-26.71,16.95-41.48l3.77.66-1.13,15.32,3.23-14.95,4.12.72-8.51,45.54c-2.59-.46-4.54-.91-7.02-1.61l.4-16.31-5.45,14.71c-2.18-.78-4.31-1.64-6.38-2.59Zm39.4,6.88c-2.36.2-4.74.29-7.14.27l-1.24-7.59-3.61-.63-1.71,7.9c-1.89-.17-1.73-.26-3.64-.58l7.43-45.6,6.27,1.14c-.66,15.36.62,30.38,3.64,45.09Zm-6.97-15.41c-.68-7.31-.69-13.66-.59-19.87l-3.09,19.23,3.68.64Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,3 +1,3 @@
<button {{ $attributes->merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150']) }}>
<button {{ $attributes->merge(['type' => 'submit']) }}>
{{ $slot }}
</button>

View File

@@ -0,0 +1,118 @@
@extends('layouts.master')
@section('page-title', $pageTitle)
@section('meta_og_img', config('app.static_asset_url') . '/thumbnails/' . $episode->artwork->filename)
@section('meta_description', 'Artwork for the ' . $episode->podcast->name . ' podcast, episode ' . $episode->episode_number + 0 . ' by ' . $episode->artwork->artist->name)
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">"{{ $episode->title }}"</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="/podcasts">Podcasts</a></li>
<li class="breadcrumb-item"><a href="/podcasts/{{ $episode->podcast->slug }}">{{ $episode->podcast->name }}</a></li>
<li class="breadcrumb-item active">Ep. {{ number_format($episode->episode_number + 0) }}</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="{{ config('app.static_asset_url') }}/artworks/{{ $episode->artwork->filename }}"
><img id="largeImage"src="{{ config('app.static_asset_url') }}/artworks/{{ $episode->artwork->filename }}"
alt="{{ $episode->artwork->title }} by {{ $episode->artwork->artist->name }} for {{ $episode->artwork->podcast->title }}"></a>
</div>
</div>
</div>
<div class="col-xxl-6 mb-6 mb-6">
<div class="details-content">
<h2 class="main_title">{{ $episode->podcast->name }}<br> &ldquo;{{ $episode->title }}&rdquo;</h2>
<h4 class="mb-1">Episode {{ number_format($episode->episode_number + 0) }}</h4>
<h4 class="mb-4">{{ $episode->episode_date->format('l, F j') }}<sup>{{ $episode->episode_date->format('S') }}</sup>,
{{ $episode->episode_date->format('Y') }}</h4>
<h4 class="mb-4">Artwork By: <a href="/artist/{{ $episode->artwork->artist->slug }}">{{ $episode->artwork->artist->name }}</a></h4>
<p class="subtitle">
{{ number_format($artworks->count()) }} Artworks Submitted.
</p>
<div class="container">
<div class="row">
<div class="col">
<a class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"
href="{{ config('app.static_asset_url') }}/artworks/{{ $episode->artwork->filename }}">
<span>Download 3,000 px Image</span></a>
</div>
<div class="col">
<a class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"
href="{{ config('app.static_asset_url') }}/thumbnails/{{ $episode->artwork->filename }}">
<span>Download 512px Image</span></a>
</div>
</div>
<div class="row">
<div class="col">
<a href="{{ $episode->mp3 }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-headphone-fill"></i>
Direct Link to MP3
</span></a>
</div>
</div>
<div class="row">
<div class="col">
<a href="/podcasts/{{ $episode->podcast->slug }}"
class="btn btn-medium btn-gradient w-100 justify-content-center mt-5"><span><i
class="ri-broadcast-line"></i>
More From {{ $episode->podcast->name }}
</span></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
{{-- Start Live Auction --}}
<section class="ptb-120 live-auction">
<div class="container">
<div class="section-title">
<span class="subtitle">Other Submitted Artworks</span>
<h3>{{ number_format($artworks->count() - 1) }} other art pieces submitted</h3>
</div>
</div>
<div class="container">
{{-- End .section-title --}}
<div class="grid-filter-wrapper masonry-list">
<div class="resizer"></div>
@foreach ($artworks as $recent)
@if ($recent->id != $episode->artwork_id)
@php
$thisArtwork = $recent;
$thisPodcast = $recent->podcast;
$thisEpisode = $recent->episode;
@endphp
<div class="grid-item">
@include('artworks.card')
</div>
@endif
@endforeach
{{-- End .slick-activation-01 --}}
</div>
{{-- End .container --}}
</div>
</section>
{{-- End Live Auction --}}
@endsection

View File

@@ -1,5 +1,9 @@
@extends('layouts.master')
@section('page-title', 'Submitted Artwork')
@section('meta_description', 'Explore the artwork submitted at the No Agenda Art Generator.')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
@@ -35,39 +39,13 @@
<div class="grid-filter-wrapper masonry-list">
<div class="resizer"></div>
@foreach ($artworks as $artwork)
@php
$thisArtwork = $artwork;
$thisPodcast = $artwork->podcast;
$thisEpisode = $artwork->episode;
@endphp
<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>
@include('artworks.card')
</div>
@endforeach
</div>

View File

@@ -1,11 +1,18 @@
{{-- Start Setup Wallet --}}
<section class="wallet-setup ptb-120">
<div class="container">
<div class="d-flex-between">
<div class="section-title">
<span class="subtitle">WHAT THIS IS</span>
<span class="subtitle">What this is</span>
<h2>Artists + Podcasters = <i class="ri-heart-fill"></i></h2>
</div>
{{-- End .section-title --}}
<div class="text-large">
<a href="/support-development">Learn More About This</a>
</div>
</div>
</div>
<div class="container">
<div class="row">
<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>
@@ -34,6 +41,7 @@
</p>
</div>
</div>
</div>
{{-- End .row --}}
</div>
{{-- End .container --}}

View File

@@ -1,44 +0,0 @@
<div class="explore-style-one">
<div class="thumb">
<a href="product-details.html"> <img src="{{ 'http://' . config('app.static_asset_url') . '/thumbnails/' . $recentEpisode->artwork->filename ?? '#'}}"
alt="nft live auction thumbnail"></a>
<!-- End .reaction-count -->
</div>
<!-- End .thumb -->
<div class="content">
<div class="header d-flex-between pt-4 pb-1">
<h3 class="title">
<a href="product-details.html">"{{ $recentEpisode->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="#">View Episode</a></li>
<li><a class="dropdown-item" href="#">View Podcast</a></li>
<li><a class="dropdown-item" href="#">View Show Notes</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">View Selected Artist</a></li>
</ul>
</div>
</div>
<!-- .header -->
<div class="product-owner py-1 d-flex-between">
<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) }}<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($recentEpisode->artwork->artist->avatar ?? 'resources/img/default_avatars/default_avatar_male.svg') }}"
alt="{{ $recentEpisode->artwork->artist->name }}"></a></span>
</div>
<!-- End .product-owner -->
</div>
<!-- End .content -->
</div>

View File

@@ -1,7 +1,12 @@
<div class="slider slider-activation-banner-4 slick-gutter-15 slick-pagination-50">
@foreach($recentEpisodes as $recentEpisode)
@if ($recentEpisode->artwork)
@include('home.hero.slider.slide')
@php
$thisArtwork = $recentEpisode->artwork;
$thisEpisode = $recentEpisode;
$thisPodcast = $recentEpisode->podcast;
@endphp
@include('artworks.card')
@endif
@endforeach
</div>

View File

@@ -2,21 +2,21 @@
<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 }}"
<a href="/artist/{{ $leaderboardArtist->artist->slug }}" class="thumb">
<img src="{{ $leaderboardArtist->artist->avatar() }}" 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>
<h4 class="title pb-1"><a href="/artist/{{ $leaderboardArtist->artist->slug }}">{{ $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">
<a href="/artist/{{ $leaderboardArtist->artist->slug }}" class="items-number d-flex-center flex-column">
<strong class="pb-1">{{ $leaderboardArtist->position }}<sup>{{ numberSuffix($leaderboardArtist->position) }}</sup></strong>
<span>Place</span>
</a>

View File

@@ -8,7 +8,7 @@
</div>
{{-- End .section-title --}}
<div class="text-large">
<a href="#">View Leaderboards</a>
<a href="/leaderboards">View Leaderboards</a>
</div>
</div>
{{-- End .d-flex-between --}}
@@ -16,6 +16,25 @@
@foreach($leaderboard as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
<div class="col-xxl-4 col-lg-6 col-md-6 mb-6">
<div class="top-seller-style-two d-flex-between d-flex-stretch">
<div class="d-flex-center">
{{-- End .thumb --}}
<div class="content">
<h4 class="title pb-1"><a href="/leaderboards">See More Leaderboards</a></h4>
<span class="price">Updated Every Episode</span>
</div>
{{-- End .content --}}
</div>
{{-- End .d-flex-center --}}
<a href="/leaderboards" class="items-number d-flex-center flex-column">
<strong class="pb-1"><i class="ri-arrow-right-double-line"></i></strong>
<span> &nbsp; </span>
</a>
</div>
{{-- End .top-seller-style-two --}}
</div>
{{-- End .col --}}
</div>
</div>
{{-- End container --}}

View File

@@ -1,35 +0,0 @@
<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

@@ -8,7 +8,12 @@
{{-- End .section-title --}}
<div class="slider slick-activation-001 slick-gutter-15 slick-pagination-50">
@foreach ($recentSubmissions as $recent)
@include('home.recents.card')
@php
$thisArtwork = $recent;
$thisPodcast = $recent->podcast;
$thisEpisode = $recent->episode;
@endphp
@include('artworks.card')
@endforeach
{{-- End .slick-activation-01 --}}
</div>

View File

@@ -0,0 +1,138 @@
@extends('layouts.master')
@section('page-title', 'Support and The History of the Art Generator')
@section('meta_description', 'Learn the history of the No Agenda Art Generator and how to support the generator.')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Support & History</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">Explore</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90 blog-details-wrapper">
<div class="container">
<div class="row">
<div class="col-xl-8 mb-6">
<div class="blog-content">
<h2 class="mb-2">History of the No Agenda Art Generator</h2>
<ul class="meta">
<li>19 Dec 2024</li>
<li>Development</li>
<li class="date"><i class="ri-time-line"></i>{{ Carbon\Carbon::create(2023, 12, 19, 22, 1, 9)->diffForHumans() }}</li>
</ul>
<p>In June of 2010, there was no formal process to submit artwork to
the No Agenda Podcast for use as album artwork for each episode. At the same time,
I was in the process of learning the then "new to me" Drupal 6 Content Management
System. I realized that I could kill two birds with one stone by improving the process
of uploading artwork, add some community and competition to the process and learn more
about Drupal module development by building a simple tool that would allow anyone to
submit artwork live as we trolled-along in the IRC "trollroom" as the show was recorded
by our venerable hosts, Adam and John C.</p>
<p>The first variation of the Art Generator was built over the course of a weekend, and
as part of that development, I did my best to re-create the work of Sir Randy Asher and Sir Paul T.
who had, up until that point, submitted the bulk of the user submitted artwork in the archive.
</p>
<p>For the next almost four years and roughly 4,500 art submissions, the generator continued
in it's first interation with an abandonded upgrade to Drupal 7 somewhere in the duration as the Drupal
community was more focused on writing "codes-of-conduct" than writing actual code.</p>
<p>Around that time, many in the PHP community and myself
became aware of an upcoming framework that seemed to offer a ton of promise - Laravel, and I chose to
use the generator to become familiar with that new framework. In October 2014, the Art Generator was
re-written from the ground up using the Laravel 4 platform which greatly simplified the maintenance and
customization of the platform.
</p>
<p>In 2022, I started to run into minor issues due to the age of the codebase, support for older versions
of the database and PHP were becoming deprecated, and tackling them would require a basic rewrite of
the entire platform (seriously, the upgrade path from Laravel 4 to 5 suggests re-writing the application.)
Laravel had matured, and became the most popular PHP framework on the Internet, upgrades between versions
had become relatively painless and took a few minutes to a few hours. However, I procrastinated doing the re-write
as I was already spending my days writing Laravel code and I put a lot of focus learning other technologies
that would make the upgrade worthwhile.
</p>
<p>I began the re-write for the current interation of the Art Generator, in early 2023, working on small pieces
on weekends as free-time allowed, the core functionality of the system is now powered by Laravel 10 and I used
much of the development time to learn some of the new third-party add-ons that would improve developer's experience
moving forward such as Laravel Live-Wire, Docker, Docker Compose, Traefik, Caddy and other technology. Development
in earnest began in early summer of 2023 - a new design was developed using a new logo graciously provided by
<a href="/artist/nykko-syme">Nykko Syme</a> and addressing some community requests for both dark and light mode support,
easier to access download links for the artwork, and a much more streamlined codebase allowing for future development
with less pain points. A bonus is the ability for me to run the entire stack in Docker making migrating to other hosting
and development environments smoother.
</p>
<p>Toward the end of September, the host that had powered the Art Generator since 2010 emailed its customers and
notified us they would be shutting down without warning. I took the time to migrate the database away from that host,
and moved as much of the site off of them as possible while working as quickly as possible to finish the upgrade. Communicating
with them, I was told to expect to continue to have hosting until my paid-in-advance hosting ran out, which would have
been through May of 2024 - but on the morning of November 30, 2023, they disappeared without a trace, stopped answering
the phone, and emails bounced. This lit a fire under my rear to complete the newest build as I was very close to complete.
</p>
<p>
The latest version of the generator launched on Sunday, December 17<sup>th</sup>, 2024 to a rocky launch with "good-enough"
functionality, it took a few days to stabilize the cacheing and hardware, but you are now viewing the "new hotness" or whatever
the kids these days call it, powered by Laravel 10 in a docker powered container that can be migrated in minutes to other locations.
It facilitates point-in-time backups, and as you will see below, makes it fairly simple for anyone to grab and entire archive of the
artwork submitted to the site in an sane, organized manner. Here's some of the new features that really made the upgrade worth it:
</p>
<ul>
<li>All artwork is optimized, sized, and scaled to the absolute smallest filesize while having the resolutions required by Apple (3,000px x 3,000px) and by the sane people in the world (512px x 512px) with none of the extraneous temporary files and unnecessary thumbnails of the old system.</li>
<li>The artwork is organized by year, month, and date, with the artist's name and artwork title in the filename so offline use is easier.</li>
<li>Even with the larger resolutions available for download, the size of the artwork archive was cut nearly in half from 30Gb+ to approx 15Gb.</li>
<li>Artists get a lot more credit on the new version, it's easier to find their additional work, and get high quality downloads of that work.</li>
<li>While not yet implemented in the production site, the new version was built from the ground up with support for more than one podcast. In the coming weeks, I hope to expand and turn that feature on for additional podcasts in the No Agenda Community.</li>
</ul>
<p>Want to download your own copy of the archive? Know wget and/or curl? There are lists in the sidebar you can download that are updated each time a piece
of artwork is approved. I plan to make this easier for non-dudes/dudettes named Ben soon. In the meantime, enjoy your stay, note the v4v section, and be
decent to one another.
</p>
<p class="text-right">--<br>"Sir" Paul Couture<br>Keeper of the Artwork</p>
</div>
</div>
<div class="col-xl-4 mb-6">
<aside class="sidebar">
<div class="single-widget recent-post mt-0">
<h3 class="title">Support | Value4Value</h3>
<div class="inner">
<ul>
<li><a class="d-block" href="http://dvorak.org/NA">Support the Show</a><span class="cate small">First and Foremost, support our boys.</span></li>
<li><a class="d-block" href="https://paypal.me/caincouture">PayPal Me</a><span class="cate small">@CainCouture and buy me a coffee - or twelve.</span></li>
<li><a class="d-block" href="https://getalby.com/p/pcouture">V4V: ⚡pcouture@getalby.com</a><span class="cate small">Use the lightning network.</span></li>
<li><a class="d-block" href="https://static.noagendaartgenerator.com/assets/img/btc-naart-qr.png">Crypto: <i class="ri-btc-line"></i> Old School BTC</a><span class="cate small">bc1qvkm9fpycc8q99kudqwukd8cf8xgxdrhp6a5zl8</span></li>
</ul>
</div>
</div>
<div class="single-widget recent-post mt-8">
<h3 class="title">Download The Archive</h3>
<div class="inner">
<p>Choose one or both of the text lists below for a wget or curl formatted text list to download your own personal copy of the archive.</p>
<ul>
<li><a class="d-block" href="/download-archive/hd">High-Resolution Archive List</a></li>
<li><a class="d-block" href="/download-archive/sd">Standard Resolution Archive List</a></li>
</ul>
<p class="mb-0 mt-4">I recommend the following:<br>
<span class="cate small">Replace "{filename-of-list.txt}" with the filename you downloaded.</span></p>
<hr>
<pre><code> wget \
--content-disposition \
--trust-server-names \
-i {filename-of-list.txt}</code></pre>
<hr>
</div>
</div>
</aside>
</div>
</div>
</div>
</section>
@endsection

View File

@@ -1,26 +1,30 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
@extends('layouts.master')
<title>{{ config('app.name', 'Laravel') }}</title>
@section('page-title', 'Manage Account')
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="font-sans antialiased">
<div class="min-h-screen bg-gray-100 dark:bg-gray-900">
@include('layouts.navigation')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Manage Account</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">Manage Account</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="ptb-120">
<div class="container">
<div class="row">
<!-- Page Heading -->
@if (isset($header))
<header class="bg-white dark:bg-gray-800 shadow">
<header class="">
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
{{ $header }}
</div>
@@ -32,5 +36,6 @@
{{ $slot }}
</main>
</div>
</body>
</html>
</div>
</section>
@endsection

View File

@@ -1,30 +1,33 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
@extends('layouts.master')
<title>{{ config('app.name', 'Laravel') }}</title>
@section('page-title', 'Account')
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
<!-- Scripts -->
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="font-sans text-gray-900 antialiased">
<div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900">
<div>
<a href="/">
<x-application-logo class="w-20 h-20 fill-current text-gray-500" />
</a>
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Account</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">Account</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
<div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white dark:bg-gray-800 shadow-md overflow-hidden sm:rounded-lg">
@section('page-content')
<section class="signup-wrapper signin-wrapper ptb-120">
<div class="container">
<div class="row">
<div class="col-xl-6 offset-xl-3 col-lg-12">
<div class="authbox">
{{ $slot }}
</div>
</div>
</body>
</html>
</div>
</div>
</section>
@endsection

View File

@@ -5,13 +5,19 @@
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>.: {{ $pageTitle ?? 'Site' }} - No Agenda Art Generator :.</title>
@if(View::hasSection('page-title'))
<title>.: @yield('page-title') - No Agenda Art Generator :.</title>
@else
<title>.: No Agenda Art Generator :.</title>
@endif
@include('partials.metabranding')
@include('partials/favicon')
@vite(['resources/scss/app.scss'])
@livewireStyles
<noscript><style> #preloader { display:none; } </style></noscript>
@yield('additional_headers')
</head>
<body{!! Session::get('preferred_theme') == 'light' ? ' class="theme-light"' : '' !!}>
<body{!! Session::get('preferred_theme') === 'light' ? ' class="theme-light"' : '' !!} data-preferred_theme="{!! Session::get('preferred_theme') !!}">
@include('partials/preloader')
@include('partials/nav/head')
@@ -19,20 +25,21 @@
@yield('page-content')
@include('partials.footer.section')
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/jquery.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/jquery.nice-select.min.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/modernizer.min.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/slick.min.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/bootstrap.min.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/waypoint.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/js.cookie.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/count-down.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/counter-up.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/isotop.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/imageloaded.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/aos.js"></script>
<script src="//{{ config('app.static_asset_url') }}/dist/vendor/js/jquery.custom-file-input.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/jquery.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/jquery.nice-select.min.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/modernizer.min.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/slick.min.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/bootstrap.min.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/waypoint.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/js.cookie.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/count-down.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/counter-up.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/isotop.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/imageloaded.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/aos.js"></script>
<script src="{{ config('app.static_asset_url') }}/v3/dist/vendor/js/jquery.custom-file-input.js"></script>
@livewireScriptConfig
@vite(['resources/js/app.js'])
@yield('additional_footers')
</body>
</html>

View File

@@ -0,0 +1,89 @@
@extends('layouts.master')
@section('page-title', 'Leaderboards')
@section('meta_description', 'Check the standings of the competition at the No Agenda Art Generator.')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Leaderboards</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">Leaderboards</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90">
<div class="container">
<div class="row">
<ul class="nav custom-tabs mb-4">
<li><a class="active" data-bs-toggle="tab" href="#all-time">All Time</a></li>
<li><a data-bs-toggle="tab" href="#rolling-annual">Rolling Annual</a></li>
<li><a data-bs-toggle="tab" href="#rolling-six-months">Rolling Six Months</a></li>
<li><a data-bs-toggle="tab" href="#rolling-ninety-days">Rolling 90 Days</a></li>
{{--<li><a data-bs-toggle="tab" href="#by-year">By Year</a></li>--}}
</ul>
</div>
</div>
<div class="container tab-content">
<div class="tab-pane fade show active" id="all-time">
<div class="row">
@foreach($leaderboardAllTime as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-annual">
<div class="row">
@foreach($leaderboardPastTwelveMonths as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-six-months">
<div class="row">
@foreach($leaderboardRollingSixMonths as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-ninety-days">
<div class="row">
@foreach($leaderboardRollingNinetyDays as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
{{--<div class="tab-pane fade" id="by-year">
<div class="row">
<ul class="nav nav-pills custom-pills mb-4" role="tablist">
@foreach ($leaderboardYears as $year)
<li class="nav-item" role="presentation">
<a class="nav-link" data-bs-toggle="tab" href="#leaderboard-year-{{ $year }}">{{ $year }}</a>
</li>
@endforeach
</ul>
</div>
<div class="container tab-content">
@foreach ($leaderboardYears as $year)
<div class="tab-pane fade" id="leaderboard-year-{{ $year }}">
<div class="row">
<h4>{{ $year }} Leaderboard</h4>
</div>
</div>
@endforeach
</div>
</div>--}}
</div>
</section>
@endsection

View File

@@ -0,0 +1,42 @@
<form wire:submit.prevent="save">
@if($avatar)
<div
class="d-flex flex-column justify-content-center"
wire:ignore
x-data="{
setUp() {
const cropper = new Cropper(document.getElementById('avatar'), {
aspectRatio: 1/1,
autoCropArea: 1,
viewMode: 1,
crop (event) {
@this.set('x', event.detail.x)
@this.set('y', event.detail.y)
@this.set('width', event.detail.width)
@this.set('height', event.detail.height)
}
})
}
}"
x-init="setUp"
>
<div class="d-flex justify-content-center text-center mt-4 mb-4">
<img id="avatar" src="{{ $avatar->temporaryUrl() }}" style="width: 100%; max-width: 350px; margin:5px auto;">
</div>
<div class="d-flex justify-content-end text-end mt-4 mb-4">
<button type="submit" class="btn btn-gradient btn-small">
<span>Save Avatar</span>
</button>
</div>
</div>
@else
<div class="mb-2 mx-2">
<label for="avatar" style="width: 100%;">
<img src="{{ auth()->user()->artists()->first()->avatar() }}" style="width: 100%; max-width: 350px;">
</label>
</div>
<div class="mb-2 mx-2">
<input type="file" name="avatar" id="avatar" class="sr-only" wire:model="avatar">
</div>
@endif
</form>

View File

@@ -0,0 +1,42 @@
<form wire:submit.prevent="save">
@if($header)
<div
class="d-flex flex-column justify-content-center"
wire:ignore
x-data="{
setUp() {
const cropper = new Cropper(document.getElementById('header'), {
aspectRatio: 1.46,
autoCropArea: 1,
viewMode: 1,
crop (event) {
@this.set('x', event.detail.x)
@this.set('y', event.detail.y)
@this.set('width', event.detail.width)
@this.set('height', event.detail.height)
}
})
}
}"
x-init="setUp"
>
<div class="d-flex justify-content-center text-center mt-4 mb-4">
<img id="header" src="{{ $header->temporaryUrl() }}" style="width: 100%; max-width: 270px; margin:5px auto;">
</div>
<div class="d-flex justify-content-end text-end mt-4 mb-4">
<button type="submit" class="btn btn-gradient btn-small">
<span>Save Profile Header</span>
</button>
</div>
</div>
@else
<div class="mb-2 mx-2">
<label for="header" style="width: 100%;">
<img src="{{ auth()->user()->artists()->first()->header() }}" style="width: 100%; max-width: 270px; margin:5px auto;">
</label>
</div>
<div class="mb-2 mx-2">
<input type="file" name="header" id="header" class="sr-only" wire:model="header">
</div>
@endif
</form>

View File

@@ -1,20 +1,20 @@
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-57x57.png" />
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-144x144.png" />
<link rel="apple-touch-icon-precomposed" sizes="60x60" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-60x60.png" />
<link rel="apple-touch-icon-precomposed" sizes="120x120" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon-precomposed" sizes="76x76" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="//{{ config('app.static_asset_url') }}/dist/ico/apple-touch-icon-152x152.png" />
<link rel="icon" type="image/png" href="//{{ config('app.static_asset_url') }}/dist/ico/favicon-196x196.png" sizes="196x196" />
<link rel="icon" type="image/png" href="//{{ config('app.static_asset_url') }}/dist/ico/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/png" href="//{{ config('app.static_asset_url') }}/dist/ico/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="//{{ config('app.static_asset_url') }}/dist/ico/favicon-16x16.png" sizes="16x16" />
<link rel="icon" type="image/png" href="//{{ config('app.static_asset_url') }}/dist/ico/favicon-128.png" sizes="128x128" />
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-57x57.png" />
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-144x144.png" />
<link rel="apple-touch-icon-precomposed" sizes="60x60" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-60x60.png" />
<link rel="apple-touch-icon-precomposed" sizes="120x120" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon-precomposed" sizes="76x76" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ config('app.static_asset_url') }}/v3/dist/ico/apple-touch-icon-152x152.png" />
<link rel="icon" type="image/png" href="{{ config('app.static_asset_url') }}/v3/dist/ico/favicon-196x196.png" sizes="196x196" />
<link rel="icon" type="image/png" href="{{ config('app.static_asset_url') }}/v3/dist/ico/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/png" href="{{ config('app.static_asset_url') }}/v3/dist/ico/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="{{ config('app.static_asset_url') }}/v3/dist/ico/favicon-16x16.png" sizes="16x16" />
<link rel="icon" type="image/png" href="{{ config('app.static_asset_url') }}/v3/dist/ico/favicon-128.png" sizes="128x128" />
<meta name="application-name" content="{{ config('app.name') }}"/>
<meta name="msapplication-TileColor" content="#101010" />
<meta name="msapplication-TileImage" content="//{{ config('app.static_asset_url') }}/dist/ico/mstile-144x144.png" />
<meta name="msapplication-square70x70logo" content="//{{ config('app.static_asset_url') }}/dist/ico/mstile-70x70.png" />
<meta name="msapplication-square150x150logo" content="//{{ config('app.static_asset_url') }}/dist/ico/mstile-150x150.png" />
<meta name="msapplication-wide310x150logo" content="//{{ config('app.static_asset_url') }}/dist/ico/mstile-310x150.png" />
<meta name="msapplication-square310x310logo" content="//{{ config('app.static_asset_url') }}/dist/ico/mstile-310x310.png" />
<meta name="msapplication-TileImage" content="{{ config('app.static_asset_url') }}/v3/dist/ico/mstile-144x144.png" />
<meta name="msapplication-square70x70logo" content="{{ config('app.static_asset_url') }}/v3/dist/ico/mstile-70x70.png" />
<meta name="msapplication-square150x150logo" content="{{ config('app.static_asset_url') }}/v3/dist/ico/mstile-150x150.png" />
<meta name="msapplication-wide310x150logo" content="{{ config('app.static_asset_url') }}/v3/dist/ico/mstile-310x150.png" />
<meta name="msapplication-square310x310logo" content="{{ config('app.static_asset_url') }}/v3/dist/ico/mstile-310x310.png" />

View File

@@ -39,11 +39,7 @@
<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>
@include('partials.nav.main')
</ul>
</div>
</div>

View File

@@ -0,0 +1,17 @@
{{-- HTML Meta Tags --}}
<meta name="description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
{{-- Facebook Meta Tags --}}
<meta property="og:url" content="{{ url()->current() }}">
<meta property="og:type" content="website">
<meta property="og:title" content="@yield('page-title', 'No Agenda Art Generator')">
<meta property="og:description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
<meta property="og:image" content="@yield('meta_og_img', config('app.static_asset_url') . '/v3/dist/naartgen-fb-og-header.png')">
{{-- Twitter Meta Tags --}}
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="noagendaartgenerator.com">
<meta property="twitter:url" content="{{ url()->current() }}">
<meta name="twitter:title" content="No Agenda Art Generator">
<meta name="twitter:description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
<meta name="twitter:image" content="@yield('meta_og_img', config('app.static_asset_url') . '/v3/dist/naartgen-x-og-header.png')">

View File

@@ -14,7 +14,19 @@
</div>
<div class="mainmenu-wrapper">
<nav id="sideNav" class="mainmenu-nav d-none d-xl-block">
<ul class="mainmenu">
@include('partials/nav/main')
<li class="has-dropdown has-menu-child-item">
<a {!! request()->is(['podcasts', 'podcasts/*']) ? 'class="active"' : '' !!}>Podcasts</a>
<ul class="submenu">
@foreach ($navPodcasts as $cast)
<li>
<a href="/podcasts/{{ $cast->slug }}">{{ $cast->name }}</a>
</li>
@endforeach
</ul>
</li>
</ul>
</nav>
</div>
</div>
@@ -39,27 +51,41 @@
--}}
@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>
<span><i class="ri-user-add-line"></i>Join In</span></a>
</li>
@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') }}"
<li class="avatar-info"> <a href="#"><img class="avatar_img"
@if (Auth::user() && Auth::user()->artists->first() && Auth::user()->artists->first()->avatar)
src="{{ Auth::user()->artists->first()->avatar() }}"
@else
src="{{ Vite::asset('resources/img/default_avatars/default_avatar_male.svg') }}"
src="{{ config('app.static_asset_url') . '/' . ('avatars/default_avatar_male.svg') }}"
@endif
alt="user avatar"></a>
<ul class="submenu">
@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>
<li><a href="/create-artwork"><i class="ri-image-add-line"></i> Create Artwork</a></li>
<li><a href="/artist/{{ Auth::user()->artists->first()->slug }}"><i class="ri-profile-line"></i> View Artist Profile</a></li>
<li><a href="/profile"><i class="ri-user-line"></i> Manage Account</a></li>
<form method="post" action="/logout" name="logout" id="logoutForm">
@csrf
<li><a href="#" onclick="event.preventDefault(); document.getElementById('logoutForm').submit();"><i class="ri-logout-box-r-line"></i>Sign Out</a></li>
</form>
@else
<li><a href="/login"><i class="ri-logout-box-r-line"></i>Sign in</a></li>
@endif
</ul>
</li>
@endif
<livewire:themeswitch />
<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>
<li class="setting-option mobile-menu-bar d-block d-xl-none">
<button class="hamburger-button">
<i class="ri-menu-2-fill"></i>
@@ -91,7 +117,19 @@
</div>
</div>
<nav>
<ul class="mainmenu">
@include('partials/nav/main')
<li class="has-dropdown has-menu-child-item">
<a {!! request()->is(['podcasts', 'podcasts/*']) ? 'class="active"' : '' !!}>Podcasts</a>
<ul class="submenu">
@foreach ($navPodcasts as $cast)
<li>
<a href="/podcasts/{{ $cast->slug }}">{{ $cast->name }}</a>
</li>
@endforeach
</ul>
</li>
</ul>
</nav>
</div>
</div>

View File

@@ -1,24 +1,25 @@
<ul class="mainmenu">
<li>
<li>
<a {!! request()->routeIs('home') ? 'class="active"' : '' !!} href="/">Home</a>
</li>
<li>
</li>
<li>
<a {!! request()->is(['artworks', 'artworks/*']) ? 'class="active"' : '' !!} href="/artworks">Submitted</a>
</li>
<li>
<a {!! request()->is(['artists', 'artists/*']) ? 'class="active"' : '' !!} href="/artists">Artists</a>
</li>
<li>
<a {!! request()->is(['leaderboards', 'leaderboards/*']) ? 'class="active"' : '' !!} href="/contact.html">Leaderboards</a>
</li>
<li class="has-dropdown has-menu-child-item">
<a {!! request()->is(['podcasts', 'podcasts/*']) ? 'class="active"' : '' !!}>Podcasts</a>
<ul class="submenu">
@foreach ($navPodcasts as $cast)
<li>
<a href="/podcasts/{{ $cast->slug }}">{{ $cast->name }}</a>
</li>
@endforeach
</ul>
</li>
</ul>
</li>
<li>
<a {!! request()->is(['artists', 'artists/*', 'artist', 'artist/*', 'profile']) ? 'class="active"' : '' !!} href="/artists">Artists</a>
</li>
@if (auth()->user())
<li>
<a {!! request()->is(['create-artwork', 'create-artwork/*']) ? 'class="active"' : '' !!} href="/create-artwork">Create</a>
</li>
@can('approve', App\Models\Artwork::class)
<li>
<a {!! request()->is(['approve-artworks']) ? 'class="active"' : '' !!} href="/approve-artworks">Approve</a>
</li>
@endcan
@endif
<li>
<a rel="me" {!! request()->is(['support*']) ? 'class="active"' : '' !!} href="/support-development">History & Support</a>
<li>
<a {!! request()->is(['leaderboards', 'leaderboards/*']) ? 'class="active"' : '' !!} href="/leaderboards">Leaderboards</a>
</li>

View File

@@ -0,0 +1,88 @@
@extends('layouts.master')
@section('page-title', $podcast->name)
@section('meta_description', 'Selected artwork for the ' . $podcast->name . ' podcast on the No Agenda Art Generator')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">{{ $podcast->name }}</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="/podcasts">Podcasts</a></li>
<li class="breadcrumb-item active">Podcast</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">
{{ $episodes->links() }}
</div>
</div>
<div class="container">
<div class="grid-filter-wrapper masonry-list">
<div class="resizer"></div>
@foreach ($episodes as $episode)
<div class="grid-item podcast--{{ $episode->podcast->slug }}">
<div class="explore-style-one flex-stretch">
<div class="thumb">
<a href="/podcast/{{ $episode->podcast->slug }}/episode/{{ $episode->slug }}"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="View This Episode">
<img src="{{ config('app.static_asset_url')
. '/thumbnails/'
. $episode->artwork->filename ?? '#'}}"
alt="{{ $episode->title }}, {{ $episode->podcast->name }} Episode {{ number_format($episode->episode_number + 0) }}">
</a>
</div>
<div class="content">
<div class="header d-flex-between pt-4 pb-1">
<h3 class="title"><a href="/podcast/{{ $episode->podcast->slug }}/episode/{{ $episode->slug }}">"{{ $episode->title }}"</a></h3>
</div>
<div class="product-owner py-0 pb-2 d-flex-between">
<h4>{{ $episode->podcast->name }}</h4>
</div>
<div class="product-owner py-0 d-flex-between">
<span class="bid-owner">Episode {{ number_format($episode->episode_number + 0) }}</span>
</div>
<div class="product-owner py-0 pb-4 d-flex-between">
<span class="bid-owner"><em>{{ $episode->episode_date->format('D, M j') }}<sup>{{ $episode->episode_date->format('S') }}</sup>{{ $episode->episode_date->format(', Y') }}</em></span>
</div>
<div class="action-wrapper py-1 mt-4 d-flex-between">
<span class="bid-owner">Artwork By<br><strong><a
href="/artist/{{ $episode->artwork->artist->slug }}">{{ $episode->artwork->artist->name ?? 'Unknown' }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $episode->artwork->artist->slug }}"
class="avatar" data-bs-toggle="tooltip"
data-bs-placement="top"
title="{{ $episode->artwork->artist->name }}">
<img class="avatar_img" src="{{ $episode->artwork->artist->avatar() }}"
alt="{{ $episode->artwork->artist->name }}"></a>
</span>
</div>
<div class="action-wrapper py-1 mb-1 d-flex-between">
<span class="bid-owner">{{ number_format($episode->approvedArtworks->count()) }} Artworks Submitted</span>
</span>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
<div class="container">
<div class="row">
{{ $episodes->links() }}
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,63 @@
@extends('layouts.master')
@section('page-title', $artist->name)
@section('meta_description', 'Artist profile page on the No Agenda Art Generator for ' . $artist->name)
@section('meta_og_img', $artworks->first() ? config('app.static_asset_url') . '/thumbnails/' . $artworks->first()->filename : config('app.static_asset_url') . '/v3/dist/naartgen-x-og-header.png')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">{{ $artist->name }}</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="/artists">Artists</a></li>
<li class="breadcrumb-item active">Artist</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90">
<div class="container">
<div class="row">
{{ $artworks->links() }}
</div>
</div>
<div class="container">
<div class="row">
<div class="col-xxl-3 col-xl-4 col-lg-4 mb-6">
@include('profile.partials.single-artist-card')
</div>
{{-- end bio sidebar --}}
<div class="col-xxl-9 col-xl-8 col-lg-8">
<div class="container">
<div class="row content-justify-center">
@foreach ($artworks as $artwork)
@php
$thisArtwork = $artwork;
$thisPodcast = $artwork->podcast;
$thisEpisode = $artwork->episode;
@endphp
<div class="col-xxl-4 col-xl-6 col-lg-6 col-md-6 col-sm-12 col-xs-12 mb-5">
@include('artworks.card')
</div>
@endforeach
</div>
</div>
</div>
{{-- end artist content --}}
</div>
</div>
<div class="container">
<div class="row">
{{ $artworks->links() }}
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,43 @@
@extends('layouts.master')
@section('page-title', 'Artists')
@section('page-top')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Artists</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="/artists">Artists</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">
{{ $artists->links() }}
</div>
</div>
<div class="container">
<div class="grid-filter-wrapper masonry-list">
<div class="resizer"></div>
@foreach ($artists as $artist)
<div class="grid-item">
@include('profile.partials.single-artist-card')
</div>
@endforeach
</div>
</div>
<div class="container">
<div class="row">
{{ $artists->links() }}
</div>
</div>
</section>
@endsection

View File

@@ -1,29 +1,40 @@
@extends('layouts.master')
@section('additional_headers')
@parent
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.1/cropper.min.css" integrity="sha512-hvNR0F/e2J7zPPfLC9auFe3/SE0yG4aJCOd/qxew74NN7eyiSKjr7xJJMu1Jy2wf7FXITpWS1E/RY8yzuXN7VA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
@endsection
@section('additional_footers')
@parent
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.1/cropper.min.js" integrity="sha512-9KkIqdfN7ipEW6B6k+Aq20PV31bjODg4AA52W+tYtAE0jE0kMx49bjJ3FgvS56wzmyfMUHbQ4Km2b7l9+Y/+Eg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
@endsection
@section('page-content')
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
{{ __('Profile') }}
<h2 class="">
{{ __('Manage Account Details') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
<div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
<div class="max-w-xl">
<section class="ptb-4">
<div class="container">
<div class="row">
<div class="col-xl-4 col-lg-12 mb-4">
@include('profile.partials.update-profile-information-form')
</div>
</div>
<div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
<div class="max-w-xl">
<div class="col-xl-4 col-lg-12 mb-4">
@include('profile.partials.update-password-form')
</div>
<div class="col-xl-4 col-lg-12 mb-4">
@include('profile.partials.update-avatar-form')
</div>
{{--<div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
<div class="max-w-xl">
@include('profile.partials.delete-user-form')
<div class="col-xl-4 col-lg-12 mb-4">
@include('profile.partials.update-header-form')
</div>
</div>--}}
<div class="col-xl-4 col-lg-12 mb-4">
@include('profile.partials.update-location-form')
</div>
</div>
</div>
</section>
</x-app-layout>
@endsection

View File

@@ -0,0 +1,27 @@
<div class="single-author profile flex-stretch">
<div class="thumb">
<a href="/artist/{{ $artist->slug }}"><img src="{{ $artist->header() }}" alt="{{ $artist->name }}'s Cover Photo" /></a>
</div>
<div class="content">
<a href="/artist/{{ $artist->slug }}"><img class="author-thumb avatar_img" src="{{ $artist->avatar() }}"
alt="{{ $artist->name }}" /></a>
<h4 class="title"><a href="/artist/{{ $artist->slug }}">{{ $artist->name }}</a></h4>
<p class="title">{{ $artist->location ?? 'No Agenda Nation' }}</p>
<p class="title">Artist For {{ $artist->artworks->sortBy('created_at')->first()->created_at->diffForHumans(now(), Carbon\CarbonInterface::DIFF_ABSOLUTE) }}</p>
@if ($artist->bio)
<h4>Bio:</h4>
<p>{{ nl2br($artist->bio) }}</p>
@endif
@if ($artist->alby)
<p>Value4Value:<br>{{ strtolower($artist->alby) }}</p>
@endif
<div class="social size-small justify-content-center mb-4">
@if ($artist->website)
<a href="{{ $artist->website }}" title="website"><i class="ri-pages-line"></i></a>
@endif
</div>
<div class="size-small justify-content-center mb-4">
{{ number_format($artist->artworks->count()) }} Submitted Artworks
</div>
</div>
</div>

View File

@@ -0,0 +1,18 @@
<div class="authbox" style="min-height: 100%;">
<div class="row mt-4 gutter-2">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h3 class="mb-2">{{ __('Update Artist Avatar') }}</h3>
<p class="normal">{{ __('This avatar will be used on the artist gallery and artist profile page.') }}</p>
<p class="small">Be patient, it takes a moment to process.</p>
</div>
</div>
</div>
</div>
<div class="row mt-0 gutter-2">
<div class="col">
<livewire:artist.avatar />
</div>
</div>
</div>

View File

@@ -0,0 +1,18 @@
<div class="authbox" style="min-height: 100%;">
<div class="row mt-4 gutter-2">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h3 class="mb-2">{{ __('Update Profile Header') }}</h3>
<p class="normal">{{ __('This header is used in the artist listing and artist profile page.') }}</p>
<p class="small">Be patient, it takes a moment to process.</p>
</div>
</div>
</div>
</div>
<div class="row mt-0 gutter-2">
<div class="col">
<livewire:artist.header />
</div>
</div>
</div>

View File

@@ -0,0 +1,47 @@
<div class="authbox" style="min-height: 100%;">
<div class="row mt-4 gutter-2">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h3 class="mb-2">{{ __('Update Profile Details') }}</h3>
<p class="normal">{{ __("Update the Details shown on your profile.") }}</p>
</div>
</div>
</div>
</div>
<div class="row mt-0 gutter-2">
<div class="col">
<form method="post" action="/update-profile">
@csrf
<div>
<x-input-label for="name" :value="__('Display Name')" />
<x-text-input id="name" name="name" type="text" class="mt-1 block w-full" :value="old('name', $user->artists->first()->name)" required autocomplete="name" />
<x-input-error class="mt-2" :messages="$errors->get('name')" />
</div>
<div>
<x-input-label for="location" :value="__('Location')" />
<x-text-input id="location" name="location" type="text" class="mt-1 block w-full" :value="old('location', $user->artists->first()->location)" required autocomplete="location" />
<x-input-error class="mt-2" :messages="$errors->get('location')" />
</div>
<div class="mt-1">
<x-input-label for="alby" :value="__('Value for Value Alby Address⚡')" />
<x-text-input id="alby" name="alby" type="text" class="mt-1 block w-full" :value="old('alby', $user->artists->first()->alby)" required autocomplete="alby" />
<x-input-error class="mt-2" :messages="$errors->get('alby')" />
</div>
<div class="mt-1">
<x-input-label for="nasocial" :value="__('No Agenda Social Account')" />
<x-text-input id="nasocial" name="nasocial" type="text" class="mt-1 block w-full" :value="old('nasocial', $user->artists->first()->nasocial)" required autocomplete="naasocial" />
<x-input-error class="mt-2" :messages="$errors->get('nasocial')" />
</div>
<div class="mt-1">
<x-input-label for="website" :value="__('Website')" />
<x-text-input id="website" name="website" type="text" class="mt-1 block w-full" :value="old('website', $user->artists->first()->website)" required autocomplete="naasocial" />
<x-input-error class="mt-2" :messages="$errors->get('website')" />
</div>
<div class="d-flex justify-content-end mt-4 mb-4 text-end">
<x-primary-button class="ml-3 btn btn-gradient"><span>Update Details</span></x-primary-button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -1,14 +1,16 @@
<section>
<header>
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Update Password') }}
</h2>
<p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
{{ __('Ensure your account is using a long, random password to stay secure.') }}
</p>
</header>
<div class="authbox" style="min-height: 100%;">
<div class="row mt-4 gutter-2">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h3 class="mb-2">{{ __('Update Password') }}</h3>
<p class="normal">{{ __('Ensure your account is using a long, random password to stay secure.') }}</p>
</div>
</div>
</div>
</div>
<div class="row mt-0 gutter-2">
<div class="col">
<form method="post" action="{{ route('password.update') }}" class="mt-6 space-y-6">
@csrf
@method('put')
@@ -31,8 +33,8 @@
<x-input-error :messages="$errors->updatePassword->get('password_confirmation')" class="mt-2" />
</div>
<div class="flex items-center gap-4">
<x-primary-button>{{ __('Save') }}</x-primary-button>
<div class="d-flex justify-content-end text-end mt-4 mb-4">
<x-primary-button class="ml-3 btn btn-gradient"><span>{{ __('Save') }}</span></x-primary-button>
@if (session('status') === 'password-updated')
<p
@@ -45,4 +47,6 @@
@endif
</div>
</form>
</section>
</div>
</div>
</div>

View File

@@ -1,19 +1,21 @@
<section>
<header>
<h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
{{ __('Profile Information') }}
</h2>
<p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
{{ __("Update your account's profile information and email address.") }}
</p>
</header>
<div class="authbox" style="min-height: 100%;">
<div class="row mt-4 gutter-2">
<div class="col">
<div class="signin-content">
<div class="mb-6">
<h3 class="mb-2">{{ __('Update Login') }}</h3>
<p class="normal">{{ __("Update your account's username and email address. Note, your username may not be the same as your public artist profile.") }}</p>
</div>
</div>
</div>
</div>
<div class="row mt-0 gutter-2">
<div class="col">
<form id="send-verification" method="post" action="{{ route('verification.send') }}">
@csrf
</form>
<form method="post" action="{{ route('profile.update') }}" class="mt-6 space-y-6">
<form method="post" action="{{ route('profile.update') }}">
@csrf
@method('patch')
@@ -33,8 +35,8 @@
<p class="text-sm mt-2 text-gray-800 dark:text-gray-200">
{{ __('Your email address is unverified.') }}
<button form="send-verification" class="underline text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-offset-gray-800">
{{ __('Click here to re-send the verification email.') }}
<button form="send-verification" class="btn btn-small btn-gradient">
<span>{{ __('Click here to re-send the verification email.') }}</span>
</button>
</p>
@@ -47,9 +49,8 @@
@endif
</div>
<div class="flex items-center gap-4">
<x-primary-button>{{ __('Save') }}</x-primary-button>
<div class="d-flex justify-content-end mt-4 mb-4 text-end">
<x-primary-button class="ml-3 btn btn-gradient"><span>{{ __('Update Login Information') }}</span></x-primary-button>
@if (session('status') === 'profile-updated')
<p
x-data="{ show: true }"
@@ -61,4 +62,6 @@
@endif
</div>
</form>
</section>
</div>
</div>
</div>

View File

@@ -3,6 +3,9 @@
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\PageController;
use App\Http\Controllers\ArtworkController;
use App\Http\Controllers\ArtistController;
use App\Http\Controllers\PodcastController;
use App\Http\Controllers\EpisodeController;
use Illuminate\Support\Facades\Route;
use App\Livewire\Counter;
@@ -20,17 +23,28 @@ use App\Livewire\Counter;
Route::get('/', [PageController::class, 'landing'])->name('home');
Route::get('/artworks', [ArtworkController::class, 'index']);
Route::get('/artworks/{id}', [ArtworkController::class, 'show']);
Route::get('/artist/{slug}', [ArtistController::class, 'show']);
Route::get('/artists', [ArtistController::class, 'index']);
Route::get('/podcasts/{slug}', [PodcastController::class, 'show']);
Route::get('/podcast/{any}/episode/{slug}', [EpisodeController::class, 'show']);
Route::get('/leaderboards', [PageController::class, 'leaderboards'])->name('leaderboards');
Route::get('/support-development', [PageController::class, 'support'])->name('support');
Route::get('/download-archive/{type}', [ArtworkController::class, 'downloadArchiveList']);
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
Route::get('/create-artwork', [ArtworkController::class, 'create']);
Route::post('/create-artwork', [ArtworkController::class, 'store']);
Route::get('/update-avatar', [ArtistController::class, 'avatar'])->name('avatar.edit');
Route::post('/update-profile', [ArtistController::class, 'update'])->name('profile-details.edit');
Route::get('/approve-artworks', [ArtworkController::class, 'pendingApproval'])->name('show-approve-artwork');
Route::post('/approve-artworks', [ArtworkController::class, 'approve'])->name('approve-artwork');
});
Route::get('/counter', Counter::class);

2
site/storage/debugbar/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -7,115 +7,115 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
"@esbuild/android-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd"
integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==
"@esbuild/android-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031"
integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==
"@esbuild/android-arm@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d"
integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==
"@esbuild/android-arm@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595"
integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==
"@esbuild/android-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1"
integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==
"@esbuild/android-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252"
integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==
"@esbuild/darwin-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276"
integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==
"@esbuild/darwin-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz#ae7a582289cc5c0bac15d4b9020a90cb7288f1e9"
integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==
"@esbuild/darwin-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb"
integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==
"@esbuild/darwin-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b"
integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==
"@esbuild/freebsd-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2"
integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==
"@esbuild/freebsd-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440"
integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==
"@esbuild/freebsd-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4"
integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==
"@esbuild/freebsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4"
integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==
"@esbuild/linux-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb"
integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==
"@esbuild/linux-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13"
integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==
"@esbuild/linux-arm@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a"
integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==
"@esbuild/linux-arm@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2"
integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==
"@esbuild/linux-ia32@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a"
integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==
"@esbuild/linux-ia32@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7"
integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==
"@esbuild/linux-loong64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72"
integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==
"@esbuild/linux-loong64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2"
integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==
"@esbuild/linux-mips64el@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289"
integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==
"@esbuild/linux-mips64el@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd"
integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==
"@esbuild/linux-ppc64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7"
integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==
"@esbuild/linux-ppc64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4"
integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==
"@esbuild/linux-riscv64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09"
integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==
"@esbuild/linux-riscv64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba"
integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==
"@esbuild/linux-s390x@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829"
integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==
"@esbuild/linux-s390x@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0"
integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==
"@esbuild/linux-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4"
integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==
"@esbuild/linux-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e"
integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==
"@esbuild/netbsd-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462"
integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==
"@esbuild/netbsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18"
integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==
"@esbuild/openbsd-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691"
integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==
"@esbuild/openbsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf"
integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==
"@esbuild/sunos-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273"
integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==
"@esbuild/sunos-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c"
integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==
"@esbuild/win32-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f"
integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==
"@esbuild/win32-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d"
integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==
"@esbuild/win32-ia32@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03"
integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==
"@esbuild/win32-ia32@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c"
integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==
"@esbuild/win32-x64@0.17.19":
version "0.17.19"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061"
integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==
"@esbuild/win32-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585"
integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==
"@jridgewell/gen-mapping@^0.3.2":
version "0.3.3"
@@ -126,33 +126,28 @@
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/resolve-uri@3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
"@jridgewell/resolve-uri@^3.1.0":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
"@jridgewell/set-array@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
"@jridgewell/sourcemap-codec@1.4.14":
version "1.4.14"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
"@jridgewell/sourcemap-codec@^1.4.10":
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.9":
version "0.3.18"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
version "0.3.20"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
dependencies:
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -175,10 +170,75 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@rollup/rollup-android-arm-eabi@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.0.tgz#0437b27edd7095d0b6d5db99d13af8157d7c58b0"
integrity sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==
"@rollup/rollup-android-arm64@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.0.tgz#d4c14ef9e45d5c46b8d1f611ab8124a611d5be5b"
integrity sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==
"@rollup/rollup-darwin-arm64@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz#6f3fdf5712db6b5e3d8f62a86a09cd659dd871f9"
integrity sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==
"@rollup/rollup-darwin-x64@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.0.tgz#626d7786fe7c10b2e8533ad981b4a791fd72b9d0"
integrity sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==
"@rollup/rollup-linux-arm-gnueabihf@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.0.tgz#57ece7bb1b7659a3ea2ace580a63b8f92b3161f1"
integrity sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==
"@rollup/rollup-linux-arm64-gnu@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.0.tgz#345b276b814a5377344adc5780c4dfb7cd0e8ba9"
integrity sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==
"@rollup/rollup-linux-arm64-musl@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.0.tgz#61cc6516e6e92e2205ea1d0ac30326379b0563c8"
integrity sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==
"@rollup/rollup-linux-riscv64-gnu@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.0.tgz#e9add70ddca7bd6f685ec447ae83eb3be552f211"
integrity sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==
"@rollup/rollup-linux-x64-gnu@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz#ece153613f0cf2c864dbfc2076c579da8abd51a9"
integrity sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==
"@rollup/rollup-linux-x64-musl@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz#2d2dbdf5fbf2c19d1f3d31b8a7850b57f5799037"
integrity sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==
"@rollup/rollup-win32-arm64-msvc@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.0.tgz#bf2dbad350376e46cb77fab408bb398ad5f3648d"
integrity sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==
"@rollup/rollup-win32-ia32-msvc@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.0.tgz#5c26b07f74f4054f3ecf202550100496ed2e73f3"
integrity sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==
"@rollup/rollup-win32-x64-msvc@4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz#4ea610e0c40a07a8afa2977cbf80507f41c2271c"
integrity sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==
"@tailwindcss/forms@^0.5.2":
version "0.5.3"
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.3.tgz#e4d7989686cbcaf416c53f1523df5225332a86e7"
integrity sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==
version "0.5.7"
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.7.tgz#db5421f062a757b5f828bc9286ba626c6685e821"
integrity sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==
dependencies:
mini-svg-data-uri "^1.2.3"
@@ -195,9 +255,9 @@
integrity sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==
alpinejs@^3.4.2:
version "3.12.2"
resolved "https://registry.yarnpkg.com/alpinejs/-/alpinejs-3.12.2.tgz#e76ffd00a4858623acf84112c27a4eecbee9ac74"
integrity sha512-wrUZULm9w6DYwWcUtB/anFLgRaF4riSuPgIJ3gcPUS8st9luAJnAxoIgro/Al97d2McSSz/JypWg/NlmKFIJJA==
version "3.13.3"
resolved "https://registry.yarnpkg.com/alpinejs/-/alpinejs-3.13.3.tgz#92eb7e869b99ff548e7a55044e45660597cf530b"
integrity sha512-WZ6WQjkAOl+WdW/jukzNHq9zHFDNKmkk/x6WF7WdyNDD6woinrfXCVsZXm0galjbco+pEpYmJLtwlZwcOfIVdg==
dependencies:
"@vue/reactivity" "~3.1.1"
@@ -234,21 +294,21 @@ asynckit@^0.4.0:
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
autoprefixer@^10.4.2:
version "10.4.14"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d"
integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==
version "10.4.16"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8"
integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==
dependencies:
browserslist "^4.21.5"
caniuse-lite "^1.0.30001464"
fraction.js "^4.2.0"
browserslist "^4.21.10"
caniuse-lite "^1.0.30001538"
fraction.js "^4.3.6"
normalize-range "^0.1.2"
picocolors "^1.0.0"
postcss-value-parser "^4.2.0"
axios@^1.1.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f"
integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
version "1.6.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2"
integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
@@ -279,25 +339,25 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
browserslist@^4.21.5:
version "4.21.9"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
browserslist@^4.21.10:
version "4.22.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b"
integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
dependencies:
caniuse-lite "^1.0.30001503"
electron-to-chromium "^1.4.431"
node-releases "^2.0.12"
update-browserslist-db "^1.0.11"
caniuse-lite "^1.0.30001565"
electron-to-chromium "^1.4.601"
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
camelcase-css@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503:
version "1.0.30001506"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001506.tgz#35bd814b310a487970c585430e9e80ee23faf14b"
integrity sha512-6XNEcpygZMCKaufIcgpQNZNf00GEqc7VQON+9Rd0K1bMYo8xhMZRAo5zpbnbMNizi4YNgIDAFrdykWsvY3H4Hw==
caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565:
version "1.0.30001570"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca"
integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
version "3.5.3"
@@ -336,6 +396,11 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cropperjs@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.6.1.tgz#fd132021d93b824b1b0f2c2c3b763419fb792d89"
integrity sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@@ -361,38 +426,38 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
electron-to-chromium@^1.4.431:
version "1.4.435"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.435.tgz#761c34300603b9f1234f0b6155870d3002435db6"
integrity sha512-B0CBWVFhvoQCW/XtjRzgrmqcgVWg6RXOEM/dK59+wFV93BFGR6AeNKc4OyhM+T3IhJaOOG8o/V+33Y2mwJWtzw==
electron-to-chromium@^1.4.601:
version "1.4.613"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz#529e4fc65576ecfd055d7d4619fade4fac446af2"
integrity sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==
esbuild@^0.17.5:
version "0.17.19"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==
esbuild@^0.19.3:
version "0.19.9"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.9.tgz#423a8f35153beb22c0b695da1cd1e6c0c8cdd490"
integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==
optionalDependencies:
"@esbuild/android-arm" "0.17.19"
"@esbuild/android-arm64" "0.17.19"
"@esbuild/android-x64" "0.17.19"
"@esbuild/darwin-arm64" "0.17.19"
"@esbuild/darwin-x64" "0.17.19"
"@esbuild/freebsd-arm64" "0.17.19"
"@esbuild/freebsd-x64" "0.17.19"
"@esbuild/linux-arm" "0.17.19"
"@esbuild/linux-arm64" "0.17.19"
"@esbuild/linux-ia32" "0.17.19"
"@esbuild/linux-loong64" "0.17.19"
"@esbuild/linux-mips64el" "0.17.19"
"@esbuild/linux-ppc64" "0.17.19"
"@esbuild/linux-riscv64" "0.17.19"
"@esbuild/linux-s390x" "0.17.19"
"@esbuild/linux-x64" "0.17.19"
"@esbuild/netbsd-x64" "0.17.19"
"@esbuild/openbsd-x64" "0.17.19"
"@esbuild/sunos-x64" "0.17.19"
"@esbuild/win32-arm64" "0.17.19"
"@esbuild/win32-ia32" "0.17.19"
"@esbuild/win32-x64" "0.17.19"
"@esbuild/android-arm" "0.19.9"
"@esbuild/android-arm64" "0.19.9"
"@esbuild/android-x64" "0.19.9"
"@esbuild/darwin-arm64" "0.19.9"
"@esbuild/darwin-x64" "0.19.9"
"@esbuild/freebsd-arm64" "0.19.9"
"@esbuild/freebsd-x64" "0.19.9"
"@esbuild/linux-arm" "0.19.9"
"@esbuild/linux-arm64" "0.19.9"
"@esbuild/linux-ia32" "0.19.9"
"@esbuild/linux-loong64" "0.19.9"
"@esbuild/linux-mips64el" "0.19.9"
"@esbuild/linux-ppc64" "0.19.9"
"@esbuild/linux-riscv64" "0.19.9"
"@esbuild/linux-s390x" "0.19.9"
"@esbuild/linux-x64" "0.19.9"
"@esbuild/netbsd-x64" "0.19.9"
"@esbuild/openbsd-x64" "0.19.9"
"@esbuild/sunos-x64" "0.19.9"
"@esbuild/win32-arm64" "0.19.9"
"@esbuild/win32-ia32" "0.19.9"
"@esbuild/win32-x64" "0.19.9"
escalade@^3.1.1:
version "3.1.1"
@@ -404,10 +469,10 @@ ev-emitter@^1.0.0:
resolved "https://registry.yarnpkg.com/ev-emitter/-/ev-emitter-1.1.1.tgz#8f18b0ce5c76a5d18017f71c0a795c65b9138f2a"
integrity sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==
fast-glob@^3.2.12:
version "3.2.12"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
fast-glob@^3.3.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -437,9 +502,9 @@ fizzy-ui-utils@^2.0.0, fizzy-ui-utils@^2.0.4:
desandro-matches-selector "^2.0.0"
follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
version "1.15.3"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a"
integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==
form-data@^4.0.0:
version "4.0.0"
@@ -450,25 +515,25 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
fraction.js@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
fraction.js@^4.3.6:
version "4.3.7"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
get-size@^2.0.0, get-size@^2.0.2:
version "2.0.3"
@@ -501,17 +566,24 @@ glob@7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
guillotine@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/guillotine/-/guillotine-1.3.1.tgz#03bffb09659026eda81491551ea282e57b2cda95"
integrity sha512-nJx8bglgxYgcAgahBddDsrGEhGXDuyYT4vIc7Aghs9HBF+50Maix5AbAwEfhkV59EQ/GvSOVIfftNvRz7DqyaA==
dependencies:
function-bind "^1.1.1"
jquery ">= 1.8.0"
hasown@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
dependencies:
function-bind "^1.1.2"
immutable@^4.0.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be"
integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==
version "4.3.4"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
inflight@^1.0.4:
version "1.0.6"
@@ -533,12 +605,12 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.0.0"
is-core-module@^2.11.0:
version "2.12.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
is-core-module@^2.13.0:
version "2.13.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
dependencies:
has "^1.0.3"
hasown "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
@@ -568,10 +640,10 @@ isotope-layout@^3.0.6:
masonry-layout "^4.1.0"
outlayer "^2.1.0"
jiti@^1.18.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
jiti@^1.19.1:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
jquery-nice-select@^1.1.0:
version "1.1.0"
@@ -580,16 +652,16 @@ jquery-nice-select@^1.1.0:
dependencies:
jquery "^2.2.3"
"jquery@>= 1.8.0", jquery@^3.7.0:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
jquery@^2.2.3:
version "2.2.4"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02"
integrity sha512-lBHj60ezci2u1v2FqnZIraShGgEXq35qCzMv4lITyHGppTnA13rwR0MgwyNJh9TnDs3aXUvd1xjAotfraMHX/Q==
jquery@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.0.tgz#fe2c01a05da500709006d8790fe21c8a39d75612"
integrity sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==
js.cookie@^0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/js.cookie/-/js.cookie-0.0.4.tgz#c581270d0403b1c5125f91d5a48295e290e2869a"
@@ -603,11 +675,16 @@ laravel-vite-plugin@^0.7.5:
picocolors "^1.0.0"
vite-plugin-full-reload "^1.0.5"
lilconfig@^2.0.5, lilconfig@^2.1.0:
lilconfig@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
lilconfig@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc"
integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@@ -677,15 +754,15 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
node-releases@^2.0.12:
version "2.0.12"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
node-releases@^2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
@@ -770,12 +847,12 @@ postcss-js@^4.0.1:
camelcase-css "^2.0.1"
postcss-load-config@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd"
integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==
version "4.0.2"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3"
integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==
dependencies:
lilconfig "^2.0.5"
yaml "^2.1.1"
lilconfig "^3.0.0"
yaml "^2.3.4"
postcss-nested@^6.0.1:
version "6.0.1"
@@ -797,12 +874,12 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.23, postcss@^8.4.6:
version "8.4.24"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df"
integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==
postcss@^8.4.23, postcss@^8.4.32, postcss@^8.4.6:
version "8.4.32"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
dependencies:
nanoid "^3.3.6"
nanoid "^3.3.7"
picocolors "^1.0.0"
source-map-js "^1.0.2"
@@ -831,11 +908,11 @@ readdirp@~3.6.0:
picomatch "^2.2.1"
resolve@^1.1.7, resolve@^1.22.2:
version "1.22.2"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
version "1.22.8"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
is-core-module "^2.11.0"
is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -844,11 +921,24 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rollup@^3.21.0:
version "3.25.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.25.1.tgz#9fff79d22ff1a904b2b595a2fb9bc3793cb987d8"
integrity sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==
rollup@^4.2.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.0.tgz#94dff4070f106c1be6b2e88401a49b023c87fa88"
integrity sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.9.0"
"@rollup/rollup-android-arm64" "4.9.0"
"@rollup/rollup-darwin-arm64" "4.9.0"
"@rollup/rollup-darwin-x64" "4.9.0"
"@rollup/rollup-linux-arm-gnueabihf" "4.9.0"
"@rollup/rollup-linux-arm64-gnu" "4.9.0"
"@rollup/rollup-linux-arm64-musl" "4.9.0"
"@rollup/rollup-linux-riscv64-gnu" "4.9.0"
"@rollup/rollup-linux-x64-gnu" "4.9.0"
"@rollup/rollup-linux-x64-musl" "4.9.0"
"@rollup/rollup-win32-arm64-msvc" "4.9.0"
"@rollup/rollup-win32-ia32-msvc" "4.9.0"
"@rollup/rollup-win32-x64-msvc" "4.9.0"
fsevents "~2.3.2"
run-parallel@^1.1.9:
@@ -859,9 +949,9 @@ run-parallel@^1.1.9:
queue-microtask "^1.2.2"
sass@^1.63.6:
version "1.63.6"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea"
integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==
version "1.69.5"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde"
integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@@ -878,9 +968,9 @@ slick-carousel@^1.8.1:
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
sucrase@^3.32.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7"
integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==
version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==
dependencies:
"@jridgewell/gen-mapping" "^0.3.2"
commander "^4.0.0"
@@ -896,19 +986,19 @@ supports-preserve-symlinks-flag@^1.0.0:
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
tailwindcss@^3.1.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3"
integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==
version "3.3.6"
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.6.tgz#4dd7986bf4902ad385d90d45fd4b2fa5fab26d5f"
integrity sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==
dependencies:
"@alloc/quick-lru" "^5.2.0"
arg "^5.0.2"
chokidar "^3.5.3"
didyoumean "^1.2.2"
dlv "^1.1.3"
fast-glob "^3.2.12"
fast-glob "^3.3.0"
glob-parent "^6.0.2"
is-glob "^4.0.3"
jiti "^1.18.2"
jiti "^1.19.1"
lilconfig "^2.1.0"
micromatch "^4.0.5"
normalize-path "^3.0.0"
@@ -920,7 +1010,6 @@ tailwindcss@^3.1.0:
postcss-load-config "^4.0.1"
postcss-nested "^6.0.1"
postcss-selector-parser "^6.0.11"
postcss-value-parser "^4.2.0"
resolve "^1.22.2"
sucrase "^3.32.0"
@@ -950,10 +1039,10 @@ ts-interface-checker@^0.1.9:
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
update-browserslist-db@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
update-browserslist-db@^1.0.13:
version "1.0.13"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
dependencies:
escalade "^3.1.1"
picocolors "^1.0.0"
@@ -964,23 +1053,23 @@ util-deprecate@^1.0.2:
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
vite-plugin-full-reload@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz#6cddfa94e51909843bc7156ab728dbac972b8560"
integrity sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ==
version "1.1.0"
resolved "https://registry.yarnpkg.com/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz#ca6fa32631024a459ea9e5613dd4c0ff0f3b7995"
integrity sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==
dependencies:
picocolors "^1.0.0"
picomatch "^2.3.1"
vite@^4.0.0:
version "4.3.9"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d"
integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==
vite@^5.0.9:
version "5.0.9"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.9.tgz#2ac49a37b5accba29d945fcee9a0b7b862423cd4"
integrity sha512-wVqMd5kp28QWGgfYPDfrj771VyHTJ4UDlCteLH7bJDGDEamaz5hV8IX6h1brSGgnnyf9lI2RnzXq/JmD0c2wwg==
dependencies:
esbuild "^0.17.5"
postcss "^8.4.23"
rollup "^3.21.0"
esbuild "^0.19.3"
postcss "^8.4.32"
rollup "^4.2.0"
optionalDependencies:
fsevents "~2.3.2"
fsevents "~2.3.3"
waypoints@^4.0.1:
version "4.0.1"
@@ -997,7 +1086,7 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
yaml@^2.1.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
yaml@^2.3.4:
version "2.3.4"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==

View File

@@ -2,4 +2,3 @@
# yarn lockfile v1
yarn-path ".yarn/releases/yarn-1.22.19.cjs"