@parca/profile 0.16.115 → 0.16.117
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 +6 -6
- package/src/MetricsGraph/index.tsx +5 -5
- package/src/ProfileExplorer/index.tsx +112 -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.117",
|
|
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.98",
|
|
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",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"access": "public",
|
|
46
46
|
"registry": "https://registry.npmjs.org/"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "15e08a534843878a50763af207e27dde6c19e656"
|
|
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';
|
|
@@ -71,32 +72,101 @@ const ProfileExplorerApp = ({
|
|
|
71
72
|
queryParams,
|
|
72
73
|
navigateTo,
|
|
73
74
|
}: ProfileExplorerProps): JSX.Element => {
|
|
74
|
-
const {
|
|
75
|
+
const {
|
|
76
|
+
loading: profileTypesLoading,
|
|
77
|
+
data: profileTypesData,
|
|
78
|
+
error: profileTypesError,
|
|
79
|
+
} = useProfileTypes(queryClient);
|
|
75
80
|
|
|
76
|
-
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]);
|
|
77
88
|
|
|
78
89
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
79
90
|
let {
|
|
80
91
|
from_a,
|
|
81
92
|
to_a,
|
|
82
|
-
merge_a,
|
|
83
93
|
profile_name_a,
|
|
84
94
|
labels_a,
|
|
85
|
-
|
|
95
|
+
merge_from_a,
|
|
96
|
+
merge_to_a,
|
|
86
97
|
time_selection_a,
|
|
87
98
|
compare_a,
|
|
88
99
|
from_b,
|
|
89
100
|
to_b,
|
|
90
|
-
merge_b,
|
|
91
101
|
profile_name_b,
|
|
92
102
|
labels_b,
|
|
93
|
-
|
|
103
|
+
merge_from_b,
|
|
104
|
+
merge_to_b,
|
|
94
105
|
time_selection_b,
|
|
95
106
|
compare_b,
|
|
96
107
|
filter_by_function,
|
|
97
108
|
dashboard_items,
|
|
98
109
|
} = queryParams;
|
|
110
|
+
|
|
99
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
|
+
}
|
|
100
170
|
|
|
101
171
|
const sanitizedRange = sanitizeDateRange(time_selection_a, from_a, to_a);
|
|
102
172
|
time_selection_a = sanitizedRange.time_selection_a;
|
|
@@ -130,37 +200,21 @@ const ProfileExplorerApp = ({
|
|
|
130
200
|
return selectProfile(p, '_b');
|
|
131
201
|
};
|
|
132
202
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
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
|
+
};
|
|
140
210
|
|
|
141
211
|
// Show the SingleProfileExplorer when not comparing
|
|
142
212
|
if (compare_a !== 'true' && compare_b !== 'true') {
|
|
143
|
-
const query = {
|
|
144
|
-
expression: expression_a,
|
|
145
|
-
from: parseInt(from_a as string),
|
|
146
|
-
to: parseInt(to_a as string),
|
|
147
|
-
merge: (merge_a as string) === 'true',
|
|
148
|
-
profile_name: profile_name_a as string,
|
|
149
|
-
timeSelection: time_selection_a as string,
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const profile = ProfileSelectionFromParams(
|
|
153
|
-
expression_a,
|
|
154
|
-
from_a as string,
|
|
155
|
-
to_a as string,
|
|
156
|
-
merge_a as string,
|
|
157
|
-
labels_a as string[],
|
|
158
|
-
profile_name_a as string,
|
|
159
|
-
time_a as string,
|
|
160
|
-
filter_by_function
|
|
161
|
-
);
|
|
162
|
-
|
|
163
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
|
+
: {};
|
|
164
218
|
return navigateTo(
|
|
165
219
|
'/',
|
|
166
220
|
// Filtering the _a suffix causes us to reset potential profile
|
|
@@ -171,9 +225,9 @@ const ProfileExplorerApp = ({
|
|
|
171
225
|
expression_a: encodeURIComponent(q.expression),
|
|
172
226
|
from_a: q.from.toString(),
|
|
173
227
|
to_a: q.to.toString(),
|
|
174
|
-
merge_a: q.merge,
|
|
175
228
|
time_selection_a: q.timeSelection,
|
|
176
229
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
230
|
+
...mergeParams,
|
|
177
231
|
},
|
|
178
232
|
}
|
|
179
233
|
);
|
|
@@ -191,25 +245,23 @@ const ProfileExplorerApp = ({
|
|
|
191
245
|
const compareProfile = (): void => {
|
|
192
246
|
let compareQuery = {
|
|
193
247
|
compare_a: 'true',
|
|
194
|
-
expression_a: encodeURIComponent(
|
|
195
|
-
from_a:
|
|
196
|
-
to_a:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
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,
|
|
200
253
|
|
|
201
254
|
compare_b: 'true',
|
|
202
|
-
expression_b: encodeURIComponent(
|
|
203
|
-
from_b:
|
|
204
|
-
to_b:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
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,
|
|
208
260
|
};
|
|
209
261
|
|
|
210
|
-
if (
|
|
262
|
+
if (profileA != null) {
|
|
211
263
|
compareQuery = {
|
|
212
|
-
...SuffixParams(
|
|
264
|
+
...SuffixParams(profileA.HistoryParams(), '_a'),
|
|
213
265
|
...compareQuery,
|
|
214
266
|
};
|
|
215
267
|
}
|
|
@@ -224,8 +276,8 @@ const ProfileExplorerApp = ({
|
|
|
224
276
|
return (
|
|
225
277
|
<ProfileExplorerSingle
|
|
226
278
|
queryClient={queryClient}
|
|
227
|
-
query={
|
|
228
|
-
profile={
|
|
279
|
+
query={queryA}
|
|
280
|
+
profile={profileA}
|
|
229
281
|
selectQuery={selectQuery}
|
|
230
282
|
selectProfile={selectProfile}
|
|
231
283
|
compareProfile={compareProfile}
|
|
@@ -234,43 +286,19 @@ const ProfileExplorerApp = ({
|
|
|
234
286
|
);
|
|
235
287
|
}
|
|
236
288
|
|
|
237
|
-
const queryA = {
|
|
238
|
-
expression: expression_a,
|
|
239
|
-
from: parseInt(from_a as string),
|
|
240
|
-
to: parseInt(to_a as string),
|
|
241
|
-
merge: (merge_a as string) === 'true',
|
|
242
|
-
timeSelection: time_selection_a as string,
|
|
243
|
-
profile_name: profile_name_a as string,
|
|
244
|
-
};
|
|
245
289
|
const queryB = {
|
|
246
290
|
expression: expression_b,
|
|
247
291
|
from: parseInt(from_b as string),
|
|
248
292
|
to: parseInt(to_b as string),
|
|
249
|
-
merge: (merge_b as string) === 'true',
|
|
250
293
|
timeSelection: time_selection_b as string,
|
|
251
294
|
profile_name: profile_name_b as string,
|
|
252
295
|
};
|
|
253
296
|
|
|
254
|
-
const profileA = ProfileSelectionFromParams(
|
|
255
|
-
expression_a,
|
|
256
|
-
from_a as string,
|
|
257
|
-
to_a as string,
|
|
258
|
-
merge_a as string,
|
|
259
|
-
labels_a as string[],
|
|
260
|
-
profile_name_a as string,
|
|
261
|
-
time_a as string
|
|
262
|
-
);
|
|
263
|
-
const profileB = ProfileSelectionFromParams(
|
|
264
|
-
expression_b,
|
|
265
|
-
from_b as string,
|
|
266
|
-
to_b as string,
|
|
267
|
-
merge_b as string,
|
|
268
|
-
labels_b as string[],
|
|
269
|
-
profile_name_b as string,
|
|
270
|
-
time_b as string
|
|
271
|
-
);
|
|
272
|
-
|
|
273
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
|
+
: {};
|
|
274
302
|
return navigateTo(
|
|
275
303
|
'/',
|
|
276
304
|
// Filtering the _a suffix causes us to reset potential profile
|
|
@@ -283,16 +311,20 @@ const ProfileExplorerApp = ({
|
|
|
283
311
|
expression_b: encodeURIComponent(expression_b),
|
|
284
312
|
from_a: q.from.toString(),
|
|
285
313
|
to_a: q.to.toString(),
|
|
286
|
-
merge_a: q.merge,
|
|
287
314
|
time_selection_a: q.timeSelection,
|
|
288
315
|
filter_by_function: filter_by_function ?? '',
|
|
289
316
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
317
|
+
...mergeParams,
|
|
290
318
|
},
|
|
291
319
|
}
|
|
292
320
|
);
|
|
293
321
|
};
|
|
294
322
|
|
|
295
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
|
+
: {};
|
|
296
328
|
return navigateTo(
|
|
297
329
|
'/',
|
|
298
330
|
// Filtering the _b suffix causes us to reset potential profile
|
|
@@ -305,10 +337,10 @@ const ProfileExplorerApp = ({
|
|
|
305
337
|
expression_a: encodeURIComponent(expression_a),
|
|
306
338
|
from_b: q.from.toString(),
|
|
307
339
|
to_b: q.to.toString(),
|
|
308
|
-
merge_b: q.merge,
|
|
309
340
|
time_selection_b: q.timeSelection,
|
|
310
341
|
filter_by_function: filter_by_function ?? '',
|
|
311
342
|
dashboard_items: dashboard_items ?? DEFAULT_DASHBOARD_ITEMS,
|
|
343
|
+
...mergeParams,
|
|
312
344
|
},
|
|
313
345
|
}
|
|
314
346
|
);
|