diff --git a/_ide_helper.php b/_ide_helper.php index 92d0239..1e2d852 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -24033,6 +24033,317 @@ public static function getContainer() } } +namespace Maatwebsite\Excel\Facades { + /** + * + * + */ + class Excel { + /** + * + * + * @param object $export + * @param string|null $fileName + * @param string $writerType + * @param array $headers + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @throws \PhpOffice\PhpSpreadsheet\Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function download($export, $fileName, $writerType = null, $headers = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->download($export, $fileName, $writerType, $headers); + } + + /** + * + * + * @param string|null $disk Fallback for usage with named properties + * @param object $export + * @param string $filePath + * @param string|null $diskName + * @param string $writerType + * @param mixed $diskOptions + * @return bool + * @throws \PhpOffice\PhpSpreadsheet\Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function store($export, $filePath, $diskName = null, $writerType = null, $diskOptions = [], $disk = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->store($export, $filePath, $diskName, $writerType, $diskOptions, $disk); + } + + /** + * + * + * @param object $export + * @param string $filePath + * @param string|null $disk + * @param string $writerType + * @param mixed $diskOptions + * @return \Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function queue($export, $filePath, $disk = null, $writerType = null, $diskOptions = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queue($export, $filePath, $disk, $writerType, $diskOptions); + } + + /** + * + * + * @param object $export + * @param string $writerType + * @return string + * @static + */ + public static function raw($export, $writerType) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->raw($export, $writerType); + } + + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return \Maatwebsite\Excel\Reader|\Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function import($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->import($import, $filePath, $disk, $readerType); + } + + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return array + * @static + */ + public static function toArray($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toArray($import, $filePath, $disk, $readerType); + } + + /** + * + * + * @param object $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string|null $readerType + * @return \Illuminate\Support\Collection + * @static + */ + public static function toCollection($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toCollection($import, $filePath, $disk, $readerType); + } + + /** + * + * + * @param \Illuminate\Contracts\Queue\ShouldQueue $import + * @param string|\Symfony\Component\HttpFoundation\File\UploadedFile $filePath + * @param string|null $disk + * @param string $readerType + * @return \Illuminate\Foundation\Bus\PendingDispatch + * @static + */ + public static function queueImport($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queueImport($import, $filePath, $disk, $readerType); + } + + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @param-closure-this static $macro + * @return void + * @static + */ + public static function macro($name, $macro) + { + \Maatwebsite\Excel\Excel::macro($name, $macro); + } + + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ + public static function mixin($mixin, $replace = true) + { + \Maatwebsite\Excel\Excel::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Maatwebsite\Excel\Excel::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Maatwebsite\Excel\Excel::flushMacros(); + } + + /** + * + * + * @param string $concern + * @param callable $handler + * @param string $event + * @static + */ + public static function extend($concern, $handler, $event = 'Maatwebsite\\Excel\\Events\\BeforeWriting') + { + return \Maatwebsite\Excel\Excel::extend($concern, $handler, $event); + } + + /** + * When asserting downloaded, stored, queued or imported, use regular expression + * to look for a matching file path. + * + * @return void + * @static + */ + public static function matchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + $instance->matchByRegex(); + } + + /** + * When asserting downloaded, stored, queued or imported, use regular string + * comparison for matching file path. + * + * @return void + * @static + */ + public static function doNotMatchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + $instance->doNotMatchByRegex(); + } + + /** + * + * + * @param string $fileName + * @param callable|null $callback + * @static + */ + public static function assertDownloaded($fileName, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertDownloaded($fileName, $callback); + } + + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertStored($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertStored($filePath, $disk, $callback); + } + + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertQueued($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueued($filePath, $disk, $callback); + } + + /** + * + * + * @static + */ + public static function assertQueuedWithChain($chain) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueuedWithChain($chain); + } + + /** + * + * + * @param string $classname + * @param callable|null $callback + * @static + */ + public static function assertExportedInRaw($classname, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertExportedInRaw($classname, $callback); + } + + /** + * + * + * @param string $filePath + * @param string|callable|null $disk + * @param callable|null $callback + * @static + */ + public static function assertImported($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertImported($filePath, $disk, $callback); + } + + } + } + namespace ProtoneMedia\LaravelFFMpeg\Support { /** * @@ -24332,6 +24643,49 @@ public static function getConfig() } } +namespace Illuminate\Support { + /** + * + * + * @template TKey of array-key + * @template-covariant TValue + * @implements \ArrayAccess + * @implements \Illuminate\Support\Enumerable + */ + class Collection { + /** + * + * + * @see \Maatwebsite\Excel\Mixins\DownloadCollectionMixin::downloadExcel() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @param array $responseHeaders + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false, $responseHeaders = []) + { + return \Illuminate\Support\Collection::downloadExcel($fileName, $writerType, $withHeadings, $responseHeaders); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\StoreCollectionMixin::storeExcel() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Support\Collection::storeExcel($filePath, $disk, $writerType, $withHeadings); + } + + } + } + namespace Illuminate\Http { /** * @@ -26881,6 +27235,64 @@ public static function mergeConstraintsFrom($from) return $instance->mergeConstraintsFrom($from); } + /** + * + * + * @see \Maatwebsite\Excel\Mixins\DownloadQueryMacro::__invoke() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::downloadExcel($fileName, $writerType, $withHeadings); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\StoreQueryMacro::__invoke() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::storeExcel($filePath, $disk, $writerType, $withHeadings); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\ImportMacro::__invoke() + * @param string $filename + * @param string|null $disk + * @param string|null $readerType + * @static + */ + public static function import($filename, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::import($filename, $disk, $readerType); + } + + /** + * + * + * @see \Maatwebsite\Excel\Mixins\ImportAsMacro::__invoke() + * @param string $filename + * @param callable $mapping + * @param string|null $disk + * @param string|null $readerType + * @static + */ + public static function importAs($filename, $mapping, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::importAs($filename, $mapping, $disk, $readerType); + } + /** * Set the columns to be selected. * @@ -29666,6 +30078,7 @@ class Twitter extends \Artesaos\SEOTools\Facades\TwitterCard {} class OpenGraph extends \Artesaos\SEOTools\Facades\OpenGraph {} class Horizon extends \Laravel\Horizon\Horizon {} class Socialite extends \Laravel\Socialite\Facades\Socialite {} + class Excel extends \Maatwebsite\Excel\Facades\Excel {} class FFMpeg extends \ProtoneMedia\LaravelFFMpeg\Support\FFMpeg {} class ResponseCache extends \Spatie\ResponseCache\Facades\ResponseCache {} class Hashids extends \Vinkla\Hashids\Facades\Hashids {} diff --git a/database/.DS_Store b/database/.DS_Store deleted file mode 100644 index 907b800..0000000 Binary files a/database/.DS_Store and /dev/null differ diff --git a/database/migrations/2025_07_14_092128_add_group_to_meme_media_table.php b/database/migrations/2025_07_14_092128_add_group_to_meme_media_table.php index 4481913..693fd72 100644 --- a/database/migrations/2025_07_14_092128_add_group_to_meme_media_table.php +++ b/database/migrations/2025_07_14_092128_add_group_to_meme_media_table.php @@ -2,8 +2,8 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Schema; return new class extends Migration { diff --git a/database/seeders/.DS_Store b/database/seeders/.DS_Store deleted file mode 100644 index b261505..0000000 Binary files a/database/seeders/.DS_Store and /dev/null differ diff --git a/database/seeders/G2MemeMediaSeeder.php b/database/seeders/G2MemeMediaSeeder.php index d4c8941..7a900e5 100644 --- a/database/seeders/G2MemeMediaSeeder.php +++ b/database/seeders/G2MemeMediaSeeder.php @@ -53,7 +53,7 @@ public function run(): void $csv_path = database_path('seeders/data/g2.csv'); $meme_data = $this->parseCsvFile($csv_path); - $this->command->info('📊 Found ' . count($meme_data) . ' memes to import'); + $this->command->info('📊 Found '.count($meme_data).' memes to import'); // Process records individually for PostgreSQL compatibility $total_processed = 0; @@ -61,12 +61,13 @@ public function run(): void $total_failed = 0; foreach ($meme_data as $index => $meme_record) { - $this->command->info('Processing ' . ($index + 1) . '/' . count($meme_data) . ': ' . $meme_record['filename']); + $this->command->info('Processing '.($index + 1).'/'.count($meme_data).': '.$meme_record['filename']); // Skip empty or malformed records if (empty($meme_record['filename']) || empty($meme_record['type']) || empty($meme_record['name'])) { - $this->command->warn("⏭️ Skipping malformed CSV record at line " . ($index + 1) . ": missing filename, type, or name"); + $this->command->warn('⏭️ Skipping malformed CSV record at line '.($index + 1).': missing filename, type, or name'); $total_skipped++; + continue; } @@ -93,12 +94,12 @@ public function run(): void } } else { $this->command->error("❌ Failed to import: {$meme_record['filename']} - Import returned false"); - $this->command->error("🛑 Halting seeder to investigate the issue"); + $this->command->error('🛑 Halting seeder to investigate the issue'); throw new \RuntimeException("Import failed for {$meme_record['filename']}"); } } catch (\Exception $e) { $this->command->error("❌ Failed to import: {$meme_record['filename']} - {$e->getMessage()}"); - $this->command->error("🛑 Halting seeder to investigate the issue"); + $this->command->error('🛑 Halting seeder to investigate the issue'); throw $e; } } @@ -144,24 +145,24 @@ private function parseCsvFile(string $csv_path): array // Use Laravel Excel to parse CSV with proper handling of multi-line fields $collection = Excel::toCollection(null, $csv_path)->first(); - + if ($collection->isEmpty()) { - throw new \RuntimeException("CSV file is empty or could not be parsed"); + throw new \RuntimeException('CSV file is empty or could not be parsed'); } - + // Get headers from first row $headers = $collection->first()->toArray(); - + // Convert remaining rows to associative arrays $meme_data = []; foreach ($collection->skip(1) as $row) { $row_array = $row->toArray(); - + // Skip empty rows if (empty(array_filter($row_array))) { continue; } - + // Ensure row has same number of columns as headers if (count($row_array) === count($headers)) { $record = array_combine($headers, $row_array); @@ -213,20 +214,20 @@ private function importSingleMeme(array $meme_record): bool 'save_url', // Mode: just save URL reference null, // Auto-generate filename 'r2', // Disk (not used for URL mode) - trim($meme_record['name']) . " ({$format})", // Name with format + trim($meme_record['name'])." ({$format})", // Name with format null, // No specific user $config['mime'] // MIME type ); - $media_uuids[$format . '_uuid'] = $media->uuid; - $media_urls[$format . '_url'] = $url; + $media_uuids[$format.'_uuid'] = $media->uuid; + $media_urls[$format.'_url'] = $url; } catch (\Exception $e) { $this->command->error("Failed to create {$format} media for {$meme_record['filename']}: {$e->getMessage()}"); throw $e; } } - //dump($meme_record); + // dump($meme_record); // // Generate embedding // try { @@ -238,7 +239,7 @@ private function importSingleMeme(array $meme_record): bool // $embedding = null; // Continue without embedding // } - //dd($embedding); + // dd($embedding); // Check if record exists one more time within transaction $existing_meme = MemeMedia::where('original_id', $meme_record['filename']) @@ -253,12 +254,12 @@ private function importSingleMeme(array $meme_record): bool // Check for null description before creating record if ($meme_record['description'] === null) { - $this->command->error("❌ NULL DESCRIPTION DETECTED:"); + $this->command->error('❌ NULL DESCRIPTION DETECTED:'); $this->command->error(" Filename: {$meme_record['filename']}"); $this->command->error(" Name: {$meme_record['name']}"); - $this->command->error(" Description field is NULL in CSV data"); - $this->command->error(" CSV row data: " . json_encode($meme_record)); - $this->command->error("🛑 HALTING SEEDER - FIX THE CSV DATA"); + $this->command->error(' Description field is NULL in CSV data'); + $this->command->error(' CSV row data: '.json_encode($meme_record)); + $this->command->error('🛑 HALTING SEEDER - FIX THE CSV DATA'); throw new \RuntimeException("NULL description found for {$meme_record['filename']} - CSV data needs to be fixed"); } @@ -287,13 +288,13 @@ private function importSingleMeme(array $meme_record): bool ]); $meme_media->duration = MemeMediaMaintenance::getDurationUsingFfmpeg($meme_media); - //$meme_media->embedding = $embedding; + // $meme_media->embedding = $embedding; $meme_media->save(); // Add keywords as tags $this->attachKeywordsAsTags($meme_media, $meme_record['keywords']); - $this->command->info('✅ Imported: ' . trim($meme_record['name'])); + $this->command->info('✅ Imported: '.trim($meme_record['name'])); return true; } catch (\Exception $e) { @@ -307,7 +308,7 @@ private function attachKeywordsAsTags(MemeMedia $meme_media, array $keywords): v try { $meme_media->attachTags($keywords, 'meme_media'); } catch (\Exception $e) { - $this->command->warn("Failed to attach tags to meme media '{$meme_media->name}': " . $e->getMessage()); + $this->command->warn("Failed to attach tags to meme media '{$meme_media->name}': ".$e->getMessage()); Log::warning('Failed to attach tags', [ 'category_id' => $meme_media->id, 'keywords' => $keywords, @@ -321,7 +322,7 @@ private function attachKeywordsAsTags(MemeMedia $meme_media, array $keywords): v */ private function generateCdnUrl(string $base_filename, string $extension): string { - return self::CDN_BASE_URL . "/{$extension}/{$base_filename}.{$extension}"; + return self::CDN_BASE_URL."/{$extension}/{$base_filename}.{$extension}"; } /** diff --git a/resources/js/pages/home/partials/FAQDiscord.jsx b/resources/js/pages/home/partials/FAQDiscord.jsx index c4b1aea..af5fe4c 100644 --- a/resources/js/pages/home/partials/FAQDiscord.jsx +++ b/resources/js/pages/home/partials/FAQDiscord.jsx @@ -5,27 +5,28 @@ const FAQDiscord = () => { const faqData = [ { q: 'How can I create a meme video?', - a: 'Use the video editor on top to start making your meme! Edit your caption, background and meme. Once satisfied, press the Export button to download your video!', - }, - { - q: 'What features are available now?', - a: 'At the moment, All 200+ meme templates and 200+ backgrounds are completely free! We will be adding more memes and backgrounds to the library soon!', + a: 'Use the video editor on top to start making your meme!

Edit your caption, background and meme. Once satisfied, press the Export button to download your video!', }, + { q: 'Why is video export slow for me?', - a: 'Video processing happens entirely in your browser using advanced web technology. Export speed depends on your video content complexity and device performance. High-end devices export quickly, while older/slower devices may take longer or even crash. If your phone is too slow, try using a faster device like a desktop computer for better performance.', + a: "Video processing happens entirely in your browser using advanced web technology.

Export speed depends on your video content complexity and device performance. High-end devices export quickly, while older/slower devices may take longer or even crash.

If your phone is too slow, it's probably a potato. Try using a faster device like a desktop computer for better performance.", + }, + { + q: 'What is a potato device?', + a: `Potato devices are old, dated computers, laptops, phones or tablets with little RAM and CPU power - typically devices from before ${new Date().getFullYear() - 6} (pre-${new Date().getFullYear() - 6}).

These devices are usually too weak for the modern web and may not work properly with our video editor, or may crash during video processing.`, }, { q: 'What video format do you export?', - a: 'We export high-quality MP4 videos optimized for all social media platforms in 9:16 format, which is compatible for TikTok, Youtube Shorts, Instagram Reels, and more.', + a: 'We export high-quality MP4 videos optimized for all social media platforms in 9:16 format.

This is compatible for TikTok, Youtube Shorts, Instagram Reels, and more.', }, { q: 'Is there a mobile app?', - a: "Our web app is fully responsive and works perfectly on mobile devices. Do you want a mobile app? We'll see what can be done. Let us know in our Discord group.", + a: "Our web app is fully responsive and works perfectly on mobile devices.

Do you want a mobile app? We'll see what can be done. Let us know in our Discord group.", }, { q: 'How often do you add new content?', - a: 'We just started building this platform and will gradually add more meme templates and backgrounds over time, so everyone can continue using it for free with fresh content! Want a certain content? Let us know in our Discord group.', + a: 'We just started building this platform and will gradually add more meme templates and backgrounds over time, so everyone can continue using it for free with fresh content!

Want a certain content? Let us know in our Discord group.', }, { q: 'I have more questions!', @@ -49,7 +50,9 @@ const FAQDiscord = () => { {faqData.map((faq, index) => ( {faq.q} - {faq.a} + +
+ ))} diff --git a/resources/js/pages/home/partials/Features.jsx b/resources/js/pages/home/partials/Features.jsx index cfb8be5..5143743 100644 --- a/resources/js/pages/home/partials/Features.jsx +++ b/resources/js/pages/home/partials/Features.jsx @@ -4,28 +4,31 @@ const Features = () => { const features = [ { icon: Video, - title: 'Web-powered Video Editor', - description: 'Easy video editor with editable text, background, memes, built into the web. No additional software required.', + title: 'No installation needed', + description: 'Easy video editor with editable text, background, memes, built into the web.', gradient: 'bg-gradient-to-br from-transparent to-blue-500/5 dark:to-blue-400/10 hover:bg-gradient-to-tl', + order: 3, }, { icon: Heart, title: 'Built-in over 200+ memes, for now', description: 'Access meme and background with our editor without paying a cent.', gradient: 'bg-gradient-to-br from-transparent to-pink-500/5 dark:to-pink-400/10 hover:bg-gradient-to-tl', + order: 1, }, - { icon: Download, title: 'Export in minutes', description: 'Download high-quality 720p MP4 videos optimized for TikTok, Youtube Shorts, Instagram Reels, and more.', gradient: 'bg-gradient-to-br from-transparent to-green-500/5 dark:to-green-400/10 hover:bg-gradient-to-tl', + order: 2, }, { icon: Smartphone, title: 'Works Everywhere', description: 'Create on desktop, tablet, or mobile! Potato devices not recommended though.', gradient: 'bg-gradient-to-br from-transparent to-purple-500/5 dark:to-purple-400/10 hover:bg-gradient-to-tl', + order: 4, }, { icon: Library, @@ -33,6 +36,7 @@ const Features = () => { description: 'Soon we will be adding more memes and backgrounds to the library!', comingSoon: true, gradient: 'bg-gradient-to-br from-transparent to-orange-500/5 dark:to-orange-400/10 hover:bg-gradient-to-tl', + order: 5, }, ]; @@ -40,26 +44,28 @@ const Features = () => {
- {features.map((feature, index) => ( -
- {feature.comingSoon && ( -
- Coming Soon! + {features + .sort((a, b) => a.order - b.order) + .map((feature, index) => ( +
+ {feature.comingSoon && ( +
+ Coming Soon! +
+ )} + +
+
- )} -
- +

{feature.title}

+ +

{feature.description}

- -

{feature.title}

- -

{feature.description}

-
- ))} + ))}
diff --git a/resources/js/pages/home/partials/Hero.jsx b/resources/js/pages/home/partials/Hero.jsx index b1f5fb9..226a791 100644 --- a/resources/js/pages/home/partials/Hero.jsx +++ b/resources/js/pages/home/partials/Hero.jsx @@ -8,7 +8,7 @@ const Hero = () => { {/* Badge */}
- Free meme videos • No signup required + Instant meme videos • No signup required
{/* Main heading */} @@ -19,7 +19,7 @@ const Hero = () => {

- Simple, fast, and free meme video editor + Fast and simple meme video editor

diff --git a/resources/js/ziggy.js b/resources/js/ziggy.js index 3b1b10a..d873d82 100644 --- a/resources/js/ziggy.js +++ b/resources/js/ziggy.js @@ -1,4 +1,4 @@ -const Ziggy = {"url":"https:\/\/memefa.st","port":null,"defaults":{},"routes":{"cashier.payment":{"uri":"stripe\/payment\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"cashier.webhook":{"uri":"stripe\/webhook","methods":["POST"]},"horizon.stats.index":{"uri":"horizon\/api\/stats","methods":["GET","HEAD"]},"horizon.workload.index":{"uri":"horizon\/api\/workload","methods":["GET","HEAD"]},"horizon.masters.index":{"uri":"horizon\/api\/masters","methods":["GET","HEAD"]},"horizon.monitoring.index":{"uri":"horizon\/api\/monitoring","methods":["GET","HEAD"]},"horizon.monitoring.store":{"uri":"horizon\/api\/monitoring","methods":["POST"]},"horizon.monitoring-tag.paginate":{"uri":"horizon\/api\/monitoring\/{tag}","methods":["GET","HEAD"],"parameters":["tag"]},"horizon.monitoring-tag.destroy":{"uri":"horizon\/api\/monitoring\/{tag}","methods":["DELETE"],"wheres":{"tag":".*"},"parameters":["tag"]},"horizon.jobs-metrics.index":{"uri":"horizon\/api\/metrics\/jobs","methods":["GET","HEAD"]},"horizon.jobs-metrics.show":{"uri":"horizon\/api\/metrics\/jobs\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.queues-metrics.index":{"uri":"horizon\/api\/metrics\/queues","methods":["GET","HEAD"]},"horizon.queues-metrics.show":{"uri":"horizon\/api\/metrics\/queues\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.jobs-batches.index":{"uri":"horizon\/api\/batches","methods":["GET","HEAD"]},"horizon.jobs-batches.show":{"uri":"horizon\/api\/batches\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.jobs-batches.retry":{"uri":"horizon\/api\/batches\/retry\/{id}","methods":["POST"],"parameters":["id"]},"horizon.pending-jobs.index":{"uri":"horizon\/api\/jobs\/pending","methods":["GET","HEAD"]},"horizon.completed-jobs.index":{"uri":"horizon\/api\/jobs\/completed","methods":["GET","HEAD"]},"horizon.silenced-jobs.index":{"uri":"horizon\/api\/jobs\/silenced","methods":["GET","HEAD"]},"horizon.failed-jobs.index":{"uri":"horizon\/api\/jobs\/failed","methods":["GET","HEAD"]},"horizon.failed-jobs.show":{"uri":"horizon\/api\/jobs\/failed\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.retry-jobs.show":{"uri":"horizon\/api\/jobs\/retry\/{id}","methods":["POST"],"parameters":["id"]},"horizon.jobs.show":{"uri":"horizon\/api\/jobs\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.index":{"uri":"horizon\/{view?}","methods":["GET","HEAD"],"wheres":{"view":"(.*)"},"parameters":["view"]},"sanctum.csrf-cookie":{"uri":"sanctum\/csrf-cookie","methods":["GET","HEAD"]},"api.pricing_page":{"uri":"api\/pricing","methods":["POST"]},"api.ai_hints":{"uri":"api\/ai-hints","methods":["POST"]},"api.user":{"uri":"api\/user","methods":["POST"]},"api.user.subscribe":{"uri":"api\/user\/subscribe","methods":["POST"]},"api.user.purchase":{"uri":"api\/user\/purchase","methods":["POST"]},"api.user.billing_portal":{"uri":"api\/user\/billing-portal","methods":["POST"]},"api.user.premium_export.request":{"uri":"api\/user\/premium-export\/request","methods":["POST"]},"api.user.premium_export.complete":{"uri":"api\/user\/premium-export\/complete","methods":["POST"]},"api.user.generate_meme":{"uri":"api\/user\/generate_meme","methods":["POST"]},"api.user.check_meme_job_status":{"uri":"api\/user\/generate_meme\/status","methods":["POST"]},"api.user.get_active_job":{"uri":"api\/user\/generate_meme\/active","methods":["POST"]},"api.user.get_meme_history":{"uri":"api\/user\/generate_meme\/history","methods":["POST"]},"api.app.init":{"uri":"api\/app\/init","methods":["POST"]},"api.app.memes":{"uri":"api\/app\/memes","methods":["POST"]},"api.app.background":{"uri":"api\/app\/background","methods":["POST"]},"auth.google.redirect":{"uri":"auth\/google\/redirect","methods":["GET","HEAD"]},"auth.google.callback":{"uri":"auth\/google\/callback","methods":["GET","HEAD"]},"dashboard":{"uri":"dashboard","methods":["GET","HEAD"]},"subscribe.success":{"uri":"subscribe\/success","methods":["GET","HEAD"]},"subscribe.cancelled":{"uri":"subscribe\/cancelled","methods":["GET","HEAD"]},"purchase.success":{"uri":"purchase\/success","methods":["GET","HEAD"]},"purchase.cancelled":{"uri":"purchase\/cancelled","methods":["GET","HEAD"]},"admin.dashboard":{"uri":"admin","methods":["GET","HEAD"]},"admin.background-generation":{"uri":"admin\/background-generation","methods":["GET","HEAD"]},"admin.background-generation.generate":{"uri":"admin\/background-generation\/generate","methods":["POST"]},"admin.background-generation.save":{"uri":"admin\/background-generation\/save","methods":["POST"]},"admin.background-generation.delete":{"uri":"admin\/background-generation\/delete\/{id}","methods":["POST"],"parameters":["id"]},"profile.edit":{"uri":"settings\/profile","methods":["GET","HEAD"]},"profile.update":{"uri":"settings\/profile","methods":["PATCH"]},"profile.destroy":{"uri":"settings\/profile","methods":["DELETE"]},"password.edit":{"uri":"settings\/password","methods":["GET","HEAD"]},"password.update":{"uri":"settings\/password","methods":["PUT"]},"appearance":{"uri":"settings\/appearance","methods":["GET","HEAD"]},"register":{"uri":"register","methods":["GET","HEAD"]},"login":{"uri":"login","methods":["GET","HEAD"]},"password.request":{"uri":"forgot-password","methods":["GET","HEAD"]},"password.email":{"uri":"forgot-password","methods":["POST"]},"password.reset":{"uri":"reset-password\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"password.store":{"uri":"reset-password","methods":["POST"]},"verification.notice":{"uri":"verify-email","methods":["GET","HEAD"]},"verification.verify":{"uri":"verify-email\/{id}\/{hash}","methods":["GET","HEAD"],"parameters":["id","hash"]},"verification.send":{"uri":"email\/verification-notification","methods":["POST"]},"password.confirm":{"uri":"confirm-password","methods":["GET","HEAD"]},"logout":{"uri":"logout","methods":["POST"]},"home":{"uri":"\/","methods":["GET","HEAD"]},"privacy":{"uri":"privacy","methods":["GET","HEAD"]},"terms":{"uri":"terms","methods":["GET","HEAD"]},"storage.local":{"uri":"storage\/{path}","methods":["GET","HEAD"],"wheres":{"path":".*"},"parameters":["path"]}}}; +const Ziggy = {"url":"https:\/\/memefast.test","port":null,"defaults":{},"routes":{"cashier.payment":{"uri":"stripe\/payment\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"cashier.webhook":{"uri":"stripe\/webhook","methods":["POST"]},"horizon.stats.index":{"uri":"horizon\/api\/stats","methods":["GET","HEAD"]},"horizon.workload.index":{"uri":"horizon\/api\/workload","methods":["GET","HEAD"]},"horizon.masters.index":{"uri":"horizon\/api\/masters","methods":["GET","HEAD"]},"horizon.monitoring.index":{"uri":"horizon\/api\/monitoring","methods":["GET","HEAD"]},"horizon.monitoring.store":{"uri":"horizon\/api\/monitoring","methods":["POST"]},"horizon.monitoring-tag.paginate":{"uri":"horizon\/api\/monitoring\/{tag}","methods":["GET","HEAD"],"parameters":["tag"]},"horizon.monitoring-tag.destroy":{"uri":"horizon\/api\/monitoring\/{tag}","methods":["DELETE"],"wheres":{"tag":".*"},"parameters":["tag"]},"horizon.jobs-metrics.index":{"uri":"horizon\/api\/metrics\/jobs","methods":["GET","HEAD"]},"horizon.jobs-metrics.show":{"uri":"horizon\/api\/metrics\/jobs\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.queues-metrics.index":{"uri":"horizon\/api\/metrics\/queues","methods":["GET","HEAD"]},"horizon.queues-metrics.show":{"uri":"horizon\/api\/metrics\/queues\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.jobs-batches.index":{"uri":"horizon\/api\/batches","methods":["GET","HEAD"]},"horizon.jobs-batches.show":{"uri":"horizon\/api\/batches\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.jobs-batches.retry":{"uri":"horizon\/api\/batches\/retry\/{id}","methods":["POST"],"parameters":["id"]},"horizon.pending-jobs.index":{"uri":"horizon\/api\/jobs\/pending","methods":["GET","HEAD"]},"horizon.completed-jobs.index":{"uri":"horizon\/api\/jobs\/completed","methods":["GET","HEAD"]},"horizon.silenced-jobs.index":{"uri":"horizon\/api\/jobs\/silenced","methods":["GET","HEAD"]},"horizon.failed-jobs.index":{"uri":"horizon\/api\/jobs\/failed","methods":["GET","HEAD"]},"horizon.failed-jobs.show":{"uri":"horizon\/api\/jobs\/failed\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.retry-jobs.show":{"uri":"horizon\/api\/jobs\/retry\/{id}","methods":["POST"],"parameters":["id"]},"horizon.jobs.show":{"uri":"horizon\/api\/jobs\/{id}","methods":["GET","HEAD"],"parameters":["id"]},"horizon.index":{"uri":"horizon\/{view?}","methods":["GET","HEAD"],"wheres":{"view":"(.*)"},"parameters":["view"]},"sanctum.csrf-cookie":{"uri":"sanctum\/csrf-cookie","methods":["GET","HEAD"]},"api.pricing_page":{"uri":"api\/pricing","methods":["POST"]},"api.ai_hints":{"uri":"api\/ai-hints","methods":["POST"]},"api.user":{"uri":"api\/user","methods":["POST"]},"api.user.subscribe":{"uri":"api\/user\/subscribe","methods":["POST"]},"api.user.purchase":{"uri":"api\/user\/purchase","methods":["POST"]},"api.user.billing_portal":{"uri":"api\/user\/billing-portal","methods":["POST"]},"api.user.premium_export.request":{"uri":"api\/user\/premium-export\/request","methods":["POST"]},"api.user.premium_export.complete":{"uri":"api\/user\/premium-export\/complete","methods":["POST"]},"api.user.generate_meme":{"uri":"api\/user\/generate_meme","methods":["POST"]},"api.user.check_meme_job_status":{"uri":"api\/user\/generate_meme\/status","methods":["POST"]},"api.user.get_active_job":{"uri":"api\/user\/generate_meme\/active","methods":["POST"]},"api.user.get_meme_history":{"uri":"api\/user\/generate_meme\/history","methods":["POST"]},"api.app.init":{"uri":"api\/app\/init","methods":["POST"]},"api.app.memes":{"uri":"api\/app\/memes","methods":["POST"]},"api.app.background":{"uri":"api\/app\/background","methods":["POST"]},"auth.google.redirect":{"uri":"auth\/google\/redirect","methods":["GET","HEAD"]},"auth.google.callback":{"uri":"auth\/google\/callback","methods":["GET","HEAD"]},"dashboard":{"uri":"dashboard","methods":["GET","HEAD"]},"subscribe.success":{"uri":"subscribe\/success","methods":["GET","HEAD"]},"subscribe.cancelled":{"uri":"subscribe\/cancelled","methods":["GET","HEAD"]},"purchase.success":{"uri":"purchase\/success","methods":["GET","HEAD"]},"purchase.cancelled":{"uri":"purchase\/cancelled","methods":["GET","HEAD"]},"admin.dashboard":{"uri":"admin","methods":["GET","HEAD"]},"admin.background-generation":{"uri":"admin\/background-generation","methods":["GET","HEAD"]},"admin.background-generation.generate":{"uri":"admin\/background-generation\/generate","methods":["POST"]},"admin.background-generation.save":{"uri":"admin\/background-generation\/save","methods":["POST"]},"admin.background-generation.delete":{"uri":"admin\/background-generation\/delete\/{id}","methods":["POST"],"parameters":["id"]},"profile.edit":{"uri":"settings\/profile","methods":["GET","HEAD"]},"profile.update":{"uri":"settings\/profile","methods":["PATCH"]},"profile.destroy":{"uri":"settings\/profile","methods":["DELETE"]},"password.edit":{"uri":"settings\/password","methods":["GET","HEAD"]},"password.update":{"uri":"settings\/password","methods":["PUT"]},"appearance":{"uri":"settings\/appearance","methods":["GET","HEAD"]},"register":{"uri":"register","methods":["GET","HEAD"]},"login":{"uri":"login","methods":["GET","HEAD"]},"password.request":{"uri":"forgot-password","methods":["GET","HEAD"]},"password.email":{"uri":"forgot-password","methods":["POST"]},"password.reset":{"uri":"reset-password\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"password.store":{"uri":"reset-password","methods":["POST"]},"verification.notice":{"uri":"verify-email","methods":["GET","HEAD"]},"verification.verify":{"uri":"verify-email\/{id}\/{hash}","methods":["GET","HEAD"],"parameters":["id","hash"]},"verification.send":{"uri":"email\/verification-notification","methods":["POST"]},"password.confirm":{"uri":"confirm-password","methods":["GET","HEAD"]},"logout":{"uri":"logout","methods":["POST"]},"home":{"uri":"\/","methods":["GET","HEAD"]},"privacy":{"uri":"privacy","methods":["GET","HEAD"]},"terms":{"uri":"terms","methods":["GET","HEAD"]},"storage.local":{"uri":"storage\/{path}","methods":["GET","HEAD"],"wheres":{"path":".*"},"parameters":["path"]}}}; if (typeof window !== 'undefined' && typeof window.Ziggy !== 'undefined') { Object.assign(Ziggy.routes, window.Ziggy.routes); }