@smuzi/logger-ui 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/auth.d.ts +17 -0
- package/build/auth.js +104 -0
- package/build/commands.d.ts +7 -0
- package/build/commands.js +67 -0
- package/build/handlers.d.ts +6 -2
- package/build/handlers.js +62 -10
- package/build/index.d.ts +4 -0
- package/build/index.js +4 -0
- package/build/password.d.ts +4 -0
- package/build/password.js +33 -0
- package/build/query.js +6 -0
- package/build/routes.d.ts +6 -2
- package/build/routes.js +12 -6
- package/build/server.d.ts +3 -2
- package/build/server.js +4 -4
- package/build/ui/app.css +1 -1
- package/build/ui/app.js +2 -2
- package/build/ui/index.html +85 -15
- package/build/ui/login.html +37 -0
- package/build/users.d.ts +19 -0
- package/build/users.js +68 -0
- package/package.json +8 -4
package/build/auth.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpRequest, Option, Result, StdError } from "@smuzi/std";
|
|
2
|
+
import { LoggerUiUser, LoggerUiUsersRepository } from "./users.js";
|
|
3
|
+
export declare const LOGGER_UI_SESSION_COOKIE = "logger_ui_session";
|
|
4
|
+
export declare const LOGGER_UI_SESSION_DEFAULT_TTL_SECONDS: number;
|
|
5
|
+
export type LoggerUiAuthOptions = {
|
|
6
|
+
session_secret?: string;
|
|
7
|
+
session_ttl_seconds?: number;
|
|
8
|
+
secure_cookie?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare class LoggerUiAuth {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(users: LoggerUiUsersRepository, { session_secret, session_ttl_seconds, secure_cookie }?: LoggerUiAuthOptions);
|
|
13
|
+
login(email: string, password: string): Promise<Result<Option<string>, StdError>>;
|
|
14
|
+
authenticate(request: HttpRequest): Promise<Result<Option<LoggerUiUser>, StdError>>;
|
|
15
|
+
sessionCookie(token: string, path: string): string;
|
|
16
|
+
clearSessionCookie(path: string): string;
|
|
17
|
+
}
|
package/build/auth.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { Err, None, Ok, Some } from "@smuzi/std";
|
|
3
|
+
import { generatePassword, hashPassword, verifyPassword } from "./password.js";
|
|
4
|
+
export const LOGGER_UI_SESSION_COOKIE = "logger_ui_session";
|
|
5
|
+
export const LOGGER_UI_SESSION_DEFAULT_TTL_SECONDS = 60 * 60 * 12;
|
|
6
|
+
function readCookie(request, name) {
|
|
7
|
+
const header = request.headers.get("cookie").someOr("");
|
|
8
|
+
for (const part of header.split(";")) {
|
|
9
|
+
const separator = part.indexOf("=");
|
|
10
|
+
if (separator !== -1 && part.slice(0, separator).trim() === name) {
|
|
11
|
+
return Some(decodeURIComponent(part.slice(separator + 1).trim()));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return None();
|
|
15
|
+
}
|
|
16
|
+
function safeEqual(left, right) {
|
|
17
|
+
const left_buffer = Buffer.from(left);
|
|
18
|
+
const right_buffer = Buffer.from(right);
|
|
19
|
+
return left_buffer.length === right_buffer.length && timingSafeEqual(left_buffer, right_buffer);
|
|
20
|
+
}
|
|
21
|
+
export class LoggerUiAuth {
|
|
22
|
+
#users;
|
|
23
|
+
#secret;
|
|
24
|
+
#ttl_seconds;
|
|
25
|
+
#secure_cookie;
|
|
26
|
+
#dummy_hash = null;
|
|
27
|
+
constructor(users, { session_secret, session_ttl_seconds = LOGGER_UI_SESSION_DEFAULT_TTL_SECONDS, secure_cookie = false } = {}) {
|
|
28
|
+
this.#users = users;
|
|
29
|
+
this.#secret = session_secret !== undefined && session_secret !== ""
|
|
30
|
+
? Buffer.from(session_secret)
|
|
31
|
+
: randomBytes(32);
|
|
32
|
+
this.#ttl_seconds = session_ttl_seconds;
|
|
33
|
+
this.#secure_cookie = secure_cookie;
|
|
34
|
+
}
|
|
35
|
+
// The password hash is part of the signature, so a changed password invalidates old sessions.
|
|
36
|
+
#sign(payload, user) {
|
|
37
|
+
return createHmac("sha256", this.#secret)
|
|
38
|
+
.update(payload + "." + user.password_hash)
|
|
39
|
+
.digest("base64url");
|
|
40
|
+
}
|
|
41
|
+
#createToken(user) {
|
|
42
|
+
const expires_at = Math.floor(Date.now() / 1000) + this.#ttl_seconds;
|
|
43
|
+
const payload = user.id + "." + expires_at;
|
|
44
|
+
return payload + "." + this.#sign(payload, user);
|
|
45
|
+
}
|
|
46
|
+
// Hashing against a throwaway hash keeps response time the same for unknown emails.
|
|
47
|
+
#dummyHash() {
|
|
48
|
+
this.#dummy_hash ??= hashPassword(generatePassword());
|
|
49
|
+
return this.#dummy_hash;
|
|
50
|
+
}
|
|
51
|
+
// Returns the session token on valid credentials.
|
|
52
|
+
async login(email, password) {
|
|
53
|
+
const found = await this.#users.findByEmail(email);
|
|
54
|
+
if (found.isErr()) {
|
|
55
|
+
return Err(found.unsafeSource());
|
|
56
|
+
}
|
|
57
|
+
const user = found.unwrap();
|
|
58
|
+
if (user.isNone()) {
|
|
59
|
+
await verifyPassword(password, await this.#dummyHash());
|
|
60
|
+
return Ok(None());
|
|
61
|
+
}
|
|
62
|
+
const valid = await verifyPassword(password, user.unwrap().password_hash);
|
|
63
|
+
return Ok(valid ? Some(this.#createToken(user.unwrap())) : None());
|
|
64
|
+
}
|
|
65
|
+
async authenticate(request) {
|
|
66
|
+
const token = readCookie(request, LOGGER_UI_SESSION_COOKIE);
|
|
67
|
+
if (token.isNone()) {
|
|
68
|
+
return Ok(None());
|
|
69
|
+
}
|
|
70
|
+
const [id, expires_at, signature] = token.unwrap().split(".");
|
|
71
|
+
const user_id = Number(id);
|
|
72
|
+
if (!Number.isInteger(user_id) || signature === undefined || Number(expires_at) < Date.now() / 1000) {
|
|
73
|
+
return Ok(None());
|
|
74
|
+
}
|
|
75
|
+
const found = await this.#users.findById(user_id);
|
|
76
|
+
if (found.isErr()) {
|
|
77
|
+
return found;
|
|
78
|
+
}
|
|
79
|
+
const user = found.unwrap();
|
|
80
|
+
if (user.isNone() || !safeEqual(signature, this.#sign(id + "." + expires_at, user.unwrap()))) {
|
|
81
|
+
return Ok(None());
|
|
82
|
+
}
|
|
83
|
+
return Ok(user);
|
|
84
|
+
}
|
|
85
|
+
#cookie(value, path, max_age) {
|
|
86
|
+
const attributes = [
|
|
87
|
+
`${LOGGER_UI_SESSION_COOKIE}=${encodeURIComponent(value)}`,
|
|
88
|
+
`Path=${path === "" ? "/" : path}`,
|
|
89
|
+
`Max-Age=${max_age}`,
|
|
90
|
+
"HttpOnly",
|
|
91
|
+
"SameSite=Strict",
|
|
92
|
+
];
|
|
93
|
+
if (this.#secure_cookie) {
|
|
94
|
+
attributes.push("Secure");
|
|
95
|
+
}
|
|
96
|
+
return attributes.join("; ");
|
|
97
|
+
}
|
|
98
|
+
sessionCookie(token, path) {
|
|
99
|
+
return this.#cookie(token, path, this.#ttl_seconds);
|
|
100
|
+
}
|
|
101
|
+
clearSessionCookie(path) {
|
|
102
|
+
return this.#cookie("", path, 0);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TInputParams, TOutputConsole } from "@smuzi/console";
|
|
2
|
+
import { Result } from "@smuzi/std";
|
|
3
|
+
import { LoggerUiUsersRepository } from "./users.js";
|
|
4
|
+
export declare function parseUserEmail(value: string): Result<string, string>;
|
|
5
|
+
export declare function createUserCommand(users: LoggerUiUsersRepository): (output: TOutputConsole, params: TInputParams) => Promise<void>;
|
|
6
|
+
export declare function resetPasswordCommand(users: LoggerUiUsersRepository): (output: TOutputConsole, params: TInputParams) => Promise<void>;
|
|
7
|
+
export declare const loggerUiConsole: (users: LoggerUiUsersRepository, prefix_command?: string) => import("@smuzi/console").ConsoleRouter;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { CreateConsoleRouter } from "@smuzi/console";
|
|
2
|
+
import { Err, Ok, Some } from "@smuzi/std";
|
|
3
|
+
import { generatePassword, hashPassword } from "./password.js";
|
|
4
|
+
import { normalizeEmail } from "./users.js";
|
|
5
|
+
export function parseUserEmail(value) {
|
|
6
|
+
const email = normalizeEmail(value);
|
|
7
|
+
if (email === "") {
|
|
8
|
+
return Err("Argument --email is required, e.g. --email=admin@example.com");
|
|
9
|
+
}
|
|
10
|
+
const at = email.indexOf("@");
|
|
11
|
+
if (at <= 0 || at === email.length - 1) {
|
|
12
|
+
return Err(`'${email}' is not an email: expected <name>@<domain>`);
|
|
13
|
+
}
|
|
14
|
+
return Ok(email);
|
|
15
|
+
}
|
|
16
|
+
export function createUserCommand(users) {
|
|
17
|
+
return async (output, params) => {
|
|
18
|
+
const email = parseUserEmail(params.get("email").someOr(""));
|
|
19
|
+
if (email.isErr()) {
|
|
20
|
+
output.error(email.unsafeSource());
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const existing = (await users.findByEmail(email.unwrap())).unwrap();
|
|
25
|
+
if (existing.isSome()) {
|
|
26
|
+
output.error(`User '${email.unwrap()}' already exists`);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const password = generatePassword();
|
|
31
|
+
const user = (await users.create(email.unwrap(), await hashPassword(password))).unwrap();
|
|
32
|
+
output.success(`Logger UI user created: ${user.email}`);
|
|
33
|
+
output.info("Password (shown only once):");
|
|
34
|
+
output.bold(password);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function resetPasswordCommand(users) {
|
|
38
|
+
return async (output, params) => {
|
|
39
|
+
const email = parseUserEmail(params.get("email").someOr(""));
|
|
40
|
+
if (email.isErr()) {
|
|
41
|
+
output.error(email.unsafeSource());
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const password = generatePassword();
|
|
46
|
+
// Updates only this one row by email; never affects any other user.
|
|
47
|
+
const updated = (await users.updatePasswordByEmail(email.unwrap(), await hashPassword(password))).unwrap();
|
|
48
|
+
if (updated.isNone()) {
|
|
49
|
+
output.error(`User '${email.unwrap()}' does not exist`);
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
output.success(`Logger UI user password reset: ${updated.unwrap().email}`);
|
|
54
|
+
output.info("New password (shown only once):");
|
|
55
|
+
output.bold(password);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Usage: <prefix>users:create --email=admin@example.com
|
|
59
|
+
// Usage: <prefix>users:reset-password --email=admin@example.com
|
|
60
|
+
export const loggerUiConsole = (users, prefix_command = "logger-ui:") => {
|
|
61
|
+
const router = CreateConsoleRouter(prefix_command);
|
|
62
|
+
const router_users = CreateConsoleRouter("users:");
|
|
63
|
+
router_users.add({ path: "create", description: Some("Create logger UI user and print generated password: --email=<email>") }, createUserCommand(users));
|
|
64
|
+
router_users.add({ path: "reset-password", description: Some("Generate and set a new password for an existing user, print it: --email=<email>") }, resetPasswordCommand(users));
|
|
65
|
+
router.group(router_users);
|
|
66
|
+
return router;
|
|
67
|
+
};
|
package/build/handlers.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { ServerResponse } from "node:http";
|
|
2
2
|
import { Action } from "@smuzi/http-server";
|
|
3
3
|
import { LogsReader } from "@smuzi/logger";
|
|
4
|
+
import { LoggerUiAuth } from "./auth.js";
|
|
4
5
|
export declare enum UiAsset {
|
|
5
6
|
script = "app.js",
|
|
6
7
|
style = "app.css"
|
|
7
8
|
}
|
|
8
|
-
export declare function uiPageAction(base_path: string): Action<ServerResponse>;
|
|
9
|
+
export declare function uiPageAction(auth: LoggerUiAuth, base_path: string): Action<ServerResponse>;
|
|
10
|
+
export declare function loginPageAction(auth: LoggerUiAuth, base_path: string): Action<ServerResponse>;
|
|
11
|
+
export declare function loginAction(auth: LoggerUiAuth, base_path: string): Action<ServerResponse>;
|
|
12
|
+
export declare function logoutAction(auth: LoggerUiAuth, base_path: string): Action<ServerResponse>;
|
|
9
13
|
export declare function uiAssetAction(asset: UiAsset): Action<ServerResponse>;
|
|
10
|
-
export declare function logsQueryAction(reader: LogsReader): Action<ServerResponse>;
|
|
14
|
+
export declare function logsQueryAction(auth: LoggerUiAuth, reader: LogsReader): Action<ServerResponse>;
|
package/build/handlers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { HttpResponse, ResponseHttpHeaders, Some } from "@smuzi/std";
|
|
2
|
+
import { asObject, asString, HttpResponse, ResponseHttpHeaders, Some } from "@smuzi/std";
|
|
3
3
|
import { parseLogsQuery } from "./query.js";
|
|
4
4
|
// Resolves to <package>/build/ui both from src/ (workspace) and from build/ (published).
|
|
5
5
|
const UI_DIR = new URL("../build/ui/", import.meta.url);
|
|
@@ -37,15 +37,67 @@ function escapeHtmlAttribute(value) {
|
|
|
37
37
|
.replace(/</g, "<")
|
|
38
38
|
.replace(/>/g, ">");
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
async function htmlPageResponse(file, base_path) {
|
|
41
|
+
const html = await readUiFile(file);
|
|
42
|
+
if (html === null) {
|
|
43
|
+
return assetsNotBuiltResponse();
|
|
44
|
+
}
|
|
45
|
+
return textResponse(html.replaceAll("{{base}}", escapeHtmlAttribute(base_path)), "text/html; charset=utf-8");
|
|
46
|
+
}
|
|
47
|
+
function authErrorResponse(message) {
|
|
48
|
+
return HttpResponse.asJson({ error: message }, 500);
|
|
49
|
+
}
|
|
50
|
+
// Runs the action only for a logged-in user; guests get `onGuest`.
|
|
51
|
+
function authenticated(auth, action, onGuest) {
|
|
52
|
+
return async (context) => {
|
|
53
|
+
const user = await auth.authenticate(context.request);
|
|
54
|
+
if (user.isErr()) {
|
|
55
|
+
return authErrorResponse(user.unsafeSource().message);
|
|
56
|
+
}
|
|
57
|
+
return user.unwrap().isSome() ? action(context) : onGuest(context);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function uiPageAction(auth, base_path) {
|
|
61
|
+
return authenticated(auth, () => htmlPageResponse("index.html", base_path), () => HttpResponse.asRedirect(base_path + "/login"));
|
|
62
|
+
}
|
|
63
|
+
export function loginPageAction(auth, base_path) {
|
|
64
|
+
return authenticated(auth, () => HttpResponse.asRedirect(base_path === "" ? "/" : base_path), () => htmlPageResponse("login.html", base_path));
|
|
65
|
+
}
|
|
66
|
+
export function loginAction(auth, base_path) {
|
|
67
|
+
return async (context) => {
|
|
68
|
+
const body = await context.request.body();
|
|
69
|
+
if (body.isErr()) {
|
|
70
|
+
return HttpResponse.asJson({ error: "Unable to read request body" }, 400);
|
|
71
|
+
}
|
|
72
|
+
let input;
|
|
73
|
+
try {
|
|
74
|
+
input = JSON.parse(body.unwrap());
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return HttpResponse.asJson({ error: "Request body must be valid JSON" }, 400);
|
|
78
|
+
}
|
|
79
|
+
if (!asObject(input) || !asString(input.email) || !asString(input.password)) {
|
|
80
|
+
return HttpResponse.asJson({ error: "'email' and 'password' must be strings" }, 422);
|
|
45
81
|
}
|
|
46
|
-
|
|
82
|
+
const token = await auth.login(input.email, input.password);
|
|
83
|
+
if (token.isErr()) {
|
|
84
|
+
return authErrorResponse(token.unsafeSource().message);
|
|
85
|
+
}
|
|
86
|
+
return token.unwrap().match({
|
|
87
|
+
Some: (value) => HttpResponse.asJson({ ok: true }).mapOk((response) => {
|
|
88
|
+
response.headers.set("set-cookie", auth.sessionCookie(value, base_path));
|
|
89
|
+
return response;
|
|
90
|
+
}),
|
|
91
|
+
None: () => HttpResponse.asJson({ error: "Invalid email or password" }, 401),
|
|
92
|
+
});
|
|
47
93
|
};
|
|
48
94
|
}
|
|
95
|
+
export function logoutAction(auth, base_path) {
|
|
96
|
+
return () => HttpResponse.asJson({ ok: true }).mapOk((response) => {
|
|
97
|
+
response.headers.set("set-cookie", auth.clearSessionCookie(base_path));
|
|
98
|
+
return response;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
49
101
|
export function uiAssetAction(asset) {
|
|
50
102
|
return async () => {
|
|
51
103
|
const content = await readUiFile(asset);
|
|
@@ -55,8 +107,8 @@ export function uiAssetAction(asset) {
|
|
|
55
107
|
return textResponse(content, ASSET_CONTENT_TYPES[asset]);
|
|
56
108
|
};
|
|
57
109
|
}
|
|
58
|
-
export function logsQueryAction(reader) {
|
|
59
|
-
return async (context) => {
|
|
110
|
+
export function logsQueryAction(auth, reader) {
|
|
111
|
+
return authenticated(auth, async (context) => {
|
|
60
112
|
const body = await context.request.body();
|
|
61
113
|
if (body.isErr()) {
|
|
62
114
|
return HttpResponse.asJson({ error: "Unable to read request body" }, 400);
|
|
@@ -70,5 +122,5 @@ export function logsQueryAction(reader) {
|
|
|
70
122
|
Ok: (value) => HttpResponse.asJson(value),
|
|
71
123
|
Err: (error) => HttpResponse.asJson({ error: error.message }, 500),
|
|
72
124
|
});
|
|
73
|
-
};
|
|
125
|
+
}, () => HttpResponse.asJson({ error: "Unauthorized" }, 401));
|
|
74
126
|
}
|
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const GENERATED_PASSWORD_LENGTH = 24;
|
|
2
|
+
export declare function generatePassword(length?: number): string;
|
|
3
|
+
export declare function hashPassword(password: string): Promise<string>;
|
|
4
|
+
export declare function verifyPassword(password: string, password_hash: string): Promise<boolean>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { randomBytes, randomInt, scrypt, timingSafeEqual } from "node:crypto";
|
|
2
|
+
const SCRYPT_KEY_LENGTH = 64;
|
|
3
|
+
const SCRYPT_SALT_LENGTH = 16;
|
|
4
|
+
const PASSWORD_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789";
|
|
5
|
+
export const GENERATED_PASSWORD_LENGTH = 24;
|
|
6
|
+
function scryptKey(password, salt) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
scrypt(password, salt, SCRYPT_KEY_LENGTH, (error, key) => error ? reject(error) : resolve(key));
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
// Alphanumeric without look-alike characters, so it is easy to copy from the terminal.
|
|
12
|
+
export function generatePassword(length = GENERATED_PASSWORD_LENGTH) {
|
|
13
|
+
let password = "";
|
|
14
|
+
for (let index = 0; index < length; index++) {
|
|
15
|
+
password += PASSWORD_ALPHABET[randomInt(PASSWORD_ALPHABET.length)];
|
|
16
|
+
}
|
|
17
|
+
return password;
|
|
18
|
+
}
|
|
19
|
+
// Stored as "scrypt$<salt>$<key>", both base64url.
|
|
20
|
+
export async function hashPassword(password) {
|
|
21
|
+
const salt = randomBytes(SCRYPT_SALT_LENGTH);
|
|
22
|
+
const key = await scryptKey(password, salt);
|
|
23
|
+
return ["scrypt", salt.toString("base64url"), key.toString("base64url")].join("$");
|
|
24
|
+
}
|
|
25
|
+
export async function verifyPassword(password, password_hash) {
|
|
26
|
+
const [algorithm, salt, key] = password_hash.split("$");
|
|
27
|
+
if (algorithm !== "scrypt" || salt === undefined || key === undefined) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const expected = Buffer.from(key, "base64url");
|
|
31
|
+
const actual = await scryptKey(password, Buffer.from(salt, "base64url"));
|
|
32
|
+
return expected.length === actual.length && timingSafeEqual(expected, actual);
|
|
33
|
+
}
|
package/build/query.js
CHANGED
|
@@ -39,6 +39,12 @@ export function parseLogsQuery(body) {
|
|
|
39
39
|
}
|
|
40
40
|
query.trace_id = input.trace_id;
|
|
41
41
|
}
|
|
42
|
+
if (input.message !== undefined && input.message !== null) {
|
|
43
|
+
if (!asString(input.message)) {
|
|
44
|
+
return Err("'message' must be a string");
|
|
45
|
+
}
|
|
46
|
+
query.message = input.message;
|
|
47
|
+
}
|
|
42
48
|
if (input.tags !== undefined && input.tags !== null) {
|
|
43
49
|
if (!asArray(input.tags)) {
|
|
44
50
|
return Err("'tags' must be an array of {key, value}");
|
package/build/routes.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { Http1Router } from "@smuzi/http-server";
|
|
2
2
|
import { LogsReader } from "@smuzi/logger";
|
|
3
|
+
import { LoggerUiAuth } from "./auth.js";
|
|
3
4
|
export type LoggerUiRoutesOptions = {
|
|
4
5
|
prefix?: string;
|
|
5
6
|
};
|
|
6
7
|
export declare const LOGGER_UI_PATHS: {
|
|
7
8
|
readonly page: "";
|
|
9
|
+
readonly login_page: "login";
|
|
8
10
|
readonly script: string;
|
|
9
11
|
readonly style: string;
|
|
10
12
|
readonly query: "api/logs";
|
|
13
|
+
readonly login: "api/login";
|
|
14
|
+
readonly logout: "api/logout";
|
|
11
15
|
};
|
|
12
|
-
export declare function registerLoggerUiRoutes(router: Http1Router, reader: LogsReader, { prefix }?: LoggerUiRoutesOptions): Http1Router;
|
|
13
|
-
export declare function createLoggerUiRouter(reader: LogsReader, options?: LoggerUiRoutesOptions): Http1Router;
|
|
16
|
+
export declare function registerLoggerUiRoutes(router: Http1Router, reader: LogsReader, auth: LoggerUiAuth, { prefix }?: LoggerUiRoutesOptions): Http1Router;
|
|
17
|
+
export declare function createLoggerUiRouter(reader: LogsReader, auth: LoggerUiAuth, options?: LoggerUiRoutesOptions): Http1Router;
|
package/build/routes.js
CHANGED
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import { CreateHttp1Router } from "@smuzi/http-server";
|
|
2
|
-
import { logsQueryAction, UiAsset, uiAssetAction, uiPageAction } from "./handlers.js";
|
|
2
|
+
import { loginAction, loginPageAction, logoutAction, logsQueryAction, UiAsset, uiAssetAction, uiPageAction, } from "./handlers.js";
|
|
3
3
|
export const LOGGER_UI_PATHS = {
|
|
4
4
|
page: "",
|
|
5
|
+
login_page: "login",
|
|
5
6
|
script: "assets/" + UiAsset.script,
|
|
6
7
|
style: "assets/" + UiAsset.style,
|
|
7
8
|
query: "api/logs",
|
|
9
|
+
login: "api/login",
|
|
10
|
+
logout: "api/logout",
|
|
8
11
|
};
|
|
9
12
|
function normalizePrefix(prefix) {
|
|
10
13
|
return prefix.replace(/^\/+|\/+$/g, "");
|
|
11
14
|
}
|
|
12
|
-
export function registerLoggerUiRoutes(router, reader, { prefix = "" } = {}) {
|
|
15
|
+
export function registerLoggerUiRoutes(router, reader, auth, { prefix = "" } = {}) {
|
|
13
16
|
const base = normalizePrefix(prefix);
|
|
14
17
|
const withBase = (path) => [base, path].filter(part => part !== "").join("/");
|
|
15
18
|
const base_path = base === "" ? "" : "/" + base;
|
|
16
|
-
router.get(withBase(LOGGER_UI_PATHS.page), uiPageAction(base_path));
|
|
19
|
+
router.get(withBase(LOGGER_UI_PATHS.page), uiPageAction(auth, base_path));
|
|
20
|
+
router.get(withBase(LOGGER_UI_PATHS.login_page), loginPageAction(auth, base_path));
|
|
17
21
|
router.get(withBase(LOGGER_UI_PATHS.script), uiAssetAction(UiAsset.script));
|
|
18
22
|
router.get(withBase(LOGGER_UI_PATHS.style), uiAssetAction(UiAsset.style));
|
|
19
|
-
router.post(withBase(LOGGER_UI_PATHS.query), logsQueryAction(reader));
|
|
23
|
+
router.post(withBase(LOGGER_UI_PATHS.query), logsQueryAction(auth, reader));
|
|
24
|
+
router.post(withBase(LOGGER_UI_PATHS.login), loginAction(auth, base_path));
|
|
25
|
+
router.post(withBase(LOGGER_UI_PATHS.logout), logoutAction(auth, base_path));
|
|
20
26
|
return router;
|
|
21
27
|
}
|
|
22
|
-
export function createLoggerUiRouter(reader, options = {}) {
|
|
23
|
-
return registerLoggerUiRoutes(CreateHttp1Router({ path: "" }), reader, options);
|
|
28
|
+
export function createLoggerUiRouter(reader, auth, options = {}) {
|
|
29
|
+
return registerLoggerUiRoutes(CreateHttp1Router({ path: "" }), reader, auth, options);
|
|
24
30
|
}
|
package/build/server.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { LogsReader } from "@smuzi/logger";
|
|
2
2
|
import { LoggerUiRoutesOptions } from "./routes.js";
|
|
3
|
+
import { LoggerUiAuth } from "./auth.js";
|
|
3
4
|
export declare const LOGGER_UI_DEFAULT_PORT = 8090;
|
|
4
5
|
export type LoggerUiServerOptions = LoggerUiRoutesOptions & {
|
|
5
6
|
host?: string;
|
|
6
7
|
port?: number;
|
|
7
8
|
};
|
|
8
|
-
export declare function buildLoggerUiServerConfig(reader: LogsReader, { host, port, prefix }?: LoggerUiServerOptions): import("@smuzi/http-server").Http1ServerConfig;
|
|
9
|
-
export declare function runLoggerUi(reader: LogsReader, options?: LoggerUiServerOptions): Promise<import("@smuzi/std").Result<import("@smuzi/http-server").StdHttp1Server, import("@smuzi/http-server").HttpServerRunError>>;
|
|
9
|
+
export declare function buildLoggerUiServerConfig(reader: LogsReader, auth: LoggerUiAuth, { host, port, prefix }?: LoggerUiServerOptions): import("@smuzi/http-server").Http1ServerConfig;
|
|
10
|
+
export declare function runLoggerUi(reader: LogsReader, auth: LoggerUiAuth, options?: LoggerUiServerOptions): Promise<import("@smuzi/std").Result<import("@smuzi/http-server").StdHttp1Server, import("@smuzi/http-server").HttpServerRunError>>;
|
package/build/server.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { buildHttp1ServerConfig, http1ServerRun } from "@smuzi/http-server";
|
|
2
2
|
import { createLoggerUiRouter } from "./routes.js";
|
|
3
3
|
export const LOGGER_UI_DEFAULT_PORT = 8090;
|
|
4
|
-
export function buildLoggerUiServerConfig(reader, { host = "localhost", port = LOGGER_UI_DEFAULT_PORT, prefix } = {}) {
|
|
4
|
+
export function buildLoggerUiServerConfig(reader, auth, { host = "localhost", port = LOGGER_UI_DEFAULT_PORT, prefix } = {}) {
|
|
5
5
|
return buildHttp1ServerConfig({
|
|
6
6
|
host,
|
|
7
7
|
port,
|
|
8
|
-
router: createLoggerUiRouter(reader, { prefix }),
|
|
8
|
+
router: createLoggerUiRouter(reader, auth, { prefix }),
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
|
-
export function runLoggerUi(reader, options = {}) {
|
|
12
|
-
return http1ServerRun(buildLoggerUiServerConfig(reader, options));
|
|
11
|
+
export function runLoggerUi(reader, auth, options = {}) {
|
|
12
|
+
return http1ServerRun(buildLoggerUiServerConfig(reader, auth, options));
|
|
13
13
|
}
|
package/build/ui/app.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-800:oklch(45.5% .188 13.697);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-white:#fff;--spacing:.25rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mx-auto{margin-inline:auto}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-48{width:calc(var(--spacing) * 48)}.max-w-6xl{max-width:var(--container-6xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-\[6\.5rem_3\.5rem_1fr\]{grid-template-columns:6.5rem 3.5rem 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-rose-200{border-color:var(--color-rose-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-white{background-color:var(--color-white)}.p-4{padding:calc(var(--spacing) * 4)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pr-1{padding-right:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-rose-800{color:var(--color-rose-800)}.text-sky-800{color:var(--color-sky-800)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-white{color:var(--color-white)}.italic{font-style:italic}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}.hover\:bg-sky-200:hover{background-color:var(--color-sky-200)}.hover\:bg-sky-700:hover{background-color:var(--color-sky-700)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-violet-200:hover{background-color:var(--color-violet-200)}.hover\:text-sky-800:hover{color:var(--color-sky-800)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-sky-500:focus{border-color:var(--color-sky-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-40:disabled{opacity:.4}}[x-cloak]{display:none!important}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-800:oklch(45.5% .188 13.697);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.inset-0{inset:0}.z-50{z-index:50}.mx-auto{margin-inline:auto}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-40{width:calc(var(--spacing) * 40)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:0}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-\[6\.5rem_3\.5rem_1fr\]{grid-template-columns:6.5rem 3.5rem 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-rose-200{border-color:var(--color-rose-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/40{background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.bg-violet-100{background-color:var(--color-violet-100)}.bg-white{background-color:var(--color-white)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-800{color:var(--color-amber-800)}.text-rose-800{color:var(--color-rose-800)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-white{color:var(--color-white)}.italic{font-style:italic}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.hover\:bg-amber-200:hover{background-color:var(--color-amber-200)}.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}.hover\:bg-sky-200:hover{background-color:var(--color-sky-200)}.hover\:bg-sky-700:hover{background-color:var(--color-sky-700)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-violet-200:hover{background-color:var(--color-violet-200)}.hover\:text-sky-800:hover{color:var(--color-sky-800)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-sky-500:focus{border-color:var(--color-sky-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-40:disabled{opacity:.4}}[x-cloak]{display:none!important}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
package/build/ui/app.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
(()=>{var
|
|
1
|
+
(()=>{var et=!1,tt=!1,D=[],rt=-1,Re=!1,bt=!1;function vn(e){xn(e)}function yn(){bt=!0}function bn(){bt=!1,Xt()}function xn(e){D.includes(e)||(D.push(e),e._x_schedulerPriority!==void 0&&(Re=!0)),Xt()}function xt(e){let t=D.indexOf(e);t!==-1&&t>rt&&D.splice(t,1)}function Xt(){if(!tt&&!et){if(bt)return;et=!0,queueMicrotask(mn)}}function mn(){et=!1,tt=!0;for(let e=0;e<D.length;e++)Re&&wn(e),D[e](),rt=e;D.length=0,rt=-1,Re=!1,tt=!1}function wn(e){let t=new Map,r=D.slice(e).sort((n,i)=>Sn(n,i,t));for(let n=0;n<r.length;n++)D[e+n]=r[n];Re=!1}function Sn(e,t,r){return We(e)?We(t)?Bt(e._x_schedulerPriority.el,r)-Bt(t._x_schedulerPriority.el,r)||e._x_schedulerPriority.order-t._x_schedulerPriority.order:-1:We(t)?1:0}function We(e){return e._x_schedulerPriority!==void 0}function Bt(e,t){if(t.has(e))return t.get(e);let r=0,n=e;for(;e;)r++,e._x_teleportBack?e=e._x_teleportBack:typeof ShadowRoot=="function"&&e.parentNode instanceof ShadowRoot?e=e.parentNode.host:e=e.parentElement;return t.set(n,r),r}var re,G,ne,Qt,En=0,nt=!0;function An(e){nt=!1,e(),nt=!0}function On(e){re=e.reactive,ne=e.release,G=t=>e.effect(t,{scheduler:r=>{nt?vn(r):r()}}),Qt=e.raw}function Ht(e){G=e}function Tn(e){let t=()=>{};return[(n,i)=>{let s=i?.priority==="structural"?En++:void 0,o=G(n);return s!==void 0&&o!==void 0&&(o._x_schedulerPriority={el:e,order:s}),e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(a=>a())}),e._x_effects.add(o),t=()=>{o!==void 0&&(e._x_effects.delete(o),ne(o))},o},()=>{t()}]}function er(e,t){let r=!0,n,i,s=G(()=>{let o=e(),a=JSON.stringify(o);if(!r&&(typeof o=="object"||o!==n)){let u=typeof n=="object"?JSON.parse(i):n;queueMicrotask(()=>{t(o,u)})}n=o,i=a,r=!1});return()=>{xt(s),ne(s)}}async function Mn(e){yn();try{await e(),await Promise.resolve()}finally{bn()}}var tr=[],rr=[],nr=[];function Cn(e){nr.push(e)}function mt(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,rr.push(t))}function ir(e){tr.push(e)}function sr(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function or(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}function Rn(e){for(e._x_effects?.forEach(xt);e._x_cleanups?.length;)e._x_cleanups.pop()()}var je=new MutationObserver(Ne),wt=!1;function St(){je.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),wt=!0}function ar(){Pn(),je.disconnect(),wt=!1}var N=[];function Pn(){let e=je.takeRecords();N.push(()=>e.length>0&&Ne(e));let t=N.length;queueMicrotask(()=>{if(N.length===t)for(;N.length>0;)N.shift()()})}function Dn(){for(;N.length>0;)N.shift()();let e=je.takeRecords();e.length>0&&Ne(e)}function v(e){if(!wt)return e();ar();try{return e()}finally{St()}}var Et=!1,Pe=[];function $n(){Et=!0}function In(){Et=!1,Ne(Pe),Pe=[]}function Ne(e){if(Et){Pe=Pe.concat(e);return}let t=[],r=new Set,n=new Map,i=new Map;for(let s=0;s<e.length;s++)if(!e[s].target._x_ignoreMutationObserver&&(e[s].type==="childList"&&(e[s].removedNodes.forEach(o=>{o.nodeType===1&&o._x_marker&&r.add(o)}),e[s].addedNodes.forEach(o=>{if(o.nodeType===1){if(r.has(o)){r.delete(o);return}o._x_marker||t.push(o)}})),e[s].type==="attributes")){let o=e[s].target,a=e[s].attributeName,u=e[s].oldValue,c=()=>{n.has(o)||n.set(o,[]),n.get(o).push({name:a,value:o.getAttribute(a)})},l=()=>{i.has(o)||i.set(o,[]),i.get(o).push(a)};o.hasAttribute(a)&&u===null?c():o.hasAttribute(a)?(l(),c()):l()}i.forEach((s,o)=>{or(o,s)}),n.forEach((s,o)=>{tr.forEach(a=>a(o,s))});for(let s of r)t.some(o=>o.contains(s))||rr.forEach(o=>o(s));for(let s of t)s.isConnected&&nr.forEach(o=>o(s));t=null,r=null,n=null,i=null}function ur(e){return K(q(e))}function we(e,t,r){return e._x_dataStack=[t,...q(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function q(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?q(e.host):e.parentNode?q(e.parentNode):[]}function K(e){return new Proxy({objects:e},Ln)}function cr(e,t){return e===null||e===Object.prototype?null:Object.prototype.hasOwnProperty.call(e,t)?e:cr(Object.getPrototypeOf(e),t)}var Ln={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(r=>Object.prototype.hasOwnProperty.call(r,t)||Reflect.has(r,t))},get({objects:e},t,r){return t=="toJSON"?jn:Reflect.get(e.find(n=>Reflect.has(n,t))||{},t,r)},set({objects:e},t,r,n){let i;for(let o of e)if(i=cr(o,t),i)break;i||(i=e[e.length-1]);let s=Object.getOwnPropertyDescriptor(i,t);return s?.set&&s?.get?s.set.call(n,r)||!0:Reflect.set(i,t,r)}};function jn(){return Reflect.ownKeys(this).reduce((t,r)=>(t[r]=Reflect.get(this,r),t),{})}function At(e,t=()=>{}){let r=i=>typeof i=="object"&&!Array.isArray(i)&&i!==null,n=(i,s="")=>{Object.entries(Object.getOwnPropertyDescriptors(i)).forEach(([o,{value:a,enumerable:u}])=>{if(u===!1||a===void 0||typeof a=="object"&&a!==null&&a.__v_skip)return;let c=s===""?o:`${s}.${o}`;typeof a=="object"&&a!==null&&a._x_interceptor?i[o]=a.initialize(e,c,o,t):r(a)&&a!==i&&!(a instanceof Element)&&n(a,c)})};return n(e)}function lr(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,s,o){return e(this.initialValue,()=>Nn(n,i),a=>it(n,i,a),i,s,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(s,o,a,u)=>{let c=n.initialize(s,o,a,u);return r.initialValue=c,i(s,o,a,u)}}else r.initialValue=n;return r}}function Nn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function it(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),it(e[t[0]],t.slice(1),r)}}var fr={};function A(e,t){fr[e]=t}function _e(e,t){let r=kn(t);return Object.entries(fr).forEach(([n,i])=>{Object.defineProperty(e,`$${n}`,{get(){return i(t,r)},enumerable:!1})}),e}function kn(e){let[t,r]=yr(e),n={interceptor:lr,...t};return mt(e,r),n}function Fn(e,t,r,...n){try{return r(...n)}catch(i){te(i,e,t)}}function te(...e){return dr(...e)}var dr=Hn;function Bn(e){dr=e}function Hn(e,t,r=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message}
|
|
2
2
|
|
|
3
3
|
${r?'Expression: "'+r+`"
|
|
4
4
|
|
|
5
|
-
`:""}`,t),setTimeout(()=>{throw e},0)}var ee=!0;function pr(e){let t=ee;ee=!1;let r=e();return ee=t,r}function B(e,t,r={}){let n;return m(e,t)(i=>n=i,r),n}function m(...e){return hr(...e)}var hr=()=>{};function Hn(e){hr=e}var _r;function qn(e){_r=e}function Kn(e,t){let r={};_e(r,e);let n=[r,...q(e)],i=typeof t=="function"?Vn(n,t):zn(n,t,e);return kn.bind(null,e,t,i)}function Vn(e,t){return(r=()=>{},{scope:n={},params:i=[],context:s}={})=>{if(!ee){ge(r,t,K([n,...e]),i);return}let o=t.apply(K([n,...e]),i);ge(r,o)}}var We={};function Wn(e,t){if(We[e])return We[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,s=(()=>{try{let o=new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`);return Object.defineProperty(o,"name",{value:`[Alpine] ${e}`}),o}catch(o){return te(o,t,e),Promise.resolve()}})();return We[e]=s,s}function zn(e,t,r){let n=Wn(t,r);return(i=()=>{},{scope:s={},params:o=[],context:a}={})=>{n.result=void 0,n.finished=!1;let u=K([s,...e]);if(typeof n=="function"){let c=n.call(a,n,u).catch(f=>te(f,r,t));n.finished?(ge(i,n.result,u,o,r),n.result=void 0):c.then(f=>{ge(i,f,u,o,r)}).catch(f=>te(f,r,t)).finally(()=>n.result=void 0)}}}function ge(e,t,r,n,i){if(ee&&typeof t=="function"){let s=t.apply(r,n);s instanceof Promise?s.then(o=>ge(e,o,r,n)).catch(o=>te(o,i,t)):e(s)}else typeof t=="object"&&t instanceof Promise?t.then(s=>e(s)):e(t)}function Un(...e){return _r(...e)}function Jn(e,t,r={}){let n={};_e(n,e);let i=[n,...q(e)],s=K([r.scope??{},...i]),o=r.params??[];if(t.includes("await")){let a=Object.getPrototypeOf(async function(){}).constructor,u=/^[\n\s]*if.*\(.*\)/.test(t.trim())||/^(let|const)\s/.test(t.trim())?`(async()=>{ ${t} })()`:t;return new a(["scope"],`with (scope) { let __result = ${u}; return __result }`).call(r.context,s)}else{let a=/^[\n\s]*if.*\(.*\)/.test(t.trim())||/^(let|const)\s/.test(t.trim())?`(()=>{ ${t} })()`:t,c=new Function(["scope"],`with (scope) { let __result = ${a}; return __result }`).call(r.context,s);return typeof c=="function"&&ee?c.apply(s,o):c}}var At="x-";function ie(e=""){return At+e}function Gn(e){At=e}var De={};function y(e,t){return De[e]=t,{before(r){if(!De[r]){console.warn(String.raw`Cannot find directive \`${r}\`. \`${e}\` will use the default order of execution`);return}let n=F.indexOf(r);F.splice(n>=0?n:F.indexOf("DEFAULT"),0,e)}}}function Yn(e){return Object.keys(De).includes(e)}function ke(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let s=Object.entries(e._x_virtualDirectives).map(([a,u])=>({name:a,value:u})),o=gr(s);s=s.map(a=>o.find(u=>u.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(s)}let n={};return t.map(mr((s,o)=>n[s]=o)).filter(Sr).map(Qn(n,r)).sort(ei).map(s=>Xn(e,s))}function gr(e){return Array.from(e).map(mr()).filter(t=>!Sr(t))}var it=!1,ce=new Map,vr=Symbol();function Zn(e){it=!0;let t=Symbol();vr=t,ce.set(t,[]);let r=()=>{for(;ce.get(t).length;)ce.get(t).shift()();ce.delete(t)},n=()=>{it=!1,r()};e(r),n()}function yr(e){let t=[],r=a=>t.push(a),[n,i]=On(e);return t.push(i),[{Alpine:se,effect:n,cleanup:r,evaluateLater:m.bind(m,e),evaluate:B.bind(B,e)},()=>t.forEach(a=>a())]}function Xn(e,t){let r=()=>{},n=De[t.type]||r,[i,s]=yr(e);sr(e,t.original,s);let o=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),it?ce.get(vr).push(n):n())};return o.runCleanups=s,o}var xr=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),br=e=>e;function mr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=wr.reduce((s,o)=>o(s),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var wr=[];function Ot(e){wr.push(e)}function Sr({name:e}){return Er().test(e)}var Er=()=>new RegExp(`^${At}([^:^.]+)\\b`);function Qn(e,t){return({name:r,value:n})=>{r===n&&(n="");let i=r.match(Er()),s=r.match(/:([a-zA-Z0-9\-_:]+)/),o=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:s?s[1]:null,modifiers:o.map(u=>u.replace(".","")),expression:n,original:a}}}var st="DEFAULT",F=["ignore","ref","id","data","anchor","bind","init","for","model","modelable","transition","show","if",st,"teleport"];function ei(e,t){let r=F.indexOf(e.type)===-1?st:e.type,n=F.indexOf(t.type)===-1?st:t.type;return F.indexOf(r)-F.indexOf(n)}function V(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>V(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)V(n,t,!1),n=n.nextElementSibling}var L=!1;function $(e,t=()=>{}){return(...r)=>L?t(...r):e(...r)}function ti(e){return(...t)=>L&&e(...t)}var Ar=[];function Se(e){Ar.push(e)}function ri(e,t){Ar.forEach(r=>r(e,t)),L=!0,Or(()=>{M(t,(r,n)=>{n(r,()=>{})})}),L=!1}var ot=!1;function ni(e,t){t._x_dataStack||(t._x_dataStack=e._x_dataStack),L=!0,ot=!0,Or(()=>{ii(t)}),L=!1,ot=!1}function ii(e){let t=!1;M(e,(n,i)=>{V(n,(s,o)=>{if(t&&fi(s))return o();t=!0,i(s,o)})})}function Or(e){let t=G;Ht((r,n)=>{let i=t(r);return ne(i),()=>{}}),e(),Ht(t)}var Fe=0;function si(e,t){let r=e._x_deferInit;r||(r=e._x_deferInit={pending:0,ownsIgnore:!e._x_ignore,queuedAttributes:new Map},r.ownsIgnore&&(e._x_ignore=!0),Fe++),r.pending++,Promise.resolve(t).catch(n=>{try{te(n,e)}catch(i){setTimeout(()=>{throw i},0)}}).then(()=>oi(e,r))}function oi(e,t){t.pending--,!(t.pending>0)&&(Pn(),!(t.pending>0)&&e._x_deferInit===t&&(delete e._x_deferInit,t.ownsIgnore&&delete e._x_ignore,Fe--,e.isConnected&&(ui(t),M(e))))}function ai(e,t){if(Fe===0)return!1;let r=S(e,n=>n._x_deferInit);return r?(Tr(r._x_deferInit,e,t.map(({name:n})=>n)),!0):!1}function Tr(e,t,r){let n=e.queuedAttributes.get(t);(!n||n.marker!==t._x_marker)&&(n={marker:t._x_marker,names:new Set},e.queuedAttributes.set(t,n)),r.forEach(i=>n.names.add(i))}function ui(e){e.queuedAttributes.forEach((t,r)=>{if(!r.isConnected||!r._x_marker||r._x_marker!==t.marker)return;let n=S(r,s=>s._x_deferInit);if(n){Tr(n._x_deferInit,r,Array.from(t.names));return}let i=Array.from(t.names).filter(s=>r.hasAttribute(s)).map(s=>({name:s,value:r.getAttribute(s)}));i.length!==0&&ke(r,i).forEach(s=>s())})}Se((e,t)=>{Fe!==0&&(!e||e.nodeType!==1||!t||t.nodeType!==1||S(e,r=>r._x_deferInit)&&(t._x_ignore=!0))});function fe(e,t,r={},n={}){return e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0,...n}))}function T(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var qt=!1;function ci(){qt&&T("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),qt=!0,document.body||T("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?"),fe(document,"alpine:init"),fe(document,"alpine:initializing"),wt(),Mn(t=>M(t,V)),bt(t=>Y(t)),ir((t,r)=>{ai(t,r)||ke(t,r).forEach(n=>n())});let e=t=>!Be(t.parentElement,!0);Array.from(document.querySelectorAll(Rr().join(","))).filter(e).forEach(t=>{M(t)}),fe(document,"alpine:initialized"),setTimeout(()=>{pi()})}var Tt=[],Mr=[];function Cr(){return Tt.map(e=>e())}function Rr(){return Tt.concat(Mr).map(e=>e())}function Pr(e){Tt.push(e)}function Dr(e){Mr.push(e)}function Be(e,t=!1){return S(e,r=>{if((t?Rr():Cr()).some(i=>r.matches(i)))return!0})}function S(e,t){if(e){if(t(e))return e;if(e._x_teleportBack)return S(e._x_teleportBack,t);if(e.parentNode instanceof ShadowRoot)return S(e.parentNode.host,t);if(e.parentElement)return S(e.parentElement,t)}}function fi(e){return Cr().some(t=>e.matches(t))}var $r=[];function li(e){$r.push(e)}var di=1;function M(e,t=V,r=()=>{}){S(e,n=>n._x_ignore)||Zn(()=>{t(e,(n,i)=>{n._x_marker||(r(n,i),$r.forEach(s=>s(n,i)),ke(n,n.attributes).forEach(s=>s()),n._x_ignore||(n._x_marker=di++),n._x_ignore&&i())})})}function Y(e,t=V){t(e,r=>{Cn(r),or(r),delete r._x_marker})}function pi(){[["ui","dialog",["[x-dialog], [x-popover]"]],["anchor","anchor",["[x-anchor]"]],["sort","sort",["[x-sort]"]]].forEach(([t,r,n])=>{Yn(r)||n.some(i=>{if(document.querySelector(i))return T(`found "${i}", but missing ${t} plugin`),!0})})}var at=[],Mt=!1;function Ct(e=()=>{}){return queueMicrotask(()=>{Mt||setTimeout(()=>{ut()})}),new Promise(t=>{at.push(()=>{e(),t()})})}function ut(){for(Mt=!1;at.length;)at.shift()()}function hi(){Mt=!0}function Rt(e,t){return Array.isArray(t)?Kt(e,t.join(" ")):typeof t=="object"&&t!==null?_i(e,t):typeof t=="function"?Rt(e,t()):Kt(e,t)}function ct(e){return e.split(/\s/).filter(Boolean)}function Kt(e,t){let r=i=>ct(i).filter(s=>!e.classList.contains(s)).filter(Boolean),n=i=>(e.classList.add(...i),()=>{e.classList.remove(...i)});return t=t===!0?t="":t||"",n(r(t))}function _i(e,t){let r=Object.entries(t).flatMap(([o,a])=>a?ct(o):!1).filter(Boolean),n=Object.entries(t).flatMap(([o,a])=>a?!1:ct(o)).filter(Boolean),i=[],s=[];return n.forEach(o=>{e.classList.contains(o)&&(e.classList.remove(o),s.push(o))}),r.forEach(o=>{e.classList.contains(o)||(e.classList.add(o),i.push(o))}),()=>{s.forEach(o=>e.classList.add(o)),i.forEach(o=>e.classList.remove(o))}}function He(e,t){return typeof t=="object"&&t!==null?gi(e,t):vi(e,t)}function gi(e,t){let r={};return Object.entries(t).forEach(([n,i])=>{r[n]=e.style[n],n.startsWith("--")||(n=yi(n)),e.style.setProperty(n,i)}),setTimeout(()=>{e.style.length===0&&e.removeAttribute("style")}),()=>{He(e,r)}}function vi(e,t){let r=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",r||"")}}function yi(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function ft(e,t=()=>{}){let r=!1;return function(){r?t.apply(this,arguments):(r=!0,e.apply(this,arguments))}}y("transition",(e,{value:t,modifiers:r,expression:n},{evaluate:i})=>{typeof n=="function"&&(n=i(n)),n!==!1&&(!n||typeof n=="boolean"?bi(e,r,t):xi(e,n,t))});function xi(e,t,r){Ir(e,Rt,""),{enter:i=>{e._x_transition.enter.during=i},"enter-start":i=>{e._x_transition.enter.start=i},"enter-end":i=>{e._x_transition.enter.end=i},leave:i=>{e._x_transition.leave.during=i},"leave-start":i=>{e._x_transition.leave.start=i},"leave-end":i=>{e._x_transition.leave.end=i}}[r](t)}function bi(e,t,r){Ir(e,He);let n=!t.includes("in")&&!t.includes("out")&&!r,i=n||t.includes("in")||["enter"].includes(r),s=n||t.includes("out")||["leave"].includes(r);t.includes("in")&&!n&&(t=t.filter((b,Z)=>Z<t.indexOf("out"))),t.includes("out")&&!n&&(t=t.filter((b,Z)=>Z>t.indexOf("out")));let o=!t.includes("opacity")&&!t.includes("scale"),a=o||t.includes("opacity"),u=o||t.includes("scale"),c=a?0:1,f=u?ae(t,"scale",95)/100:1,l=ae(t,"delay",0)/1e3,_=ae(t,"origin","center"),g="opacity, transform",C=ae(t,"duration",150)/1e3,d=ae(t,"duration",75)/1e3,x="cubic-bezier(0.4, 0.0, 0.2, 1)";i&&(e._x_transition.enter.during={transformOrigin:_,transitionDelay:`${l}s`,transitionProperty:g,transitionDuration:`${C}s`,transitionTimingFunction:x},e._x_transition.enter.start={opacity:c,transform:`scale(${f})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"}),s&&(e._x_transition.leave.during={transformOrigin:_,transitionDelay:`${l}s`,transitionProperty:g,transitionDuration:`${d}s`,transitionTimingFunction:x},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:c,transform:`scale(${f})`})}function Ir(e,t,r={}){e._x_transition||(e._x_transition={enter:{during:r,start:r,end:r},leave:{during:r,start:r,end:r},in(n=()=>{},i=()=>{}){lt(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,i)},out(n=()=>{},i=()=>{}){lt(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,i)}})}window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,r,n){let i=document.visibilityState==="visible"?requestAnimationFrame:setTimeout,s=()=>i(r);if(t){e._x_transition&&(e._x_transition.enter||e._x_transition.leave)?e._x_transition.enter&&(Object.entries(e._x_transition.enter.during).length||Object.entries(e._x_transition.enter.start).length||Object.entries(e._x_transition.enter.end).length)?e._x_transition.in(r):s():e._x_transition?e._x_transition.in(r):s();return}e._x_hidePromise=e._x_transition?new Promise((o,a)=>{e._x_transition.out(()=>{},()=>o(n)),e._x_transitioning&&e._x_transitioning.beforeCancel(()=>a({isFromCancelledTransition:!0}))}):Promise.resolve(n),queueMicrotask(()=>{let o=Lr(e);o?(o._x_hideChildren||(o._x_hideChildren=[]),o._x_hideChildren.push(e)):i(()=>{let a=u=>{let c=Promise.all([u._x_hidePromise,...(u._x_hideChildren||[]).map(a)]).then(([f])=>f?.());return delete u._x_hidePromise,delete u._x_hideChildren,c};a(e).catch(u=>{if(!u.isFromCancelledTransition)throw u})})})};function Lr(e){let t=e.parentNode;if(t)return t._x_hidePromise?t:Lr(t)}function lt(e,t,{during:r,start:n,end:i}={},s=()=>{},o=()=>{}){if(e._x_transitioning&&e._x_transitioning.cancel(),Object.keys(r).length===0&&Object.keys(n).length===0&&Object.keys(i).length===0){s(),o();return}let a,u,c;mi(e,{start(){a=t(e,n)},during(){u=t(e,r)},before:s,end(){a(),c=t(e,i)},after:o,cleanup(){u(),c()}})}function mi(e,t){let r,n,i,s=ft(()=>{v(()=>{r=!0,n||t.before(),i||(t.end(),ut()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning})});e._x_transitioning={beforeCancels:[],beforeCancel(o){this.beforeCancels.push(o)},cancel:ft(function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();s()}),finish:s},v(()=>{t.start(),t.during()}),hi(),requestAnimationFrame(()=>{if(r)return;let o=Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""))*1e3,a=Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""))*1e3;o===0&&(o=Number(getComputedStyle(e).animationDuration.replace("s",""))*1e3),v(()=>{t.before()}),n=!0,requestAnimationFrame(()=>{r||(v(()=>{t.end()}),ut(),setTimeout(e._x_transitioning.finish,o+a),i=!0)})})}function ae(e,t,r){if(e.indexOf(t)===-1)return r;let n=e[e.indexOf(t)+1];if(!n||t==="scale"&&isNaN(n))return r;if(t==="duration"||t==="delay"){let i=n.match(/([0-9]+)ms/);if(i)return i[1]}return t==="origin"&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[n,e[e.indexOf(t)+2]].join(" "):n}function jr(e,t,r,n=[]){switch(e._x_bindings||(e._x_bindings=re({})),e._x_bindings[t]=r,t=n.includes("camel")?Ci(t):t,t){case"value":wi(e,r);break;case"style":Ei(e,r);break;case"class":Si(e,r);break;case"selected":case"checked":Ai(e,t,r);break;default:Pt(e,t,r);break}}function wi(e,t){if(Dt(e))e.attributes.value===void 0&&(e.value=t);else if($e(e))Number.isInteger(t)?e.value=t:!Array.isArray(t)&&typeof t!="boolean"&&![null,void 0].includes(t)?e.value=String(t):Array.isArray(t)?e.checked=t.some(r=>Ri(r,e.value)):e.checked=!!t;else if(e.tagName==="SELECT")Mi(e,t);else if(e.tagName==="OPTION")Pt(e,"value",t);else{if(e.value===t&&(typeof t!="object"||t===null))return;e.value=t===void 0?"":t}}function Si(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses(),e._x_undoAddedClasses=Rt(e,t)}function Ei(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles(),e._x_undoAddedStyles=He(e,t)}function Ai(e,t,r){Pt(e,t,r),Ti(e,t,r)}function Pt(e,t,r){[null,void 0,!1].includes(r)&&Di(t)?e.removeAttribute(t):(Nr(t)&&(r=t),$i(r)&&(r=JSON.stringify(r)),Oi(e,t,r))}function Oi(e,t,r){e.getAttribute(t)!=r&&e.setAttribute(t,r)}function Ti(e,t,r){e[t]!==r&&(e[t]=r)}function Mi(e,t){let r=[].concat(t).map(n=>n+"");Array.from(e.options).forEach(n=>{n.selected=r.includes(n.value)})}function Ci(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function Ri(e,t){return e==t}function Ce(e){return[1,"1","true","on","yes",!0].includes(e)?!0:[0,"0","false","off","no",!1].includes(e)?!1:e?!!e:null}var Pi=new Set(["allowfullscreen","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","inert","ismap","itemscope","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected","shadowrootclonable","shadowrootdelegatesfocus","shadowrootserializable"]);function Nr(e){return Pi.has(e)}function Di(e){return!["aria-pressed","aria-checked","aria-expanded","aria-selected"].includes(e)}function $i(e){return typeof e=="object"&&e!==null}function Ii(e,t,r){return e._x_bindings&&e._x_bindings[t]!==void 0?e._x_bindings[t]:kr(e,t,r)}function Li(e,t,r,n=!0){if(e._x_bindings&&e._x_bindings[t]!==void 0)return e._x_bindings[t];if(e._x_inlineBindings&&e._x_inlineBindings[t]!==void 0){let i=e._x_inlineBindings[t];return i.extract=n,pr(()=>B(e,i.expression))}return kr(e,t,r)}function kr(e,t,r){let n=e.getAttribute(t);return n===null?typeof r=="function"?r():r:n===""?!0:Nr(t)?!![t,"true"].includes(n):n}function $e(e){return e.type==="checkbox"||e.localName==="ui-checkbox"||e.localName==="ui-switch"}function Dt(e){return e.type==="radio"||e.localName==="ui-radio"}function Fr(e,t){let r;return function(){let n=this,i=arguments,s=function(){r=null,e.apply(n,i)};clearTimeout(r),r=setTimeout(s,t)}}function Br(e,t){let r;return function(){let n=this,i=arguments;r||(e.apply(n,i),r=!0,setTimeout(()=>r=!1,t))}}function Hr({get:e,set:t},{get:r,set:n}){let i=!0,s,o,a=G(()=>{let u=e(),c=r();if(i)n(ze(u)),i=!1;else{let f=JSON.stringify(u),l=JSON.stringify(c);f!==s?n(ze(u)):f!==l&&t(ze(c))}s=JSON.stringify(e()),o=JSON.stringify(r())});return()=>{xt(a),ne(a)}}function ze(e){return typeof e=="object"?JSON.parse(JSON.stringify(e)):e}function ji(e){(Array.isArray(e)?e:[e]).forEach(r=>r(se))}var P={},Vt=!1;function Ni(e,t){if(Vt||(P=re(P),Vt=!0),t===void 0)return P[e];P[e]=t,typeof t=="object"&&t!==null&&t._x_interceptor?P[e]=t.initialize(P,e,e,()=>{}):Et(P[e]),typeof t=="object"&&t!==null&&t.hasOwnProperty("init")&&typeof t.init=="function"&&P[e].init()}function ki(){return P}var qr={};function Fi(e,t){let r=typeof t!="function"?()=>t:t;return e instanceof Element?Kr(e,r()):(qr[e]=r,()=>{})}function Bi(e){return Object.entries(qr).forEach(([t,r])=>{Object.defineProperty(e,t,{get(){return(...n)=>r(...n)}})}),e}function Kr(e,t,r){let n=[];for(;n.length;)n.pop()();let i=Object.entries(t).map(([o,a])=>({name:o,value:a})),s=gr(i);return i=i.map(o=>s.find(a=>a.name===o.name)?{name:`x-bind:${o.name}`,value:`"${o.value}"`}:o),ke(e,i,r).map(o=>{n.push(o.runCleanups),o()}),()=>{for(;n.length;)n.pop()()}}var Vr={};function Hi(e,t){Vr[e]=t}function qi(e,t){return Object.entries(Vr).forEach(([r,n])=>{Object.defineProperty(e,r,{get(){return(...i)=>n.bind(t)(...i)},enumerable:!1})}),e}var Ki={get reactive(){return re},get release(){return ne},get effect(){return G},get raw(){return Qt},get transaction(){return Tn},version:"3.17.4",flushAndStopDeferringMutations:$n,dontAutoEvaluateFunctions:pr,disableEffectScheduling:En,startObservingMutations:wt,stopObservingMutations:ar,setReactivityEngine:An,onAttributeRemoved:sr,onAttributesAdded:ir,closestDataStack:q,skipDuringClone:$,onlyDuringClone:ti,addRootSelector:Pr,addInitSelector:Dr,setErrorHandler:Fn,interceptClone:Se,addScopeToNode:we,deferMutations:Dn,mapAttributes:Ot,evaluateLater:m,interceptInit:li,initInterceptors:Et,injectMagics:_e,setEvaluator:Hn,setRawEvaluator:qn,mergeProxies:K,extractProp:Li,findClosest:S,onElRemoved:bt,closestRoot:Be,destroyTree:Y,interceptor:fr,transition:lt,setStyles:He,mutateDom:v,deferInit:si,directive:y,entangle:Hr,throttle:Br,debounce:Fr,evaluate:B,evaluateRaw:Un,initTree:M,nextTick:Ct,prefixed:ie,prefix:Gn,plugin:ji,magic:A,store:Ni,start:ci,clone:ni,cloneNode:ri,bound:Ii,$data:ur,watch:er,walk:V,data:Hi,bind:Fi},se=Ki;function Wr(e){let t=Object.create(null);for(let r of e.split(","))t[r]=1;return r=>r in t}var Js=Object.freeze({}),Gs=Object.freeze([]),ve=Object.assign,Vi=Object.prototype.hasOwnProperty,dt=(e,t)=>Vi.call(e,t),ye=Array.isArray,le=e=>zr(e)==="[object Map]",Wi=e=>typeof e=="string",Ee=e=>typeof e=="symbol",xe=e=>e!==null&&typeof e=="object",zi=Object.prototype.toString,zr=e=>zi.call(e),Ur=e=>zr(e).slice(8,-1),$t=e=>Wi(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qe=e=>{let t=Object.create(null);return r=>t[r]||(t[r]=e(r))},Ui=/-\w/g,Ys=qe(e=>e.replace(Ui,t=>t.slice(1).toUpperCase())),Ji=/\B([A-Z])/g,Zs=qe(e=>e.replace(Ji,"-$1").toLowerCase()),Jr=qe(e=>e.charAt(0).toUpperCase()+e.slice(1)),Xs=qe(e=>e?`on${Jr(e)}`:""),k=(e,t)=>!Object.is(e,t),Gi="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Qs=Wr(Gi+",async,autofocus,autoplay,controls,default,defer,disabled,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");function W(e,...t){console.warn(`[Vue warn] ${e}`,...t)}var Ue,p,Je=new WeakSet,Wt=class{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Ue&&(Ue.active?Ue.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Je.has(this)&&(Je.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Yi(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,zt(this),Yr(this);let e=p,t=E;p=this,E=!0;try{return this.fn()}finally{p!==this&&W("Active effect was not restored correctly - this is likely a Vue internal bug."),Zr(this),p=e,E=t,this.flags&=-3}}stop(){if(this.flags&1){for(let e=this.deps;e;e=e.nextDep)jt(e);this.deps=this.depsTail=void 0,zt(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Je.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){pt(this)&&this.run()}get dirty(){return pt(this)}},Gr=0,de,pe;function Yi(e,t=!1){if(e.flags|=8,t){e.next=pe,pe=e;return}e.next=de,de=e}function It(){Gr++}function Lt(){if(--Gr>0)return;if(pe){let t=pe;for(pe=void 0;t;){let r=t.next;t.next=void 0,t.flags&=-9,t=r}}let e;for(;de;){let t=de;for(de=void 0;t;){let r=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=r}}if(e)throw e}function Yr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Zr(e){let t,r=e.depsTail,n=r;for(;n;){let i=n.prevDep;n.version===-1?(n===r&&(r=i),jt(n),Xi(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=r}function pt(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Zi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Zi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ie)||(e.globalVersion=Ie,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!pt(e))))return;e.flags|=2;let t=e.dep,r=p,n=E;p=e,E=!0;try{Yr(e);let i=e.fn(e._value);(t.version===0||k(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{p=r,E=n,Zr(e),e.flags&=-3}}function jt(e,t=!1){let{dep:r,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),r.subsHead===e&&(r.subsHead=i),r.subs===e&&(r.subs=n,!n&&r.computed)){r.computed.flags&=-5;for(let s=r.computed.deps;s;s=s.nextDep)jt(s,!0)}!t&&!--r.sc&&r.map&&r.map.delete(r.key)}function Xi(e){let{prevDep:t,nextDep:r}=e;t&&(t.nextDep=r,e.prevDep=void 0),r&&(r.prevDep=t,e.nextDep=void 0)}function Qi(e,t){e.effect instanceof Wt&&(e=e.effect.fn);let r=new Wt(e);t&&ve(r,t);try{r.run()}catch(i){throw r.stop(),i}let n=r.run.bind(r);return n.effect=r,n}function es(e){e.effect.stop()}var E=!0,Xr=[];function ts(){Xr.push(E),E=!1}function rs(){let e=Xr.pop();E=e===void 0?!0:e}function zt(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let r=p;p=void 0;try{t()}finally{p=r}}}var Ie=0,ns=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},is=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0,this.subsHead=void 0}track(e){if(!p||!E||p===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==p)t=this.activeLink=new ns(p,this),p.deps?(t.prevDep=p.depsTail,p.depsTail.nextDep=t,p.depsTail=t):p.deps=p.depsTail=t,Qr(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let r=t.nextDep;r.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=r),t.prevDep=p.depsTail,t.nextDep=void 0,p.depsTail.nextDep=t,p.depsTail=t,p.deps===t&&(p.deps=r)}return p.onTrack&&p.onTrack(ve({effect:p},e)),t}trigger(e){this.version++,Ie++,this.notify(e)}notify(e){It();try{for(let t=this.subsHead;t;t=t.nextSub)t.sub.onTrigger&&!(t.sub.flags&8)&&t.sub.onTrigger(ve({effect:t.sub},e));for(let t=this.subs;t;t=t.prevSub)t.sub.notify()&&t.sub.dep.notify()}finally{Lt()}}};function Qr(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Qr(n)}let r=e.dep.subs;r!==e&&(e.prevSub=r,r&&(r.nextSub=e)),e.dep.subsHead===void 0&&(e.dep.subsHead=e),e.dep.subs=e}}var ht=new WeakMap,H=Symbol("Object iterate"),_t=Symbol("Map keys iterate"),be=Symbol("Array iterate");function w(e,t,r){if(E&&p){let n=ht.get(e);n||ht.set(e,n=new Map);let i=n.get(r);i||(n.set(r,i=new is),i.map=n,i.key=r),i.track({target:e,type:t,key:r})}}function I(e,t,r,n,i,s){let o=ht.get(e);if(!o){Ie++;return}let a=u=>{u&&u.trigger({target:e,type:t,key:r,newValue:n,oldValue:i,oldTarget:s})};if(It(),t==="clear")o.forEach(a);else{let u=ye(e),c=u&&$t(r);if(u&&r==="length"){let f=Number(n);o.forEach((l,_)=>{(_==="length"||_===be||!Ee(_)&&_>=f)&&a(l)})}else switch((r!==void 0||o.has(void 0))&&a(o.get(r)),c&&a(o.get(be)),t){case"add":u?c&&a(o.get("length")):(a(o.get(H)),le(e)&&a(o.get(_t)));break;case"delete":u||(a(o.get(H)),le(e)&&a(o.get(_t)));break;case"set":le(e)&&a(o.get(H));break}}Lt()}function X(e){let t=h(e);return t===e?t:(w(t,"iterate",be),U(e)?t:t.map(J))}function Nt(e){return w(e=h(e),"iterate",be),e}function O(e,t){return z(e)?an(e)?me(J(t)):me(t):J(t)}var ss={__proto__:null,[Symbol.iterator](){return Ge(this,Symbol.iterator,e=>O(this,e))},concat(...e){return X(this).concat(...e.map(t=>ye(t)?X(t):t))},entries(){return Ge(this,"entries",e=>(e[1]=O(this,e[1]),e))},every(e,t){return R(this,"every",e,t,void 0,arguments)},filter(e,t){return R(this,"filter",e,t,r=>r.map(n=>O(this,n)),arguments)},find(e,t){return R(this,"find",e,t,r=>O(this,r),arguments)},findIndex(e,t){return R(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return R(this,"findLast",e,t,r=>O(this,r),arguments)},findLastIndex(e,t){return R(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return R(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ye(this,"includes",e)},indexOf(...e){return Ye(this,"indexOf",e)},join(e){return X(this).join(e)},lastIndexOf(...e){return Ye(this,"lastIndexOf",e)},map(e,t){return R(this,"map",e,t,void 0,arguments)},pop(){return ue(this,"pop")},push(...e){return ue(this,"push",e)},reduce(e,...t){return Ut(this,"reduce",e,t)},reduceRight(e,...t){return Ut(this,"reduceRight",e,t)},shift(){return ue(this,"shift")},some(e,t){return R(this,"some",e,t,void 0,arguments)},splice(...e){return ue(this,"splice",e)},toReversed(){return X(this).toReversed()},toSorted(e){return X(this).toSorted(e)},toSpliced(...e){return X(this).toSpliced(...e)},unshift(...e){return ue(this,"unshift",e)},values(){return Ge(this,"values",e=>O(this,e))}};function Ge(e,t,r){let n=Nt(e),i=n[t]();return n!==e&&!U(e)&&(i._next=i.next,i.next=()=>{let s=i._next();return s.done||(s.value=r(s.value)),s}),i}var os=Array.prototype;function R(e,t,r,n,i,s){let o=Nt(e),a=o!==e&&!U(e),u=o[t];if(u!==os[t]){let l=u.apply(e,s);return a?J(l):l}let c=r;o!==e&&(a?c=function(l,_){return r.call(this,O(e,l),_,e)}:r.length>2&&(c=function(l,_){return r.call(this,l,_,e)}));let f=u.call(o,c,n);return a&&i?i(f):f}function Ut(e,t,r,n){let i=Nt(e),s=i!==e&&!U(e),o=r,a=!1;i!==e&&(s?(a=n.length===0,o=function(c,f,l){return a&&(a=!1,c=O(e,c)),r.call(this,c,O(e,f),l,e)}):r.length>3&&(o=function(c,f,l){return r.call(this,c,f,l,e)}));let u=i[t](o,...n);return a?O(e,u):u}function Ye(e,t,r){let n=h(e);w(n,"iterate",be);let i=n[t](...r);return(i===-1||i===!1)&&bs(r[0])?(r[0]=h(r[0]),n[t](...r)):i}function ue(e,t,r=[]){ts(),It();let n=h(e)[t].apply(e,r);return Lt(),rs(),n}var as=Wr("__proto__,__v_isRef,__isVue"),en=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ee));function us(e){Ee(e)||(e=String(e));let t=h(this);return w(t,"has",e),t.hasOwnProperty(e)}var tn=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,r){if(t==="__v_skip")return e.__v_skip;let n=this._isReadonly,i=this._isShallow;if(t==="__v_isReactive")return!n;if(t==="__v_isReadonly")return n;if(t==="__v_isShallow")return i;if(t==="__v_raw")return r===(n?i?ys:sn:i?vs:nn).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(r)?e:void 0;let s=ye(e);if(!n){let a;if(s&&(a=ss[t]))return a;if(t==="hasOwnProperty")return us}let o=Reflect.get(e,t,he(e)?e:r);if((Ee(t)?en.has(t):as(t))||(n||w(e,"get",t),i))return o;if(he(o)){let a=s&&$t(t)?o:o.value;return n&&xe(a)?vt(a):a}return xe(o)?n?vt(o):kt(o):o}},cs=class extends tn{constructor(e=!1){super(!1,e)}set(e,t,r,n){let i=e[t],s=ye(e)&&$t(t);if(!this._isShallow){let u=z(i);if(!U(r)&&!z(r)&&(i=h(i),r=h(r)),!s&&he(i)&&!he(r))return u?(W(`Set operation on key "${String(t)}" failed: target is readonly.`,e[t]),!0):(i.value=r,!0)}let o=s?Number(t)<e.length:dt(e,t),a=Reflect.set(e,t,r,he(e)?e:n);return e===h(n)&&a&&(o?k(r,i)&&I(e,"set",t,r,i):I(e,"add",t,r)),a}deleteProperty(e,t){let r=dt(e,t),n=e[t],i=Reflect.deleteProperty(e,t);return i&&r&&I(e,"delete",t,void 0,n),i}has(e,t){let r=Reflect.has(e,t);return(!Ee(t)||!en.has(t))&&w(e,"has",t),r}ownKeys(e){return w(e,"iterate",ye(e)?"length":H),Reflect.ownKeys(e)}},fs=class extends tn{constructor(e=!1){super(!0,e)}set(e,t){return W(`Set operation on key "${String(t)}" failed: target is readonly.`,e),!0}deleteProperty(e,t){return W(`Delete operation on key "${String(t)}" failed: target is readonly.`,e),!0}},ls=new cs,ds=new fs,gt=e=>e,Oe=e=>Reflect.getPrototypeOf(e);function ps(e,t,r){return function(...n){let i=this.__v_raw,s=h(i),o=le(s),a=e==="entries"||e===Symbol.iterator&&o,u=e==="keys"&&o,c=i[e](...n),f=r?gt:t?me:J;return!t&&w(s,"iterate",u?_t:H),ve(Object.create(c),{next(){let{value:l,done:_}=c.next();return _?{value:l,done:_}:{value:a?[f(l[0]),f(l[1])]:f(l),done:_}}})}}function Te(e){return function(...t){{let r=t[0]?`on key "${t[0]}" `:"";W(`${Jr(e)} operation ${r}failed: target is readonly.`,h(this))}return e==="delete"?!1:e==="clear"?void 0:this}}function hs(e,t){let r={get(i){let s=this.__v_raw,o=h(s),a=h(i);e||(k(i,a)&&w(o,"get",i),w(o,"get",a));let{has:u}=Oe(o),c=t?gt:e?me:J;if(u.call(o,i))return c(s.get(i));if(u.call(o,a))return c(s.get(a));s!==o&&s.get(i)},get size(){let i=this.__v_raw;return!e&&w(h(i),"iterate",H),i.size},has(i){let s=this.__v_raw,o=h(s),a=h(i);return e||(k(i,a)&&w(o,"has",i),w(o,"has",a)),i===a?s.has(i):s.has(i)||s.has(a)},forEach(i,s){let o=this,a=o.__v_raw,u=h(a),c=t?gt:e?me:J;return!e&&w(u,"iterate",H),a.forEach((f,l)=>i.call(s,c(f),c(l),o))}};return ve(r,e?{add:Te("add"),set:Te("set"),delete:Te("delete"),clear:Te("clear")}:{add(i){let s=h(this),o=Oe(s),a=h(i),u=!t&&!U(i)&&!z(i)?a:i;return o.has.call(s,u)||k(i,u)&&o.has.call(s,i)||k(a,u)&&o.has.call(s,a)||(s.add(u),I(s,"add",u,u)),this},set(i,s){!t&&!U(s)&&!z(s)&&(s=h(s));let o=h(this),{has:a,get:u}=Oe(o),c=a.call(o,i);c?Jt(o,a,i):(i=h(i),c=a.call(o,i));let f=u.call(o,i);return o.set(i,s),c?k(s,f)&&I(o,"set",i,s,f):I(o,"add",i,s),this},delete(i){let s=h(this),{has:o,get:a}=Oe(s),u=o.call(s,i);u?Jt(s,o,i):(i=h(i),u=o.call(s,i));let c=a?a.call(s,i):void 0,f=s.delete(i);return u&&I(s,"delete",i,void 0,c),f},clear(){let i=h(this),s=i.size!==0,o=le(i)?new Map(i):new Set(i),a=i.clear();return s&&I(i,"clear",void 0,void 0,o),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{r[i]=ps(i,e,t)}),r}function rn(e,t){let r=hs(e,t);return(n,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(dt(r,i)&&i in n?r:n,i,s)}var _s={get:rn(!1,!1)},gs={get:rn(!0,!1)};function Jt(e,t,r){let n=h(r);if(n!==r&&t.call(e,n)){let i=Ur(e);W(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}var nn=new WeakMap,vs=new WeakMap,sn=new WeakMap,ys=new WeakMap;function xs(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function kt(e){return z(e)?e:on(e,!1,ls,_s,nn)}function vt(e){return on(e,!0,ds,gs,sn)}function on(e,t,r,n,i){if(!xe(e))return W(`value cannot be made ${t?"readonly":"reactive"}: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let s=i.get(e);if(s)return s;let o=xs(Ur(e));if(o===0)return e;let a=new Proxy(e,o===2?n:r);return i.set(e,a),a}function an(e){return z(e)?an(e.__v_raw):!!(e&&e.__v_isReactive)}function z(e){return!!(e&&e.__v_isReadonly)}function U(e){return!!(e&&e.__v_isShallow)}function bs(e){return e?!!e.__v_raw:!1}function h(e){let t=e&&e.__v_raw;return t?h(t):e}var J=e=>xe(e)?kt(e):e,me=e=>xe(e)?vt(e):e;function he(e){return e?e.__v_isRef===!0:!1}A("nextTick",()=>Ct);A("dispatch",e=>fe.bind(fe,e));A("watch",(e,{evaluateLater:t,cleanup:r})=>(n,i)=>{let s=t(n),a=er(()=>{let u;return s(c=>u=c),u},i);r(a)});A("store",ki);A("data",e=>ur(e));A("root",e=>Be(e));A("refs",e=>(e._x_refs_proxy||(e._x_refs_proxy=K(ms(e))),e._x_refs_proxy));function ms(e){let t=[];return S(e,r=>{r._x_refs&&t.push(r._x_refs)}),t}var Ze={};function un(e){return Ze[e]||(Ze[e]=0),++Ze[e]}function ws(e,t){return S(e,r=>{if(r._x_ids&&r._x_ids[t])return!0})}function Ss(e,t){e._x_ids||(e._x_ids={}),e._x_ids[t]||(e._x_ids[t]=un(t))}A("id",(e,{cleanup:t})=>(r,n=null)=>{let i=`${r}${n?`-${n}`:""}`;return Es(e,i,t,()=>{let s=ws(e,r),o=s?s._x_ids[r]:un(r);return n?`${r}-${o}-${n}`:`${r}-${o}`})});Se((e,t)=>{e._x_id&&(t._x_id=e._x_id)});function Es(e,t,r,n){if(e._x_id||(e._x_id={}),e._x_id[t])return e._x_id[t];let i=n();return e._x_id[t]=i,r(()=>{delete e._x_id[t]}),i}A("el",e=>e);cn("Focus","focus","focus");cn("Persist","persist","persist");function cn(e,t,r){A(t,n=>T(`You can't use [$${t}] without first installing the "${e}" plugin here: https://alpinejs.dev/plugins/${r}`,n))}y("modelable",(e,{expression:t},{effect:r,evaluateLater:n,cleanup:i})=>{let s=n(t),o=()=>{let f;return s(l=>f=l),f},a=n(`${t} = __placeholder`),u=f=>a(()=>{},{scope:{__placeholder:f}}),c=o();u(c),queueMicrotask(()=>{if(!e._x_model)return;e._x_removeModelListeners.default();let f=e._x_model.get,l=e._x_model.setWithModifiers,_=Hr({get(){return f()},set(g){l(g)}},{get(){return o()},set(g){u(g)}});i(_)})});y("teleport",(e,{modifiers:t,expression:r},{cleanup:n})=>{e.tagName.toLowerCase()!=="template"&&T("x-teleport can only be used on a <template> tag",e);let i=Gt(r),s=e.content.cloneNode(!0).firstElementChild;e._x_teleport=s,s._x_teleportBack=e,e.setAttribute("data-teleport-template",!0),s.setAttribute("data-teleport-target",!0),e._x_forwardEvents&&e._x_forwardEvents.forEach(a=>{s.addEventListener(a,u=>{u.stopPropagation(),e.dispatchEvent(new u.constructor(u.type,u))})}),we(s,{},e);let o=(a,u,c)=>{c.includes("prepend")?u.parentNode.insertBefore(a,u):c.includes("append")?u.parentNode.insertBefore(a,u.nextSibling):u.appendChild(a)};v(()=>{$(()=>{o(s,i,t),M(s)})()}),e._x_teleportPutBack=()=>{let a=Gt(r);v(()=>{o(e._x_teleport,a,t)})},n(()=>v(()=>{s.remove(),Y(s)}))});var As=document.createElement("div");function Gt(e){let t=$(()=>document.querySelector(e),()=>As)();return t||T(`Cannot find x-teleport element for selector: "${e}"`),t}var fn=()=>{};fn.inline=(e,{modifiers:t},{cleanup:r})=>{t.includes("self")?e._x_ignoreSelf=!0:e._x_ignore=!0,r(()=>{t.includes("self")?delete e._x_ignoreSelf:delete e._x_ignore})};y("ignore",fn);y("effect",$((e,{expression:t},{effect:r})=>{r(m(e,t))}));function Q(e,t,r,n){let i=e,s=u=>n(u),o={},a=(u,c)=>f=>c(u,f);return r.includes("dot")&&(t=Os(t)),r.includes("camel")&&(t=Ts(t)),r.includes("capture")&&(o.capture=!0),r.includes("window")&&(i=window),r.includes("document")&&(i=document),r.includes("passive")&&(o.passive=r[r.indexOf("passive")+1]!=="false"),s=ln(r,s),r.includes("prevent")&&(s=a(s,(u,c)=>{c.preventDefault(),u(c)})),r.includes("stop")&&(s=a(s,(u,c)=>{c.stopPropagation(),u(c)})),r.includes("once")&&(s=a(s,(u,c)=>{u(c),i.removeEventListener(t,s,o)})),(r.includes("away")||r.includes("outside"))&&(i=document,s=a(s,(u,c)=>{e.contains(c.target)||c.target.isConnected!==!1&&(e.offsetWidth<1&&e.offsetHeight<1||e._x_isShown!==!1&&u(c))})),r.includes("self")&&(s=a(s,(u,c)=>{c.target===e&&u(c)})),t==="submit"&&(s=a(s,(u,c)=>{c.target._x_pendingModelUpdates&&c.target._x_pendingModelUpdates.forEach(f=>f()),u(c)})),(Cs(t)||dn(t))&&(s=a(s,(u,c)=>{Ps(c,r)||u(c)})),i.addEventListener(t,s,o),()=>{i.removeEventListener(t,s,o)}}function ln(e,t){if(e.includes("debounce")){let r=e[e.indexOf("debounce")+1]||"invalid-wait",n=Le(r.split("ms")[0])?Number(r.split("ms")[0]):250;t=Fr(t,n)}if(e.includes("throttle")){let r=e[e.indexOf("throttle")+1]||"invalid-wait",n=Le(r.split("ms")[0])?Number(r.split("ms")[0]):250;t=Br(t,n)}return t}function Os(e){return e.replace(/-/g,".")}function Ts(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function Le(e){return!Array.isArray(e)&&!isNaN(e)}function Ms(e){return[" ","_"].includes(e)?e:e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()}function Cs(e){return["keydown","keyup"].includes(e)}function dn(e){return["contextmenu","click","mouse"].some(t=>e.includes(t))}var Rs=["window","document","prevent","stop","once","capture","self","away","outside","passive","dot","camel","preserve-scroll","blur","change","lazy","number","boolean","trim","fill","unintrusive","parent"];function Ps(e,t){let r=t.filter((s,o)=>s==="false"&&t[o-1]==="passive"?!1:!Rs.includes(s));if(r.includes("debounce")){let s=r.indexOf("debounce");r.splice(s,Le((r[s+1]||"invalid-wait").split("ms")[0])?2:1)}if(r.includes("throttle")){let s=r.indexOf("throttle");r.splice(s,Le((r[s+1]||"invalid-wait").split("ms")[0])?2:1)}if(r.length===0||r.length===1&&Yt(e.key).includes(r[0]))return!1;let i=["ctrl","shift","alt","meta","cmd","super"].filter(s=>r.includes(s));return r=r.filter(s=>!i.includes(s)),!(i.length>0&&i.filter(o=>((o==="cmd"||o==="super")&&(o="meta"),e[`${o}Key`])).length===i.length&&(dn(e.type)||Yt(e.key).includes(r[0])))}function Yt(e){if(!e)return[];e=Ms(e);let t={ctrl:"control",slash:"/",space:" ",spacebar:" ",cmd:"meta",esc:"escape",up:"arrow-up",down:"arrow-down",left:"arrow-left",right:"arrow-right",period:".",comma:",",equal:"=",minus:"-",underscore:"_"};return t[e]=e,Object.keys(t).map(r=>{if(t[r]===e)return r}).filter(r=>r)}y("model",(e,{modifiers:t,expression:r},{effect:n,cleanup:i})=>{let s=e;t.includes("parent")&&(s=S(e,d=>d!==e));let o=m(s,r),a;typeof r=="string"?a=m(s,`${r} = __placeholder`):typeof r=="function"&&typeof r()=="string"?a=m(s,`${r()} = __placeholder`):a=()=>{};let u=()=>{let d;return o(x=>d=x),Zt(d)?d.get():d},c=d=>{let x;o(b=>x=b),Zt(x)?x.set(d):a(()=>{},{scope:{__placeholder:d}})};typeof r=="string"&&e.type==="radio"&&v(()=>{e.hasAttribute("name")||e.setAttribute("name",r)});let f=t.includes("change")||t.includes("lazy"),l=t.includes("blur"),_=t.includes("enter"),g=f||l||_,C;if(L)C=()=>{};else if(g){let d=[],x=b=>c(Me(e,t,b,u()));if(f&&d.push(Q(e,"change",t,x)),l&&(d.push(Q(e,"blur",t,x)),e.form)){let b=e.form,Z=()=>x({target:e});b._x_pendingModelUpdates||(b._x_pendingModelUpdates=[]),b._x_pendingModelUpdates.push(Z),i(()=>{b._x_pendingModelUpdates&&b._x_pendingModelUpdates.splice(b._x_pendingModelUpdates.indexOf(Z),1)})}_&&d.push(Q(e,"keydown",t,b=>{b.key==="Enter"&&x(b)})),C=()=>d.forEach(b=>b())}else{let d=e.tagName.toLowerCase()==="select"||["checkbox","radio"].includes(e.type)?"change":"input";C=Q(e,d,t,x=>{c(Me(e,t,x,u()))})}if(t.includes("fill")&&([void 0,null,""].includes(u())||$e(e)&&Array.isArray(u())||e.tagName.toLowerCase()==="select"&&e.multiple)&&c(Me(e,t,{target:e},u())),e._x_removeModelListeners||(e._x_removeModelListeners={}),e._x_removeModelListeners.default=C,i(()=>e._x_removeModelListeners.default()),e.form){let d=Q(e.form,"reset",[],x=>{Ct(()=>e._x_model&&e._x_model.set(Me(e,t,{target:e},u())))});i(()=>d())}if(e._x_model={get(){return u()},set(d){c(d)},setWithModifiers:ln(t,c)},e._x_forceModelUpdate=d=>{d===void 0&&typeof r=="string"&&r.match(/\./)&&(d=""),v(()=>{$e(e)?Array.isArray(d)?e.checked=d.some(x=>x==e.value):e.checked=!!d:Dt(e)?typeof d=="boolean"?e.checked=Ce(e.value)===d:e.checked=e.value==d:jr(e,"value",d)})},e.tagName==="SELECT"){let d=new MutationObserver(()=>{e._x_forceModelUpdate(u())});d.observe(e,{childList:!0}),i(()=>d.disconnect())}n(()=>{let d=u();t.includes("unintrusive")&&document.activeElement.isSameNode(e)||e._x_forceModelUpdate(d)})});function Me(e,t,r,n){return v(()=>{if(r instanceof CustomEvent&&r.detail!==void 0)return r.detail!==null&&r.detail!==void 0?r.detail:r.target.value;if($e(e))if(Array.isArray(n)){let i=null;return t.includes("number")?i=Xe(r.target.value):t.includes("boolean")?i=Ce(r.target.value):i=r.target.value,r.target.checked?n.includes(i)?n:n.concat([i]):n.filter(s=>!Ds(s,i))}else return r.target.checked;else{if(e.tagName.toLowerCase()==="select"&&e.multiple)return t.includes("number")?Array.from(r.target.selectedOptions).map(i=>{let s=i.value||i.text;return Xe(s)}):t.includes("boolean")?Array.from(r.target.selectedOptions).map(i=>{let s=i.value||i.text;return Ce(s)}):Array.from(r.target.selectedOptions).map(i=>i.value||i.text);{let i;return Dt(e)?r.target.checked?i=r.target.value:i=n:i=r.target.value,t.includes("number")?Xe(i):t.includes("boolean")?Ce(i):t.includes("trim")?i.trim():i}}})}function Xe(e){let t=e?parseFloat(e):null;return $s(t)?t:e}function Ds(e,t){return e==t}function $s(e){return!Array.isArray(e)&&!isNaN(e)}function Zt(e){return e!==null&&typeof e=="object"&&typeof e.get=="function"&&typeof e.set=="function"}y("cloak",e=>queueMicrotask(()=>v(()=>e.removeAttribute(ie("cloak")))));Dr(()=>`[${ie("init")}]`);y("init",$((e,{expression:t},{evaluate:r})=>typeof t=="string"?!!t.trim()&&r(t,{},!1):r(t,{},!1)));y("text",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(s=>{v(()=>{e.textContent=s})})})});y("html",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(s=>{v(()=>{Array.from(e.children).forEach(o=>Y(o)),e.innerHTML=s??"",e._x_ignoreSelf=!0,M(e),delete e._x_ignoreSelf})})},{priority:"structural"})});Ot(xr(":",br(ie("bind:"))));var pn=(e,{value:t,modifiers:r,expression:n,original:i},{effect:s,cleanup:o})=>{if(!t){let u={};Bi(u),m(e,n)(f=>{Kr(e,f,i)},{scope:u});return}if(t==="key")return Is(e,n);if(e._x_inlineBindings&&e._x_inlineBindings[t]&&e._x_inlineBindings[t].extract)return;let a=m(e,n);s(()=>a(u=>{u===void 0&&typeof n=="string"&&n.match(/\./)&&(u=""),v(()=>jr(e,t,u,r))})),o(()=>{e._x_undoAddedClasses&&e._x_undoAddedClasses(),e._x_undoAddedStyles&&e._x_undoAddedStyles()})};pn.inline=(e,{value:t,modifiers:r,expression:n})=>{t&&(e._x_inlineBindings||(e._x_inlineBindings={}),e._x_inlineBindings[t]={expression:n,extract:!1})};y("bind",pn);function Is(e,t){e._x_keyExpression=t}Pr(()=>`[${ie("data")}]`);var j=Symbol();y("data",(e,{expression:t},{cleanup:r})=>{if(js(e))return;let n=e[j];if(n?.expression===t)return;t=t===""?"{}":t;let i={};_e(i,e);let s={};qi(s,i);let o=B(e,t,{scope:s});(o===void 0||o===!0)&&(o={}),_e(o,e);let a;if(n?.reactiveData){a=n.reactiveData,Ls(a,o);let c={expression:t};e[j]=c,queueMicrotask(()=>{e[j]===c&&delete e[j]})}else a=re(o);Et(a,r);let u=we(e,a);$(()=>{a.init&&B(e,a.init)})(),r(()=>{a.destroy&&B(e,a.destroy),u();let c={reactiveData:a};e[j]=c,queueMicrotask(()=>{e[j]===c&&delete e[j]})})});function Ls(e,t){Object.keys(t).forEach(r=>{let n=Object.getOwnPropertyDescriptor(t,r),i=Object.getOwnPropertyDescriptor(e,r);n.get||n.set||i?.get||i?.set?(i&&delete e[r],i||(e[r]=void 0),n.get||n.set?Object.defineProperty(e,r,n):e[r]=t[r]):e[r]=t[r]}),Object.keys(e).filter(r=>!Object.prototype.hasOwnProperty.call(t,r)).forEach(r=>delete e[r])}Se((e,t)=>{e._x_dataStack&&(t._x_dataStack=e._x_dataStack,t.setAttribute("data-has-alpine-state",!0))});function js(e){return L?ot?!0:e.hasAttribute("data-has-alpine-state"):!1}y("show",(e,{modifiers:t,expression:r},{effect:n})=>{let i=m(e,r);e._x_doHide||(e._x_doHide=()=>{v(()=>{e.style.setProperty("display","none",t.includes("important")?"important":void 0)})}),e._x_doShow||(e._x_doShow=()=>{v(()=>{e.style.length===1&&e.style.display==="none"?e.removeAttribute("style"):e.style.removeProperty("display")})});let s=()=>{e._x_doHide(),e._x_isShown=!1},o=()=>{e._x_doShow(),e._x_isShown=!0},a=()=>setTimeout(o),u=ft(l=>l?o():s(),l=>{typeof e._x_toggleAndCascadeWithTransitions=="function"?e._x_toggleAndCascadeWithTransitions(e,l,o,s):l?a():s()}),c,f=!0;n(()=>i(l=>{!f&&l===c||(t.includes("immediate")&&(l?a():s()),u(l),c=l,f=!1)}))});y("for",$((e,{expression:t},{effect:r,cleanup:n})=>{let i=Fs(t),s=m(e,i.items),o=m(e,e._x_keyExpression||"index");e._x_lookup=new Map,r(()=>ks(e,i,s,o),{priority:"structural"}),n(()=>{e._x_lookup.forEach(a=>v(()=>{Y(a),a.remove()})),delete e._x_lookup,delete e._x_lastRenderedEl})}));function Ns(e){return t=>{Object.entries(t).forEach(([r,n])=>{e[r]=n})}}function ks(e,t,r,n){r(i=>{Hs(i)&&(i=Array.from({length:i},(c,f)=>f+1)),i==null&&(i=[]),i instanceof Set&&(i=Array.from(i)),i instanceof Map&&(i=Array.from(i));let s=e._x_lookup,o=new Map;e._x_lookup=o;let a=qs(i),u=Object.entries(i).map(([c,f])=>{a||(c=parseInt(c));let l=Bs(t,f,c,i),_;return n(g=>{typeof g=="object"&&T("x-for key cannot be an object, it must be a string or an integer",e),s.has(g)&&(o.set(g,s.get(g)),s.delete(g)),_=g},{scope:{index:c,...l}}),[_,l]});v(()=>{s.forEach(l=>{Y(l),l.remove()});let c=new Set,f=e;u.forEach(([l,_])=>{if(o.has(l)){let d=o.get(l);d._x_refreshXForScope(_),f.nextElementSibling!==d&&(f.nextElementSibling&&d.replaceWith(f.nextElementSibling),f.after(d)),f=d,d._x_currentIfEl&&(d.nextElementSibling!==d._x_currentIfEl&&f.after(d._x_currentIfEl),f=d._x_currentIfEl);return}e.content.children.length>1&&T("x-for templates require a single root element, additional elements will be ignored.",e);let g=document.importNode(e.content,!0).firstElementChild,C=re(_);we(g,C,e),g._x_refreshXForScope=Ns(C),o.set(l,g),c.add(g),f.after(g),f=g}),c.forEach(l=>M(l)),f!==e?e._x_lastRenderedEl=f:delete e._x_lastRenderedEl})})}function Fs(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,r=/^\s*\(|\)\s*$/g,n=/([\s\S]*?)\b(?:in|of)\b([\s\S]*)/,i=e.match(n);if(!i)return;let s={};s.items=i[2].trim();let o=i[1].replace(r,"").trim(),a=o.match(t);return a?(s.item=o.replace(t,"").trim(),s.index=a[1].trim(),a[2]&&(s.collection=a[2].trim())):s.item=o,s}function Bs(e,t,r,n){let i={};return/^\[.*\]$/.test(e.item)&&Array.isArray(t)?e.item.replace("[","").replace("]","").split(",").map(o=>o.trim()).forEach((o,a)=>{i[o]=t[a]}):/^\{.*\}$/.test(e.item)&&!Array.isArray(t)&&typeof t=="object"?e.item.replace("{","").replace("}","").split(",").map(o=>o.trim()).forEach(o=>{i[o]=t[o]}):i[e.item]=t,e.index&&(i[e.index]=r),e.collection&&(i[e.collection]=n),i}function Hs(e){return typeof e!="object"&&!isNaN(e)}function qs(e){return typeof e=="object"&&!Array.isArray(e)}function hn(){}hn.inline=(e,{expression:t},{cleanup:r})=>{let n=Be(e);n&&(n._x_refs||(n._x_refs={}),n._x_refs[t]=e,r(()=>delete n._x_refs[t]))};y("ref",hn);y("if",$((e,{expression:t},{effect:r,cleanup:n})=>{e.tagName.toLowerCase()!=="template"&&T("x-if can only be used on a <template> tag",e);let i=m(e,t),s=()=>{if(e._x_currentIfEl)return e._x_currentIfEl;let a=e.content.cloneNode(!0).firstElementChild;return we(a,{},e),v(()=>{e.after(a),M(a)}),e._x_currentIfEl=a,e._x_lastRenderedEl=a,e._x_undoIf=()=>{v(()=>{Y(a),a.remove()}),delete e._x_currentIfEl,delete e._x_lastRenderedEl},a},o=()=>{e._x_undoIf&&(e._x_undoIf(),delete e._x_undoIf)};r(()=>i(a=>{a?s():o()}),{priority:"structural"}),n(()=>e._x_undoIf&&e._x_undoIf())}));y("id",(e,{expression:t},{evaluate:r})=>{r(t).forEach(i=>Ss(e,i))});Se((e,t)=>{e._x_ids&&(t._x_ids=e._x_ids)});Ot(xr("@",br(ie("on:"))));y("on",$((e,{value:t,modifiers:r,expression:n},{cleanup:i})=>{let s=n?m(e,n):()=>{};e.tagName.toLowerCase()==="template"&&(e._x_forwardEvents||(e._x_forwardEvents=[]),e._x_forwardEvents.includes(t)||e._x_forwardEvents.push(t));let o=Q(e,t,r,a=>{s(()=>{},{scope:{$event:a},params:[a]})});i(()=>o())}));Ke("Collapse","collapse","collapse");Ke("Intersect","intersect","intersect");Ke("Focus","trap","focus");Ke("Mask","mask","mask");function Ke(e,t,r){y(t,n=>T(`You can't use [x-${t}] without first installing the "${e}" plugin here: https://alpinejs.dev/plugins/${r}`,n))}se.setEvaluator(Kn);se.setRawEvaluator(Jn);se.setReactivityEngine({reactive:kt,effect:(e,t={})=>{let r;return r=Qi(e,{scheduler:()=>{r&&(t.scheduler?t.scheduler(r):r())}}),r},release:es,raw:h});var Ks=se,Ft=Ks;var Vs={200:{name:"info",badge:"bg-sky-100 text-sky-800 ring-sky-200"},400:{name:"error",badge:"bg-rose-100 text-rose-800 ring-rose-200"}},Ws="bg-slate-100 text-slate-700 ring-slate-200",zs=50;function _n(e){return Vs[e]??{name:String(e),badge:Ws}}function oe(e,t=2){return String(e).padStart(t,"0")}async function Us(e){try{let t=await e.json();if(typeof t=="object"&&t!==null&&"error"in t&&typeof t.error=="string")return t.error}catch{}return`Request failed: ${e.status} ${e.statusText}`}var Ae=0;Ft.data("logsViewer",()=>({api_url:"api/logs",trace_id:"",new_tag_key:"",new_tag_value:"",tags:[],groups:[],total:0,limit:zs,offset:0,loading:!1,error_message:"",expanded:{},init(){this.api_url=this.$root.dataset.api??this.api_url,this.load()},async load(){let e=++Ae;this.loading=!0,this.error_message="";let t=this.trace_id.trim();try{let r=await fetch(this.api_url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({trace_id:t===""?void 0:t,tags:this.tags,limit:this.limit,offset:this.offset})});if(e!==Ae)return;if(!r.ok){this.error_message=await Us(r);return}let n=await r.json();if(e!==Ae)return;this.groups=n.groups,this.total=n.total,this.expanded={},(t!==""||n.groups.length===1)&&n.groups.forEach(i=>this.expanded[this.groupKey(i)]=!0)}catch(r){e===Ae&&(this.error_message=r instanceof Error?r.message:String(r))}finally{e===Ae&&(this.loading=!1)}},search(){this.offset=0,this.load()},hasTag(e,t){return this.tags.some(r=>r.key===e&&r.value===t)},addTag(){let e=this.new_tag_key.trim(),t=this.new_tag_value.trim();e!==""&&(this.hasTag(e,t)||this.tags.push({key:e,value:t}),this.new_tag_key="",this.new_tag_value="",this.search())},removeTag(e){this.tags.splice(e,1),this.search()},filterByTag(e,t){let r=String(t);this.hasTag(e,r)||(this.tags.push({key:e,value:r}),this.search())},filterByTrace(e){e!==null&&(this.trace_id=e,this.search())},clearFilters(){this.trace_id="",this.tags=[],this.search()},hasFilters(){return this.trace_id.trim()!==""||this.tags.length>0},hasPrevPage(){return this.offset>0},hasNextPage(){return this.offset+this.groups.length<this.total},prevPage(){this.offset=Math.max(0,this.offset-this.limit),this.load()},nextPage(){this.offset+=this.limit,this.load()},pageRange(){return this.groups.length===0?"0":`${this.offset+1}\u2013${this.offset+this.groups.length}`},groupKey(e){return e.trace_id!==null?"trace:"+e.trace_id:"log:"+(e.logs[0]?.id??"")},isExpanded(e){return this.expanded[this.groupKey(e)]===!0},toggle(e){let t=this.groupKey(e);this.expanded[t]=!this.expanded[t]},summary(e){return e.logs[0]?.message??""},levelName(e){return _n(e).name},levelBadge(e){return _n(e).badge},tagEntries(e){return Object.entries(e).map(([t,r])=>({key:t,value:r}))},formatTime(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${oe(t.getHours())}:${oe(t.getMinutes())}:${oe(t.getSeconds())}.${oe(t.getMilliseconds(),3)}`},formatDate(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${t.getFullYear()}-${oe(t.getMonth()+1)}-${oe(t.getDate())} ${this.formatTime(e)}`},formatDuration(e){let t=new Date(e.finished_at).getTime()-new Date(e.started_at).getTime();return!Number.isFinite(t)||t<=0?"":t<1e3?`${t} ms`:`${(t/1e3).toFixed(2)} s`},formatMessage(e){let t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.stringify(JSON.parse(t),null,2)}catch{return e}}}));Ft.start();})();
|
|
5
|
+
`:""}`,t),setTimeout(()=>{throw e},0)}var ee=!0;function pr(e){let t=ee;ee=!1;let r=e();return ee=t,r}function B(e,t,r={}){let n;return m(e,t)(i=>n=i,r),n}function m(...e){return hr(...e)}var hr=()=>{};function qn(e){hr=e}var _r;function Kn(e){_r=e}function Vn(e,t){let r={};_e(r,e);let n=[r,...q(e)],i=typeof t=="function"?Wn(n,t):Un(n,t,e);return Fn.bind(null,e,t,i)}function Wn(e,t){return(r=()=>{},{scope:n={},params:i=[],context:s}={})=>{if(!ee){ge(r,t,K([n,...e]),i);return}let o=t.apply(K([n,...e]),i);ge(r,o)}}var ze={};function zn(e,t){if(ze[e])return ze[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,s=(()=>{try{let o=new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`);return Object.defineProperty(o,"name",{value:`[Alpine] ${e}`}),o}catch(o){return te(o,t,e),Promise.resolve()}})();return ze[e]=s,s}function Un(e,t,r){let n=zn(t,r);return(i=()=>{},{scope:s={},params:o=[],context:a}={})=>{n.result=void 0,n.finished=!1;let u=K([s,...e]);if(typeof n=="function"){let c=n.call(a,n,u).catch(l=>te(l,r,t));n.finished?(ge(i,n.result,u,o,r),n.result=void 0):c.then(l=>{ge(i,l,u,o,r)}).catch(l=>te(l,r,t)).finally(()=>n.result=void 0)}}}function ge(e,t,r,n,i){if(ee&&typeof t=="function"){let s=t.apply(r,n);s instanceof Promise?s.then(o=>ge(e,o,r,n)).catch(o=>te(o,i,t)):e(s)}else typeof t=="object"&&t instanceof Promise?t.then(s=>e(s)):e(t)}function Jn(...e){return _r(...e)}function Gn(e,t,r={}){let n={};_e(n,e);let i=[n,...q(e)],s=K([r.scope??{},...i]),o=r.params??[];if(t.includes("await")){let a=Object.getPrototypeOf(async function(){}).constructor,u=/^[\n\s]*if.*\(.*\)/.test(t.trim())||/^(let|const)\s/.test(t.trim())?`(async()=>{ ${t} })()`:t;return new a(["scope"],`with (scope) { let __result = ${u}; return __result }`).call(r.context,s)}else{let a=/^[\n\s]*if.*\(.*\)/.test(t.trim())||/^(let|const)\s/.test(t.trim())?`(()=>{ ${t} })()`:t,c=new Function(["scope"],`with (scope) { let __result = ${a}; return __result }`).call(r.context,s);return typeof c=="function"&&ee?c.apply(s,o):c}}var Ot="x-";function ie(e=""){return Ot+e}function Yn(e){Ot=e}var De={};function y(e,t){return De[e]=t,{before(r){if(!De[r]){console.warn(String.raw`Cannot find directive \`${r}\`. \`${e}\` will use the default order of execution`);return}let n=F.indexOf(r);F.splice(n>=0?n:F.indexOf("DEFAULT"),0,e)}}}function Zn(e){return Object.keys(De).includes(e)}function ke(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let s=Object.entries(e._x_virtualDirectives).map(([a,u])=>({name:a,value:u})),o=gr(s);s=s.map(a=>o.find(u=>u.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(s)}let n={};return t.map(mr((s,o)=>n[s]=o)).filter(Sr).map(ei(n,r)).sort(ti).map(s=>Qn(e,s))}function gr(e){return Array.from(e).map(mr()).filter(t=>!Sr(t))}var st=!1,ce=new Map,vr=Symbol();function Xn(e){st=!0;let t=Symbol();vr=t,ce.set(t,[]);let r=()=>{for(;ce.get(t).length;)ce.get(t).shift()();ce.delete(t)},n=()=>{st=!1,r()};e(r),n()}function yr(e){let t=[],r=a=>t.push(a),[n,i]=Tn(e);return t.push(i),[{Alpine:se,effect:n,cleanup:r,evaluateLater:m.bind(m,e),evaluate:B.bind(B,e)},()=>t.forEach(a=>a())]}function Qn(e,t){let r=()=>{},n=De[t.type]||r,[i,s]=yr(e);sr(e,t.original,s);let o=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),st?ce.get(vr).push(n):n())};return o.runCleanups=s,o}var br=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),xr=e=>e;function mr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=wr.reduce((s,o)=>o(s),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var wr=[];function Tt(e){wr.push(e)}function Sr({name:e}){return Er().test(e)}var Er=()=>new RegExp(`^${Ot}([^:^.]+)\\b`);function ei(e,t){return({name:r,value:n})=>{r===n&&(n="");let i=r.match(Er()),s=r.match(/:([a-zA-Z0-9\-_:]+)/),o=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:s?s[1]:null,modifiers:o.map(u=>u.replace(".","")),expression:n,original:a}}}var ot="DEFAULT",F=["ignore","ref","id","data","anchor","bind","init","for","model","modelable","transition","show","if",ot,"teleport"];function ti(e,t){let r=F.indexOf(e.type)===-1?ot:e.type,n=F.indexOf(t.type)===-1?ot:t.type;return F.indexOf(r)-F.indexOf(n)}function V(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>V(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)V(n,t,!1),n=n.nextElementSibling}var L=!1;function $(e,t=()=>{}){return(...r)=>L?t(...r):e(...r)}function ri(e){return(...t)=>L&&e(...t)}var Ar=[];function Se(e){Ar.push(e)}function ni(e,t){Ar.forEach(r=>r(e,t)),L=!0,Or(()=>{M(t,(r,n)=>{n(r,()=>{})})}),L=!1}var at=!1;function ii(e,t){t._x_dataStack||(t._x_dataStack=e._x_dataStack),L=!0,at=!0,Or(()=>{si(t)}),L=!1,at=!1}function si(e){let t=!1;M(e,(n,i)=>{V(n,(s,o)=>{if(t&&fi(s))return o();t=!0,i(s,o)})})}function Or(e){let t=G;Ht((r,n)=>{let i=t(r);return ne(i),()=>{}}),e(),Ht(t)}var Fe=0;function oi(e,t){let r=e._x_deferInit;r||(r=e._x_deferInit={pending:0,ownsIgnore:!e._x_ignore,queuedAttributes:new Map},r.ownsIgnore&&(e._x_ignore=!0),Fe++),r.pending++,Promise.resolve(t).catch(n=>{try{te(n,e)}catch(i){setTimeout(()=>{throw i},0)}}).then(()=>ai(e,r))}function ai(e,t){t.pending--,!(t.pending>0)&&(Dn(),!(t.pending>0)&&e._x_deferInit===t&&(delete e._x_deferInit,t.ownsIgnore&&delete e._x_ignore,Fe--,e.isConnected&&(ci(t),M(e))))}function ui(e,t){if(Fe===0)return!1;let r=S(e,n=>n._x_deferInit);return r?(Tr(r._x_deferInit,e,t.map(({name:n})=>n)),!0):!1}function Tr(e,t,r){let n=e.queuedAttributes.get(t);(!n||n.marker!==t._x_marker)&&(n={marker:t._x_marker,names:new Set},e.queuedAttributes.set(t,n)),r.forEach(i=>n.names.add(i))}function ci(e){e.queuedAttributes.forEach((t,r)=>{if(!r.isConnected||!r._x_marker||r._x_marker!==t.marker)return;let n=S(r,s=>s._x_deferInit);if(n){Tr(n._x_deferInit,r,Array.from(t.names));return}let i=Array.from(t.names).filter(s=>r.hasAttribute(s)).map(s=>({name:s,value:r.getAttribute(s)}));i.length!==0&&ke(r,i).forEach(s=>s())})}Se((e,t)=>{Fe!==0&&(!e||e.nodeType!==1||!t||t.nodeType!==1||S(e,r=>r._x_deferInit)&&(t._x_ignore=!0))});function le(e,t,r={},n={}){return e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0,...n}))}function T(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var qt=!1;function li(){qt&&T("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),qt=!0,document.body||T("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?"),le(document,"alpine:init"),le(document,"alpine:initializing"),St(),Cn(t=>M(t,V)),mt(t=>Y(t)),ir((t,r)=>{ui(t,r)||ke(t,r).forEach(n=>n())});let e=t=>!Be(t.parentElement,!0);Array.from(document.querySelectorAll(Rr().join(","))).filter(e).forEach(t=>{M(t)}),le(document,"alpine:initialized"),setTimeout(()=>{hi()})}var Mt=[],Mr=[];function Cr(){return Mt.map(e=>e())}function Rr(){return Mt.concat(Mr).map(e=>e())}function Pr(e){Mt.push(e)}function Dr(e){Mr.push(e)}function Be(e,t=!1){return S(e,r=>{if((t?Rr():Cr()).some(i=>r.matches(i)))return!0})}function S(e,t){if(e){if(t(e))return e;if(e._x_teleportBack)return S(e._x_teleportBack,t);if(e.parentNode instanceof ShadowRoot)return S(e.parentNode.host,t);if(e.parentElement)return S(e.parentElement,t)}}function fi(e){return Cr().some(t=>e.matches(t))}var $r=[];function di(e){$r.push(e)}var pi=1;function M(e,t=V,r=()=>{}){S(e,n=>n._x_ignore)||Xn(()=>{t(e,(n,i)=>{n._x_marker||(r(n,i),$r.forEach(s=>s(n,i)),ke(n,n.attributes).forEach(s=>s()),n._x_ignore||(n._x_marker=pi++),n._x_ignore&&i())})})}function Y(e,t=V){t(e,r=>{Rn(r),or(r),delete r._x_marker})}function hi(){[["ui","dialog",["[x-dialog], [x-popover]"]],["anchor","anchor",["[x-anchor]"]],["sort","sort",["[x-sort]"]]].forEach(([t,r,n])=>{Zn(r)||n.some(i=>{if(document.querySelector(i))return T(`found "${i}", but missing ${t} plugin`),!0})})}var ut=[],Ct=!1;function Rt(e=()=>{}){return queueMicrotask(()=>{Ct||setTimeout(()=>{ct()})}),new Promise(t=>{ut.push(()=>{e(),t()})})}function ct(){for(Ct=!1;ut.length;)ut.shift()()}function _i(){Ct=!0}function Pt(e,t){return Array.isArray(t)?Kt(e,t.join(" ")):typeof t=="object"&&t!==null?gi(e,t):typeof t=="function"?Pt(e,t()):Kt(e,t)}function lt(e){return e.split(/\s/).filter(Boolean)}function Kt(e,t){let r=i=>lt(i).filter(s=>!e.classList.contains(s)).filter(Boolean),n=i=>(e.classList.add(...i),()=>{e.classList.remove(...i)});return t=t===!0?t="":t||"",n(r(t))}function gi(e,t){let r=Object.entries(t).flatMap(([o,a])=>a?lt(o):!1).filter(Boolean),n=Object.entries(t).flatMap(([o,a])=>a?!1:lt(o)).filter(Boolean),i=[],s=[];return n.forEach(o=>{e.classList.contains(o)&&(e.classList.remove(o),s.push(o))}),r.forEach(o=>{e.classList.contains(o)||(e.classList.add(o),i.push(o))}),()=>{s.forEach(o=>e.classList.add(o)),i.forEach(o=>e.classList.remove(o))}}function He(e,t){return typeof t=="object"&&t!==null?vi(e,t):yi(e,t)}function vi(e,t){let r={};return Object.entries(t).forEach(([n,i])=>{r[n]=e.style[n],n.startsWith("--")||(n=bi(n)),e.style.setProperty(n,i)}),setTimeout(()=>{e.style.length===0&&e.removeAttribute("style")}),()=>{He(e,r)}}function yi(e,t){let r=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",r||"")}}function bi(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function ft(e,t=()=>{}){let r=!1;return function(){r?t.apply(this,arguments):(r=!0,e.apply(this,arguments))}}y("transition",(e,{value:t,modifiers:r,expression:n},{evaluate:i})=>{typeof n=="function"&&(n=i(n)),n!==!1&&(!n||typeof n=="boolean"?mi(e,r,t):xi(e,n,t))});function xi(e,t,r){Ir(e,Pt,""),{enter:i=>{e._x_transition.enter.during=i},"enter-start":i=>{e._x_transition.enter.start=i},"enter-end":i=>{e._x_transition.enter.end=i},leave:i=>{e._x_transition.leave.during=i},"leave-start":i=>{e._x_transition.leave.start=i},"leave-end":i=>{e._x_transition.leave.end=i}}[r](t)}function mi(e,t,r){Ir(e,He);let n=!t.includes("in")&&!t.includes("out")&&!r,i=n||t.includes("in")||["enter"].includes(r),s=n||t.includes("out")||["leave"].includes(r);t.includes("in")&&!n&&(t=t.filter((x,Z)=>Z<t.indexOf("out"))),t.includes("out")&&!n&&(t=t.filter((x,Z)=>Z>t.indexOf("out")));let o=!t.includes("opacity")&&!t.includes("scale"),a=o||t.includes("opacity"),u=o||t.includes("scale"),c=a?0:1,l=u?ae(t,"scale",95)/100:1,f=ae(t,"delay",0)/1e3,_=ae(t,"origin","center"),g="opacity, transform",C=ae(t,"duration",150)/1e3,d=ae(t,"duration",75)/1e3,b="cubic-bezier(0.4, 0.0, 0.2, 1)";i&&(e._x_transition.enter.during={transformOrigin:_,transitionDelay:`${f}s`,transitionProperty:g,transitionDuration:`${C}s`,transitionTimingFunction:b},e._x_transition.enter.start={opacity:c,transform:`scale(${l})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"}),s&&(e._x_transition.leave.during={transformOrigin:_,transitionDelay:`${f}s`,transitionProperty:g,transitionDuration:`${d}s`,transitionTimingFunction:b},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:c,transform:`scale(${l})`})}function Ir(e,t,r={}){e._x_transition||(e._x_transition={enter:{during:r,start:r,end:r},leave:{during:r,start:r,end:r},in(n=()=>{},i=()=>{}){dt(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,i)},out(n=()=>{},i=()=>{}){dt(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,i)}})}window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,r,n){let i=document.visibilityState==="visible"?requestAnimationFrame:setTimeout,s=()=>i(r);if(t){e._x_transition&&(e._x_transition.enter||e._x_transition.leave)?e._x_transition.enter&&(Object.entries(e._x_transition.enter.during).length||Object.entries(e._x_transition.enter.start).length||Object.entries(e._x_transition.enter.end).length)?e._x_transition.in(r):s():e._x_transition?e._x_transition.in(r):s();return}e._x_hidePromise=e._x_transition?new Promise((o,a)=>{e._x_transition.out(()=>{},()=>o(n)),e._x_transitioning&&e._x_transitioning.beforeCancel(()=>a({isFromCancelledTransition:!0}))}):Promise.resolve(n),queueMicrotask(()=>{let o=Lr(e);o?(o._x_hideChildren||(o._x_hideChildren=[]),o._x_hideChildren.push(e)):i(()=>{let a=u=>{let c=Promise.all([u._x_hidePromise,...(u._x_hideChildren||[]).map(a)]).then(([l])=>l?.());return delete u._x_hidePromise,delete u._x_hideChildren,c};a(e).catch(u=>{if(!u.isFromCancelledTransition)throw u})})})};function Lr(e){let t=e.parentNode;if(t)return t._x_hidePromise?t:Lr(t)}function dt(e,t,{during:r,start:n,end:i}={},s=()=>{},o=()=>{}){if(e._x_transitioning&&e._x_transitioning.cancel(),Object.keys(r).length===0&&Object.keys(n).length===0&&Object.keys(i).length===0){s(),o();return}let a,u,c;wi(e,{start(){a=t(e,n)},during(){u=t(e,r)},before:s,end(){a(),c=t(e,i)},after:o,cleanup(){u(),c()}})}function wi(e,t){let r,n,i,s=ft(()=>{v(()=>{r=!0,n||t.before(),i||(t.end(),ct()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning})});e._x_transitioning={beforeCancels:[],beforeCancel(o){this.beforeCancels.push(o)},cancel:ft(function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();s()}),finish:s},v(()=>{t.start(),t.during()}),_i(),requestAnimationFrame(()=>{if(r)return;let o=Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""))*1e3,a=Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""))*1e3;o===0&&(o=Number(getComputedStyle(e).animationDuration.replace("s",""))*1e3),v(()=>{t.before()}),n=!0,requestAnimationFrame(()=>{r||(v(()=>{t.end()}),ct(),setTimeout(e._x_transitioning.finish,o+a),i=!0)})})}function ae(e,t,r){if(e.indexOf(t)===-1)return r;let n=e[e.indexOf(t)+1];if(!n||t==="scale"&&isNaN(n))return r;if(t==="duration"||t==="delay"){let i=n.match(/([0-9]+)ms/);if(i)return i[1]}return t==="origin"&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[n,e[e.indexOf(t)+2]].join(" "):n}function jr(e,t,r,n=[]){switch(e._x_bindings||(e._x_bindings=re({})),e._x_bindings[t]=r,t=n.includes("camel")?Ri(t):t,t){case"value":Si(e,r);break;case"style":Ai(e,r);break;case"class":Ei(e,r);break;case"selected":case"checked":Oi(e,t,r);break;default:Dt(e,t,r);break}}function Si(e,t){if($t(e))e.attributes.value===void 0&&(e.value=t);else if($e(e))Number.isInteger(t)?e.value=t:!Array.isArray(t)&&typeof t!="boolean"&&![null,void 0].includes(t)?e.value=String(t):Array.isArray(t)?e.checked=t.some(r=>Pi(r,e.value)):e.checked=!!t;else if(e.tagName==="SELECT")Ci(e,t);else if(e.tagName==="OPTION")Dt(e,"value",t);else{if(e.value===t&&(typeof t!="object"||t===null))return;e.value=t===void 0?"":t}}function Ei(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses(),e._x_undoAddedClasses=Pt(e,t)}function Ai(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles(),e._x_undoAddedStyles=He(e,t)}function Oi(e,t,r){Dt(e,t,r),Mi(e,t,r)}function Dt(e,t,r){[null,void 0,!1].includes(r)&&$i(t)?e.removeAttribute(t):(Nr(t)&&(r=t),Ii(r)&&(r=JSON.stringify(r)),Ti(e,t,r))}function Ti(e,t,r){e.getAttribute(t)!=r&&e.setAttribute(t,r)}function Mi(e,t,r){e[t]!==r&&(e[t]=r)}function Ci(e,t){let r=[].concat(t).map(n=>n+"");Array.from(e.options).forEach(n=>{n.selected=r.includes(n.value)})}function Ri(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function Pi(e,t){return e==t}function Ce(e){return[1,"1","true","on","yes",!0].includes(e)?!0:[0,"0","false","off","no",!1].includes(e)?!1:e?!!e:null}var Di=new Set(["allowfullscreen","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","inert","ismap","itemscope","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected","shadowrootclonable","shadowrootdelegatesfocus","shadowrootserializable"]);function Nr(e){return Di.has(e)}function $i(e){return!["aria-pressed","aria-checked","aria-expanded","aria-selected"].includes(e)}function Ii(e){return typeof e=="object"&&e!==null}function Li(e,t,r){return e._x_bindings&&e._x_bindings[t]!==void 0?e._x_bindings[t]:kr(e,t,r)}function ji(e,t,r,n=!0){if(e._x_bindings&&e._x_bindings[t]!==void 0)return e._x_bindings[t];if(e._x_inlineBindings&&e._x_inlineBindings[t]!==void 0){let i=e._x_inlineBindings[t];return i.extract=n,pr(()=>B(e,i.expression))}return kr(e,t,r)}function kr(e,t,r){let n=e.getAttribute(t);return n===null?typeof r=="function"?r():r:n===""?!0:Nr(t)?!![t,"true"].includes(n):n}function $e(e){return e.type==="checkbox"||e.localName==="ui-checkbox"||e.localName==="ui-switch"}function $t(e){return e.type==="radio"||e.localName==="ui-radio"}function Fr(e,t){let r;return function(){let n=this,i=arguments,s=function(){r=null,e.apply(n,i)};clearTimeout(r),r=setTimeout(s,t)}}function Br(e,t){let r;return function(){let n=this,i=arguments;r||(e.apply(n,i),r=!0,setTimeout(()=>r=!1,t))}}function Hr({get:e,set:t},{get:r,set:n}){let i=!0,s,o,a=G(()=>{let u=e(),c=r();if(i)n(Ue(u)),i=!1;else{let l=JSON.stringify(u),f=JSON.stringify(c);l!==s?n(Ue(u)):l!==f&&t(Ue(c))}s=JSON.stringify(e()),o=JSON.stringify(r())});return()=>{xt(a),ne(a)}}function Ue(e){return typeof e=="object"?JSON.parse(JSON.stringify(e)):e}function Ni(e){(Array.isArray(e)?e:[e]).forEach(r=>r(se))}var P={},Vt=!1;function ki(e,t){if(Vt||(P=re(P),Vt=!0),t===void 0)return P[e];P[e]=t,typeof t=="object"&&t!==null&&t._x_interceptor?P[e]=t.initialize(P,e,e,()=>{}):At(P[e]),typeof t=="object"&&t!==null&&t.hasOwnProperty("init")&&typeof t.init=="function"&&P[e].init()}function Fi(){return P}var qr={};function Bi(e,t){let r=typeof t!="function"?()=>t:t;return e instanceof Element?Kr(e,r()):(qr[e]=r,()=>{})}function Hi(e){return Object.entries(qr).forEach(([t,r])=>{Object.defineProperty(e,t,{get(){return(...n)=>r(...n)}})}),e}function Kr(e,t,r){let n=[];for(;n.length;)n.pop()();let i=Object.entries(t).map(([o,a])=>({name:o,value:a})),s=gr(i);return i=i.map(o=>s.find(a=>a.name===o.name)?{name:`x-bind:${o.name}`,value:`"${o.value}"`}:o),ke(e,i,r).map(o=>{n.push(o.runCleanups),o()}),()=>{for(;n.length;)n.pop()()}}var Vr={};function qi(e,t){Vr[e]=t}function Ki(e,t){return Object.entries(Vr).forEach(([r,n])=>{Object.defineProperty(e,r,{get(){return(...i)=>n.bind(t)(...i)},enumerable:!1})}),e}var Vi={get reactive(){return re},get release(){return ne},get effect(){return G},get raw(){return Qt},get transaction(){return Mn},version:"3.17.4",flushAndStopDeferringMutations:In,dontAutoEvaluateFunctions:pr,disableEffectScheduling:An,startObservingMutations:St,stopObservingMutations:ar,setReactivityEngine:On,onAttributeRemoved:sr,onAttributesAdded:ir,closestDataStack:q,skipDuringClone:$,onlyDuringClone:ri,addRootSelector:Pr,addInitSelector:Dr,setErrorHandler:Bn,interceptClone:Se,addScopeToNode:we,deferMutations:$n,mapAttributes:Tt,evaluateLater:m,interceptInit:di,initInterceptors:At,injectMagics:_e,setEvaluator:qn,setRawEvaluator:Kn,mergeProxies:K,extractProp:ji,findClosest:S,onElRemoved:mt,closestRoot:Be,destroyTree:Y,interceptor:lr,transition:dt,setStyles:He,mutateDom:v,deferInit:oi,directive:y,entangle:Hr,throttle:Br,debounce:Fr,evaluate:B,evaluateRaw:Jn,initTree:M,nextTick:Rt,prefixed:ie,prefix:Yn,plugin:Ni,magic:A,store:ki,start:li,clone:ii,cloneNode:ni,bound:Li,$data:ur,watch:er,walk:V,data:qi,bind:Bi},se=Vi;function Wr(e){let t=Object.create(null);for(let r of e.split(","))t[r]=1;return r=>r in t}var Js=Object.freeze({}),Gs=Object.freeze([]),ve=Object.assign,Wi=Object.prototype.hasOwnProperty,pt=(e,t)=>Wi.call(e,t),ye=Array.isArray,fe=e=>zr(e)==="[object Map]",zi=e=>typeof e=="string",Ee=e=>typeof e=="symbol",be=e=>e!==null&&typeof e=="object",Ui=Object.prototype.toString,zr=e=>Ui.call(e),Ur=e=>zr(e).slice(8,-1),It=e=>zi(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,qe=e=>{let t=Object.create(null);return r=>t[r]||(t[r]=e(r))},Ji=/-\w/g,Ys=qe(e=>e.replace(Ji,t=>t.slice(1).toUpperCase())),Gi=/\B([A-Z])/g,Zs=qe(e=>e.replace(Gi,"-$1").toLowerCase()),Jr=qe(e=>e.charAt(0).toUpperCase()+e.slice(1)),Xs=qe(e=>e?`on${Jr(e)}`:""),k=(e,t)=>!Object.is(e,t),Yi="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Qs=Wr(Yi+",async,autofocus,autoplay,controls,default,defer,disabled,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");function W(e,...t){console.warn(`[Vue warn] ${e}`,...t)}var Je,p,Ge=new WeakSet,Wt=class{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,Je&&(Je.active?Je.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Ge.has(this)&&(Ge.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Zi(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,zt(this),Yr(this);let e=p,t=E;p=this,E=!0;try{return this.fn()}finally{p!==this&&W("Active effect was not restored correctly - this is likely a Vue internal bug."),Zr(this),p=e,E=t,this.flags&=-3}}stop(){if(this.flags&1){for(let e=this.deps;e;e=e.nextDep)Nt(e);this.deps=this.depsTail=void 0,zt(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Ge.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){ht(this)&&this.run()}get dirty(){return ht(this)}},Gr=0,de,pe;function Zi(e,t=!1){if(e.flags|=8,t){e.next=pe,pe=e;return}e.next=de,de=e}function Lt(){Gr++}function jt(){if(--Gr>0)return;if(pe){let t=pe;for(pe=void 0;t;){let r=t.next;t.next=void 0,t.flags&=-9,t=r}}let e;for(;de;){let t=de;for(de=void 0;t;){let r=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=r}}if(e)throw e}function Yr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Zr(e){let t,r=e.depsTail,n=r;for(;n;){let i=n.prevDep;n.version===-1?(n===r&&(r=i),Nt(n),Qi(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=r}function ht(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Xi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Xi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ie)||(e.globalVersion=Ie,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ht(e))))return;e.flags|=2;let t=e.dep,r=p,n=E;p=e,E=!0;try{Yr(e);let i=e.fn(e._value);(t.version===0||k(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{p=r,E=n,Zr(e),e.flags&=-3}}function Nt(e,t=!1){let{dep:r,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),r.subsHead===e&&(r.subsHead=i),r.subs===e&&(r.subs=n,!n&&r.computed)){r.computed.flags&=-5;for(let s=r.computed.deps;s;s=s.nextDep)Nt(s,!0)}!t&&!--r.sc&&r.map&&r.map.delete(r.key)}function Qi(e){let{prevDep:t,nextDep:r}=e;t&&(t.nextDep=r,e.prevDep=void 0),r&&(r.prevDep=t,e.nextDep=void 0)}function es(e,t){e.effect instanceof Wt&&(e=e.effect.fn);let r=new Wt(e);t&&ve(r,t);try{r.run()}catch(i){throw r.stop(),i}let n=r.run.bind(r);return n.effect=r,n}function ts(e){e.effect.stop()}var E=!0,Xr=[];function rs(){Xr.push(E),E=!1}function ns(){let e=Xr.pop();E=e===void 0?!0:e}function zt(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let r=p;p=void 0;try{t()}finally{p=r}}}var Ie=0,is=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},ss=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0,this.subsHead=void 0}track(e){if(!p||!E||p===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==p)t=this.activeLink=new is(p,this),p.deps?(t.prevDep=p.depsTail,p.depsTail.nextDep=t,p.depsTail=t):p.deps=p.depsTail=t,Qr(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let r=t.nextDep;r.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=r),t.prevDep=p.depsTail,t.nextDep=void 0,p.depsTail.nextDep=t,p.depsTail=t,p.deps===t&&(p.deps=r)}return p.onTrack&&p.onTrack(ve({effect:p},e)),t}trigger(e){this.version++,Ie++,this.notify(e)}notify(e){Lt();try{for(let t=this.subsHead;t;t=t.nextSub)t.sub.onTrigger&&!(t.sub.flags&8)&&t.sub.onTrigger(ve({effect:t.sub},e));for(let t=this.subs;t;t=t.prevSub)t.sub.notify()&&t.sub.dep.notify()}finally{jt()}}};function Qr(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Qr(n)}let r=e.dep.subs;r!==e&&(e.prevSub=r,r&&(r.nextSub=e)),e.dep.subsHead===void 0&&(e.dep.subsHead=e),e.dep.subs=e}}var _t=new WeakMap,H=Symbol("Object iterate"),gt=Symbol("Map keys iterate"),xe=Symbol("Array iterate");function w(e,t,r){if(E&&p){let n=_t.get(e);n||_t.set(e,n=new Map);let i=n.get(r);i||(n.set(r,i=new ss),i.map=n,i.key=r),i.track({target:e,type:t,key:r})}}function I(e,t,r,n,i,s){let o=_t.get(e);if(!o){Ie++;return}let a=u=>{u&&u.trigger({target:e,type:t,key:r,newValue:n,oldValue:i,oldTarget:s})};if(Lt(),t==="clear")o.forEach(a);else{let u=ye(e),c=u&&It(r);if(u&&r==="length"){let l=Number(n);o.forEach((f,_)=>{(_==="length"||_===xe||!Ee(_)&&_>=l)&&a(f)})}else switch((r!==void 0||o.has(void 0))&&a(o.get(r)),c&&a(o.get(xe)),t){case"add":u?c&&a(o.get("length")):(a(o.get(H)),fe(e)&&a(o.get(gt)));break;case"delete":u||(a(o.get(H)),fe(e)&&a(o.get(gt)));break;case"set":fe(e)&&a(o.get(H));break}}jt()}function X(e){let t=h(e);return t===e?t:(w(t,"iterate",xe),U(e)?t:t.map(J))}function kt(e){return w(e=h(e),"iterate",xe),e}function O(e,t){return z(e)?an(e)?me(J(t)):me(t):J(t)}var os={__proto__:null,[Symbol.iterator](){return Ye(this,Symbol.iterator,e=>O(this,e))},concat(...e){return X(this).concat(...e.map(t=>ye(t)?X(t):t))},entries(){return Ye(this,"entries",e=>(e[1]=O(this,e[1]),e))},every(e,t){return R(this,"every",e,t,void 0,arguments)},filter(e,t){return R(this,"filter",e,t,r=>r.map(n=>O(this,n)),arguments)},find(e,t){return R(this,"find",e,t,r=>O(this,r),arguments)},findIndex(e,t){return R(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return R(this,"findLast",e,t,r=>O(this,r),arguments)},findLastIndex(e,t){return R(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return R(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ze(this,"includes",e)},indexOf(...e){return Ze(this,"indexOf",e)},join(e){return X(this).join(e)},lastIndexOf(...e){return Ze(this,"lastIndexOf",e)},map(e,t){return R(this,"map",e,t,void 0,arguments)},pop(){return ue(this,"pop")},push(...e){return ue(this,"push",e)},reduce(e,...t){return Ut(this,"reduce",e,t)},reduceRight(e,...t){return Ut(this,"reduceRight",e,t)},shift(){return ue(this,"shift")},some(e,t){return R(this,"some",e,t,void 0,arguments)},splice(...e){return ue(this,"splice",e)},toReversed(){return X(this).toReversed()},toSorted(e){return X(this).toSorted(e)},toSpliced(...e){return X(this).toSpliced(...e)},unshift(...e){return ue(this,"unshift",e)},values(){return Ye(this,"values",e=>O(this,e))}};function Ye(e,t,r){let n=kt(e),i=n[t]();return n!==e&&!U(e)&&(i._next=i.next,i.next=()=>{let s=i._next();return s.done||(s.value=r(s.value)),s}),i}var as=Array.prototype;function R(e,t,r,n,i,s){let o=kt(e),a=o!==e&&!U(e),u=o[t];if(u!==as[t]){let f=u.apply(e,s);return a?J(f):f}let c=r;o!==e&&(a?c=function(f,_){return r.call(this,O(e,f),_,e)}:r.length>2&&(c=function(f,_){return r.call(this,f,_,e)}));let l=u.call(o,c,n);return a&&i?i(l):l}function Ut(e,t,r,n){let i=kt(e),s=i!==e&&!U(e),o=r,a=!1;i!==e&&(s?(a=n.length===0,o=function(c,l,f){return a&&(a=!1,c=O(e,c)),r.call(this,c,O(e,l),f,e)}):r.length>3&&(o=function(c,l,f){return r.call(this,c,l,f,e)}));let u=i[t](o,...n);return a?O(e,u):u}function Ze(e,t,r){let n=h(e);w(n,"iterate",xe);let i=n[t](...r);return(i===-1||i===!1)&&ms(r[0])?(r[0]=h(r[0]),n[t](...r)):i}function ue(e,t,r=[]){rs(),Lt();let n=h(e)[t].apply(e,r);return jt(),ns(),n}var us=Wr("__proto__,__v_isRef,__isVue"),en=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ee));function cs(e){Ee(e)||(e=String(e));let t=h(this);return w(t,"has",e),t.hasOwnProperty(e)}var tn=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,r){if(t==="__v_skip")return e.__v_skip;let n=this._isReadonly,i=this._isShallow;if(t==="__v_isReactive")return!n;if(t==="__v_isReadonly")return n;if(t==="__v_isShallow")return i;if(t==="__v_raw")return r===(n?i?bs:sn:i?ys:nn).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(r)?e:void 0;let s=ye(e);if(!n){let a;if(s&&(a=os[t]))return a;if(t==="hasOwnProperty")return cs}let o=Reflect.get(e,t,he(e)?e:r);if((Ee(t)?en.has(t):us(t))||(n||w(e,"get",t),i))return o;if(he(o)){let a=s&&It(t)?o:o.value;return n&&be(a)?yt(a):a}return be(o)?n?yt(o):Ft(o):o}},ls=class extends tn{constructor(e=!1){super(!1,e)}set(e,t,r,n){let i=e[t],s=ye(e)&&It(t);if(!this._isShallow){let u=z(i);if(!U(r)&&!z(r)&&(i=h(i),r=h(r)),!s&&he(i)&&!he(r))return u?(W(`Set operation on key "${String(t)}" failed: target is readonly.`,e[t]),!0):(i.value=r,!0)}let o=s?Number(t)<e.length:pt(e,t),a=Reflect.set(e,t,r,he(e)?e:n);return e===h(n)&&a&&(o?k(r,i)&&I(e,"set",t,r,i):I(e,"add",t,r)),a}deleteProperty(e,t){let r=pt(e,t),n=e[t],i=Reflect.deleteProperty(e,t);return i&&r&&I(e,"delete",t,void 0,n),i}has(e,t){let r=Reflect.has(e,t);return(!Ee(t)||!en.has(t))&&w(e,"has",t),r}ownKeys(e){return w(e,"iterate",ye(e)?"length":H),Reflect.ownKeys(e)}},fs=class extends tn{constructor(e=!1){super(!0,e)}set(e,t){return W(`Set operation on key "${String(t)}" failed: target is readonly.`,e),!0}deleteProperty(e,t){return W(`Delete operation on key "${String(t)}" failed: target is readonly.`,e),!0}},ds=new ls,ps=new fs,vt=e=>e,Oe=e=>Reflect.getPrototypeOf(e);function hs(e,t,r){return function(...n){let i=this.__v_raw,s=h(i),o=fe(s),a=e==="entries"||e===Symbol.iterator&&o,u=e==="keys"&&o,c=i[e](...n),l=r?vt:t?me:J;return!t&&w(s,"iterate",u?gt:H),ve(Object.create(c),{next(){let{value:f,done:_}=c.next();return _?{value:f,done:_}:{value:a?[l(f[0]),l(f[1])]:l(f),done:_}}})}}function Te(e){return function(...t){{let r=t[0]?`on key "${t[0]}" `:"";W(`${Jr(e)} operation ${r}failed: target is readonly.`,h(this))}return e==="delete"?!1:e==="clear"?void 0:this}}function _s(e,t){let r={get(i){let s=this.__v_raw,o=h(s),a=h(i);e||(k(i,a)&&w(o,"get",i),w(o,"get",a));let{has:u}=Oe(o),c=t?vt:e?me:J;if(u.call(o,i))return c(s.get(i));if(u.call(o,a))return c(s.get(a));s!==o&&s.get(i)},get size(){let i=this.__v_raw;return!e&&w(h(i),"iterate",H),i.size},has(i){let s=this.__v_raw,o=h(s),a=h(i);return e||(k(i,a)&&w(o,"has",i),w(o,"has",a)),i===a?s.has(i):s.has(i)||s.has(a)},forEach(i,s){let o=this,a=o.__v_raw,u=h(a),c=t?vt:e?me:J;return!e&&w(u,"iterate",H),a.forEach((l,f)=>i.call(s,c(l),c(f),o))}};return ve(r,e?{add:Te("add"),set:Te("set"),delete:Te("delete"),clear:Te("clear")}:{add(i){let s=h(this),o=Oe(s),a=h(i),u=!t&&!U(i)&&!z(i)?a:i;return o.has.call(s,u)||k(i,u)&&o.has.call(s,i)||k(a,u)&&o.has.call(s,a)||(s.add(u),I(s,"add",u,u)),this},set(i,s){!t&&!U(s)&&!z(s)&&(s=h(s));let o=h(this),{has:a,get:u}=Oe(o),c=a.call(o,i);c?Jt(o,a,i):(i=h(i),c=a.call(o,i));let l=u.call(o,i);return o.set(i,s),c?k(s,l)&&I(o,"set",i,s,l):I(o,"add",i,s),this},delete(i){let s=h(this),{has:o,get:a}=Oe(s),u=o.call(s,i);u?Jt(s,o,i):(i=h(i),u=o.call(s,i));let c=a?a.call(s,i):void 0,l=s.delete(i);return u&&I(s,"delete",i,void 0,c),l},clear(){let i=h(this),s=i.size!==0,o=fe(i)?new Map(i):new Set(i),a=i.clear();return s&&I(i,"clear",void 0,void 0,o),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{r[i]=hs(i,e,t)}),r}function rn(e,t){let r=_s(e,t);return(n,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(pt(r,i)&&i in n?r:n,i,s)}var gs={get:rn(!1,!1)},vs={get:rn(!0,!1)};function Jt(e,t,r){let n=h(r);if(n!==r&&t.call(e,n)){let i=Ur(e);W(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}var nn=new WeakMap,ys=new WeakMap,sn=new WeakMap,bs=new WeakMap;function xs(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ft(e){return z(e)?e:on(e,!1,ds,gs,nn)}function yt(e){return on(e,!0,ps,vs,sn)}function on(e,t,r,n,i){if(!be(e))return W(`value cannot be made ${t?"readonly":"reactive"}: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let s=i.get(e);if(s)return s;let o=xs(Ur(e));if(o===0)return e;let a=new Proxy(e,o===2?n:r);return i.set(e,a),a}function an(e){return z(e)?an(e.__v_raw):!!(e&&e.__v_isReactive)}function z(e){return!!(e&&e.__v_isReadonly)}function U(e){return!!(e&&e.__v_isShallow)}function ms(e){return e?!!e.__v_raw:!1}function h(e){let t=e&&e.__v_raw;return t?h(t):e}var J=e=>be(e)?Ft(e):e,me=e=>be(e)?yt(e):e;function he(e){return e?e.__v_isRef===!0:!1}A("nextTick",()=>Rt);A("dispatch",e=>le.bind(le,e));A("watch",(e,{evaluateLater:t,cleanup:r})=>(n,i)=>{let s=t(n),a=er(()=>{let u;return s(c=>u=c),u},i);r(a)});A("store",Fi);A("data",e=>ur(e));A("root",e=>Be(e));A("refs",e=>(e._x_refs_proxy||(e._x_refs_proxy=K(ws(e))),e._x_refs_proxy));function ws(e){let t=[];return S(e,r=>{r._x_refs&&t.push(r._x_refs)}),t}var Xe={};function un(e){return Xe[e]||(Xe[e]=0),++Xe[e]}function Ss(e,t){return S(e,r=>{if(r._x_ids&&r._x_ids[t])return!0})}function Es(e,t){e._x_ids||(e._x_ids={}),e._x_ids[t]||(e._x_ids[t]=un(t))}A("id",(e,{cleanup:t})=>(r,n=null)=>{let i=`${r}${n?`-${n}`:""}`;return As(e,i,t,()=>{let s=Ss(e,r),o=s?s._x_ids[r]:un(r);return n?`${r}-${o}-${n}`:`${r}-${o}`})});Se((e,t)=>{e._x_id&&(t._x_id=e._x_id)});function As(e,t,r,n){if(e._x_id||(e._x_id={}),e._x_id[t])return e._x_id[t];let i=n();return e._x_id[t]=i,r(()=>{delete e._x_id[t]}),i}A("el",e=>e);cn("Focus","focus","focus");cn("Persist","persist","persist");function cn(e,t,r){A(t,n=>T(`You can't use [$${t}] without first installing the "${e}" plugin here: https://alpinejs.dev/plugins/${r}`,n))}y("modelable",(e,{expression:t},{effect:r,evaluateLater:n,cleanup:i})=>{let s=n(t),o=()=>{let l;return s(f=>l=f),l},a=n(`${t} = __placeholder`),u=l=>a(()=>{},{scope:{__placeholder:l}}),c=o();u(c),queueMicrotask(()=>{if(!e._x_model)return;e._x_removeModelListeners.default();let l=e._x_model.get,f=e._x_model.setWithModifiers,_=Hr({get(){return l()},set(g){f(g)}},{get(){return o()},set(g){u(g)}});i(_)})});y("teleport",(e,{modifiers:t,expression:r},{cleanup:n})=>{e.tagName.toLowerCase()!=="template"&&T("x-teleport can only be used on a <template> tag",e);let i=Gt(r),s=e.content.cloneNode(!0).firstElementChild;e._x_teleport=s,s._x_teleportBack=e,e.setAttribute("data-teleport-template",!0),s.setAttribute("data-teleport-target",!0),e._x_forwardEvents&&e._x_forwardEvents.forEach(a=>{s.addEventListener(a,u=>{u.stopPropagation(),e.dispatchEvent(new u.constructor(u.type,u))})}),we(s,{},e);let o=(a,u,c)=>{c.includes("prepend")?u.parentNode.insertBefore(a,u):c.includes("append")?u.parentNode.insertBefore(a,u.nextSibling):u.appendChild(a)};v(()=>{$(()=>{o(s,i,t),M(s)})()}),e._x_teleportPutBack=()=>{let a=Gt(r);v(()=>{o(e._x_teleport,a,t)})},n(()=>v(()=>{s.remove(),Y(s)}))});var Os=document.createElement("div");function Gt(e){let t=$(()=>document.querySelector(e),()=>Os)();return t||T(`Cannot find x-teleport element for selector: "${e}"`),t}var ln=()=>{};ln.inline=(e,{modifiers:t},{cleanup:r})=>{t.includes("self")?e._x_ignoreSelf=!0:e._x_ignore=!0,r(()=>{t.includes("self")?delete e._x_ignoreSelf:delete e._x_ignore})};y("ignore",ln);y("effect",$((e,{expression:t},{effect:r})=>{r(m(e,t))}));function Q(e,t,r,n){let i=e,s=u=>n(u),o={},a=(u,c)=>l=>c(u,l);return r.includes("dot")&&(t=Ts(t)),r.includes("camel")&&(t=Ms(t)),r.includes("capture")&&(o.capture=!0),r.includes("window")&&(i=window),r.includes("document")&&(i=document),r.includes("passive")&&(o.passive=r[r.indexOf("passive")+1]!=="false"),s=fn(r,s),r.includes("prevent")&&(s=a(s,(u,c)=>{c.preventDefault(),u(c)})),r.includes("stop")&&(s=a(s,(u,c)=>{c.stopPropagation(),u(c)})),r.includes("once")&&(s=a(s,(u,c)=>{u(c),i.removeEventListener(t,s,o)})),(r.includes("away")||r.includes("outside"))&&(i=document,s=a(s,(u,c)=>{e.contains(c.target)||c.target.isConnected!==!1&&(e.offsetWidth<1&&e.offsetHeight<1||e._x_isShown!==!1&&u(c))})),r.includes("self")&&(s=a(s,(u,c)=>{c.target===e&&u(c)})),t==="submit"&&(s=a(s,(u,c)=>{c.target._x_pendingModelUpdates&&c.target._x_pendingModelUpdates.forEach(l=>l()),u(c)})),(Rs(t)||dn(t))&&(s=a(s,(u,c)=>{Ds(c,r)||u(c)})),i.addEventListener(t,s,o),()=>{i.removeEventListener(t,s,o)}}function fn(e,t){if(e.includes("debounce")){let r=e[e.indexOf("debounce")+1]||"invalid-wait",n=Le(r.split("ms")[0])?Number(r.split("ms")[0]):250;t=Fr(t,n)}if(e.includes("throttle")){let r=e[e.indexOf("throttle")+1]||"invalid-wait",n=Le(r.split("ms")[0])?Number(r.split("ms")[0]):250;t=Br(t,n)}return t}function Ts(e){return e.replace(/-/g,".")}function Ms(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function Le(e){return!Array.isArray(e)&&!isNaN(e)}function Cs(e){return[" ","_"].includes(e)?e:e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()}function Rs(e){return["keydown","keyup"].includes(e)}function dn(e){return["contextmenu","click","mouse"].some(t=>e.includes(t))}var Ps=["window","document","prevent","stop","once","capture","self","away","outside","passive","dot","camel","preserve-scroll","blur","change","lazy","number","boolean","trim","fill","unintrusive","parent"];function Ds(e,t){let r=t.filter((s,o)=>s==="false"&&t[o-1]==="passive"?!1:!Ps.includes(s));if(r.includes("debounce")){let s=r.indexOf("debounce");r.splice(s,Le((r[s+1]||"invalid-wait").split("ms")[0])?2:1)}if(r.includes("throttle")){let s=r.indexOf("throttle");r.splice(s,Le((r[s+1]||"invalid-wait").split("ms")[0])?2:1)}if(r.length===0||r.length===1&&Yt(e.key).includes(r[0]))return!1;let i=["ctrl","shift","alt","meta","cmd","super"].filter(s=>r.includes(s));return r=r.filter(s=>!i.includes(s)),!(i.length>0&&i.filter(o=>((o==="cmd"||o==="super")&&(o="meta"),e[`${o}Key`])).length===i.length&&(dn(e.type)||Yt(e.key).includes(r[0])))}function Yt(e){if(!e)return[];e=Cs(e);let t={ctrl:"control",slash:"/",space:" ",spacebar:" ",cmd:"meta",esc:"escape",up:"arrow-up",down:"arrow-down",left:"arrow-left",right:"arrow-right",period:".",comma:",",equal:"=",minus:"-",underscore:"_"};return t[e]=e,Object.keys(t).map(r=>{if(t[r]===e)return r}).filter(r=>r)}y("model",(e,{modifiers:t,expression:r},{effect:n,cleanup:i})=>{let s=e;t.includes("parent")&&(s=S(e,d=>d!==e));let o=m(s,r),a;typeof r=="string"?a=m(s,`${r} = __placeholder`):typeof r=="function"&&typeof r()=="string"?a=m(s,`${r()} = __placeholder`):a=()=>{};let u=()=>{let d;return o(b=>d=b),Zt(d)?d.get():d},c=d=>{let b;o(x=>b=x),Zt(b)?b.set(d):a(()=>{},{scope:{__placeholder:d}})};typeof r=="string"&&e.type==="radio"&&v(()=>{e.hasAttribute("name")||e.setAttribute("name",r)});let l=t.includes("change")||t.includes("lazy"),f=t.includes("blur"),_=t.includes("enter"),g=l||f||_,C;if(L)C=()=>{};else if(g){let d=[],b=x=>c(Me(e,t,x,u()));if(l&&d.push(Q(e,"change",t,b)),f&&(d.push(Q(e,"blur",t,b)),e.form)){let x=e.form,Z=()=>b({target:e});x._x_pendingModelUpdates||(x._x_pendingModelUpdates=[]),x._x_pendingModelUpdates.push(Z),i(()=>{x._x_pendingModelUpdates&&x._x_pendingModelUpdates.splice(x._x_pendingModelUpdates.indexOf(Z),1)})}_&&d.push(Q(e,"keydown",t,x=>{x.key==="Enter"&&b(x)})),C=()=>d.forEach(x=>x())}else{let d=e.tagName.toLowerCase()==="select"||["checkbox","radio"].includes(e.type)?"change":"input";C=Q(e,d,t,b=>{c(Me(e,t,b,u()))})}if(t.includes("fill")&&([void 0,null,""].includes(u())||$e(e)&&Array.isArray(u())||e.tagName.toLowerCase()==="select"&&e.multiple)&&c(Me(e,t,{target:e},u())),e._x_removeModelListeners||(e._x_removeModelListeners={}),e._x_removeModelListeners.default=C,i(()=>e._x_removeModelListeners.default()),e.form){let d=Q(e.form,"reset",[],b=>{Rt(()=>e._x_model&&e._x_model.set(Me(e,t,{target:e},u())))});i(()=>d())}if(e._x_model={get(){return u()},set(d){c(d)},setWithModifiers:fn(t,c)},e._x_forceModelUpdate=d=>{d===void 0&&typeof r=="string"&&r.match(/\./)&&(d=""),v(()=>{$e(e)?Array.isArray(d)?e.checked=d.some(b=>b==e.value):e.checked=!!d:$t(e)?typeof d=="boolean"?e.checked=Ce(e.value)===d:e.checked=e.value==d:jr(e,"value",d)})},e.tagName==="SELECT"){let d=new MutationObserver(()=>{e._x_forceModelUpdate(u())});d.observe(e,{childList:!0}),i(()=>d.disconnect())}n(()=>{let d=u();t.includes("unintrusive")&&document.activeElement.isSameNode(e)||e._x_forceModelUpdate(d)})});function Me(e,t,r,n){return v(()=>{if(r instanceof CustomEvent&&r.detail!==void 0)return r.detail!==null&&r.detail!==void 0?r.detail:r.target.value;if($e(e))if(Array.isArray(n)){let i=null;return t.includes("number")?i=Qe(r.target.value):t.includes("boolean")?i=Ce(r.target.value):i=r.target.value,r.target.checked?n.includes(i)?n:n.concat([i]):n.filter(s=>!$s(s,i))}else return r.target.checked;else{if(e.tagName.toLowerCase()==="select"&&e.multiple)return t.includes("number")?Array.from(r.target.selectedOptions).map(i=>{let s=i.value||i.text;return Qe(s)}):t.includes("boolean")?Array.from(r.target.selectedOptions).map(i=>{let s=i.value||i.text;return Ce(s)}):Array.from(r.target.selectedOptions).map(i=>i.value||i.text);{let i;return $t(e)?r.target.checked?i=r.target.value:i=n:i=r.target.value,t.includes("number")?Qe(i):t.includes("boolean")?Ce(i):t.includes("trim")?i.trim():i}}})}function Qe(e){let t=e?parseFloat(e):null;return Is(t)?t:e}function $s(e,t){return e==t}function Is(e){return!Array.isArray(e)&&!isNaN(e)}function Zt(e){return e!==null&&typeof e=="object"&&typeof e.get=="function"&&typeof e.set=="function"}y("cloak",e=>queueMicrotask(()=>v(()=>e.removeAttribute(ie("cloak")))));Dr(()=>`[${ie("init")}]`);y("init",$((e,{expression:t},{evaluate:r})=>typeof t=="string"?!!t.trim()&&r(t,{},!1):r(t,{},!1)));y("text",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(s=>{v(()=>{e.textContent=s})})})});y("html",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(s=>{v(()=>{Array.from(e.children).forEach(o=>Y(o)),e.innerHTML=s??"",e._x_ignoreSelf=!0,M(e),delete e._x_ignoreSelf})})},{priority:"structural"})});Tt(br(":",xr(ie("bind:"))));var pn=(e,{value:t,modifiers:r,expression:n,original:i},{effect:s,cleanup:o})=>{if(!t){let u={};Hi(u),m(e,n)(l=>{Kr(e,l,i)},{scope:u});return}if(t==="key")return Ls(e,n);if(e._x_inlineBindings&&e._x_inlineBindings[t]&&e._x_inlineBindings[t].extract)return;let a=m(e,n);s(()=>a(u=>{u===void 0&&typeof n=="string"&&n.match(/\./)&&(u=""),v(()=>jr(e,t,u,r))})),o(()=>{e._x_undoAddedClasses&&e._x_undoAddedClasses(),e._x_undoAddedStyles&&e._x_undoAddedStyles()})};pn.inline=(e,{value:t,modifiers:r,expression:n})=>{t&&(e._x_inlineBindings||(e._x_inlineBindings={}),e._x_inlineBindings[t]={expression:n,extract:!1})};y("bind",pn);function Ls(e,t){e._x_keyExpression=t}Pr(()=>`[${ie("data")}]`);var j=Symbol();y("data",(e,{expression:t},{cleanup:r})=>{if(Ns(e))return;let n=e[j];if(n?.expression===t)return;t=t===""?"{}":t;let i={};_e(i,e);let s={};Ki(s,i);let o=B(e,t,{scope:s});(o===void 0||o===!0)&&(o={}),_e(o,e);let a;if(n?.reactiveData){a=n.reactiveData,js(a,o);let c={expression:t};e[j]=c,queueMicrotask(()=>{e[j]===c&&delete e[j]})}else a=re(o);At(a,r);let u=we(e,a);$(()=>{a.init&&B(e,a.init)})(),r(()=>{a.destroy&&B(e,a.destroy),u();let c={reactiveData:a};e[j]=c,queueMicrotask(()=>{e[j]===c&&delete e[j]})})});function js(e,t){Object.keys(t).forEach(r=>{let n=Object.getOwnPropertyDescriptor(t,r),i=Object.getOwnPropertyDescriptor(e,r);n.get||n.set||i?.get||i?.set?(i&&delete e[r],i||(e[r]=void 0),n.get||n.set?Object.defineProperty(e,r,n):e[r]=t[r]):e[r]=t[r]}),Object.keys(e).filter(r=>!Object.prototype.hasOwnProperty.call(t,r)).forEach(r=>delete e[r])}Se((e,t)=>{e._x_dataStack&&(t._x_dataStack=e._x_dataStack,t.setAttribute("data-has-alpine-state",!0))});function Ns(e){return L?at?!0:e.hasAttribute("data-has-alpine-state"):!1}y("show",(e,{modifiers:t,expression:r},{effect:n})=>{let i=m(e,r);e._x_doHide||(e._x_doHide=()=>{v(()=>{e.style.setProperty("display","none",t.includes("important")?"important":void 0)})}),e._x_doShow||(e._x_doShow=()=>{v(()=>{e.style.length===1&&e.style.display==="none"?e.removeAttribute("style"):e.style.removeProperty("display")})});let s=()=>{e._x_doHide(),e._x_isShown=!1},o=()=>{e._x_doShow(),e._x_isShown=!0},a=()=>setTimeout(o),u=ft(f=>f?o():s(),f=>{typeof e._x_toggleAndCascadeWithTransitions=="function"?e._x_toggleAndCascadeWithTransitions(e,f,o,s):f?a():s()}),c,l=!0;n(()=>i(f=>{!l&&f===c||(t.includes("immediate")&&(f?a():s()),u(f),c=f,l=!1)}))});y("for",$((e,{expression:t},{effect:r,cleanup:n})=>{let i=Bs(t),s=m(e,i.items),o=m(e,e._x_keyExpression||"index");e._x_lookup=new Map,r(()=>Fs(e,i,s,o),{priority:"structural"}),n(()=>{e._x_lookup.forEach(a=>v(()=>{Y(a),a.remove()})),delete e._x_lookup,delete e._x_lastRenderedEl})}));function ks(e){return t=>{Object.entries(t).forEach(([r,n])=>{e[r]=n})}}function Fs(e,t,r,n){r(i=>{qs(i)&&(i=Array.from({length:i},(c,l)=>l+1)),i==null&&(i=[]),i instanceof Set&&(i=Array.from(i)),i instanceof Map&&(i=Array.from(i));let s=e._x_lookup,o=new Map;e._x_lookup=o;let a=Ks(i),u=Object.entries(i).map(([c,l])=>{a||(c=parseInt(c));let f=Hs(t,l,c,i),_;return n(g=>{typeof g=="object"&&T("x-for key cannot be an object, it must be a string or an integer",e),s.has(g)&&(o.set(g,s.get(g)),s.delete(g)),_=g},{scope:{index:c,...f}}),[_,f]});v(()=>{s.forEach(f=>{Y(f),f.remove()});let c=new Set,l=e;u.forEach(([f,_])=>{if(o.has(f)){let d=o.get(f);d._x_refreshXForScope(_),l.nextElementSibling!==d&&(l.nextElementSibling&&d.replaceWith(l.nextElementSibling),l.after(d)),l=d,d._x_currentIfEl&&(d.nextElementSibling!==d._x_currentIfEl&&l.after(d._x_currentIfEl),l=d._x_currentIfEl);return}e.content.children.length>1&&T("x-for templates require a single root element, additional elements will be ignored.",e);let g=document.importNode(e.content,!0).firstElementChild,C=re(_);we(g,C,e),g._x_refreshXForScope=ks(C),o.set(f,g),c.add(g),l.after(g),l=g}),c.forEach(f=>M(f)),l!==e?e._x_lastRenderedEl=l:delete e._x_lastRenderedEl})})}function Bs(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,r=/^\s*\(|\)\s*$/g,n=/([\s\S]*?)\b(?:in|of)\b([\s\S]*)/,i=e.match(n);if(!i)return;let s={};s.items=i[2].trim();let o=i[1].replace(r,"").trim(),a=o.match(t);return a?(s.item=o.replace(t,"").trim(),s.index=a[1].trim(),a[2]&&(s.collection=a[2].trim())):s.item=o,s}function Hs(e,t,r,n){let i={};return/^\[.*\]$/.test(e.item)&&Array.isArray(t)?e.item.replace("[","").replace("]","").split(",").map(o=>o.trim()).forEach((o,a)=>{i[o]=t[a]}):/^\{.*\}$/.test(e.item)&&!Array.isArray(t)&&typeof t=="object"?e.item.replace("{","").replace("}","").split(",").map(o=>o.trim()).forEach(o=>{i[o]=t[o]}):i[e.item]=t,e.index&&(i[e.index]=r),e.collection&&(i[e.collection]=n),i}function qs(e){return typeof e!="object"&&!isNaN(e)}function Ks(e){return typeof e=="object"&&!Array.isArray(e)}function hn(){}hn.inline=(e,{expression:t},{cleanup:r})=>{let n=Be(e);n&&(n._x_refs||(n._x_refs={}),n._x_refs[t]=e,r(()=>delete n._x_refs[t]))};y("ref",hn);y("if",$((e,{expression:t},{effect:r,cleanup:n})=>{e.tagName.toLowerCase()!=="template"&&T("x-if can only be used on a <template> tag",e);let i=m(e,t),s=()=>{if(e._x_currentIfEl)return e._x_currentIfEl;let a=e.content.cloneNode(!0).firstElementChild;return we(a,{},e),v(()=>{e.after(a),M(a)}),e._x_currentIfEl=a,e._x_lastRenderedEl=a,e._x_undoIf=()=>{v(()=>{Y(a),a.remove()}),delete e._x_currentIfEl,delete e._x_lastRenderedEl},a},o=()=>{e._x_undoIf&&(e._x_undoIf(),delete e._x_undoIf)};r(()=>i(a=>{a?s():o()}),{priority:"structural"}),n(()=>e._x_undoIf&&e._x_undoIf())}));y("id",(e,{expression:t},{evaluate:r})=>{r(t).forEach(i=>Es(e,i))});Se((e,t)=>{e._x_ids&&(t._x_ids=e._x_ids)});Tt(br("@",xr(ie("on:"))));y("on",$((e,{value:t,modifiers:r,expression:n},{cleanup:i})=>{let s=n?m(e,n):()=>{};e.tagName.toLowerCase()==="template"&&(e._x_forwardEvents||(e._x_forwardEvents=[]),e._x_forwardEvents.includes(t)||e._x_forwardEvents.push(t));let o=Q(e,t,r,a=>{s(()=>{},{scope:{$event:a},params:[a]})});i(()=>o())}));Ke("Collapse","collapse","collapse");Ke("Intersect","intersect","intersect");Ke("Focus","trap","focus");Ke("Mask","mask","mask");function Ke(e,t,r){y(t,n=>T(`You can't use [x-${t}] without first installing the "${e}" plugin here: https://alpinejs.dev/plugins/${r}`,n))}se.setEvaluator(Vn);se.setRawEvaluator(Gn);se.setReactivityEngine({reactive:Ft,effect:(e,t={})=>{let r;return r=es(e,{scheduler:()=>{r&&(t.scheduler?t.scheduler(r):r())}}),r},release:ts,raw:h});var Vs=se,Ve=Vs;var Ws={200:{name:"info",badge:"bg-sky-100 text-sky-800 ring-sky-200"},400:{name:"error",badge:"bg-rose-100 text-rose-800 ring-rose-200"}},zs="bg-slate-100 text-slate-700 ring-slate-200",Us=50;function _n(e){return Ws[e]??{name:String(e),badge:zs}}function oe(e,t=2){return String(e).padStart(t,"0")}async function gn(e){try{let t=await e.json();if(typeof t=="object"&&t!==null&&"error"in t&&typeof t.error=="string")return t.error}catch{}return`Request failed: ${e.status} ${e.statusText}`}var Ae=0;Ve.data("logsViewer",()=>({api_url:"api/logs",logout_url:"api/logout",login_url:"login",trace_id:"",message:"",tags:[],tag_modal_open:!1,tag_draft:[],groups:[],total:0,limit:Us,offset:0,loading:!1,error_message:"",expanded:{},init(){this.api_url=this.$root.dataset.api??this.api_url,this.logout_url=this.$root.dataset.logout??this.logout_url,this.login_url=this.$root.dataset.login??this.login_url,this.load()},async load(){let e=++Ae;this.loading=!0,this.error_message="";let t=this.trace_id.trim(),r=this.message.trim();try{let n=await fetch(this.api_url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({trace_id:t===""?void 0:t,message:r===""?void 0:r,tags:this.tags,limit:this.limit,offset:this.offset})});if(e!==Ae)return;if(n.status===401){window.location.href=this.login_url;return}if(!n.ok){this.error_message=await gn(n);return}let i=await n.json();if(e!==Ae)return;this.groups=i.groups,this.total=i.total,this.expanded={},(t!==""||i.groups.length===1)&&i.groups.forEach(s=>this.expanded[this.groupKey(s)]=!0)}catch(n){e===Ae&&(this.error_message=n instanceof Error?n.message:String(n))}finally{e===Ae&&(this.loading=!1)}},async logout(){try{await fetch(this.logout_url,{method:"POST"})}finally{window.location.href=this.login_url}},search(){this.offset=0,this.load()},hasTag(e,t){return this.tags.some(r=>r.key===e&&r.value===t)},openTagModal(){this.tag_draft=this.tags.length>0?this.tags.map(e=>({...e})):[{key:"",value:""}],this.tag_modal_open=!0},closeTagModal(){this.tag_modal_open=!1},addDraftTag(){this.tag_draft.push({key:"",value:""})},removeDraftTag(e){this.tag_draft.splice(e,1)},applyTagModal(){this.tags=this.tag_draft.map(e=>({key:e.key.trim(),value:e.value.trim()})).filter(e=>e.key!==""),this.tag_modal_open=!1,this.search()},removeTag(e){this.tags.splice(e,1),this.search()},filterByTag(e,t){let r=String(t);this.hasTag(e,r)||(this.tags.push({key:e,value:r}),this.search())},filterByTrace(e){e!==null&&(this.trace_id=e,this.search())},clearFilters(){this.trace_id="",this.message="",this.tags=[],this.search()},hasFilters(){return this.trace_id.trim()!==""||this.message.trim()!==""||this.tags.length>0},hasPrevPage(){return this.offset>0},hasNextPage(){return this.offset+this.groups.length<this.total},prevPage(){this.offset=Math.max(0,this.offset-this.limit),this.load()},nextPage(){this.offset+=this.limit,this.load()},pageRange(){return this.groups.length===0?"0":`${this.offset+1}\u2013${this.offset+this.groups.length}`},groupKey(e){return e.trace_id!==null?"trace:"+e.trace_id:"log:"+(e.logs[0]?.id??"")},isExpanded(e){return this.expanded[this.groupKey(e)]===!0},toggle(e){let t=this.groupKey(e);this.expanded[t]=!this.expanded[t]},summary(e){return e.logs[0]?.message??""},levelName(e){return _n(e).name},levelBadge(e){return _n(e).badge},tagEntries(e){return Object.entries(e).map(([t,r])=>({key:t,value:r}))},formatTime(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${oe(t.getHours())}:${oe(t.getMinutes())}:${oe(t.getSeconds())}.${oe(t.getMilliseconds(),3)}`},formatDate(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${t.getFullYear()}-${oe(t.getMonth()+1)}-${oe(t.getDate())} ${this.formatTime(e)}`},formatDuration(e){let t=new Date(e.finished_at).getTime()-new Date(e.started_at).getTime();return!Number.isFinite(t)||t<=0?"":t<1e3?`${t} ms`:`${(t/1e3).toFixed(2)} s`},formatMessage(e){let t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.stringify(JSON.parse(t),null,2)}catch{return e}}}));Ve.data("loginForm",()=>({api_url:"api/login",home_url:"./",email:"",password:"",loading:!1,error_message:"",init(){this.api_url=this.$root.dataset.api??this.api_url,this.home_url=this.$root.dataset.home??this.home_url},async submit(){this.loading=!0,this.error_message="";try{let e=await fetch(this.api_url,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({email:this.email,password:this.password})});if(!e.ok){this.error_message=await gn(e);return}window.location.href=this.home_url}catch(e){this.error_message=e instanceof Error?e.message:String(e)}finally{this.loading=!1}}}));Ve.start();})();
|
|
6
6
|
/*! Bundled license information:
|
|
7
7
|
|
|
8
8
|
alpinejs/dist/module.esm.js:
|
package/build/ui/index.html
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<script defer src="{{base}}/assets/app.js"></script>
|
|
9
9
|
</head>
|
|
10
10
|
<body class="min-h-screen bg-slate-50 text-slate-800 antialiased">
|
|
11
|
-
<div x-data="logsViewer" data-api="{{base}}/api/logs" class="mx-auto max-w-6xl space-y-4 p-4">
|
|
11
|
+
<div x-data="logsViewer" data-api="{{base}}/api/logs" data-logout="{{base}}/api/logout" data-login="{{base}}/login" class="mx-auto max-w-6xl space-y-4 p-4">
|
|
12
12
|
|
|
13
13
|
<header class="flex items-center gap-3">
|
|
14
14
|
<h1 class="text-xl font-semibold">Logs</h1>
|
|
@@ -20,28 +20,42 @@
|
|
|
20
20
|
class="ml-auto rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm hover:bg-slate-100">
|
|
21
21
|
Refresh
|
|
22
22
|
</button>
|
|
23
|
+
<button type="button" @click="logout()"
|
|
24
|
+
class="rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm hover:bg-slate-100">
|
|
25
|
+
Log out
|
|
26
|
+
</button>
|
|
23
27
|
</header>
|
|
24
28
|
|
|
25
29
|
<section class="flex flex-col gap-3 rounded-lg border border-slate-200 bg-white p-4 shadow-sm">
|
|
26
|
-
<form @submit.prevent="search()" class="flex gap-
|
|
27
|
-
<
|
|
28
|
-
|
|
30
|
+
<form @submit.prevent="search()" class="flex flex-wrap items-end gap-3">
|
|
31
|
+
<label class="flex min-w-[12rem] flex-1 flex-col gap-1">
|
|
32
|
+
<span class="text-xs font-medium text-slate-600">Trace ID</span>
|
|
33
|
+
<input x-model="trace_id" type="search" placeholder="exact match"
|
|
34
|
+
class="rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
35
|
+
</label>
|
|
36
|
+
|
|
37
|
+
<label class="flex min-w-[12rem] flex-1 flex-col gap-1">
|
|
38
|
+
<span class="text-xs font-medium text-slate-600">Message</span>
|
|
39
|
+
<input x-model="message" type="search" placeholder="contains…"
|
|
40
|
+
class="rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
41
|
+
</label>
|
|
42
|
+
|
|
29
43
|
<button type="submit"
|
|
30
44
|
class="rounded-md bg-sky-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-sky-700">
|
|
31
45
|
Search
|
|
32
46
|
</button>
|
|
33
47
|
</form>
|
|
34
48
|
|
|
35
|
-
<
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
<div class="flex flex-col gap-1">
|
|
50
|
+
<span class="text-xs font-medium text-slate-600">Tags</span>
|
|
51
|
+
<button type="button" @click="openTagModal()"
|
|
52
|
+
class="flex w-fit items-center gap-2 rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm hover:bg-slate-100">
|
|
53
|
+
Filter by tags
|
|
54
|
+
<span x-show="tags.length > 0" x-cloak
|
|
55
|
+
class="rounded-full bg-sky-100 px-1.5 py-0.5 text-xs font-medium text-sky-800"
|
|
56
|
+
x-text="tags.length"></span>
|
|
43
57
|
</button>
|
|
44
|
-
</
|
|
58
|
+
</div>
|
|
45
59
|
|
|
46
60
|
<div x-show="hasFilters()" x-cloak class="flex flex-wrap items-center gap-2">
|
|
47
61
|
<template x-if="trace_id.trim() !== ''">
|
|
@@ -51,6 +65,13 @@
|
|
|
51
65
|
class="h-5 w-5 rounded-full leading-none hover:bg-violet-200">−</button>
|
|
52
66
|
</span>
|
|
53
67
|
</template>
|
|
68
|
+
<template x-if="message.trim() !== ''">
|
|
69
|
+
<span class="inline-flex items-center gap-1 rounded-full bg-amber-100 py-0.5 pl-3 pr-1 font-mono text-xs text-amber-800">
|
|
70
|
+
message~<span x-text="message"></span>
|
|
71
|
+
<button type="button" title="Remove" @click="message = ''; search()"
|
|
72
|
+
class="h-5 w-5 rounded-full leading-none hover:bg-amber-200">−</button>
|
|
73
|
+
</span>
|
|
74
|
+
</template>
|
|
54
75
|
<template x-for="(tag, index) in tags" :key="tag.key + '=' + tag.value">
|
|
55
76
|
<span class="inline-flex items-center gap-1 rounded-full bg-sky-100 py-0.5 pl-3 pr-1 font-mono text-xs text-sky-800">
|
|
56
77
|
<span x-text="tag.key"></span>=<span x-text="tag.value === '' ? '*' : tag.value"></span>
|
|
@@ -64,6 +85,55 @@
|
|
|
64
85
|
</div>
|
|
65
86
|
</section>
|
|
66
87
|
|
|
88
|
+
<div x-show="tag_modal_open" x-cloak
|
|
89
|
+
class="fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4"
|
|
90
|
+
@keydown.escape.window="closeTagModal()">
|
|
91
|
+
<div @click.outside="closeTagModal()"
|
|
92
|
+
class="w-full max-w-lg space-y-4 rounded-lg bg-white p-5 shadow-lg">
|
|
93
|
+
<div class="flex items-center justify-between">
|
|
94
|
+
<h2 class="text-base font-semibold">Filter by tags</h2>
|
|
95
|
+
<button type="button" title="Close" @click="closeTagModal()"
|
|
96
|
+
class="text-slate-400 hover:text-slate-700">✕</button>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="space-y-2">
|
|
100
|
+
<div x-show="tag_draft.length > 0" x-cloak
|
|
101
|
+
class="flex gap-2 text-xs font-medium text-slate-500">
|
|
102
|
+
<span class="w-40">Tag name</span>
|
|
103
|
+
<span class="flex-1">Value contains</span>
|
|
104
|
+
<span class="w-10"></span>
|
|
105
|
+
</div>
|
|
106
|
+
<template x-for="(tag, index) in tag_draft" :key="index">
|
|
107
|
+
<div class="flex gap-2">
|
|
108
|
+
<input x-model="tag.key" aria-label="Tag name" placeholder="e.g. route"
|
|
109
|
+
class="w-40 rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
110
|
+
<input x-model="tag.value" aria-label="Value contains" placeholder="empty = field exists"
|
|
111
|
+
class="flex-1 rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
112
|
+
<button type="button" title="Remove tag" @click="removeDraftTag(index)"
|
|
113
|
+
class="w-10 rounded-md border border-slate-300 text-lg leading-none hover:bg-slate-100">
|
|
114
|
+
−
|
|
115
|
+
</button>
|
|
116
|
+
</div>
|
|
117
|
+
</template>
|
|
118
|
+
|
|
119
|
+
<button type="button" @click="addDraftTag()" class="text-sm text-sky-700 hover:underline">
|
|
120
|
+
+ Add tag
|
|
121
|
+
</button>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div class="flex justify-end gap-2 border-t border-slate-100 pt-3">
|
|
125
|
+
<button type="button" @click="closeTagModal()"
|
|
126
|
+
class="rounded-md border border-slate-300 bg-white px-4 py-1.5 text-sm hover:bg-slate-100">
|
|
127
|
+
Cancel
|
|
128
|
+
</button>
|
|
129
|
+
<button type="button" @click="applyTagModal()"
|
|
130
|
+
class="rounded-md bg-sky-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-sky-700">
|
|
131
|
+
Apply
|
|
132
|
+
</button>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
67
137
|
<div x-show="error_message !== ''" x-cloak
|
|
68
138
|
class="rounded-lg border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-800"
|
|
69
139
|
x-text="error_message"></div>
|
|
@@ -107,8 +177,6 @@
|
|
|
107
177
|
:class="levelBadge(log.level)" x-text="levelName(log.level)"></span>
|
|
108
178
|
</span>
|
|
109
179
|
<div class="min-w-0 space-y-1">
|
|
110
|
-
<pre class="whitespace-pre-wrap break-words font-mono text-xs text-slate-800"
|
|
111
|
-
x-text="formatMessage(log.message)"></pre>
|
|
112
180
|
<div class="flex flex-wrap gap-1">
|
|
113
181
|
<template x-for="tag in tagEntries(log.tags)" :key="tag.key">
|
|
114
182
|
<button type="button" title="Add to filter"
|
|
@@ -118,6 +186,8 @@
|
|
|
118
186
|
</button>
|
|
119
187
|
</template>
|
|
120
188
|
</div>
|
|
189
|
+
<pre class="whitespace-pre-wrap break-words font-mono text-xs text-slate-800"
|
|
190
|
+
x-text="formatMessage(log.message)"></pre>
|
|
121
191
|
</div>
|
|
122
192
|
</li>
|
|
123
193
|
</template>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Logs · Sign in</title>
|
|
7
|
+
<link rel="stylesheet" href="{{base}}/assets/app.css">
|
|
8
|
+
<script defer src="{{base}}/assets/app.js"></script>
|
|
9
|
+
</head>
|
|
10
|
+
<body class="flex min-h-screen items-center justify-center bg-slate-50 p-4 text-slate-800 antialiased">
|
|
11
|
+
<form x-data="loginForm" data-api="{{base}}/api/login" data-home="{{base}}/" @submit.prevent="submit()"
|
|
12
|
+
class="w-full max-w-sm space-y-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm">
|
|
13
|
+
<h1 class="text-xl font-semibold">Logs</h1>
|
|
14
|
+
|
|
15
|
+
<label class="block space-y-1">
|
|
16
|
+
<span class="text-sm text-slate-600">Email</span>
|
|
17
|
+
<input x-model="email" type="email" autocomplete="username" required autofocus
|
|
18
|
+
class="w-full rounded-md border border-slate-300 px-3 py-1.5 text-sm focus:border-sky-500 focus:outline-none">
|
|
19
|
+
</label>
|
|
20
|
+
|
|
21
|
+
<label class="block space-y-1">
|
|
22
|
+
<span class="text-sm text-slate-600">Password</span>
|
|
23
|
+
<input x-model="password" type="password" autocomplete="current-password" required
|
|
24
|
+
class="w-full rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<div x-show="error_message !== ''" x-cloak
|
|
28
|
+
class="rounded-md border border-rose-200 bg-rose-50 px-3 py-2 text-sm text-rose-800"
|
|
29
|
+
x-text="error_message"></div>
|
|
30
|
+
|
|
31
|
+
<button type="submit" :disabled="loading"
|
|
32
|
+
class="w-full rounded-md bg-sky-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-sky-700 disabled:opacity-60">
|
|
33
|
+
Sign in
|
|
34
|
+
</button>
|
|
35
|
+
</form>
|
|
36
|
+
</body>
|
|
37
|
+
</html>
|
package/build/users.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TDatabaseClient } from "@smuzi/database";
|
|
2
|
+
import { Option, Result, StdError } from "@smuzi/std";
|
|
3
|
+
export declare const LOGGER_UI_USERS_DEFAULT_TABLE = "logger_ui_users";
|
|
4
|
+
export type LoggerUiUser = {
|
|
5
|
+
id: number;
|
|
6
|
+
email: string;
|
|
7
|
+
password_hash: string;
|
|
8
|
+
created_at: Date;
|
|
9
|
+
};
|
|
10
|
+
export declare function normalizeEmail(email: string): string;
|
|
11
|
+
export declare const loggerUiMigrations: (users_table?: string) => import("@smuzi/database").TMigrations;
|
|
12
|
+
export declare class LoggerUiUsersRepository {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(table: string, db_client: TDatabaseClient);
|
|
15
|
+
findByEmail(email: string): Promise<Result<Option<LoggerUiUser>, StdError>>;
|
|
16
|
+
findById(id: number): Promise<Result<Option<LoggerUiUser>, StdError>>;
|
|
17
|
+
create(email: string, password_hash: string): Promise<Result<LoggerUiUser, StdError>>;
|
|
18
|
+
updatePasswordByEmail(email: string, password_hash: string): Promise<Result<Option<LoggerUiUser>, StdError>>;
|
|
19
|
+
}
|
package/build/users.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Migration, Migrations } from "@smuzi/database";
|
|
2
|
+
import { Err, None, Ok, panic, Some } from "@smuzi/std";
|
|
3
|
+
export const LOGGER_UI_USERS_DEFAULT_TABLE = "logger_ui_users";
|
|
4
|
+
// The table name is interpolated into SQL, so only plain identifiers are accepted.
|
|
5
|
+
function assertTableName(table) {
|
|
6
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(table)) {
|
|
7
|
+
panic(`Invalid logger UI users table name '${table}'`);
|
|
8
|
+
}
|
|
9
|
+
return table;
|
|
10
|
+
}
|
|
11
|
+
export function normalizeEmail(email) {
|
|
12
|
+
return email.trim().toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
export const loggerUiMigrations = (users_table = LOGGER_UI_USERS_DEFAULT_TABLE) => {
|
|
15
|
+
const table = assertTableName(users_table);
|
|
16
|
+
const migrations = Migrations('smuzi:logger-ui:');
|
|
17
|
+
migrations.add('create_' + table, Migration({
|
|
18
|
+
up: () => (`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS ${table} (
|
|
20
|
+
id SERIAL PRIMARY KEY,
|
|
21
|
+
email VARCHAR(255) NOT NULL UNIQUE,
|
|
22
|
+
password_hash VARCHAR(255) NOT NULL,
|
|
23
|
+
created_at TIMESTAMPTZ NOT NULL
|
|
24
|
+
);`),
|
|
25
|
+
down: () => `DROP TABLE IF EXISTS ${table};`
|
|
26
|
+
}));
|
|
27
|
+
return migrations;
|
|
28
|
+
};
|
|
29
|
+
export class LoggerUiUsersRepository {
|
|
30
|
+
#db_client;
|
|
31
|
+
#table;
|
|
32
|
+
constructor(table, db_client) {
|
|
33
|
+
this.#db_client = db_client;
|
|
34
|
+
this.#table = assertTableName(table);
|
|
35
|
+
}
|
|
36
|
+
async #findOne(where, value) {
|
|
37
|
+
const result = await this.#db_client.query(`SELECT id, email, password_hash, created_at FROM ${this.#table} WHERE ${where} = $1 LIMIT 1`, [value]);
|
|
38
|
+
if (result.isErr()) {
|
|
39
|
+
return Err(result.unsafeSource().toError());
|
|
40
|
+
}
|
|
41
|
+
const row = result.unwrap().rows.unsafeSource()[0];
|
|
42
|
+
return Ok(row === undefined ? None() : Some(row));
|
|
43
|
+
}
|
|
44
|
+
async findByEmail(email) {
|
|
45
|
+
return this.#findOne("email", normalizeEmail(email));
|
|
46
|
+
}
|
|
47
|
+
async findById(id) {
|
|
48
|
+
return this.#findOne("id", id);
|
|
49
|
+
}
|
|
50
|
+
async create(email, password_hash) {
|
|
51
|
+
const result = await this.#db_client.query(`INSERT INTO ${this.#table} (email, password_hash, created_at) VALUES ($1, $2, $3)
|
|
52
|
+
RETURNING id, email, password_hash, created_at`, [normalizeEmail(email), password_hash, new Date()]);
|
|
53
|
+
if (result.isErr()) {
|
|
54
|
+
return Err(result.unsafeSource().toError());
|
|
55
|
+
}
|
|
56
|
+
return Ok(result.unwrap().rows.unsafeSource()[0]);
|
|
57
|
+
}
|
|
58
|
+
// Updates only the single row matching this email; never touches any other row.
|
|
59
|
+
async updatePasswordByEmail(email, password_hash) {
|
|
60
|
+
const result = await this.#db_client.query(`UPDATE ${this.#table} SET password_hash = $2 WHERE email = $1
|
|
61
|
+
RETURNING id, email, password_hash, created_at`, [normalizeEmail(email), password_hash]);
|
|
62
|
+
if (result.isErr()) {
|
|
63
|
+
return Err(result.unsafeSource().toError());
|
|
64
|
+
}
|
|
65
|
+
const row = result.unwrap().rows.unsafeSource()[0];
|
|
66
|
+
return Ok(row === undefined ? None() : Some(row));
|
|
67
|
+
}
|
|
68
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smuzi/logger-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Web UI for browsing logs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./build/index.d.ts",
|
|
@@ -36,11 +36,14 @@
|
|
|
36
36
|
"#lib/*": "./src/*"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
+
"@smuzi/console": "^0.0.12",
|
|
40
|
+
"@smuzi/database": "^0.0.15",
|
|
39
41
|
"@smuzi/http-server": "^0.0.14",
|
|
40
|
-
"@smuzi/logger": "^0.0.
|
|
42
|
+
"@smuzi/logger": "^0.0.6",
|
|
41
43
|
"@smuzi/std": "^0.2.15"
|
|
42
44
|
},
|
|
43
45
|
"devDependencies": {
|
|
46
|
+
"@smuzi/console": "^0.0.12",
|
|
44
47
|
"@smuzi/database": "^0.0.15",
|
|
45
48
|
"@smuzi/db-postgres": "^0.0.13",
|
|
46
49
|
"@tailwindcss/cli": "^4.3.3",
|
|
@@ -54,11 +57,12 @@
|
|
|
54
57
|
},
|
|
55
58
|
"scripts": {
|
|
56
59
|
"build": "pnpm run build:ui && tsc --project tsconfig.build.json",
|
|
57
|
-
"build:ui": "pnpm run build:ui:js && pnpm run build:ui:css && cp ui/index.html build/ui/
|
|
60
|
+
"build:ui": "pnpm run build:ui:js && pnpm run build:ui:css && cp ui/index.html ui/login.html build/ui/",
|
|
58
61
|
"build:ui:js": "esbuild ui/src/main.ts --bundle --minify --format=iife --target=es2022 --outfile=build/ui/app.js",
|
|
59
62
|
"build:ui:css": "tailwindcss --input ui/src/app.css --output build/ui/app.css --minify",
|
|
60
63
|
"check:ui": "tsc --project tsconfig.ui.json",
|
|
61
|
-
"serve": "tsx --env-file=dev/.env dev/serve.ts"
|
|
64
|
+
"serve": "tsx --env-file=dev/.env dev/serve.ts",
|
|
65
|
+
"console": "tsx --env-file=dev/.env dev/console.ts"
|
|
62
66
|
},
|
|
63
67
|
"main": "./build/index.js"
|
|
64
68
|
}
|