@smuzi/logger-ui 0.0.1
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/LICENSE +21 -0
- package/build/handlers.d.ts +10 -0
- package/build/handlers.js +74 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +4 -0
- package/build/query.d.ts +3 -0
- package/build/query.js +67 -0
- package/build/routes.d.ts +13 -0
- package/build/routes.js +24 -0
- package/build/server.d.ts +9 -0
- package/build/server.js +13 -0
- package/build/ui/app.css +2 -0
- package/build/ui/app.js +25 -0
- package/build/ui/index.html +144 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 smuzi-ts
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ServerResponse } from "node:http";
|
|
2
|
+
import { Action } from "@smuzi/http-server";
|
|
3
|
+
import { LogsReader } from "@smuzi/logger";
|
|
4
|
+
export declare enum UiAsset {
|
|
5
|
+
script = "app.js",
|
|
6
|
+
style = "app.css"
|
|
7
|
+
}
|
|
8
|
+
export declare function uiPageAction(base_path: string): Action<ServerResponse>;
|
|
9
|
+
export declare function uiAssetAction(asset: UiAsset): Action<ServerResponse>;
|
|
10
|
+
export declare function logsQueryAction(reader: LogsReader): Action<ServerResponse>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { HttpResponse, ResponseHttpHeaders, Some } from "@smuzi/std";
|
|
3
|
+
import { parseLogsQuery } from "./query.js";
|
|
4
|
+
// Resolves to <package>/build/ui both from src/ (workspace) and from build/ (published).
|
|
5
|
+
const UI_DIR = new URL("../build/ui/", import.meta.url);
|
|
6
|
+
export var UiAsset;
|
|
7
|
+
(function (UiAsset) {
|
|
8
|
+
UiAsset["script"] = "app.js";
|
|
9
|
+
UiAsset["style"] = "app.css";
|
|
10
|
+
})(UiAsset || (UiAsset = {}));
|
|
11
|
+
const ASSET_CONTENT_TYPES = {
|
|
12
|
+
[UiAsset.script]: "text/javascript; charset=utf-8",
|
|
13
|
+
[UiAsset.style]: "text/css; charset=utf-8",
|
|
14
|
+
};
|
|
15
|
+
function textResponse(body, content_type, status = 200) {
|
|
16
|
+
return new HttpResponse({
|
|
17
|
+
status,
|
|
18
|
+
body: Some(body),
|
|
19
|
+
headers: new ResponseHttpHeaders([["content-type", content_type]]),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function readUiFile(file) {
|
|
23
|
+
try {
|
|
24
|
+
return await readFile(new URL(file, UI_DIR), "utf-8");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function assetsNotBuiltResponse() {
|
|
31
|
+
return textResponse("Logger UI assets are not built. Run: pnpm --filter @smuzi/logger-ui build:ui", "text/plain; charset=utf-8", 503);
|
|
32
|
+
}
|
|
33
|
+
function escapeHtmlAttribute(value) {
|
|
34
|
+
return value
|
|
35
|
+
.replace(/&/g, "&")
|
|
36
|
+
.replace(/"/g, """)
|
|
37
|
+
.replace(/</g, "<")
|
|
38
|
+
.replace(/>/g, ">");
|
|
39
|
+
}
|
|
40
|
+
export function uiPageAction(base_path) {
|
|
41
|
+
return async () => {
|
|
42
|
+
const html = await readUiFile("index.html");
|
|
43
|
+
if (html === null) {
|
|
44
|
+
return assetsNotBuiltResponse();
|
|
45
|
+
}
|
|
46
|
+
return textResponse(html.replaceAll("{{base}}", escapeHtmlAttribute(base_path)), "text/html; charset=utf-8");
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function uiAssetAction(asset) {
|
|
50
|
+
return async () => {
|
|
51
|
+
const content = await readUiFile(asset);
|
|
52
|
+
if (content === null) {
|
|
53
|
+
return assetsNotBuiltResponse();
|
|
54
|
+
}
|
|
55
|
+
return textResponse(content, ASSET_CONTENT_TYPES[asset]);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function logsQueryAction(reader) {
|
|
59
|
+
return async (context) => {
|
|
60
|
+
const body = await context.request.body();
|
|
61
|
+
if (body.isErr()) {
|
|
62
|
+
return HttpResponse.asJson({ error: "Unable to read request body" }, 400);
|
|
63
|
+
}
|
|
64
|
+
const query = parseLogsQuery(body.unwrap());
|
|
65
|
+
if (query.isErr()) {
|
|
66
|
+
return HttpResponse.asJson({ error: query.unsafeSource() }, 422);
|
|
67
|
+
}
|
|
68
|
+
const page = await reader.queryGroups(query.unwrap());
|
|
69
|
+
return page.match({
|
|
70
|
+
Ok: (value) => HttpResponse.asJson(value),
|
|
71
|
+
Err: (error) => HttpResponse.asJson({ error: error.message }, 500),
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
package/build/query.d.ts
ADDED
package/build/query.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { asArray, asNumber, asObject, asString, Err, Ok } from "@smuzi/std";
|
|
2
|
+
function parseOptionalInteger(value, field) {
|
|
3
|
+
if (value === undefined || value === null) {
|
|
4
|
+
return Ok(undefined);
|
|
5
|
+
}
|
|
6
|
+
if (asNumber(value) && Number.isInteger(value) && value >= 0) {
|
|
7
|
+
return Ok(value);
|
|
8
|
+
}
|
|
9
|
+
return Err(`'${field}' must be a non-negative integer`);
|
|
10
|
+
}
|
|
11
|
+
function parseTagFilter(value, index) {
|
|
12
|
+
if (!asObject(value) || !asString(value.key)) {
|
|
13
|
+
return Err(`'tags[${index}].key' must be a string`);
|
|
14
|
+
}
|
|
15
|
+
const tag_value = value.value ?? "";
|
|
16
|
+
if (!asString(tag_value) && !asNumber(tag_value) && typeof tag_value !== "boolean") {
|
|
17
|
+
return Err(`'tags[${index}].value' must be a string, number or boolean`);
|
|
18
|
+
}
|
|
19
|
+
return Ok({ key: value.key, value: String(tag_value) });
|
|
20
|
+
}
|
|
21
|
+
export function parseLogsQuery(body) {
|
|
22
|
+
if (body.trim() === "") {
|
|
23
|
+
return Ok({});
|
|
24
|
+
}
|
|
25
|
+
let input;
|
|
26
|
+
try {
|
|
27
|
+
input = JSON.parse(body);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return Err("Request body must be valid JSON");
|
|
31
|
+
}
|
|
32
|
+
if (!asObject(input) || asArray(input)) {
|
|
33
|
+
return Err("Request body must be a JSON object");
|
|
34
|
+
}
|
|
35
|
+
const query = {};
|
|
36
|
+
if (input.trace_id !== undefined && input.trace_id !== null) {
|
|
37
|
+
if (!asString(input.trace_id)) {
|
|
38
|
+
return Err("'trace_id' must be a string");
|
|
39
|
+
}
|
|
40
|
+
query.trace_id = input.trace_id;
|
|
41
|
+
}
|
|
42
|
+
if (input.tags !== undefined && input.tags !== null) {
|
|
43
|
+
if (!asArray(input.tags)) {
|
|
44
|
+
return Err("'tags' must be an array of {key, value}");
|
|
45
|
+
}
|
|
46
|
+
const tags = [];
|
|
47
|
+
for (const [index, tag] of input.tags.entries()) {
|
|
48
|
+
const parsed = parseTagFilter(tag, index);
|
|
49
|
+
if (parsed.isErr()) {
|
|
50
|
+
return parsed;
|
|
51
|
+
}
|
|
52
|
+
tags.push(parsed.unwrap());
|
|
53
|
+
}
|
|
54
|
+
query.tags = tags;
|
|
55
|
+
}
|
|
56
|
+
for (const field of ["limit", "offset"]) {
|
|
57
|
+
const parsed = parseOptionalInteger(input[field], field);
|
|
58
|
+
if (parsed.isErr()) {
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
const value = parsed.unwrap();
|
|
62
|
+
if (value !== undefined) {
|
|
63
|
+
query[field] = value;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Ok(query);
|
|
67
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Http1Router } from "@smuzi/http-server";
|
|
2
|
+
import { LogsReader } from "@smuzi/logger";
|
|
3
|
+
export type LoggerUiRoutesOptions = {
|
|
4
|
+
prefix?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const LOGGER_UI_PATHS: {
|
|
7
|
+
readonly page: "";
|
|
8
|
+
readonly script: string;
|
|
9
|
+
readonly style: string;
|
|
10
|
+
readonly query: "api/logs";
|
|
11
|
+
};
|
|
12
|
+
export declare function registerLoggerUiRoutes(router: Http1Router, reader: LogsReader, { prefix }?: LoggerUiRoutesOptions): Http1Router;
|
|
13
|
+
export declare function createLoggerUiRouter(reader: LogsReader, options?: LoggerUiRoutesOptions): Http1Router;
|
package/build/routes.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CreateHttp1Router } from "@smuzi/http-server";
|
|
2
|
+
import { logsQueryAction, UiAsset, uiAssetAction, uiPageAction } from "./handlers.js";
|
|
3
|
+
export const LOGGER_UI_PATHS = {
|
|
4
|
+
page: "",
|
|
5
|
+
script: "assets/" + UiAsset.script,
|
|
6
|
+
style: "assets/" + UiAsset.style,
|
|
7
|
+
query: "api/logs",
|
|
8
|
+
};
|
|
9
|
+
function normalizePrefix(prefix) {
|
|
10
|
+
return prefix.replace(/^\/+|\/+$/g, "");
|
|
11
|
+
}
|
|
12
|
+
export function registerLoggerUiRoutes(router, reader, { prefix = "" } = {}) {
|
|
13
|
+
const base = normalizePrefix(prefix);
|
|
14
|
+
const withBase = (path) => [base, path].filter(part => part !== "").join("/");
|
|
15
|
+
const base_path = base === "" ? "" : "/" + base;
|
|
16
|
+
router.get(withBase(LOGGER_UI_PATHS.page), uiPageAction(base_path));
|
|
17
|
+
router.get(withBase(LOGGER_UI_PATHS.script), uiAssetAction(UiAsset.script));
|
|
18
|
+
router.get(withBase(LOGGER_UI_PATHS.style), uiAssetAction(UiAsset.style));
|
|
19
|
+
router.post(withBase(LOGGER_UI_PATHS.query), logsQueryAction(reader));
|
|
20
|
+
return router;
|
|
21
|
+
}
|
|
22
|
+
export function createLoggerUiRouter(reader, options = {}) {
|
|
23
|
+
return registerLoggerUiRoutes(CreateHttp1Router({ path: "" }), reader, options);
|
|
24
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LogsReader } from "@smuzi/logger";
|
|
2
|
+
import { LoggerUiRoutesOptions } from "./routes.js";
|
|
3
|
+
export declare const LOGGER_UI_DEFAULT_PORT = 8090;
|
|
4
|
+
export type LoggerUiServerOptions = LoggerUiRoutesOptions & {
|
|
5
|
+
host?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
};
|
|
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>>;
|
package/build/server.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { buildHttp1ServerConfig, http1ServerRun } from "@smuzi/http-server";
|
|
2
|
+
import { createLoggerUiRouter } from "./routes.js";
|
|
3
|
+
export const LOGGER_UI_DEFAULT_PORT = 8090;
|
|
4
|
+
export function buildLoggerUiServerConfig(reader, { host = "localhost", port = LOGGER_UI_DEFAULT_PORT, prefix } = {}) {
|
|
5
|
+
return buildHttp1ServerConfig({
|
|
6
|
+
host,
|
|
7
|
+
port,
|
|
8
|
+
router: createLoggerUiRouter(reader, { prefix }),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function runLoggerUi(reader, options = {}) {
|
|
12
|
+
return http1ServerRun(buildLoggerUiServerConfig(reader, options));
|
|
13
|
+
}
|
package/build/ui/app.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
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}
|
package/build/ui/app.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
(()=>{var Qe=!1,et=!1,D=[],tt=-1,Re=!1,yt=!1;function gn(e){xn(e)}function vn(){yt=!0}function yn(){yt=!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>tt&&D.splice(t,1)}function Xt(){if(!et&&!Qe){if(yt)return;Qe=!0,queueMicrotask(bn)}}function bn(){Qe=!1,et=!0;for(let e=0;e<D.length;e++)Re&&mn(e),D[e](),tt=e;D.length=0,tt=-1,Re=!1,et=!1}function mn(e){let t=new Map,r=D.slice(e).sort((n,i)=>wn(n,i,t));for(let n=0;n<r.length;n++)D[e+n]=r[n];Re=!1}function wn(e,t,r){return Ve(e)?Ve(t)?Bt(e._x_schedulerPriority.el,r)-Bt(t._x_schedulerPriority.el,r)||e._x_schedulerPriority.order-t._x_schedulerPriority.order:-1:Ve(t)?1:0}function Ve(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,Sn=0,rt=!0;function En(e){rt=!1,e(),rt=!0}function An(e){re=e.reactive,ne=e.release,G=t=>e.effect(t,{scheduler:r=>{rt?gn(r):r()}}),Qt=e.raw}function Ht(e){G=e}function On(e){let t=()=>{};return[(n,i)=>{let s=i?.priority==="structural"?Sn++: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 Tn(e){vn();try{await e(),await Promise.resolve()}finally{yn()}}var tr=[],rr=[],nr=[];function Mn(e){nr.push(e)}function bt(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 Cn(e){for(e._x_effects?.forEach(xt);e._x_cleanups?.length;)e._x_cleanups.pop()()}var je=new MutationObserver(Ne),mt=!1;function wt(){je.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),mt=!0}function ar(){Rn(),je.disconnect(),mt=!1}var N=[];function Rn(){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 Pn(){for(;N.length>0;)N.shift()();let e=je.takeRecords();e.length>0&&Ne(e)}function v(e){if(!mt)return e();ar();try{return e()}finally{wt()}}var St=!1,Pe=[];function Dn(){St=!0}function $n(){St=!1,Ne(Pe),Pe=[]}function Ne(e){if(St){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)})},f=()=>{i.has(o)||i.set(o,[]),i.get(o).push(a)};o.hasAttribute(a)&&u===null?c():o.hasAttribute(a)?(f(),c()):f()}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},In)}function cr(e,t){return e===null||e===Object.prototype?null:Object.prototype.hasOwnProperty.call(e,t)?e:cr(Object.getPrototypeOf(e),t)}var In={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"?Ln: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 Ln(){return Reflect.ownKeys(this).reduce((t,r)=>(t[r]=Reflect.get(this,r),t),{})}function Et(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 fr(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,s,o){return e(this.initialValue,()=>jn(n,i),a=>nt(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 jn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function nt(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]]={}),nt(e[t[0]],t.slice(1),r)}}var lr={};function A(e,t){lr[e]=t}function _e(e,t){let r=Nn(t);return Object.entries(lr).forEach(([n,i])=>{Object.defineProperty(e,`$${n}`,{get(){return i(t,r)},enumerable:!1})}),e}function Nn(e){let[t,r]=yr(e),n={interceptor:fr,...t};return bt(e,r),n}function kn(e,t,r,...n){try{return r(...n)}catch(i){te(i,e,t)}}function te(...e){return dr(...e)}var dr=Bn;function Fn(e){dr=e}function Bn(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
|
+
|
|
3
|
+
${r?'Expression: "'+r+`"
|
|
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();})();
|
|
6
|
+
/*! Bundled license information:
|
|
7
|
+
|
|
8
|
+
alpinejs/dist/module.esm.js:
|
|
9
|
+
(*! Bundled license information:
|
|
10
|
+
|
|
11
|
+
@vue/shared/dist/shared.esm-bundler.js:
|
|
12
|
+
(**
|
|
13
|
+
* @vue/shared v3.5.41
|
|
14
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
15
|
+
* @license MIT
|
|
16
|
+
**)
|
|
17
|
+
|
|
18
|
+
@vue/reactivity/dist/reactivity.esm-bundler.js:
|
|
19
|
+
(**
|
|
20
|
+
* @vue/reactivity v3.5.41
|
|
21
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
22
|
+
* @license MIT
|
|
23
|
+
**)
|
|
24
|
+
*)
|
|
25
|
+
*/
|
|
@@ -0,0 +1,144 @@
|
|
|
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</title>
|
|
7
|
+
<link rel="stylesheet" href="{{base}}/assets/app.css">
|
|
8
|
+
<script defer src="{{base}}/assets/app.js"></script>
|
|
9
|
+
</head>
|
|
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">
|
|
12
|
+
|
|
13
|
+
<header class="flex items-center gap-3">
|
|
14
|
+
<h1 class="text-xl font-semibold">Logs</h1>
|
|
15
|
+
<span class="text-sm text-slate-500" x-cloak>
|
|
16
|
+
<span x-text="total"></span> groups
|
|
17
|
+
</span>
|
|
18
|
+
<span x-show="loading" x-cloak class="text-sm text-slate-400">loading…</span>
|
|
19
|
+
<button type="button" @click="load()"
|
|
20
|
+
class="ml-auto rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm hover:bg-slate-100">
|
|
21
|
+
Refresh
|
|
22
|
+
</button>
|
|
23
|
+
</header>
|
|
24
|
+
|
|
25
|
+
<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-2">
|
|
27
|
+
<input x-model="trace_id" type="search" placeholder="trace_id"
|
|
28
|
+
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">
|
|
29
|
+
<button type="submit"
|
|
30
|
+
class="rounded-md bg-sky-600 px-4 py-1.5 text-sm font-medium text-white hover:bg-sky-700">
|
|
31
|
+
Search
|
|
32
|
+
</button>
|
|
33
|
+
</form>
|
|
34
|
+
|
|
35
|
+
<form @submit.prevent="addTag()" class="flex gap-2">
|
|
36
|
+
<input x-model="new_tag_key" placeholder="tag field"
|
|
37
|
+
class="w-48 rounded-md border border-slate-300 px-3 py-1.5 font-mono text-sm focus:border-sky-500 focus:outline-none">
|
|
38
|
+
<input x-model="new_tag_value" placeholder="value contains (empty = field exists)"
|
|
39
|
+
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">
|
|
40
|
+
<button type="submit" title="Add tag filter" :disabled="new_tag_key.trim() === ''"
|
|
41
|
+
class="w-10 rounded-md border border-slate-300 text-lg leading-none hover:bg-slate-100 disabled:opacity-40">
|
|
42
|
+
+
|
|
43
|
+
</button>
|
|
44
|
+
</form>
|
|
45
|
+
|
|
46
|
+
<div x-show="hasFilters()" x-cloak class="flex flex-wrap items-center gap-2">
|
|
47
|
+
<template x-if="trace_id.trim() !== ''">
|
|
48
|
+
<span class="inline-flex items-center gap-1 rounded-full bg-violet-100 py-0.5 pl-3 pr-1 font-mono text-xs text-violet-800">
|
|
49
|
+
trace_id=<span x-text="trace_id"></span>
|
|
50
|
+
<button type="button" title="Remove" @click="trace_id = ''; search()"
|
|
51
|
+
class="h-5 w-5 rounded-full leading-none hover:bg-violet-200">−</button>
|
|
52
|
+
</span>
|
|
53
|
+
</template>
|
|
54
|
+
<template x-for="(tag, index) in tags" :key="tag.key + '=' + tag.value">
|
|
55
|
+
<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
|
+
<span x-text="tag.key"></span>=<span x-text="tag.value === '' ? '*' : tag.value"></span>
|
|
57
|
+
<button type="button" title="Remove tag filter" @click="removeTag(index)"
|
|
58
|
+
class="h-5 w-5 rounded-full leading-none hover:bg-sky-200">−</button>
|
|
59
|
+
</span>
|
|
60
|
+
</template>
|
|
61
|
+
<button type="button" @click="clearFilters()" class="text-xs text-slate-500 underline hover:text-slate-800">
|
|
62
|
+
clear all
|
|
63
|
+
</button>
|
|
64
|
+
</div>
|
|
65
|
+
</section>
|
|
66
|
+
|
|
67
|
+
<div x-show="error_message !== ''" x-cloak
|
|
68
|
+
class="rounded-lg border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-800"
|
|
69
|
+
x-text="error_message"></div>
|
|
70
|
+
|
|
71
|
+
<div x-show="!loading && error_message === '' && groups.length === 0" x-cloak
|
|
72
|
+
class="rounded-lg border border-dashed border-slate-300 p-8 text-center text-sm text-slate-500">
|
|
73
|
+
No logs found
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div class="space-y-2">
|
|
77
|
+
<template x-for="group in groups" :key="groupKey(group)">
|
|
78
|
+
<article class="overflow-hidden rounded-lg border border-slate-200 bg-white shadow-sm">
|
|
79
|
+
<header @click="toggle(group)"
|
|
80
|
+
class="flex cursor-pointer select-none items-center gap-3 px-4 py-2 hover:bg-slate-50">
|
|
81
|
+
<span class="w-3 text-slate-400" x-text="isExpanded(group) ? '▾' : '▸'"></span>
|
|
82
|
+
<span class="rounded px-1.5 py-0.5 text-xs font-medium ring-1 ring-inset"
|
|
83
|
+
:class="levelBadge(group.level)" x-text="levelName(group.level)"></span>
|
|
84
|
+
<template x-if="group.trace_id !== null">
|
|
85
|
+
<button type="button" title="Filter by this trace_id" @click.stop="filterByTrace(group.trace_id)"
|
|
86
|
+
class="truncate font-mono text-sm text-violet-700 hover:underline"
|
|
87
|
+
x-text="group.trace_id"></button>
|
|
88
|
+
</template>
|
|
89
|
+
<template x-if="group.trace_id === null">
|
|
90
|
+
<span class="text-sm italic text-slate-400">no trace_id</span>
|
|
91
|
+
</template>
|
|
92
|
+
<span class="shrink-0 text-xs text-slate-500" x-text="group.logs.length + (group.logs.length === 1 ? ' log' : ' logs')"></span>
|
|
93
|
+
<span class="shrink-0 text-xs text-slate-400" x-text="formatDuration(group)"></span>
|
|
94
|
+
<time class="ml-auto shrink-0 font-mono text-xs text-slate-500" x-text="formatDate(group.finished_at)"></time>
|
|
95
|
+
</header>
|
|
96
|
+
|
|
97
|
+
<p x-show="!isExpanded(group)" class="truncate px-4 pb-2 pl-10 font-mono text-xs text-slate-600"
|
|
98
|
+
x-text="summary(group)"></p>
|
|
99
|
+
|
|
100
|
+
<ol x-show="isExpanded(group)" class="divide-y divide-slate-100 border-t border-slate-100">
|
|
101
|
+
<template x-for="log in group.logs" :key="log.id">
|
|
102
|
+
<li class="grid grid-cols-[6.5rem_3.5rem_1fr] gap-3 px-4 py-2">
|
|
103
|
+
<time class="pt-0.5 font-mono text-xs text-slate-500" :title="log.created_at"
|
|
104
|
+
x-text="formatTime(log.created_at)"></time>
|
|
105
|
+
<span>
|
|
106
|
+
<span class="rounded px-1.5 py-0.5 text-xs font-medium ring-1 ring-inset"
|
|
107
|
+
:class="levelBadge(log.level)" x-text="levelName(log.level)"></span>
|
|
108
|
+
</span>
|
|
109
|
+
<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
|
+
<div class="flex flex-wrap gap-1">
|
|
113
|
+
<template x-for="tag in tagEntries(log.tags)" :key="tag.key">
|
|
114
|
+
<button type="button" title="Add to filter"
|
|
115
|
+
@click="filterByTag(tag.key, tag.value)"
|
|
116
|
+
class="rounded bg-slate-100 px-1.5 py-0.5 font-mono text-[11px] text-slate-600 hover:bg-sky-100 hover:text-sky-800">
|
|
117
|
+
<span x-text="tag.key"></span>=<span x-text="String(tag.value)"></span>
|
|
118
|
+
</button>
|
|
119
|
+
</template>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</li>
|
|
123
|
+
</template>
|
|
124
|
+
</ol>
|
|
125
|
+
</article>
|
|
126
|
+
</template>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<footer x-show="total > 0" x-cloak class="flex items-center justify-between text-sm text-slate-600">
|
|
130
|
+
<span><span x-text="pageRange()"></span> of <span x-text="total"></span></span>
|
|
131
|
+
<div class="flex gap-2">
|
|
132
|
+
<button type="button" @click="prevPage()" :disabled="!hasPrevPage() || loading"
|
|
133
|
+
class="rounded-md border border-slate-300 bg-white px-3 py-1.5 hover:bg-slate-100 disabled:opacity-40">
|
|
134
|
+
← Prev
|
|
135
|
+
</button>
|
|
136
|
+
<button type="button" @click="nextPage()" :disabled="!hasNextPage() || loading"
|
|
137
|
+
class="rounded-md border border-slate-300 bg-white px-3 py-1.5 hover:bg-slate-100 disabled:opacity-40">
|
|
138
|
+
Next →
|
|
139
|
+
</button>
|
|
140
|
+
</div>
|
|
141
|
+
</footer>
|
|
142
|
+
</div>
|
|
143
|
+
</body>
|
|
144
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@smuzi/logger-ui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Web UI for browsing logs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"types": "./build/index.d.ts",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"logs",
|
|
9
|
+
"logger",
|
|
10
|
+
"ui",
|
|
11
|
+
"trace",
|
|
12
|
+
"observability"
|
|
13
|
+
],
|
|
14
|
+
"author": "Denis Ratushniak <dinisimys2018@gmail.com>",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"build/**/*.js",
|
|
21
|
+
"build/**/*.d.ts",
|
|
22
|
+
"build/ui/**"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
"./package.json": "./package.json",
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./build/index.d.ts",
|
|
28
|
+
"default": "./build/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./*": {
|
|
31
|
+
"types": "./build/*.d.ts",
|
|
32
|
+
"default": "./build/*.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"imports": {
|
|
36
|
+
"#lib/*": "./src/*"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@smuzi/http-server": "^0.0.14",
|
|
40
|
+
"@smuzi/logger": "^0.0.5",
|
|
41
|
+
"@smuzi/std": "^0.2.15"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@smuzi/database": "^0.0.15",
|
|
45
|
+
"@smuzi/db-postgres": "^0.0.13",
|
|
46
|
+
"@tailwindcss/cli": "^4.3.3",
|
|
47
|
+
"@types/alpinejs": "^3.13.11",
|
|
48
|
+
"@types/node": "^22.15.21",
|
|
49
|
+
"alpinejs": "^3.17.4",
|
|
50
|
+
"esbuild": "^0.28.2",
|
|
51
|
+
"tailwindcss": "^4.3.3",
|
|
52
|
+
"tsx": "^4.20.6",
|
|
53
|
+
"typescript": "^7.0.2"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"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/index.html",
|
|
58
|
+
"build:ui:js": "esbuild ui/src/main.ts --bundle --minify --format=iife --target=es2022 --outfile=build/ui/app.js",
|
|
59
|
+
"build:ui:css": "tailwindcss --input ui/src/app.css --output build/ui/app.css --minify",
|
|
60
|
+
"check:ui": "tsc --project tsconfig.ui.json",
|
|
61
|
+
"serve": "tsx --env-file=dev/.env dev/serve.ts"
|
|
62
|
+
},
|
|
63
|
+
"main": "./build/index.js"
|
|
64
|
+
}
|