@oneuptime/common 8.0.5480 → 8.0.5488
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/UI/Components/LogsViewer/LogsViewer.tsx +331 -367
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +343 -0
- package/UI/Components/LogsViewer/components/LogsFilterCard.tsx +74 -0
- package/UI/Components/LogsViewer/components/LogsPagination.tsx +109 -0
- package/UI/Components/LogsViewer/components/LogsTable.tsx +270 -0
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +51 -0
- package/UI/Components/LogsViewer/components/SeverityBadge.tsx +28 -0
- package/UI/Components/LogsViewer/components/severityTheme.ts +69 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +211 -201
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +151 -0
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsFilterCard.js +40 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsFilterCard.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js +49 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +130 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +20 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/SeverityBadge.js +13 -0
- package/build/dist/UI/Components/LogsViewer/components/SeverityBadge.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/components/severityTheme.js +54 -0
- package/build/dist/UI/Components/LogsViewer/components/severityTheme.js.map +1 -0
- package/package.json +1 -1
- package/UI/Components/LogsViewer/LogItem.tsx +0 -503
- package/build/dist/UI/Components/LogsViewer/LogItem.js +0 -221
- package/build/dist/UI/Components/LogsViewer/LogItem.js.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import React, { useMemo } from "react";
|
|
2
|
+
import Route from "../../../../Types/API/Route";
|
|
3
|
+
import URL from "../../../../Types/API/URL";
|
|
4
|
+
import CopyTextButton from "../../CopyTextButton/CopyTextButton";
|
|
5
|
+
import Icon from "../../Icon/Icon";
|
|
6
|
+
import IconProp from "../../../../Types/Icon/IconProp";
|
|
7
|
+
import Link from "../../Link/Link";
|
|
8
|
+
import OneUptimeDate from "../../../../Types/Date";
|
|
9
|
+
import JSONFunctions from "../../../../Types/JSONFunctions";
|
|
10
|
+
import SeverityBadge from "./SeverityBadge";
|
|
11
|
+
const prepareBody = (body) => {
|
|
12
|
+
if (!body) {
|
|
13
|
+
return {
|
|
14
|
+
isJson: false,
|
|
15
|
+
pretty: "",
|
|
16
|
+
compact: "",
|
|
17
|
+
raw: "",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(body);
|
|
22
|
+
const pretty = JSON.stringify(parsed, null, 2);
|
|
23
|
+
const compact = JSON.stringify(parsed);
|
|
24
|
+
return {
|
|
25
|
+
isJson: true,
|
|
26
|
+
pretty,
|
|
27
|
+
compact,
|
|
28
|
+
raw: body,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch (_a) {
|
|
32
|
+
return {
|
|
33
|
+
isJson: false,
|
|
34
|
+
pretty: body,
|
|
35
|
+
compact: body,
|
|
36
|
+
raw: body,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const LogDetailsPanel = (props) => {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const variant = props.variant || "floating";
|
|
43
|
+
const serviceId = ((_a = props.log.serviceId) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
44
|
+
const service = props.serviceMap[serviceId];
|
|
45
|
+
const serviceName = (service === null || service === void 0 ? void 0 : service.name) || serviceId || "Unknown service";
|
|
46
|
+
const serviceColor = ((service === null || service === void 0 ? void 0 : service.serviceColor) && (service === null || service === void 0 ? void 0 : service.serviceColor.toString())) || "#64748b";
|
|
47
|
+
const bodyDetails = useMemo(() => {
|
|
48
|
+
var _a;
|
|
49
|
+
return prepareBody((_a = props.log.body) === null || _a === void 0 ? void 0 : _a.toString());
|
|
50
|
+
}, [props.log.body]);
|
|
51
|
+
const prettyAttributes = useMemo(() => {
|
|
52
|
+
if (!props.log.attributes) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const normalized = JSONFunctions.unflattenObject(props.log.attributes || {});
|
|
57
|
+
return JSON.stringify(normalized, null, 2);
|
|
58
|
+
}
|
|
59
|
+
catch (_a) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}, [props.log.attributes]);
|
|
63
|
+
const traceId = ((_b = props.log.traceId) === null || _b === void 0 ? void 0 : _b.toString()) || "";
|
|
64
|
+
const spanId = ((_c = props.log.spanId) === null || _c === void 0 ? void 0 : _c.toString()) || "";
|
|
65
|
+
const traceRoute = useMemo(() => {
|
|
66
|
+
if (!traceId || !props.getTraceRoute) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return props.getTraceRoute(traceId, props.log);
|
|
70
|
+
}, [traceId, props]);
|
|
71
|
+
const spanRoute = useMemo(() => {
|
|
72
|
+
if (!spanId) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (props.getSpanRoute) {
|
|
76
|
+
return props.getSpanRoute(spanId, props.log);
|
|
77
|
+
}
|
|
78
|
+
if (props.getTraceRoute && traceId) {
|
|
79
|
+
const baseRoute = props.getTraceRoute(traceId, props.log);
|
|
80
|
+
if (!baseRoute) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (baseRoute instanceof Route) {
|
|
84
|
+
const nextRoute = new Route(baseRoute.toString());
|
|
85
|
+
nextRoute.addQueryParams({ spanId });
|
|
86
|
+
return nextRoute;
|
|
87
|
+
}
|
|
88
|
+
const nextUrl = URL.fromURL(baseRoute);
|
|
89
|
+
nextUrl.addQueryParam("spanId", spanId);
|
|
90
|
+
return nextUrl;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}, [spanId, props, traceId]);
|
|
94
|
+
const containerClassName = variant === "embedded"
|
|
95
|
+
? "rounded-xl border border-slate-900 bg-slate-950 p-5 shadow-inner shadow-slate-950/40"
|
|
96
|
+
: "rounded-xl border border-slate-800 bg-slate-950/90 p-5 shadow-sm ring-1 ring-inset ring-transparent";
|
|
97
|
+
const headerBorderClass = variant === "embedded" ? "border-slate-900" : "border-slate-800";
|
|
98
|
+
const surfaceCardClass = variant === "embedded"
|
|
99
|
+
? "border-slate-900 bg-slate-950/70"
|
|
100
|
+
: "border-slate-800 bg-slate-950/80";
|
|
101
|
+
const smallBadgeClass = "inline-flex items-center gap-1 rounded-full border border-slate-800 bg-slate-900 px-2 py-1 text-[11px] font-mono uppercase tracking-wide text-slate-300";
|
|
102
|
+
return (React.createElement("div", { className: containerClassName },
|
|
103
|
+
React.createElement("div", { className: `flex flex-col gap-4 border-b ${headerBorderClass} pb-4 lg:flex-row lg:items-start lg:justify-between` },
|
|
104
|
+
React.createElement("div", { className: "flex flex-1 items-start gap-3" },
|
|
105
|
+
React.createElement("span", { className: "mt-1 h-3 w-3 flex-none rounded-full border border-slate-700", style: { backgroundColor: serviceColor }, "aria-hidden": "true" }),
|
|
106
|
+
React.createElement("div", { className: "space-y-3" },
|
|
107
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-3" },
|
|
108
|
+
React.createElement("h3", { className: "text-lg font-semibold text-slate-50" }, serviceName),
|
|
109
|
+
React.createElement(SeverityBadge, { severity: props.log.severityText })),
|
|
110
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-2" },
|
|
111
|
+
props.log.time && (React.createElement("span", { className: smallBadgeClass },
|
|
112
|
+
React.createElement(Icon, { icon: IconProp.Clock, className: "h-3 w-3" }),
|
|
113
|
+
OneUptimeDate.getDateAsUserFriendlyFormattedString(props.log.time))),
|
|
114
|
+
traceId && (React.createElement("span", { className: smallBadgeClass },
|
|
115
|
+
React.createElement(Icon, { icon: IconProp.Logs, className: "h-3 w-3" }),
|
|
116
|
+
"Trace")),
|
|
117
|
+
spanId && (React.createElement("span", { className: smallBadgeClass },
|
|
118
|
+
React.createElement(Icon, { icon: IconProp.Terminal, className: "h-3 w-3" }),
|
|
119
|
+
"Span"))))),
|
|
120
|
+
props.onClose && (React.createElement("button", { type: "button", onClick: props.onClose, className: "flex h-9 w-9 items-center justify-center rounded-full border border-slate-800 bg-slate-900 text-slate-400 transition-colors hover:border-slate-700 hover:text-slate-100", title: "Close details" },
|
|
121
|
+
React.createElement(Icon, { icon: IconProp.Close, className: "h-4 w-4" })))),
|
|
122
|
+
React.createElement("div", { className: "mt-4 space-y-5 text-sm text-slate-200" },
|
|
123
|
+
React.createElement("section", { className: "space-y-3" },
|
|
124
|
+
React.createElement("header", { className: "flex items-center justify-between text-[11px] uppercase tracking-wide text-slate-500" },
|
|
125
|
+
React.createElement("span", null, "Log Body"),
|
|
126
|
+
React.createElement(CopyTextButton, { textToBeCopied: bodyDetails.raw, size: "xs", variant: "ghost", iconOnly: false, title: "Copy log body" })),
|
|
127
|
+
React.createElement("div", { className: `rounded-lg border ${surfaceCardClass} p-4` }, bodyDetails.isJson ? (React.createElement("pre", { className: "max-h-80 overflow-auto whitespace-pre-wrap break-words font-mono text-[13px] leading-6 text-slate-100" }, bodyDetails.pretty)) : (React.createElement("p", { className: "whitespace-pre-wrap break-words font-mono text-[13px] leading-6 text-slate-100" }, bodyDetails.pretty || "—")))),
|
|
128
|
+
(traceId || spanId) && (React.createElement("section", { className: "grid gap-4 md:grid-cols-2" },
|
|
129
|
+
traceId && (React.createElement("div", { className: `rounded-lg border ${surfaceCardClass} p-4` },
|
|
130
|
+
React.createElement("div", { className: "mb-2 flex items-center justify-between text-[11px] uppercase tracking-wide text-slate-500" },
|
|
131
|
+
React.createElement("span", null, "Trace ID"),
|
|
132
|
+
React.createElement(CopyTextButton, { textToBeCopied: traceId, size: "xs", variant: "ghost", iconOnly: true, title: "Copy trace id" })),
|
|
133
|
+
React.createElement("div", { className: "flex items-center justify-between gap-2" },
|
|
134
|
+
traceRoute ? (React.createElement(Link, { to: traceRoute, className: "max-w-full truncate font-mono text-xs text-indigo-200 hover:text-indigo-100", title: `View trace ${traceId}` }, traceId)) : (React.createElement("span", { className: "max-w-full truncate font-mono text-xs text-slate-200", title: traceId }, traceId)),
|
|
135
|
+
traceRoute && (React.createElement(Icon, { icon: IconProp.ExternalLink, className: "h-4 w-4 flex-none text-indigo-300" }))))),
|
|
136
|
+
spanId && (React.createElement("div", { className: `rounded-lg border ${surfaceCardClass} p-4` },
|
|
137
|
+
React.createElement("div", { className: "mb-2 flex items-center justify-between text-[11px] uppercase tracking-wide text-slate-500" },
|
|
138
|
+
React.createElement("span", null, "Span ID"),
|
|
139
|
+
React.createElement(CopyTextButton, { textToBeCopied: spanId, size: "xs", variant: "ghost", iconOnly: true, title: "Copy span id" })),
|
|
140
|
+
React.createElement("div", { className: "flex items-center justify-between gap-2" },
|
|
141
|
+
spanRoute ? (React.createElement(Link, { to: spanRoute, className: "max-w-full truncate font-mono text-xs text-indigo-200 hover:text-indigo-100", title: `View span ${spanId}` }, spanId)) : (React.createElement("span", { className: "max-w-full truncate font-mono text-xs text-slate-200", title: spanId }, spanId)),
|
|
142
|
+
spanRoute && (React.createElement(Icon, { icon: IconProp.ExternalLink, className: "h-4 w-4 flex-none text-indigo-300" }))))))),
|
|
143
|
+
prettyAttributes && (React.createElement("section", { className: "space-y-3" },
|
|
144
|
+
React.createElement("header", { className: "flex items-center justify-between text-[11px] uppercase tracking-wide text-slate-500" },
|
|
145
|
+
React.createElement("span", null, "Attributes"),
|
|
146
|
+
React.createElement(CopyTextButton, { textToBeCopied: prettyAttributes, size: "xs", variant: "ghost", iconOnly: false, title: "Copy attributes" })),
|
|
147
|
+
React.createElement("div", { className: `rounded-lg border ${surfaceCardClass} p-4` },
|
|
148
|
+
React.createElement("pre", { className: "max-h-72 overflow-auto whitespace-pre-wrap break-words font-mono text-[13px] leading-6 text-slate-100" }, prettyAttributes)))))));
|
|
149
|
+
};
|
|
150
|
+
export default LogDetailsPanel;
|
|
151
|
+
//# sourceMappingURL=LogDetailsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogDetailsPanel.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/LogDetailsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Card from "../../Card/Card";
|
|
3
|
+
import FiltersForm from "../../Filters/FiltersForm";
|
|
4
|
+
import FieldType from "../../Types/FieldType";
|
|
5
|
+
import DropdownUtil from "../../../Utils/Dropdown";
|
|
6
|
+
import LogSeverity from "../../../../Types/Log/LogSeverity";
|
|
7
|
+
const LogsFilterCard = (props) => {
|
|
8
|
+
return (React.createElement(Card, null,
|
|
9
|
+
React.createElement("div", { className: "-mt-8" },
|
|
10
|
+
React.createElement(FiltersForm, { id: "logs-filter", showFilter: true, filterData: props.filterData, onFilterChanged: props.onFilterChanged, onAdvancedFiltersToggle: props.onAdvancedFiltersToggle, isFilterLoading: props.isFilterLoading, filterError: props.filterError, onFilterRefreshClick: props.onFilterRefreshClick, filters: [
|
|
11
|
+
{
|
|
12
|
+
key: "body",
|
|
13
|
+
type: FieldType.Text,
|
|
14
|
+
title: "Search Log",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
key: "severityText",
|
|
18
|
+
filterDropdownOptions: DropdownUtil.getDropdownOptionsFromEnum(LogSeverity),
|
|
19
|
+
type: FieldType.Dropdown,
|
|
20
|
+
title: "Log Severity",
|
|
21
|
+
isAdvancedFilter: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "time",
|
|
25
|
+
type: FieldType.DateTime,
|
|
26
|
+
title: "Start and End Date",
|
|
27
|
+
isAdvancedFilter: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: "attributes",
|
|
31
|
+
type: FieldType.JSON,
|
|
32
|
+
title: "Filter by Attributes",
|
|
33
|
+
jsonKeys: props.logAttributes,
|
|
34
|
+
isAdvancedFilter: true,
|
|
35
|
+
},
|
|
36
|
+
] })),
|
|
37
|
+
React.createElement("div", { className: "-mx-6 -mb-6 border-t border-slate-200 bg-white/60 px-6 py-3 backdrop-blur" }, props.toolbar)));
|
|
38
|
+
};
|
|
39
|
+
export default LogsFilterCard;
|
|
40
|
+
//# sourceMappingURL=LogsFilterCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogsFilterCard.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/LogsFilterCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,WAAW,MAAM,mCAAmC,CAAC;AAe5D,MAAM,cAAc,GAA2C,CAC7D,KAA0B,EACZ,EAAE;IAChB,OAAO,CACL,oBAAC,IAAI;QACH,6BAAK,SAAS,EAAC,OAAO;YACpB,oBAAC,WAAW,IACV,EAAE,EAAC,aAAa,EAChB,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,EACtD,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,EAChD,OAAO,EAAE;oBACP;wBACE,GAAG,EAAE,MAAM;wBACX,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,KAAK,EAAE,YAAY;qBACpB;oBACD;wBACE,GAAG,EAAE,cAAc;wBACnB,qBAAqB,EACnB,YAAY,CAAC,0BAA0B,CAAC,WAAW,CAAC;wBACtD,IAAI,EAAE,SAAS,CAAC,QAAQ;wBACxB,KAAK,EAAE,cAAc;wBACrB,gBAAgB,EAAE,IAAI;qBACvB;oBACD;wBACE,GAAG,EAAE,MAAM;wBACX,IAAI,EAAE,SAAS,CAAC,QAAQ;wBACxB,KAAK,EAAE,oBAAoB;wBAC3B,gBAAgB,EAAE,IAAI;qBACvB;oBACD;wBACE,GAAG,EAAE,YAAY;wBACjB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,KAAK,EAAE,sBAAsB;wBAC7B,QAAQ,EAAE,KAAK,CAAC,aAAa;wBAC7B,gBAAgB,EAAE,IAAI;qBACvB;iBACF,GACD,CACE;QAEN,6BAAK,SAAS,EAAC,2EAA2E,IACvF,KAAK,CAAC,OAAO,CACV,CACD,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
const LogsPagination = (props) => {
|
|
3
|
+
const totalPages = Math.max(1, Math.ceil(props.totalItems === 0
|
|
4
|
+
? 1
|
|
5
|
+
: props.totalItems / Math.max(props.pageSize, 1)));
|
|
6
|
+
const safeCurrentPage = Math.min(props.currentPage, totalPages);
|
|
7
|
+
const firstItemIndex = props.totalItems === 0 ? 0 : (safeCurrentPage - 1) * props.pageSize + 1;
|
|
8
|
+
const lastItemIndex = props.totalItems === 0
|
|
9
|
+
? 0
|
|
10
|
+
: Math.min(props.totalItems, safeCurrentPage * props.pageSize);
|
|
11
|
+
const disablePrev = props.isDisabled || props.totalItems === 0 || safeCurrentPage <= 1;
|
|
12
|
+
const disableNext = props.isDisabled || props.totalItems === 0 || safeCurrentPage >= totalPages;
|
|
13
|
+
return (React.createElement("div", { className: "flex flex-col gap-3 border-t border-slate-800 bg-slate-950/60 px-4 py-3 text-xs text-slate-400 md:flex-row md:items-center md:justify-between" },
|
|
14
|
+
React.createElement("div", null, props.totalItems === 0 ? (React.createElement("span", null, "No results to display.")) : (React.createElement("span", null,
|
|
15
|
+
"Showing ",
|
|
16
|
+
firstItemIndex.toLocaleString(),
|
|
17
|
+
"-",
|
|
18
|
+
lastItemIndex.toLocaleString(),
|
|
19
|
+
" of",
|
|
20
|
+
" ",
|
|
21
|
+
props.totalItems.toLocaleString()))),
|
|
22
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-3" },
|
|
23
|
+
React.createElement("label", { className: "flex items-center gap-2 text-slate-500" },
|
|
24
|
+
React.createElement("span", { className: "uppercase tracking-wide text-[10px]" }, "Rows"),
|
|
25
|
+
React.createElement("select", { className: "rounded-md border border-slate-700 bg-slate-900/80 px-2 py-1 text-xs text-slate-200 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 disabled:cursor-not-allowed disabled:opacity-50", value: props.pageSize, onChange: (event) => {
|
|
26
|
+
const size = Number(event.target.value) || props.pageSize;
|
|
27
|
+
props.onPageSizeChange(size);
|
|
28
|
+
}, disabled: props.isDisabled }, props.pageSizeOptions.map((option) => {
|
|
29
|
+
return (React.createElement("option", { key: option, value: option }, option));
|
|
30
|
+
}))),
|
|
31
|
+
React.createElement("div", { className: "inline-flex items-center gap-1 rounded-full border border-slate-800 bg-slate-900/70 p-0.5" },
|
|
32
|
+
React.createElement("button", { type: "button", className: "rounded-full px-3 py-1 text-xs font-medium text-slate-300 transition-colors hover:bg-slate-800 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 disabled:cursor-not-allowed disabled:opacity-40", onClick: () => {
|
|
33
|
+
if (!disablePrev) {
|
|
34
|
+
props.onPageChange(Math.max(1, safeCurrentPage - 1));
|
|
35
|
+
}
|
|
36
|
+
}, disabled: disablePrev }, "Previous"),
|
|
37
|
+
React.createElement("span", { className: "px-3 text-[11px] uppercase tracking-wide text-slate-500" },
|
|
38
|
+
"Page ",
|
|
39
|
+
safeCurrentPage,
|
|
40
|
+
" / ",
|
|
41
|
+
totalPages),
|
|
42
|
+
React.createElement("button", { type: "button", className: "rounded-full px-3 py-1 text-xs font-medium text-slate-300 transition-colors hover:bg-slate-800 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 disabled:cursor-not-allowed disabled:opacity-40", onClick: () => {
|
|
43
|
+
if (!disableNext) {
|
|
44
|
+
props.onPageChange(Math.min(totalPages, safeCurrentPage + 1));
|
|
45
|
+
}
|
|
46
|
+
}, disabled: disableNext }, "Next")))));
|
|
47
|
+
};
|
|
48
|
+
export default LogsPagination;
|
|
49
|
+
//# sourceMappingURL=LogsPagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogsPagination.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/LogsPagination.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import React, { Fragment } from "react";
|
|
2
|
+
import OneUptimeDate from "../../../../Types/Date";
|
|
3
|
+
import CopyTextButton from "../../CopyTextButton/CopyTextButton";
|
|
4
|
+
import ComponentLoader from "../../ComponentLoader/ComponentLoader";
|
|
5
|
+
import SeverityBadge from "./SeverityBadge";
|
|
6
|
+
import { getSeverityTheme } from "./severityTheme";
|
|
7
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
8
|
+
import Icon from "../../Icon/Icon";
|
|
9
|
+
import IconProp from "../../../../Types/Icon/IconProp";
|
|
10
|
+
export const resolveLogIdentifier = (log, index) => {
|
|
11
|
+
const possibleIds = [
|
|
12
|
+
log.id,
|
|
13
|
+
log._id,
|
|
14
|
+
log._objectId,
|
|
15
|
+
log.traceId,
|
|
16
|
+
log.timeUnixNano,
|
|
17
|
+
];
|
|
18
|
+
for (const candidate of possibleIds) {
|
|
19
|
+
if (!candidate) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return candidate.toString();
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return `log-row-${index}`;
|
|
30
|
+
};
|
|
31
|
+
const LogsTable = (props) => {
|
|
32
|
+
const showEmptyState = !props.isLoading && props.logs.length === 0;
|
|
33
|
+
const activeSortField = props.sortField;
|
|
34
|
+
const activeSortOrder = props.sortOrder || SortOrder.Descending;
|
|
35
|
+
const resolveSortIcon = (field) => {
|
|
36
|
+
if (activeSortField !== field) {
|
|
37
|
+
return IconProp.ArrowUpDown;
|
|
38
|
+
}
|
|
39
|
+
return activeSortOrder === SortOrder.Descending
|
|
40
|
+
? IconProp.ChevronDown
|
|
41
|
+
: IconProp.ChevronUp;
|
|
42
|
+
};
|
|
43
|
+
const resolveSortIconClass = (field) => {
|
|
44
|
+
const base = "h-3.5 w-3.5 flex-none transition-colors";
|
|
45
|
+
if (activeSortField === field) {
|
|
46
|
+
return `${base} text-indigo-300`;
|
|
47
|
+
}
|
|
48
|
+
return `${base} text-slate-600`;
|
|
49
|
+
};
|
|
50
|
+
return (React.createElement("div", { className: "relative" },
|
|
51
|
+
React.createElement("div", { className: "overflow-x-auto overflow-y-hidden border-b border-slate-900 bg-slate-950" },
|
|
52
|
+
React.createElement("table", { className: "min-w-full divide-y divide-slate-900/80" },
|
|
53
|
+
React.createElement("thead", { className: "bg-slate-950" },
|
|
54
|
+
React.createElement("tr", { className: "text-left text-[11px] font-semibold uppercase tracking-wider text-slate-200" },
|
|
55
|
+
React.createElement("th", { scope: "col", className: "px-4 py-3" },
|
|
56
|
+
React.createElement("button", { type: "button", className: `flex items-center gap-2 text-left font-semibold tracking-wider text-slate-300 transition-colors hover:text-slate-100 focus:outline-none ${activeSortField === "time" ? "text-slate-100" : ""}`, onClick: () => {
|
|
57
|
+
var _a;
|
|
58
|
+
(_a = props.onSortChange) === null || _a === void 0 ? void 0 : _a.call(props, "time");
|
|
59
|
+
}, "aria-sort": activeSortField === "time"
|
|
60
|
+
? activeSortOrder === SortOrder.Descending
|
|
61
|
+
? "descending"
|
|
62
|
+
: "ascending"
|
|
63
|
+
: "none" },
|
|
64
|
+
React.createElement("span", null, "Time"),
|
|
65
|
+
React.createElement(Icon, { icon: resolveSortIcon("time"), className: resolveSortIconClass("time"), "aria-hidden": "true" }))),
|
|
66
|
+
React.createElement("th", { scope: "col", className: "px-4 py-3" }, "Service"),
|
|
67
|
+
React.createElement("th", { scope: "col", className: "px-4 py-3" },
|
|
68
|
+
React.createElement("button", { type: "button", className: `flex items-center gap-2 text-left font-semibold tracking-wider text-slate-300 transition-colors hover:text-slate-100 focus:outline-none ${activeSortField === "severityText" ? "text-slate-100" : ""}`, onClick: () => {
|
|
69
|
+
var _a;
|
|
70
|
+
(_a = props.onSortChange) === null || _a === void 0 ? void 0 : _a.call(props, "severityText");
|
|
71
|
+
}, "aria-sort": activeSortField === "severityText"
|
|
72
|
+
? activeSortOrder === SortOrder.Descending
|
|
73
|
+
? "descending"
|
|
74
|
+
: "ascending"
|
|
75
|
+
: "none" },
|
|
76
|
+
React.createElement("span", null, "Severity"),
|
|
77
|
+
React.createElement(Icon, { icon: resolveSortIcon("severityText"), className: resolveSortIconClass("severityText"), "aria-hidden": "true" }))),
|
|
78
|
+
React.createElement("th", { scope: "col", className: "px-4 py-3" }, "Message"))),
|
|
79
|
+
React.createElement("tbody", { className: "divide-y divide-slate-900/70 bg-slate-950" }, props.logs.map((log, index) => {
|
|
80
|
+
var _a, _b, _c, _d;
|
|
81
|
+
const rowId = resolveLogIdentifier(log, index);
|
|
82
|
+
const serviceId = ((_a = log.serviceId) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
83
|
+
const service = props.serviceMap[serviceId];
|
|
84
|
+
const serviceName = (service === null || service === void 0 ? void 0 : service.name) || serviceId || "Unknown";
|
|
85
|
+
const serviceColor = ((service === null || service === void 0 ? void 0 : service.serviceColor) && (service === null || service === void 0 ? void 0 : service.serviceColor.toString())) ||
|
|
86
|
+
"#94a3b8";
|
|
87
|
+
const message = ((_b = log.body) === null || _b === void 0 ? void 0 : _b.toString()) || "";
|
|
88
|
+
const traceId = ((_c = log.traceId) === null || _c === void 0 ? void 0 : _c.toString()) || "";
|
|
89
|
+
const spanId = ((_d = log.spanId) === null || _d === void 0 ? void 0 : _d.toString()) || "";
|
|
90
|
+
const isSelected = props.selectedLogId === rowId;
|
|
91
|
+
const severityTheme = getSeverityTheme(log.severityText);
|
|
92
|
+
return (React.createElement(Fragment, { key: rowId },
|
|
93
|
+
React.createElement("tr", { onClick: () => {
|
|
94
|
+
props.onRowClick(log, rowId);
|
|
95
|
+
}, className: `group cursor-pointer align-top transition-colors duration-150 hover:bg-slate-900 ${isSelected
|
|
96
|
+
? "bg-slate-900 ring-1 ring-inset ring-indigo-500/40"
|
|
97
|
+
: ""}`, "aria-selected": isSelected, "aria-expanded": isSelected },
|
|
98
|
+
React.createElement("td", { className: "whitespace-nowrap px-4 py-3 text-[13px] font-mono text-slate-200" }, log.time
|
|
99
|
+
? OneUptimeDate.getDateAsUserFriendlyFormattedString(log.time)
|
|
100
|
+
: "—"),
|
|
101
|
+
React.createElement("td", { className: "px-4 py-3" },
|
|
102
|
+
React.createElement("div", { className: "flex items-center gap-3 text-sm text-slate-300" },
|
|
103
|
+
React.createElement("span", { className: "h-2.5 w-2.5 flex-none rounded-full border border-slate-900/40 shadow-sm", style: { backgroundColor: serviceColor }, "aria-hidden": "true" }),
|
|
104
|
+
React.createElement("span", { className: "truncate", title: serviceName }, serviceName))),
|
|
105
|
+
React.createElement("td", { className: "px-4 py-3" },
|
|
106
|
+
React.createElement(SeverityBadge, { severity: log.severityText })),
|
|
107
|
+
React.createElement("td", { className: "px-4 py-3" },
|
|
108
|
+
React.createElement("div", { className: "flex items-start justify-between gap-3" },
|
|
109
|
+
React.createElement("div", { className: "flex min-w-0 flex-1 flex-col gap-1" },
|
|
110
|
+
React.createElement("p", { className: `whitespace-pre-wrap break-words text-sm text-slate-200 transition-colors duration-150 group-hover:text-slate-50 ${severityTheme.textClass}`, title: message }, message || "—"),
|
|
111
|
+
(traceId || spanId) && (React.createElement("div", { className: "flex flex-wrap gap-3 text-[11px] tracking-wide text-slate-500" },
|
|
112
|
+
traceId && React.createElement("span", null,
|
|
113
|
+
"Trace: ",
|
|
114
|
+
traceId),
|
|
115
|
+
spanId && React.createElement("span", null,
|
|
116
|
+
"Span: ",
|
|
117
|
+
spanId)))),
|
|
118
|
+
React.createElement(CopyTextButton, { textToBeCopied: message, size: "xs", variant: "ghost", iconOnly: true, title: "Copy log message" })))),
|
|
119
|
+
isSelected && props.renderExpandedContent && (React.createElement("tr", { className: "bg-slate-950/70" },
|
|
120
|
+
React.createElement("td", { colSpan: 4, className: "px-6 pb-6 pt-3" }, props.renderExpandedContent(log))))));
|
|
121
|
+
})))),
|
|
122
|
+
props.isLoading && (React.createElement("div", { className: "absolute inset-0 flex items-center justify-center bg-slate-950/70 backdrop-blur-md" },
|
|
123
|
+
React.createElement(ComponentLoader, null))),
|
|
124
|
+
showEmptyState && (React.createElement("div", { className: "flex h-full items-center justify-center px-6 py-12 text-center bg-slate-950" },
|
|
125
|
+
React.createElement("div", { className: "w-full max-w-xl rounded-md border border-slate-900/70 bg-slate-950 p-6 text-left shadow-inner" },
|
|
126
|
+
React.createElement("p", { className: "font-mono text-sm uppercase text-slate-400" }, "No logs found"),
|
|
127
|
+
React.createElement("p", { className: "mt-3 font-mono text-xs text-slate-500" }, props.emptyMessage || "Adjust filters or check again later."))))));
|
|
128
|
+
};
|
|
129
|
+
export default LogsTable;
|
|
130
|
+
//# sourceMappingURL=LogsTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogsTable.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/LogsTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Button, { ButtonSize, ButtonStyleType } from "../../Button/Button";
|
|
3
|
+
const LogsViewerToolbar = (props) => {
|
|
4
|
+
const { currentPage, totalPages } = props;
|
|
5
|
+
const hasPaginationSummary = Boolean(currentPage && totalPages && totalPages > 0);
|
|
6
|
+
return (React.createElement("div", { className: `flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between ${props.className || ""}` },
|
|
7
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-3 text-xs text-slate-400" },
|
|
8
|
+
React.createElement("span", { className: "font-medium text-slate-300" },
|
|
9
|
+
props.resultCount.toLocaleString(),
|
|
10
|
+
" result",
|
|
11
|
+
props.resultCount === 1 ? "" : "s"),
|
|
12
|
+
hasPaginationSummary && (React.createElement("span", { className: "text-slate-500" },
|
|
13
|
+
"Page ",
|
|
14
|
+
currentPage,
|
|
15
|
+
" of ",
|
|
16
|
+
totalPages))),
|
|
17
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-2" }, props.showApplyButton && props.onApplyFilters && (React.createElement(Button, { title: "Apply Filters", buttonStyle: ButtonStyleType.NORMAL, buttonSize: ButtonSize.Small, onClick: props.onApplyFilters })))));
|
|
18
|
+
};
|
|
19
|
+
export default LogsViewerToolbar;
|
|
20
|
+
//# sourceMappingURL=LogsViewerToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogsViewerToolbar.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/LogsViewerToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAC/D,OAAO,MAAM,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAW1E,MAAM,iBAAiB,GAA8C,CACnE,KAA6B,EACf,EAAE;IAChB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,oBAAoB,GAAY,OAAO,CAC3C,WAAW,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,CAC5C,CAAC;IAEF,OAAO,CACL,6BACE,SAAS,EAAE,sEAAsE,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE;QAExG,6BAAK,SAAS,EAAC,0DAA0D;YACvE,8BAAM,SAAS,EAAC,4BAA4B;gBACzC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE;;gBAClC,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAC9B;YACN,oBAAoB,IAAI,CACvB,8BAAM,SAAS,EAAC,gBAAgB;;gBACxB,WAAW;;gBAAM,UAAU,CAC5B,CACR,CACG;QAEN,6BAAK,SAAS,EAAC,mCAAmC,IAC/C,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,cAAc,IAAI,CAChD,oBAAC,MAAM,IACL,KAAK,EAAC,eAAe,EACrB,WAAW,EAAE,eAAe,CAAC,MAAM,EACnC,UAAU,EAAE,UAAU,CAAC,KAAK,EAC5B,OAAO,EAAE,KAAK,CAAC,cAAc,GAC7B,CACH,CACG,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { getSeverityTheme } from "./severityTheme";
|
|
3
|
+
const SeverityBadge = (props) => {
|
|
4
|
+
const label = props.severity
|
|
5
|
+
? props.severity.toString().toUpperCase()
|
|
6
|
+
: "UNKNOWN";
|
|
7
|
+
const theme = getSeverityTheme(props.severity);
|
|
8
|
+
return (React.createElement("span", { className: `inline-flex items-center gap-2 rounded-full px-2.5 py-0.5 text-[11px] font-semibold uppercase tracking-wide ring-1 ring-inset ${theme.badgeClass}` },
|
|
9
|
+
React.createElement("span", { className: `h-1.5 w-1.5 rounded-full ${theme.dotClass}` }),
|
|
10
|
+
React.createElement("span", null, label)));
|
|
11
|
+
};
|
|
12
|
+
export default SeverityBadge;
|
|
13
|
+
//# sourceMappingURL=SeverityBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeverityBadge.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/SeverityBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAiB,MAAM,iBAAiB,CAAC;AAMlE,MAAM,aAAa,GAA0C,CAC3D,KAAyB,EACX,EAAE;IAChB,MAAM,KAAK,GAAW,KAAK,CAAC,QAAQ;QAClC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;QACzC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,KAAK,GAAkB,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9D,OAAO,CACL,8BACE,SAAS,EAAE,iIAAiI,KAAK,CAAC,UAAU,EAAE;QAE9J,8BAAM,SAAS,EAAE,4BAA4B,KAAK,CAAC,QAAQ,EAAE,GAAI;QACjE,kCAAO,KAAK,CAAQ,CACf,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import LogSeverity from "../../../../Types/Log/LogSeverity";
|
|
2
|
+
const severityThemeMap = {
|
|
3
|
+
[LogSeverity.Fatal]: {
|
|
4
|
+
badgeClass: "bg-rose-950/80 text-rose-100 ring-rose-500/40",
|
|
5
|
+
dotClass: "bg-rose-500",
|
|
6
|
+
borderClass: "border-rose-500/50",
|
|
7
|
+
textClass: "text-rose-100",
|
|
8
|
+
},
|
|
9
|
+
[LogSeverity.Error]: {
|
|
10
|
+
badgeClass: "bg-rose-900/60 text-rose-100 ring-rose-500/30",
|
|
11
|
+
dotClass: "bg-rose-400",
|
|
12
|
+
borderClass: "border-rose-500/40",
|
|
13
|
+
textClass: "text-rose-100",
|
|
14
|
+
},
|
|
15
|
+
[LogSeverity.Warning]: {
|
|
16
|
+
badgeClass: "bg-amber-900/50 text-amber-100 ring-amber-500/30",
|
|
17
|
+
dotClass: "bg-amber-400",
|
|
18
|
+
borderClass: "border-amber-400/40",
|
|
19
|
+
textClass: "text-amber-100",
|
|
20
|
+
},
|
|
21
|
+
[LogSeverity.Information]: {
|
|
22
|
+
badgeClass: "bg-sky-900/50 text-sky-100 ring-sky-500/30",
|
|
23
|
+
dotClass: "bg-sky-400",
|
|
24
|
+
borderClass: "border-sky-400/40",
|
|
25
|
+
textClass: "text-sky-100",
|
|
26
|
+
},
|
|
27
|
+
[LogSeverity.Debug]: {
|
|
28
|
+
badgeClass: "bg-purple-900/50 text-purple-100 ring-purple-500/30",
|
|
29
|
+
dotClass: "bg-purple-400",
|
|
30
|
+
borderClass: "border-purple-500/30",
|
|
31
|
+
textClass: "text-purple-100",
|
|
32
|
+
},
|
|
33
|
+
[LogSeverity.Trace]: {
|
|
34
|
+
badgeClass: "bg-slate-900/60 text-slate-300 ring-slate-500/20",
|
|
35
|
+
dotClass: "bg-slate-400",
|
|
36
|
+
borderClass: "border-slate-600/40",
|
|
37
|
+
textClass: "text-slate-200",
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const defaultTheme = {
|
|
41
|
+
badgeClass: "bg-slate-800/60 text-slate-300 ring-slate-600/20",
|
|
42
|
+
dotClass: "bg-slate-500",
|
|
43
|
+
borderClass: "border-slate-700",
|
|
44
|
+
textClass: "text-slate-200",
|
|
45
|
+
};
|
|
46
|
+
export const getSeverityTheme = (severity) => {
|
|
47
|
+
if (!severity) {
|
|
48
|
+
return defaultTheme;
|
|
49
|
+
}
|
|
50
|
+
const normalized = severity.toString();
|
|
51
|
+
return severityThemeMap[normalized] || defaultTheme;
|
|
52
|
+
};
|
|
53
|
+
export default severityThemeMap;
|
|
54
|
+
//# sourceMappingURL=severityTheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severityTheme.js","sourceRoot":"","sources":["../../../../../../UI/Components/LogsViewer/components/severityTheme.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,mCAAmC,CAAC;AAS5D,MAAM,gBAAgB,GAAkC;IACtD,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACnB,UAAU,EAAE,+CAA+C;QAC3D,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,eAAe;KAC3B;IACD,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACnB,UAAU,EAAE,+CAA+C;QAC3D,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,eAAe;KAC3B;IACD,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,kDAAkD;QAC9D,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,qBAAqB;QAClC,SAAS,EAAE,gBAAgB;KAC5B;IACD,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE;QACzB,UAAU,EAAE,4CAA4C;QACxD,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,mBAAmB;QAChC,SAAS,EAAE,cAAc;KAC1B;IACD,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACnB,UAAU,EAAE,qDAAqD;QACjE,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,sBAAsB;QACnC,SAAS,EAAE,iBAAiB;KAC7B;IACD,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACnB,UAAU,EAAE,kDAAkD;QAC9D,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,qBAAqB;QAClC,SAAS,EAAE,gBAAgB;KAC5B;CACF,CAAC;AAEF,MAAM,YAAY,GAAkB;IAClC,UAAU,EAAE,kDAAkD;IAC9D,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAER,CACnB,QAAsC,EACvB,EAAE;IACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,UAAU,GAAW,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC/C,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC;AACtD,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|