@parca/profile 0.16.114 → 0.16.116
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/CHANGELOG.md +8 -0
- package/dist/MetricsGraph/index.d.ts +2 -2
- package/dist/MetricsGraph/index.js +3 -2
- package/dist/ProfileExplorer/index.js +71 -75
- package/dist/ProfileMetricsGraph/index.d.ts +3 -3
- package/dist/ProfileMetricsGraph/index.js +7 -5
- package/dist/ProfileSelector/index.d.ts +2 -1
- package/dist/ProfileSelector/index.js +27 -21
- package/dist/ProfileSource.d.ts +11 -36
- package/dist/ProfileSource.js +30 -125
- package/dist/styles.css +1 -1
- package/package.json +7 -7
- package/src/MetricsGraph/index.tsx +5 -5
- package/src/ProfileExplorer/index.tsx +108 -80
- package/src/ProfileMetricsGraph/index.tsx +9 -8
- package/src/ProfileSelector/index.tsx +35 -22
- package/src/ProfileSource.tsx +62 -164
- package/dist/ProfileSelector/MergeButton.d.ts +0 -6
- package/dist/ProfileSelector/MergeButton.js +0 -41
- package/src/ProfileSelector/MergeButton.tsx +0 -72
package/dist/ProfileSource.js
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
__assign = Object.assign || function(t) {
|
|
3
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
-
s = arguments[i];
|
|
5
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
-
t[p] = s[p];
|
|
7
|
-
}
|
|
8
|
-
return t;
|
|
9
|
-
};
|
|
10
|
-
return __assign.apply(this, arguments);
|
|
11
|
-
};
|
|
12
|
-
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
2
|
// Copyright 2022 The Parca Authors
|
|
14
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
15
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -46,135 +35,45 @@ export function ParseLabels(labels) {
|
|
|
46
35
|
return { name: parts[0], value: parts[1] };
|
|
47
36
|
});
|
|
48
37
|
}
|
|
49
|
-
export function ProfileSelectionFromParams(expression, from, to,
|
|
50
|
-
if (
|
|
51
|
-
merge === 'true' &&
|
|
52
|
-
from !== undefined &&
|
|
38
|
+
export function ProfileSelectionFromParams(expression, from, to, mergeFrom, mergeTo, labels, filterQuery) {
|
|
39
|
+
if (from !== undefined &&
|
|
53
40
|
to !== undefined &&
|
|
41
|
+
mergeFrom !== undefined &&
|
|
42
|
+
mergeTo !== undefined &&
|
|
54
43
|
expression !== undefined) {
|
|
55
|
-
return new MergedProfileSelection(parseInt(
|
|
56
|
-
}
|
|
57
|
-
if (labels !== undefined && time !== undefined && profileName !== undefined) {
|
|
58
|
-
return new SingleProfileSelection(profileName, ParseLabels(labels), parseInt(time), filterQuery);
|
|
44
|
+
return new MergedProfileSelection(parseInt(mergeFrom), parseInt(mergeTo), ParseLabels(labels !== null && labels !== void 0 ? labels : ['']), expression, filterQuery);
|
|
59
45
|
}
|
|
60
46
|
return null;
|
|
61
47
|
}
|
|
62
|
-
var SingleProfileSelection = /** @class */ (function () {
|
|
63
|
-
function SingleProfileSelection(profileName, labels, time, filterQuery) {
|
|
64
|
-
this.profileName = profileName;
|
|
65
|
-
this.labels = labels;
|
|
66
|
-
this.time = time;
|
|
67
|
-
this.filterQuery = filterQuery;
|
|
68
|
-
}
|
|
69
|
-
SingleProfileSelection.prototype.ProfileName = function () {
|
|
70
|
-
return this.profileName;
|
|
71
|
-
};
|
|
72
|
-
SingleProfileSelection.prototype.HistoryParams = function () {
|
|
73
|
-
return {
|
|
74
|
-
profile_name: this.profileName,
|
|
75
|
-
labels: this.labels.map(function (label) { return "".concat(label.name, "=").concat(encodeURIComponent(label.value)); }),
|
|
76
|
-
time: this.time,
|
|
77
|
-
};
|
|
78
|
-
};
|
|
79
|
-
SingleProfileSelection.prototype.Type = function () {
|
|
80
|
-
return 'single';
|
|
81
|
-
};
|
|
82
|
-
SingleProfileSelection.prototype.ProfileSource = function () {
|
|
83
|
-
return new SingleProfileSource(this.profileName, this.labels, this.time, this.filterQuery);
|
|
84
|
-
};
|
|
85
|
-
return SingleProfileSelection;
|
|
86
|
-
}());
|
|
87
|
-
export { SingleProfileSelection };
|
|
88
48
|
var MergedProfileSelection = /** @class */ (function () {
|
|
89
|
-
function MergedProfileSelection(
|
|
90
|
-
this.
|
|
91
|
-
this.
|
|
49
|
+
function MergedProfileSelection(mergeFrom, mergeTo, labels, query, filterQuery) {
|
|
50
|
+
this.mergeFrom = mergeFrom;
|
|
51
|
+
this.mergeTo = mergeTo;
|
|
92
52
|
this.query = query;
|
|
93
53
|
this.filterQuery = filterQuery;
|
|
54
|
+
this.labels = labels;
|
|
94
55
|
}
|
|
95
56
|
MergedProfileSelection.prototype.ProfileName = function () {
|
|
96
57
|
return Query.parse(this.query).profileName();
|
|
97
58
|
};
|
|
98
59
|
MergedProfileSelection.prototype.HistoryParams = function () {
|
|
99
60
|
return {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
to: this.to.toString(),
|
|
61
|
+
merge_from: this.mergeFrom.toString(),
|
|
62
|
+
merge_to: this.mergeTo.toString(),
|
|
103
63
|
query: this.query,
|
|
64
|
+
profile_name: this.ProfileName(),
|
|
65
|
+
labels: this.labels.map(function (label) { return "".concat(label.name, "=").concat(encodeURIComponent(label.value)); }),
|
|
104
66
|
};
|
|
105
67
|
};
|
|
106
68
|
MergedProfileSelection.prototype.Type = function () {
|
|
107
69
|
return 'merge';
|
|
108
70
|
};
|
|
109
71
|
MergedProfileSelection.prototype.ProfileSource = function () {
|
|
110
|
-
return new MergedProfileSource(this.
|
|
72
|
+
return new MergedProfileSource(this.mergeFrom, this.mergeTo, this.labels, this.query, this.filterQuery);
|
|
111
73
|
};
|
|
112
74
|
return MergedProfileSelection;
|
|
113
75
|
}());
|
|
114
76
|
export { MergedProfileSelection };
|
|
115
|
-
var SingleProfileSource = /** @class */ (function () {
|
|
116
|
-
function SingleProfileSource(profileName, labels, time, filterQuery) {
|
|
117
|
-
this.profName = profileName;
|
|
118
|
-
this.labels = labels;
|
|
119
|
-
this.time = time;
|
|
120
|
-
this.filterQuery = filterQuery;
|
|
121
|
-
}
|
|
122
|
-
SingleProfileSource.prototype.query = function () {
|
|
123
|
-
var seriesQuery = this.profName +
|
|
124
|
-
this.labels.reduce(function (agg, label) {
|
|
125
|
-
return agg + "".concat(label.name, "=\"").concat(label.value, "\",");
|
|
126
|
-
}, '{');
|
|
127
|
-
return seriesQuery + '}';
|
|
128
|
-
};
|
|
129
|
-
SingleProfileSource.prototype.DiffSelection = function () {
|
|
130
|
-
return {
|
|
131
|
-
options: {
|
|
132
|
-
oneofKind: 'single',
|
|
133
|
-
single: {
|
|
134
|
-
time: Timestamp.fromDate(new Date(this.time)),
|
|
135
|
-
query: this.query(),
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
mode: ProfileDiffSelection_Mode.SINGLE_UNSPECIFIED,
|
|
139
|
-
};
|
|
140
|
-
};
|
|
141
|
-
SingleProfileSource.prototype.QueryRequest = function () {
|
|
142
|
-
return {
|
|
143
|
-
options: {
|
|
144
|
-
oneofKind: 'single',
|
|
145
|
-
single: {
|
|
146
|
-
time: Timestamp.fromDate(new Date(this.time)),
|
|
147
|
-
query: this.query(),
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
reportType: QueryRequest_ReportType.FLAMEGRAPH_UNSPECIFIED,
|
|
151
|
-
mode: QueryRequest_Mode.SINGLE_UNSPECIFIED,
|
|
152
|
-
filterQuery: this.filterQuery,
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
SingleProfileSource.prototype.ProfileType = function () {
|
|
156
|
-
return ProfileType.fromString(this.profName);
|
|
157
|
-
};
|
|
158
|
-
SingleProfileSource.prototype.profileName = function () {
|
|
159
|
-
return this.profName;
|
|
160
|
-
};
|
|
161
|
-
SingleProfileSource.prototype.Describe = function () {
|
|
162
|
-
var profileName = this.profileName();
|
|
163
|
-
return (_jsxs(_Fragment, { children: [_jsxs("p", { children: [profileName !== '' ? _jsxs("a", { children: [profileName, " profile of "] }) : '', ' ', this.labels
|
|
164
|
-
.filter(function (label) { return label.name !== '__name__'; })
|
|
165
|
-
.map(function (label) { return (_jsx("button", __assign({ type: "button", className: "inline-block rounded-lg text-gray-700 bg-gray-200 dark:bg-gray-700 dark:text-gray-400 px-2 py-1 text-xs font-bold mr-3" }, { children: "".concat(label.name, "=\"").concat(label.value, "\"") }), label.name)); })] }), _jsx("p", { children: formatDate(this.time, timeFormat) })] }));
|
|
166
|
-
};
|
|
167
|
-
SingleProfileSource.prototype.stringLabels = function () {
|
|
168
|
-
return this.labels
|
|
169
|
-
.filter(function (label) { return label.name !== '__name__'; })
|
|
170
|
-
.map(function (label) { return "".concat(label.name, "=").concat(label.value); });
|
|
171
|
-
};
|
|
172
|
-
SingleProfileSource.prototype.toString = function () {
|
|
173
|
-
return "single profile of type ".concat(this.profileName(), " with labels ").concat(this.stringLabels().join(', '), " collected at ").concat(formatDate(this.time, timeFormat));
|
|
174
|
-
};
|
|
175
|
-
return SingleProfileSource;
|
|
176
|
-
}());
|
|
177
|
-
export { SingleProfileSource };
|
|
178
77
|
var ProfileDiffSource = /** @class */ (function () {
|
|
179
78
|
function ProfileDiffSource(a, b, filterQuery) {
|
|
180
79
|
this.a = a;
|
|
@@ -211,9 +110,10 @@ var ProfileDiffSource = /** @class */ (function () {
|
|
|
211
110
|
}());
|
|
212
111
|
export { ProfileDiffSource };
|
|
213
112
|
var MergedProfileSource = /** @class */ (function () {
|
|
214
|
-
function MergedProfileSource(
|
|
215
|
-
this.
|
|
216
|
-
this.
|
|
113
|
+
function MergedProfileSource(mergeFrom, mergeTo, labels, query, filterQuery) {
|
|
114
|
+
this.mergeFrom = mergeFrom;
|
|
115
|
+
this.mergeTo = mergeTo;
|
|
116
|
+
this.labels = labels;
|
|
217
117
|
this.query = query;
|
|
218
118
|
this.filterQuery = filterQuery;
|
|
219
119
|
}
|
|
@@ -222,8 +122,8 @@ var MergedProfileSource = /** @class */ (function () {
|
|
|
222
122
|
options: {
|
|
223
123
|
oneofKind: 'merge',
|
|
224
124
|
merge: {
|
|
225
|
-
start: Timestamp.fromDate(new Date(this.
|
|
226
|
-
end: Timestamp.fromDate(new Date(this.
|
|
125
|
+
start: Timestamp.fromDate(new Date(this.mergeFrom)),
|
|
126
|
+
end: Timestamp.fromDate(new Date(this.mergeTo)),
|
|
227
127
|
query: this.query,
|
|
228
128
|
},
|
|
229
129
|
},
|
|
@@ -235,8 +135,8 @@ var MergedProfileSource = /** @class */ (function () {
|
|
|
235
135
|
options: {
|
|
236
136
|
oneofKind: 'merge',
|
|
237
137
|
merge: {
|
|
238
|
-
start: Timestamp.fromDate(new Date(this.
|
|
239
|
-
end: Timestamp.fromDate(new Date(this.
|
|
138
|
+
start: Timestamp.fromDate(new Date(this.mergeFrom)),
|
|
139
|
+
end: Timestamp.fromDate(new Date(this.mergeTo)),
|
|
240
140
|
query: this.query,
|
|
241
141
|
},
|
|
242
142
|
},
|
|
@@ -249,10 +149,15 @@ var MergedProfileSource = /** @class */ (function () {
|
|
|
249
149
|
return ProfileType.fromString(Query.parse(this.query).profileName());
|
|
250
150
|
};
|
|
251
151
|
MergedProfileSource.prototype.Describe = function () {
|
|
252
|
-
return (_jsxs("a", { children: ["Merge of \"", this.query, "\" from ", formatDate(this.
|
|
152
|
+
return (_jsxs("a", { children: ["Merge of \"", this.query, "\" from ", formatDate(this.mergeFrom, timeFormat), " to", ' ', formatDate(this.mergeTo, timeFormat)] }));
|
|
153
|
+
};
|
|
154
|
+
MergedProfileSource.prototype.stringLabels = function () {
|
|
155
|
+
return this.labels
|
|
156
|
+
.filter(function (label) { return label.name !== '__name__'; })
|
|
157
|
+
.map(function (label) { return "".concat(label.name, "=").concat(label.value); });
|
|
253
158
|
};
|
|
254
159
|
MergedProfileSource.prototype.toString = function () {
|
|
255
|
-
return "merged profiles of query \"".concat(this.query, "\" from ").concat(formatDate(this.
|
|
160
|
+
return "merged profiles of query \"".concat(this.query, "\" from ").concat(formatDate(this.mergeFrom, timeFormat), " to ").concat(formatDate(this.mergeTo, timeFormat));
|
|
256
161
|
};
|
|
257
162
|
return MergedProfileSource;
|
|
258
163
|
}());
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.absolute{position:absolute}.relative{position:relative}.left-\[25px\]{left:25px}.left-0{left:0}.top-\[-46px\]{top:-46px}.right-0{right:0}.top-\[-45px\]{top:-45px}.top-\[-48px\]{top:-48px}.top-\[-69px\]{top:-69px}.top-\[-54px\]{top:-54px}.top-\[-70px\]{top:-70px}.z-50{z-index:50}.z-10{z-index:10}.m-auto{margin:auto}.m-0{margin:0}.m-2{margin:.5rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-20{margin-bottom:5rem;margin-top:5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.mr-3{margin-right:.75rem}.ml-2{margin-left:.5rem}.mr-6{margin-right:1.5rem}.mt-2{margin-top:.5rem}.mt-1{margin-top:.25rem}.ml-auto{margin-left:auto}.mb-2{margin-bottom:.5rem}.mr-1{margin-right:.25rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.grid{display:grid}.h-36{height:9rem}.h-1{height:.25rem}.h-\[80vh\]{height:80vh}.h-4{height:1rem}.max-h-\[400px\]{max-height:400px}.w-auto{width:auto}.w-1\/5{width:20%}.w-4\/5{width:80%}.w-full{width:100%}.w-40{width:10rem}.w-2\/5{width:40%}.w-1\/2{width:50%}.w-8{width:2rem}.w-1\/4{width:25%}.w-3\/4{width:75%}.w-4{width:1rem}.w-16{width:4rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-\[420px\]{width:420px}.min-w-\[300px\]{min-width:300px}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.translate-y-1{--tw-translate-y:0.25rem}.translate-y-0,.translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-1{gap:.25rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded-lg{border-radius:.5rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.border{border-width:1px}.border-r-0{border-right-width:0}.border-l-0{border-left-width:0}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-inherit{background-color:inherit}.fill-transparent{fill:transparent}.fill-current{fill:currentColor}.p-3{padding:.75rem}.p-10{padding:2.5rem}.p-4{padding:1rem}.p-1{padding:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-20{padding-bottom:5rem;padding-top:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-1{padding-left:.25rem;padding-right:.25rem}.pl-3{padding-left:.75rem}.pr-9{padding-right:2.25rem}.pt-2{padding-top:.5rem}.pb-4{padding-bottom:1rem}.pr-2{padding-right:.5rem}.pl-2{padding-left:.5rem}.pb-2{padding-bottom:.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.\!text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.blur{--tw-blur:blur(8px)}.blur,.invert{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)}.invert{--tw-invert:invert(100%)}.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)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-150{transition-duration:.15s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}[class~=theme-dark] .dark\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}[class~=theme-dark] .dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}[class~=theme-dark] .dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}[class~=theme-dark] .dark\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}[class~=theme-dark] .dark\:\!text-indigo-400{--tw-text-opacity:1!important;color:rgb(129 140 248/var(--tw-text-opacity))!important}@media (min-width:640px){.sm\:inline{display:inline}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}
|
|
1
|
+
/*! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.absolute{position:absolute}.relative{position:relative}.left-\[25px\]{left:25px}.left-0{left:0}.top-\[-46px\]{top:-46px}.right-0{right:0}.top-\[-45px\]{top:-45px}.top-\[-48px\]{top:-48px}.top-\[-69px\]{top:-69px}.top-\[-54px\]{top:-54px}.top-\[-70px\]{top:-70px}.z-50{z-index:50}.z-10{z-index:10}.m-auto{margin:auto}.m-0{margin:0}.m-2{margin:.5rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-20{margin-bottom:5rem;margin-top:5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.ml-2{margin-left:.5rem}.mr-6{margin-right:1.5rem}.mt-2{margin-top:.5rem}.mt-1{margin-top:.25rem}.ml-auto{margin-left:auto}.mb-2{margin-bottom:.5rem}.mr-3{margin-right:.75rem}.mr-1{margin-right:.25rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.grid{display:grid}.h-36{height:9rem}.h-1{height:.25rem}.h-\[80vh\]{height:80vh}.h-4{height:1rem}.max-h-\[400px\]{max-height:400px}.w-auto{width:auto}.w-1\/5{width:20%}.w-4\/5{width:80%}.w-full{width:100%}.w-40{width:10rem}.w-2\/5{width:40%}.w-1\/2{width:50%}.w-8{width:2rem}.w-1\/4{width:25%}.w-3\/4{width:75%}.w-4{width:1rem}.w-16{width:4rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-\[420px\]{width:420px}.min-w-\[300px\]{min-width:300px}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.translate-y-1{--tw-translate-y:0.25rem}.translate-y-0,.translate-y-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-1{gap:.25rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.border{border-width:1px}.border-r-0{border-right-width:0}.border-l-0{border-left-width:0}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-inherit{background-color:inherit}.fill-transparent{fill:transparent}.fill-current{fill:currentColor}.p-3{padding:.75rem}.p-10{padding:2.5rem}.p-4{padding:1rem}.p-1{padding:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-20{padding-bottom:5rem;padding-top:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.pl-3{padding-left:.75rem}.pr-9{padding-right:2.25rem}.pt-2{padding-top:.5rem}.pb-4{padding-bottom:1rem}.pr-2{padding-right:.5rem}.pl-2{padding-left:.5rem}.pb-2{padding-bottom:.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-semibold{font-weight:600}.font-bold{font-weight:700}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.\!text-indigo-600{--tw-text-opacity:1!important;color:rgb(79 70 229/var(--tw-text-opacity))!important}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.blur{--tw-blur:blur(8px)}.blur,.invert{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)}.invert{--tw-invert:invert(100%)}.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)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-150{transition-duration:.15s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}[class~=theme-dark] .dark\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}[class~=theme-dark] .dark\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}[class~=theme-dark] .dark\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}[class~=theme-dark] .dark\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}[class~=theme-dark] .dark\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}[class~=theme-dark] .dark\:\!text-indigo-400{--tw-text-opacity:1!important;color:rgb(129 140 248/var(--tw-text-opacity))!important}@media (min-width:640px){.sm\:inline{display:inline}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parca/profile",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.116",
|
|
4
4
|
"description": "Profile viewing libraries",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@parca/client": "^0.16.
|
|
7
|
-
"@parca/components": "^0.16.
|
|
6
|
+
"@parca/client": "^0.16.63",
|
|
7
|
+
"@parca/components": "^0.16.97",
|
|
8
8
|
"@parca/dynamicsize": "^0.16.52",
|
|
9
|
-
"@parca/functions": "^0.16.
|
|
9
|
+
"@parca/functions": "^0.16.61",
|
|
10
10
|
"@parca/parser": "^0.16.53",
|
|
11
|
-
"@parca/store": "^0.16.
|
|
11
|
+
"@parca/store": "^0.16.57",
|
|
12
12
|
"@types/react-beautiful-dnd": "^13.1.3",
|
|
13
13
|
"d3": "7.8.2",
|
|
14
14
|
"d3-scale": "^4.0.2",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"react-copy-to-clipboard": "^5.1.0",
|
|
20
20
|
"react-cytoscapejs": "1.2.1",
|
|
21
21
|
"react-flame-graph": "^1.4.0",
|
|
22
|
-
"react-konva": "18.2.
|
|
22
|
+
"react-konva": "18.2.4",
|
|
23
23
|
"react-query": "^3.39.2",
|
|
24
24
|
"react-textarea-autosize": "^8.4.0"
|
|
25
25
|
},
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"access": "public",
|
|
46
46
|
"registry": "https://registry.npmjs.org/"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "e9b6f88b6388b9b9889de093cd83939c79af8e6e"
|
|
49
49
|
}
|
|
@@ -18,20 +18,20 @@ import throttle from 'lodash.throttle';
|
|
|
18
18
|
|
|
19
19
|
import {DateTimeRange, useKeyDown} from '@parca/components';
|
|
20
20
|
import {useContainerDimensions} from '@parca/dynamicsize';
|
|
21
|
-
import {formatForTimespan} from '@parca/functions
|
|
21
|
+
import {formatForTimespan} from '@parca/functions';
|
|
22
22
|
import {MetricsSeries as MetricsSeriesPb, MetricsSample, Label} from '@parca/client';
|
|
23
23
|
import {valueFormatter, formatDate, sanitizeHighlightedValues} from '@parca/functions';
|
|
24
24
|
|
|
25
25
|
import MetricsSeries from '../MetricsSeries';
|
|
26
26
|
import MetricsCircle from '../MetricsCircle';
|
|
27
27
|
import MetricsTooltip from './MetricsTooltip';
|
|
28
|
-
import {
|
|
28
|
+
import {MergedProfileSelection} from '..';
|
|
29
29
|
|
|
30
30
|
interface Props {
|
|
31
31
|
data: MetricsSeriesPb[];
|
|
32
32
|
from: number;
|
|
33
33
|
to: number;
|
|
34
|
-
profile:
|
|
34
|
+
profile: MergedProfileSelection | null;
|
|
35
35
|
onSampleClick: (timestamp: number, value: number, labels: Label[]) => void;
|
|
36
36
|
onLabelClick: (labelName: string, labelValue: string) => void;
|
|
37
37
|
setTimeRange: (range: DateTimeRange) => void;
|
|
@@ -113,7 +113,8 @@ export const RawMetricsGraph = ({
|
|
|
113
113
|
const metricPointRef = useRef(null);
|
|
114
114
|
const {isShiftDown} = useKeyDown();
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
// the time of the selected point is the start of the merge window
|
|
117
|
+
const time: number = parseFloat(profile?.HistoryParams().merge_from);
|
|
117
118
|
|
|
118
119
|
if (width === undefined || width == null) {
|
|
119
120
|
width = 0;
|
|
@@ -326,7 +327,6 @@ export const RawMetricsGraph = ({
|
|
|
326
327
|
};
|
|
327
328
|
|
|
328
329
|
const selected = findSelectedProfile();
|
|
329
|
-
|
|
330
330
|
return (
|
|
331
331
|
<>
|
|
332
332
|
{highlighted != null && hovering && !dragging && pos[0] !== 0 && pos[1] !== 0 && (
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
|
|
14
|
+
import {useEffect, useState} from 'react';
|
|
14
15
|
import {QuerySelection, useProfileTypes} from '../ProfileSelector';
|
|
15
16
|
import {ProfileSelection, ProfileSelectionFromParams, SuffixParams} from '..';
|
|
16
17
|
import ProfileExplorerSingle from './ProfileExplorerSingle';
|
|
@@ -74,33 +75,98 @@ const ProfileExplorerApp = ({
|
|
|
74
75
|
const {
|
|
75
76
|
loading: profileTypesLoading,
|
|
76
77
|
data: profileTypesData,
|
|
77
|
-
error,
|
|
78
|
+
error: profileTypesError,
|
|
78
79
|
} = useProfileTypes(queryClient);
|
|
79
80
|
|
|
80
|
-
const {loader, noDataPrompt} = useParcaContext();
|
|
81
|
+
const {loader, noDataPrompt, onError} = useParcaContext();
|
|
82
|
+
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (profileTypesError !== undefined && profileTypesError !== null) {
|
|
85
|
+
onError?.(profileTypesError, 'ProfileExplorer');
|
|
86
|
+
}
|
|
87
|
+
}, [profileTypesError, onError]);
|
|
81
88
|
|
|
82
89
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
83
90
|
let {
|
|
84
91
|
from_a,
|
|
85
92
|
to_a,
|
|
86
|
-
merge_a,
|
|
87
93
|
profile_name_a,
|
|
88
94
|
labels_a,
|
|
89
|
-
|
|
95
|
+
merge_from_a,
|
|
96
|
+
merge_to_a,
|
|
90
97
|
time_selection_a,
|
|
91
98
|
compare_a,
|
|
92
99
|
from_b,
|
|
93
100
|
to_b,
|
|
94
|
-
merge_b,
|
|
95
101
|
profile_name_b,
|
|
96
102
|
labels_b,
|
|
97
|
-
|
|
103
|
+
merge_from_b,
|
|
104
|
+
merge_to_b,
|
|
98
105
|
time_selection_b,
|
|
99
106
|
compare_b,
|
|
100
107
|
filter_by_function,
|
|
101
108
|
dashboard_items,
|
|
102
109
|
} = queryParams;
|
|
110
|
+
|
|
103
111
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
112
|
+
const [profileA, setProfileA] = useState<ProfileSelection | null>(null);
|
|
113
|
+
const [profileB, setProfileB] = useState<ProfileSelection | null>(null);
|
|
114
|
+
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
const mergeFrom = merge_from_a ?? undefined;
|
|
117
|
+
const mergeTo = merge_to_a ?? undefined;
|
|
118
|
+
const labels = (labels_a as string[]) ?? [''];
|
|
119
|
+
const profileA = ProfileSelectionFromParams(
|
|
120
|
+
expression_a,
|
|
121
|
+
from_a as string,
|
|
122
|
+
to_a as string,
|
|
123
|
+
mergeFrom as string,
|
|
124
|
+
mergeTo as string,
|
|
125
|
+
labels,
|
|
126
|
+
filter_by_function as string
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
setProfileA(profileA);
|
|
130
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
131
|
+
}, [merge_from_a, merge_to_a]);
|
|
132
|
+
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
const mergeFrom = merge_from_b ?? undefined;
|
|
135
|
+
const mergeTo = merge_to_b ?? undefined;
|
|
136
|
+
const labels = (labels_b as string[]) ?? [''];
|
|
137
|
+
const profileB = ProfileSelectionFromParams(
|
|
138
|
+
expression_b,
|
|
139
|
+
from_b as string,
|
|
140
|
+
to_b as string,
|
|
141
|
+
mergeFrom as string,
|
|
142
|
+
mergeTo as string,
|
|
143
|
+
labels,
|
|
144
|
+
filter_by_function as string
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
setProfileB(profileB);
|
|
148
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
149
|
+
}, [merge_from_b, merge_to_b]);
|
|
150
|
+
|
|
151
|
+
if (profileTypesLoading) {
|
|
152
|
+
return <>{loader}</>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (profileTypesData?.types.length === 0) {
|
|
156
|
+
return <>{noDataPrompt}</>;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (profileTypesError !== undefined && profileTypesError !== null) {
|
|
160
|
+
return (
|
|
161
|
+
<div
|
|
162
|
+
className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative"
|
|
163
|
+
role="alert"
|
|
164
|
+
>
|
|
165
|
+
<strong className="font-bold">Error! </strong>
|
|
166
|
+
<span className="block sm:inline">{profileTypesError.message}</span>
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
104
170
|
|
|
105
171
|
const sanitizedRange = sanitizeDateRange(time_selection_a, from_a, to_a);
|
|
106
172
|
time_selection_a = sanitizedRange.time_selection_a;
|
|
@@ -134,37 +200,21 @@ const ProfileExplorerApp = ({
|
|
|
134
200
|
return selectProfile(p, '_b');
|
|
135
201
|
};
|
|
136
202
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
203
|
+
const queryA = {
|
|
204
|
+
expression: expression_a,
|
|
205
|
+
from: parseInt(from_a as string),
|
|
206
|
+
to: parseInt(to_a as string),
|
|
207
|
+
timeSelection: time_selection_a as string,
|
|
208
|
+
profile_name: profile_name_a as string,
|
|
209
|
+
};
|
|
144
210
|
|
|
145
211
|
// Show the SingleProfileExplorer when not comparing
|
|
146
212
|
if (compare_a !== 'true' && compare_b !== 'true') {
|
|
147
|
-
const query = {
|
|
148
|
-
expression: expression_a,
|
|
149
|
-
from: parseInt(from_a as string),
|
|
150
|
-
to: parseInt(to_a as string),
|
|
151
|
-
merge: (merge_a as string) === 'true',
|
|
152
|
-
profile_name: profile_name_a as string,
|
|
153
|
-
timeSelection: time_selection_a as string,
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
const profile = ProfileSelectionFromParams(
|
|
157
|
-
expression_a,
|
|
158
|
-
from_a as string,
|
|
159
|
-
to_a as string,
|
|
160
|
-
merge_a as string,
|
|
161
|
-
labels_a as string[],
|
|
162
|
-
profile_name_a as string,
|
|
163
|
-
time_a as string,
|
|
164
|
-
filter_by_function
|
|
165
|
-
);
|
|
166
|
-
|
|
167
213
|
const selectQuery = (q: QuerySelection): void => {
|
|
214
|
+
const mergeParams =
|
|
215
|
+
q.mergeFrom !== undefined && q.mergeTo !== undefined
|
|
216
|
+
? {merge_from_a: q.mergeFrom, merge_to_a: q.mergeTo}
|
|
217
|
+
: {};
|
|
168
218
|
return navigateTo(
|
|
169
219
|
'/',
|
|
170
220
|
// Filtering the _a suffix causes us to reset potential profile
|
|
@@ -175,9 +225,9 @@ const ProfileExplorerApp = ({
|
|
|
175
225
|
expression_a: encodeURIComponent(q.expression),
|
|
176
226
|
from_a: q.from.toString(),
|
|
177
227
|
to_a: q.to.toString(),
|
|
178
|
-
merge_a: q.merge,
|
|
179
228
|
time_selection_a: q.timeSelection,
|
|
180
229
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
230
|
+
...mergeParams,
|
|
181
231
|
},
|
|
182
232
|
}
|
|
183
233
|
);
|
|
@@ -195,25 +245,23 @@ const ProfileExplorerApp = ({
|
|
|
195
245
|
const compareProfile = (): void => {
|
|
196
246
|
let compareQuery = {
|
|
197
247
|
compare_a: 'true',
|
|
198
|
-
expression_a: encodeURIComponent(
|
|
199
|
-
from_a:
|
|
200
|
-
to_a:
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
profile_name_a: query.profile_name,
|
|
248
|
+
expression_a: encodeURIComponent(queryA.expression),
|
|
249
|
+
from_a: queryA.from.toString(),
|
|
250
|
+
to_a: queryA.to.toString(),
|
|
251
|
+
time_selection_a: queryA.timeSelection,
|
|
252
|
+
profile_name_a: queryA.profile_name,
|
|
204
253
|
|
|
205
254
|
compare_b: 'true',
|
|
206
|
-
expression_b: encodeURIComponent(
|
|
207
|
-
from_b:
|
|
208
|
-
to_b:
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
profile_name_b: query.profile_name,
|
|
255
|
+
expression_b: encodeURIComponent(queryA.expression),
|
|
256
|
+
from_b: queryA.from.toString(),
|
|
257
|
+
to_b: queryA.to.toString(),
|
|
258
|
+
time_selection_b: queryA.timeSelection,
|
|
259
|
+
profile_name_b: queryA.profile_name,
|
|
212
260
|
};
|
|
213
261
|
|
|
214
|
-
if (
|
|
262
|
+
if (profileA != null) {
|
|
215
263
|
compareQuery = {
|
|
216
|
-
...SuffixParams(
|
|
264
|
+
...SuffixParams(profileA.HistoryParams(), '_a'),
|
|
217
265
|
...compareQuery,
|
|
218
266
|
};
|
|
219
267
|
}
|
|
@@ -228,8 +276,8 @@ const ProfileExplorerApp = ({
|
|
|
228
276
|
return (
|
|
229
277
|
<ProfileExplorerSingle
|
|
230
278
|
queryClient={queryClient}
|
|
231
|
-
query={
|
|
232
|
-
profile={
|
|
279
|
+
query={queryA}
|
|
280
|
+
profile={profileA}
|
|
233
281
|
selectQuery={selectQuery}
|
|
234
282
|
selectProfile={selectProfile}
|
|
235
283
|
compareProfile={compareProfile}
|
|
@@ -238,43 +286,19 @@ const ProfileExplorerApp = ({
|
|
|
238
286
|
);
|
|
239
287
|
}
|
|
240
288
|
|
|
241
|
-
const queryA = {
|
|
242
|
-
expression: expression_a,
|
|
243
|
-
from: parseInt(from_a as string),
|
|
244
|
-
to: parseInt(to_a as string),
|
|
245
|
-
merge: (merge_a as string) === 'true',
|
|
246
|
-
timeSelection: time_selection_a as string,
|
|
247
|
-
profile_name: profile_name_a as string,
|
|
248
|
-
};
|
|
249
289
|
const queryB = {
|
|
250
290
|
expression: expression_b,
|
|
251
291
|
from: parseInt(from_b as string),
|
|
252
292
|
to: parseInt(to_b as string),
|
|
253
|
-
merge: (merge_b as string) === 'true',
|
|
254
293
|
timeSelection: time_selection_b as string,
|
|
255
294
|
profile_name: profile_name_b as string,
|
|
256
295
|
};
|
|
257
296
|
|
|
258
|
-
const profileA = ProfileSelectionFromParams(
|
|
259
|
-
expression_a,
|
|
260
|
-
from_a as string,
|
|
261
|
-
to_a as string,
|
|
262
|
-
merge_a as string,
|
|
263
|
-
labels_a as string[],
|
|
264
|
-
profile_name_a as string,
|
|
265
|
-
time_a as string
|
|
266
|
-
);
|
|
267
|
-
const profileB = ProfileSelectionFromParams(
|
|
268
|
-
expression_b,
|
|
269
|
-
from_b as string,
|
|
270
|
-
to_b as string,
|
|
271
|
-
merge_b as string,
|
|
272
|
-
labels_b as string[],
|
|
273
|
-
profile_name_b as string,
|
|
274
|
-
time_b as string
|
|
275
|
-
);
|
|
276
|
-
|
|
277
297
|
const selectQueryA = (q: QuerySelection): void => {
|
|
298
|
+
const mergeParams =
|
|
299
|
+
q.mergeFrom !== undefined && q.mergeTo !== undefined
|
|
300
|
+
? {merge_from_a: q.mergeFrom, merge_to_a: q.mergeTo}
|
|
301
|
+
: {};
|
|
278
302
|
return navigateTo(
|
|
279
303
|
'/',
|
|
280
304
|
// Filtering the _a suffix causes us to reset potential profile
|
|
@@ -287,16 +311,20 @@ const ProfileExplorerApp = ({
|
|
|
287
311
|
expression_b: encodeURIComponent(expression_b),
|
|
288
312
|
from_a: q.from.toString(),
|
|
289
313
|
to_a: q.to.toString(),
|
|
290
|
-
merge_a: q.merge,
|
|
291
314
|
time_selection_a: q.timeSelection,
|
|
292
315
|
filter_by_function: filter_by_function ?? '',
|
|
293
316
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
317
|
+
...mergeParams,
|
|
294
318
|
},
|
|
295
319
|
}
|
|
296
320
|
);
|
|
297
321
|
};
|
|
298
322
|
|
|
299
323
|
const selectQueryB = (q: QuerySelection): void => {
|
|
324
|
+
const mergeParams =
|
|
325
|
+
q.mergeFrom !== undefined && q.mergeTo !== undefined
|
|
326
|
+
? {merge_from_b: q.mergeFrom, merge_to_b: q.mergeTo}
|
|
327
|
+
: {};
|
|
300
328
|
return navigateTo(
|
|
301
329
|
'/',
|
|
302
330
|
// Filtering the _b suffix causes us to reset potential profile
|
|
@@ -309,10 +337,10 @@ const ProfileExplorerApp = ({
|
|
|
309
337
|
expression_a: encodeURIComponent(expression_a),
|
|
310
338
|
from_b: q.from.toString(),
|
|
311
339
|
to_b: q.to.toString(),
|
|
312
|
-
merge_b: q.merge,
|
|
313
340
|
time_selection_b: q.timeSelection,
|
|
314
341
|
filter_by_function: filter_by_function ?? '',
|
|
315
342
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
343
|
+
...mergeParams,
|
|
316
344
|
},
|
|
317
345
|
}
|
|
318
346
|
);
|