@emeryld/rrroutes-openapi 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -10
- package/dist/docs/LeafDocsPage.d.ts +4 -22
- package/dist/docs/docs.d.ts +5 -7
- package/dist/docs/schemaIntrospection.d.ts +1 -1
- package/dist/docs/serializer.d.ts +8 -7
- package/dist/index.cjs +456 -559
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +41 -79
- package/dist/index.mjs +458 -558
- package/dist/index.mjs.map +1 -1
- package/dist/public/assets/docs.js +260 -21
- package/dist/web/app.d.ts +1 -8
- package/dist/web/main.d.ts +1 -1
- package/dist/web/utils/grouping.d.ts +2 -8
- package/dist/web/utils/security.d.ts +21 -0
- package/dist/web/utils/types.d.ts +17 -0
- package/dist/web/v2/AppShell.d.ts +7 -0
- package/dist/web/v2/components/JsonInput.d.ts +10 -0
- package/dist/web/v2/components/JsonViewer.d.ts +12 -0
- package/dist/web/v2/components/MethodBadge.d.ts +4 -0
- package/dist/web/v2/components/New/HttpMethodChip.d.ts +7 -0
- package/dist/web/v2/components/New/ListToolBar.d.ts +11 -0
- package/dist/web/v2/components/New/MethodFiltersChips.d.ts +7 -0
- package/dist/web/v2/components/New/RequestStatusChip.d.ts +6 -0
- package/dist/web/v2/components/New/SplitPageLayout.d.ts +7 -0
- package/dist/web/v2/components/New/StabilityChip.d.ts +7 -0
- package/dist/web/v2/components/New/StatusRangeFilter.d.ts +8 -0
- package/dist/web/v2/components/RecordItem.d.ts +34 -0
- package/dist/web/v2/components/ResizableSidePanel.d.ts +12 -0
- package/dist/web/v2/components/SchemaTable.d.ts +5 -0
- package/dist/web/v2/components/SectionHeader.d.ts +9 -0
- package/dist/web/v2/endpoints/EndpointDetailsPanel.d.ts +5 -0
- package/dist/web/v2/endpoints/EndpointList.d.ts +12 -0
- package/dist/web/v2/endpoints/EndpointsPage.d.ts +1 -0
- package/dist/web/v2/endpoints/endpoints.utils.d.ts +3 -0
- package/dist/web/v2/stores/clientStore.d.ts +48 -0
- package/dist/web/v2/stores/endpointsStore.d.ts +20 -0
- package/dist/web/v2/stores/logsStore.d.ts +5 -0
- package/dist/web/v2/theme.d.ts +21 -0
- package/dist/web/v2/types/types.base.d.ts +30 -0
- package/dist/web/v2/types/types.cacheLog.d.ts +165 -0
- package/dist/web/v2/types/types.endpoint.d.ts +326 -0
- package/dist/web/v2/types/types.log.d.ts +119 -0
- package/dist/web/v2/types/types.preset.d.ts +251 -0
- package/dist/web/v2/types/types.requestLog.d.ts +264 -0
- package/package.json +15 -5
- package/dist/docs/presets.d.ts +0 -14
- package/dist/public/assets/docs.css +0 -1
- package/dist/web/components/Analytics.d.ts +0 -68
- package/dist/web/components/CopyablePre.d.ts +0 -7
- package/dist/web/components/EndpointCard.d.ts +0 -10
- package/dist/web/components/Filters.d.ts +0 -9
- package/dist/web/components/FiltersBar.d.ts +0 -25
- package/dist/web/components/HelperEnumInput.d.ts +0 -10
- package/dist/web/components/HistoryView.d.ts +0 -7
- package/dist/web/components/LogsView.d.ts +0 -1
- package/dist/web/components/PlaygroundOverlay.d.ts +0 -35
- package/dist/web/components/PresetsView.d.ts +0 -10
- package/dist/web/components/RequestLogs.d.ts +0 -10
- package/dist/web/components/SchemaTable.d.ts +0 -4
- package/dist/web/components/ui/Button.d.ts +0 -8
- package/dist/web/components/ui/Clickable.d.ts +0 -7
- package/dist/web/components/ui/Tag.d.ts +0 -9
- package/dist/web/components/ui/Text.d.ts +0 -8
- package/dist/web/components/ui/index.d.ts +0 -4
- package/dist/web/historyStore.d.ts +0 -68
- package/dist/web/logsStore.d.ts +0 -51
- package/dist/web/types.d.ts +0 -5
- package/dist/webhooks.d.ts +0 -181
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
export declare const presetLeaves: readonly [{
|
|
3
|
+
readonly method: "get";
|
|
4
|
+
readonly path: "presets";
|
|
5
|
+
readonly cfg: Readonly<{
|
|
6
|
+
description?: string | undefined;
|
|
7
|
+
tags?: string[] | undefined;
|
|
8
|
+
deprecated?: boolean | undefined;
|
|
9
|
+
summary?: string | undefined;
|
|
10
|
+
docsGroup?: string | undefined;
|
|
11
|
+
stability?: "experimental" | "beta" | "stable" | "deprecated" | undefined;
|
|
12
|
+
feed: true;
|
|
13
|
+
docsMeta?: Record<string, unknown> | undefined;
|
|
14
|
+
bodyFiles?: import("@emeryld/rrroutes-contract").FileField[] | undefined;
|
|
15
|
+
queryExtensionSchema: undefined;
|
|
16
|
+
docsHidden?: boolean | undefined;
|
|
17
|
+
bodySchema: import("@emeryld/rrroutes-contract").RouteSchema<unknown, unknown> | undefined;
|
|
18
|
+
querySchema: undefined;
|
|
19
|
+
paramsSchema: undefined;
|
|
20
|
+
outputSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
21
|
+
out: {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
createdAt: number;
|
|
25
|
+
updatedAt: number;
|
|
26
|
+
operations: {
|
|
27
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
28
|
+
path: string;
|
|
29
|
+
endpointId?: string | undefined;
|
|
30
|
+
body?: z.core.util.JSONType | undefined;
|
|
31
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
32
|
+
query?: Record<string, any> | undefined;
|
|
33
|
+
}[];
|
|
34
|
+
description?: string | undefined;
|
|
35
|
+
groupId?: string | undefined;
|
|
36
|
+
tags?: string[] | undefined;
|
|
37
|
+
};
|
|
38
|
+
meta: {
|
|
39
|
+
totalCount?: number | undefined;
|
|
40
|
+
};
|
|
41
|
+
}, {
|
|
42
|
+
out: {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
updatedAt: number;
|
|
47
|
+
operations: {
|
|
48
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
49
|
+
path: string;
|
|
50
|
+
endpointId?: string | undefined;
|
|
51
|
+
body?: z.core.util.JSONType | undefined;
|
|
52
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
53
|
+
query?: Record<string, any> | undefined;
|
|
54
|
+
}[];
|
|
55
|
+
description?: string | undefined;
|
|
56
|
+
groupId?: string | undefined;
|
|
57
|
+
tags?: string[] | undefined;
|
|
58
|
+
};
|
|
59
|
+
meta: {
|
|
60
|
+
totalCount?: number | undefined;
|
|
61
|
+
};
|
|
62
|
+
}>;
|
|
63
|
+
outputMetaSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
64
|
+
totalCount?: number | undefined;
|
|
65
|
+
}, {
|
|
66
|
+
totalCount?: number | undefined;
|
|
67
|
+
}>;
|
|
68
|
+
}>;
|
|
69
|
+
}, {
|
|
70
|
+
readonly method: "post";
|
|
71
|
+
readonly path: "presets";
|
|
72
|
+
readonly cfg: Readonly<{
|
|
73
|
+
description?: string | undefined;
|
|
74
|
+
tags?: string[] | undefined;
|
|
75
|
+
deprecated?: boolean | undefined;
|
|
76
|
+
summary?: string | undefined;
|
|
77
|
+
docsGroup?: string | undefined;
|
|
78
|
+
stability?: "experimental" | "beta" | "stable" | "deprecated" | undefined;
|
|
79
|
+
feed?: boolean | undefined;
|
|
80
|
+
docsMeta?: Record<string, unknown> | undefined;
|
|
81
|
+
bodyFiles?: import("@emeryld/rrroutes-contract").FileField[] | undefined;
|
|
82
|
+
queryExtensionSchema: undefined;
|
|
83
|
+
docsHidden?: boolean | undefined;
|
|
84
|
+
bodySchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
createdAt: number;
|
|
88
|
+
updatedAt: number;
|
|
89
|
+
operations: {
|
|
90
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
91
|
+
path: string;
|
|
92
|
+
endpointId?: string | undefined;
|
|
93
|
+
body?: z.core.util.JSONType | undefined;
|
|
94
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
95
|
+
query?: Record<string, any> | undefined;
|
|
96
|
+
}[];
|
|
97
|
+
description?: string | undefined;
|
|
98
|
+
groupId?: string | undefined;
|
|
99
|
+
tags?: string[] | undefined;
|
|
100
|
+
}, {
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
createdAt: number;
|
|
104
|
+
updatedAt: number;
|
|
105
|
+
operations: {
|
|
106
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
107
|
+
path: string;
|
|
108
|
+
endpointId?: string | undefined;
|
|
109
|
+
body?: z.core.util.JSONType | undefined;
|
|
110
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
111
|
+
query?: Record<string, any> | undefined;
|
|
112
|
+
}[];
|
|
113
|
+
description?: string | undefined;
|
|
114
|
+
groupId?: string | undefined;
|
|
115
|
+
tags?: string[] | undefined;
|
|
116
|
+
}>;
|
|
117
|
+
querySchema: undefined;
|
|
118
|
+
paramsSchema: undefined;
|
|
119
|
+
outputSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
120
|
+
out: {
|
|
121
|
+
id: string;
|
|
122
|
+
name: string;
|
|
123
|
+
createdAt: number;
|
|
124
|
+
updatedAt: number;
|
|
125
|
+
operations: {
|
|
126
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
127
|
+
path: string;
|
|
128
|
+
endpointId?: string | undefined;
|
|
129
|
+
body?: z.core.util.JSONType | undefined;
|
|
130
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
131
|
+
query?: Record<string, any> | undefined;
|
|
132
|
+
}[];
|
|
133
|
+
description?: string | undefined;
|
|
134
|
+
groupId?: string | undefined;
|
|
135
|
+
tags?: string[] | undefined;
|
|
136
|
+
};
|
|
137
|
+
meta?: string | undefined;
|
|
138
|
+
}, {
|
|
139
|
+
out: {
|
|
140
|
+
id: string;
|
|
141
|
+
name: string;
|
|
142
|
+
createdAt: number;
|
|
143
|
+
updatedAt: number;
|
|
144
|
+
operations: {
|
|
145
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
146
|
+
path: string;
|
|
147
|
+
endpointId?: string | undefined;
|
|
148
|
+
body?: z.core.util.JSONType | undefined;
|
|
149
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
150
|
+
query?: Record<string, any> | undefined;
|
|
151
|
+
}[];
|
|
152
|
+
description?: string | undefined;
|
|
153
|
+
groupId?: string | undefined;
|
|
154
|
+
tags?: string[] | undefined;
|
|
155
|
+
};
|
|
156
|
+
meta?: string | undefined;
|
|
157
|
+
}>;
|
|
158
|
+
outputMetaSchema: undefined;
|
|
159
|
+
}>;
|
|
160
|
+
}, {
|
|
161
|
+
readonly method: "put";
|
|
162
|
+
readonly path: "presets";
|
|
163
|
+
readonly cfg: Readonly<{
|
|
164
|
+
description?: string | undefined;
|
|
165
|
+
tags?: string[] | undefined;
|
|
166
|
+
deprecated?: boolean | undefined;
|
|
167
|
+
summary?: string | undefined;
|
|
168
|
+
docsGroup?: string | undefined;
|
|
169
|
+
stability?: "experimental" | "beta" | "stable" | "deprecated" | undefined;
|
|
170
|
+
feed?: boolean | undefined;
|
|
171
|
+
docsMeta?: Record<string, unknown> | undefined;
|
|
172
|
+
bodyFiles?: import("@emeryld/rrroutes-contract").FileField[] | undefined;
|
|
173
|
+
queryExtensionSchema: undefined;
|
|
174
|
+
docsHidden?: boolean | undefined;
|
|
175
|
+
bodySchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
176
|
+
id: string;
|
|
177
|
+
name: string;
|
|
178
|
+
createdAt: number;
|
|
179
|
+
updatedAt: number;
|
|
180
|
+
operations: {
|
|
181
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
182
|
+
path: string;
|
|
183
|
+
endpointId?: string | undefined;
|
|
184
|
+
body?: z.core.util.JSONType | undefined;
|
|
185
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
186
|
+
query?: Record<string, any> | undefined;
|
|
187
|
+
}[];
|
|
188
|
+
description?: string | undefined;
|
|
189
|
+
groupId?: string | undefined;
|
|
190
|
+
tags?: string[] | undefined;
|
|
191
|
+
}, {
|
|
192
|
+
id: string;
|
|
193
|
+
name: string;
|
|
194
|
+
createdAt: number;
|
|
195
|
+
updatedAt: number;
|
|
196
|
+
operations: {
|
|
197
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
198
|
+
path: string;
|
|
199
|
+
endpointId?: string | undefined;
|
|
200
|
+
body?: z.core.util.JSONType | undefined;
|
|
201
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
202
|
+
query?: Record<string, any> | undefined;
|
|
203
|
+
}[];
|
|
204
|
+
description?: string | undefined;
|
|
205
|
+
groupId?: string | undefined;
|
|
206
|
+
tags?: string[] | undefined;
|
|
207
|
+
}>;
|
|
208
|
+
querySchema: undefined;
|
|
209
|
+
paramsSchema: undefined;
|
|
210
|
+
outputSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
211
|
+
out: {
|
|
212
|
+
id: string;
|
|
213
|
+
name: string;
|
|
214
|
+
createdAt: number;
|
|
215
|
+
updatedAt: number;
|
|
216
|
+
operations: {
|
|
217
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
218
|
+
path: string;
|
|
219
|
+
endpointId?: string | undefined;
|
|
220
|
+
body?: z.core.util.JSONType | undefined;
|
|
221
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
222
|
+
query?: Record<string, any> | undefined;
|
|
223
|
+
}[];
|
|
224
|
+
description?: string | undefined;
|
|
225
|
+
groupId?: string | undefined;
|
|
226
|
+
tags?: string[] | undefined;
|
|
227
|
+
};
|
|
228
|
+
meta?: string | undefined;
|
|
229
|
+
}, {
|
|
230
|
+
out: {
|
|
231
|
+
id: string;
|
|
232
|
+
name: string;
|
|
233
|
+
createdAt: number;
|
|
234
|
+
updatedAt: number;
|
|
235
|
+
operations: {
|
|
236
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
237
|
+
path: string;
|
|
238
|
+
endpointId?: string | undefined;
|
|
239
|
+
body?: z.core.util.JSONType | undefined;
|
|
240
|
+
extraHeaders?: Record<string, any> | undefined;
|
|
241
|
+
query?: Record<string, any> | undefined;
|
|
242
|
+
}[];
|
|
243
|
+
description?: string | undefined;
|
|
244
|
+
groupId?: string | undefined;
|
|
245
|
+
tags?: string[] | undefined;
|
|
246
|
+
};
|
|
247
|
+
meta?: string | undefined;
|
|
248
|
+
}>;
|
|
249
|
+
outputMetaSchema: undefined;
|
|
250
|
+
}>;
|
|
251
|
+
}];
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
export declare const requestSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
description: z.ZodOptional<z.ZodString>;
|
|
6
|
+
groupId: z.ZodOptional<z.ZodString>;
|
|
7
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
createdAt: z.ZodNumber;
|
|
9
|
+
updatedAt: z.ZodNumber;
|
|
10
|
+
status: z.ZodNumber;
|
|
11
|
+
body: z.ZodOptional<z.ZodAny>;
|
|
12
|
+
fullUrl: z.ZodString;
|
|
13
|
+
path: z.ZodString;
|
|
14
|
+
method: z.ZodEnum<{
|
|
15
|
+
get: "get";
|
|
16
|
+
post: "post";
|
|
17
|
+
put: "put";
|
|
18
|
+
patch: "patch";
|
|
19
|
+
delete: "delete";
|
|
20
|
+
}>;
|
|
21
|
+
query: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
22
|
+
params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
23
|
+
output: z.ZodOptional<z.ZodAny>;
|
|
24
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
25
|
+
error: z.ZodOptional<z.ZodString>;
|
|
26
|
+
durationMs: z.ZodNumber;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export type RequestLogType = z.infer<typeof requestSchema>;
|
|
29
|
+
export declare const requestQuerySchema: z.ZodObject<{
|
|
30
|
+
beforeDate: z.ZodOptional<z.ZodString>;
|
|
31
|
+
afterDate: z.ZodOptional<z.ZodString>;
|
|
32
|
+
orderBy: z.ZodDefault<z.ZodEnum<{
|
|
33
|
+
timestamp: "timestamp";
|
|
34
|
+
duration: "duration";
|
|
35
|
+
level: "level";
|
|
36
|
+
path: "path";
|
|
37
|
+
}>>;
|
|
38
|
+
orderDirection: z.ZodDefault<z.ZodEnum<{
|
|
39
|
+
asc: "asc";
|
|
40
|
+
desc: "desc";
|
|
41
|
+
}>>;
|
|
42
|
+
searchQuery: z.ZodOptional<z.ZodString>;
|
|
43
|
+
groups: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
44
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
45
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
46
|
+
methods: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
47
|
+
get: "get";
|
|
48
|
+
post: "post";
|
|
49
|
+
put: "put";
|
|
50
|
+
patch: "patch";
|
|
51
|
+
delete: "delete";
|
|
52
|
+
}>>>;
|
|
53
|
+
statuses: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
|
|
54
|
+
path: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
export declare const requestLogLeaves: readonly [{
|
|
57
|
+
readonly method: "get";
|
|
58
|
+
readonly path: "requests";
|
|
59
|
+
readonly cfg: Readonly<{
|
|
60
|
+
description?: string | undefined;
|
|
61
|
+
tags?: string[] | undefined;
|
|
62
|
+
deprecated?: boolean | undefined;
|
|
63
|
+
summary?: string | undefined;
|
|
64
|
+
docsGroup?: string | undefined;
|
|
65
|
+
stability?: "experimental" | "beta" | "stable" | "deprecated" | undefined;
|
|
66
|
+
feed: true;
|
|
67
|
+
docsMeta?: Record<string, unknown> | undefined;
|
|
68
|
+
bodyFiles?: import("@emeryld/rrroutes-contract").FileField[] | undefined;
|
|
69
|
+
queryExtensionSchema: undefined;
|
|
70
|
+
docsHidden?: boolean | undefined;
|
|
71
|
+
bodySchema: import("@emeryld/rrroutes-contract").RouteSchema<unknown, unknown> | undefined;
|
|
72
|
+
querySchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
73
|
+
orderBy: "timestamp" | "duration" | "level" | "path";
|
|
74
|
+
orderDirection: "asc" | "desc";
|
|
75
|
+
methods: ("get" | "post" | "put" | "patch" | "delete")[];
|
|
76
|
+
statuses: number[];
|
|
77
|
+
beforeDate?: string | undefined;
|
|
78
|
+
afterDate?: string | undefined;
|
|
79
|
+
searchQuery?: string | undefined;
|
|
80
|
+
groups?: string[] | undefined;
|
|
81
|
+
tags?: string[] | undefined;
|
|
82
|
+
cursor?: string | undefined;
|
|
83
|
+
path?: string | undefined;
|
|
84
|
+
}, {
|
|
85
|
+
beforeDate?: string | undefined;
|
|
86
|
+
afterDate?: string | undefined;
|
|
87
|
+
orderBy?: "timestamp" | "duration" | "level" | "path" | undefined;
|
|
88
|
+
orderDirection?: "asc" | "desc" | undefined;
|
|
89
|
+
searchQuery?: string | undefined;
|
|
90
|
+
groups?: string[] | undefined;
|
|
91
|
+
tags?: string[] | undefined;
|
|
92
|
+
cursor?: string | undefined;
|
|
93
|
+
methods?: ("get" | "post" | "put" | "patch" | "delete")[] | undefined;
|
|
94
|
+
statuses?: number[] | undefined;
|
|
95
|
+
path?: string | undefined;
|
|
96
|
+
}>;
|
|
97
|
+
paramsSchema: undefined;
|
|
98
|
+
outputSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
99
|
+
out: {
|
|
100
|
+
id: string;
|
|
101
|
+
name: string;
|
|
102
|
+
createdAt: number;
|
|
103
|
+
updatedAt: number;
|
|
104
|
+
status: number;
|
|
105
|
+
fullUrl: string;
|
|
106
|
+
path: string;
|
|
107
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
108
|
+
durationMs: number;
|
|
109
|
+
description?: string | undefined;
|
|
110
|
+
groupId?: string | undefined;
|
|
111
|
+
tags?: string[] | undefined;
|
|
112
|
+
body?: any;
|
|
113
|
+
query?: Record<string, any> | undefined;
|
|
114
|
+
params?: Record<string, any> | undefined;
|
|
115
|
+
output?: any;
|
|
116
|
+
headers?: Record<string, any> | undefined;
|
|
117
|
+
error?: string | undefined;
|
|
118
|
+
}[];
|
|
119
|
+
meta: {
|
|
120
|
+
totalCount?: number | undefined;
|
|
121
|
+
};
|
|
122
|
+
}, {
|
|
123
|
+
out: {
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
createdAt: number;
|
|
127
|
+
updatedAt: number;
|
|
128
|
+
status: number;
|
|
129
|
+
fullUrl: string;
|
|
130
|
+
path: string;
|
|
131
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
132
|
+
durationMs: number;
|
|
133
|
+
description?: string | undefined;
|
|
134
|
+
groupId?: string | undefined;
|
|
135
|
+
tags?: string[] | undefined;
|
|
136
|
+
body?: any;
|
|
137
|
+
query?: Record<string, any> | undefined;
|
|
138
|
+
params?: Record<string, any> | undefined;
|
|
139
|
+
output?: any;
|
|
140
|
+
headers?: Record<string, any> | undefined;
|
|
141
|
+
error?: string | undefined;
|
|
142
|
+
}[];
|
|
143
|
+
meta: {
|
|
144
|
+
totalCount?: number | undefined;
|
|
145
|
+
};
|
|
146
|
+
}>;
|
|
147
|
+
outputMetaSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
148
|
+
totalCount?: number | undefined;
|
|
149
|
+
}, {
|
|
150
|
+
totalCount?: number | undefined;
|
|
151
|
+
}>;
|
|
152
|
+
}>;
|
|
153
|
+
}, import("@emeryld/rrroutes-contract").LeafLowProfile<"get", "requests/:requestId", {
|
|
154
|
+
readonly description?: string | undefined;
|
|
155
|
+
readonly tags?: string[] | undefined;
|
|
156
|
+
readonly deprecated?: boolean | undefined;
|
|
157
|
+
readonly summary?: string | undefined;
|
|
158
|
+
readonly docsGroup?: string | undefined;
|
|
159
|
+
readonly stability?: "experimental" | "beta" | "stable" | "deprecated" | undefined;
|
|
160
|
+
readonly feed?: boolean | undefined;
|
|
161
|
+
readonly docsMeta?: Record<string, unknown> | undefined;
|
|
162
|
+
readonly bodySchema: import("@emeryld/rrroutes-contract").RouteSchema<unknown, unknown> | undefined;
|
|
163
|
+
readonly querySchema: undefined;
|
|
164
|
+
readonly outputSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
165
|
+
out: {
|
|
166
|
+
id: string;
|
|
167
|
+
name: string;
|
|
168
|
+
createdAt: number;
|
|
169
|
+
updatedAt: number;
|
|
170
|
+
status: number;
|
|
171
|
+
fullUrl: string;
|
|
172
|
+
path: string;
|
|
173
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
174
|
+
durationMs: number;
|
|
175
|
+
logs: {
|
|
176
|
+
id: string;
|
|
177
|
+
name: string;
|
|
178
|
+
createdAt: number;
|
|
179
|
+
updatedAt: number;
|
|
180
|
+
level: "error" | "info" | "warning" | "debug" | "trace";
|
|
181
|
+
meta: z.core.util.JSONType;
|
|
182
|
+
description?: string | undefined;
|
|
183
|
+
groupId?: string | undefined;
|
|
184
|
+
tags?: string[] | undefined;
|
|
185
|
+
}[];
|
|
186
|
+
caches: {
|
|
187
|
+
id: string;
|
|
188
|
+
name: string;
|
|
189
|
+
createdAt: number;
|
|
190
|
+
updatedAt: number;
|
|
191
|
+
operation: "delete" | "set" | "hit" | "miss";
|
|
192
|
+
value: any;
|
|
193
|
+
description?: string | undefined;
|
|
194
|
+
groupId?: string | undefined;
|
|
195
|
+
tags?: string[] | undefined;
|
|
196
|
+
size?: number | undefined;
|
|
197
|
+
}[];
|
|
198
|
+
description?: string | undefined;
|
|
199
|
+
groupId?: string | undefined;
|
|
200
|
+
tags?: string[] | undefined;
|
|
201
|
+
body?: any;
|
|
202
|
+
query?: Record<string, any> | undefined;
|
|
203
|
+
params?: Record<string, any> | undefined;
|
|
204
|
+
output?: any;
|
|
205
|
+
headers?: Record<string, any> | undefined;
|
|
206
|
+
error?: string | undefined;
|
|
207
|
+
};
|
|
208
|
+
meta: unknown;
|
|
209
|
+
}, {
|
|
210
|
+
out: {
|
|
211
|
+
id: string;
|
|
212
|
+
name: string;
|
|
213
|
+
createdAt: number;
|
|
214
|
+
updatedAt: number;
|
|
215
|
+
status: number;
|
|
216
|
+
fullUrl: string;
|
|
217
|
+
path: string;
|
|
218
|
+
method: "get" | "post" | "put" | "patch" | "delete";
|
|
219
|
+
durationMs: number;
|
|
220
|
+
logs: {
|
|
221
|
+
id: string;
|
|
222
|
+
name: string;
|
|
223
|
+
createdAt: number;
|
|
224
|
+
updatedAt: number;
|
|
225
|
+
level: "error" | "info" | "warning" | "debug" | "trace";
|
|
226
|
+
meta: z.core.util.JSONType;
|
|
227
|
+
description?: string | undefined;
|
|
228
|
+
groupId?: string | undefined;
|
|
229
|
+
tags?: string[] | undefined;
|
|
230
|
+
}[];
|
|
231
|
+
caches: {
|
|
232
|
+
id: string;
|
|
233
|
+
name: string;
|
|
234
|
+
createdAt: number;
|
|
235
|
+
updatedAt: number;
|
|
236
|
+
operation: "delete" | "set" | "hit" | "miss";
|
|
237
|
+
value: any;
|
|
238
|
+
description?: string | undefined;
|
|
239
|
+
groupId?: string | undefined;
|
|
240
|
+
tags?: string[] | undefined;
|
|
241
|
+
size?: number | undefined;
|
|
242
|
+
}[];
|
|
243
|
+
description?: string | undefined;
|
|
244
|
+
groupId?: string | undefined;
|
|
245
|
+
tags?: string[] | undefined;
|
|
246
|
+
body?: any;
|
|
247
|
+
query?: Record<string, any> | undefined;
|
|
248
|
+
params?: Record<string, any> | undefined;
|
|
249
|
+
output?: any;
|
|
250
|
+
headers?: Record<string, any> | undefined;
|
|
251
|
+
error?: string | undefined;
|
|
252
|
+
};
|
|
253
|
+
meta: unknown;
|
|
254
|
+
}>;
|
|
255
|
+
readonly bodyFiles?: import("@emeryld/rrroutes-contract").FileField[] | undefined;
|
|
256
|
+
readonly outputMetaSchema: import("@emeryld/rrroutes-contract").RouteSchema<unknown, unknown>;
|
|
257
|
+
readonly queryExtensionSchema: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>> & import("@emeryld/rrroutes-contract").RouteSchema<unknown, unknown>;
|
|
258
|
+
readonly docsHidden?: boolean | undefined;
|
|
259
|
+
paramsSchema: import("@emeryld/rrroutes-contract").RouteSchema<{
|
|
260
|
+
requestId: string;
|
|
261
|
+
}, {
|
|
262
|
+
requestId: string;
|
|
263
|
+
}>;
|
|
264
|
+
}>];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emeryld/rrroutes-openapi",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -17,20 +17,30 @@
|
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@emeryld/rrroutes-
|
|
20
|
+
"@emeryld/rrroutes-client": "^2.3.5",
|
|
21
|
+
"@emeryld/rrroutes-contract": "^2.4.14",
|
|
22
|
+
"@emotion/react": "^11.14.0",
|
|
23
|
+
"@emotion/styled": "^11.14.1",
|
|
24
|
+
"@mui/icons-material": "^7.3.5",
|
|
25
|
+
"@mui/material": "^7.3.5",
|
|
26
|
+
"@tanstack/react-query": "^5.90.11",
|
|
21
27
|
"react": "^18.3.1",
|
|
22
28
|
"react-dom": "^18.3.1",
|
|
23
|
-
"
|
|
29
|
+
"react-router-dom": "^7.10.0",
|
|
30
|
+
"recharts": "^3.5.1",
|
|
31
|
+
"socket.io-client": "^4.8.1",
|
|
32
|
+
"zod": "^4.1.13"
|
|
24
33
|
},
|
|
25
34
|
"peerDependencies": {
|
|
26
35
|
"express": "^5.1.0"
|
|
27
36
|
},
|
|
28
37
|
"devDependencies": {
|
|
29
38
|
"@jest/globals": "^30.2.0",
|
|
30
|
-
"@types/express": "^5.0.
|
|
39
|
+
"@types/express": "^5.0.6",
|
|
31
40
|
"@types/react": "^18.3.27",
|
|
32
41
|
"@types/react-dom": "^18.3.7",
|
|
33
|
-
"vite": "^6.4.1"
|
|
42
|
+
"vite": "^6.4.1",
|
|
43
|
+
"vite-plugin-terminal": "^1.3.0"
|
|
34
44
|
},
|
|
35
45
|
"scripts": {
|
|
36
46
|
"clean": "rimraf dist && rimraf node_modules",
|
package/dist/docs/presets.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type SerializablePresetOperation = {
|
|
2
|
-
method: string;
|
|
3
|
-
path: string;
|
|
4
|
-
body?: unknown;
|
|
5
|
-
query?: unknown;
|
|
6
|
-
params?: unknown;
|
|
7
|
-
};
|
|
8
|
-
export type SerializablePreset = {
|
|
9
|
-
name: string;
|
|
10
|
-
description?: string;
|
|
11
|
-
tags: string[];
|
|
12
|
-
docsGroup?: string;
|
|
13
|
-
ops: SerializablePresetOperation[];
|
|
14
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--bg-root: #020617;--bg-card: rgba(15, 23, 42, .6);--bg-card-hover: rgba(30, 41, 59, .7);--bg-glass: rgba(15, 23, 42, .9);--bg-panel: #0f172a;--border-subtle: rgba(148, 163, 184, .2);--text-main: #f8fafc;--text-muted: #94a3b8;--text-accent: #c4b5fd;--accent-primary: #a855f7;--accent-glow: rgba(168, 85, 247, .25);--accent-success: #4ade80;--accent-error: #f87171;--method-get: #4ade80;--method-get-bg: rgba(34, 197, 94, .15);--method-post: #60a5fa;--method-post-bg: rgba(59, 130, 246, .15);--method-put: #facc15;--method-put-bg: rgba(234, 179, 8, .15);--method-patch: #2dd4bf;--method-patch-bg: rgba(45, 212, 191, .15);--method-delete: #f87171;--method-delete-bg: rgba(248, 113, 113, .15);--radius-card: 12px;--shadow-card: 0 4px 20px rgba(0, 0, 0, .4);--shadow-panel: -5px 0 30px rgba(0,0,0,.5);--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;--tag-0-bg: rgba(254, 202, 202, .2);--tag-0-fg: #fca5a5;--tag-1-bg: rgba(253, 230, 138, .2);--tag-1-fg: #fcd34d;--tag-2-bg: rgba(187, 247, 208, .2);--tag-2-fg: #86efac;--tag-3-bg: rgba(165, 243, 252, .2);--tag-3-fg: #67e8f9;--tag-4-bg: rgba(191, 219, 254, .2);--tag-4-fg: #93c5fd;--tag-5-bg: rgba(233, 213, 255, .2);--tag-5-fg: #d8b4fe;--tag-6-bg: rgba(251, 207, 232, .2);--tag-6-fg: #f9a8d4}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0;background-color:var(--bg-root);color:var(--text-main);font-family:system-ui,-apple-system,sans-serif}body{background-image:radial-gradient(circle at 15% 10%,rgba(88,28,135,.15),transparent 40%),radial-gradient(circle at 85% 80%,rgba(15,23,42,1),transparent 40%);background-attachment:fixed}.page{min-height:100vh;padding:20px 40px 60px;max-width:1600px;margin:0 auto;display:flex;flex-direction:column;gap:24px}.header{display:flex;justify-content:space-between;padding-bottom:10px;border-bottom:1px solid var(--border-subtle)}.header-title h1{font-size:28px;margin:0;font-weight:700;letter-spacing:-.02em;background:linear-gradient(to right,#e2e8f0,#a855f7);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.header-actions{display:flex;align-items:center;gap:8px}.preset-nav-btn{background:#a855f71f;border:1px solid rgba(168,85,247,.5);color:var(--text-accent);padding:6px 12px;border-radius:6px;font-weight:700;cursor:pointer;font-size:12px;transition:all .2s ease}.preset-nav-btn:hover{box-shadow:0 0 0 1px var(--accent-glow);color:#fff}.preset-nav-btn:disabled{opacity:.4;cursor:not-allowed}.preset-nav-btn.ghost-btn{background:transparent;border-color:var(--border-subtle);color:var(--text-muted)}.preset-nav-btn.nav-pill{background:#ffffff0a;border-color:var(--border-subtle);color:var(--text-main)}.preset-nav-btn.nav-pill[data-active=true]{background:var(--accent-primary);color:#fff;border-color:var(--accent-primary);box-shadow:0 0 0 1px var(--accent-glow)}.link-button{background:none;border:none;color:var(--text-accent);cursor:pointer;padding:0;font-weight:700}.link-button:hover{color:#fff}.breadcrumb-sep{color:var(--text-muted)}.controls-container{background:var(--bg-glass);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-subtle);border-radius:var(--radius-card);padding:12px 16px;display:flex;flex-direction:column;gap:12px;box-shadow:0 10px 30px -10px #00000080}.filters-row{display:flex;align-items:flex-start;gap:16px;width:100%}.left-column{display:flex;flex-direction:column;gap:16px;flex-basis:300px;min-width:250px}.search-box{width:100%;position:relative}.search-input{width:100%;background:#02061799;border:1px solid var(--border-subtle);color:var(--text-main);padding:8px 12px 8px 32px;border-radius:6px;font-size:13px}.search-input:focus{outline:none;border-color:var(--accent-primary)}.search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-muted);font-size:12px}.filter-group{display:flex;flex-direction:column;gap:6px}.filter-label{font-size:10px;text-transform:uppercase;color:var(--text-muted);font-weight:700}.checkbox-group{display:flex;flex-wrap:wrap;gap:6px}.filters-shell{border:1px solid var(--border-subtle);border-radius:var(--radius-card);background:#ffffff1a;padding:14px;box-shadow:var(--shadow-card);display:flex;flex-direction:column;gap:12px;transition:background .15s ease,box-shadow .15s ease,border-color .15s ease;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.filters-shell:hover:not(:has(.filters-actions:hover,.filters-raw:hover,.filters-grid:hover)){cursor:pointer;background-color:#ffffff0d}.sticky-panel{position:sticky;top:12px;z-index:45;margin-top:4px;background:#060914b3}.sticky-panel[data-scrolled=true]{background:#060914e6;box-shadow:0 15px 30px -12px #0009;border-color:#ffffff14}.filters-header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.filters-heading{display:flex;flex-direction:column;gap:2px}.filters-title{font-size:16px;font-weight:800;color:var(--text-main)}.filters-subtitle{color:var(--text-muted);font-size:12px}.filters-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.filters-collapse-btn{border:1px solid var(--border-subtle);background:#ffffff14;color:var(--text-muted);border-radius:6px;padding:4px 8px;cursor:pointer}.filters-collapse-btn:hover{border-color:var(--accent-primary);color:#fff}.filters-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:-15px;padding:15px}.filters-raw{display:flex;flex-direction:column;gap:12px;margin:-15px;padding:15px}.filter-block{border:1px solid var(--border-subtle);border-radius:10px;background:#00000040;padding:10px 12px;display:flex;flex-direction:column;gap:8px}.filter-block-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.filter-hint{color:var(--text-muted);font-size:11px}.filter-block-body{display:flex;flex-direction:column;gap:8px}.filter-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px}.text-muted{color:var(--text-muted)}.text-accent{color:var(--text-accent)}.helper-enum-input{display:flex;flex-direction:column;gap:8px}.helper-input-shell{position:relative}.helper-suggestions{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:12;display:flex;flex-wrap:wrap;gap:6px;padding:8px;border-radius:10px;border:1px solid var(--border-subtle);background:#0f172af2;box-shadow:0 10px 30px #00000080}.helper-suggestion{border:1px solid var(--border-subtle);background:#ffffff0a;color:var(--text-main);border-radius:999px;padding:4px 10px;font-size:12px;cursor:pointer}.helper-suggestion:hover{border-color:var(--accent-primary);color:#fff}.helper-tags{display:flex;flex-wrap:wrap;gap:6px}.helper-tag{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;border:1px solid var(--border-subtle);background:#ffffff0f;color:var(--text-main);cursor:pointer;font-size:12px}.helper-tag:hover{border-color:var(--accent-primary);color:#fff}.helper-tag-close{color:var(--text-muted);font-weight:800}.pill-checkbox input{display:none}.pill-checkbox span{display:inline-block;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;background:#1e293b80;color:var(--text-muted);border:1px solid transparent;cursor:pointer}.pill-checkbox input:checked+span{background:#a855f726;color:var(--accent-primary);border-color:var(--accent-primary)}.pill-checkbox.colored-tag input:checked+.tag-filter-pill{border-color:var(--accent-primary);box-shadow:0 0 0 1px var(--accent-glow)}.overview-row{display:flex;flex-wrap:wrap;gap:8px;padding-top:8px;border-top:1px solid var(--border-subtle);align-items:center}.overview-label{font-size:10px;text-transform:uppercase;color:var(--text-muted);font-weight:700}.group-chip{text-decoration:none}.preset-menu{display:flex;flex-direction:column;gap:16px}.preset-menu-header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.preset-menu-title{margin:0}.preset-menu-subtitle{margin:4px 0 0;color:var(--text-muted)}.preset-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.preset-card{background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:var(--radius-card);padding:14px;display:flex;flex-direction:column;gap:8px;cursor:pointer;transition:border-color .2s ease,transform .2s ease}.preset-card:hover{border-color:#94a3b866;box-shadow:var(--shadow-card);transform:translateY(-2px)}.preset-card-title{font-weight:700;font-size:15px}.preset-card-desc{margin:0;color:var(--text-muted);line-height:1.4}.preset-card-meta{display:flex;gap:8px;align-items:center;font-size:11px;color:var(--text-muted)}.preset-tag-row{display:flex;gap:6px;flex-wrap:wrap}.preset-tag{background:#ffffff0f;border:1px solid var(--border-subtle);color:var(--text-muted);padding:3px 8px;border-radius:999px;font-size:11px}.preset-empty{padding:20px;border:1px dashed var(--border-subtle);border-radius:var(--radius-card);color:var(--text-muted);display:flex;gap:12px;align-items:center}.api-group{margin-bottom:40px;scroll-margin-top:180px}.group-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;border-bottom:1px solid var(--border-subtle)}.group-title{font-size:20px;font-weight:600;margin:0;padding-bottom:8px}.group-actions button{background:transparent;border:1px solid var(--border-subtle);color:var(--text-muted);font-size:11px;padding:4px 10px;border-radius:4px;cursor:pointer;margin-left:8px}.endpoint-card{background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:var(--radius-card);overflow:hidden;transition:all .2s ease;margin-bottom:12px}.endpoint-card:hover{border-color:#94a3b866;box-shadow:var(--shadow-card);transform:translateY(-2px)}.card-header{padding:12px 16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;cursor:pointer}.history-link-btn{background:transparent;border:1px solid var(--border-subtle);color:var(--text-muted);padding:4px 8px;border-radius:6px;cursor:pointer;font-size:11px}.history-link-btn:hover{color:#fff;border-color:var(--accent-primary)}.header-spacer{flex:1}.card-body{display:none;padding:0 16px 16px;border-top:1px solid var(--border-subtle);margin-top:4px}.endpoint-card[data-expanded=true] .card-body{display:block;animation:slideDown .2s ease-out}.endpoint-card[data-expanded=true] .expand-icon{transform:rotate(180deg);color:var(--text-main)}@keyframes slideDown{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.method-badge{font-size:11px;font-weight:800;text-transform:uppercase;padding:4px 8px;border-radius:4px;min-width:55px;text-align:center;transition:all .3s ease}.m-GET{background:var(--method-get-bg);color:var(--method-get);border:1px solid rgba(74,222,128,.3)}.m-GET:hover{background:var(--method-get-hover-bg);color:var(--method-get-hover);border:1px solid rgba(74,222,128,.5)}.m-GET:active{background:var(--method-get-click-bg);color:var(--method-get-click);border:1px solid rgba(74,222,128,.7)}.m-POST{background:var(--method-post-bg);color:var(--method-post);border:1px solid rgba(96,165,250,.3)}.m-POST:hover{background:var(--method-post-hover-bg);color:var(--method-post-hover);border:1px solid rgba(96,165,250,.5)}.m-POST:active{background:var(--method-post-click-bg);color:var(--method-post-click);border:1px solid rgba(96,165,250,.7)}.m-PUT{background:var(--method-put-bg);color:var(--method-put);border:1px solid rgba(250,204,21,.3)}.m-PUT:hover{background:var(--method-put-hover-bg);color:var(--method-put-hover);border:1px solid rgba(250,204,21,.5)}.m-PUT:active{background:var(--method-put-click-bg);color:var(--method-put-click);border:1px solid rgba(250,204,21,.7)}.m-PATCH{background:var(--method-patch-bg);color:var(--method-patch);border:1px solid rgba(45,212,191,.3)}.m-PATCH:hover{background:var(--method-patch-hover-bg);color:var(--method-patch-hover);border:1px solid rgba(45,212,191,.5)}.m-PATCH:active{background:var(--method-patch-click-bg);color:var(--method-patch-click);border:1px solid rgba(45,212,191,.7)}.m-DELETE{background:var(--method-delete-bg);color:var(--method-delete);border:1px solid rgba(248,113,113,.3)}.m-DELETE:hover{background:var(--method-delete-hover-bg);color:var(--method-delete-hover);border:1px solid rgba(248,113,113,.5)}.m-DELETE:active{background:var(--method-delete-click-bg);color:var(--method-delete-click);border:1px solid rgba(248,113,113,.7)}.path-container{font-family:var(--font-mono);font-size:13px;display:inline-flex;align-items:center;gap:8px;padding:2px 6px;border-radius:4px}.path-container:hover{background:#ffffff0d}.copy-icon{opacity:0;font-size:10px}.path-container:hover .copy-icon{opacity:1}.tags-container{display:flex;gap:6px}.status-badge{font-size:9px;text-transform:uppercase;padding:2px 6px;border-radius:3px;font-weight:600}.tag-0{background:var(--tag-0-bg);color:var(--tag-0-fg);border-color:var(--tag-0-fg)}.tag-1{background:var(--tag-1-bg);color:var(--tag-1-fg);border-color:var(--tag-1-fg)}.tag-2{background:var(--tag-2-bg);color:var(--tag-2-fg);border-color:var(--tag-2-fg)}.tag-3{background:var(--tag-3-bg);color:var(--tag-3-fg);border-color:var(--tag-3-fg)}.tag-4{background:var(--tag-4-bg);color:var(--tag-4-fg);border-color:var(--tag-4-fg)}.tag-5{background:var(--tag-5-bg);color:var(--tag-5-fg);border-color:var(--tag-5-fg)}.tag-6{background:var(--tag-6-bg);color:var(--tag-6-fg);border-color:var(--tag-6-fg)}.not-implemented{border-color:var(--method-delete);color:var(--method-delete);background:var(--method-delete-bg)}.btn-try-it{background:#a855f71a;border:1px solid rgba(168,85,247,.4);color:var(--text-accent);font-size:11px;font-weight:600;padding:4px 12px;border-radius:12px;cursor:pointer;transition:all .2s;margin-right:12px;display:flex;align-items:center;gap:6px}.btn-try-it:hover{background:#a855f740;color:#fff;box-shadow:0 0 10px var(--accent-glow)}.btn-try-it .play-icon{font-size:10px}.section-block{margin-top:18px}.section-title{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--text-muted);margin-bottom:8px;border-bottom:1px solid var(--border-subtle);padding-bottom:4px}.schema-table{width:100%;border-collapse:collapse;font-size:12px}.schema-table th{text-align:left;color:var(--text-muted);font-weight:600;padding:6px 8px;border-bottom:1px solid var(--border-subtle);background:#0003}.schema-table td{padding:6px 8px;border-bottom:1px solid var(--border-subtle);vertical-align:top;color:var(--text-muted)}.col-name{font-family:var(--font-mono);color:var(--text-accent)!important;width:25%}.col-type{font-family:var(--font-mono);color:#93c5fd!important;width:15%}.req-badge{font-size:9px;text-transform:uppercase;padding:2px 4px;border-radius:2px}.req-true{color:#4ade80;background:#4ade801a}.req-false{color:#94a3b8;background:#94a3b81a}.schema-toggle{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:10px;padding:0 4px;margin-right:4px;width:16px;text-align:center}.schema-toggle:hover{color:var(--text-main)}tr[data-hidden=true]{display:none}.schema-name-cell{display:flex;align-items:center}.schema-name-text{opacity:.8}.schema-toggle-placeholder{width:20px;display:inline-block}.schema-depth-0{padding-left:0}.schema-depth-1{padding-left:16px}.schema-depth-2{padding-left:32px}.schema-depth-3{padding-left:48px}.schema-depth-4{padding-left:64px}.schema-depth-5{padding-left:80px}.schema-depth-6{padding-left:96px}.schema-depth-7{padding-left:112px}.schema-depth-8{padding-left:128px}.playground-overlay{position:fixed;top:0;right:0;bottom:0;width:600px;max-width:90vw;background:var(--bg-panel);border-left:1px solid var(--border-subtle);box-shadow:var(--shadow-panel);z-index:100;transform:translate(100%);transition:transform .3s cubic-bezier(.16,1,.3,1);display:flex;flex-direction:column}.playground-overlay.open{transform:translate(0)}.playground-inline{background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:var(--radius-card);overflow:hidden;margin-top:8px}.playground-inline .pg-content{padding:16px}.playground-inline .pg-footer{padding:12px 16px}.pg-note{margin-left:8px;color:var(--text-muted);font-size:11px}.loading-placeholder{text-align:center;padding:40px;color:#64748b}.no-results{text-align:center;padding:40px;color:var(--text-muted)}.preset-detail{display:flex;flex-direction:column;gap:16px}.preset-detail-header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--border-subtle);padding-bottom:8px}.preset-breadcrumb{margin:0 0 4px;color:var(--text-muted);display:flex;align-items:center;gap:6px;font-size:12px}.preset-detail-title{margin:0}.preset-detail-desc{margin:4px 0 0;color:var(--text-muted)}.preset-detail-actions{display:flex;gap:8px;align-items:center}.preset-meta-row{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}.preset-tags{display:flex;gap:8px;flex-wrap:wrap}.preset-tag.ghost-tag{border-style:dashed}.preset-meta-count{color:var(--text-muted);font-size:12px}.preset-ops-list{display:flex;flex-direction:column;gap:14px}.preset-op-card{border:1px solid var(--border-subtle);border-radius:var(--radius-card);background:var(--bg-card);padding:12px;box-shadow:0 6px 20px #0000001f}.preset-op-card.preset-op-missing{border-style:dashed;opacity:.85}.preset-op-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:8px}.preset-op-label{font-size:11px;color:var(--text-muted);letter-spacing:.08em;text-transform:uppercase}.preset-op-title{display:flex;align-items:center;gap:8px;font-weight:700}.preset-op-path{font-family:var(--font-mono);color:var(--text-main)}.preset-op-summary{margin-top:4px;font-weight:600}.preset-op-desc{margin:4px 0 0;color:var(--text-muted)}.preset-run-all{display:flex;justify-content:flex-end;align-items:center;gap:10px}.preset-run-status{color:var(--text-muted);font-size:12px}.section-header-row{display:flex;justify-content:space-between;align-items:flex-end;border-bottom:1px solid var(--border-subtle);margin-bottom:8px}.section-title-no-border{border:none;margin:0}.schema-actions-inline{margin-bottom:4px}.schema-actions-inline button.expand-all{background:none;border:none;color:var(--text-accent);cursor:pointer;font-size:10px}.schema-actions-inline button.collapse-all{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:10px}.endpoint-history-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px}.endpoint-history-stat{border:1px solid var(--border-subtle);border-radius:8px;padding:8px 10px;background:#ffffff0a}.endpoint-history-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.endpoint-history-value{font-size:16px;font-weight:700;color:var(--text-main)}.history-mini-empty{color:var(--text-muted);font-size:12px}.pg-header{padding:16px;border-bottom:1px solid var(--border-subtle);display:flex;justify-content:space-between;align-items:center;background:var(--bg-glass)}.pg-title{font-size:16px;font-weight:700;color:var(--text-main)}.pg-close{background:transparent;border:none;color:var(--text-muted);font-size:20px;cursor:pointer}.pg-close:hover{color:var(--text-main)}.pg-content{flex:1;overflow-y:auto;padding:20px;display:flex;flex-direction:column;gap:24px}.pg-section{display:flex;flex-direction:column;gap:8px}.pg-label{font-size:11px;text-transform:uppercase;color:var(--text-muted);font-weight:700;letter-spacing:.05em}.pg-input,.pg-textarea{background:#02061766;border:1px solid var(--border-subtle);color:var(--text-main);padding:8px;border-radius:6px;font-family:var(--font-mono);font-size:12px}.pg-input:focus,.pg-textarea:focus{outline:none;border-color:var(--accent-primary)}.pg-textarea{min-height:150px;resize:vertical}.json-input{display:flex;flex-direction:column;gap:6px}.json-input-toolbar{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}.json-input-status{font-size:11px;color:var(--text-muted)}.json-input-status.ok{color:var(--accent-success)}.json-input-status.error{color:var(--accent-error)}.json-input-actions{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.json-input-shell{display:flex;border:1px solid var(--border-subtle);border-radius:8px;overflow:hidden;background:#02061766}.json-line-numbers{background:#ffffff0a;color:var(--text-muted);padding:8px;font-family:var(--font-mono);font-size:11px;min-width:36px;display:flex;flex-direction:column;align-items:flex-end;gap:2px;max-height:320px;overflow:hidden}.json-input-area{border:none;border-left:1px solid var(--border-subtle);margin:0;min-height:200px;flex:1}.json-input-area:focus{outline:none}.pg-input-disabled-label{opacity:.7}.param-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.param-row{display:contents}.param-grid-queries{grid-template-columns:1fr 1fr 40px;align-items:center}.btn-remove-param{background:transparent;border:1px solid var(--border-subtle);color:var(--text-muted);border-radius:6px;width:36px;height:36px;cursor:pointer}.btn-remove-param:hover{color:var(--accent-error);border-color:var(--accent-error)}.btn-remove-param:disabled{opacity:.5;cursor:not-allowed}.btn-add-query{font-size:11px;background:none;border:1px dashed var(--border-subtle);color:var(--text-muted);padding:4px;cursor:pointer}.pg-footer{padding:16px;border-top:1px solid var(--border-subtle);background:var(--bg-glass);display:flex;justify-content:flex-end;gap:12px}.btn-clear{background:transparent;border:1px solid var(--border-subtle);color:var(--text-muted);padding:8px 14px;border-radius:6px;font-weight:600;cursor:pointer;transition:color .2s,border-color .2s}.btn-clear:hover{color:var(--text-main);border-color:var(--text-muted)}.btn-clear:disabled{opacity:.6;cursor:not-allowed}.btn-send{background:var(--accent-primary);color:#fff;border:none;padding:8px 24px;border-radius:6px;font-weight:600;cursor:pointer;transition:opacity .2s}.btn-send:hover{opacity:.9}.btn-send:disabled{opacity:.5;cursor:not-allowed}.response-box{background:#0000004d;border-radius:8px;border:1px solid var(--border-subtle);overflow:hidden}.response-meta{background:#ffffff0d;padding:8px 70px 8px 12px;display:flex;gap:12px;font-size:11px;font-family:var(--font-mono);border-bottom:1px solid var(--border-subtle);position:relative}.response-box{position:relative}.meta-item{display:flex;align-items:center;gap:4px}.status-ok{color:var(--accent-success)}.status-err{color:var(--accent-error)}.response-body{padding:12px;overflow-x:auto;font-family:var(--font-mono);font-size:12px}.pg-response-hidden{display:none}.response-pre{margin:0}.pg-run-stack{display:flex;flex-direction:column;gap:16px}.pg-run-card{border:1px solid var(--border-subtle);border-radius:10px;background:#ffffff08;display:flex;flex-direction:column}.pg-run-card-header{background:transparent;border:none;display:flex;justify-content:space-between;align-items:center;gap:10px;padding:12px;cursor:pointer;width:100%;color:var(--text-main)}.pg-run-card-header:hover{background:#ffffff08}.pg-run-card-title{display:flex;justify-content:space-between;align-items:center;gap:12px;font-weight:700;color:var(--text-main)}.pg-run-tags{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}.pg-run-chip{background:#ffffff0f;border:1px solid var(--border-subtle);padding:4px 8px;border-radius:999px;font-size:11px;color:var(--text-muted)}.pg-run-card-body{padding:12px;display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--border-subtle)}.pg-run-subtitle{font-size:12px;font-weight:600;color:var(--text-muted)}.pg-run-block{display:flex;flex-direction:column;gap:6px}.pg-run-meta-row{display:flex;flex-wrap:wrap;gap:6px}.json-tree{font-family:var(--font-mono);line-height:1.6}.jt-obj,.jt-arr{margin-left:14px}.jt-key{color:#93c5fd;margin-right:4px}.jt-str{color:#86efac}.jt-num{color:#fca5a5}.jt-bool{color:#fcd34d}.jt-null{color:#94a3b8}.jt-toggle{display:inline-block;width:12px;text-align:center;cursor:pointer;color:var(--text-muted);-webkit-user-select:none;user-select:none;margin-left:-14px}.jt-toggle:hover{color:var(--text-main)}.jt-collapsed .jt-content{display:none}.jt-collapsed:after{content:" ... ";color:var(--text-muted);font-size:10px}.json-tree-line{padding-left:16px}.history-view{display:flex;flex-direction:column;gap:16px}.history-toolbar{display:flex;flex-direction:column;gap:10px;padding:14px;background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:var(--radius-card);box-shadow:var(--shadow-card)}.history-toolbar-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}.history-path-filter{grid-column:span 2;min-width:280px}.history-search-filter{min-width:220px}@media(max-width:900px){.history-path-filter{grid-column:span 1;min-width:0}}.history-methods{min-height:36px}.history-duration .duration-inputs{display:flex;gap:8px}.history-date-range .duration-inputs{flex-wrap:wrap}.history-page-size{min-width:140px}.history-sort-row{display:flex;gap:8px;align-items:center}.sort-select{min-width:140px}.sort-direction-btn{height:32px;width:40px;border-radius:6px;border:1px solid var(--border-subtle);background:#ffffff08;color:var(--text-main);cursor:pointer}.sort-direction-btn:hover{border-color:var(--accent-primary);color:#fff}.history-toolbar-actions{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap;width:100%;padding-top:6px;border-top:1px dashed var(--border-subtle)}.history-list{display:flex;flex-direction:column;gap:12px}.history-card{border:1px solid var(--border-subtle);border-radius:var(--radius-card);background:var(--bg-card);overflow:hidden}.highlightOnHover:hover{background:#ffffff0d;cursor:pointer;border-radius:6px;padding:6px;margin:12px -6px -6px}.history-card:hover{border-color:#94a3b866;box-shadow:var(--shadow-card);transform:translateY(-2px)}.history-card[data-expanded=true]{box-shadow:var(--shadow-card)}.history-card-header{display:flex;align-items:center;gap:12px;padding:12px 14px;cursor:pointer}.history-card .expand-icon{color:var(--text-muted)}.history-card[data-expanded=true] .expand-icon{color:var(--text-main);transform:rotate(180deg)}.history-title{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.history-path{font-family:var(--font-mono);color:var(--text-main);overflow-wrap:anywhere}.history-meta-row{display:flex;align-items:center;gap:8px}.history-status{border:1px solid var(--border-subtle);padding:2px 8px;border-radius:6px;font-size:11px;color:var(--text-muted)}.history-status-error{border-color:var(--accent-error);color:var(--accent-error)}.history-status-warn{border-color:#facc15;color:#facc15}.history-status-good{border-color:var(--accent-success);color:var(--accent-success)}.history-chip{background:#ffffff0f;border:1px solid var(--border-subtle);color:var(--text-muted);padding:3px 8px;border-radius:6px;font-size:11px}.history-card-body{border-top:1px solid var(--border-subtle);padding:12px 14px;display:flex;flex-direction:column;gap:10px}.history-meta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px}.history-detail{display:flex;flex-direction:column;gap:4px}.history-detail-label{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.history-detail-value{font-size:13px;color:var(--text-main);overflow-wrap:anywhere}.history-kv{display:flex;flex-direction:column;gap:4px}.history-kv-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.history-kv-key{font-family:var(--font-mono);color:var(--text-main);min-width:100px}.history-kv-value{font-family:var(--font-mono);color:var(--text-muted)}.history-empty{color:var(--text-muted);font-style:italic}.history-pre{margin:0;background:#00000040;border:1px solid var(--border-subtle);border-radius:8px;padding:8px;overflow-x:auto;font-family:var(--font-mono);font-size:12px;white-space:pre-wrap}.history-error{color:var(--accent-error);font-weight:700}.history-logs{display:flex;flex-direction:column;gap:8px}.history-log-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-radius:10px;border:1px solid var(--border-subtle);background:#ffffff08;color:var(--text-main);cursor:pointer}.history-log-summary:hover{border-color:var(--accent-primary);background:#ffffff0d}.history-log-summary-main{display:flex;align-items:center;gap:10px}.history-log-summary-stats{display:flex;gap:6px;flex-wrap:wrap}.history-log-pill{border:1px solid var(--border-subtle);border-radius:999px;padding:3px 8px;font-size:11px;text-transform:capitalize;color:var(--text-muted)}.history-log-list{display:flex;flex-direction:column;gap:8px;padding:10px;border:1px solid var(--border-subtle);border-radius:8px;background:#00000040}.history-log-row{display:flex;flex-direction:column;gap:6px}.history-log-meta-row{background:#ffffff0d;border-radius:6px;padding:4px;margin:-4px}.history-log-meta-row:hover{background:#ffffff1a;cursor:pointer;border-radius:6px}.history-log-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.history-log-tags{display:flex;gap:6px;flex-wrap:wrap}.history-log-message{font-family:var(--font-mono);color:var(--text-main)}.history-log-meta-toggle{display:flex;flex-direction:column;gap:6px}.history-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;background:#ffffff03;border-radius:var(--radius-card);padding:8px;margin:4px -8px -8px}.history-stats-grid[data-clickable=true]{cursor:pointer}.history-stats-grid:hover{background:#ffffff0d}.analytics-panel{display:flex;flex-direction:column;gap:12px}.analytics-expando{grid-column:1 / -1;text-align:right;color:var(--text-muted);font-size:12px;display:flex;justify-content:flex-end;align-items:center;gap:6px}.history-stat-card{border:1px solid var(--border-subtle);border-radius:var(--radius-card);background:#ffffff08;padding:10px 12px;margin-left:4px;margin-right:4px}.history-stats-grid[data-clickable=true] .history-stat-card{transition:border-color .15s ease,transform .15s ease}.history-stat-card[data-tone=good]{border-color:#4ade8066}.history-stat-card[data-tone=warn]{border-color:#eab30866}.history-stat-card[data-tone=bad]{border-color:#f8717166}.history-stat-label{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.08em}.history-stat-value{font-size:22px;font-weight:800;margin-top:4px}.history-stat-hint{font-size:12px;color:var(--text-muted)}.history-graph-card{border:1px solid var(--border-subtle);border-radius:var(--radius-card);background:var(--bg-card);padding:10px 12px;display:flex;flex-direction:column;gap:10px;position:relative}.history-graph-header{display:flex;justify-content:space-between;align-items:center}.history-graph-title{font-weight:700}.history-graph-subtitle{color:var(--text-muted);font-size:12px}.history-graph-body{min-height:120px;display:flex;align-items:stretch}.history-graph-body>*{width:100%}.history-graph-empty{color:var(--text-muted);font-size:12px}.history-bar-chart{display:flex;flex-direction:column;gap:8px}.history-bar-row{display:grid;grid-template-columns:1fr 2fr auto;gap:8px;align-items:center}.history-bar-label{font-size:12px;color:var(--text-main)}.history-bar-track{height:10px;background:#ffffff0f;border-radius:999px;overflow:hidden}.history-bar-fill{height:100%;background:linear-gradient(90deg,var(--accent-primary),rgba(168,85,247,.3));border-radius:999px}.history-bar-fill.tone-good{background:linear-gradient(90deg,#4ade80,#4ade804d)}.history-bar-fill.tone-warn{background:linear-gradient(90deg,#facc15,#facc1540)}.history-bar-fill.tone-bad{background:linear-gradient(90deg,#f87171,#f8717140)}.history-bar-value{font-size:12px;color:var(--text-main);display:flex;flex-direction:column;align-items:flex-end}.history-bar-hint{color:var(--text-muted);font-size:11px}.history-line-chart{width:100%;height:100%;min-height:90px}.history-line-wrapper{position:relative;width:100%;height:100%}.history-line-path{fill:none;stroke:var(--accent-primary);stroke-width:.5}.history-line-dot{fill:#c4b5fd}.history-line-dot.dot-error{fill:var(--accent-error)}.history-line-grid{stroke:#94a3b84d;stroke-width:.6}.history-line-grid.vertical{opacity:.4}.history-line-axis{stroke:var(--border-subtle);stroke-width:1}.history-line-axis-label{fill:var(--text-muted);dominant-baseline:middle;font-size:4px}.history-line-axis-label.x-axis{text-anchor:middle}.history-graph-card.graph-timeline .history-graph-body{min-height:104px}.history-graphs-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.history-graph-card.graph-boxplot .history-graph-body{min-height:320px;flex:1}@media(min-width:1100px){.history-graphs-grid{grid-template-columns:repeat(4,minmax(0,1fr));grid-template-areas:"timeline timeline boxplot top" "status volume boxplot top";grid-auto-rows:minmax(140px,auto)}.history-graph-card.graph-timeline{grid-area:timeline}.history-graph-card.graph-status{grid-area:status}.history-graph-card.graph-volume{grid-area:volume}.history-graph-card.graph-boxplot{grid-area:boxplot}.history-graph-card.graph-top-paths{grid-area:top}}.history-boxplot-vertical{position:relative;padding-left:64px;padding-bottom:52px;min-height:240px;height:100%}.boxplot-scale{position:absolute;left:0;right:0;top:6px;bottom:52px;pointer-events:none}.scale-row{position:absolute;left:0;right:0;display:flex;align-items:center;gap:8px;font-size:11px;color:var(--text-muted)}.scale-label{width:60px;text-align:right}.scale-line{flex:1;height:1px;background:var(--border-subtle);opacity:.6}.boxplot-columns{display:flex;align-items:stretch;gap:14px;min-height:100%;height:100%;overflow-x:auto;padding-left:4px;padding-bottom:8px}.boxplot-column{display:flex;flex-direction:column;align-items:center;gap:6px;min-width:56px;flex:1 1 56px}.boxplot-vert-track{position:relative;width:32px;flex:1 1 auto;min-height:140px;background:#ffffff0a;border:1px solid var(--border-subtle);border-radius:10px;overflow:hidden}.boxplot-vert-whisker{position:absolute;left:13px;width:6px;background:#94a3b899;border-radius:6px}.boxplot-vert-box{position:absolute;left:7px;width:18px;background:#c4b5fd4d;border:1px solid var(--accent-primary);border-radius:8px}.boxplot-vert-median{position:absolute;left:4px;right:4px;height:2px;background:var(--accent-primary)}.boxplot-col-label{font-size:12px;color:var(--text-main);font-weight:700}.boxplot-col-meta{font-size:11px;color:var(--text-muted);margin-bottom:-4px}.copy-pre-wrapper{position:relative;display:flex;flex-direction:column;gap:6px}.copy-pre-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;position:absolute;right:6px;top:6px}.copy-pre-wrapper .history-pre{padding-right:12px}.copy-btn{position:relative;top:0;right:0;background:#ffffff14;border:1px solid var(--border-subtle);color:var(--text-main);border-radius:6px;padding:4px 8px;font-size:10px;cursor:pointer;z-index:2}.copy-btn:hover{border-color:var(--accent-primary);color:#fff}.history-error-banner{background:#fff1f0;border:1px solid #f5c2c0;color:#8a1f11;padding:8px 12px;border-radius:6px;margin:12px 0}.history-loading{margin:8px 0 4px;color:#555}.history-pagination{display:flex;align-items:center;justify-content:space-between;margin:12px 0}.m-error,.m-ERROR{background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.m-warn,.m-WARN{background:#fff7ed;color:#c05621;border:1px solid #fbd38d}.m-info,.m-INFO{background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.m-debug,.m-DEBUG{background:#f7fafc;color:#4a5568;border:1px solid #e2e8f0}.m-system,.m-SYSTEM{background:#eef2ff;color:#4338ca;border:1px solid #cbd5ff}.hidden-template{display:none}
|