Enhance receipt management by adding support for image uploads and improving data handling in receipt forms. Update route parameters and type definitions for better data structure. Refactor UI components for improved user experience and responsiveness, including collapsible sections for receipt images and dynamic line item management.
This commit is contained in:
@@ -21,10 +21,10 @@ export const options = {
|
|||||||
service_worker: false,
|
service_worker: false,
|
||||||
service_worker_options: undefined,
|
service_worker_options: undefined,
|
||||||
templates: {
|
templates: {
|
||||||
app: ({ head, body, assets, nonce, env }) => "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='4' fill='%231e293b'/><text x='16' y='22' font-size='18' font-family='system-ui' fill='%2394a3b8' text-anchor='middle'>S</text></svg>\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5, viewport-fit=cover\" />\n <meta name=\"theme-color\" content=\"#0f172a\" />\n <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n <meta name=\"apple-mobile-web-app-title\" content=\"Stackq\" />\n <link rel=\"apple-touch-icon\" href=\"/icon.svg\" />\n <link rel=\"manifest\" href=\"/manifest.webmanifest\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
|
app: ({ head, body, assets, nonce, env }) => "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='4' fill='%231e293b'/><text x='16' y='22' font-size='18' font-family='system-ui' fill='%2394a3b8' text-anchor='middle'>S</text></svg>\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5, viewport-fit=cover\" />\n <meta name=\"theme-color\" content=\"#0f172a\" />\n <meta name=\"mobile-web-app-capable\" content=\"yes\" />\n <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n <meta name=\"apple-mobile-web-app-title\" content=\"Stackq\" />\n <link rel=\"apple-touch-icon\" href=\"/icon.svg\" />\n <link rel=\"manifest\" href=\"/manifest.webmanifest\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
|
||||||
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
||||||
},
|
},
|
||||||
version_hash: "11efg8s"
|
version_hash: "14gnm4x"
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function get_hooks() {
|
export async function get_hooks() {
|
||||||
|
|||||||
Vendored
+8
-5
@@ -27,20 +27,23 @@ export {};
|
|||||||
|
|
||||||
declare module "$app/types" {
|
declare module "$app/types" {
|
||||||
export interface AppTypes {
|
export interface AppTypes {
|
||||||
RouteId(): "/" | "/access-denied" | "/accounts" | "/accounts/new" | "/accounts/[id]" | "/api" | "/api/toggle-darkmode" | "/items" | "/items/[id]" | "/login" | "/logout" | "/receipts" | "/receipts/new" | "/receipts/[id]" | "/transactions" | "/transactions/new" | "/transactions/[id]";
|
RouteId(): "/" | "/access-denied" | "/accounts" | "/accounts/new" | "/accounts/[id]" | "/api" | "/api/files" | "/api/files/[...path]" | "/api/toggle-darkmode" | "/items" | "/items/[id]" | "/login" | "/logout" | "/receipts" | "/receipts/new" | "/receipts/[id]" | "/transactions" | "/transactions/new" | "/transactions/[id]";
|
||||||
RouteParams(): {
|
RouteParams(): {
|
||||||
"/accounts/[id]": { id: string };
|
"/accounts/[id]": { id: string };
|
||||||
|
"/api/files/[...path]": { path: string };
|
||||||
"/items/[id]": { id: string };
|
"/items/[id]": { id: string };
|
||||||
"/receipts/[id]": { id: string };
|
"/receipts/[id]": { id: string };
|
||||||
"/transactions/[id]": { id: string }
|
"/transactions/[id]": { id: string }
|
||||||
};
|
};
|
||||||
LayoutParams(): {
|
LayoutParams(): {
|
||||||
"/": { id?: string };
|
"/": { id?: string; path?: string };
|
||||||
"/access-denied": Record<string, never>;
|
"/access-denied": Record<string, never>;
|
||||||
"/accounts": { id?: string };
|
"/accounts": { id?: string };
|
||||||
"/accounts/new": Record<string, never>;
|
"/accounts/new": Record<string, never>;
|
||||||
"/accounts/[id]": { id: string };
|
"/accounts/[id]": { id: string };
|
||||||
"/api": Record<string, never>;
|
"/api": { path?: string };
|
||||||
|
"/api/files": { path?: string };
|
||||||
|
"/api/files/[...path]": { path: string };
|
||||||
"/api/toggle-darkmode": Record<string, never>;
|
"/api/toggle-darkmode": Record<string, never>;
|
||||||
"/items": { id?: string };
|
"/items": { id?: string };
|
||||||
"/items/[id]": { id: string };
|
"/items/[id]": { id: string };
|
||||||
@@ -53,8 +56,8 @@ declare module "$app/types" {
|
|||||||
"/transactions/new": Record<string, never>;
|
"/transactions/new": Record<string, never>;
|
||||||
"/transactions/[id]": { id: string }
|
"/transactions/[id]": { id: string }
|
||||||
};
|
};
|
||||||
Pathname(): "/" | "/accounts" | "/accounts/new" | `/accounts/${string}` & {} | "/items" | `/items/${string}` & {} | "/login" | "/logout" | "/receipts" | "/receipts/new" | `/receipts/${string}` & {} | "/transactions" | "/transactions/new" | `/transactions/${string}` & {};
|
Pathname(): "/" | "/accounts" | "/accounts/new" | `/accounts/${string}` & {} | `/api/files/${string}` & {} | "/items" | `/items/${string}` & {} | "/login" | "/logout" | "/receipts" | "/receipts/new" | `/receipts/${string}` & {} | "/transactions" | "/transactions/new" | `/transactions/${string}` & {};
|
||||||
ResolvedPathname(): `${"" | `/${string}`}${ReturnType<AppTypes['Pathname']>}`;
|
ResolvedPathname(): `${"" | `/${string}`}${ReturnType<AppTypes['Pathname']>}`;
|
||||||
Asset(): "/icon.svg" | string & {};
|
Asset(): "/icon.svg" | "/manifest.webmanifest" | string & {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,6 +19,9 @@
|
|||||||
"src/routes/+layout.ts",
|
"src/routes/+layout.ts",
|
||||||
"src/routes/+layout.server.ts"
|
"src/routes/+layout.server.ts"
|
||||||
],
|
],
|
||||||
|
"/api/files/[...path]": [
|
||||||
|
"src/routes/api/files/[...path]/+server.ts"
|
||||||
|
],
|
||||||
"/items": [
|
"/items": [
|
||||||
"src/routes/items/+page.server.ts",
|
"src/routes/items/+page.server.ts",
|
||||||
"src/routes/+layout.ts",
|
"src/routes/+layout.ts",
|
||||||
|
|||||||
+7
-1
@@ -17,7 +17,13 @@ type PageParentData = EnsureDefined<import('../../$types.js').LayoutData>;
|
|||||||
export type EntryGenerator = () => Promise<Array<RouteParams>> | Array<RouteParams>;
|
export type EntryGenerator = () => Promise<Array<RouteParams>> | Array<RouteParams>;
|
||||||
export type PageServerLoad<OutputData extends OutputDataShape<PageServerParentData> = OutputDataShape<PageServerParentData>> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData, RouteId>;
|
export type PageServerLoad<OutputData extends OutputDataShape<PageServerParentData> = OutputDataShape<PageServerParentData>> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData, RouteId>;
|
||||||
export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
|
export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
|
||||||
export type ActionData = unknown;
|
type ExcludeActionFailure<T> = T extends Kit.ActionFailure<any> ? never : T extends void ? never : T;
|
||||||
|
type ActionsSuccess<T extends Record<string, (...args: any) => any>> = { [Key in keyof T]: ExcludeActionFailure<Awaited<ReturnType<T[Key]>>>; }[keyof T];
|
||||||
|
type ExtractActionFailure<T> = T extends Kit.ActionFailure<infer X> ? X extends void ? never : X : never;
|
||||||
|
type ActionsFailure<T extends Record<string, (...args: any) => any>> = { [Key in keyof T]: Exclude<ExtractActionFailure<Awaited<ReturnType<T[Key]>>>, void>; }[keyof T];
|
||||||
|
type ActionsExport = typeof import('./proxy+page.server.js').actions
|
||||||
|
export type SubmitFunction = Kit.SubmitFunction<Expand<ActionsSuccess<ActionsExport>>, Expand<ActionsFailure<ActionsExport>>>
|
||||||
|
export type ActionData = Expand<Kit.AwaitedActions<ActionsExport>> | null;
|
||||||
export type PageServerData = Expand<OptionalUnion<EnsureDefined<Kit.LoadProperties<Awaited<ReturnType<typeof import('./proxy+page.server.js').load>>>>>>;
|
export type PageServerData = Expand<OptionalUnion<EnsureDefined<Kit.LoadProperties<Awaited<ReturnType<typeof import('./proxy+page.server.js').load>>>>>>;
|
||||||
export type PageData = Expand<Omit<PageParentData, keyof PageServerData> & EnsureDefined<PageServerData>>;
|
export type PageData = Expand<Omit<PageParentData, keyof PageServerData> & EnsureDefined<PageServerData>>;
|
||||||
export type Action<OutputData extends Record<string, any> | void = Record<string, any> | void> = Kit.Action<RouteParams, OutputData, RouteId>
|
export type Action<OutputData extends Record<string, any> | void = Record<string, any> | void> = Kit.Action<RouteParams, OutputData, RouteId>
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"barcode-detector-api-polyfill": "^1.0.20",
|
"barcode-detector-api-polyfill": "^1.0.20",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"heic-convert": "^2.1.0",
|
||||||
|
"heic2any": "^0.0.4",
|
||||||
"pocketbase": "^0.26.0",
|
"pocketbase": "^0.26.0",
|
||||||
"tailwind-merge": "^3.0.0",
|
"tailwind-merge": "^3.0.0",
|
||||||
},
|
},
|
||||||
@@ -595,6 +597,12 @@
|
|||||||
|
|
||||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||||
|
|
||||||
|
"heic-convert": ["heic-convert@2.1.0", "", { "dependencies": { "heic-decode": "^2.0.0", "jpeg-js": "^0.4.4", "pngjs": "^6.0.0" } }, "sha512-1qDuRvEHifTVAj3pFIgkqGgJIr0M3X7cxEPjEp0oG4mo8GFjq99DpCo8Eg3kg17Cy0MTjxpFdoBHOatj7ZVKtg=="],
|
||||||
|
|
||||||
|
"heic-decode": ["heic-decode@2.1.0", "", { "dependencies": { "libheif-js": "^1.19.8" } }, "sha512-0fB3O3WMk38+PScbHLVp66jcNhsZ/ErtQ6u2lMYu/YxXgbBtl+oKOhGQHa4RpvE68k8IzbWkABzHnyAIjR758A=="],
|
||||||
|
|
||||||
|
"heic2any": ["heic2any@0.0.4", "", {}, "sha512-3lLnZiDELfabVH87htnRolZ2iehX9zwpRyGNz22GKXIu0fznlblf0/ftppXKNqS26dqFSeqfIBhAmAj/uSp0cA=="],
|
||||||
|
|
||||||
"idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="],
|
"idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="],
|
||||||
|
|
||||||
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
|
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
|
||||||
@@ -667,6 +675,8 @@
|
|||||||
|
|
||||||
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
||||||
|
|
||||||
|
"jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="],
|
||||||
|
|
||||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||||
|
|
||||||
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
||||||
@@ -687,6 +697,8 @@
|
|||||||
|
|
||||||
"leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
|
"leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
|
||||||
|
|
||||||
|
"libheif-js": ["libheif-js@1.19.8", "", {}, "sha512-vQJWusIxO7wavpON1dusciL8Go9jsIQ+EUrckauFYAiSTjcmLAsuJh3SszLpvkwPci3JcL41ek2n+LUZGFpPIQ=="],
|
||||||
|
|
||||||
"lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
|
"lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
|
||||||
|
|
||||||
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
|
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
|
||||||
@@ -761,6 +773,8 @@
|
|||||||
|
|
||||||
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||||
|
|
||||||
|
"pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="],
|
||||||
|
|
||||||
"pocketbase": ["pocketbase@0.26.8", "", {}, "sha512-aQ/ewvS7ncvAE8wxoW10iAZu6ElgbeFpBhKPnCfvRovNzm2gW8u/sQNPGN6vNgVEagz44kK//C61oKjfa+7Low=="],
|
"pocketbase": ["pocketbase@0.26.8", "", {}, "sha512-aQ/ewvS7ncvAE8wxoW10iAZu6ElgbeFpBhKPnCfvRovNzm2gW8u/sQNPGN6vNgVEagz44kK//C61oKjfa+7Low=="],
|
||||||
|
|
||||||
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
|
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
Icon_default
|
Icon_default
|
||||||
} from "./chunk-6EUZYYI5.js";
|
} from "./chunk-MR7TRD3U.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
check_target,
|
check_target,
|
||||||
hmr,
|
hmr,
|
||||||
@@ -9,12 +10,11 @@ import {
|
|||||||
snippet,
|
snippet,
|
||||||
spread_props,
|
spread_props,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment
|
comment
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -23,11 +23,11 @@ import {
|
|||||||
noop,
|
noop,
|
||||||
pop,
|
pop,
|
||||||
push
|
push
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/icons/check.svelte
|
// node_modules/@lucide/svelte/dist/icons/check.svelte
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
Icon_default
|
Icon_default
|
||||||
} from "./chunk-6EUZYYI5.js";
|
} from "./chunk-MR7TRD3U.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
check_target,
|
check_target,
|
||||||
hmr,
|
hmr,
|
||||||
@@ -9,12 +10,11 @@ import {
|
|||||||
snippet,
|
snippet,
|
||||||
spread_props,
|
spread_props,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment
|
comment
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -23,11 +23,11 @@ import {
|
|||||||
noop,
|
noop,
|
||||||
pop,
|
pop,
|
||||||
push
|
push
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
|
// node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
Icon_default
|
Icon_default
|
||||||
} from "./chunk-6EUZYYI5.js";
|
} from "./chunk-MR7TRD3U.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
check_target,
|
check_target,
|
||||||
hmr,
|
hmr,
|
||||||
@@ -9,12 +10,11 @@ import {
|
|||||||
snippet,
|
snippet,
|
||||||
spread_props,
|
spread_props,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment
|
comment
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -23,11 +23,11 @@ import {
|
|||||||
noop,
|
noop,
|
||||||
pop,
|
pop,
|
||||||
push
|
push
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/icons/circle.svelte
|
// node_modules/@lucide/svelte/dist/icons/circle.svelte
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
Icon_default
|
Icon_default
|
||||||
} from "./chunk-6EUZYYI5.js";
|
} from "./chunk-MR7TRD3U.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
check_target,
|
check_target,
|
||||||
hmr,
|
hmr,
|
||||||
@@ -9,12 +10,11 @@ import {
|
|||||||
snippet,
|
snippet,
|
||||||
spread_props,
|
spread_props,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment
|
comment
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -23,11 +23,11 @@ import {
|
|||||||
noop,
|
noop,
|
||||||
pop,
|
pop,
|
||||||
push
|
push
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/icons/minus.svelte
|
// node_modules/@lucide/svelte/dist/icons/minus.svelte
|
||||||
|
|||||||
+6
-6
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
Icon_default
|
Icon_default
|
||||||
} from "./chunk-6EUZYYI5.js";
|
} from "./chunk-MR7TRD3U.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
check_target,
|
check_target,
|
||||||
hmr,
|
hmr,
|
||||||
@@ -9,12 +10,11 @@ import {
|
|||||||
snippet,
|
snippet,
|
||||||
spread_props,
|
spread_props,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment
|
comment
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -23,11 +23,11 @@ import {
|
|||||||
noop,
|
noop,
|
||||||
pop,
|
pop,
|
||||||
push
|
push
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/icons/x.svelte
|
// node_modules/@lucide/svelte/dist/icons/x.svelte
|
||||||
|
|||||||
+72
-60
@@ -1,229 +1,241 @@
|
|||||||
{
|
{
|
||||||
"hash": "6372abc7",
|
"hash": "e1b6cade",
|
||||||
"configHash": "441370a6",
|
"configHash": "441370a6",
|
||||||
"lockfileHash": "43c145e9",
|
"lockfileHash": "9401e68b",
|
||||||
"browserHash": "583ba445",
|
"browserHash": "04aeb2a4",
|
||||||
"optimized": {
|
"optimized": {
|
||||||
"svelte": {
|
"svelte": {
|
||||||
"src": "../../svelte/src/index-client.js",
|
"src": "../../svelte/src/index-client.js",
|
||||||
"file": "svelte.js",
|
"file": "svelte.js",
|
||||||
"fileHash": "b620c7b2",
|
"fileHash": "1ddbf175",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/animate": {
|
"svelte/animate": {
|
||||||
"src": "../../svelte/src/animate/index.js",
|
"src": "../../svelte/src/animate/index.js",
|
||||||
"file": "svelte_animate.js",
|
"file": "svelte_animate.js",
|
||||||
"fileHash": "02f610c1",
|
"fileHash": "d9d56906",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/attachments": {
|
"svelte/attachments": {
|
||||||
"src": "../../svelte/src/attachments/index.js",
|
"src": "../../svelte/src/attachments/index.js",
|
||||||
"file": "svelte_attachments.js",
|
"file": "svelte_attachments.js",
|
||||||
"fileHash": "aa2fd54c",
|
"fileHash": "c15aecdf",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/easing": {
|
"svelte/easing": {
|
||||||
"src": "../../svelte/src/easing/index.js",
|
"src": "../../svelte/src/easing/index.js",
|
||||||
"file": "svelte_easing.js",
|
"file": "svelte_easing.js",
|
||||||
"fileHash": "0f0d888b",
|
"fileHash": "e5864893",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/internal": {
|
"svelte/internal": {
|
||||||
"src": "../../svelte/src/internal/index.js",
|
"src": "../../svelte/src/internal/index.js",
|
||||||
"file": "svelte_internal.js",
|
"file": "svelte_internal.js",
|
||||||
"fileHash": "ae1c44b6",
|
"fileHash": "adeb43af",
|
||||||
"needsInterop": true
|
"needsInterop": true
|
||||||
},
|
},
|
||||||
"svelte/internal/client": {
|
"svelte/internal/client": {
|
||||||
"src": "../../svelte/src/internal/client/index.js",
|
"src": "../../svelte/src/internal/client/index.js",
|
||||||
"file": "svelte_internal_client.js",
|
"file": "svelte_internal_client.js",
|
||||||
"fileHash": "9548cc44",
|
"fileHash": "a252d832",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/internal/disclose-version": {
|
"svelte/internal/disclose-version": {
|
||||||
"src": "../../svelte/src/internal/disclose-version.js",
|
"src": "../../svelte/src/internal/disclose-version.js",
|
||||||
"file": "svelte_internal_disclose-version.js",
|
"file": "svelte_internal_disclose-version.js",
|
||||||
"fileHash": "523d7d1e",
|
"fileHash": "4acec545",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/internal/flags/async": {
|
"svelte/internal/flags/async": {
|
||||||
"src": "../../svelte/src/internal/flags/async.js",
|
"src": "../../svelte/src/internal/flags/async.js",
|
||||||
"file": "svelte_internal_flags_async.js",
|
"file": "svelte_internal_flags_async.js",
|
||||||
"fileHash": "69240c49",
|
"fileHash": "cb994494",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/internal/flags/legacy": {
|
"svelte/internal/flags/legacy": {
|
||||||
"src": "../../svelte/src/internal/flags/legacy.js",
|
"src": "../../svelte/src/internal/flags/legacy.js",
|
||||||
"file": "svelte_internal_flags_legacy.js",
|
"file": "svelte_internal_flags_legacy.js",
|
||||||
"fileHash": "4a2d0680",
|
"fileHash": "76de734a",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/internal/flags/tracing": {
|
"svelte/internal/flags/tracing": {
|
||||||
"src": "../../svelte/src/internal/flags/tracing.js",
|
"src": "../../svelte/src/internal/flags/tracing.js",
|
||||||
"file": "svelte_internal_flags_tracing.js",
|
"file": "svelte_internal_flags_tracing.js",
|
||||||
"fileHash": "65275630",
|
"fileHash": "945a287e",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/legacy": {
|
"svelte/legacy": {
|
||||||
"src": "../../svelte/src/legacy/legacy-client.js",
|
"src": "../../svelte/src/legacy/legacy-client.js",
|
||||||
"file": "svelte_legacy.js",
|
"file": "svelte_legacy.js",
|
||||||
"fileHash": "753552cd",
|
"fileHash": "d42e96f3",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/motion": {
|
"svelte/motion": {
|
||||||
"src": "../../svelte/src/motion/index.js",
|
"src": "../../svelte/src/motion/index.js",
|
||||||
"file": "svelte_motion.js",
|
"file": "svelte_motion.js",
|
||||||
"fileHash": "1405f1f5",
|
"fileHash": "d899f28f",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/reactivity": {
|
"svelte/reactivity": {
|
||||||
"src": "../../svelte/src/reactivity/index-client.js",
|
"src": "../../svelte/src/reactivity/index-client.js",
|
||||||
"file": "svelte_reactivity.js",
|
"file": "svelte_reactivity.js",
|
||||||
"fileHash": "a6ac2ac8",
|
"fileHash": "78a01aef",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/reactivity/window": {
|
"svelte/reactivity/window": {
|
||||||
"src": "../../svelte/src/reactivity/window/index.js",
|
"src": "../../svelte/src/reactivity/window/index.js",
|
||||||
"file": "svelte_reactivity_window.js",
|
"file": "svelte_reactivity_window.js",
|
||||||
"fileHash": "25337be5",
|
"fileHash": "8e4d19b4",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/store": {
|
"svelte/store": {
|
||||||
"src": "../../svelte/src/store/index-client.js",
|
"src": "../../svelte/src/store/index-client.js",
|
||||||
"file": "svelte_store.js",
|
"file": "svelte_store.js",
|
||||||
"fileHash": "0bb2bc3e",
|
"fileHash": "daa71f26",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/transition": {
|
"svelte/transition": {
|
||||||
"src": "../../svelte/src/transition/index.js",
|
"src": "../../svelte/src/transition/index.js",
|
||||||
"file": "svelte_transition.js",
|
"file": "svelte_transition.js",
|
||||||
"fileHash": "0c13897c",
|
"fileHash": "2ba3c5f3",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte/events": {
|
"svelte/events": {
|
||||||
"src": "../../svelte/src/events/index.js",
|
"src": "../../svelte/src/events/index.js",
|
||||||
"file": "svelte_events.js",
|
"file": "svelte_events.js",
|
||||||
"fileHash": "8e64c629",
|
"fileHash": "4f1aa8f8",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"svelte > clsx": {
|
"svelte > clsx": {
|
||||||
"src": "../../clsx/dist/clsx.mjs",
|
"src": "../../clsx/dist/clsx.mjs",
|
||||||
"file": "svelte___clsx.js",
|
"file": "svelte___clsx.js",
|
||||||
"fileHash": "a1e066f0",
|
"fileHash": "dd6a46d5",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"@lucide/svelte/icons/check": {
|
"@lucide/svelte/icons/check": {
|
||||||
"src": "../../@lucide/svelte/dist/icons/check.js",
|
"src": "../../@lucide/svelte/dist/icons/check.js",
|
||||||
"file": "@lucide_svelte_icons_check.js",
|
"file": "@lucide_svelte_icons_check.js",
|
||||||
"fileHash": "891b74d4",
|
"fileHash": "aed21143",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"@lucide/svelte/icons/chevron-right": {
|
"@lucide/svelte/icons/chevron-right": {
|
||||||
"src": "../../@lucide/svelte/dist/icons/chevron-right.js",
|
"src": "../../@lucide/svelte/dist/icons/chevron-right.js",
|
||||||
"file": "@lucide_svelte_icons_chevron-right.js",
|
"file": "@lucide_svelte_icons_chevron-right.js",
|
||||||
"fileHash": "63648db9",
|
"fileHash": "fad53529",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"@lucide/svelte/icons/circle": {
|
"@lucide/svelte/icons/circle": {
|
||||||
"src": "../../@lucide/svelte/dist/icons/circle.js",
|
"src": "../../@lucide/svelte/dist/icons/circle.js",
|
||||||
"file": "@lucide_svelte_icons_circle.js",
|
"file": "@lucide_svelte_icons_circle.js",
|
||||||
"fileHash": "11e4822b",
|
"fileHash": "bf331329",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"@lucide/svelte/icons/minus": {
|
"@lucide/svelte/icons/minus": {
|
||||||
"src": "../../@lucide/svelte/dist/icons/minus.js",
|
"src": "../../@lucide/svelte/dist/icons/minus.js",
|
||||||
"file": "@lucide_svelte_icons_minus.js",
|
"file": "@lucide_svelte_icons_minus.js",
|
||||||
"fileHash": "30cf92e4",
|
"fileHash": "c3ee1ff6",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"@lucide/svelte/icons/x": {
|
"@lucide/svelte/icons/x": {
|
||||||
"src": "../../@lucide/svelte/dist/icons/x.js",
|
"src": "../../@lucide/svelte/dist/icons/x.js",
|
||||||
"file": "@lucide_svelte_icons_x.js",
|
"file": "@lucide_svelte_icons_x.js",
|
||||||
"fileHash": "aa690a02",
|
"fileHash": "e411e45f",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"barcode-detector-api-polyfill": {
|
"barcode-detector-api-polyfill": {
|
||||||
"src": "../../barcode-detector-api-polyfill/esm/index.js",
|
"src": "../../barcode-detector-api-polyfill/esm/index.js",
|
||||||
"file": "barcode-detector-api-polyfill.js",
|
"file": "barcode-detector-api-polyfill.js",
|
||||||
"fileHash": "55497bad",
|
"fileHash": "6c03744a",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"bits-ui": {
|
"bits-ui": {
|
||||||
"src": "../../bits-ui/dist/index.js",
|
"src": "../../bits-ui/dist/index.js",
|
||||||
"file": "bits-ui.js",
|
"file": "bits-ui.js",
|
||||||
"fileHash": "1d3c3c46",
|
"fileHash": "4faefbe8",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"clsx": {
|
"clsx": {
|
||||||
"src": "../../clsx/dist/clsx.mjs",
|
"src": "../../clsx/dist/clsx.mjs",
|
||||||
"file": "clsx.js",
|
"file": "clsx.js",
|
||||||
"fileHash": "b6a14292",
|
"fileHash": "41f586d2",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"devalue": {
|
"devalue": {
|
||||||
"src": "../../devalue/index.js",
|
"src": "../../devalue/index.js",
|
||||||
"file": "devalue.js",
|
"file": "devalue.js",
|
||||||
"fileHash": "2ff911fe",
|
"fileHash": "3717d88b",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"esm-env": {
|
"esm-env": {
|
||||||
"src": "../../esm-env/index.js",
|
"src": "../../esm-env/index.js",
|
||||||
"file": "esm-env.js",
|
"file": "esm-env.js",
|
||||||
"fileHash": "5a410efb",
|
"fileHash": "d7bf04c9",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"pocketbase": {
|
"pocketbase": {
|
||||||
"src": "../../pocketbase/dist/pocketbase.es.mjs",
|
"src": "../../pocketbase/dist/pocketbase.es.mjs",
|
||||||
"file": "pocketbase.js",
|
"file": "pocketbase.js",
|
||||||
"fileHash": "9e68746a",
|
"fileHash": "8025416e",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"tailwind-merge": {
|
"tailwind-merge": {
|
||||||
"src": "../../tailwind-merge/dist/bundle-mjs.mjs",
|
"src": "../../tailwind-merge/dist/bundle-mjs.mjs",
|
||||||
"file": "tailwind-merge.js",
|
"file": "tailwind-merge.js",
|
||||||
"fileHash": "d8639500",
|
"fileHash": "f66be4a7",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
},
|
},
|
||||||
"tailwind-variants": {
|
"tailwind-variants": {
|
||||||
"src": "../../tailwind-variants/dist/index.js",
|
"src": "../../tailwind-variants/dist/index.js",
|
||||||
"file": "tailwind-variants.js",
|
"file": "tailwind-variants.js",
|
||||||
"fileHash": "cf2013f5",
|
"fileHash": "b33ed3b9",
|
||||||
|
"needsInterop": false
|
||||||
|
},
|
||||||
|
"@lucide/svelte/icons/chevron-down": {
|
||||||
|
"src": "../../@lucide/svelte/dist/icons/chevron-down.js",
|
||||||
|
"file": "@lucide_svelte_icons_chevron-down.js",
|
||||||
|
"fileHash": "dfeee67b",
|
||||||
|
"needsInterop": false
|
||||||
|
},
|
||||||
|
"@lucide/svelte/icons/chevron-up": {
|
||||||
|
"src": "../../@lucide/svelte/dist/icons/chevron-up.js",
|
||||||
|
"file": "@lucide_svelte_icons_chevron-up.js",
|
||||||
|
"fileHash": "dda66014",
|
||||||
"needsInterop": false
|
"needsInterop": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chunks": {
|
"chunks": {
|
||||||
"chunk-6EUZYYI5": {
|
|
||||||
"file": "chunk-6EUZYYI5.js"
|
|
||||||
},
|
|
||||||
"chunk-HRPYXN4O": {
|
"chunk-HRPYXN4O": {
|
||||||
"file": "chunk-HRPYXN4O.js"
|
"file": "chunk-HRPYXN4O.js"
|
||||||
},
|
},
|
||||||
"chunk-MZVN5SDE": {
|
|
||||||
"file": "chunk-MZVN5SDE.js"
|
|
||||||
},
|
|
||||||
"chunk-EZEETTA4": {
|
|
||||||
"file": "chunk-EZEETTA4.js"
|
|
||||||
},
|
|
||||||
"chunk-3TACVO2P": {
|
|
||||||
"file": "chunk-3TACVO2P.js"
|
|
||||||
},
|
|
||||||
"chunk-7RQDXF5S": {
|
|
||||||
"file": "chunk-7RQDXF5S.js"
|
|
||||||
},
|
|
||||||
"chunk-YERFD2CZ": {
|
"chunk-YERFD2CZ": {
|
||||||
"file": "chunk-YERFD2CZ.js"
|
"file": "chunk-YERFD2CZ.js"
|
||||||
},
|
},
|
||||||
"chunk-EXK7SDUS": {
|
"chunk-GBET5VCG": {
|
||||||
"file": "chunk-EXK7SDUS.js"
|
"file": "chunk-GBET5VCG.js"
|
||||||
},
|
},
|
||||||
"chunk-U7P2NEEE": {
|
"chunk-YSF5ZXQP": {
|
||||||
"file": "chunk-U7P2NEEE.js"
|
"file": "chunk-YSF5ZXQP.js"
|
||||||
},
|
},
|
||||||
"chunk-57IKBECK": {
|
"chunk-7RQDXF5S": {
|
||||||
"file": "chunk-57IKBECK.js"
|
"file": "chunk-7RQDXF5S.js"
|
||||||
},
|
},
|
||||||
"chunk-JC3VXQM7": {
|
"chunk-MZVN5SDE": {
|
||||||
"file": "chunk-JC3VXQM7.js"
|
"file": "chunk-MZVN5SDE.js"
|
||||||
|
},
|
||||||
|
"chunk-MR7TRD3U": {
|
||||||
|
"file": "chunk-MR7TRD3U.js"
|
||||||
|
},
|
||||||
|
"chunk-2LGM3QYM": {
|
||||||
|
"file": "chunk-2LGM3QYM.js"
|
||||||
|
},
|
||||||
|
"chunk-LDPLLRRU": {
|
||||||
|
"file": "chunk-LDPLLRRU.js"
|
||||||
|
},
|
||||||
|
"chunk-UKTTYZCO": {
|
||||||
|
"file": "chunk-UKTTYZCO.js"
|
||||||
|
},
|
||||||
|
"chunk-UWLXLUJC": {
|
||||||
|
"file": "chunk-UWLXLUJC.js"
|
||||||
},
|
},
|
||||||
"chunk-XWATFG4W": {
|
"chunk-XWATFG4W": {
|
||||||
"file": "chunk-XWATFG4W.js"
|
"file": "chunk-XWATFG4W.js"
|
||||||
@@ -231,12 +243,12 @@
|
|||||||
"chunk-HNWPC2PS": {
|
"chunk-HNWPC2PS": {
|
||||||
"file": "chunk-HNWPC2PS.js"
|
"file": "chunk-HNWPC2PS.js"
|
||||||
},
|
},
|
||||||
"chunk-2LGM3QYM": {
|
|
||||||
"file": "chunk-2LGM3QYM.js"
|
|
||||||
},
|
|
||||||
"chunk-OHYQYV5R": {
|
"chunk-OHYQYV5R": {
|
||||||
"file": "chunk-OHYQYV5R.js"
|
"file": "chunk-OHYQYV5R.js"
|
||||||
},
|
},
|
||||||
|
"chunk-U7P2NEEE": {
|
||||||
|
"file": "chunk-U7P2NEEE.js"
|
||||||
|
},
|
||||||
"chunk-X4VJQ2O3": {
|
"chunk-X4VJQ2O3": {
|
||||||
"file": "chunk-X4VJQ2O3.js"
|
"file": "chunk-X4VJQ2O3.js"
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-10
@@ -1,9 +1,10 @@
|
|||||||
import "./chunk-MZVN5SDE.js";
|
|
||||||
import {
|
import {
|
||||||
SvelteMap
|
SvelteMap
|
||||||
} from "./chunk-EZEETTA4.js";
|
} from "./chunk-GBET5VCG.js";
|
||||||
import "./chunk-3TACVO2P.js";
|
import "./chunk-YSF5ZXQP.js";
|
||||||
import "./chunk-7RQDXF5S.js";
|
import "./chunk-7RQDXF5S.js";
|
||||||
|
import "./chunk-MZVN5SDE.js";
|
||||||
|
import "./chunk-2LGM3QYM.js";
|
||||||
import {
|
import {
|
||||||
add_locations,
|
add_locations,
|
||||||
append_styles,
|
append_styles,
|
||||||
@@ -38,10 +39,7 @@ import {
|
|||||||
validate_snippet_args,
|
validate_snippet_args,
|
||||||
validate_void_dynamic_element,
|
validate_void_dynamic_element,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import {
|
|
||||||
clsx
|
|
||||||
} from "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment,
|
comment,
|
||||||
@@ -52,7 +50,7 @@ import {
|
|||||||
set_text,
|
set_text,
|
||||||
text,
|
text,
|
||||||
unmount
|
unmount
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
FILENAME,
|
FILENAME,
|
||||||
HMR,
|
HMR,
|
||||||
@@ -88,13 +86,15 @@ import {
|
|||||||
user_derived,
|
user_derived,
|
||||||
user_effect,
|
user_effect,
|
||||||
user_pre_effect
|
user_pre_effect
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import {
|
import {
|
||||||
true_default
|
true_default
|
||||||
} from "./chunk-HNWPC2PS.js";
|
} from "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-2LGM3QYM.js";
|
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import {
|
||||||
|
clsx
|
||||||
|
} from "./chunk-U7P2NEEE.js";
|
||||||
import {
|
import {
|
||||||
__export,
|
__export,
|
||||||
__privateAdd,
|
__privateAdd,
|
||||||
|
|||||||
-35
@@ -1,35 +0,0 @@
|
|||||||
import {
|
|
||||||
createSubscriber
|
|
||||||
} from "./chunk-JC3VXQM7.js";
|
|
||||||
import {
|
|
||||||
__privateAdd,
|
|
||||||
__privateGet,
|
|
||||||
__privateSet
|
|
||||||
} from "./chunk-X4VJQ2O3.js";
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/reactive-value.js
|
|
||||||
var _fn, _subscribe;
|
|
||||||
var ReactiveValue = class {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {() => T} fn
|
|
||||||
* @param {(update: () => void) => void} onsubscribe
|
|
||||||
*/
|
|
||||||
constructor(fn, onsubscribe) {
|
|
||||||
__privateAdd(this, _fn);
|
|
||||||
__privateAdd(this, _subscribe);
|
|
||||||
__privateSet(this, _fn, fn);
|
|
||||||
__privateSet(this, _subscribe, createSubscriber(onsubscribe));
|
|
||||||
}
|
|
||||||
get current() {
|
|
||||||
__privateGet(this, _subscribe).call(this);
|
|
||||||
return __privateGet(this, _fn).call(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_fn = new WeakMap();
|
|
||||||
_subscribe = new WeakMap();
|
|
||||||
|
|
||||||
export {
|
|
||||||
ReactiveValue
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=chunk-3TACVO2P.js.map
|
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"sources": ["../../svelte/src/reactivity/reactive-value.js"],
|
|
||||||
"sourcesContent": ["import { createSubscriber } from './create-subscriber.js';\n\n/**\n * @template T\n */\nexport class ReactiveValue {\n\t#fn;\n\t#subscribe;\n\n\t/**\n\t *\n\t * @param {() => T} fn\n\t * @param {(update: () => void) => void} onsubscribe\n\t */\n\tconstructor(fn, onsubscribe) {\n\t\tthis.#fn = fn;\n\t\tthis.#subscribe = createSubscriber(onsubscribe);\n\t}\n\n\tget current() {\n\t\tthis.#subscribe();\n\t\treturn this.#fn();\n\t}\n}\n"],
|
|
||||||
"mappings": ";;;;;;;;;;AAAA;AAKO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1B,YAAY,IAAI,aAAa;AAR7B;AACA;AAQC,uBAAK,KAAM;AACX,uBAAK,YAAa,iBAAiB,WAAW;AAAA,EAC/C;AAAA,EAEA,IAAI,UAAU;AACb,uBAAK,YAAL;AACA,WAAO,mBAAK,KAAL;AAAA,EACR;AACD;AAjBC;AACA;",
|
|
||||||
"names": []
|
|
||||||
}
|
|
||||||
-1017
File diff suppressed because it is too large
Load Diff
-7
File diff suppressed because one or more lines are too long
-188
@@ -1,188 +0,0 @@
|
|||||||
import {
|
|
||||||
add_locations,
|
|
||||||
attribute_effect,
|
|
||||||
check_target,
|
|
||||||
each,
|
|
||||||
element,
|
|
||||||
hmr,
|
|
||||||
index,
|
|
||||||
legacy_api,
|
|
||||||
prop,
|
|
||||||
rest_props,
|
|
||||||
snippet,
|
|
||||||
validate_dynamic_element_tag
|
|
||||||
} from "./chunk-EXK7SDUS.js";
|
|
||||||
import {
|
|
||||||
append,
|
|
||||||
comment,
|
|
||||||
from_svg
|
|
||||||
} from "./chunk-57IKBECK.js";
|
|
||||||
import {
|
|
||||||
FILENAME,
|
|
||||||
HMR,
|
|
||||||
add_svelte_meta,
|
|
||||||
child,
|
|
||||||
first_child,
|
|
||||||
get,
|
|
||||||
noop,
|
|
||||||
pop,
|
|
||||||
push,
|
|
||||||
reset,
|
|
||||||
sibling,
|
|
||||||
to_array,
|
|
||||||
user_derived
|
|
||||||
} from "./chunk-JC3VXQM7.js";
|
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/defaultAttributes.js
|
|
||||||
var defaultAttributes = {
|
|
||||||
xmlns: "http://www.w3.org/2000/svg",
|
|
||||||
width: 24,
|
|
||||||
height: 24,
|
|
||||||
viewBox: "0 0 24 24",
|
|
||||||
fill: "none",
|
|
||||||
stroke: "currentColor",
|
|
||||||
"stroke-width": 2,
|
|
||||||
"stroke-linecap": "round",
|
|
||||||
"stroke-linejoin": "round"
|
|
||||||
};
|
|
||||||
var defaultAttributes_default = defaultAttributes;
|
|
||||||
|
|
||||||
// node_modules/@lucide/svelte/dist/Icon.svelte
|
|
||||||
Icon[FILENAME] = "node_modules/@lucide/svelte/dist/Icon.svelte";
|
|
||||||
var root = add_locations(from_svg(`<svg><!><!></svg>`), Icon[FILENAME], [[5, 0]]);
|
|
||||||
function Icon($$anchor, $$props) {
|
|
||||||
check_target(new.target);
|
|
||||||
push($$props, true, Icon);
|
|
||||||
const color = prop($$props, "color", 3, "currentColor"), size = prop($$props, "size", 3, 24), strokeWidth = prop($$props, "strokeWidth", 3, 2), absoluteStrokeWidth = prop($$props, "absoluteStrokeWidth", 3, false), iconNode = prop($$props, "iconNode", 19, () => []), props = rest_props(
|
|
||||||
$$props,
|
|
||||||
[
|
|
||||||
"$$slots",
|
|
||||||
"$$events",
|
|
||||||
"$$legacy",
|
|
||||||
"name",
|
|
||||||
"color",
|
|
||||||
"size",
|
|
||||||
"strokeWidth",
|
|
||||||
"absoluteStrokeWidth",
|
|
||||||
"iconNode",
|
|
||||||
"children"
|
|
||||||
],
|
|
||||||
"props"
|
|
||||||
);
|
|
||||||
var $$exports = { ...legacy_api() };
|
|
||||||
var svg = root();
|
|
||||||
attribute_effect(
|
|
||||||
svg,
|
|
||||||
($0) => ({
|
|
||||||
...defaultAttributes_default,
|
|
||||||
...props,
|
|
||||||
width: size(),
|
|
||||||
height: size(),
|
|
||||||
stroke: color(),
|
|
||||||
"stroke-width": $0,
|
|
||||||
class: [
|
|
||||||
"lucide-icon lucide",
|
|
||||||
$$props.name && `lucide-${$$props.name}`,
|
|
||||||
$$props.class
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
[
|
|
||||||
() => absoluteStrokeWidth() ? Number(strokeWidth()) * 24 / Number(size()) : strokeWidth()
|
|
||||||
]
|
|
||||||
);
|
|
||||||
var node = child(svg);
|
|
||||||
add_svelte_meta(
|
|
||||||
() => each(node, 17, iconNode, index, ($$anchor2, $$item) => {
|
|
||||||
var $$array = user_derived(() => to_array(get($$item), 2));
|
|
||||||
let tag = () => get($$array)[0];
|
|
||||||
tag();
|
|
||||||
let attrs = () => get($$array)[1];
|
|
||||||
attrs();
|
|
||||||
var fragment = comment();
|
|
||||||
var node_1 = first_child(fragment);
|
|
||||||
{
|
|
||||||
validate_dynamic_element_tag(tag);
|
|
||||||
element(
|
|
||||||
node_1,
|
|
||||||
tag,
|
|
||||||
true,
|
|
||||||
($$element, $$anchor3) => {
|
|
||||||
attribute_effect($$element, () => ({ ...attrs() }));
|
|
||||||
},
|
|
||||||
void 0,
|
|
||||||
[15, 4]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
append($$anchor2, fragment);
|
|
||||||
}),
|
|
||||||
"each",
|
|
||||||
Icon,
|
|
||||||
14,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
var node_2 = sibling(node);
|
|
||||||
add_svelte_meta(() => snippet(node_2, () => $$props.children ?? noop), "render", Icon, 20, 2);
|
|
||||||
reset(svg);
|
|
||||||
append($$anchor, svg);
|
|
||||||
return pop($$exports);
|
|
||||||
}
|
|
||||||
if (import.meta.hot) {
|
|
||||||
Icon = hmr(Icon);
|
|
||||||
import.meta.hot.accept((module) => {
|
|
||||||
Icon[HMR].update(module.default);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var Icon_default = Icon;
|
|
||||||
|
|
||||||
export {
|
|
||||||
Icon_default
|
|
||||||
};
|
|
||||||
/*! Bundled license information:
|
|
||||||
|
|
||||||
@lucide/svelte/dist/defaultAttributes.js:
|
|
||||||
(**
|
|
||||||
* @license @lucide/svelte v0.561.0 - ISC
|
|
||||||
*
|
|
||||||
* ISC License
|
|
||||||
*
|
|
||||||
* Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* ---
|
|
||||||
*
|
|
||||||
* The MIT License (MIT) (for portions derived from Feather)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2013-2023 Cole Bemis
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*
|
|
||||||
*)
|
|
||||||
*/
|
|
||||||
//# sourceMappingURL=chunk-6EUZYYI5.js.map
|
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 3,
|
|
||||||
"sources": ["../../@lucide/svelte/dist/defaultAttributes.js", "../../@lucide/svelte/dist/Icon.svelte"],
|
|
||||||
"sourcesContent": ["/**\n * @license @lucide/svelte v0.561.0 - ISC\n *\n * ISC License\n * \n * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2023 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2025.\n * \n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n * \n * ---\n * \n * The MIT License (MIT) (for portions derived from Feather)\n * \n * Copyright (c) 2013-2023 Cole Bemis\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\nconst defaultAttributes = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n};\nexport default defaultAttributes;\n", "<script lang=\"ts\">import defaultAttributes from './defaultAttributes.js';\nconst { name, color = 'currentColor', size = 24, strokeWidth = 2, absoluteStrokeWidth = false, iconNode = [], children, ...props } = $props();\n</script>\n\n<svg\n {...defaultAttributes}\n {...props}\n width={size}\n height={size}\n stroke={color}\n stroke-width={absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth}\n class={['lucide-icon lucide', name && `lucide-${name}`, props.class]}\n>\n {#each iconNode as [tag, attrs]}\n <svelte:element\n this={tag}\n {...attrs}\n />\n {/each}\n {@render children?.()}\n</svg>\n"],
|
|
||||||
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,IAAM,oBAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AACvB;AACA,IAAO,4BAAQ;;;;;iCCvDf;;;QACc,QAAK,KAAA,SAAA,SAAA,GAAG,cAAc,GAAE,OAAI,KAAA,SAAA,QAAA,GAAG,EAAE,GAAE,cAAW,KAAA,SAAA,eAAA,GAAG,CAAC,GAAE,sBAAmB,KAAA,SAAA,uBAAA,GAAG,KAAK,GAAE,WAAQ,KAAA,SAAA,YAAA,IAAA,MAAA,CAAA,CAAA,GAAoB,QAAK;;;;;;;;;;;;;;;;;MAG/H,MAAA,KAAA;;IAAA;;SACK;SACA;aACG,KAAI;cACH,KAAI;cACJ,MAAK;;;QAEL;;gBAAsD;;;;YADhD,oBAAmB,IAAI,OAAO,YAAW,CAAA,IAAI,KAAM,OAAO,KAAI,CAAA,IAAI,YAAW;;;mBAN5F,GAAA;;yBASQ,UAAQ,OAAA,CAAAA,WAAA,WAAA;;UAAK,MAAI,MAAA,IAAA,OAAA,EAAA,CAAA;;UAAC,QAAM,MAAA,IAAA,OAAA,EAAA,CAAA;;;;;qCAErB,GAAG;;;UAAH;;;oDACF,MAAK,EAAA,EAAA;;;;;;;;;;;;;;;QAZd,GAAA;mBAAA,GAAA;;AAFO;;;;;;;;",
|
|
||||||
"names": ["$$anchor"]
|
|
||||||
}
|
|
||||||
-4576
File diff suppressed because it is too large
Load Diff
-7
File diff suppressed because one or more lines are too long
-736
@@ -1,736 +0,0 @@
|
|||||||
import {
|
|
||||||
ReactiveValue
|
|
||||||
} from "./chunk-3TACVO2P.js";
|
|
||||||
import {
|
|
||||||
active_reaction,
|
|
||||||
get,
|
|
||||||
increment,
|
|
||||||
label,
|
|
||||||
on,
|
|
||||||
set,
|
|
||||||
set_active_reaction,
|
|
||||||
source,
|
|
||||||
state,
|
|
||||||
tag,
|
|
||||||
update_version,
|
|
||||||
user_derived
|
|
||||||
} from "./chunk-JC3VXQM7.js";
|
|
||||||
import {
|
|
||||||
true_default
|
|
||||||
} from "./chunk-HNWPC2PS.js";
|
|
||||||
import {
|
|
||||||
__privateAdd,
|
|
||||||
__privateGet,
|
|
||||||
__privateMethod,
|
|
||||||
__privateSet,
|
|
||||||
__superGet
|
|
||||||
} from "./chunk-X4VJQ2O3.js";
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/date.js
|
|
||||||
var inited = false;
|
|
||||||
var _time, _deriveds, _reaction, _SvelteDate_instances, init_fn;
|
|
||||||
var _SvelteDate = class _SvelteDate extends Date {
|
|
||||||
/** @param {any[]} params */
|
|
||||||
constructor(...params) {
|
|
||||||
super(...params);
|
|
||||||
__privateAdd(this, _SvelteDate_instances);
|
|
||||||
__privateAdd(this, _time, state(super.getTime()));
|
|
||||||
/** @type {Map<keyof Date, Source<unknown>>} */
|
|
||||||
__privateAdd(this, _deriveds, /* @__PURE__ */ new Map());
|
|
||||||
__privateAdd(this, _reaction, active_reaction);
|
|
||||||
if (true_default) {
|
|
||||||
tag(__privateGet(this, _time), "SvelteDate.#time");
|
|
||||||
}
|
|
||||||
if (!inited) __privateMethod(this, _SvelteDate_instances, init_fn).call(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_time = new WeakMap();
|
|
||||||
_deriveds = new WeakMap();
|
|
||||||
_reaction = new WeakMap();
|
|
||||||
_SvelteDate_instances = new WeakSet();
|
|
||||||
init_fn = function() {
|
|
||||||
inited = true;
|
|
||||||
var proto = _SvelteDate.prototype;
|
|
||||||
var date_proto = Date.prototype;
|
|
||||||
var methods = (
|
|
||||||
/** @type {Array<keyof Date & string>} */
|
|
||||||
Object.getOwnPropertyNames(date_proto)
|
|
||||||
);
|
|
||||||
for (const method of methods) {
|
|
||||||
if (method.startsWith("get") || method.startsWith("to") || method === "valueOf") {
|
|
||||||
proto[method] = function(...args) {
|
|
||||||
if (args.length > 0) {
|
|
||||||
get(__privateGet(this, _time));
|
|
||||||
return date_proto[method].apply(this, args);
|
|
||||||
}
|
|
||||||
var d = __privateGet(this, _deriveds).get(method);
|
|
||||||
if (d === void 0) {
|
|
||||||
const reaction = active_reaction;
|
|
||||||
set_active_reaction(__privateGet(this, _reaction));
|
|
||||||
d = user_derived(() => {
|
|
||||||
get(__privateGet(this, _time));
|
|
||||||
return date_proto[method].apply(this, args);
|
|
||||||
});
|
|
||||||
__privateGet(this, _deriveds).set(method, d);
|
|
||||||
set_active_reaction(reaction);
|
|
||||||
}
|
|
||||||
return get(d);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (method.startsWith("set")) {
|
|
||||||
proto[method] = function(...args) {
|
|
||||||
var result = date_proto[method].apply(this, args);
|
|
||||||
set(__privateGet(this, _time), date_proto.getTime.call(this));
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var SvelteDate = _SvelteDate;
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/set.js
|
|
||||||
var read_methods = ["forEach", "isDisjointFrom", "isSubsetOf", "isSupersetOf"];
|
|
||||||
var set_like_methods = ["difference", "intersection", "symmetricDifference", "union"];
|
|
||||||
var inited2 = false;
|
|
||||||
var _sources, _version, _size, _update_version, _SvelteSet_instances, source_fn, init_fn2;
|
|
||||||
var _SvelteSet = class _SvelteSet extends Set {
|
|
||||||
/**
|
|
||||||
* @param {Iterable<T> | null | undefined} [value]
|
|
||||||
*/
|
|
||||||
constructor(value) {
|
|
||||||
super();
|
|
||||||
__privateAdd(this, _SvelteSet_instances);
|
|
||||||
/** @type {Map<T, Source<boolean>>} */
|
|
||||||
__privateAdd(this, _sources, /* @__PURE__ */ new Map());
|
|
||||||
__privateAdd(this, _version, state(0));
|
|
||||||
__privateAdd(this, _size, state(0));
|
|
||||||
__privateAdd(this, _update_version, update_version || -1);
|
|
||||||
if (true_default) {
|
|
||||||
value = new Set(value);
|
|
||||||
tag(__privateGet(this, _version), "SvelteSet version");
|
|
||||||
tag(__privateGet(this, _size), "SvelteSet.size");
|
|
||||||
}
|
|
||||||
if (value) {
|
|
||||||
for (var element of value) {
|
|
||||||
super.add(element);
|
|
||||||
}
|
|
||||||
__privateGet(this, _size).v = super.size;
|
|
||||||
}
|
|
||||||
if (!inited2) __privateMethod(this, _SvelteSet_instances, init_fn2).call(this);
|
|
||||||
}
|
|
||||||
/** @param {T} value */
|
|
||||||
has(value) {
|
|
||||||
var has = super.has(value);
|
|
||||||
var sources = __privateGet(this, _sources);
|
|
||||||
var s = sources.get(value);
|
|
||||||
if (s === void 0) {
|
|
||||||
if (!has) {
|
|
||||||
get(__privateGet(this, _version));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s = __privateMethod(this, _SvelteSet_instances, source_fn).call(this, true);
|
|
||||||
if (true_default) {
|
|
||||||
tag(s, `SvelteSet has(${label(value)})`);
|
|
||||||
}
|
|
||||||
sources.set(value, s);
|
|
||||||
}
|
|
||||||
get(s);
|
|
||||||
return has;
|
|
||||||
}
|
|
||||||
/** @param {T} value */
|
|
||||||
add(value) {
|
|
||||||
if (!super.has(value)) {
|
|
||||||
super.add(value);
|
|
||||||
set(__privateGet(this, _size), super.size);
|
|
||||||
increment(__privateGet(this, _version));
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
/** @param {T} value */
|
|
||||||
delete(value) {
|
|
||||||
var deleted = super.delete(value);
|
|
||||||
var sources = __privateGet(this, _sources);
|
|
||||||
var s = sources.get(value);
|
|
||||||
if (s !== void 0) {
|
|
||||||
sources.delete(value);
|
|
||||||
set(s, false);
|
|
||||||
}
|
|
||||||
if (deleted) {
|
|
||||||
set(__privateGet(this, _size), super.size);
|
|
||||||
increment(__privateGet(this, _version));
|
|
||||||
}
|
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
clear() {
|
|
||||||
if (super.size === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.clear();
|
|
||||||
var sources = __privateGet(this, _sources);
|
|
||||||
for (var s of sources.values()) {
|
|
||||||
set(s, false);
|
|
||||||
}
|
|
||||||
sources.clear();
|
|
||||||
set(__privateGet(this, _size), 0);
|
|
||||||
increment(__privateGet(this, _version));
|
|
||||||
}
|
|
||||||
keys() {
|
|
||||||
return this.values();
|
|
||||||
}
|
|
||||||
values() {
|
|
||||||
get(__privateGet(this, _version));
|
|
||||||
return super.values();
|
|
||||||
}
|
|
||||||
entries() {
|
|
||||||
get(__privateGet(this, _version));
|
|
||||||
return super.entries();
|
|
||||||
}
|
|
||||||
[Symbol.iterator]() {
|
|
||||||
return this.keys();
|
|
||||||
}
|
|
||||||
get size() {
|
|
||||||
return get(__privateGet(this, _size));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_sources = new WeakMap();
|
|
||||||
_version = new WeakMap();
|
|
||||||
_size = new WeakMap();
|
|
||||||
_update_version = new WeakMap();
|
|
||||||
_SvelteSet_instances = new WeakSet();
|
|
||||||
/**
|
|
||||||
* If the source is being created inside the same reaction as the SvelteSet instance,
|
|
||||||
* we use `state` so that it will not be a dependency of the reaction. Otherwise we
|
|
||||||
* use `source` so it will be.
|
|
||||||
*
|
|
||||||
* @template T
|
|
||||||
* @param {T} value
|
|
||||||
* @returns {Source<T>}
|
|
||||||
*/
|
|
||||||
source_fn = function(value) {
|
|
||||||
return update_version === __privateGet(this, _update_version) ? state(value) : source(value);
|
|
||||||
};
|
|
||||||
// We init as part of the first instance so that we can treeshake this class
|
|
||||||
init_fn2 = function() {
|
|
||||||
inited2 = true;
|
|
||||||
var proto = _SvelteSet.prototype;
|
|
||||||
var set_proto = Set.prototype;
|
|
||||||
for (const method of read_methods) {
|
|
||||||
proto[method] = function(...v) {
|
|
||||||
get(__privateGet(this, _version));
|
|
||||||
return set_proto[method].apply(this, v);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
for (const method of set_like_methods) {
|
|
||||||
proto[method] = function(...v) {
|
|
||||||
get(__privateGet(this, _version));
|
|
||||||
var set2 = (
|
|
||||||
/** @type {Set<T>} */
|
|
||||||
set_proto[method].apply(this, v)
|
|
||||||
);
|
|
||||||
return new _SvelteSet(set2);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var SvelteSet = _SvelteSet;
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/map.js
|
|
||||||
var _sources2, _version2, _size2, _update_version2, _SvelteMap_instances, source_fn2, read_all_fn;
|
|
||||||
var _SvelteMap = class _SvelteMap extends Map {
|
|
||||||
/**
|
|
||||||
* @param {Iterable<readonly [K, V]> | null | undefined} [value]
|
|
||||||
*/
|
|
||||||
constructor(value) {
|
|
||||||
super();
|
|
||||||
__privateAdd(this, _SvelteMap_instances);
|
|
||||||
/** @type {Map<K, Source<number>>} */
|
|
||||||
__privateAdd(this, _sources2, /* @__PURE__ */ new Map());
|
|
||||||
__privateAdd(this, _version2, state(0));
|
|
||||||
__privateAdd(this, _size2, state(0));
|
|
||||||
__privateAdd(this, _update_version2, update_version || -1);
|
|
||||||
if (true_default) {
|
|
||||||
value = new Map(value);
|
|
||||||
tag(__privateGet(this, _version2), "SvelteMap version");
|
|
||||||
tag(__privateGet(this, _size2), "SvelteMap.size");
|
|
||||||
}
|
|
||||||
if (value) {
|
|
||||||
for (var [key, v] of value) {
|
|
||||||
super.set(key, v);
|
|
||||||
}
|
|
||||||
__privateGet(this, _size2).v = super.size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/** @param {K} key */
|
|
||||||
has(key) {
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
var s = sources.get(key);
|
|
||||||
if (s === void 0) {
|
|
||||||
var ret = super.get(key);
|
|
||||||
if (ret !== void 0) {
|
|
||||||
s = __privateMethod(this, _SvelteMap_instances, source_fn2).call(this, 0);
|
|
||||||
if (true_default) {
|
|
||||||
tag(s, `SvelteMap get(${label(key)})`);
|
|
||||||
}
|
|
||||||
sources.set(key, s);
|
|
||||||
} else {
|
|
||||||
get(__privateGet(this, _version2));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get(s);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {(value: V, key: K, map: Map<K, V>) => void} callbackfn
|
|
||||||
* @param {any} [this_arg]
|
|
||||||
*/
|
|
||||||
forEach(callbackfn, this_arg) {
|
|
||||||
__privateMethod(this, _SvelteMap_instances, read_all_fn).call(this);
|
|
||||||
super.forEach(callbackfn, this_arg);
|
|
||||||
}
|
|
||||||
/** @param {K} key */
|
|
||||||
get(key) {
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
var s = sources.get(key);
|
|
||||||
if (s === void 0) {
|
|
||||||
var ret = super.get(key);
|
|
||||||
if (ret !== void 0) {
|
|
||||||
s = __privateMethod(this, _SvelteMap_instances, source_fn2).call(this, 0);
|
|
||||||
if (true_default) {
|
|
||||||
tag(s, `SvelteMap get(${label(key)})`);
|
|
||||||
}
|
|
||||||
sources.set(key, s);
|
|
||||||
} else {
|
|
||||||
get(__privateGet(this, _version2));
|
|
||||||
return void 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get(s);
|
|
||||||
return super.get(key);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {K} key
|
|
||||||
* @param {V} value
|
|
||||||
* */
|
|
||||||
set(key, value) {
|
|
||||||
var _a;
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
var s = sources.get(key);
|
|
||||||
var prev_res = super.get(key);
|
|
||||||
var res = super.set(key, value);
|
|
||||||
var version = __privateGet(this, _version2);
|
|
||||||
if (s === void 0) {
|
|
||||||
s = __privateMethod(this, _SvelteMap_instances, source_fn2).call(this, 0);
|
|
||||||
if (true_default) {
|
|
||||||
tag(s, `SvelteMap get(${label(key)})`);
|
|
||||||
}
|
|
||||||
sources.set(key, s);
|
|
||||||
set(__privateGet(this, _size2), super.size);
|
|
||||||
increment(version);
|
|
||||||
} else if (prev_res !== value) {
|
|
||||||
increment(s);
|
|
||||||
var v_reactions = version.reactions === null ? null : new Set(version.reactions);
|
|
||||||
var needs_version_increase = v_reactions === null || !((_a = s.reactions) == null ? void 0 : _a.every(
|
|
||||||
(r) => (
|
|
||||||
/** @type {NonNullable<typeof v_reactions>} */
|
|
||||||
v_reactions.has(r)
|
|
||||||
)
|
|
||||||
));
|
|
||||||
if (needs_version_increase) {
|
|
||||||
increment(version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
/** @param {K} key */
|
|
||||||
delete(key) {
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
var s = sources.get(key);
|
|
||||||
var res = super.delete(key);
|
|
||||||
if (s !== void 0) {
|
|
||||||
sources.delete(key);
|
|
||||||
set(__privateGet(this, _size2), super.size);
|
|
||||||
set(s, -1);
|
|
||||||
increment(__privateGet(this, _version2));
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
clear() {
|
|
||||||
if (super.size === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.clear();
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
set(__privateGet(this, _size2), 0);
|
|
||||||
for (var s of sources.values()) {
|
|
||||||
set(s, -1);
|
|
||||||
}
|
|
||||||
increment(__privateGet(this, _version2));
|
|
||||||
sources.clear();
|
|
||||||
}
|
|
||||||
keys() {
|
|
||||||
get(__privateGet(this, _version2));
|
|
||||||
return super.keys();
|
|
||||||
}
|
|
||||||
values() {
|
|
||||||
__privateMethod(this, _SvelteMap_instances, read_all_fn).call(this);
|
|
||||||
return super.values();
|
|
||||||
}
|
|
||||||
entries() {
|
|
||||||
__privateMethod(this, _SvelteMap_instances, read_all_fn).call(this);
|
|
||||||
return super.entries();
|
|
||||||
}
|
|
||||||
[Symbol.iterator]() {
|
|
||||||
return this.entries();
|
|
||||||
}
|
|
||||||
get size() {
|
|
||||||
get(__privateGet(this, _size2));
|
|
||||||
return super.size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_sources2 = new WeakMap();
|
|
||||||
_version2 = new WeakMap();
|
|
||||||
_size2 = new WeakMap();
|
|
||||||
_update_version2 = new WeakMap();
|
|
||||||
_SvelteMap_instances = new WeakSet();
|
|
||||||
/**
|
|
||||||
* If the source is being created inside the same reaction as the SvelteMap instance,
|
|
||||||
* we use `state` so that it will not be a dependency of the reaction. Otherwise we
|
|
||||||
* use `source` so it will be.
|
|
||||||
*
|
|
||||||
* @template T
|
|
||||||
* @param {T} value
|
|
||||||
* @returns {Source<T>}
|
|
||||||
*/
|
|
||||||
source_fn2 = function(value) {
|
|
||||||
return update_version === __privateGet(this, _update_version2) ? state(value) : source(value);
|
|
||||||
};
|
|
||||||
read_all_fn = function() {
|
|
||||||
get(__privateGet(this, _version2));
|
|
||||||
var sources = __privateGet(this, _sources2);
|
|
||||||
if (__privateGet(this, _size2).v !== sources.size) {
|
|
||||||
for (var key of __superGet(_SvelteMap.prototype, this, "keys").call(this)) {
|
|
||||||
if (!sources.has(key)) {
|
|
||||||
var s = __privateMethod(this, _SvelteMap_instances, source_fn2).call(this, 0);
|
|
||||||
if (true_default) {
|
|
||||||
tag(s, `SvelteMap get(${label(key)})`);
|
|
||||||
}
|
|
||||||
sources.set(key, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for ([, s] of __privateGet(this, _sources2)) {
|
|
||||||
get(s);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var SvelteMap = _SvelteMap;
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/url-search-params.js
|
|
||||||
var REPLACE = Symbol();
|
|
||||||
var _version3, _url, _updating, _SvelteURLSearchParams_instances, update_url_fn;
|
|
||||||
var SvelteURLSearchParams = class extends URLSearchParams {
|
|
||||||
constructor() {
|
|
||||||
super(...arguments);
|
|
||||||
__privateAdd(this, _SvelteURLSearchParams_instances);
|
|
||||||
__privateAdd(this, _version3, true_default ? tag(state(0), "SvelteURLSearchParams version") : state(0));
|
|
||||||
__privateAdd(this, _url, get_current_url());
|
|
||||||
__privateAdd(this, _updating, false);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {URLSearchParams} params
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
[REPLACE](params) {
|
|
||||||
if (__privateGet(this, _updating)) return;
|
|
||||||
__privateSet(this, _updating, true);
|
|
||||||
for (const key of [...super.keys()]) {
|
|
||||||
super.delete(key);
|
|
||||||
}
|
|
||||||
for (const [key, value] of params) {
|
|
||||||
super.append(key, value);
|
|
||||||
}
|
|
||||||
increment(__privateGet(this, _version3));
|
|
||||||
__privateSet(this, _updating, false);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @param {string} value
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
append(name, value) {
|
|
||||||
super.append(name, value);
|
|
||||||
__privateMethod(this, _SvelteURLSearchParams_instances, update_url_fn).call(this);
|
|
||||||
increment(__privateGet(this, _version3));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @param {string=} value
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
delete(name, value) {
|
|
||||||
var has_value = super.has(name, value);
|
|
||||||
super.delete(name, value);
|
|
||||||
if (has_value) {
|
|
||||||
__privateMethod(this, _SvelteURLSearchParams_instances, update_url_fn).call(this);
|
|
||||||
increment(__privateGet(this, _version3));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @returns {string|null}
|
|
||||||
*/
|
|
||||||
get(name) {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.get(name);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @returns {string[]}
|
|
||||||
*/
|
|
||||||
getAll(name) {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.getAll(name);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @param {string=} value
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
has(name, value) {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.has(name, value);
|
|
||||||
}
|
|
||||||
keys() {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.keys();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} name
|
|
||||||
* @param {string} value
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
set(name, value) {
|
|
||||||
var previous = super.getAll(name).join("");
|
|
||||||
super.set(name, value);
|
|
||||||
if (previous !== super.getAll(name).join("")) {
|
|
||||||
__privateMethod(this, _SvelteURLSearchParams_instances, update_url_fn).call(this);
|
|
||||||
increment(__privateGet(this, _version3));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sort() {
|
|
||||||
super.sort();
|
|
||||||
__privateMethod(this, _SvelteURLSearchParams_instances, update_url_fn).call(this);
|
|
||||||
increment(__privateGet(this, _version3));
|
|
||||||
}
|
|
||||||
toString() {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.toString();
|
|
||||||
}
|
|
||||||
values() {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.values();
|
|
||||||
}
|
|
||||||
entries() {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.entries();
|
|
||||||
}
|
|
||||||
[Symbol.iterator]() {
|
|
||||||
return this.entries();
|
|
||||||
}
|
|
||||||
get size() {
|
|
||||||
get(__privateGet(this, _version3));
|
|
||||||
return super.size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_version3 = new WeakMap();
|
|
||||||
_url = new WeakMap();
|
|
||||||
_updating = new WeakMap();
|
|
||||||
_SvelteURLSearchParams_instances = new WeakSet();
|
|
||||||
update_url_fn = function() {
|
|
||||||
if (!__privateGet(this, _url) || __privateGet(this, _updating)) return;
|
|
||||||
__privateSet(this, _updating, true);
|
|
||||||
const search = this.toString();
|
|
||||||
__privateGet(this, _url).search = search && `?${search}`;
|
|
||||||
__privateSet(this, _updating, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/url.js
|
|
||||||
var current_url = null;
|
|
||||||
function get_current_url() {
|
|
||||||
return current_url;
|
|
||||||
}
|
|
||||||
var _protocol, _username, _password, _hostname, _port, _pathname, _hash, _search, _searchParams;
|
|
||||||
var SvelteURL = class extends URL {
|
|
||||||
/**
|
|
||||||
* @param {string | URL} url
|
|
||||||
* @param {string | URL} [base]
|
|
||||||
*/
|
|
||||||
constructor(url, base) {
|
|
||||||
url = new URL(url, base);
|
|
||||||
super(url);
|
|
||||||
__privateAdd(this, _protocol, state(super.protocol));
|
|
||||||
__privateAdd(this, _username, state(super.username));
|
|
||||||
__privateAdd(this, _password, state(super.password));
|
|
||||||
__privateAdd(this, _hostname, state(super.hostname));
|
|
||||||
__privateAdd(this, _port, state(super.port));
|
|
||||||
__privateAdd(this, _pathname, state(super.pathname));
|
|
||||||
__privateAdd(this, _hash, state(super.hash));
|
|
||||||
__privateAdd(this, _search, state(super.search));
|
|
||||||
__privateAdd(this, _searchParams);
|
|
||||||
if (true_default) {
|
|
||||||
tag(__privateGet(this, _protocol), "SvelteURL.protocol");
|
|
||||||
tag(__privateGet(this, _username), "SvelteURL.username");
|
|
||||||
tag(__privateGet(this, _password), "SvelteURL.password");
|
|
||||||
tag(__privateGet(this, _hostname), "SvelteURL.hostname");
|
|
||||||
tag(__privateGet(this, _port), "SvelteURL.port");
|
|
||||||
tag(__privateGet(this, _pathname), "SvelteURL.pathname");
|
|
||||||
tag(__privateGet(this, _hash), "SvelteURL.hash");
|
|
||||||
tag(__privateGet(this, _search), "SvelteURL.search");
|
|
||||||
}
|
|
||||||
current_url = this;
|
|
||||||
__privateSet(this, _searchParams, new SvelteURLSearchParams(url.searchParams));
|
|
||||||
current_url = null;
|
|
||||||
}
|
|
||||||
get hash() {
|
|
||||||
return get(__privateGet(this, _hash));
|
|
||||||
}
|
|
||||||
set hash(value) {
|
|
||||||
super.hash = value;
|
|
||||||
set(__privateGet(this, _hash), super.hash);
|
|
||||||
}
|
|
||||||
get host() {
|
|
||||||
get(__privateGet(this, _hostname));
|
|
||||||
get(__privateGet(this, _port));
|
|
||||||
return super.host;
|
|
||||||
}
|
|
||||||
set host(value) {
|
|
||||||
super.host = value;
|
|
||||||
set(__privateGet(this, _hostname), super.hostname);
|
|
||||||
set(__privateGet(this, _port), super.port);
|
|
||||||
}
|
|
||||||
get hostname() {
|
|
||||||
return get(__privateGet(this, _hostname));
|
|
||||||
}
|
|
||||||
set hostname(value) {
|
|
||||||
super.hostname = value;
|
|
||||||
set(__privateGet(this, _hostname), super.hostname);
|
|
||||||
}
|
|
||||||
get href() {
|
|
||||||
get(__privateGet(this, _protocol));
|
|
||||||
get(__privateGet(this, _username));
|
|
||||||
get(__privateGet(this, _password));
|
|
||||||
get(__privateGet(this, _hostname));
|
|
||||||
get(__privateGet(this, _port));
|
|
||||||
get(__privateGet(this, _pathname));
|
|
||||||
get(__privateGet(this, _hash));
|
|
||||||
get(__privateGet(this, _search));
|
|
||||||
return super.href;
|
|
||||||
}
|
|
||||||
set href(value) {
|
|
||||||
super.href = value;
|
|
||||||
set(__privateGet(this, _protocol), super.protocol);
|
|
||||||
set(__privateGet(this, _username), super.username);
|
|
||||||
set(__privateGet(this, _password), super.password);
|
|
||||||
set(__privateGet(this, _hostname), super.hostname);
|
|
||||||
set(__privateGet(this, _port), super.port);
|
|
||||||
set(__privateGet(this, _pathname), super.pathname);
|
|
||||||
set(__privateGet(this, _hash), super.hash);
|
|
||||||
set(__privateGet(this, _search), super.search);
|
|
||||||
__privateGet(this, _searchParams)[REPLACE](super.searchParams);
|
|
||||||
}
|
|
||||||
get password() {
|
|
||||||
return get(__privateGet(this, _password));
|
|
||||||
}
|
|
||||||
set password(value) {
|
|
||||||
super.password = value;
|
|
||||||
set(__privateGet(this, _password), super.password);
|
|
||||||
}
|
|
||||||
get pathname() {
|
|
||||||
return get(__privateGet(this, _pathname));
|
|
||||||
}
|
|
||||||
set pathname(value) {
|
|
||||||
super.pathname = value;
|
|
||||||
set(__privateGet(this, _pathname), super.pathname);
|
|
||||||
}
|
|
||||||
get port() {
|
|
||||||
return get(__privateGet(this, _port));
|
|
||||||
}
|
|
||||||
set port(value) {
|
|
||||||
super.port = value;
|
|
||||||
set(__privateGet(this, _port), super.port);
|
|
||||||
}
|
|
||||||
get protocol() {
|
|
||||||
return get(__privateGet(this, _protocol));
|
|
||||||
}
|
|
||||||
set protocol(value) {
|
|
||||||
super.protocol = value;
|
|
||||||
set(__privateGet(this, _protocol), super.protocol);
|
|
||||||
}
|
|
||||||
get search() {
|
|
||||||
return get(__privateGet(this, _search));
|
|
||||||
}
|
|
||||||
set search(value) {
|
|
||||||
super.search = value;
|
|
||||||
set(__privateGet(this, _search), value);
|
|
||||||
__privateGet(this, _searchParams)[REPLACE](super.searchParams);
|
|
||||||
}
|
|
||||||
get username() {
|
|
||||||
return get(__privateGet(this, _username));
|
|
||||||
}
|
|
||||||
set username(value) {
|
|
||||||
super.username = value;
|
|
||||||
set(__privateGet(this, _username), super.username);
|
|
||||||
}
|
|
||||||
get origin() {
|
|
||||||
get(__privateGet(this, _protocol));
|
|
||||||
get(__privateGet(this, _hostname));
|
|
||||||
get(__privateGet(this, _port));
|
|
||||||
return super.origin;
|
|
||||||
}
|
|
||||||
get searchParams() {
|
|
||||||
return __privateGet(this, _searchParams);
|
|
||||||
}
|
|
||||||
toString() {
|
|
||||||
return this.href;
|
|
||||||
}
|
|
||||||
toJSON() {
|
|
||||||
return this.href;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_protocol = new WeakMap();
|
|
||||||
_username = new WeakMap();
|
|
||||||
_password = new WeakMap();
|
|
||||||
_hostname = new WeakMap();
|
|
||||||
_port = new WeakMap();
|
|
||||||
_pathname = new WeakMap();
|
|
||||||
_hash = new WeakMap();
|
|
||||||
_search = new WeakMap();
|
|
||||||
_searchParams = new WeakMap();
|
|
||||||
|
|
||||||
// node_modules/svelte/src/reactivity/media-query.js
|
|
||||||
var parenthesis_regex = /\(.+\)/;
|
|
||||||
var non_parenthesized_keywords = /* @__PURE__ */ new Set(["all", "print", "screen", "and", "or", "not", "only"]);
|
|
||||||
var MediaQuery = class extends ReactiveValue {
|
|
||||||
/**
|
|
||||||
* @param {string} query A media query string
|
|
||||||
* @param {boolean} [fallback] Fallback value for the server
|
|
||||||
*/
|
|
||||||
constructor(query, fallback) {
|
|
||||||
let final_query = parenthesis_regex.test(query) || // we need to use `some` here because technically this `window.matchMedia('random,screen')` still returns true
|
|
||||||
query.split(/[\s,]+/).some((keyword) => non_parenthesized_keywords.has(keyword.trim())) ? query : `(${query})`;
|
|
||||||
const q = window.matchMedia(final_query);
|
|
||||||
super(
|
|
||||||
() => q.matches,
|
|
||||||
(update) => on(q, "change", update)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export {
|
|
||||||
SvelteDate,
|
|
||||||
SvelteSet,
|
|
||||||
SvelteMap,
|
|
||||||
SvelteURLSearchParams,
|
|
||||||
SvelteURL,
|
|
||||||
MediaQuery
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=chunk-EZEETTA4.js.map
|
|
||||||
-7
File diff suppressed because one or more lines are too long
-4841
File diff suppressed because it is too large
Load Diff
-7
File diff suppressed because one or more lines are too long
+4
-4
@@ -7,13 +7,12 @@ import {
|
|||||||
hydratable,
|
hydratable,
|
||||||
onDestroy,
|
onDestroy,
|
||||||
onMount
|
onMount
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
hydrate,
|
hydrate,
|
||||||
mount,
|
mount,
|
||||||
unmount
|
unmount
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
createContext,
|
createContext,
|
||||||
flushSync,
|
flushSync,
|
||||||
@@ -25,10 +24,11 @@ import {
|
|||||||
settled,
|
settled,
|
||||||
tick,
|
tick,
|
||||||
untrack
|
untrack
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
export {
|
export {
|
||||||
afterUpdate,
|
afterUpdate,
|
||||||
|
|||||||
+4
-4
@@ -1,13 +1,13 @@
|
|||||||
import {
|
import {
|
||||||
createAttachmentKey,
|
createAttachmentKey,
|
||||||
fromAction
|
fromAction
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
import "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-57IKBECK.js";
|
import "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-JC3VXQM7.js";
|
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
export {
|
export {
|
||||||
createAttachmentKey,
|
createAttachmentKey,
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
import "./chunk-7RQDXF5S.js";
|
import "./chunk-7RQDXF5S.js";
|
||||||
import {
|
import {
|
||||||
on
|
on
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
|||||||
+4
-4
@@ -107,8 +107,7 @@ import {
|
|||||||
validate_store,
|
validate_store,
|
||||||
validate_void_dynamic_element,
|
validate_void_dynamic_element,
|
||||||
wrap_snippet
|
wrap_snippet
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
|
||||||
import {
|
import {
|
||||||
append,
|
append,
|
||||||
comment,
|
comment,
|
||||||
@@ -126,7 +125,7 @@ import {
|
|||||||
text,
|
text,
|
||||||
trusted,
|
trusted,
|
||||||
with_script
|
with_script
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import {
|
import {
|
||||||
$document,
|
$document,
|
||||||
$window,
|
$window,
|
||||||
@@ -200,10 +199,11 @@ import {
|
|||||||
user_effect,
|
user_effect,
|
||||||
user_pre_effect,
|
user_pre_effect,
|
||||||
wait
|
wait
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
export {
|
export {
|
||||||
CLASS,
|
CLASS,
|
||||||
|
|||||||
+2
-2
@@ -12,8 +12,8 @@ import {
|
|||||||
stopImmediatePropagation,
|
stopImmediatePropagation,
|
||||||
stopPropagation,
|
stopPropagation,
|
||||||
trusted
|
trusted
|
||||||
} from "./chunk-57IKBECK.js";
|
} from "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-JC3VXQM7.js";
|
import "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
|||||||
+9
-9
@@ -1,18 +1,17 @@
|
|||||||
import {
|
|
||||||
MediaQuery
|
|
||||||
} from "./chunk-EZEETTA4.js";
|
|
||||||
import "./chunk-3TACVO2P.js";
|
|
||||||
import "./chunk-7RQDXF5S.js";
|
|
||||||
import {
|
import {
|
||||||
linear
|
linear
|
||||||
} from "./chunk-YERFD2CZ.js";
|
} from "./chunk-YERFD2CZ.js";
|
||||||
|
import {
|
||||||
|
MediaQuery
|
||||||
|
} from "./chunk-GBET5VCG.js";
|
||||||
|
import "./chunk-YSF5ZXQP.js";
|
||||||
|
import "./chunk-7RQDXF5S.js";
|
||||||
import {
|
import {
|
||||||
loop,
|
loop,
|
||||||
raf,
|
raf,
|
||||||
writable
|
writable
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
import "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-57IKBECK.js";
|
|
||||||
import {
|
import {
|
||||||
deferred,
|
deferred,
|
||||||
get,
|
get,
|
||||||
@@ -21,12 +20,13 @@ import {
|
|||||||
set,
|
set,
|
||||||
state,
|
state,
|
||||||
tag
|
tag
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import {
|
import {
|
||||||
true_default
|
true_default
|
||||||
} from "./chunk-HNWPC2PS.js";
|
} from "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import {
|
import {
|
||||||
__privateAdd,
|
__privateAdd,
|
||||||
__privateGet,
|
__privateGet,
|
||||||
|
|||||||
+6
-6
@@ -5,18 +5,18 @@ import {
|
|||||||
SvelteSet,
|
SvelteSet,
|
||||||
SvelteURL,
|
SvelteURL,
|
||||||
SvelteURLSearchParams
|
SvelteURLSearchParams
|
||||||
} from "./chunk-EZEETTA4.js";
|
} from "./chunk-GBET5VCG.js";
|
||||||
import "./chunk-3TACVO2P.js";
|
import "./chunk-YSF5ZXQP.js";
|
||||||
import "./chunk-7RQDXF5S.js";
|
import "./chunk-7RQDXF5S.js";
|
||||||
import "./chunk-EXK7SDUS.js";
|
import "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
import "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-57IKBECK.js";
|
|
||||||
import {
|
import {
|
||||||
createSubscriber
|
createSubscriber
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
export {
|
export {
|
||||||
MediaQuery,
|
MediaQuery,
|
||||||
|
|||||||
+5
-5
@@ -1,22 +1,22 @@
|
|||||||
import {
|
import {
|
||||||
ReactiveValue
|
ReactiveValue
|
||||||
} from "./chunk-3TACVO2P.js";
|
} from "./chunk-YSF5ZXQP.js";
|
||||||
import "./chunk-7RQDXF5S.js";
|
import "./chunk-7RQDXF5S.js";
|
||||||
import "./chunk-EXK7SDUS.js";
|
import "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
import "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-57IKBECK.js";
|
|
||||||
import {
|
import {
|
||||||
get,
|
get,
|
||||||
on,
|
on,
|
||||||
set,
|
set,
|
||||||
source,
|
source,
|
||||||
tag
|
tag
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import {
|
import {
|
||||||
true_default
|
true_default
|
||||||
} from "./chunk-HNWPC2PS.js";
|
} from "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import {
|
import {
|
||||||
__privateAdd,
|
__privateAdd,
|
||||||
__privateGet,
|
__privateGet,
|
||||||
|
|||||||
+4
-4
@@ -4,9 +4,8 @@ import {
|
|||||||
readable,
|
readable,
|
||||||
readonly,
|
readonly,
|
||||||
writable
|
writable
|
||||||
} from "./chunk-EXK7SDUS.js";
|
} from "./chunk-LDPLLRRU.js";
|
||||||
import "./chunk-U7P2NEEE.js";
|
import "./chunk-UKTTYZCO.js";
|
||||||
import "./chunk-57IKBECK.js";
|
|
||||||
import {
|
import {
|
||||||
active_effect,
|
active_effect,
|
||||||
active_reaction,
|
active_reaction,
|
||||||
@@ -16,10 +15,11 @@ import {
|
|||||||
render_effect,
|
render_effect,
|
||||||
set_active_effect,
|
set_active_effect,
|
||||||
set_active_reaction
|
set_active_reaction
|
||||||
} from "./chunk-JC3VXQM7.js";
|
} from "./chunk-UWLXLUJC.js";
|
||||||
import "./chunk-XWATFG4W.js";
|
import "./chunk-XWATFG4W.js";
|
||||||
import "./chunk-HNWPC2PS.js";
|
import "./chunk-HNWPC2PS.js";
|
||||||
import "./chunk-OHYQYV5R.js";
|
import "./chunk-OHYQYV5R.js";
|
||||||
|
import "./chunk-U7P2NEEE.js";
|
||||||
import "./chunk-X4VJQ2O3.js";
|
import "./chunk-X4VJQ2O3.js";
|
||||||
|
|
||||||
// node_modules/svelte/src/store/index-client.js
|
// node_modules/svelte/src/store/index-client.js
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"barcode-detector-api-polyfill": "^1.0.20",
|
"barcode-detector-api-polyfill": "^1.0.20",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"heic-convert": "^2.1.0",
|
||||||
|
"heic2any": "^0.0.4",
|
||||||
"pocketbase": "^0.26.0",
|
"pocketbase": "^0.26.0",
|
||||||
"tailwind-merge": "^3.0.0"
|
"tailwind-merge": "^3.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='4' fill='%231e293b'/><text x='16' y='22' font-size='18' font-family='system-ui' fill='%2394a3b8' text-anchor='middle'>S</text></svg>" />
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='4' fill='%231e293b'/><text x='16' y='22' font-size='18' font-family='system-ui' fill='%2394a3b8' text-anchor='middle'>S</text></svg>" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5, viewport-fit=cover" />
|
||||||
<meta name="theme-color" content="#0f172a" />
|
<meta name="theme-color" content="#0f172a" />
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
<meta name="apple-mobile-web-app-title" content="Stackq" />
|
<meta name="apple-mobile-web-app-title" content="Stackq" />
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { Collapsible as CollapsiblePrimitive } from "bits-ui";
|
||||||
|
import type { Snippet } from "svelte";
|
||||||
|
import type { HTMLAttributes } from "svelte/elements";
|
||||||
|
import { cn } from "$lib/utils.js";
|
||||||
|
|
||||||
|
let {
|
||||||
|
ref = $bindable(null),
|
||||||
|
class: className,
|
||||||
|
children,
|
||||||
|
...restProps
|
||||||
|
}: CollapsiblePrimitive.ContentProps & HTMLAttributes<HTMLDivElement> & { children?: Snippet } = $props();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<CollapsiblePrimitive.Content
|
||||||
|
bind:ref
|
||||||
|
class={cn("overflow-hidden", className)}
|
||||||
|
{...restProps}
|
||||||
|
>
|
||||||
|
{@render children?.()}
|
||||||
|
</CollapsiblePrimitive.Content>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { Collapsible as CollapsiblePrimitive } from "bits-ui";
|
||||||
|
import type { Snippet } from "svelte";
|
||||||
|
import type { HTMLButtonAttributes } from "svelte/elements";
|
||||||
|
import { cn } from "$lib/utils.js";
|
||||||
|
|
||||||
|
let {
|
||||||
|
ref = $bindable(null),
|
||||||
|
class: className,
|
||||||
|
children,
|
||||||
|
...restProps
|
||||||
|
}: CollapsiblePrimitive.TriggerProps & HTMLButtonAttributes<HTMLButtonElement> & { children?: Snippet } = $props();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<CollapsiblePrimitive.Trigger bind:ref class={cn("flex items-center gap-2", className)} {...restProps}>
|
||||||
|
{@render children?.()}
|
||||||
|
</CollapsiblePrimitive.Trigger>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { Collapsible as CollapsiblePrimitive } from "bits-ui";
|
||||||
|
import type { HTMLAttributes } from "svelte/elements";
|
||||||
|
import type { Snippet } from "svelte";
|
||||||
|
import { cn } from "$lib/utils.js";
|
||||||
|
|
||||||
|
let {
|
||||||
|
open = $bindable(false),
|
||||||
|
class: className,
|
||||||
|
children,
|
||||||
|
...restProps
|
||||||
|
}: CollapsiblePrimitive.RootProps & HTMLAttributes<HTMLDivElement> & { children?: Snippet } = $props();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<CollapsiblePrimitive.Root bind:open class={cn(className)} {...restProps}>
|
||||||
|
{@render children?.()}
|
||||||
|
</CollapsiblePrimitive.Root>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import Root from "./collapsible.svelte";
|
||||||
|
import Content from "./collapsible-content.svelte";
|
||||||
|
import Trigger from "./collapsible-trigger.svelte";
|
||||||
|
|
||||||
|
export { Root, Content, Trigger, Root as Collapsible, Content as CollapsibleContent, Trigger as CollapsibleTrigger };
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Convert HEIC/HEIF blob to JPEG. Uses heic2any only when this function is called
|
||||||
|
* (dynamic import), so the receipt page can load even if heic2any fails to resolve.
|
||||||
|
* Suppresses the library's "Could not parse HEIF file" console errors during conversion.
|
||||||
|
*/
|
||||||
|
export async function convertHeicBlobToJpeg(blob: Blob): Promise<Blob> {
|
||||||
|
const originalError = console.error;
|
||||||
|
console.error = (...args: unknown[]) => {
|
||||||
|
const msg = args[0]?.toString?.() ?? "";
|
||||||
|
if (msg.includes("HEIF") || msg.includes("parse HEIF")) return;
|
||||||
|
originalError.apply(console, args);
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
const mod = await import(/* @vite-ignore */ "heic2any");
|
||||||
|
const heic2any = (mod as unknown as {
|
||||||
|
default: (opts: { blob: Blob; toType: string; quality?: number }) => Promise<Blob | Blob[]>;
|
||||||
|
}).default;
|
||||||
|
const out = await heic2any({ blob, toType: "image/jpeg", quality: 0.92 });
|
||||||
|
return Array.isArray(out) ? out[0] : out;
|
||||||
|
} finally {
|
||||||
|
console.error = originalError;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,19 @@
|
|||||||
|
/** Line item stored in receipt Data.lineItems */
|
||||||
|
export interface ReceiptLineItem {
|
||||||
|
item: string;
|
||||||
|
description: string;
|
||||||
|
quantity: number;
|
||||||
|
price: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** JSON shape stored in Stackq_Receipts.Data */
|
||||||
|
export interface ReceiptDataShape {
|
||||||
|
lineItems?: ReceiptLineItem[];
|
||||||
|
tax?: number;
|
||||||
|
/** Total printed on receipt (for validation) */
|
||||||
|
receiptTotal?: number;
|
||||||
|
}
|
||||||
|
|
||||||
/** PocketBase Stackq_Receipts collection record (and expanded relation). */
|
/** PocketBase Stackq_Receipts collection record (and expanded relation). */
|
||||||
export interface StackqReceipt {
|
export interface StackqReceipt {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -5,7 +21,7 @@ export interface StackqReceipt {
|
|||||||
Type: string;
|
Type: string;
|
||||||
User: string;
|
User: string;
|
||||||
Image?: string;
|
Image?: string;
|
||||||
Data?: Record<string, unknown>;
|
Data?: ReceiptDataShape | Record<string, unknown>;
|
||||||
created: string;
|
created: string;
|
||||||
updated: string;
|
updated: string;
|
||||||
expand?: {
|
expand?: {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
import { page } from '$app/stores';
|
||||||
import { enhance } from '$app/forms';
|
import { enhance } from '$app/forms';
|
||||||
import { invalidate } from '$app/navigation';
|
import { invalidate } from '$app/navigation';
|
||||||
import { browser } from '$app/environment';
|
import { browser } from '$app/environment';
|
||||||
@@ -11,6 +12,7 @@
|
|||||||
|
|
||||||
let { data, children }: { data: { user: { id: string; email?: string; name?: string; darkmode: boolean } | null }; children?: import('svelte').Snippet } = $props();
|
let { data, children }: { data: { user: { id: string; email?: string; name?: string; darkmode: boolean } | null }; children?: import('svelte').Snippet } = $props();
|
||||||
|
|
||||||
|
const isReceiptDetailFull = $derived(!!$page?.url?.pathname?.match(/^\/receipts\/[^/]+$/));
|
||||||
let darkmode = $state(false);
|
let darkmode = $state(false);
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
@@ -38,7 +40,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="app-shell">
|
<div class="app-shell" class:receipt-detail-full={isReceiptDetailFull}>
|
||||||
{#if data.user}
|
{#if data.user}
|
||||||
<header
|
<header
|
||||||
class="fixed right-0 top-0 z-50 flex items-center gap-2 p-2 pr-[max(0.5rem,env(safe-area-inset-right))] pt-[max(0.5rem,env(safe-area-inset-top))]"
|
class="fixed right-0 top-0 z-50 flex items-center gap-2 p-2 pr-[max(0.5rem,env(safe-area-inset-right))] pt-[max(0.5rem,env(safe-area-inset-top))]"
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
import { POCKETBASE_BASE_URL } from "$lib/pocketbase";
|
||||||
|
import type { RequestHandler } from "./$types";
|
||||||
|
|
||||||
|
function isHeicPath(path: string): boolean {
|
||||||
|
const lower = path.toLowerCase();
|
||||||
|
return lower.endsWith(".heic") || lower.endsWith(".heif");
|
||||||
|
}
|
||||||
|
|
||||||
|
export const GET: RequestHandler = async ({ params, request }) => {
|
||||||
|
const path = params.path;
|
||||||
|
if (!path) return new Response(null, { status: 404 });
|
||||||
|
|
||||||
|
const url = `${POCKETBASE_BASE_URL}/api/files/${path}`;
|
||||||
|
const cookie = request.headers.get("cookie") ?? "";
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
headers: { cookie },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
return new Response(null, { status: res.status });
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
||||||
|
const body = res.body;
|
||||||
|
if (!body) return new Response(null, { status: 502 });
|
||||||
|
|
||||||
|
if (isHeicPath(path)) {
|
||||||
|
try {
|
||||||
|
const arrayBuffer = await res.arrayBuffer();
|
||||||
|
const inputBuffer = Buffer.from(arrayBuffer);
|
||||||
|
const convert = (await import("heic-convert")).default as (opts: {
|
||||||
|
buffer: Buffer;
|
||||||
|
format: string;
|
||||||
|
quality?: number;
|
||||||
|
}) => Promise<Buffer>;
|
||||||
|
const outputBuffer = await convert({
|
||||||
|
buffer: inputBuffer,
|
||||||
|
format: "JPEG",
|
||||||
|
quality: 0.92,
|
||||||
|
});
|
||||||
|
return new Response(outputBuffer, {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
"content-type": "image/jpeg",
|
||||||
|
"cache-control": res.headers.get("cache-control") ?? "private, max-age=3600",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
return new Response(null, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response(body, {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
"content-type": contentType,
|
||||||
|
"cache-control": res.headers.get("cache-control") ?? "private, max-age=3600",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -153,6 +153,13 @@
|
|||||||
max-width: 56rem; /* 896px – comfortable items list on desktop */
|
max-width: 56rem; /* 896px – comfortable items list on desktop */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Receipt detail page uses full width on desktop */
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.app-shell.receipt-detail-full {
|
||||||
|
max-width: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Page content area fills shell and avoids outer scroll when possible */
|
/* Page content area fills shell and avoids outer scroll when possible */
|
||||||
.app-shell .page-view {
|
.app-shell .page-view {
|
||||||
flex: 1 1 0;
|
flex: 1 1 0;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { Badge } from "$lib/components/ui/badge";
|
||||||
import { Button } from "$lib/components/ui/button";
|
import { Button } from "$lib/components/ui/button";
|
||||||
import { Card, CardContent } from "$lib/components/ui/card";
|
import { Card, CardContent } from "$lib/components/ui/card";
|
||||||
import { Input } from "$lib/components/ui/input";
|
import { Input } from "$lib/components/ui/input";
|
||||||
@@ -16,19 +17,28 @@
|
|||||||
(() => {
|
(() => {
|
||||||
const q = searchQuery.trim().toLowerCase();
|
const q = searchQuery.trim().toLowerCase();
|
||||||
if (!q) return receipts;
|
if (!q) return receipts;
|
||||||
|
const userName = (r: StackqReceipt) =>
|
||||||
|
(r.expand?.User?.name ?? r.expand?.User?.email ?? "").toLowerCase();
|
||||||
return receipts.filter(
|
return receipts.filter(
|
||||||
(r) =>
|
(r) =>
|
||||||
r.id.toLowerCase().includes(q) ||
|
r.id.toLowerCase().includes(q) ||
|
||||||
(r.Status ?? "").toLowerCase().includes(q) ||
|
(r.Status ?? "").toLowerCase().includes(q) ||
|
||||||
(r.Type ?? "").toLowerCase().includes(q)
|
(r.Type ?? "").toLowerCase().includes(q) ||
|
||||||
|
userName(r).includes(q)
|
||||||
);
|
);
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
|
|
||||||
function formatDate(iso: string): string {
|
function userName(receipt: StackqReceipt): string {
|
||||||
|
const u = receipt.expand?.User;
|
||||||
|
return u?.name ?? u?.email ?? "—";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Format ISO (UTC) date string as local date/time */
|
||||||
|
function formatDateLocal(iso: string): string {
|
||||||
try {
|
try {
|
||||||
const d = new Date(iso);
|
const d = new Date(iso);
|
||||||
return d.toLocaleDateString(undefined, {
|
return d.toLocaleString(undefined, {
|
||||||
dateStyle: "short",
|
dateStyle: "short",
|
||||||
timeStyle: "short",
|
timeStyle: "short",
|
||||||
});
|
});
|
||||||
@@ -90,10 +100,16 @@
|
|||||||
{#each filteredReceipts as receipt (receipt.id)}
|
{#each filteredReceipts as receipt (receipt.id)}
|
||||||
<Card>
|
<Card>
|
||||||
<CardContent class="p-4">
|
<CardContent class="p-4">
|
||||||
<a href="/receipts/{receipt.id}" class="font-medium hover:underline">
|
<a href="/receipts/{receipt.id}" class="block font-medium hover:underline">
|
||||||
{receipt.Status ?? "—"} · {receipt.Type ?? "—"} · {formatDate(receipt.created)}
|
{userName(receipt)}
|
||||||
</a>
|
</a>
|
||||||
<p class="text-muted-foreground mt-1 text-xs">ID: {receipt.id}</p>
|
<div class="mt-2 flex flex-wrap items-center gap-2">
|
||||||
|
<Badge variant="secondary">{receipt.Type ?? "—"}</Badge>
|
||||||
|
<Badge variant="outline">{receipt.Status ?? "—"}</Badge>
|
||||||
|
<span class="text-muted-foreground text-xs">
|
||||||
|
{formatDateLocal(receipt.created)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
<form
|
<form
|
||||||
method="POST"
|
method="POST"
|
||||||
action={action}
|
action={action}
|
||||||
|
enctype="multipart/form-data"
|
||||||
use:enhance={() => async ({ update, result }) => {
|
use:enhance={() => async ({ update, result }) => {
|
||||||
await update();
|
await update();
|
||||||
if (result.type === "success" && result.data?.success) {
|
if (result.type === "success" && result.data?.success) {
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
import { error } from "@sveltejs/kit";
|
import { error, fail, redirect } from "@sveltejs/kit";
|
||||||
import type { PageServerLoad } from "./$types";
|
import type { Actions, PageServerLoad } from "./$types";
|
||||||
import type { StackqReceipt } from "$lib/types/receipts";
|
import type { StackqReceipt } from "$lib/types/receipts";
|
||||||
|
import type { ReceiptDataShape } from "$lib/types/receipts";
|
||||||
|
|
||||||
const COLLECTION = "Stackq_Receipts";
|
const COLLECTION = "Stackq_Receipts";
|
||||||
|
|
||||||
|
const STATUS_OPTIONS = ["New", "Data Entered", "Reviewed", "Consolidated"] as const;
|
||||||
|
const TYPE_OPTIONS = ["Purchase", "Gas"] as const;
|
||||||
|
|
||||||
|
function parseNum(val: unknown): number {
|
||||||
|
if (val === "" || val === null || val === undefined) return 0;
|
||||||
|
const n = Number(val);
|
||||||
|
return Number.isFinite(n) ? n : 0;
|
||||||
|
}
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({ params, locals }) => {
|
export const load: PageServerLoad = async ({ params, locals }) => {
|
||||||
const { id } = params;
|
const { id } = params;
|
||||||
try {
|
try {
|
||||||
@@ -21,3 +31,82 @@ export const load: PageServerLoad = async ({ params, locals }) => {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const actions: Actions = {
|
||||||
|
update: async ({ request, locals, params }) => {
|
||||||
|
const id = params.id;
|
||||||
|
if (!id) return fail(400, { error: "Missing id", form: "update" });
|
||||||
|
|
||||||
|
const form = await request.formData();
|
||||||
|
const Status = (form.get("Status") as string)?.trim() || "New";
|
||||||
|
const Type = (form.get("Type") as string)?.trim() || "Purchase";
|
||||||
|
const dataJson = (form.get("dataJson") as string)?.trim() ?? "{}";
|
||||||
|
const imageFile = form.get("Image") as File | null;
|
||||||
|
const hasImage = imageFile && imageFile.size > 0;
|
||||||
|
|
||||||
|
let Data: ReceiptDataShape = {};
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(dataJson) as unknown;
|
||||||
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
||||||
|
const o = parsed as Record<string, unknown>;
|
||||||
|
if (Array.isArray(o.lineItems)) {
|
||||||
|
Data.lineItems = o.lineItems.filter(
|
||||||
|
(row: unknown): row is { item: string; description: string; quantity: number; price: number } =>
|
||||||
|
row != null &&
|
||||||
|
typeof row === "object" &&
|
||||||
|
"item" in row &&
|
||||||
|
"quantity" in row &&
|
||||||
|
"price" in row
|
||||||
|
).map((row) => ({
|
||||||
|
item: String(row.item ?? ""),
|
||||||
|
description: String(row.description ?? ""),
|
||||||
|
quantity: parseNum(row.quantity),
|
||||||
|
price: parseNum(row.price),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (typeof o.tax === "number" && Number.isFinite(o.tax)) Data.tax = o.tax;
|
||||||
|
else if (typeof o.tax === "string") Data.tax = parseNum(o.tax);
|
||||||
|
if (typeof o.receiptTotal === "number" && Number.isFinite(o.receiptTotal)) {
|
||||||
|
Data.receiptTotal = o.receiptTotal;
|
||||||
|
} else if (typeof o.receiptTotal === "string") {
|
||||||
|
Data.receiptTotal = parseNum(o.receiptTotal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
return fail(400, { error: "Invalid receipt data JSON", form: "update" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const body: Record<string, unknown> = {
|
||||||
|
Status: STATUS_OPTIONS.includes(Status as (typeof STATUS_OPTIONS)[number]) ? Status : "New",
|
||||||
|
Type: TYPE_OPTIONS.includes(Type as (typeof TYPE_OPTIONS)[number]) ? Type : "Purchase",
|
||||||
|
Data: Object.keys(Data).length ? Data : undefined,
|
||||||
|
};
|
||||||
|
if (hasImage) body.Image = imageFile;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await locals.pb.collection(COLLECTION).update(id, body);
|
||||||
|
} catch (e: unknown) {
|
||||||
|
const message =
|
||||||
|
e && typeof e === "object" && "message" in e
|
||||||
|
? String((e as { message: string }).message)
|
||||||
|
: "Update failed";
|
||||||
|
return fail(500, { error: message, form: "update" });
|
||||||
|
}
|
||||||
|
return { success: true };
|
||||||
|
},
|
||||||
|
|
||||||
|
delete: async ({ locals, params }) => {
|
||||||
|
const id = params.id;
|
||||||
|
if (!id) return fail(400, { error: "Missing id", form: "delete" });
|
||||||
|
try {
|
||||||
|
await locals.pb.collection(COLLECTION).delete(id);
|
||||||
|
} catch (e: unknown) {
|
||||||
|
const message =
|
||||||
|
e && typeof e === "object" && "message" in e
|
||||||
|
? String((e as { message: string }).message)
|
||||||
|
: "Delete failed";
|
||||||
|
return fail(500, { error: message, form: "delete" });
|
||||||
|
}
|
||||||
|
throw redirect(303, "/receipts");
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,20 +1,88 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Button } from "$lib/components/ui/button";
|
import { Button } from "$lib/components/ui/button";
|
||||||
import { Card, CardContent } from "$lib/components/ui/card";
|
import { Card, CardContent } from "$lib/components/ui/card";
|
||||||
|
import * as Collapsible from "$lib/components/ui/collapsible";
|
||||||
|
import { Input } from "$lib/components/ui/input";
|
||||||
|
import { Label } from "$lib/components/ui/label";
|
||||||
import { POCKETBASE_BASE_URL } from "$lib/pocketbase";
|
import { POCKETBASE_BASE_URL } from "$lib/pocketbase";
|
||||||
|
import { enhance } from "$app/forms";
|
||||||
|
import ChevronDownIcon from "@lucide/svelte/icons/chevron-down";
|
||||||
|
import ChevronUpIcon from "@lucide/svelte/icons/chevron-up";
|
||||||
import type { StackqReceipt } from "$lib/types/receipts";
|
import type { StackqReceipt } from "$lib/types/receipts";
|
||||||
|
import type { ReceiptLineItem } from "$lib/types/receipts";
|
||||||
|
|
||||||
const COLLECTION = "Stackq_Receipts";
|
const COLLECTION = "Stackq_Receipts";
|
||||||
|
const STATUS_OPTIONS = ["New", "Data Entered", "Reviewed", "Consolidated"] as const;
|
||||||
|
const TYPE_OPTIONS = ["Purchase", "Gas"] as const;
|
||||||
|
|
||||||
let { data }: { data: { receipt: StackqReceipt } } = $props();
|
let { data, form }: { data: { receipt: StackqReceipt }; form?: { error?: string; form?: string } } = $props();
|
||||||
|
|
||||||
const receipt = $derived(data?.receipt);
|
const receipt = $derived(data?.receipt);
|
||||||
|
|
||||||
|
const formData = $state<{ lineItems: ReceiptLineItem[]; tax: number; receiptTotal: number }>({
|
||||||
|
lineItems: [{ item: "", description: "", quantity: 1, price: 0 }],
|
||||||
|
tax: 0,
|
||||||
|
receiptTotal: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
$effect(() => {
|
||||||
|
const r = receipt;
|
||||||
|
if (!r) return;
|
||||||
|
const data = r.Data;
|
||||||
|
const nextItems: ReceiptLineItem[] =
|
||||||
|
data && typeof data === "object" && "lineItems" in data
|
||||||
|
? (() => {
|
||||||
|
const arr = (data as { lineItems?: ReceiptLineItem[] }).lineItems;
|
||||||
|
if (Array.isArray(arr) && arr.length > 0) {
|
||||||
|
return arr.map((row) => ({
|
||||||
|
item: String(row?.item ?? ""),
|
||||||
|
description: String(row?.description ?? ""),
|
||||||
|
quantity: Number(row?.quantity) || 0,
|
||||||
|
price: Number(row?.price) || 0,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return [{ item: "", description: "", quantity: 1, price: 0 }];
|
||||||
|
})()
|
||||||
|
: [{ item: "", description: "", quantity: 1, price: 0 }];
|
||||||
|
const nextTax =
|
||||||
|
data && typeof data === "object" && "tax" in data
|
||||||
|
? (() => {
|
||||||
|
const t = (data as { tax?: number }).tax;
|
||||||
|
return typeof t === "number" && Number.isFinite(t) ? t : 0;
|
||||||
|
})()
|
||||||
|
: 0;
|
||||||
|
const nextReceiptTotal =
|
||||||
|
data && typeof data === "object" && "receiptTotal" in data
|
||||||
|
? (() => {
|
||||||
|
const t = (data as { receiptTotal?: number }).receiptTotal;
|
||||||
|
return typeof t === "number" && Number.isFinite(t) ? t : 0;
|
||||||
|
})()
|
||||||
|
: 0;
|
||||||
|
formData.lineItems = nextItems;
|
||||||
|
formData.tax = nextTax;
|
||||||
|
formData.receiptTotal = nextReceiptTotal;
|
||||||
|
});
|
||||||
|
|
||||||
|
const lineItems = $derived(formData.lineItems);
|
||||||
|
const tax = $derived(formData.tax);
|
||||||
|
const receiptTotal = $derived(formData.receiptTotal);
|
||||||
|
|
||||||
|
const subtotal = $derived(
|
||||||
|
lineItems.reduce((sum, row) => sum + (Number(row.quantity) || 0) * (Number(row.price) || 0), 0)
|
||||||
|
);
|
||||||
|
const total = $derived(subtotal + (Number(tax) || 0));
|
||||||
|
const totalDelta = $derived((Number(receiptTotal) || 0) - (Number(total) || 0));
|
||||||
|
|
||||||
function imageUrl(r: StackqReceipt): string | null {
|
function imageUrl(r: StackqReceipt): string | null {
|
||||||
if (!r?.Image) return null;
|
const raw = r?.Image;
|
||||||
return `${POCKETBASE_BASE_URL}/api/files/${COLLECTION}/${r.id}/${r.Image}`;
|
if (raw == null || raw === "") return null;
|
||||||
|
const filename = typeof raw === "string" ? raw : Array.isArray(raw) ? raw[0] : null;
|
||||||
|
if (!filename) return null;
|
||||||
|
return `/api/files/${COLLECTION}/${r!.id}/${encodeURIComponent(filename)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const currentImageUrl = $derived(receipt?.Image ? imageUrl(receipt) : null);
|
||||||
|
|
||||||
function formatDate(iso: string): string {
|
function formatDate(iso: string): string {
|
||||||
try {
|
try {
|
||||||
return new Date(iso).toLocaleString(undefined, {
|
return new Date(iso).toLocaleString(undefined, {
|
||||||
@@ -25,77 +93,331 @@
|
|||||||
return iso;
|
return iso;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addLine() {
|
||||||
|
formData.lineItems.push({ item: "", description: "", quantity: 1, price: 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeLine(i: number) {
|
||||||
|
formData.lineItems.splice(i, 1);
|
||||||
|
if (formData.lineItems.length === 0) formData.lineItems.push({ item: "", description: "", quantity: 1, price: 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildDataJson(): string {
|
||||||
|
const data = {
|
||||||
|
lineItems: formData.lineItems.map((row) => ({
|
||||||
|
item: String(row.item ?? ""),
|
||||||
|
description: String(row.description ?? ""),
|
||||||
|
quantity: Number(row.quantity) || 0,
|
||||||
|
price: Number(row.price) || 0,
|
||||||
|
})),
|
||||||
|
tax: Number(formData.tax) || 0,
|
||||||
|
receiptTotal: Number(formData.receiptTotal) || 0,
|
||||||
|
};
|
||||||
|
return JSON.stringify(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
let imageInputEl = $state<HTMLInputElement | null>(null);
|
||||||
|
let imageFileName = $state<string | null>(null);
|
||||||
|
let selectedImageFile = $state<File | null>(null);
|
||||||
|
let imageError = $state(false);
|
||||||
|
|
||||||
|
/** On small screens image is collapsed by default; on lg+ expanded. */
|
||||||
|
let imageOpen = $state(false);
|
||||||
|
let imageOpenInitialized = $state(false);
|
||||||
|
$effect(() => {
|
||||||
|
if (typeof window === "undefined" || imageOpenInitialized) return;
|
||||||
|
imageOpenInitialized = true;
|
||||||
|
const mq = window.matchMedia("(min-width: 1024px)");
|
||||||
|
imageOpen = mq.matches;
|
||||||
|
});
|
||||||
|
|
||||||
|
function openReplaceImage() {
|
||||||
|
imageInputEl?.click();
|
||||||
|
}
|
||||||
|
function onImageChange() {
|
||||||
|
const input = imageInputEl;
|
||||||
|
const file = input?.files?.[0] ?? null;
|
||||||
|
selectedImageFile = file;
|
||||||
|
imageFileName = file ? file.name : null;
|
||||||
|
}
|
||||||
|
function imageLoadError() {
|
||||||
|
imageError = true;
|
||||||
|
}
|
||||||
|
$effect(() => {
|
||||||
|
if (receipt?.Image) imageError = false;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
<title>Receipt {receipt?.Status ?? receipt?.id ?? "—"} – Stackq</title>
|
<title>Receipt {receipt?.Status ?? receipt?.id ?? "—"} – Stackq</title>
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<main class="container mx-auto flex flex-col gap-6 px-4 py-6 sm:px-6 sm:py-8">
|
<main class="flex w-full max-w-full flex-col gap-6 px-4 py-6 sm:px-6 sm:py-8">
|
||||||
<div class="flex items-center gap-3">
|
<div class="flex items-center gap-3">
|
||||||
<a href="/receipts" class="text-muted-foreground hover:text-foreground shrink-0 text-sm" title="Back to receipts">Back</a>
|
<a href="/receipts" class="text-muted-foreground hover:text-foreground shrink-0 text-sm" title="Back to receipts">Back</a>
|
||||||
<h1 class="text-xl font-semibold sm:text-2xl">Receipt</h1>
|
<h1 class="text-xl font-semibold sm:text-2xl">Receipt</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if receipt}
|
{#if receipt}
|
||||||
<Card>
|
{@const url = currentImageUrl}
|
||||||
<CardContent class="flex flex-col gap-4 py-6">
|
<div class="grid grid-cols-1 gap-6 lg:grid-cols-[1fr_1.2fr]">
|
||||||
<dl class="grid gap-3 text-sm">
|
<Card class="h-fit w-full">
|
||||||
<div class="flex gap-2">
|
<CardContent class="p-4">
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Status</dt>
|
<Collapsible.Root bind:open={imageOpen} class="space-y-2">
|
||||||
<dd>{receipt.Status ?? "—"}</dd>
|
<div class="flex items-center justify-between gap-2 lg:hidden">
|
||||||
</div>
|
<span class="text-muted-foreground text-sm font-medium">Receipt image</span>
|
||||||
<div class="flex gap-2">
|
<Collapsible.Trigger
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Type</dt>
|
class="inline-flex size-8 items-center justify-center rounded-md border border-input bg-background hover:bg-accent hover:text-accent-foreground"
|
||||||
<dd>{receipt.Type ?? "—"}</dd>
|
type="button"
|
||||||
</div>
|
>
|
||||||
<div class="flex gap-2">
|
{#if imageOpen}
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">User</dt>
|
<ChevronUpIcon class="size-4" aria-hidden />
|
||||||
<dd>
|
|
||||||
{#if receipt.expand?.User}
|
|
||||||
{receipt.expand.User.name ?? receipt.expand.User.email ?? receipt.expand.User.id}
|
|
||||||
{:else}
|
|
||||||
—
|
|
||||||
{/if}
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Created</dt>
|
|
||||||
<dd>{formatDate(receipt.created)}</dd>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Updated</dt>
|
|
||||||
<dd>{formatDate(receipt.updated)}</dd>
|
|
||||||
</div>
|
|
||||||
{#if receipt.Data && Object.keys(receipt.Data).length > 0}
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Data</dt>
|
|
||||||
<dd class="min-w-0 overflow-auto rounded border bg-muted/30 p-2 font-mono text-xs">
|
|
||||||
<pre>{JSON.stringify(receipt.Data, null, 2)}</pre>
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
{#if receipt.Image}
|
|
||||||
{@const url = imageUrl(receipt)}
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<dt class="text-muted-foreground w-24 shrink-0">Image</dt>
|
|
||||||
<dd>
|
|
||||||
{#if url}
|
|
||||||
<img
|
|
||||||
src={url}
|
|
||||||
alt="Receipt"
|
|
||||||
class="max-h-48 rounded border object-contain"
|
|
||||||
/>
|
|
||||||
{:else}
|
{:else}
|
||||||
—
|
<ChevronDownIcon class="size-4" aria-hidden />
|
||||||
{/if}
|
{/if}
|
||||||
</dd>
|
<span class="sr-only">{imageOpen ? "Hide image" : "Show image"}</span>
|
||||||
|
</Collapsible.Trigger>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
<Collapsible.Content>
|
||||||
</dl>
|
{#if url}
|
||||||
<a href="/receipts">
|
<div class="min-h-[200px] w-full rounded border bg-muted/20">
|
||||||
<Button variant="outline">Back to receipts</Button>
|
{#if imageError}
|
||||||
</a>
|
<div class="flex min-h-[200px] flex-col items-center justify-center gap-2 p-4 text-center text-sm">
|
||||||
|
<p class="text-muted-foreground">Image could not be loaded.</p>
|
||||||
|
<a href={url} download class="text-primary hover:underline text-sm">Download image</a>
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<img
|
||||||
|
src={url}
|
||||||
|
alt="Receipt"
|
||||||
|
class="h-auto w-full rounded object-contain"
|
||||||
|
loading="lazy"
|
||||||
|
onerror={imageLoadError}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<p class="text-muted-foreground text-center text-sm">No image. Add one in the form and save.</p>
|
||||||
|
{/if}
|
||||||
|
</Collapsible.Content>
|
||||||
|
</Collapsible.Root>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
<Card>
|
||||||
|
<CardContent class="p-4">
|
||||||
|
<form
|
||||||
|
method="POST"
|
||||||
|
action="?/update"
|
||||||
|
enctype="multipart/form-data"
|
||||||
|
use:enhance={({ formData: fd }) => {
|
||||||
|
if (selectedImageFile) fd.set("Image", selectedImageFile);
|
||||||
|
return async ({ update, result }) => {
|
||||||
|
await update();
|
||||||
|
if (result.type === "success" && (result.data as { success?: boolean } | undefined)?.success) {
|
||||||
|
selectedImageFile = null;
|
||||||
|
imageFileName = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
class="flex flex-col gap-4"
|
||||||
|
>
|
||||||
|
<input type="hidden" name="dataJson" value={buildDataJson()} />
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<Button type="button" variant="outline" size="sm" onclick={openReplaceImage}>
|
||||||
|
{receipt.Image ? "Replace image" : "Add image"}
|
||||||
|
</Button>
|
||||||
|
<input
|
||||||
|
bind:this={imageInputEl}
|
||||||
|
type="file"
|
||||||
|
name="Image"
|
||||||
|
accept="image/*"
|
||||||
|
capture="environment"
|
||||||
|
onchange={onImageChange}
|
||||||
|
class="hidden"
|
||||||
|
/>
|
||||||
|
{#if imageFileName}
|
||||||
|
<span class="text-muted-foreground text-xs">New: {imageFileName}</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="grid gap-4 sm:grid-cols-2">
|
||||||
|
<div class="space-y-2">
|
||||||
|
<Label for="Status">Status</Label>
|
||||||
|
<select
|
||||||
|
id="Status"
|
||||||
|
name="Status"
|
||||||
|
class="border-input bg-background flex h-9 w-full rounded-md border px-3 py-1 text-sm shadow-xs"
|
||||||
|
>
|
||||||
|
{#each STATUS_OPTIONS as o}
|
||||||
|
<option value={o} selected={receipt.Status === o}>{o}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-2">
|
||||||
|
<Label for="Type">Type</Label>
|
||||||
|
<select
|
||||||
|
id="Type"
|
||||||
|
name="Type"
|
||||||
|
class="border-input bg-background flex h-9 w-full rounded-md border px-3 py-1 text-sm shadow-xs"
|
||||||
|
>
|
||||||
|
{#each TYPE_OPTIONS as o}
|
||||||
|
<option value={o} selected={receipt.Type === o}>{o}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2">
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<Label>Line items</Label>
|
||||||
|
<Button type="button" variant="outline" size="sm" onclick={addLine}>Add line</Button>
|
||||||
|
</div>
|
||||||
|
<div class="overflow-x-auto">
|
||||||
|
<table class="w-full text-sm">
|
||||||
|
<thead>
|
||||||
|
<tr class="border-b text-left text-muted-foreground">
|
||||||
|
<th class="pb-2 pr-2 font-medium">Item</th>
|
||||||
|
<th class="pb-2 pr-2 font-medium">Description</th>
|
||||||
|
<th class="w-20 pb-2 pr-2 font-medium">Qty</th>
|
||||||
|
<th class="w-24 pb-2 pr-2 font-medium">Price</th>
|
||||||
|
<th class="w-9 pb-2"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each formData.lineItems as row, i}
|
||||||
|
<tr class="border-b">
|
||||||
|
<td class="py-1.5 pr-2">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="Item"
|
||||||
|
class="h-8 text-sm"
|
||||||
|
bind:value={formData.lineItems[i].item}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="py-1.5 pr-2">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="Description"
|
||||||
|
class="h-8 text-sm"
|
||||||
|
bind:value={formData.lineItems[i].description}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="py-1.5 pr-2">
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
step="1"
|
||||||
|
class="h-8 text-sm"
|
||||||
|
bind:value={formData.lineItems[i].quantity}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="py-1.5 pr-2">
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
step="0.01"
|
||||||
|
class="h-8 text-sm"
|
||||||
|
bind:value={formData.lineItems[i].price}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="py-1.5">
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="text-destructive h-8 w-8 p-0"
|
||||||
|
onclick={() => removeLine(i)}
|
||||||
|
title="Remove line"
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</Button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-t pt-4">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<div class="space-y-2">
|
||||||
|
<Label for="tax">Tax</Label>
|
||||||
|
<Input
|
||||||
|
id="tax"
|
||||||
|
type="number"
|
||||||
|
step="0.01"
|
||||||
|
class="w-28"
|
||||||
|
bind:value={formData.tax}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-2">
|
||||||
|
<Label for="receiptTotal">Receipt total</Label>
|
||||||
|
<Input
|
||||||
|
id="receiptTotal"
|
||||||
|
type="number"
|
||||||
|
step="0.01"
|
||||||
|
class="w-28"
|
||||||
|
bind:value={formData.receiptTotal}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<dl class="mt-4 space-y-1 text-sm">
|
||||||
|
<div class="flex justify-between gap-4">
|
||||||
|
<dt class="text-muted-foreground">Subtotal</dt>
|
||||||
|
<dd>${subtotal.toFixed(2)}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between gap-4">
|
||||||
|
<dt class="text-muted-foreground">Tax</dt>
|
||||||
|
<dd>${(Number(tax) || 0).toFixed(2)}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between gap-4 border-t pt-2 font-medium">
|
||||||
|
<dt>Total</dt>
|
||||||
|
<dd>${total.toFixed(2)}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between gap-4 pt-2">
|
||||||
|
<dt class="text-muted-foreground">Receipt total</dt>
|
||||||
|
<dd>${(Number(receiptTotal) || 0).toFixed(2)}</dd>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between gap-4">
|
||||||
|
<dt class="text-muted-foreground">Diff</dt>
|
||||||
|
<dd class={Math.abs(totalDelta) < 0.01 ? "text-emerald-600" : "text-amber-600"}>
|
||||||
|
{totalDelta >= 0 ? "+" : ""}{totalDelta.toFixed(2)}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if form?.error && form?.form === "update"}
|
||||||
|
<p class="text-destructive text-sm">{form.error}</p>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<div class="flex flex-wrap gap-2 pt-2">
|
||||||
|
<Button type="submit">Save</Button>
|
||||||
|
<a href="/receipts">
|
||||||
|
<Button type="button" variant="outline">Back to receipts</Button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Card>
|
||||||
|
<CardContent class="flex flex-row flex-wrap items-center justify-between gap-4 py-4">
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
User: {receipt.expand?.User?.name ?? receipt.expand?.User?.email ?? "—"} · Created {formatDate(receipt.created)} · Updated {formatDate(receipt.updated)}
|
||||||
|
</p>
|
||||||
|
<form
|
||||||
|
method="POST"
|
||||||
|
action="?/delete"
|
||||||
|
onsubmit={(e) => {
|
||||||
|
if (!confirm("Delete this receipt? This cannot be undone.")) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button type="submit" variant="destructive">Delete receipt</Button>
|
||||||
|
</form>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
{:else}
|
{:else}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "Stackq",
|
||||||
|
"short_name": "Stackq",
|
||||||
|
"description": "Stackq inventory and receipts",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#0f172a",
|
||||||
|
"theme_color": "#0f172a",
|
||||||
|
"lang": "en",
|
||||||
|
"scope": "/",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/icon.svg",
|
||||||
|
"sizes": "any",
|
||||||
|
"type": "image/svg+xml",
|
||||||
|
"purpose": "any"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/icon.svg",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml",
|
||||||
|
"purpose": "maskable"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user