latest changes
Some checks failed
CI / build-and-test (pull_request) Has been cancelled

This commit is contained in:
Nicholai 2025-09-25 23:53:54 -06:00
parent f65f422e6d
commit cb7a555118
101 changed files with 1333 additions and 955 deletions

4
.gitignore vendored
View File

@ -47,3 +47,7 @@ backups/
# wrangler local state (do not commit)
.wrangler/
#opennext build files
.open next/
.open-next/

View File

@ -155,7 +155,7 @@ var DOQueueHandler = class extends DurableObject {
method: "HEAD",
headers: {
// This is defined during build
"x-prerender-revalidate": "c4f8845619b474cd3d0278b65080ab05",
"x-prerender-revalidate": "310f934069f902b9bb16d5ab83f7b6b0",
"x-isr": "1"
},
// This one is kind of problematic, it will always show the wall time of the revalidation to `this.revalidationTimeout`
@ -179,7 +179,7 @@ var DOQueueHandler = class extends DurableObject {
"INSERT OR REPLACE INTO sync (id, lastSuccess, buildId) VALUES (?, unixepoch(), ?)",
// We cannot use the deduplication id because it's not unique per route - every time a route is revalidated, the deduplication id is different.
`${host}${url}`,
"q6gi1eLrEh_MMJiOSVY5n"
"mp7CiDBjP_qLYoje6vOl-"
);
}
this.routeInFailedState.delete(msg.MessageDeduplicationId);
@ -231,7 +231,7 @@ var DOQueueHandler = class extends DurableObject {
}
this.routeInFailedState.set(msg.MessageDeduplicationId, updatedFailedState);
if (!this.disableSQLite) {
this.sql.exec("INSERT OR REPLACE INTO failed_state (id, data, buildId) VALUES (?, ?, ?)", msg.MessageDeduplicationId, JSON.stringify(updatedFailedState), "q6gi1eLrEh_MMJiOSVY5n");
this.sql.exec("INSERT OR REPLACE INTO failed_state (id, data, buildId) VALUES (?, ?, ?)", msg.MessageDeduplicationId, JSON.stringify(updatedFailedState), "mp7CiDBjP_qLYoje6vOl-");
}
await this.addAlarm();
}
@ -255,8 +255,8 @@ var DOQueueHandler = class extends DurableObject {
return;
this.sql.exec("CREATE TABLE IF NOT EXISTS failed_state (id TEXT PRIMARY KEY, data TEXT, buildId TEXT)");
this.sql.exec("CREATE TABLE IF NOT EXISTS sync (id TEXT PRIMARY KEY, lastSuccess INTEGER, buildId TEXT)");
this.sql.exec("DELETE FROM failed_state WHERE buildId != ?", "q6gi1eLrEh_MMJiOSVY5n");
this.sql.exec("DELETE FROM sync WHERE buildId != ?", "q6gi1eLrEh_MMJiOSVY5n");
this.sql.exec("DELETE FROM failed_state WHERE buildId != ?", "mp7CiDBjP_qLYoje6vOl-");
this.sql.exec("DELETE FROM sync WHERE buildId != ?", "mp7CiDBjP_qLYoje6vOl-");
const failedStateCursor = this.sql.exec("SELECT * FROM failed_state");
for (const row of failedStateCursor) {
this.routeInFailedState.set(row.id, JSON.parse(row.data));

View File

@ -1 +1 @@
q6gi1eLrEh_MMJiOSVY5n
mp7CiDBjP_qLYoje6vOl-

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7409,9034,5293,68,9509,5401,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9034,7409,5293,68,9509,5401,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5293,7409,9034,68,9509,5401,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[68,7409,9034,5293,9509,5401,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9509,7409,9034,5293,68,5401,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5401,7409,9034,5293,68,9509,7905,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7905,7409,9034,5293,68,9509,5401,1388,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1388,7409,9034,5293,68,9509,5401,7905,1418],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1418,7409,9034,5293,68,9509,5401,7905,1388],{63521:function(){}},function(n){n.O(0,[2971,2117,1744],function(){return n(n.s=63521)}),_N_E=n.O()}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-cf5ca766ac8f493f.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

View File

@ -1 +0,0 @@
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()

View File

@ -1 +0,0 @@
{"type":"app","html":"<!DOCTYPE html><html><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width\"/><title>500: Internal Server Error</title><meta name=\"next-head-count\" content=\"3\"/><noscript data-n-css=\"\"></noscript><script defer=\"\" nomodule=\"\" src=\"/_next/static/chunks/polyfills-42372ed130431b0a.js\"></script><script src=\"/_next/static/chunks/webpack-757604220b96f05e.js\" defer=\"\"></script><script src=\"/_next/static/chunks/framework-8e0e0f4a6b83a956.js\" defer=\"\"></script><script src=\"/_next/static/chunks/main-c7b74b84e134a397.js\" defer=\"\"></script><script src=\"/_next/static/chunks/pages/_app-3c9ca398d360b709.js\" defer=\"\"></script><script src=\"/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js\" defer=\"\"></script><script src=\"/_next/static/q6gi1eLrEh_MMJiOSVY5n/_buildManifest.js\" defer=\"\"></script><script src=\"/_next/static/q6gi1eLrEh_MMJiOSVY5n/_ssgManifest.js\" defer=\"\"></script></head><body><div id=\"__next\"><div style=\"font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center\"><div style=\"line-height:48px\"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class=\"next-error-h1\" style=\"display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top\">500</h1><div style=\"display:inline-block\"><h2 style=\"font-size:14px;font-weight:400;line-height:28px\">Internal Server Error<!-- -->.</h2></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"statusCode\":500}},\"page\":\"/_error\",\"query\":{},\"buildId\":\"q6gi1eLrEh_MMJiOSVY5n\",\"nextExport\":true,\"isFallback\":false,\"gip\":true,\"scriptLoader\":[]}</script></body></html>"}

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
CREATE TABLE IF NOT EXISTS tags (tag TEXT NOT NULL, path TEXT NOT NULL, UNIQUE(tag, path) ON CONFLICT REPLACE);
CREATE TABLE IF NOT EXISTS revalidations (tag TEXT NOT NULL, revalidatedAt INTEGER NOT NULL, UNIQUE(tag) ON CONFLICT REPLACE);
INSERT INTO tags (tag, path) VALUES ("q6gi1eLrEh_MMJiOSVY5n/_N_T_/layout", "q6gi1eLrEh_MMJiOSVY5n/favicon.ico"), ("q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico/layout", "q6gi1eLrEh_MMJiOSVY5n/favicon.ico"), ("q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico/route", "q6gi1eLrEh_MMJiOSVY5n/favicon.ico"), ("q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico", "q6gi1eLrEh_MMJiOSVY5n/favicon.ico");
INSERT INTO tags (tag, path) VALUES ("mp7CiDBjP_qLYoje6vOl-/_N_T_/layout", "mp7CiDBjP_qLYoje6vOl-/favicon.ico"), ("mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico/layout", "mp7CiDBjP_qLYoje6vOl-/favicon.ico"), ("mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico/route", "mp7CiDBjP_qLYoje6vOl-/favicon.ico"), ("mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico", "mp7CiDBjP_qLYoje6vOl-/favicon.ico");

View File

@ -49,7 +49,7 @@ function initRuntime() {
};
Object.assign(globalThis, {
Request: CustomRequest,
__BUILD_TIMESTAMP_MS__: 1758366974790,
__BUILD_TIMESTAMP_MS__: 1758670418686,
__NEXT_BASE_PATH__: "",
__ASSETS_RUN_WORKER_FIRST__: false,
__TRAILING_SLASH__: false,

View File

@ -1 +1 @@
[{"tag":{"S":"q6gi1eLrEh_MMJiOSVY5n/_N_T_/layout"},"path":{"S":"q6gi1eLrEh_MMJiOSVY5n/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico/layout"},"path":{"S":"q6gi1eLrEh_MMJiOSVY5n/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico/route"},"path":{"S":"q6gi1eLrEh_MMJiOSVY5n/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"q6gi1eLrEh_MMJiOSVY5n/_N_T_/favicon.ico"},"path":{"S":"q6gi1eLrEh_MMJiOSVY5n/favicon.ico"},"revalidatedAt":{"N":"1"}}]
[{"tag":{"S":"mp7CiDBjP_qLYoje6vOl-/_N_T_/layout"},"path":{"S":"mp7CiDBjP_qLYoje6vOl-/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico/layout"},"path":{"S":"mp7CiDBjP_qLYoje6vOl-/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico/route"},"path":{"S":"mp7CiDBjP_qLYoje6vOl-/favicon.ico"},"revalidatedAt":{"N":"1"}},{"tag":{"S":"mp7CiDBjP_qLYoje6vOl-/_N_T_/favicon.ico"},"path":{"S":"mp7CiDBjP_qLYoje6vOl-/favicon.ico"},"revalidatedAt":{"N":"1"}}]

View File

@ -5255,13 +5255,13 @@ var NEXT_DIR = path.join(__dirname, ".next");
var OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
debug({ NEXT_DIR, OPEN_NEXT_DIR });
var NextConfig = { "env": {}, "webpack": null, "eslint": { "ignoreDuringBuilds": true }, "typescript": { "ignoreBuildErrors": true, "tsconfigPath": "tsconfig.json" }, "distDir": ".next", "cleanDistDir": true, "assetPrefix": "", "cacheMaxMemorySize": 52428800, "configOrigin": "next.config.mjs", "useFileSystemPublicRoutes": true, "generateEtags": true, "pageExtensions": ["tsx", "ts", "jsx", "js"], "poweredByHeader": true, "compress": true, "analyticsId": "", "images": { "deviceSizes": [640, 750, 828, 1080, 1200, 1920, 2048, 3840], "imageSizes": [16, 32, 48, 64, 96, 128, 256, 384], "path": "/_next/image", "loader": "default", "loaderFile": "", "domains": [], "disableStaticImages": false, "minimumCacheTTL": 60, "formats": ["image/webp"], "dangerouslyAllowSVG": false, "contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;", "contentDispositionType": "inline", "remotePatterns": [], "unoptimized": true }, "devIndicators": { "buildActivity": true, "buildActivityPosition": "bottom-right" }, "onDemandEntries": { "maxInactiveAge": 6e4, "pagesBufferLength": 5 }, "amp": { "canonicalBase": "" }, "basePath": "", "sassOptions": {}, "trailingSlash": false, "i18n": null, "productionBrowserSourceMaps": false, "optimizeFonts": true, "excludeDefaultMomentLocales": true, "serverRuntimeConfig": {}, "publicRuntimeConfig": {}, "reactProductionProfiling": false, "reactStrictMode": null, "httpAgentOptions": { "keepAlive": true }, "outputFileTracing": true, "staticPageGenerationTimeout": 60, "swcMinify": true, "output": "standalone", "modularizeImports": { "@mui/icons-material": { "transform": "@mui/icons-material/{{member}}" }, "lodash": { "transform": "lodash/{{member}}" } }, "experimental": { "multiZoneDraftMode": false, "prerenderEarlyExit": false, "serverMinification": true, "serverSourceMaps": false, "linkNoTouchStart": false, "caseSensitiveRoutes": false, "clientRouterFilter": true, "clientRouterFilterRedirects": false, "fetchCacheKeyPrefix": "", "middlewarePrefetch": "flexible", "optimisticClientCache": true, "manualClientBasePath": false, "cpus": 11, "memoryBasedWorkersCount": false, "isrFlushToDisk": true, "workerThreads": false, "optimizeCss": false, "nextScriptWorkers": false, "scrollRestoration": false, "externalDir": false, "disableOptimizedLoading": false, "gzipSize": true, "craCompat": false, "esmExternals": true, "fullySpecified": false, "outputFileTracingRoot": "/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo", "swcTraceProfiling": false, "forceSwcTransforms": false, "largePageDataBytes": 128e3, "adjustFontFallbacks": false, "adjustFontFallbacksWithSizeAdjust": false, "typedRoutes": false, "instrumentationHook": false, "bundlePagesExternals": false, "parallelServerCompiles": false, "parallelServerBuildTraces": false, "ppr": false, "missingSuspenseWithCSRBailout": true, "optimizeServerReact": true, "useEarlyImport": false, "staleTimes": { "dynamic": 30, "static": 300 }, "optimizePackageImports": ["lucide-react", "date-fns", "lodash-es", "ramda", "antd", "react-bootstrap", "ahooks", "@ant-design/icons", "@headlessui/react", "@headlessui-float/react", "@heroicons/react/20/solid", "@heroicons/react/24/solid", "@heroicons/react/24/outline", "@visx/visx", "@tremor/react", "rxjs", "@mui/material", "@mui/icons-material", "recharts", "react-use", "@material-ui/core", "@material-ui/icons", "@tabler/icons-react", "mui-core", "react-icons/ai", "react-icons/bi", "react-icons/bs", "react-icons/cg", "react-icons/ci", "react-icons/di", "react-icons/fa", "react-icons/fa6", "react-icons/fc", "react-icons/fi", "react-icons/gi", "react-icons/go", "react-icons/gr", "react-icons/hi", "react-icons/hi2", "react-icons/im", "react-icons/io", "react-icons/io5", "react-icons/lia", "react-icons/lib", "react-icons/lu", "react-icons/md", "react-icons/pi", "react-icons/ri", "react-icons/rx", "react-icons/si", "react-icons/sl", "react-icons/tb", "react-icons/tfi", "react-icons/ti", "react-icons/vsc", "react-icons/wi"], "trustHostHeader": false, "isExperimentalCompile": false }, "configFileName": "next.config.mjs" };
var BuildId = "q6gi1eLrEh_MMJiOSVY5n";
var BuildId = "mp7CiDBjP_qLYoje6vOl-";
var RoutesManifest = { "basePath": "", "rewrites": { "beforeFiles": [], "afterFiles": [], "fallback": [] }, "redirects": [{ "source": "/:path+/", "destination": "/:path+", "internal": true, "statusCode": 308, "regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$" }], "routes": { "static": [{ "page": "/", "regex": "^/(?:/)?$", "routeKeys": {}, "namedRegex": "^/(?:/)?$" }, { "page": "/_not-found", "regex": "^/_not\\-found(?:/)?$", "routeKeys": {}, "namedRegex": "^/_not\\-found(?:/)?$" }, { "page": "/admin", "regex": "^/admin(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin(?:/)?$" }, { "page": "/admin/analytics", "regex": "^/admin/analytics(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/analytics(?:/)?$" }, { "page": "/admin/artists", "regex": "^/admin/artists(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/artists(?:/)?$" }, { "page": "/admin/artists/new", "regex": "^/admin/artists/new(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/artists/new(?:/)?$" }, { "page": "/admin/calendar", "regex": "^/admin/calendar(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/calendar(?:/)?$" }, { "page": "/admin/portfolio", "regex": "^/admin/portfolio(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/portfolio(?:/)?$" }, { "page": "/admin/settings", "regex": "^/admin/settings(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/settings(?:/)?$" }, { "page": "/admin/uploads", "regex": "^/admin/uploads(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/uploads(?:/)?$" }, { "page": "/aftercare", "regex": "^/aftercare(?:/)?$", "routeKeys": {}, "namedRegex": "^/aftercare(?:/)?$" }, { "page": "/artists", "regex": "^/artists(?:/)?$", "routeKeys": {}, "namedRegex": "^/artists(?:/)?$" }, { "page": "/auth/error", "regex": "^/auth/error(?:/)?$", "routeKeys": {}, "namedRegex": "^/auth/error(?:/)?$" }, { "page": "/auth/signin", "regex": "^/auth/signin(?:/)?$", "routeKeys": {}, "namedRegex": "^/auth/signin(?:/)?$" }, { "page": "/book", "regex": "^/book(?:/)?$", "routeKeys": {}, "namedRegex": "^/book(?:/)?$" }, { "page": "/contact", "regex": "^/contact(?:/)?$", "routeKeys": {}, "namedRegex": "^/contact(?:/)?$" }, { "page": "/deposit", "regex": "^/deposit(?:/)?$", "routeKeys": {}, "namedRegex": "^/deposit(?:/)?$" }, { "page": "/favicon.ico", "regex": "^/favicon\\.ico(?:/)?$", "routeKeys": {}, "namedRegex": "^/favicon\\.ico(?:/)?$" }, { "page": "/gift-cards", "regex": "^/gift\\-cards(?:/)?$", "routeKeys": {}, "namedRegex": "^/gift\\-cards(?:/)?$" }, { "page": "/privacy", "regex": "^/privacy(?:/)?$", "routeKeys": {}, "namedRegex": "^/privacy(?:/)?$" }, { "page": "/specials", "regex": "^/specials(?:/)?$", "routeKeys": {}, "namedRegex": "^/specials(?:/)?$" }, { "page": "/terms", "regex": "^/terms(?:/)?$", "routeKeys": {}, "namedRegex": "^/terms(?:/)?$" }], "dynamic": [{ "page": "/admin/artists/[id]", "regex": "^/admin/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/admin/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/api/artists/[id]", "regex": "^/api/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/api/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/api/auth/[...nextauth]", "regex": "^/api/auth/(.+?)(?:/)?$", "routeKeys": { "nxtPnextauth": "nxtPnextauth" }, "namedRegex": "^/api/auth/(?<nxtPnextauth>.+?)(?:/)?$" }, { "page": "/api/portfolio/[id]", "regex": "^/api/portfolio/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/api/portfolio/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/artists/[id]", "regex": "^/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/artists/[id]/book", "regex": "^/artists/([^/]+?)/book(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/artists/(?<nxtPid>[^/]+?)/book(?:/)?$" }], "data": { "static": [], "dynamic": [] } }, "locales": [] };
var ConfigHeaders = [];
var PrerenderManifest = { "version": 4, "routes": { "/favicon.ico": { "initialHeaders": { "cache-control": "public, max-age=0, must-revalidate", "content-type": "image/x-icon", "x-next-cache-tags": "_N_T_/layout,_N_T_/favicon.ico/layout,_N_T_/favicon.ico/route,_N_T_/favicon.ico" }, "experimentalBypassFor": [{ "type": "header", "key": "Next-Action" }, { "type": "header", "key": "content-type", "value": "multipart/form-data;.*" }], "initialRevalidateSeconds": false, "srcRoute": "/favicon.ico", "dataRoute": null } }, "dynamicRoutes": {}, "notFoundRoutes": [], "preview": { "previewModeId": "c4f8845619b474cd3d0278b65080ab05", "previewModeSigningKey": "3ec05eeae0c5773b377eadeaba53b29343b115136ca16b096c7b61fb0277d6bc", "previewModeEncryptionKey": "442bd39997bdcf02b29556a36bff23b3e0ccf67b5bb33aa26154a5ec9e41dd81" } };
var MiddlewareManifest = { "version": 3, "middleware": { "/": { "files": ["server/edge-runtime-webpack.js", "server/middleware.js"], "name": "middleware", "page": "/", "matchers": [{ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/((?!_next\\/static|_next\\/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*))(.json)?[\\/#\\?]?$", "originalSource": "/((?!_next/static|_next/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*)" }], "wasm": [], "assets": [], "env": { "__NEXT_BUILD_ID": "q6gi1eLrEh_MMJiOSVY5n", "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "OgJGZYhOD7cITrl23alQ5+xp7tpBIg0XdNgLEazNnjA=", "__NEXT_PREVIEW_MODE_ID": "c4f8845619b474cd3d0278b65080ab05", "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "442bd39997bdcf02b29556a36bff23b3e0ccf67b5bb33aa26154a5ec9e41dd81", "__NEXT_PREVIEW_MODE_SIGNING_KEY": "3ec05eeae0c5773b377eadeaba53b29343b115136ca16b096c7b61fb0277d6bc" } } }, "functions": {}, "sortedMiddleware": ["/"] };
var AppPathRoutesManifest = { "/_not-found/page": "/_not-found", "/aftercare/page": "/aftercare", "/api/admin/migrate/route": "/api/admin/migrate", "/api/artists/[id]/route": "/api/artists/[id]", "/api/auth/[...nextauth]/route": "/api/auth/[...nextauth]", "/artists/[id]/book/page": "/artists/[id]/book", "/artists/[id]/page": "/artists/[id]", "/artists/page": "/artists", "/auth/error/page": "/auth/error", "/auth/signin/page": "/auth/signin", "/book/page": "/book", "/deposit/page": "/deposit", "/contact/page": "/contact", "/favicon.ico/route": "/favicon.ico", "/gift-cards/page": "/gift-cards", "/page": "/", "/privacy/page": "/privacy", "/specials/page": "/specials", "/terms/page": "/terms", "/api/admin/stats/route": "/api/admin/stats", "/api/files/bulk-delete/route": "/api/files/bulk-delete", "/api/artists/route": "/api/artists", "/api/files/folder/route": "/api/files/folder", "/api/files/route": "/api/files", "/api/portfolio/bulk-delete/route": "/api/portfolio/bulk-delete", "/api/files/stats/route": "/api/files/stats", "/api/portfolio/[id]/route": "/api/portfolio/[id]", "/api/portfolio/stats/route": "/api/portfolio/stats", "/api/portfolio/route": "/api/portfolio", "/api/appointments/route": "/api/appointments", "/api/users/route": "/api/users", "/api/settings/route": "/api/settings", "/api/upload/route": "/api/upload", "/admin/artists/[id]/page": "/admin/artists/[id]", "/admin/artists/new/page": "/admin/artists/new", "/admin/artists/page": "/admin/artists", "/admin/calendar/page": "/admin/calendar", "/admin/portfolio/page": "/admin/portfolio", "/admin/page": "/admin", "/admin/settings/page": "/admin/settings", "/admin/uploads/page": "/admin/uploads", "/admin/analytics/page": "/admin/analytics" };
var FunctionsConfigManifest = { "version": 1, "functions": { "/api/artists": {}, "/api/admin/stats": {}, "/api/files/folder": {}, "/api/files/bulk-delete": {}, "/api/appointments": {}, "/api/files": {}, "/api/files/stats": {}, "/api/portfolio/bulk-delete": {}, "/api/portfolio/stats": {}, "/api/portfolio/[id]": {}, "/api/settings": {}, "/api/upload": {}, "/api/users": {}, "/admin/analytics": {}, "/api/portfolio": {}, "/admin/portfolio": {}, "/admin/settings": {}, "/admin/uploads": {} } };
var PrerenderManifest = { "version": 4, "routes": { "/favicon.ico": { "initialHeaders": { "cache-control": "public, max-age=0, must-revalidate", "content-type": "image/x-icon", "x-next-cache-tags": "_N_T_/layout,_N_T_/favicon.ico/layout,_N_T_/favicon.ico/route,_N_T_/favicon.ico" }, "experimentalBypassFor": [{ "type": "header", "key": "Next-Action" }, { "type": "header", "key": "content-type", "value": "multipart/form-data;.*" }], "initialRevalidateSeconds": false, "srcRoute": "/favicon.ico", "dataRoute": null } }, "dynamicRoutes": {}, "notFoundRoutes": [], "preview": { "previewModeId": "310f934069f902b9bb16d5ab83f7b6b0", "previewModeSigningKey": "57b9e146214c42f8a38e523741d4c980342595bb0d4152cc2803c30b925c731b", "previewModeEncryptionKey": "9081fdaddfa5ee3709d6c8e1d84c118cfde83b9f3790ee25612f5841c0fef8b3" } };
var MiddlewareManifest = { "version": 3, "middleware": { "/": { "files": ["server/edge-runtime-webpack.js", "server/middleware.js"], "name": "middleware", "page": "/", "matchers": [{ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/((?!_next\\/static|_next\\/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*))(.json)?[\\/#\\?]?$", "originalSource": "/((?!_next/static|_next/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*)" }], "wasm": [], "assets": [], "env": { "__NEXT_BUILD_ID": "mp7CiDBjP_qLYoje6vOl-", "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "L/KM3Bj40v7FIHHuMD5DP5IDnNZcDqrB+Mxf6oMYubo=", "__NEXT_PREVIEW_MODE_ID": "310f934069f902b9bb16d5ab83f7b6b0", "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "9081fdaddfa5ee3709d6c8e1d84c118cfde83b9f3790ee25612f5841c0fef8b3", "__NEXT_PREVIEW_MODE_SIGNING_KEY": "57b9e146214c42f8a38e523741d4c980342595bb0d4152cc2803c30b925c731b" } } }, "functions": {}, "sortedMiddleware": ["/"] };
var AppPathRoutesManifest = { "/_not-found/page": "/_not-found", "/aftercare/page": "/aftercare", "/api/admin/migrate/route": "/api/admin/migrate", "/api/artists/[id]/route": "/api/artists/[id]", "/api/auth/[...nextauth]/route": "/api/auth/[...nextauth]", "/artists/[id]/book/page": "/artists/[id]/book", "/artists/[id]/page": "/artists/[id]", "/artists/page": "/artists", "/auth/signin/page": "/auth/signin", "/contact/page": "/contact", "/deposit/page": "/deposit", "/book/page": "/book", "/auth/error/page": "/auth/error", "/favicon.ico/route": "/favicon.ico", "/gift-cards/page": "/gift-cards", "/page": "/", "/terms/page": "/terms", "/specials/page": "/specials", "/privacy/page": "/privacy", "/api/files/folder/route": "/api/files/folder", "/api/admin/stats/route": "/api/admin/stats", "/api/files/bulk-delete/route": "/api/files/bulk-delete", "/api/artists/route": "/api/artists", "/api/files/stats/route": "/api/files/stats", "/api/files/route": "/api/files", "/api/portfolio/bulk-delete/route": "/api/portfolio/bulk-delete", "/api/portfolio/stats/route": "/api/portfolio/stats", "/api/portfolio/[id]/route": "/api/portfolio/[id]", "/api/appointments/route": "/api/appointments", "/api/portfolio/route": "/api/portfolio", "/api/settings/route": "/api/settings", "/api/upload/route": "/api/upload", "/api/users/route": "/api/users", "/admin/artists/[id]/page": "/admin/artists/[id]", "/admin/artists/new/page": "/admin/artists/new", "/admin/page": "/admin", "/admin/artists/page": "/admin/artists", "/admin/calendar/page": "/admin/calendar", "/admin/portfolio/page": "/admin/portfolio", "/admin/uploads/page": "/admin/uploads", "/admin/settings/page": "/admin/settings", "/admin/analytics/page": "/admin/analytics" };
var FunctionsConfigManifest = { "version": 1, "functions": { "/api/files/bulk-delete": {}, "/api/admin/stats": {}, "/api/artists": {}, "/api/files/folder": {}, "/api/files": {}, "/api/files/stats": {}, "/api/appointments": {}, "/api/portfolio/bulk-delete": {}, "/api/portfolio/[id]": {}, "/api/portfolio/stats": {}, "/api/portfolio": {}, "/api/upload": {}, "/api/settings": {}, "/api/users": {}, "/admin/analytics": {}, "/admin/portfolio": {}, "/admin/settings": {}, "/admin/uploads": {} } };
var PagesManifest = { "/_app": "pages/_app.js", "/_error": "pages/_error.js", "/_document": "pages/_document.js" };
process.env.NEXT_BUILD_ID = BuildId;

View File

@ -1 +1 @@
q6gi1eLrEh_MMJiOSVY5n
mp7CiDBjP_qLYoje6vOl-

View File

@ -12,19 +12,19 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/_not-found/page-2564a9793833e243.js"
"static/chunks/app/_not-found/page-9954ee48ea99dbba.js"
],
"/layout": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/css/7d4d4b7695840c2e.css",
"static/css/db723c4cce15634c.css",
"static/css/273d08c2abf40b5c.css",
"static/chunks/605-b40754e541fd4ec3.js",
"static/chunks/9763-93fc3f5b8786b2e4.js",
"static/chunks/1432-24fb8d3b5dc2aceb.js",
"static/chunks/app/layout-dbddb027920a5993.js"
"static/chunks/app/layout-7e2d61e3de8fcbdc.js"
],
"/error": [
"static/chunks/webpack-757604220b96f05e.js",
@ -57,7 +57,7 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/aftercare/loading-ce031141d0fba2db.js"
"static/chunks/app/aftercare/loading-70cf0ef74d3a3c3e.js"
],
"/artists/[id]/book/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -87,7 +87,7 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/artists/[id]/book/loading-935107cacc102a2a.js"
"static/chunks/app/artists/[id]/book/loading-3c8343b6f3fa981a.js"
],
"/artists/[id]/error": [
"static/chunks/webpack-757604220b96f05e.js",
@ -102,7 +102,7 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/artists/[id]/loading-a2fb175fabb5fa16.js"
"static/chunks/app/artists/[id]/loading-bf93a88a791f5454.js"
],
"/artists/error": [
"static/chunks/webpack-757604220b96f05e.js",
@ -117,7 +117,7 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/artists/loading-d293bff8cccee2c6.js"
"static/chunks/app/artists/loading-53d544eb277e731d.js"
],
"/artists/[id]/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -126,8 +126,9 @@
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/7352-8d42b132cc3c0fc3.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/artists/[id]/page-8e5152156448ad2d.js"
"static/chunks/app/artists/[id]/page-004079df5ec2c3ad.js"
],
"/artists/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -139,15 +140,6 @@
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/artists/page-d4881e8d6b8f4a9c.js"
],
"/auth/error/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/app/auth/error/page-2691b46829d28d44.js"
],
"/auth/signin/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
@ -157,6 +149,45 @@
"static/chunks/605-b40754e541fd4ec3.js",
"static/chunks/app/auth/signin/page-e3daf59216da3775.js"
],
"/contact/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5922-88993df301b0fe6c.js",
"static/chunks/1289-568be99e69c7b758.js",
"static/chunks/4975-e65c083bb486f7b9.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/contact/page-b12428131a2b7253.js"
],
"/deposit/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/200-c5238abf2da840bb.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/deposit/page-513c4bde87ea3aa9.js"
],
"/deposit/error": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/app/deposit/error-5e00284fd622b047.js"
],
"/deposit/loading": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/deposit/loading-e144aad8ad5eae23.js"
],
"/book/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
@ -185,46 +216,16 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/book/loading-3b0651f0558fc773.js"
"static/chunks/app/book/loading-4f380ac64c43b810.js"
],
"/deposit/page": [
"/auth/error/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/200-c5238abf2da840bb.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/deposit/page-513c4bde87ea3aa9.js"
],
"/deposit/error": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/app/deposit/error-5e00284fd622b047.js"
],
"/deposit/loading": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/deposit/loading-a9763cde0a954c13.js"
],
"/contact/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5922-88993df301b0fe6c.js",
"static/chunks/1289-568be99e69c7b758.js",
"static/chunks/4975-e65c083bb486f7b9.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/contact/page-b12428131a2b7253.js"
"static/chunks/app/auth/error/page-2691b46829d28d44.js"
],
"/gift-cards/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -245,42 +246,7 @@
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/2537-4759df9497ac43ae.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/page-64e67b8128e9c8fe.js"
],
"/privacy/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/privacy/page-b243a5f2eb77cdb2.js"
],
"/privacy/error": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/app/privacy/error-d028fa76ceed12e1.js"
],
"/privacy/loading": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/privacy/loading-d1d6ec4ebb33573e.js"
],
"/specials/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/specials/page-f784ee21b571b3ca.js"
"static/chunks/app/page-a8ab51401da0ca88.js"
],
"/terms/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -305,7 +271,42 @@
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/terms/loading-26938e980c1b83ed.js"
"static/chunks/app/terms/loading-f2c950ad482fe1cb.js"
],
"/specials/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/specials/page-f784ee21b571b3ca.js"
],
"/privacy/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/5360-8a18cb235c9d43e4.js",
"static/chunks/app/privacy/page-b243a5f2eb77cdb2.js"
],
"/privacy/error": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/app/privacy/error-d028fa76ceed12e1.js"
],
"/privacy/loading": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/app/privacy/loading-5539d44d1644d2b6.js"
],
"/admin/artists/[id]/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -337,6 +338,18 @@
"static/chunks/9504-7f79307d96ed82b0.js",
"static/chunks/app/admin/artists/new/page-fc95720483d0cd2a.js"
],
"/admin/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/9763-93fc3f5b8786b2e4.js",
"static/chunks/8115-89d461d0809a5185.js",
"static/chunks/1061-98c36513506f4d3b.js",
"static/chunks/app/admin/page-7a927fb8d2586a85.js"
],
"/admin/artists/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
@ -354,7 +367,7 @@
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/css/b3adf42d35f4dca6.css",
"static/chunks/e80c4f76-8e006d550c0aca9b.js",
"static/chunks/e80c4f76-90b9d8dae2f2e930.js",
"static/chunks/13b76428-e1bf383848c17260.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/5922-88993df301b0fe6c.js",
@ -363,9 +376,9 @@
"static/chunks/7053-eebdfffc5dccb92c.js",
"static/chunks/9763-93fc3f5b8786b2e4.js",
"static/chunks/9027-72d4e4b31ea4b417.js",
"static/chunks/8115-6020bebf74be4288.js",
"static/chunks/8115-89d461d0809a5185.js",
"static/chunks/1432-24fb8d3b5dc2aceb.js",
"static/chunks/4196-108bdc425dea9d4d.js",
"static/chunks/4196-c4a5b06c3fca636c.js",
"static/chunks/app/admin/calendar/page-a29ec1514cf1c1ad.js"
],
"/admin/portfolio/page": [
@ -377,22 +390,24 @@
"static/chunks/5922-88993df301b0fe6c.js",
"static/chunks/1289-568be99e69c7b758.js",
"static/chunks/4975-e65c083bb486f7b9.js",
"static/chunks/7352-8d42b132cc3c0fc3.js",
"static/chunks/9027-72d4e4b31ea4b417.js",
"static/chunks/971-8b8c5df661769882.js",
"static/chunks/3420-df9036787c9a07f7.js",
"static/chunks/6298-ed1f2b36c3535636.js",
"static/chunks/app/admin/portfolio/page-77f4075ab14cae00.js"
"static/chunks/app/admin/portfolio/page-c895a0c33856000a.js"
],
"/admin/page": [
"/admin/uploads/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/9480-f2a0d2341720dab4.js",
"static/chunks/9763-93fc3f5b8786b2e4.js",
"static/chunks/8115-6020bebf74be4288.js",
"static/chunks/1061-dd5934f48325f2fe.js",
"static/chunks/app/admin/page-7a927fb8d2586a85.js"
"static/chunks/5922-88993df301b0fe6c.js",
"static/chunks/7352-8d42b132cc3c0fc3.js",
"static/chunks/9027-72d4e4b31ea4b417.js",
"static/chunks/3420-df9036787c9a07f7.js",
"static/chunks/6298-ed1f2b36c3535636.js",
"static/chunks/app/admin/uploads/page-8ff9e247e78a6bf7.js"
],
"/admin/settings/page": [
"static/chunks/webpack-757604220b96f05e.js",
@ -408,18 +423,6 @@
"static/chunks/6298-ed1f2b36c3535636.js",
"static/chunks/app/admin/settings/page-9f0d298cdde6e0d4.js"
],
"/admin/uploads/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",
"static/chunks/2117-da904839ecb5d5f9.js",
"static/chunks/main-app-ac1aded1f8d8af62.js",
"static/chunks/6137-eaf7b6db0f76248f.js",
"static/chunks/5922-88993df301b0fe6c.js",
"static/chunks/9027-72d4e4b31ea4b417.js",
"static/chunks/971-8b8c5df661769882.js",
"static/chunks/6298-ed1f2b36c3535636.js",
"static/chunks/app/admin/uploads/page-501ab87271ff0626.js"
],
"/admin/analytics/page": [
"static/chunks/webpack-757604220b96f05e.js",
"static/chunks/fd9d1056-a2747418f8441a81.js",

View File

@ -1 +1 @@
{"/_not-found/page":"/_not-found","/aftercare/page":"/aftercare","/api/admin/migrate/route":"/api/admin/migrate","/api/artists/[id]/route":"/api/artists/[id]","/api/auth/[...nextauth]/route":"/api/auth/[...nextauth]","/artists/[id]/book/page":"/artists/[id]/book","/artists/[id]/page":"/artists/[id]","/artists/page":"/artists","/auth/error/page":"/auth/error","/auth/signin/page":"/auth/signin","/book/page":"/book","/deposit/page":"/deposit","/contact/page":"/contact","/favicon.ico/route":"/favicon.ico","/gift-cards/page":"/gift-cards","/page":"/","/privacy/page":"/privacy","/specials/page":"/specials","/terms/page":"/terms","/api/admin/stats/route":"/api/admin/stats","/api/files/bulk-delete/route":"/api/files/bulk-delete","/api/artists/route":"/api/artists","/api/files/folder/route":"/api/files/folder","/api/files/route":"/api/files","/api/portfolio/bulk-delete/route":"/api/portfolio/bulk-delete","/api/files/stats/route":"/api/files/stats","/api/portfolio/[id]/route":"/api/portfolio/[id]","/api/portfolio/stats/route":"/api/portfolio/stats","/api/portfolio/route":"/api/portfolio","/api/appointments/route":"/api/appointments","/api/users/route":"/api/users","/api/settings/route":"/api/settings","/api/upload/route":"/api/upload","/admin/artists/[id]/page":"/admin/artists/[id]","/admin/artists/new/page":"/admin/artists/new","/admin/artists/page":"/admin/artists","/admin/calendar/page":"/admin/calendar","/admin/portfolio/page":"/admin/portfolio","/admin/page":"/admin","/admin/settings/page":"/admin/settings","/admin/uploads/page":"/admin/uploads","/admin/analytics/page":"/admin/analytics"}
{"/_not-found/page":"/_not-found","/aftercare/page":"/aftercare","/api/admin/migrate/route":"/api/admin/migrate","/api/artists/[id]/route":"/api/artists/[id]","/api/auth/[...nextauth]/route":"/api/auth/[...nextauth]","/artists/[id]/book/page":"/artists/[id]/book","/artists/[id]/page":"/artists/[id]","/artists/page":"/artists","/auth/signin/page":"/auth/signin","/contact/page":"/contact","/deposit/page":"/deposit","/book/page":"/book","/auth/error/page":"/auth/error","/favicon.ico/route":"/favicon.ico","/gift-cards/page":"/gift-cards","/page":"/","/terms/page":"/terms","/specials/page":"/specials","/privacy/page":"/privacy","/api/files/folder/route":"/api/files/folder","/api/admin/stats/route":"/api/admin/stats","/api/files/bulk-delete/route":"/api/files/bulk-delete","/api/artists/route":"/api/artists","/api/files/stats/route":"/api/files/stats","/api/files/route":"/api/files","/api/portfolio/bulk-delete/route":"/api/portfolio/bulk-delete","/api/portfolio/stats/route":"/api/portfolio/stats","/api/portfolio/[id]/route":"/api/portfolio/[id]","/api/appointments/route":"/api/appointments","/api/portfolio/route":"/api/portfolio","/api/settings/route":"/api/settings","/api/upload/route":"/api/upload","/api/users/route":"/api/users","/admin/artists/[id]/page":"/admin/artists/[id]","/admin/artists/new/page":"/admin/artists/new","/admin/page":"/admin","/admin/artists/page":"/admin/artists","/admin/calendar/page":"/admin/calendar","/admin/portfolio/page":"/admin/portfolio","/admin/uploads/page":"/admin/uploads","/admin/settings/page":"/admin/settings","/admin/analytics/page":"/admin/analytics"}

View File

@ -5,8 +5,8 @@
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/q6gi1eLrEh_MMJiOSVY5n/_buildManifest.js",
"static/q6gi1eLrEh_MMJiOSVY5n/_ssgManifest.js"
"static/mp7CiDBjP_qLYoje6vOl-/_buildManifest.js",
"static/mp7CiDBjP_qLYoje6vOl-/_ssgManifest.js"
],
"rootMainFiles": [
"static/chunks/webpack-757604220b96f05e.js",

View File

@ -1 +1 @@
{"version":4,"routes":{"/favicon.ico":{"initialHeaders":{"cache-control":"public, max-age=0, must-revalidate","content-type":"image/x-icon","x-next-cache-tags":"_N_T_/layout,_N_T_/favicon.ico/layout,_N_T_/favicon.ico/route,_N_T_/favicon.ico"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/favicon.ico","dataRoute":null}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"c4f8845619b474cd3d0278b65080ab05","previewModeSigningKey":"3ec05eeae0c5773b377eadeaba53b29343b115136ca16b096c7b61fb0277d6bc","previewModeEncryptionKey":"442bd39997bdcf02b29556a36bff23b3e0ccf67b5bb33aa26154a5ec9e41dd81"}}
{"version":4,"routes":{"/favicon.ico":{"initialHeaders":{"cache-control":"public, max-age=0, must-revalidate","content-type":"image/x-icon","x-next-cache-tags":"_N_T_/layout,_N_T_/favicon.ico/layout,_N_T_/favicon.ico/route,_N_T_/favicon.ico"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/favicon.ico","dataRoute":null}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"310f934069f902b9bb16d5ab83f7b6b0","previewModeSigningKey":"57b9e146214c42f8a38e523741d4c980342595bb0d4152cc2803c30b925c731b","previewModeEncryptionKey":"9081fdaddfa5ee3709d6c8e1d84c118cfde83b9f3790ee25612f5841c0fef8b3"}}

View File

@ -7,38 +7,38 @@
"/artists/[id]/book/page": "app/artists/[id]/book/page.js",
"/artists/[id]/page": "app/artists/[id]/page.js",
"/artists/page": "app/artists/page.js",
"/auth/error/page": "app/auth/error/page.js",
"/auth/signin/page": "app/auth/signin/page.js",
"/book/page": "app/book/page.js",
"/deposit/page": "app/deposit/page.js",
"/contact/page": "app/contact/page.js",
"/deposit/page": "app/deposit/page.js",
"/book/page": "app/book/page.js",
"/auth/error/page": "app/auth/error/page.js",
"/favicon.ico/route": "app/favicon.ico/route.js",
"/gift-cards/page": "app/gift-cards/page.js",
"/page": "app/page.js",
"/privacy/page": "app/privacy/page.js",
"/specials/page": "app/specials/page.js",
"/terms/page": "app/terms/page.js",
"/specials/page": "app/specials/page.js",
"/privacy/page": "app/privacy/page.js",
"/api/files/folder/route": "app/api/files/folder/route.js",
"/api/admin/stats/route": "app/api/admin/stats/route.js",
"/api/files/bulk-delete/route": "app/api/files/bulk-delete/route.js",
"/api/artists/route": "app/api/artists/route.js",
"/api/files/folder/route": "app/api/files/folder/route.js",
"/api/files/stats/route": "app/api/files/stats/route.js",
"/api/files/route": "app/api/files/route.js",
"/api/portfolio/bulk-delete/route": "app/api/portfolio/bulk-delete/route.js",
"/api/files/stats/route": "app/api/files/stats/route.js",
"/api/portfolio/[id]/route": "app/api/portfolio/[id]/route.js",
"/api/portfolio/stats/route": "app/api/portfolio/stats/route.js",
"/api/portfolio/route": "app/api/portfolio/route.js",
"/api/portfolio/[id]/route": "app/api/portfolio/[id]/route.js",
"/api/appointments/route": "app/api/appointments/route.js",
"/api/users/route": "app/api/users/route.js",
"/api/portfolio/route": "app/api/portfolio/route.js",
"/api/settings/route": "app/api/settings/route.js",
"/api/upload/route": "app/api/upload/route.js",
"/api/users/route": "app/api/users/route.js",
"/admin/artists/[id]/page": "app/admin/artists/[id]/page.js",
"/admin/artists/new/page": "app/admin/artists/new/page.js",
"/admin/page": "app/admin/page.js",
"/admin/artists/page": "app/admin/artists/page.js",
"/admin/calendar/page": "app/admin/calendar/page.js",
"/admin/portfolio/page": "app/admin/portfolio/page.js",
"/admin/page": "app/admin/page.js",
"/admin/settings/page": "app/admin/settings/page.js",
"/admin/uploads/page": "app/admin/uploads/page.js",
"/admin/settings/page": "app/admin/settings/page.js",
"/admin/analytics/page": "app/admin/analytics/page.js"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{var t={};t.id=2139,t.ids=[2139],t.modules={72934:t=>{"use strict";t.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:t=>{"use strict";t.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:t=>{"use strict";t.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:t=>{"use strict";t.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},27790:t=>{"use strict";t.exports=require("assert")},78893:t=>{"use strict";t.exports=require("buffer")},84770:t=>{"use strict";t.exports=require("crypto")},17702:t=>{"use strict";t.exports=require("events")},32615:t=>{"use strict";t.exports=require("http")},35240:t=>{"use strict";t.exports=require("https")},55315:t=>{"use strict";t.exports=require("path")},86624:t=>{"use strict";t.exports=require("querystring")},17360:t=>{"use strict";t.exports=require("url")},21764:t=>{"use strict";t.exports=require("util")},71568:t=>{"use strict";t.exports=require("zlib")},33464:(t,e,i)=>{"use strict";i.r(e),i.d(e,{GlobalError:()=>o.a,__next_app__:()=>p,originalPathname:()=>c,pages:()=>l,routeModule:()=>m,tree:()=>u}),i(39211),i(49446),i(40656),i(40509),i(70546);var r=i(30170),s=i(45002),a=i(83876),o=i.n(a),n=i(66299),d={};for(let t in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(t)&&(d[t]=()=>n[t]);i.d(e,d);let u=["",{children:["admin",{children:["artists",{children:["[id]",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(i.bind(i,39211)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx"]}]},{}]},{}]},{layout:[()=>Promise.resolve().then(i.bind(i,49446)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/layout.tsx"],metadata:{icon:[async t=>(await Promise.resolve().then(i.bind(i,57481))).default(t)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(i.bind(i,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(i.bind(i,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(i.bind(i,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async t=>(await Promise.resolve().then(i.bind(i,57481))).default(t)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],l=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx"],c="/admin/artists/[id]/page",p={require:i,loadChunk:()=>Promise.resolve()},m=new r.AppPageRouteModule({definition:{kind:s.x.APP_PAGE,page:"/admin/artists/[id]/page",pathname:"/admin/artists/[id]",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:u}})},24350:(t,e,i)=>{Promise.resolve().then(i.bind(i,7796))},7796:(t,e,i)=>{"use strict";i.r(e),i.d(e,{default:()=>d});var r=i(97247),s=i(28964),a=i(34178),o=i(72171),n=i(10906);function d(){let t=(0,a.useParams)(),{toast:e}=(0,n.pm)(),[i,d]=(0,s.useState)(null),[u,l]=(0,s.useState)(!0),c=async()=>{try{let e=await fetch(`/api/artists/${t.id}`);if(!e.ok)throw Error("Failed to fetch artist");let i=await e.json();d(i.artist)}catch(t){console.error("Error fetching artist:",t),e({title:"Error",description:"Failed to load artist",variant:"destructive"})}finally{l(!1)}};return u?r.jsx("div",{className:"flex items-center justify-center h-64",children:r.jsx("div",{className:"text-lg",children:"Loading artist..."})}):i?(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsxs)("div",{children:[r.jsx("h1",{className:"text-3xl font-bold tracking-tight",children:"Edit Artist"}),(0,r.jsxs)("p",{className:"text-muted-foreground",children:["Update ",i.name,"'s information and portfolio"]})]}),r.jsx(o.ArtistForm,{artist:i,onSuccess:()=>{e({title:"Success",description:"Artist updated successfully"}),c()}})]}):r.jsx("div",{className:"flex items-center justify-center h-64",children:r.jsx("div",{className:"text-lg",children:"Artist not found"})})}},39211:(t,e,i)=>{"use strict";i.r(e),i.d(e,{default:()=>r});let r=(0,i(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx#default`)}};var e=require("../../../../webpack-runtime.js");e.C(t);var i=t=>e(e.s=t),r=e.X(0,[9379,8213,5590,4128,7598,9906,1113,23,1189,5593,9060],()=>i(33464));module.exports=r})();
(()=>{var t={};t.id=2139,t.ids=[2139],t.modules={72934:t=>{"use strict";t.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:t=>{"use strict";t.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:t=>{"use strict";t.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:t=>{"use strict";t.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},27790:t=>{"use strict";t.exports=require("assert")},78893:t=>{"use strict";t.exports=require("buffer")},84770:t=>{"use strict";t.exports=require("crypto")},17702:t=>{"use strict";t.exports=require("events")},32615:t=>{"use strict";t.exports=require("http")},35240:t=>{"use strict";t.exports=require("https")},55315:t=>{"use strict";t.exports=require("path")},86624:t=>{"use strict";t.exports=require("querystring")},17360:t=>{"use strict";t.exports=require("url")},21764:t=>{"use strict";t.exports=require("util")},71568:t=>{"use strict";t.exports=require("zlib")},33464:(t,e,i)=>{"use strict";i.r(e),i.d(e,{GlobalError:()=>o.a,__next_app__:()=>p,originalPathname:()=>c,pages:()=>l,routeModule:()=>m,tree:()=>u}),i(39211),i(49446),i(40656),i(40509),i(70546);var r=i(30170),s=i(45002),a=i(83876),o=i.n(a),n=i(66299),d={};for(let t in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(t)&&(d[t]=()=>n[t]);i.d(e,d);let u=["",{children:["admin",{children:["artists",{children:["[id]",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(i.bind(i,39211)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx"]}]},{}]},{}]},{layout:[()=>Promise.resolve().then(i.bind(i,49446)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/layout.tsx"],metadata:{icon:[async t=>(await Promise.resolve().then(i.bind(i,57481))).default(t)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(i.bind(i,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(i.bind(i,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(i.bind(i,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async t=>(await Promise.resolve().then(i.bind(i,57481))).default(t)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],l=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx"],c="/admin/artists/[id]/page",p={require:i,loadChunk:()=>Promise.resolve()},m=new r.AppPageRouteModule({definition:{kind:s.x.APP_PAGE,page:"/admin/artists/[id]/page",pathname:"/admin/artists/[id]",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:u}})},24350:(t,e,i)=>{Promise.resolve().then(i.bind(i,7796))},7796:(t,e,i)=>{"use strict";i.r(e),i.d(e,{default:()=>d});var r=i(97247),s=i(28964),a=i(34178),o=i(72171),n=i(10906);function d(){let t=(0,a.useParams)(),{toast:e}=(0,n.pm)(),[i,d]=(0,s.useState)(null),[u,l]=(0,s.useState)(!0),c=async()=>{try{let e=await fetch(`/api/artists/${t.id}`);if(!e.ok)throw Error("Failed to fetch artist");let i=await e.json();d(i.artist)}catch(t){console.error("Error fetching artist:",t),e({title:"Error",description:"Failed to load artist",variant:"destructive"})}finally{l(!1)}};return u?r.jsx("div",{className:"flex items-center justify-center h-64",children:r.jsx("div",{className:"text-lg",children:"Loading artist..."})}):i?(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsxs)("div",{children:[r.jsx("h1",{className:"text-3xl font-bold tracking-tight",children:"Edit Artist"}),(0,r.jsxs)("p",{className:"text-muted-foreground",children:["Update ",i.name,"'s information and portfolio"]})]}),r.jsx(o.ArtistForm,{artist:i,onSuccess:()=>{e({title:"Success",description:"Artist updated successfully"}),c()}})]}):r.jsx("div",{className:"flex items-center justify-center h-64",children:r.jsx("div",{className:"text-lg",children:"Artist not found"})})}},39211:(t,e,i)=>{"use strict";i.r(e),i.d(e,{default:()=>r});let r=(0,i(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/[id]/page.tsx#default`)}};var e=require("../../../../webpack-runtime.js");e.C(t);var i=t=>e(e.s=t),r=e.X(0,[9379,8213,1488,4128,7598,9906,1113,23,4106,5593,9060],()=>i(33464));module.exports=r})();

View File

@ -1 +1 @@
(()=>{var e={};e.id=12,e.ids=[12],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},27790:e=>{"use strict";e.exports=require("assert")},78893:e=>{"use strict";e.exports=require("buffer")},84770:e=>{"use strict";e.exports=require("crypto")},17702:e=>{"use strict";e.exports=require("events")},32615:e=>{"use strict";e.exports=require("http")},35240:e=>{"use strict";e.exports=require("https")},55315:e=>{"use strict";e.exports=require("path")},86624:e=>{"use strict";e.exports=require("querystring")},17360:e=>{"use strict";e.exports=require("url")},21764:e=>{"use strict";e.exports=require("util")},71568:e=>{"use strict";e.exports=require("zlib")},47485:(e,t,r)=>{"use strict";r.r(t),r.d(t,{GlobalError:()=>a.a,__next_app__:()=>c,originalPathname:()=>l,pages:()=>p,routeModule:()=>m,tree:()=>d}),r(88429),r(49446),r(40656),r(40509),r(70546);var i=r(30170),s=r(45002),o=r(83876),a=r.n(o),n=r(66299),u={};for(let e in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(u[e]=()=>n[e]);r.d(t,u);let d=["",{children:["admin",{children:["artists",{children:["new",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(r.bind(r,88429)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/new/page.tsx"]}]},{}]},{}]},{layout:[()=>Promise.resolve().then(r.bind(r,49446)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/layout.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(r.bind(r,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(r.bind(r,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(r.bind(r,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(r.bind(r,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(r.bind(r,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],p=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/new/page.tsx"],l="/admin/artists/new/page",c={require:r,loadChunk:()=>Promise.resolve()},m=new i.AppPageRouteModule({definition:{kind:s.x.APP_PAGE,page:"/admin/artists/new/page",pathname:"/admin/artists/new",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:d}})},99601:(e,t,r)=>{Promise.resolve().then(r.bind(r,72171))},88429:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var i=r(72051);let s=(0,r(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/components/admin/artist-form.tsx#ArtistForm`);function o(){return(0,i.jsxs)("div",{className:"space-y-6",children:[(0,i.jsxs)("div",{children:[i.jsx("h1",{className:"text-3xl font-bold tracking-tight",children:"Create New Artist"}),i.jsx("p",{className:"text-muted-foreground",children:"Add a new artist to your tattoo studio"})]}),i.jsx(s,{})]})}}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),i=t.X(0,[9379,8213,5590,4128,7598,9906,1113,23,1189,5593,9060],()=>r(47485));module.exports=i})();
(()=>{var e={};e.id=12,e.ids=[12],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},27790:e=>{"use strict";e.exports=require("assert")},78893:e=>{"use strict";e.exports=require("buffer")},84770:e=>{"use strict";e.exports=require("crypto")},17702:e=>{"use strict";e.exports=require("events")},32615:e=>{"use strict";e.exports=require("http")},35240:e=>{"use strict";e.exports=require("https")},55315:e=>{"use strict";e.exports=require("path")},86624:e=>{"use strict";e.exports=require("querystring")},17360:e=>{"use strict";e.exports=require("url")},21764:e=>{"use strict";e.exports=require("util")},71568:e=>{"use strict";e.exports=require("zlib")},47485:(e,t,r)=>{"use strict";r.r(t),r.d(t,{GlobalError:()=>a.a,__next_app__:()=>c,originalPathname:()=>l,pages:()=>p,routeModule:()=>m,tree:()=>d}),r(88429),r(49446),r(40656),r(40509),r(70546);var i=r(30170),s=r(45002),o=r(83876),a=r.n(o),n=r(66299),u={};for(let e in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(u[e]=()=>n[e]);r.d(t,u);let d=["",{children:["admin",{children:["artists",{children:["new",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(r.bind(r,88429)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/new/page.tsx"]}]},{}]},{}]},{layout:[()=>Promise.resolve().then(r.bind(r,49446)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/layout.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(r.bind(r,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(r.bind(r,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(r.bind(r,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(r.bind(r,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(r.bind(r,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],p=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/admin/artists/new/page.tsx"],l="/admin/artists/new/page",c={require:r,loadChunk:()=>Promise.resolve()},m=new i.AppPageRouteModule({definition:{kind:s.x.APP_PAGE,page:"/admin/artists/new/page",pathname:"/admin/artists/new",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:d}})},99601:(e,t,r)=>{Promise.resolve().then(r.bind(r,72171))},88429:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>o});var i=r(72051);let s=(0,r(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/components/admin/artist-form.tsx#ArtistForm`);function o(){return(0,i.jsxs)("div",{className:"space-y-6",children:[(0,i.jsxs)("div",{children:[i.jsx("h1",{className:"text-3xl font-bold tracking-tight",children:"Create New Artist"}),i.jsx("p",{className:"text-muted-foreground",children:"Add a new artist to your tattoo studio"})]}),i.jsx(s,{})]})}}};var t=require("../../../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),i=t.X(0,[9379,8213,1488,4128,7598,9906,1113,23,4106,5593,9060],()=>r(47485));module.exports=i})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{var e={};e.id=3886,e.ids=[3886],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},55315:e=>{"use strict";e.exports=require("path")},17360:e=>{"use strict";e.exports=require("url")},16543:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>r.a,__next_app__:()=>m,originalPathname:()=>u,pages:()=>d,routeModule:()=>p,tree:()=>c}),s(8696),s(84172),s(96141),s(40656),s(40509),s(70546);var a=s(30170),o=s(45002),i=s(83876),r=s.n(i),n=s(66299),l={};for(let e in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(l[e]=()=>n[e]);s.d(t,l);let c=["",{children:["book",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.bind(s,8696)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/page.tsx"]}]},{error:[()=>Promise.resolve().then(s.bind(s,84172)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/error.tsx"],loading:[()=>Promise.resolve().then(s.bind(s,96141)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/loading.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(s.bind(s,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(s.bind(s,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(s.bind(s,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],d=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/page.tsx"],u="/book/page",m={require:s,loadChunk:()=>Promise.resolve()},p=new a.AppPageRouteModule({definition:{kind:o.x.APP_PAGE,page:"/book/page",pathname:"/book",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:c}})},99633:(e,t,s)=>{Promise.resolve().then(s.bind(s,95808))},95808:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>n});var a=s(97247),o=s(2502),i=s(58053),r=s(35921);function n({reset:e}){return a.jsx("div",{className:"container mx-auto px-4 py-8",children:(0,a.jsxs)(o.bZ,{variant:"destructive",className:"max-w-2xl mx-auto",children:[a.jsx(r.Z,{className:"h-4 w-4"}),a.jsx(o.Cd,{children:"Something went wrong!"}),(0,a.jsxs)(o.X,{className:"space-y-4",children:[a.jsx("p",{children:"We encountered an error while loading the booking form. Please try again or contact support if the problem persists."}),a.jsx(i.z,{onClick:e,variant:"outline",size:"sm",children:"Try again"})]})]})})}},84172:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>a});let a=(0,s(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/error.tsx#default`)},96141:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>i});var a=s(72051),o=s(58030);function i(){return(0,a.jsxs)("div",{className:"container mx-auto px-4 py-8 space-y-8",children:[(0,a.jsxs)("div",{className:"text-center space-y-4",children:[a.jsx(o.O,{className:"h-12 w-72 mx-auto"}),a.jsx(o.O,{className:"h-6 w-96 mx-auto"})]}),(0,a.jsxs)("div",{className:"max-w-2xl mx-auto space-y-6",children:[(0,a.jsxs)("div",{className:"grid gap-6 md:grid-cols-2",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-20"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-24"}),a.jsx(o.O,{className:"h-10 w-full"})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-16"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-20"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-28"}),a.jsx(o.O,{className:"h-24 w-full"})]}),a.jsx(o.O,{className:"h-12 w-32"})]})]})}},8696:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>n});var a=s(72051),o=s(94604),i=s(38252),r=s(86006);function n(){return(0,a.jsxs)("main",{className:"min-h-screen",children:[a.jsx(o.W,{}),a.jsx("div",{className:"pt-16",children:a.jsx(i.F,{})}),a.jsx(r.$,{})]})}}};var t=require("../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),a=t.X(0,[9379,5590,7598,9906,1181,8472,3630,8328,9366,1189,5896,4012],()=>s(16543));module.exports=a})();
(()=>{var e={};e.id=3886,e.ids=[3886],e.modules={72934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},55315:e=>{"use strict";e.exports=require("path")},17360:e=>{"use strict";e.exports=require("url")},16543:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>r.a,__next_app__:()=>m,originalPathname:()=>u,pages:()=>d,routeModule:()=>p,tree:()=>c}),s(8696),s(84172),s(96141),s(40656),s(40509),s(70546);var a=s(30170),o=s(45002),i=s(83876),r=s.n(i),n=s(66299),l={};for(let e in n)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(l[e]=()=>n[e]);s.d(t,l);let c=["",{children:["book",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.bind(s,8696)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/page.tsx"]}]},{error:[()=>Promise.resolve().then(s.bind(s,84172)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/error.tsx"],loading:[()=>Promise.resolve().then(s.bind(s,96141)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/loading.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(s.bind(s,40656)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/layout.tsx"],error:[()=>Promise.resolve().then(s.bind(s,40509)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/error.tsx"],"not-found":[()=>Promise.resolve().then(s.bind(s,70546)),"/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/not-found.tsx"],metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,57481))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],d=["/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/page.tsx"],u="/book/page",m={require:s,loadChunk:()=>Promise.resolve()},p=new a.AppPageRouteModule({definition:{kind:o.x.APP_PAGE,page:"/book/page",pathname:"/book",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:c}})},99633:(e,t,s)=>{Promise.resolve().then(s.bind(s,95808))},95808:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>n});var a=s(97247),o=s(2502),i=s(58053),r=s(35921);function n({reset:e}){return a.jsx("div",{className:"container mx-auto px-4 py-8",children:(0,a.jsxs)(o.bZ,{variant:"destructive",className:"max-w-2xl mx-auto",children:[a.jsx(r.Z,{className:"h-4 w-4"}),a.jsx(o.Cd,{children:"Something went wrong!"}),(0,a.jsxs)(o.X,{className:"space-y-4",children:[a.jsx("p",{children:"We encountered an error while loading the booking form. Please try again or contact support if the problem persists."}),a.jsx(i.z,{onClick:e,variant:"outline",size:"sm",children:"Try again"})]})]})})}},84172:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>a});let a=(0,s(45347).createProxy)(String.raw`/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo/app/book/error.tsx#default`)},96141:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>i});var a=s(72051),o=s(58030);function i(){return(0,a.jsxs)("div",{className:"container mx-auto px-4 py-8 space-y-8",children:[(0,a.jsxs)("div",{className:"text-center space-y-4",children:[a.jsx(o.O,{className:"h-12 w-72 mx-auto"}),a.jsx(o.O,{className:"h-6 w-96 mx-auto"})]}),(0,a.jsxs)("div",{className:"max-w-2xl mx-auto space-y-6",children:[(0,a.jsxs)("div",{className:"grid gap-6 md:grid-cols-2",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-20"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-24"}),a.jsx(o.O,{className:"h-10 w-full"})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-16"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-20"}),a.jsx(o.O,{className:"h-10 w-full"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[a.jsx(o.O,{className:"h-4 w-28"}),a.jsx(o.O,{className:"h-24 w-full"})]}),a.jsx(o.O,{className:"h-12 w-32"})]})]})}},8696:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>n});var a=s(72051),o=s(94604),i=s(38252),r=s(86006);function n(){return(0,a.jsxs)("main",{className:"min-h-screen",children:[a.jsx(o.W,{}),a.jsx("div",{className:"pt-16",children:a.jsx(i.F,{})}),a.jsx(r.$,{})]})}}};var t=require("../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),a=t.X(0,[9379,1488,7598,9906,1181,8472,3630,8328,9366,4106,5896,4012],()=>s(16543));module.exports=a})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,11 +17,11 @@
"wasm": [],
"assets": [],
"env": {
"__NEXT_BUILD_ID": "q6gi1eLrEh_MMJiOSVY5n",
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "OgJGZYhOD7cITrl23alQ5+xp7tpBIg0XdNgLEazNnjA=",
"__NEXT_PREVIEW_MODE_ID": "c4f8845619b474cd3d0278b65080ab05",
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "442bd39997bdcf02b29556a36bff23b3e0ccf67b5bb33aa26154a5ec9e41dd81",
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "3ec05eeae0c5773b377eadeaba53b29343b115136ca16b096c7b61fb0277d6bc"
"__NEXT_BUILD_ID": "mp7CiDBjP_qLYoje6vOl-",
"NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "L/KM3Bj40v7FIHHuMD5DP5IDnNZcDqrB+Mxf6oMYubo=",
"__NEXT_PREVIEW_MODE_ID": "310f934069f902b9bb16d5ab83f7b6b0",
"__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "9081fdaddfa5ee3709d6c8e1d84c118cfde83b9f3790ee25612f5841c0fef8b3",
"__NEXT_PREVIEW_MODE_SIGNING_KEY": "57b9e146214c42f8a38e523741d4c980342595bb0d4152cc2803c30b925c731b"
}
}
},

View File

@ -1 +1 @@
{"node":{},"edge":{},"encryptionKey":"OgJGZYhOD7cITrl23alQ5+xp7tpBIg0XdNgLEazNnjA="}
{"node":{},"edge":{},"encryptionKey":"L/KM3Bj40v7FIHHuMD5DP5IDnNZcDqrB+Mxf6oMYubo="}

View File

@ -1,20 +1,21 @@
(()=>{"use strict";var e={},r={};function t(o){var n=r[o];if(void 0!==n)return n.exports;var a=r[o]={id:o,loaded:!1,exports:{}},d=!0;try{e[o].call(a.exports,a,a.exports,t),d=!1}finally{d&&delete r[o]}return a.loaded=!0,a.exports}t.m=e,t.amdO={},t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},(()=>{var e,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;t.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);t.r(a);var d={};e=e||[null,r({}),r([]),r(r)];for(var l=2&n&&o;"object"==typeof l&&!~e.indexOf(l);l=r(l))Object.getOwnPropertyNames(l).forEach(e=>d[e]=()=>o[e]);return d.default=()=>o,t.d(a,d),a}})(),t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce((r,o)=>(t.f[o](e,r),r),[])),t.u=e=>""+e+".js",t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.X=(e,r,o)=>{var n=r;o||(r=e,o=()=>t(t.s=n)),r.map(t.e,t);var a=o();return void 0===a?e:a},t.nc=void 0,(()=>{var e={6658:1},r=r=>{var o=r.modules,n=r.ids,a=r.runtime;for(var d in o)t.o(o,d)&&(t.m[d]=o[d]);a&&a(t);for(var l=0;l<n.length;l++)e[n[l]]=1};t.f.require=(o, _) => {
if (!e[o]) {
switch (o) {
case 1034: r(require("./chunks/1034.js")); break;
case 1113: r(require("./chunks/1113.js")); break;
case 1181: r(require("./chunks/1181.js")); break;
case 1189: r(require("./chunks/1189.js")); break;
case 1253: r(require("./chunks/1253.js")); break;
case 1488: r(require("./chunks/1488.js")); break;
case 2038: r(require("./chunks/2038.js")); break;
case 23: r(require("./chunks/23.js")); break;
case 3630: r(require("./chunks/3630.js")); break;
case 3664: r(require("./chunks/3664.js")); break;
case 4012: r(require("./chunks/4012.js")); break;
case 4106: r(require("./chunks/4106.js")); break;
case 4128: r(require("./chunks/4128.js")); break;
case 4486: r(require("./chunks/4486.js")); break;
case 4833: r(require("./chunks/4833.js")); break;
case 4926: r(require("./chunks/4926.js")); break;
case 5287: r(require("./chunks/5287.js")); break;
case 5590: r(require("./chunks/5590.js")); break;
case 5593: r(require("./chunks/5593.js")); break;
case 5896: r(require("./chunks/5896.js")); break;
case 7598: r(require("./chunks/7598.js")); break;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -673,12 +673,12 @@ var NEXT_DIR = path.join(__dirname, ".next");
var OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
debug({ NEXT_DIR, OPEN_NEXT_DIR });
var NextConfig = { "env": {}, "webpack": null, "eslint": { "ignoreDuringBuilds": true }, "typescript": { "ignoreBuildErrors": true, "tsconfigPath": "tsconfig.json" }, "distDir": ".next", "cleanDistDir": true, "assetPrefix": "", "cacheMaxMemorySize": 52428800, "configOrigin": "next.config.mjs", "useFileSystemPublicRoutes": true, "generateEtags": true, "pageExtensions": ["tsx", "ts", "jsx", "js"], "poweredByHeader": true, "compress": true, "analyticsId": "", "images": { "deviceSizes": [640, 750, 828, 1080, 1200, 1920, 2048, 3840], "imageSizes": [16, 32, 48, 64, 96, 128, 256, 384], "path": "/_next/image", "loader": "default", "loaderFile": "", "domains": [], "disableStaticImages": false, "minimumCacheTTL": 60, "formats": ["image/webp"], "dangerouslyAllowSVG": false, "contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;", "contentDispositionType": "inline", "remotePatterns": [], "unoptimized": true }, "devIndicators": { "buildActivity": true, "buildActivityPosition": "bottom-right" }, "onDemandEntries": { "maxInactiveAge": 6e4, "pagesBufferLength": 5 }, "amp": { "canonicalBase": "" }, "basePath": "", "sassOptions": {}, "trailingSlash": false, "i18n": null, "productionBrowserSourceMaps": false, "optimizeFonts": true, "excludeDefaultMomentLocales": true, "serverRuntimeConfig": {}, "publicRuntimeConfig": {}, "reactProductionProfiling": false, "reactStrictMode": null, "httpAgentOptions": { "keepAlive": true }, "outputFileTracing": true, "staticPageGenerationTimeout": 60, "swcMinify": true, "output": "standalone", "modularizeImports": { "@mui/icons-material": { "transform": "@mui/icons-material/{{member}}" }, "lodash": { "transform": "lodash/{{member}}" } }, "experimental": { "multiZoneDraftMode": false, "prerenderEarlyExit": false, "serverMinification": true, "serverSourceMaps": false, "linkNoTouchStart": false, "caseSensitiveRoutes": false, "clientRouterFilter": true, "clientRouterFilterRedirects": false, "fetchCacheKeyPrefix": "", "middlewarePrefetch": "flexible", "optimisticClientCache": true, "manualClientBasePath": false, "cpus": 11, "memoryBasedWorkersCount": false, "isrFlushToDisk": true, "workerThreads": false, "optimizeCss": false, "nextScriptWorkers": false, "scrollRestoration": false, "externalDir": false, "disableOptimizedLoading": false, "gzipSize": true, "craCompat": false, "esmExternals": true, "fullySpecified": false, "outputFileTracingRoot": "/home/Nicholai/Documents/Dev/united_v03/united-tattoo/united-tattoo", "swcTraceProfiling": false, "forceSwcTransforms": false, "largePageDataBytes": 128e3, "adjustFontFallbacks": false, "adjustFontFallbacksWithSizeAdjust": false, "typedRoutes": false, "instrumentationHook": false, "bundlePagesExternals": false, "parallelServerCompiles": false, "parallelServerBuildTraces": false, "ppr": false, "missingSuspenseWithCSRBailout": true, "optimizeServerReact": true, "useEarlyImport": false, "staleTimes": { "dynamic": 30, "static": 300 }, "optimizePackageImports": ["lucide-react", "date-fns", "lodash-es", "ramda", "antd", "react-bootstrap", "ahooks", "@ant-design/icons", "@headlessui/react", "@headlessui-float/react", "@heroicons/react/20/solid", "@heroicons/react/24/solid", "@heroicons/react/24/outline", "@visx/visx", "@tremor/react", "rxjs", "@mui/material", "@mui/icons-material", "recharts", "react-use", "@material-ui/core", "@material-ui/icons", "@tabler/icons-react", "mui-core", "react-icons/ai", "react-icons/bi", "react-icons/bs", "react-icons/cg", "react-icons/ci", "react-icons/di", "react-icons/fa", "react-icons/fa6", "react-icons/fc", "react-icons/fi", "react-icons/gi", "react-icons/go", "react-icons/gr", "react-icons/hi", "react-icons/hi2", "react-icons/im", "react-icons/io", "react-icons/io5", "react-icons/lia", "react-icons/lib", "react-icons/lu", "react-icons/md", "react-icons/pi", "react-icons/ri", "react-icons/rx", "react-icons/si", "react-icons/sl", "react-icons/tb", "react-icons/tfi", "react-icons/ti", "react-icons/vsc", "react-icons/wi"], "trustHostHeader": false, "isExperimentalCompile": false }, "configFileName": "next.config.mjs" };
var BuildId = "q6gi1eLrEh_MMJiOSVY5n";
var BuildId = "mp7CiDBjP_qLYoje6vOl-";
var HtmlPages = [];
var RoutesManifest = { "basePath": "", "rewrites": { "beforeFiles": [], "afterFiles": [], "fallback": [] }, "redirects": [{ "source": "/:path+/", "destination": "/:path+", "internal": true, "statusCode": 308, "regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$" }], "routes": { "static": [{ "page": "/", "regex": "^/(?:/)?$", "routeKeys": {}, "namedRegex": "^/(?:/)?$" }, { "page": "/_not-found", "regex": "^/_not\\-found(?:/)?$", "routeKeys": {}, "namedRegex": "^/_not\\-found(?:/)?$" }, { "page": "/admin", "regex": "^/admin(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin(?:/)?$" }, { "page": "/admin/analytics", "regex": "^/admin/analytics(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/analytics(?:/)?$" }, { "page": "/admin/artists", "regex": "^/admin/artists(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/artists(?:/)?$" }, { "page": "/admin/artists/new", "regex": "^/admin/artists/new(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/artists/new(?:/)?$" }, { "page": "/admin/calendar", "regex": "^/admin/calendar(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/calendar(?:/)?$" }, { "page": "/admin/portfolio", "regex": "^/admin/portfolio(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/portfolio(?:/)?$" }, { "page": "/admin/settings", "regex": "^/admin/settings(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/settings(?:/)?$" }, { "page": "/admin/uploads", "regex": "^/admin/uploads(?:/)?$", "routeKeys": {}, "namedRegex": "^/admin/uploads(?:/)?$" }, { "page": "/aftercare", "regex": "^/aftercare(?:/)?$", "routeKeys": {}, "namedRegex": "^/aftercare(?:/)?$" }, { "page": "/artists", "regex": "^/artists(?:/)?$", "routeKeys": {}, "namedRegex": "^/artists(?:/)?$" }, { "page": "/auth/error", "regex": "^/auth/error(?:/)?$", "routeKeys": {}, "namedRegex": "^/auth/error(?:/)?$" }, { "page": "/auth/signin", "regex": "^/auth/signin(?:/)?$", "routeKeys": {}, "namedRegex": "^/auth/signin(?:/)?$" }, { "page": "/book", "regex": "^/book(?:/)?$", "routeKeys": {}, "namedRegex": "^/book(?:/)?$" }, { "page": "/contact", "regex": "^/contact(?:/)?$", "routeKeys": {}, "namedRegex": "^/contact(?:/)?$" }, { "page": "/deposit", "regex": "^/deposit(?:/)?$", "routeKeys": {}, "namedRegex": "^/deposit(?:/)?$" }, { "page": "/favicon.ico", "regex": "^/favicon\\.ico(?:/)?$", "routeKeys": {}, "namedRegex": "^/favicon\\.ico(?:/)?$" }, { "page": "/gift-cards", "regex": "^/gift\\-cards(?:/)?$", "routeKeys": {}, "namedRegex": "^/gift\\-cards(?:/)?$" }, { "page": "/privacy", "regex": "^/privacy(?:/)?$", "routeKeys": {}, "namedRegex": "^/privacy(?:/)?$" }, { "page": "/specials", "regex": "^/specials(?:/)?$", "routeKeys": {}, "namedRegex": "^/specials(?:/)?$" }, { "page": "/terms", "regex": "^/terms(?:/)?$", "routeKeys": {}, "namedRegex": "^/terms(?:/)?$" }], "dynamic": [{ "page": "/admin/artists/[id]", "regex": "^/admin/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/admin/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/api/artists/[id]", "regex": "^/api/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/api/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/api/auth/[...nextauth]", "regex": "^/api/auth/(.+?)(?:/)?$", "routeKeys": { "nxtPnextauth": "nxtPnextauth" }, "namedRegex": "^/api/auth/(?<nxtPnextauth>.+?)(?:/)?$" }, { "page": "/api/portfolio/[id]", "regex": "^/api/portfolio/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/api/portfolio/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/artists/[id]", "regex": "^/artists/([^/]+?)(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/artists/(?<nxtPid>[^/]+?)(?:/)?$" }, { "page": "/artists/[id]/book", "regex": "^/artists/([^/]+?)/book(?:/)?$", "routeKeys": { "nxtPid": "nxtPid" }, "namedRegex": "^/artists/(?<nxtPid>[^/]+?)/book(?:/)?$" }], "data": { "static": [], "dynamic": [] } }, "locales": [] };
var MiddlewareManifest = { "version": 3, "middleware": { "/": { "files": ["server/edge-runtime-webpack.js", "server/middleware.js"], "name": "middleware", "page": "/", "matchers": [{ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/((?!_next\\/static|_next\\/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*))(.json)?[\\/#\\?]?$", "originalSource": "/((?!_next/static|_next/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*)" }], "wasm": [], "assets": [], "env": { "__NEXT_BUILD_ID": "q6gi1eLrEh_MMJiOSVY5n", "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "OgJGZYhOD7cITrl23alQ5+xp7tpBIg0XdNgLEazNnjA=", "__NEXT_PREVIEW_MODE_ID": "c4f8845619b474cd3d0278b65080ab05", "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "442bd39997bdcf02b29556a36bff23b3e0ccf67b5bb33aa26154a5ec9e41dd81", "__NEXT_PREVIEW_MODE_SIGNING_KEY": "3ec05eeae0c5773b377eadeaba53b29343b115136ca16b096c7b61fb0277d6bc" } } }, "functions": {}, "sortedMiddleware": ["/"] };
var AppPathRoutesManifest = { "/_not-found/page": "/_not-found", "/aftercare/page": "/aftercare", "/api/admin/migrate/route": "/api/admin/migrate", "/api/artists/[id]/route": "/api/artists/[id]", "/api/auth/[...nextauth]/route": "/api/auth/[...nextauth]", "/artists/[id]/book/page": "/artists/[id]/book", "/artists/[id]/page": "/artists/[id]", "/artists/page": "/artists", "/auth/error/page": "/auth/error", "/auth/signin/page": "/auth/signin", "/book/page": "/book", "/deposit/page": "/deposit", "/contact/page": "/contact", "/favicon.ico/route": "/favicon.ico", "/gift-cards/page": "/gift-cards", "/page": "/", "/privacy/page": "/privacy", "/specials/page": "/specials", "/terms/page": "/terms", "/api/admin/stats/route": "/api/admin/stats", "/api/files/bulk-delete/route": "/api/files/bulk-delete", "/api/artists/route": "/api/artists", "/api/files/folder/route": "/api/files/folder", "/api/files/route": "/api/files", "/api/portfolio/bulk-delete/route": "/api/portfolio/bulk-delete", "/api/files/stats/route": "/api/files/stats", "/api/portfolio/[id]/route": "/api/portfolio/[id]", "/api/portfolio/stats/route": "/api/portfolio/stats", "/api/portfolio/route": "/api/portfolio", "/api/appointments/route": "/api/appointments", "/api/users/route": "/api/users", "/api/settings/route": "/api/settings", "/api/upload/route": "/api/upload", "/admin/artists/[id]/page": "/admin/artists/[id]", "/admin/artists/new/page": "/admin/artists/new", "/admin/artists/page": "/admin/artists", "/admin/calendar/page": "/admin/calendar", "/admin/portfolio/page": "/admin/portfolio", "/admin/page": "/admin", "/admin/settings/page": "/admin/settings", "/admin/uploads/page": "/admin/uploads", "/admin/analytics/page": "/admin/analytics" };
var FunctionsConfigManifest = { "version": 1, "functions": { "/api/artists": {}, "/api/admin/stats": {}, "/api/files/folder": {}, "/api/files/bulk-delete": {}, "/api/appointments": {}, "/api/files": {}, "/api/files/stats": {}, "/api/portfolio/bulk-delete": {}, "/api/portfolio/stats": {}, "/api/portfolio/[id]": {}, "/api/settings": {}, "/api/upload": {}, "/api/users": {}, "/admin/analytics": {}, "/api/portfolio": {}, "/admin/portfolio": {}, "/admin/settings": {}, "/admin/uploads": {} } };
var MiddlewareManifest = { "version": 3, "middleware": { "/": { "files": ["server/edge-runtime-webpack.js", "server/middleware.js"], "name": "middleware", "page": "/", "matchers": [{ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?(?:\\/((?!_next\\/static|_next\\/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*))(.json)?[\\/#\\?]?$", "originalSource": "/((?!_next/static|_next/image|favicon.ico|public|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.gif$|.*\\.svg$).*)" }], "wasm": [], "assets": [], "env": { "__NEXT_BUILD_ID": "mp7CiDBjP_qLYoje6vOl-", "NEXT_SERVER_ACTIONS_ENCRYPTION_KEY": "L/KM3Bj40v7FIHHuMD5DP5IDnNZcDqrB+Mxf6oMYubo=", "__NEXT_PREVIEW_MODE_ID": "310f934069f902b9bb16d5ab83f7b6b0", "__NEXT_PREVIEW_MODE_ENCRYPTION_KEY": "9081fdaddfa5ee3709d6c8e1d84c118cfde83b9f3790ee25612f5841c0fef8b3", "__NEXT_PREVIEW_MODE_SIGNING_KEY": "57b9e146214c42f8a38e523741d4c980342595bb0d4152cc2803c30b925c731b" } } }, "functions": {}, "sortedMiddleware": ["/"] };
var AppPathRoutesManifest = { "/_not-found/page": "/_not-found", "/aftercare/page": "/aftercare", "/api/admin/migrate/route": "/api/admin/migrate", "/api/artists/[id]/route": "/api/artists/[id]", "/api/auth/[...nextauth]/route": "/api/auth/[...nextauth]", "/artists/[id]/book/page": "/artists/[id]/book", "/artists/[id]/page": "/artists/[id]", "/artists/page": "/artists", "/auth/signin/page": "/auth/signin", "/contact/page": "/contact", "/deposit/page": "/deposit", "/book/page": "/book", "/auth/error/page": "/auth/error", "/favicon.ico/route": "/favicon.ico", "/gift-cards/page": "/gift-cards", "/page": "/", "/terms/page": "/terms", "/specials/page": "/specials", "/privacy/page": "/privacy", "/api/files/folder/route": "/api/files/folder", "/api/admin/stats/route": "/api/admin/stats", "/api/files/bulk-delete/route": "/api/files/bulk-delete", "/api/artists/route": "/api/artists", "/api/files/stats/route": "/api/files/stats", "/api/files/route": "/api/files", "/api/portfolio/bulk-delete/route": "/api/portfolio/bulk-delete", "/api/portfolio/stats/route": "/api/portfolio/stats", "/api/portfolio/[id]/route": "/api/portfolio/[id]", "/api/appointments/route": "/api/appointments", "/api/portfolio/route": "/api/portfolio", "/api/settings/route": "/api/settings", "/api/upload/route": "/api/upload", "/api/users/route": "/api/users", "/admin/artists/[id]/page": "/admin/artists/[id]", "/admin/artists/new/page": "/admin/artists/new", "/admin/page": "/admin", "/admin/artists/page": "/admin/artists", "/admin/calendar/page": "/admin/calendar", "/admin/portfolio/page": "/admin/portfolio", "/admin/uploads/page": "/admin/uploads", "/admin/settings/page": "/admin/settings", "/admin/analytics/page": "/admin/analytics" };
var FunctionsConfigManifest = { "version": 1, "functions": { "/api/files/bulk-delete": {}, "/api/admin/stats": {}, "/api/artists": {}, "/api/files/folder": {}, "/api/files": {}, "/api/files/stats": {}, "/api/appointments": {}, "/api/portfolio/bulk-delete": {}, "/api/portfolio/[id]": {}, "/api/portfolio/stats": {}, "/api/portfolio": {}, "/api/upload": {}, "/api/settings": {}, "/api/users": {}, "/admin/analytics": {}, "/admin/portfolio": {}, "/admin/settings": {}, "/admin/uploads": {} } };
var PagesManifest = { "/_app": "pages/_app.js", "/_error": "pages/_error.js", "/_document": "pages/_document.js" };
process.env.NEXT_BUILD_ID = BuildId;

View File

@ -24,7 +24,6 @@ const sourceSans = Source_Sans_3({
export const metadata: Metadata = {
title: "United Tattoo - Professional Tattoo Studio",
description: "Book appointments with our talented artists and explore stunning tattoo portfolios at United Tattoo.",
generator: "v0.app",
}
export const dynamic = "force-dynamic";

View File

@ -1,4 +1,4 @@
# United Tattoo Backend Architecture Document
# United Tattoo Fullstack Architecture Document
Version: 1.0
Date: 2025-09-17
@ -7,10 +7,9 @@ Basis: docs/PRD.md, repo config (wrangler.toml, open-next.config.ts, next.config
Introduction
This document outlines the backend architecture for United Tattoo, including platform/runtime, data, integrations, security, operations, and nonUI concerns. It is the blueprint for AI-driven and human development to implement the PRD.
This document outlines the complete fullstack architecture for United Tattoo, including backend systems, frontend implementation, and their integration. It serves as the single source of truth for AI-driven development, ensuring consistency across the entire technology stack.
Relationship to Frontend Architecture:
A separate Frontend Architecture document should cover UI state, routing, component patterns, and UX specifics. Core technology selections herein (Cloudflare, Next.js App Router, D1/R2, Auth.js, Zod) apply project-wide.
This unified approach combines what would traditionally be separate backend and frontend architecture documents, streamlining the development process for modern fullstack applications where these concerns are increasingly intertwined.
Starter Template or Existing Project
@ -23,13 +22,13 @@ Change Log
| Date | Version | Description | Author |
|------------|---------|---------------------------------------------|----------|
| 2025-09-17 | 1.0 | Initial backend architecture document | Architect |
| 2025-09-17 | 1.0 | Initial fullstack architecture document | Architect |
High Level Architecture
Technical Summary
United Tattoo runs as a serverless, modular monolith on Cloudflare Pages + Workers using the OpenNext adapter. Next.js App Router handles SSR/ISR and routing; Cloudflare D1 stores structured data (users, artists, appointments, settings) and R2 stores media plus incremental cache. Back-end concerns (auth, RBAC, validations, uploads, booking, payments, notifications, calendar sync) are implemented via Next.js route handlers and server actions with strict Zod validation and middleware-based RBAC. The architecture prioritizes image-forward delivery performance, reliability, and maintainability aligned to the PRD.
United Tattoo runs as a serverless, modular monolith on Cloudflare Pages + Workers using the OpenNext adapter. Next.js App Router handles SSR/ISR and routing; Cloudflare D1 stores structured data (users, artists, appointments, settings) and R2 stores media plus incremental cache. The fullstack architecture implements both frontend UI components and backend services (auth, RBAC, validations, uploads, booking, payments, notifications, calendar sync) via Next.js route handlers, server actions, and React components with strict Zod validation and middleware-based RBAC. The architecture prioritizes image-forward delivery performance, reliability, and maintainability aligned to the PRD.
High Level Overview
@ -446,7 +445,114 @@ Backend Customization Choices (Confirmed)
Next Steps
- Frontend Architecture Mode: Generate a separate frontend architecture doc leveraging this backend document and PRD UI requirements (ShadCN, search/filters, parallax/split).
## Frontend Component Architecture
### Component Organization
- **App Router Structure**: Next.js App Router with layout hierarchy
- Root layout: `app/layout.tsx` - Global providers, fonts, metadata
- Client layout: `app/ClientLayout.tsx` - Main site navigation, footer
- Admin layout: `app/admin/layout.tsx` - Admin dashboard structure
- Nested layouts per section (artists, booking, etc.)
- **UI Components**: ShadCN-based component library with custom extensions
- Base components: `components/ui/` - Button, Card, Input, Dialog, etc.
- Domain components: `components/admin/`, `components/booking/`, etc.
- Layout components: Navigation, Footer, Section wrappers
- Form components: Booking forms, contact forms, payment forms
- **State Management**: React hooks + Zustand for global state
- Local state: useState/useReducer for component-specific state
- Form state: React Hook Form with Zod validation integration
- Global state: Zustand stores for auth, booking, UI preferences
- Server state: React Query for data fetching and caching
### Payment Form Components
**Stripe Embedded Elements Integration**:
- Payment form: `components/payment/StripePaymentForm.tsx`
- Card element: Stripe CardElement with custom styling
- Mobile optimization: Responsive design for 70% mobile usage
- Error handling: Validation errors and payment status feedback
- Loading states: Processing indicators and success confirmation
**Deposit Payment Flow**:
1. Booking form completion with service selection
2. Deposit amount calculation based on service pricing
3. Stripe PaymentIntent creation via server action
4. Embedded payment form rendering with client secret
5. Payment confirmation and status updates
### State Management for Payment Processing
- **Payment State Machine**:
- `IDLE` → Initial state
- `PROCESSING` → Payment submission
- `SUCCESS` → Payment completed
- `ERROR` → Payment failed
- `CANCELLED` → User cancelled
- **Error Recovery**:
- Retry mechanism for failed payments
- Clear error messages with actionable steps
- Session preservation during payment flow
### Mobile Optimization (70% Mobile Usage)
- **Responsive Design Principles**:
- Mobile-first CSS approach
- Touch-friendly interfaces (44px+ touch targets)
- Simplified navigation for mobile
- Optimized image loading and performance
- **Mobile-Specific Components**:
- Mobile booking bar: `components/MobileBookingBar.tsx`
- Touch-optimized forms and buttons
- Swipeable carousels for artist portfolios
- Simplified payment flow for mobile devices
### Error Handling and User Feedback
- **Frontend Error Boundaries**:
- Global error boundary for uncaught exceptions
- Component-level error handling
- Graceful degradation for failed features
- **User Feedback Patterns**:
- Toast notifications: `hooks/use-toast.ts`
- Loading spinners and skeletons
- Success/error modals for critical actions
- Form validation feedback with Zod integration
## Testing Strategy (Frontend)
### Component Testing
- **Unit Tests**: Vitest + React Testing Library
- Component rendering and interaction tests
- Hook testing for custom React hooks
- Form validation and state management tests
- **Integration Tests**:
- Component composition testing
- Form submission and validation flows
- Payment form integration with mock Stripe
### E2E Testing
- **Playwright Tests**:
- Booking flow from start to payment completion
- Admin dashboard functionality
- Mobile responsiveness testing
- Cross-browser compatibility
### Payment Testing
- **Stripe Test Mode**:
- Test card numbers for various scenarios
- Webhook testing with local tunnel
- Error scenario simulation
- Mobile payment flow testing
## Next Steps
- Product Owner Review: Validate scope and sequencing (Phases 14).
- Dev Agent: Implement stories for Phase 1 (Admin invites, onboarding wizard stub, artist CRUD/portfolio upload MVP, D1/R2 confirmations).
- DevOps: Add CI pipeline, lock exact versions from lockfile into doc, add .env.example listing required secrets (NEXTAUTH_URL, NEXTAUTH_SECRET, R2_PUBLIC_URL, STRIPE_KEYS, RESEND_API_KEY, TWILIO_KEYS, GOOGLE_OAUTH, UPSTASH).

View File

@ -0,0 +1,48 @@
# Epic: Deposit Form & Payment Integration - Brownfield Enhancement
## Epic Goal
Complete the deposit form functionality and integrate secure payment processing to enable online deposits for tattoo appointments, improving customer convenience and reducing manual payment handling.
## Epic Description
**Existing System Context:**
- Current booking system with deposit requirements
- Existing user authentication and appointment management
- Technology stack: Next.js, TypeScript, Tailwind CSS
- Mobile-first user base (70% of bookings from mobile devices)
**Enhancement Details:**
- Implement complete deposit form with client-side validation and error handling
- Integrate Stripe payment processing using Embedded Elements for optimal UX and PCI compliance
- Use inline payment form within booking flow to reduce abandonment
- Implement immediate retry for transient payment failures with fallback to manual processing
- Connect payment success to booking confirmation and email notifications
- Add admin dashboard for payment tracking, reporting, and manual intervention
- Store only payment reference IDs and status (no sensitive card data)
- Success criteria: Reduce deposit processing time from 48hrs to <5min, achieve 95% payment success rate, process 80% of deposits online
## Stories
1. **Story 1:** Complete deposit form UI with validation and error handling
2. **Story 2:** Integrate payment gateway API and handle payment processing
3. **Story 3:** Connect payment success to booking confirmation and email notifications
4. **Story 4:** Add admin payment tracking dashboard and reporting
## Compatibility Requirements
- [ ] Existing booking APIs remain unchanged
- [ ] User authentication system integrates seamlessly
- [ ] Database schema changes are backward compatible
- [ ] UI follows existing design patterns
- [ ] Performance impact is minimal (<200ms response time)
## Risk Mitigation
- **Primary Risk:** Payment security and PCI compliance
- **Mitigation:** Use certified payment gateway, no sensitive data storage
- **Rollback Plan:** Disable payment button, revert to manual deposit handling
## Definition of Done
- [ ] All stories completed with acceptance criteria met
- [ ] Existing functionality verified through testing
- [ ] Payment integration points working correctly
- [ ] Security and compliance requirements met
- [ ] No regression in existing booking features

View File

@ -0,0 +1,161 @@
# Navigation Hover Enhancement - Brownfield Addition
## Story Title
Navigation Hover Enhancement - Brownfield Addition
## User Story
As a **website visitor**,
I want **the navigation bar to appear when I hover over the top area of the page when at scroll position 0 on desktop**,
So that **I can access navigation options without needing to scroll down, providing better usability and seamless access to site sections**.
## Story Context
**Existing System Integration:**
- Integrates with: Navigation component (`components/navigation.tsx`)
- Technology: React, Next.js, Tailwind CSS, TypeScript
- Follows pattern: Existing scroll-based visibility logic and CSS transitions
- Touch points: Navigation state management, CSS conditional styling, scroll event handling
## Acceptance Criteria
**Functional Requirements:**
1. When at scroll position 0 (top of page) on desktop (lg+ breakpoints), hovering over the top navigation area makes the navigation bar visible
2. Navigation appearance on hover should use the same graceful transition (duration-700 ease-out) as the existing scroll-based visibility
3. Mobile navigation behavior remains completely unchanged
**Integration Requirements:**
4. Existing scroll-based navigation visibility continues to work unchanged
5. New hover functionality follows existing CSS transition pattern
6. Integration with current state management (`isScrolled`, mobile menu) maintains current behavior
**Quality Requirements:**
7. Change is covered by appropriate tests
8. No regression in existing mobile/desktop navigation functionality verified
9. Hover area is intuitive and appropriately sized
## Technical Notes
- **Integration Approach:** Add hover state detection and modify existing CSS classes to include hover pseudo-classes for desktop breakpoints only
- **Existing Pattern Reference:** Current opacity/pointer-events toggle pattern with `lg:opacity-0 lg:pointer-events-none` when not scrolled
- **Key Constraints:**
- Must not affect mobile behavior (mobile nav is always visible when not scrolled)
- Must maintain existing 700ms transition duration
- Hover area should be reasonable (likely top 80-100px of viewport)
## Definition of Done
- [ ] Functional requirements met
- [ ] Integration requirements verified
- [ ] Existing functionality regression tested
- [ ] Code follows existing patterns and standards
- [ ] Tests pass (existing and new)
- [ ] Documentation updated if applicable
## Risk and Compatibility Check
**Minimal Risk Assessment:**
- **Primary Risk:** Hover functionality interfering with mobile touch interactions or existing scroll behavior
- **Mitigation:** Use desktop-only CSS breakpoint modifiers (lg:) and test thoroughly on mobile devices
- **Rollback:** Simple CSS class modification revert, no state management changes needed
**Compatibility Verification:**
- [ ] No breaking changes to existing APIs
- [ ] Database changes: None
- [ ] UI changes follow existing design patterns (same transition, same styling)
- [ ] Performance impact is negligible (pure CSS hover, no additional JavaScript)
## Validation Checklist
**Scope Validation:**
- [ ] Story can be completed in one development session (estimated 2-3 hours)
- [ ] Integration approach is straightforward (CSS modification with existing patterns)
- [ ] Follows existing patterns exactly (same transitions, same conditional styling approach)
- [ ] No design or architecture work required
**Clarity Check:**
- [ ] Story requirements are unambiguous
- [ ] Integration points are clearly specified (navigation component only)
- [ ] Success criteria are testable (hover behavior, transition timing, mobile unchanged)
- [ ] Rollback approach is simple (revert CSS classes)
## QA Results
*QA validation results will be populated here during review*
---
**Status:** Draft
**Priority:** Low
**Estimate:** 2-3 hours
**Epic:** N/A (standalone enhancement)
**Dependencies:** None
## Product Owner Validation Report
### Template Compliance Issues
**CRITICAL - Missing Required Sections:**
- Tasks / Subtasks section missing (required for dev agent implementation)
- Dev Notes section not following template structure (has "Technical Notes" instead)
- Testing section missing (only referenced in DoD)
- Change Log section missing
- Dev Agent Record section missing
- QA Results section missing
**Structure Issues:**
- Story uses custom structure instead of template format
- Missing proper elicitation markers and section ownership
### Critical Issues (Must Fix - Story Blocked)
1. **Missing Tasks/Subtasks Breakdown**: Story lacks the granular task breakdown required for dev agent implementation. Current story has high-level requirements but no actionable implementation steps.
2. **Navigation Component Syntax Error**: The existing `components/navigation.tsx` file has a syntax error (`const [a`) that must be fixed before any enhancements.
3. **Incomplete Dev Notes**: Current "Technical Notes" section lacks:
- Relevant source tree information
- Complete technical context for dev agent
- Testing standards and frameworks
- Specific implementation guidance
4. **Missing Testing Section**: No dedicated testing section with:
- Test file locations
- Testing frameworks to use
- Specific test scenarios for hover functionality
### Should-Fix Issues (Important Quality Improvements)
1. **Acceptance Criteria Clarity**: AC #9 mentions "appropriately sized" hover area but lacks specific dimensions (story mentions 80-100px but not in AC)
2. **Integration Context Missing**: Story doesn't specify how hover state will integrate with existing `isScrolled` state management
3. **Browser Compatibility**: No mention of hover behavior on touch devices or hybrid devices
### Anti-Hallucination Findings
**Verified Technical Claims:**
- ✅ Navigation component exists at `components/navigation.tsx`
- ✅ Current CSS classes `lg:opacity-0 lg:pointer-events-none` confirmed
- ✅ Transition duration `duration-700 ease-out` confirmed
- ✅ Scroll threshold of 50px confirmed in code
**Issues Requiring Source Verification:**
- ❌ Syntax error in navigation.tsx needs immediate attention
- ⚠️ Hover area size (80-100px) mentioned in Technical Notes but not in official AC
### Final Assessment
**Status: NO-GO** - Story requires critical fixes before implementation
**Implementation Readiness Score:** 3/10
**Confidence Level:** LOW
**Required Actions Before Implementation:**
1. Fix syntax error in `components/navigation.tsx`
2. Add proper Tasks/Subtasks section following template
3. Restructure Dev Notes section per template requirements
4. Add Testing section with specific test requirements
5. Add missing template sections (Change Log, Dev Agent Record)
6. Clarify hover area dimensions in Acceptance Criteria
**Recommendation:** Return to Scrum Master for story restructuring using proper template format.

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