Update
This commit is contained in:
@@ -8,8 +8,9 @@
|
||||
@custom-variant dark (&:is(.dark *));
|
||||
|
||||
@theme {
|
||||
--font-sans:
|
||||
'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
--font-sans: 'Lato Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
|
||||
--font-display: 'Bungee', display;
|
||||
|
||||
--radius-lg: var(--radius);
|
||||
--radius-md: calc(var(--radius) - 2px);
|
||||
|
||||
35
resources/js/modules/editor/editor.tsx
Normal file
35
resources/js/modules/editor/editor.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
import { useState } from "react"
|
||||
|
||||
import EditSidebar from "./partials/edit-sidebar"
|
||||
import EditorCanvas from "./partials/editor-canvas"
|
||||
|
||||
import EditorHeader from "./partials/editor-header"
|
||||
import EditorControls from "./partials/editor-controls"
|
||||
|
||||
const Editor = () => {
|
||||
const [isEditSidebarOpen, setIsEditSidebarOpen] = useState(false)
|
||||
const maxWidth = 350;
|
||||
|
||||
const handleEditClick = () => {
|
||||
setIsEditSidebarOpen(!isEditSidebarOpen)
|
||||
}
|
||||
|
||||
const handleCloseSidebar = () => {
|
||||
setIsEditSidebarOpen(false)
|
||||
}
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<div className="max-w-sm mx-auto min-h-screen flex flex-col relative space-y-4 py-6">
|
||||
<EditSidebar isOpen={isEditSidebarOpen} onClose={handleCloseSidebar} />
|
||||
|
||||
<EditorHeader className="max-width-[350px]" />
|
||||
<EditorCanvas maxWidth={maxWidth} />
|
||||
<EditorControls className="max-width-[350px]" onEditClick={handleEditClick} isEditActive={isEditSidebarOpen} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
export default Editor;
|
||||
131
resources/js/modules/editor/partials/edit-sidebar.tsx
Normal file
131
resources/js/modules/editor/partials/edit-sidebar.tsx
Normal file
@@ -0,0 +1,131 @@
|
||||
import { Edit3, Plus, Coins } from "lucide-react"
|
||||
|
||||
interface EditSidebarProps {
|
||||
isOpen: boolean
|
||||
onClose: () => void
|
||||
}
|
||||
|
||||
export default function EditSidebar({ isOpen, onClose }: EditSidebarProps) {
|
||||
if (!isOpen) return null
|
||||
|
||||
return (
|
||||
<div className="fixed left-0 top-0 h-full w-80 bg-white shadow-lg z-50 overflow-y-auto">
|
||||
<div className="p-4">
|
||||
{/* Header */}
|
||||
<div className="flex items-center gap-3 mb-6">
|
||||
<Edit3 className="h-6 w-6" />
|
||||
<h2 className="text-xl font-semibold">Edit Media</h2>
|
||||
</div>
|
||||
|
||||
{/* Background and Meme Selection */}
|
||||
<div className="grid grid-cols-2 gap-4 mb-6">
|
||||
<div className="border-2 border-gray-300 rounded-lg p-3 text-center">
|
||||
<div className="w-full h-16 bg-blue-600 rounded mb-2 overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=64&width=120"
|
||||
alt="Gaming background"
|
||||
width={120}
|
||||
height={64}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<span className="text-sm font-medium">Background</span>
|
||||
</div>
|
||||
<div className="border-2 border-gray-300 rounded-lg p-3 text-center">
|
||||
<div className="w-full h-16 bg-gray-200 rounded mb-2 overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=64&width=120"
|
||||
alt="Meme character"
|
||||
width={120}
|
||||
height={64}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<span className="text-sm font-medium">Meme</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* AI Background Search */}
|
||||
<div className="mb-6">
|
||||
<h3 className="text-lg font-medium mb-4">Search for backgrounds using AI</h3>
|
||||
|
||||
<div className="border-2 border-dashed border-gray-300 rounded-lg p-6 text-center mb-4">
|
||||
<div className="w-12 h-12 border-2 border-gray-400 rounded-full flex items-center justify-center mx-auto mb-3">
|
||||
<Plus className="h-6 w-6" />
|
||||
</div>
|
||||
<p className="text-sm font-medium mb-2">Generate a background with AI</p>
|
||||
<div className="flex items-center justify-center gap-1">
|
||||
<span className="text-lg font-bold">1</span>
|
||||
<div className="w-5 h-5 bg-yellow-400 rounded-full flex items-center justify-center">
|
||||
<Coins className="h-3 w-3 text-yellow-800" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Meme Templates Grid */}
|
||||
<div className="grid grid-cols-2 gap-3">
|
||||
<div className="aspect-square bg-gray-100 rounded-lg overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Creepy face meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div className="aspect-square bg-gray-100 rounded-lg overflow-hidden relative">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Confused person meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
<div className="absolute top-2 right-2 text-black font-bold text-sm">???</div>
|
||||
<div className="absolute bottom-2 left-2 text-black font-bold text-sm">???</div>
|
||||
</div>
|
||||
<div className="aspect-square bg-gray-100 rounded-lg overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Woody meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div className="aspect-square bg-gray-100 rounded-lg overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Doge meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div className="aspect-square bg-blue-900 rounded-lg overflow-hidden relative">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Stock market meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
<div className="absolute inset-0 bg-blue-900/50 flex items-center justify-center">
|
||||
<span className="text-white text-xs">📈 28%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="aspect-square bg-yellow-100 rounded-lg overflow-hidden">
|
||||
<img
|
||||
src="/placeholder.svg?height=150&width=150"
|
||||
alt="Room meme"
|
||||
width={150}
|
||||
height={150}
|
||||
className="w-full h-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
80
resources/js/modules/editor/partials/editor-canvas.tsx
Normal file
80
resources/js/modules/editor/partials/editor-canvas.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
import React, { useState, useEffect, useLayoutEffect } from 'react';
|
||||
|
||||
const useResponsiveCanvas = (maxWidth = 350) => {
|
||||
const [scale, setScale] = useState(0.5);
|
||||
|
||||
const calculateScale = () => {
|
||||
const viewportWidth = window.innerWidth;
|
||||
const padding = 0; // 16px padding on each side
|
||||
const availableWidth = viewportWidth - padding;
|
||||
|
||||
const constrainedWidth = Math.min(availableWidth, maxWidth);
|
||||
const newScale = constrainedWidth / 720;
|
||||
|
||||
// Don't scale above 100% and ensure minimum scale for very small screens
|
||||
setScale(Math.max(0.3, Math.min(newScale, 1)));
|
||||
};
|
||||
|
||||
useLayoutEffect(() => {
|
||||
calculateScale();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const handleResize = () => calculateScale();
|
||||
|
||||
window.addEventListener('resize', handleResize);
|
||||
window.addEventListener('orientationchange', handleResize);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('resize', handleResize);
|
||||
window.removeEventListener('orientationchange', handleResize);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return scale;
|
||||
};
|
||||
|
||||
const EditorCanvas = ({maxWidth = 350}) => {
|
||||
const scale = useResponsiveCanvas(maxWidth);
|
||||
const canvasWidth = 720;
|
||||
const canvasHeight = 1280;
|
||||
const displayWidth = canvasWidth * scale;
|
||||
const displayHeight = canvasHeight * scale;
|
||||
|
||||
const convertCoordinates = (e) => {
|
||||
const rect = e.currentTarget.getBoundingClientRect();
|
||||
return {
|
||||
x: (e.clientX - rect.left) / scale,
|
||||
y: (e.clientY - rect.top) / scale
|
||||
};
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="mx-auto p-4">
|
||||
<div
|
||||
style={{
|
||||
width: `${displayWidth}px`,
|
||||
height: `${displayHeight}px`,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
className="rounded-3xl bg-white shadow-sm origin-top-left"
|
||||
style={{
|
||||
width: `${canvasWidth}px`,
|
||||
height: `${canvasHeight}px`,
|
||||
transform: `scale(${scale})`,
|
||||
}}
|
||||
onClick={(e) => {
|
||||
const { x, y } = convertCoordinates(e);
|
||||
// Handle your canvas interactions here
|
||||
// x, y are the actual canvas coordinates (0-720, 0-1280)
|
||||
}}
|
||||
>
|
||||
{/* Your canvas content goes here */}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default EditorCanvas;
|
||||
52
resources/js/modules/editor/partials/editor-controls.tsx
Normal file
52
resources/js/modules/editor/partials/editor-controls.tsx
Normal file
@@ -0,0 +1,52 @@
|
||||
"use client"
|
||||
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { cn } from "@/lib/utils"
|
||||
import { Play, Type, Edit3, Download } from "lucide-react"
|
||||
|
||||
const EditorControls = ({ className = '', onEditClick = () => {}, isEditActive = false }) => {
|
||||
return (
|
||||
<div className={cn("flex items-center justify-center gap-2", className)}>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="w-12 h-12 rounded-full bg-white shadow-sm hover:bg-gray-50 border border-gray-100"
|
||||
>
|
||||
<Play className="h-8 w-8 " />
|
||||
</Button>
|
||||
|
||||
<div className="w-12 h-12 rounded-full bg-white shadow-sm border border-gray-100 flex items-center justify-center">
|
||||
<span className="text-md font-medium ">9:16</span>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="w-12 h-12 rounded-full bg-white shadow-sm hover:bg-gray-50 border border-gray-100"
|
||||
>
|
||||
<Type className="h-8 w-8 " />
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
id="edit"
|
||||
variant={isEditActive ? "default" : "ghost"}
|
||||
size="icon"
|
||||
className="w-12 h-12 rounded-full shadow-sm border"
|
||||
onClick={onEditClick}
|
||||
>
|
||||
<Edit3 className={`h-8 w-8 ${isEditActive ? "text-white" : ""}`} />
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="w-12 h-12 rounded-full bg-white shadow-sm hover:bg-gray-50 border border-gray-100"
|
||||
>
|
||||
<Download className="h-8 w-8 " />
|
||||
</Button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
export default EditorControls;
|
||||
26
resources/js/modules/editor/partials/editor-header.tsx
Normal file
26
resources/js/modules/editor/partials/editor-header.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { cn } from "@/lib/utils"
|
||||
import CoinIcon from "@/reusables/coin-icon"
|
||||
import { Menu, Coins } from "lucide-react"
|
||||
|
||||
const EditorHeader = (
|
||||
{className = ''}
|
||||
) => {
|
||||
return (
|
||||
<div className={cn("bg-white rounded-3xl p-4 flex items-center justify-between shadow-sm", className)}>
|
||||
<Button variant="outline" size="icon" className="rounded">
|
||||
<Menu className="h-8 w-8" />
|
||||
</Button>
|
||||
|
||||
<h1 className="text-xl font-display tracking-wide ml-3">MEMEAIGEN</h1>
|
||||
|
||||
<Button variant="outline" className="rounded-full inline-flex gap-1">
|
||||
<span className="text-sm font-semibold">100</span>
|
||||
<CoinIcon className="w-8 h-8" />
|
||||
</Button>
|
||||
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default EditorHeader;
|
||||
11
resources/js/pages/home/home.tsx
Normal file
11
resources/js/pages/home/home.tsx
Normal file
@@ -0,0 +1,11 @@
|
||||
import Editor from "@/modules/editor/editor";
|
||||
|
||||
const Home = () => {
|
||||
return (
|
||||
<div class="bg-neutral-50 h-screen">
|
||||
<Editor />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Home;
|
||||
@@ -8,7 +8,7 @@ export default function Welcome() {
|
||||
<>
|
||||
<Head title="Welcome">
|
||||
<link rel="preconnect" href="https://fonts.bunny.net" />
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
|
||||
<link href="https://fonts.bunny.net/css?family=bungee:400|lato:300,400,700" rel="stylesheet" />
|
||||
</Head>
|
||||
<div className="flex min-h-screen flex-col items-center bg-[#FDFDFC] p-6 text-[#1b1b18] lg:justify-center lg:p-8 dark:bg-[#0a0a0a]">
|
||||
<header className="mb-6 w-full max-w-[335px] text-sm not-has-[nav]:hidden lg:max-w-4xl">
|
||||
|
||||
27
resources/js/reusables/coin-icon.tsx
Normal file
27
resources/js/reusables/coin-icon.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
import React from 'react';
|
||||
|
||||
interface CoinIconProps {
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const CoinIcon: React.FC<CoinIconProps> = ({ className }) => {
|
||||
return (
|
||||
<svg className={className} width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_23_2)">
|
||||
<path d="M100 200C44.8582 200 0 155.139 0 100C0 44.8605 44.8582 0 100 0C155.142 0 200 44.8605 200 100C200 155.139 155.142 200 100 200Z" fill="#FFE14D"/>
|
||||
<path d="M200 100C200 44.8605 155.142 0 100 0V200C155.142 200 200 155.139 200 100Z" fill="#FFCC33"/>
|
||||
<path d="M100 13.0435C52.0509 13.0435 13.0435 52.0533 13.0435 100C13.0435 147.947 52.0509 186.957 100 186.957C147.949 186.957 186.957 147.947 186.957 100C186.957 52.0533 147.949 13.0435 100 13.0435ZM100 173.913C59.2435 173.913 26.0872 140.756 26.0872 100C26.0872 59.2439 59.2435 26.0872 100 26.0872C140.757 26.0872 173.913 59.2435 173.913 100C173.913 140.757 140.757 173.913 100 173.913Z" fill="#FF9F19"/>
|
||||
<path d="M173.913 100C173.913 140.757 140.756 173.913 100 173.913V186.956C147.949 186.956 186.957 147.947 186.957 99.9997C186.957 52.0525 147.949 13.0435 100 13.0435V26.0868C140.757 26.0872 173.913 59.2435 173.913 100Z" fill="#F28618"/>
|
||||
<path d="M81.8546 60.7827C83.0432 60.7827 84.0092 61.037 84.7521 61.5454C85.5691 62.0537 86.3121 62.8885 86.9806 64.0503L97.0099 81.8071C97.3813 82.4607 97.6786 82.9336 97.9015 83.2241C98.1986 83.5143 98.5702 83.6596 99.0157 83.6596H99.5167V112.31H97.0099C95.5984 112.31 94.4092 112.056 93.4435 111.547C92.5522 110.966 91.7722 110.058 91.1036 108.824L84.5294 96.9497V135.296C84.5293 136.676 84.195 137.693 83.5265 138.346C82.9322 138.927 81.9292 139.217 80.5177 139.217H63.9142C62.5029 139.217 61.4626 138.927 60.7941 138.346C60.2 137.693 59.9035 136.676 59.9034 135.296V64.7046C59.9034 63.3249 60.2 62.3442 60.7941 61.7632C61.4626 61.1096 62.5029 60.7827 63.9142 60.7827H81.8546Z" fill="#FF9F19"/>
|
||||
<path d="M135.119 60.7827C136.53 60.7827 137.533 61.1096 138.127 61.7632C138.796 62.3442 139.13 63.3247 139.13 64.7046V135.296C139.13 136.676 138.796 137.693 138.127 138.346C137.533 138.927 136.53 139.217 135.119 139.217H117.958C116.547 139.217 115.507 138.927 114.838 138.346C114.244 137.693 113.947 136.676 113.947 135.296V96.9497L107.372 108.824C106.704 110.058 105.887 110.966 104.921 111.547C104.03 112.056 102.878 112.31 101.467 112.31H99.517V83.6596H100.018C100.463 83.6596 100.798 83.5143 101.021 83.2241C101.318 82.9336 101.652 82.4607 102.024 81.8071L111.942 64.0503C112.61 62.8885 113.316 62.0537 114.059 61.5454C114.876 61.0371 115.878 60.7827 117.067 60.7827H135.119Z" fill="#F28618"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_23_2">
|
||||
<rect width="200" height="200" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export default CoinIcon;
|
||||
@@ -1,4 +1,4 @@
|
||||
const Ziggy = {"url":"https:\/\/video2.ai","port":null,"defaults":{},"routes":{"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"]},"render.start":{"uri":"api\/render","methods":["POST"]},"render.all":{"uri":"api\/render\/all","methods":["GET","HEAD"]},"render.status":{"uri":"api\/render\/{uuid}","methods":["GET","HEAD"],"parameters":["uuid"]},"render.elements.get":{"uri":"api\/render\/{uuid}\/elements","methods":["GET","HEAD"],"parameters":["uuid"]},"dashboard":{"uri":"dashboard","methods":["GET","HEAD"]},"admin.dashboard":{"uri":"admin","methods":["GET","HEAD"]},"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"]},"storage.local":{"uri":"storage\/{path}","methods":["GET","HEAD"],"wheres":{"path":".*"},"parameters":["path"]}}};
|
||||
const Ziggy = {"url":"https:\/\/memeaigen.test","port":null,"defaults":{},"routes":{"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"]},"render.start":{"uri":"api\/render","methods":["POST"]},"render.all":{"uri":"api\/render\/all","methods":["GET","HEAD"]},"render.status":{"uri":"api\/render\/{uuid}","methods":["GET","HEAD"],"parameters":["uuid"]},"render.elements.get":{"uri":"api\/render\/{uuid}\/elements","methods":["GET","HEAD"],"parameters":["uuid"]},"dashboard":{"uri":"dashboard","methods":["GET","HEAD"]},"admin.dashboard":{"uri":"admin","methods":["GET","HEAD"]},"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"]},"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);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
{!! JsonLd::generate() !!}
|
||||
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
|
||||
<link href="https://fonts.bunny.net/css?family=bungee:400|instrument-sans:300,400,700" rel="stylesheet" />
|
||||
|
||||
@routes
|
||||
@viteReactRefresh
|
||||
|
||||
Reference in New Issue
Block a user