@tanstack/ai-devtools-core 0.3.4 → 0.3.7
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 +1 -1
- package/dist/Shell/GHXECDJV.js +5056 -0
- package/dist/Shell/MUFU35SY.js +4242 -0
- package/dist/dev.js +11 -0
- package/dist/{esm/index.d.ts → index.d.ts} +7 -5
- package/dist/index.js +11 -0
- package/dist/production/Shell/GHXECDJV.js +5056 -0
- package/dist/production/Shell/MUFU35SY.js +4242 -0
- package/dist/production/dev.js +8 -0
- package/dist/production/index.d.ts +12 -0
- package/dist/production/index.js +8 -0
- package/dist/production/server.js +8 -0
- package/dist/server.js +11 -0
- package/package.json +45 -11
- package/src/{core.tsx → core.ts} +4 -5
- package/dist/esm/components/ConversationDetails.d.ts +0 -2
- package/dist/esm/components/ConversationDetails.js +0 -192
- package/dist/esm/components/ConversationDetails.js.map +0 -1
- package/dist/esm/components/ConversationsList.d.ts +0 -2
- package/dist/esm/components/ConversationsList.js +0 -30
- package/dist/esm/components/ConversationsList.js.map +0 -1
- package/dist/esm/components/Shell.d.ts +0 -1
- package/dist/esm/components/Shell.js +0 -94
- package/dist/esm/components/Shell.js.map +0 -1
- package/dist/esm/components/conversation/ActivityEventsTab.d.ts +0 -8
- package/dist/esm/components/conversation/ActivityEventsTab.js +0 -72
- package/dist/esm/components/conversation/ActivityEventsTab.js.map +0 -1
- package/dist/esm/components/conversation/ChunkBadges.d.ts +0 -7
- package/dist/esm/components/conversation/ChunkBadges.js +0 -54
- package/dist/esm/components/conversation/ChunkBadges.js.map +0 -1
- package/dist/esm/components/conversation/ChunkItem.d.ts +0 -9
- package/dist/esm/components/conversation/ChunkItem.js +0 -247
- package/dist/esm/components/conversation/ChunkItem.js.map +0 -1
- package/dist/esm/components/conversation/ChunksCollapsible.d.ts +0 -7
- package/dist/esm/components/conversation/ChunksCollapsible.js +0 -77
- package/dist/esm/components/conversation/ChunksCollapsible.js.map +0 -1
- package/dist/esm/components/conversation/ChunksTab.d.ts +0 -8
- package/dist/esm/components/conversation/ChunksTab.js +0 -87
- package/dist/esm/components/conversation/ChunksTab.js.map +0 -1
- package/dist/esm/components/conversation/ConversationHeader.d.ts +0 -7
- package/dist/esm/components/conversation/ConversationHeader.js +0 -230
- package/dist/esm/components/conversation/ConversationHeader.js.map +0 -1
- package/dist/esm/components/conversation/ConversationTabs.d.ts +0 -10
- package/dist/esm/components/conversation/ConversationTabs.js +0 -176
- package/dist/esm/components/conversation/ConversationTabs.js.map +0 -1
- package/dist/esm/components/conversation/MessageCard.d.ts +0 -7
- package/dist/esm/components/conversation/MessageCard.js +0 -207
- package/dist/esm/components/conversation/MessageCard.js.map +0 -1
- package/dist/esm/components/conversation/MessageGroup.d.ts +0 -15
- package/dist/esm/components/conversation/MessageGroup.js +0 -119
- package/dist/esm/components/conversation/MessageGroup.js.map +0 -1
- package/dist/esm/components/conversation/MessagesTab.d.ts +0 -7
- package/dist/esm/components/conversation/MessagesTab.js +0 -37
- package/dist/esm/components/conversation/MessagesTab.js.map +0 -1
- package/dist/esm/components/conversation/SummariesTab.d.ts +0 -7
- package/dist/esm/components/conversation/SummariesTab.js +0 -110
- package/dist/esm/components/conversation/SummariesTab.js.map +0 -1
- package/dist/esm/components/conversation/ToolCallDisplay.d.ts +0 -7
- package/dist/esm/components/conversation/ToolCallDisplay.js +0 -123
- package/dist/esm/components/conversation/ToolCallDisplay.js.map +0 -1
- package/dist/esm/components/conversation/index.d.ts +0 -7
- package/dist/esm/components/list/ConversationRow.d.ts +0 -7
- package/dist/esm/components/list/ConversationRow.js +0 -122
- package/dist/esm/components/list/ConversationRow.js.map +0 -1
- package/dist/esm/components/list/index.d.ts +0 -1
- package/dist/esm/components/utils/format.d.ts +0 -6
- package/dist/esm/components/utils/format.js +0 -68
- package/dist/esm/components/utils/format.js.map +0 -1
- package/dist/esm/components/utils/index.d.ts +0 -1
- package/dist/esm/core.d.ts +0 -22
- package/dist/esm/core.js +0 -9
- package/dist/esm/core.js.map +0 -1
- package/dist/esm/index.js +0 -6
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/production.d.ts +0 -2
- package/dist/esm/production.js +0 -5
- package/dist/esm/production.js.map +0 -1
- package/dist/esm/store/ai-context.d.ts +0 -135
- package/dist/esm/store/ai-context.js +0 -1238
- package/dist/esm/store/ai-context.js.map +0 -1
- package/dist/esm/store/ai-store.d.ts +0 -1
- package/dist/esm/styles/tokens.d.ts +0 -298
- package/dist/esm/styles/tokens.js +0 -107
- package/dist/esm/styles/tokens.js.map +0 -1
- package/dist/esm/styles/use-styles.d.ts +0 -233
- package/dist/esm/styles/use-styles.js +0 -1602
- package/dist/esm/styles/use-styles.js.map +0 -1
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { template, insert, createComponent, effect, className, memo } from "solid-js/web";
|
|
2
|
-
import { Show, For } from "solid-js";
|
|
3
|
-
import { JsonTree } from "@tanstack/devtools-ui";
|
|
4
|
-
import { useStyles } from "../../styles/use-styles.js";
|
|
5
|
-
import { formatDuration } from "../utils/format.js";
|
|
6
|
-
var _tmpl$ = /* @__PURE__ */ template(`<div>🔄 <!> iterations`), _tmpl$2 = /* @__PURE__ */ template(`<div><span>🔧</span><div>`), _tmpl$3 = /* @__PURE__ */ template(`<div><span>⚙️ Options:</span><div>`), _tmpl$4 = /* @__PURE__ */ template(`<div><span>🎯 Tokens:</span><span>Prompt: </span><span>•</span><span>Completion: </span><span>•</span><span>Total: `), _tmpl$5 = /* @__PURE__ */ template(`<details><summary>🧪 Model options</summary><div>`), _tmpl$6 = /* @__PURE__ */ template(`<details><summary>🧩 System prompts (<!>)</summary><div>`), _tmpl$7 = /* @__PURE__ */ template(`<div><div><div><div></div><div></div></div><div>`), _tmpl$8 = /* @__PURE__ */ template(`<span>`), _tmpl$9 = /* @__PURE__ */ template(`<span>: `), _tmpl$0 = /* @__PURE__ */ template(`<div><div>#</div><div>`);
|
|
7
|
-
const ConversationHeader = (props) => {
|
|
8
|
-
const styles = useStyles();
|
|
9
|
-
const conv = () => props.conversation;
|
|
10
|
-
const toolNames = () => conv().toolNames ?? [];
|
|
11
|
-
const options = () => conv().options;
|
|
12
|
-
const modelOptions = () => conv().modelOptions;
|
|
13
|
-
const iterationCount = () => conv().iterationCount;
|
|
14
|
-
const systemPrompts = () => conv().systemPrompts ?? [];
|
|
15
|
-
return (() => {
|
|
16
|
-
var _el$ = _tmpl$7(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$0 = _el$3.nextSibling;
|
|
17
|
-
insert(_el$4, () => conv().label);
|
|
18
|
-
insert(_el$5, () => conv().status);
|
|
19
|
-
insert(_el$3, createComponent(Show, {
|
|
20
|
-
get when() {
|
|
21
|
-
return memo(() => iterationCount() !== void 0)() && iterationCount() > 1;
|
|
22
|
-
},
|
|
23
|
-
get children() {
|
|
24
|
-
var _el$6 = _tmpl$(), _el$7 = _el$6.firstChild, _el$9 = _el$7.nextSibling;
|
|
25
|
-
_el$9.nextSibling;
|
|
26
|
-
insert(_el$6, iterationCount, _el$9);
|
|
27
|
-
effect(() => className(_el$6, styles().conversationDetails.iterationBadge));
|
|
28
|
-
return _el$6;
|
|
29
|
-
}
|
|
30
|
-
}), null);
|
|
31
|
-
insert(_el$0, (() => {
|
|
32
|
-
var _c$ = memo(() => !!conv().model);
|
|
33
|
-
return () => _c$() && `Model: ${conv().model}`;
|
|
34
|
-
})(), null);
|
|
35
|
-
insert(_el$0, (() => {
|
|
36
|
-
var _c$2 = memo(() => !!conv().provider);
|
|
37
|
-
return () => _c$2() && ` • Provider: ${conv().provider}`;
|
|
38
|
-
})(), null);
|
|
39
|
-
insert(_el$0, (() => {
|
|
40
|
-
var _c$3 = memo(() => !!conv().completedAt);
|
|
41
|
-
return () => _c$3() && ` • Duration: ${formatDuration(conv().completedAt - conv().startedAt)}`;
|
|
42
|
-
})(), null);
|
|
43
|
-
insert(_el$2, createComponent(Show, {
|
|
44
|
-
get when() {
|
|
45
|
-
return toolNames().length > 0;
|
|
46
|
-
},
|
|
47
|
-
get children() {
|
|
48
|
-
var _el$1 = _tmpl$2(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
|
|
49
|
-
insert(_el$11, createComponent(For, {
|
|
50
|
-
get each() {
|
|
51
|
-
return toolNames();
|
|
52
|
-
},
|
|
53
|
-
children: (toolName) => (() => {
|
|
54
|
-
var _el$34 = _tmpl$8();
|
|
55
|
-
insert(_el$34, toolName);
|
|
56
|
-
effect(() => className(_el$34, styles().conversationDetails.toolBadge));
|
|
57
|
-
return _el$34;
|
|
58
|
-
})()
|
|
59
|
-
}));
|
|
60
|
-
effect((_p$) => {
|
|
61
|
-
var _v$ = styles().conversationDetails.toolsRow, _v$2 = styles().conversationDetails.toolsLabel, _v$3 = styles().conversationDetails.toolsList;
|
|
62
|
-
_v$ !== _p$.e && className(_el$1, _p$.e = _v$);
|
|
63
|
-
_v$2 !== _p$.t && className(_el$10, _p$.t = _v$2);
|
|
64
|
-
_v$3 !== _p$.a && className(_el$11, _p$.a = _v$3);
|
|
65
|
-
return _p$;
|
|
66
|
-
}, {
|
|
67
|
-
e: void 0,
|
|
68
|
-
t: void 0,
|
|
69
|
-
a: void 0
|
|
70
|
-
});
|
|
71
|
-
return _el$1;
|
|
72
|
-
}
|
|
73
|
-
}), null);
|
|
74
|
-
insert(_el$2, createComponent(Show, {
|
|
75
|
-
get when() {
|
|
76
|
-
return memo(() => !!options())() && Object.keys(options()).length > 0;
|
|
77
|
-
},
|
|
78
|
-
get children() {
|
|
79
|
-
var _el$12 = _tmpl$3(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
|
|
80
|
-
insert(_el$14, createComponent(For, {
|
|
81
|
-
get each() {
|
|
82
|
-
return Object.entries(options());
|
|
83
|
-
},
|
|
84
|
-
children: ([key, value]) => (() => {
|
|
85
|
-
var _el$35 = _tmpl$9(), _el$36 = _el$35.firstChild;
|
|
86
|
-
insert(_el$35, key, _el$36);
|
|
87
|
-
insert(_el$35, () => typeof value === "object" ? JSON.stringify(value) : String(value), null);
|
|
88
|
-
effect(() => className(_el$35, styles().conversationDetails.optionBadge));
|
|
89
|
-
return _el$35;
|
|
90
|
-
})()
|
|
91
|
-
}));
|
|
92
|
-
effect((_p$) => {
|
|
93
|
-
var _v$4 = styles().conversationDetails.optionsRow, _v$5 = styles().conversationDetails.optionsLabel, _v$6 = styles().conversationDetails.optionsCompact;
|
|
94
|
-
_v$4 !== _p$.e && className(_el$12, _p$.e = _v$4);
|
|
95
|
-
_v$5 !== _p$.t && className(_el$13, _p$.t = _v$5);
|
|
96
|
-
_v$6 !== _p$.a && className(_el$14, _p$.a = _v$6);
|
|
97
|
-
return _p$;
|
|
98
|
-
}, {
|
|
99
|
-
e: void 0,
|
|
100
|
-
t: void 0,
|
|
101
|
-
a: void 0
|
|
102
|
-
});
|
|
103
|
-
return _el$12;
|
|
104
|
-
}
|
|
105
|
-
}), null);
|
|
106
|
-
insert(_el$2, createComponent(Show, {
|
|
107
|
-
get when() {
|
|
108
|
-
return conv().usage;
|
|
109
|
-
},
|
|
110
|
-
get children() {
|
|
111
|
-
var _el$15 = _tmpl$4(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
|
|
112
|
-
_el$17.firstChild;
|
|
113
|
-
var _el$19 = _el$17.nextSibling, _el$20 = _el$19.nextSibling;
|
|
114
|
-
_el$20.firstChild;
|
|
115
|
-
var _el$22 = _el$20.nextSibling, _el$23 = _el$22.nextSibling;
|
|
116
|
-
_el$23.firstChild;
|
|
117
|
-
insert(_el$17, () => conv().usage?.promptTokens.toLocaleString() || 0, null);
|
|
118
|
-
insert(_el$20, () => conv().usage?.completionTokens.toLocaleString() || 0, null);
|
|
119
|
-
insert(_el$23, () => conv().usage?.totalTokens.toLocaleString() || 0, null);
|
|
120
|
-
effect((_p$) => {
|
|
121
|
-
var _v$7 = styles().conversationDetails.usageInfo, _v$8 = styles().conversationDetails.usageLabel, _v$9 = styles().conversationDetails.usageBold;
|
|
122
|
-
_v$7 !== _p$.e && className(_el$15, _p$.e = _v$7);
|
|
123
|
-
_v$8 !== _p$.t && className(_el$16, _p$.t = _v$8);
|
|
124
|
-
_v$9 !== _p$.a && className(_el$23, _p$.a = _v$9);
|
|
125
|
-
return _p$;
|
|
126
|
-
}, {
|
|
127
|
-
e: void 0,
|
|
128
|
-
t: void 0,
|
|
129
|
-
a: void 0
|
|
130
|
-
});
|
|
131
|
-
return _el$15;
|
|
132
|
-
}
|
|
133
|
-
}), null);
|
|
134
|
-
insert(_el$2, createComponent(Show, {
|
|
135
|
-
get when() {
|
|
136
|
-
return memo(() => !!modelOptions())() && Object.keys(modelOptions()).length > 0;
|
|
137
|
-
},
|
|
138
|
-
get children() {
|
|
139
|
-
var _el$25 = _tmpl$5(), _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling;
|
|
140
|
-
insert(_el$27, createComponent(JsonTree, {
|
|
141
|
-
get value() {
|
|
142
|
-
return modelOptions();
|
|
143
|
-
},
|
|
144
|
-
defaultExpansionDepth: 2
|
|
145
|
-
}));
|
|
146
|
-
effect((_p$) => {
|
|
147
|
-
var _v$0 = styles().conversationDetails.collapsibleSection, _v$1 = styles().conversationDetails.collapsibleSummary, _v$10 = styles().conversationDetails.collapsibleContent;
|
|
148
|
-
_v$0 !== _p$.e && className(_el$25, _p$.e = _v$0);
|
|
149
|
-
_v$1 !== _p$.t && className(_el$26, _p$.t = _v$1);
|
|
150
|
-
_v$10 !== _p$.a && className(_el$27, _p$.a = _v$10);
|
|
151
|
-
return _p$;
|
|
152
|
-
}, {
|
|
153
|
-
e: void 0,
|
|
154
|
-
t: void 0,
|
|
155
|
-
a: void 0
|
|
156
|
-
});
|
|
157
|
-
return _el$25;
|
|
158
|
-
}
|
|
159
|
-
}), null);
|
|
160
|
-
insert(_el$2, createComponent(Show, {
|
|
161
|
-
get when() {
|
|
162
|
-
return systemPrompts().length > 0;
|
|
163
|
-
},
|
|
164
|
-
get children() {
|
|
165
|
-
var _el$28 = _tmpl$6(), _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling;
|
|
166
|
-
_el$32.nextSibling;
|
|
167
|
-
var _el$33 = _el$29.nextSibling;
|
|
168
|
-
insert(_el$29, () => systemPrompts().length, _el$32);
|
|
169
|
-
insert(_el$33, createComponent(For, {
|
|
170
|
-
get each() {
|
|
171
|
-
return systemPrompts();
|
|
172
|
-
},
|
|
173
|
-
children: (prompt, index) => (() => {
|
|
174
|
-
var _el$38 = _tmpl$0(), _el$39 = _el$38.firstChild;
|
|
175
|
-
_el$39.firstChild;
|
|
176
|
-
var _el$41 = _el$39.nextSibling;
|
|
177
|
-
insert(_el$39, () => index() + 1, null);
|
|
178
|
-
insert(_el$41, prompt);
|
|
179
|
-
effect((_p$) => {
|
|
180
|
-
var _v$20 = styles().conversationDetails.systemPromptItem, _v$21 = styles().conversationDetails.systemPromptIndex, _v$22 = styles().conversationDetails.systemPromptText;
|
|
181
|
-
_v$20 !== _p$.e && className(_el$38, _p$.e = _v$20);
|
|
182
|
-
_v$21 !== _p$.t && className(_el$39, _p$.t = _v$21);
|
|
183
|
-
_v$22 !== _p$.a && className(_el$41, _p$.a = _v$22);
|
|
184
|
-
return _p$;
|
|
185
|
-
}, {
|
|
186
|
-
e: void 0,
|
|
187
|
-
t: void 0,
|
|
188
|
-
a: void 0
|
|
189
|
-
});
|
|
190
|
-
return _el$38;
|
|
191
|
-
})()
|
|
192
|
-
}));
|
|
193
|
-
effect((_p$) => {
|
|
194
|
-
var _v$11 = styles().conversationDetails.collapsibleSection, _v$12 = styles().conversationDetails.collapsibleSummary, _v$13 = styles().conversationDetails.collapsibleContent;
|
|
195
|
-
_v$11 !== _p$.e && className(_el$28, _p$.e = _v$11);
|
|
196
|
-
_v$12 !== _p$.t && className(_el$29, _p$.t = _v$12);
|
|
197
|
-
_v$13 !== _p$.a && className(_el$33, _p$.a = _v$13);
|
|
198
|
-
return _p$;
|
|
199
|
-
}, {
|
|
200
|
-
e: void 0,
|
|
201
|
-
t: void 0,
|
|
202
|
-
a: void 0
|
|
203
|
-
});
|
|
204
|
-
return _el$28;
|
|
205
|
-
}
|
|
206
|
-
}), null);
|
|
207
|
-
effect((_p$) => {
|
|
208
|
-
var _v$14 = styles().panelHeader, _v$15 = styles().conversationDetails.headerContent, _v$16 = styles().conversationDetails.headerRow, _v$17 = styles().conversationDetails.headerLabel, _v$18 = `${styles().conversationDetails.statusBadge} ${conv().status === "active" ? styles().conversationDetails.statusActive : conv().status === "completed" ? styles().conversationDetails.statusCompleted : styles().conversationDetails.statusError}`, _v$19 = styles().conversationDetails.metaInfo;
|
|
209
|
-
_v$14 !== _p$.e && className(_el$, _p$.e = _v$14);
|
|
210
|
-
_v$15 !== _p$.t && className(_el$2, _p$.t = _v$15);
|
|
211
|
-
_v$16 !== _p$.a && className(_el$3, _p$.a = _v$16);
|
|
212
|
-
_v$17 !== _p$.o && className(_el$4, _p$.o = _v$17);
|
|
213
|
-
_v$18 !== _p$.i && className(_el$5, _p$.i = _v$18);
|
|
214
|
-
_v$19 !== _p$.n && className(_el$0, _p$.n = _v$19);
|
|
215
|
-
return _p$;
|
|
216
|
-
}, {
|
|
217
|
-
e: void 0,
|
|
218
|
-
t: void 0,
|
|
219
|
-
a: void 0,
|
|
220
|
-
o: void 0,
|
|
221
|
-
i: void 0,
|
|
222
|
-
n: void 0
|
|
223
|
-
});
|
|
224
|
-
return _el$;
|
|
225
|
-
})();
|
|
226
|
-
};
|
|
227
|
-
export {
|
|
228
|
-
ConversationHeader
|
|
229
|
-
};
|
|
230
|
-
//# sourceMappingURL=ConversationHeader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationHeader.js","sources":["../../../../src/components/conversation/ConversationHeader.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { JsonTree } from '@tanstack/devtools-ui'\nimport { useStyles } from '../../styles/use-styles'\nimport { formatDuration } from '../utils'\nimport type { Component } from 'solid-js'\nimport type { Conversation } from '../../store/ai-context'\n\ninterface ConversationHeaderProps {\n conversation: Conversation\n}\n\nexport const ConversationHeader: Component<ConversationHeaderProps> = (\n props,\n) => {\n const styles = useStyles()\n const conv = () => props.conversation\n\n const toolNames = () => conv().toolNames ?? []\n const options = () => conv().options\n const modelOptions = () => conv().modelOptions\n const iterationCount = () => conv().iterationCount\n const systemPrompts = () => conv().systemPrompts ?? []\n\n return (\n <div class={styles().panelHeader}>\n <div class={styles().conversationDetails.headerContent}>\n <div class={styles().conversationDetails.headerRow}>\n <div class={styles().conversationDetails.headerLabel}>\n {conv().label}\n </div>\n <div\n class={`${styles().conversationDetails.statusBadge} ${\n conv().status === 'active'\n ? styles().conversationDetails.statusActive\n : conv().status === 'completed'\n ? styles().conversationDetails.statusCompleted\n : styles().conversationDetails.statusError\n }`}\n >\n {conv().status}\n </div>\n <Show when={iterationCount() !== undefined && iterationCount()! > 1}>\n <div class={styles().conversationDetails.iterationBadge}>\n 🔄 {iterationCount()} iterations\n </div>\n </Show>\n </div>\n <div class={styles().conversationDetails.metaInfo}>\n {conv().model && `Model: ${conv().model}`}\n {conv().provider && ` • Provider: ${conv().provider}`}\n {conv().completedAt &&\n ` • Duration: ${formatDuration(conv().completedAt! - conv().startedAt)}`}\n </div>\n {/* Tools list - always visible */}\n <Show when={toolNames().length > 0}>\n <div class={styles().conversationDetails.toolsRow}>\n <span class={styles().conversationDetails.toolsLabel}>🔧</span>\n <div class={styles().conversationDetails.toolsList}>\n <For each={toolNames()}>\n {(toolName) => (\n <span class={styles().conversationDetails.toolBadge}>\n {toolName}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n {/* Options - always visible in compact form */}\n <Show when={options() && Object.keys(options()!).length > 0}>\n <div class={styles().conversationDetails.optionsRow}>\n <span class={styles().conversationDetails.optionsLabel}>\n ⚙️ Options:\n </span>\n <div class={styles().conversationDetails.optionsCompact}>\n <For each={Object.entries(options()!)}>\n {([key, value]) => (\n <span class={styles().conversationDetails.optionBadge}>\n {key}:{' '}\n {typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={conv().usage}>\n <div class={styles().conversationDetails.usageInfo}>\n <span class={styles().conversationDetails.usageLabel}>\n 🎯 Tokens:\n </span>\n <span>\n Prompt: {conv().usage?.promptTokens.toLocaleString() || 0}\n </span>\n <span>•</span>\n <span>\n Completion: {conv().usage?.completionTokens.toLocaleString() || 0}\n </span>\n <span>•</span>\n <span class={styles().conversationDetails.usageBold}>\n Total: {conv().usage?.totalTokens.toLocaleString() || 0}\n </span>\n </div>\n </Show>\n {/* Model options - collapsible */}\n <Show when={modelOptions() && Object.keys(modelOptions()!).length > 0}>\n <details class={styles().conversationDetails.collapsibleSection}>\n <summary class={styles().conversationDetails.collapsibleSummary}>\n 🧪 Model options\n </summary>\n <div class={styles().conversationDetails.collapsibleContent}>\n <JsonTree\n value={modelOptions() as Record<string, unknown>}\n defaultExpansionDepth={2}\n />\n </div>\n </details>\n </Show>\n {/* System prompts - collapsible */}\n <Show when={systemPrompts().length > 0}>\n <details class={styles().conversationDetails.collapsibleSection}>\n <summary class={styles().conversationDetails.collapsibleSummary}>\n 🧩 System prompts ({systemPrompts().length})\n </summary>\n <div class={styles().conversationDetails.collapsibleContent}>\n <For each={systemPrompts()}>\n {(prompt, index) => (\n <div class={styles().conversationDetails.systemPromptItem}>\n <div class={styles().conversationDetails.systemPromptIndex}>\n #{index() + 1}\n </div>\n <div class={styles().conversationDetails.systemPromptText}>\n {prompt}\n </div>\n </div>\n )}\n </For>\n </div>\n </details>\n </Show>\n </div>\n </div>\n )\n}\n"],"names":["ConversationHeader","props","styles","useStyles","conv","conversation","toolNames","options","modelOptions","iterationCount","systemPrompts","_el$","_tmpl$7","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$0","_$insert","label","status","_$createComponent","Show","when","_$memo","undefined","children","_el$6","_tmpl$","_el$7","_el$9","_$effect","_$className","conversationDetails","iterationBadge","_c$","model","_c$2","provider","_c$3","completedAt","formatDuration","startedAt","length","_el$1","_tmpl$2","_el$10","_el$11","For","each","toolName","_el$34","_tmpl$8","toolBadge","_p$","_v$","toolsRow","_v$2","toolsLabel","_v$3","toolsList","e","t","a","Object","keys","_el$12","_tmpl$3","_el$13","_el$14","entries","key","value","_el$35","_tmpl$9","_el$36","JSON","stringify","String","optionBadge","_v$4","optionsRow","_v$5","optionsLabel","_v$6","optionsCompact","usage","_el$15","_tmpl$4","_el$16","_el$17","_el$19","_el$20","_el$22","_el$23","promptTokens","toLocaleString","completionTokens","totalTokens","_v$7","usageInfo","_v$8","usageLabel","_v$9","usageBold","_el$25","_tmpl$5","_el$26","_el$27","JsonTree","defaultExpansionDepth","_v$0","collapsibleSection","_v$1","collapsibleSummary","_v$10","collapsibleContent","_el$28","_tmpl$6","_el$29","_el$30","_el$32","_el$33","prompt","index","_el$38","_tmpl$0","_el$39","_el$41","_v$20","systemPromptItem","_v$21","systemPromptIndex","_v$22","systemPromptText","_v$11","_v$12","_v$13","_v$14","panelHeader","_v$15","headerContent","_v$16","headerRow","_v$17","headerLabel","_v$18","statusBadge","statusActive","statusCompleted","statusError","_v$19","metaInfo","o","i","n"],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Component } from 'solid-js';
|
|
2
|
-
import { Conversation } from '../../store/ai-context.js';
|
|
3
|
-
export type TabType = 'messages' | 'chunks' | 'summaries' | 'image' | 'speech' | 'transcription' | 'video';
|
|
4
|
-
interface ConversationTabsProps {
|
|
5
|
-
conversation: Conversation;
|
|
6
|
-
activeTab: TabType;
|
|
7
|
-
onTabChange: (tab: TabType) => void;
|
|
8
|
-
}
|
|
9
|
-
export declare const ConversationTabs: Component<ConversationTabsProps>;
|
|
10
|
-
export {};
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { template, insert, createComponent, effect, className, memo, delegateEvents } from "solid-js/web";
|
|
2
|
-
import { createSignal, createEffect, Show } from "solid-js";
|
|
3
|
-
import { useStyles } from "../../styles/use-styles.js";
|
|
4
|
-
var _tmpl$ = /* @__PURE__ */ template(`<button>💬 Messages (<!>)`), _tmpl$2 = /* @__PURE__ */ template(`<button>📦 Chunks (<!>)`), _tmpl$3 = /* @__PURE__ */ template(`<button>📝 Summaries (<!>)`), _tmpl$4 = /* @__PURE__ */ template(`<button>🖼️ Image (<!>)`), _tmpl$5 = /* @__PURE__ */ template(`<button>🔊 Speech (<!>)`), _tmpl$6 = /* @__PURE__ */ template(`<button>📝 Transcription (<!>)`), _tmpl$7 = /* @__PURE__ */ template(`<button>🎬 Video (<!>)`), _tmpl$8 = /* @__PURE__ */ template(`<div>`);
|
|
5
|
-
const ConversationTabs = (props) => {
|
|
6
|
-
const styles = useStyles();
|
|
7
|
-
const conv = () => props.conversation;
|
|
8
|
-
const totalRawChunks = () => conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0);
|
|
9
|
-
const summariesCount = () => conv().summaries?.length ?? 0;
|
|
10
|
-
const imageCount = () => conv().imageEvents?.length ?? 0;
|
|
11
|
-
const speechCount = () => conv().speechEvents?.length ?? 0;
|
|
12
|
-
const transcriptionCount = () => conv().transcriptionEvents?.length ?? 0;
|
|
13
|
-
const videoCount = () => conv().videoEvents?.length ?? 0;
|
|
14
|
-
const [imagePulse, setImagePulse] = createSignal(false);
|
|
15
|
-
const [speechPulse, setSpeechPulse] = createSignal(false);
|
|
16
|
-
const [transcriptionPulse, setTranscriptionPulse] = createSignal(false);
|
|
17
|
-
const [videoPulse, setVideoPulse] = createSignal(false);
|
|
18
|
-
const triggerPulse = (setter) => {
|
|
19
|
-
setter(true);
|
|
20
|
-
setTimeout(() => setter(false), 2e3);
|
|
21
|
-
};
|
|
22
|
-
let previousImageCount = 0;
|
|
23
|
-
let previousSpeechCount = 0;
|
|
24
|
-
let previousTranscriptionCount = 0;
|
|
25
|
-
let previousVideoCount = 0;
|
|
26
|
-
createEffect(() => {
|
|
27
|
-
const count = imageCount();
|
|
28
|
-
if (count > 0 && previousImageCount === 0) {
|
|
29
|
-
triggerPulse(setImagePulse);
|
|
30
|
-
}
|
|
31
|
-
previousImageCount = count;
|
|
32
|
-
});
|
|
33
|
-
createEffect(() => {
|
|
34
|
-
const count = speechCount();
|
|
35
|
-
if (count > 0 && previousSpeechCount === 0) {
|
|
36
|
-
triggerPulse(setSpeechPulse);
|
|
37
|
-
}
|
|
38
|
-
previousSpeechCount = count;
|
|
39
|
-
});
|
|
40
|
-
createEffect(() => {
|
|
41
|
-
const count = transcriptionCount();
|
|
42
|
-
if (count > 0 && previousTranscriptionCount === 0) {
|
|
43
|
-
triggerPulse(setTranscriptionPulse);
|
|
44
|
-
}
|
|
45
|
-
previousTranscriptionCount = count;
|
|
46
|
-
});
|
|
47
|
-
createEffect(() => {
|
|
48
|
-
const count = videoCount();
|
|
49
|
-
if (count > 0 && previousVideoCount === 0) {
|
|
50
|
-
triggerPulse(setVideoPulse);
|
|
51
|
-
}
|
|
52
|
-
previousVideoCount = count;
|
|
53
|
-
});
|
|
54
|
-
const hasMessages = () => conv().type === "client" && conv().messages.length > 0;
|
|
55
|
-
const hasChunks = () => conv().chunks.length > 0 || conv().type === "server";
|
|
56
|
-
const hasSummaries = () => conv().hasSummarize || summariesCount() > 0;
|
|
57
|
-
const hasImage = () => conv().hasImage || imageCount() > 0;
|
|
58
|
-
const hasSpeech = () => conv().hasSpeech || speechCount() > 0;
|
|
59
|
-
const hasTranscription = () => conv().hasTranscription || transcriptionCount() > 0;
|
|
60
|
-
const hasVideo = () => conv().hasVideo || videoCount() > 0;
|
|
61
|
-
const visibleTabCount = () => {
|
|
62
|
-
let count = 0;
|
|
63
|
-
if (hasMessages()) count++;
|
|
64
|
-
if (hasChunks() && conv().type === "server") count++;
|
|
65
|
-
if (hasSummaries()) count++;
|
|
66
|
-
if (hasImage()) count++;
|
|
67
|
-
if (hasSpeech()) count++;
|
|
68
|
-
if (hasTranscription()) count++;
|
|
69
|
-
if (hasVideo()) count++;
|
|
70
|
-
return count;
|
|
71
|
-
};
|
|
72
|
-
if (visibleTabCount() <= 1) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
return (() => {
|
|
76
|
-
var _el$ = _tmpl$8();
|
|
77
|
-
insert(_el$, createComponent(Show, {
|
|
78
|
-
get when() {
|
|
79
|
-
return hasMessages();
|
|
80
|
-
},
|
|
81
|
-
get children() {
|
|
82
|
-
var _el$2 = _tmpl$(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
|
|
83
|
-
_el$5.nextSibling;
|
|
84
|
-
_el$2.$$click = () => props.onTabChange("messages");
|
|
85
|
-
insert(_el$2, () => conv().messages.length, _el$5);
|
|
86
|
-
effect(() => className(_el$2, `${styles().actionButton} ${props.activeTab === "messages" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
87
|
-
return _el$2;
|
|
88
|
-
}
|
|
89
|
-
}), null);
|
|
90
|
-
insert(_el$, createComponent(Show, {
|
|
91
|
-
get when() {
|
|
92
|
-
return memo(() => !!hasChunks())() && conv().type === "server";
|
|
93
|
-
},
|
|
94
|
-
get children() {
|
|
95
|
-
var _el$6 = _tmpl$2(), _el$7 = _el$6.firstChild, _el$9 = _el$7.nextSibling;
|
|
96
|
-
_el$9.nextSibling;
|
|
97
|
-
_el$6.$$click = () => props.onTabChange("chunks");
|
|
98
|
-
insert(_el$6, totalRawChunks, _el$9);
|
|
99
|
-
effect(() => className(_el$6, `${styles().actionButton} ${props.activeTab === "chunks" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
100
|
-
return _el$6;
|
|
101
|
-
}
|
|
102
|
-
}), null);
|
|
103
|
-
insert(_el$, createComponent(Show, {
|
|
104
|
-
get when() {
|
|
105
|
-
return hasSummaries();
|
|
106
|
-
},
|
|
107
|
-
get children() {
|
|
108
|
-
var _el$0 = _tmpl$3(), _el$1 = _el$0.firstChild, _el$11 = _el$1.nextSibling;
|
|
109
|
-
_el$11.nextSibling;
|
|
110
|
-
_el$0.$$click = () => props.onTabChange("summaries");
|
|
111
|
-
insert(_el$0, summariesCount, _el$11);
|
|
112
|
-
effect(() => className(_el$0, `${styles().actionButton} ${props.activeTab === "summaries" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
113
|
-
return _el$0;
|
|
114
|
-
}
|
|
115
|
-
}), null);
|
|
116
|
-
insert(_el$, createComponent(Show, {
|
|
117
|
-
get when() {
|
|
118
|
-
return hasImage();
|
|
119
|
-
},
|
|
120
|
-
get children() {
|
|
121
|
-
var _el$12 = _tmpl$4(), _el$13 = _el$12.firstChild, _el$15 = _el$13.nextSibling;
|
|
122
|
-
_el$15.nextSibling;
|
|
123
|
-
_el$12.$$click = () => props.onTabChange("image");
|
|
124
|
-
insert(_el$12, imageCount, _el$15);
|
|
125
|
-
effect(() => className(_el$12, `${styles().actionButton} ${props.activeTab === "image" ? styles().conversationDetails.tabButtonActive : ""} ${imagePulse() ? styles().conversationDetails.tabButtonPulse : ""}`));
|
|
126
|
-
return _el$12;
|
|
127
|
-
}
|
|
128
|
-
}), null);
|
|
129
|
-
insert(_el$, createComponent(Show, {
|
|
130
|
-
get when() {
|
|
131
|
-
return hasSpeech();
|
|
132
|
-
},
|
|
133
|
-
get children() {
|
|
134
|
-
var _el$16 = _tmpl$5(), _el$17 = _el$16.firstChild, _el$19 = _el$17.nextSibling;
|
|
135
|
-
_el$19.nextSibling;
|
|
136
|
-
_el$16.$$click = () => props.onTabChange("speech");
|
|
137
|
-
insert(_el$16, speechCount, _el$19);
|
|
138
|
-
effect(() => className(_el$16, `${styles().actionButton} ${props.activeTab === "speech" ? styles().conversationDetails.tabButtonActive : ""} ${speechPulse() ? styles().conversationDetails.tabButtonPulse : ""}`));
|
|
139
|
-
return _el$16;
|
|
140
|
-
}
|
|
141
|
-
}), null);
|
|
142
|
-
insert(_el$, createComponent(Show, {
|
|
143
|
-
get when() {
|
|
144
|
-
return hasTranscription();
|
|
145
|
-
},
|
|
146
|
-
get children() {
|
|
147
|
-
var _el$20 = _tmpl$6(), _el$21 = _el$20.firstChild, _el$23 = _el$21.nextSibling;
|
|
148
|
-
_el$23.nextSibling;
|
|
149
|
-
_el$20.$$click = () => props.onTabChange("transcription");
|
|
150
|
-
insert(_el$20, transcriptionCount, _el$23);
|
|
151
|
-
effect(() => className(_el$20, `${styles().actionButton} ${props.activeTab === "transcription" ? styles().conversationDetails.tabButtonActive : ""} ${transcriptionPulse() ? styles().conversationDetails.tabButtonPulse : ""}`));
|
|
152
|
-
return _el$20;
|
|
153
|
-
}
|
|
154
|
-
}), null);
|
|
155
|
-
insert(_el$, createComponent(Show, {
|
|
156
|
-
get when() {
|
|
157
|
-
return hasVideo();
|
|
158
|
-
},
|
|
159
|
-
get children() {
|
|
160
|
-
var _el$24 = _tmpl$7(), _el$25 = _el$24.firstChild, _el$27 = _el$25.nextSibling;
|
|
161
|
-
_el$27.nextSibling;
|
|
162
|
-
_el$24.$$click = () => props.onTabChange("video");
|
|
163
|
-
insert(_el$24, videoCount, _el$27);
|
|
164
|
-
effect(() => className(_el$24, `${styles().actionButton} ${props.activeTab === "video" ? styles().conversationDetails.tabButtonActive : ""} ${videoPulse() ? styles().conversationDetails.tabButtonPulse : ""}`));
|
|
165
|
-
return _el$24;
|
|
166
|
-
}
|
|
167
|
-
}), null);
|
|
168
|
-
effect(() => className(_el$, styles().conversationDetails.tabsContainer));
|
|
169
|
-
return _el$;
|
|
170
|
-
})();
|
|
171
|
-
};
|
|
172
|
-
delegateEvents(["click"]);
|
|
173
|
-
export {
|
|
174
|
-
ConversationTabs
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=ConversationTabs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationTabs.js","sources":["../../../../src/components/conversation/ConversationTabs.tsx"],"sourcesContent":["import { Show, createEffect, createSignal } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport type { Component } from 'solid-js'\nimport type { Conversation } from '../../store/ai-context'\n\nexport type TabType =\n | 'messages'\n | 'chunks'\n | 'summaries'\n | 'image'\n | 'speech'\n | 'transcription'\n | 'video'\n\ninterface ConversationTabsProps {\n conversation: Conversation\n activeTab: TabType\n onTabChange: (tab: TabType) => void\n}\n\nexport const ConversationTabs: Component<ConversationTabsProps> = (props) => {\n const styles = useStyles()\n const conv = () => props.conversation\n\n // Total raw chunks = sum of all chunkCounts\n const totalRawChunks = () =>\n conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0)\n\n const summariesCount = () => conv().summaries?.length ?? 0\n const imageCount = () => conv().imageEvents?.length ?? 0\n const speechCount = () => conv().speechEvents?.length ?? 0\n const transcriptionCount = () => conv().transcriptionEvents?.length ?? 0\n const videoCount = () => conv().videoEvents?.length ?? 0\n\n const [imagePulse, setImagePulse] = createSignal(false)\n const [speechPulse, setSpeechPulse] = createSignal(false)\n const [transcriptionPulse, setTranscriptionPulse] = createSignal(false)\n const [videoPulse, setVideoPulse] = createSignal(false)\n\n const triggerPulse = (setter: (value: boolean) => void) => {\n setter(true)\n setTimeout(() => setter(false), 2000)\n }\n\n let previousImageCount = 0\n let previousSpeechCount = 0\n let previousTranscriptionCount = 0\n let previousVideoCount = 0\n\n createEffect(() => {\n const count = imageCount()\n if (count > 0 && previousImageCount === 0) {\n triggerPulse(setImagePulse)\n }\n previousImageCount = count\n })\n\n createEffect(() => {\n const count = speechCount()\n if (count > 0 && previousSpeechCount === 0) {\n triggerPulse(setSpeechPulse)\n }\n previousSpeechCount = count\n })\n\n createEffect(() => {\n const count = transcriptionCount()\n if (count > 0 && previousTranscriptionCount === 0) {\n triggerPulse(setTranscriptionPulse)\n }\n previousTranscriptionCount = count\n })\n\n createEffect(() => {\n const count = videoCount()\n if (count > 0 && previousVideoCount === 0) {\n triggerPulse(setVideoPulse)\n }\n previousVideoCount = count\n })\n\n // Determine if we should show any chat-related tabs\n // For server conversations, don't show messages tab - only chunks\n const hasMessages = () =>\n conv().type === 'client' && conv().messages.length > 0\n const hasChunks = () => conv().chunks.length > 0 || conv().type === 'server'\n const hasSummaries = () => conv().hasSummarize || summariesCount() > 0\n const hasImage = () => conv().hasImage || imageCount() > 0\n const hasSpeech = () => conv().hasSpeech || speechCount() > 0\n const hasTranscription = () =>\n conv().hasTranscription || transcriptionCount() > 0\n const hasVideo = () => conv().hasVideo || videoCount() > 0\n\n // Count how many tabs would be visible\n const visibleTabCount = () => {\n let count = 0\n if (hasMessages()) count++\n if (hasChunks() && conv().type === 'server') count++\n if (hasSummaries()) count++\n if (hasImage()) count++\n if (hasSpeech()) count++\n if (hasTranscription()) count++\n if (hasVideo()) count++\n return count\n }\n\n // Don't render tabs if only one tab would be visible\n if (visibleTabCount() <= 1) {\n return null\n }\n\n return (\n <div class={styles().conversationDetails.tabsContainer}>\n {/* Show messages tab for client conversations or when there are messages */}\n <Show when={hasMessages()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'messages'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('messages')}\n >\n 💬 Messages ({conv().messages.length})\n </button>\n </Show>\n {/* Show chunks tab for server conversations or when there are chunks */}\n <Show when={hasChunks() && conv().type === 'server'}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'chunks'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('chunks')}\n >\n 📦 Chunks ({totalRawChunks()})\n </button>\n </Show>\n {/* Show summaries tab if there are summarize operations */}\n <Show when={hasSummaries()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'summaries'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('summaries')}\n >\n 📝 Summaries ({summariesCount()})\n </button>\n </Show>\n <Show when={hasImage()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'image'\n ? styles().conversationDetails.tabButtonActive\n : ''\n } ${imagePulse() ? styles().conversationDetails.tabButtonPulse : ''}`}\n onClick={() => props.onTabChange('image')}\n >\n 🖼️ Image ({imageCount()})\n </button>\n </Show>\n <Show when={hasSpeech()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'speech'\n ? styles().conversationDetails.tabButtonActive\n : ''\n } ${speechPulse() ? styles().conversationDetails.tabButtonPulse : ''}`}\n onClick={() => props.onTabChange('speech')}\n >\n 🔊 Speech ({speechCount()})\n </button>\n </Show>\n <Show when={hasTranscription()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'transcription'\n ? styles().conversationDetails.tabButtonActive\n : ''\n } ${\n transcriptionPulse()\n ? styles().conversationDetails.tabButtonPulse\n : ''\n }`}\n onClick={() => props.onTabChange('transcription')}\n >\n 📝 Transcription ({transcriptionCount()})\n </button>\n </Show>\n <Show when={hasVideo()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'video'\n ? styles().conversationDetails.tabButtonActive\n : ''\n } ${videoPulse() ? styles().conversationDetails.tabButtonPulse : ''}`}\n onClick={() => props.onTabChange('video')}\n >\n 🎬 Video ({videoCount()})\n </button>\n </Show>\n </div>\n )\n}\n"],"names":["ConversationTabs","props","styles","useStyles","conv","conversation","totalRawChunks","chunks","reduce","sum","c","chunkCount","summariesCount","summaries","length","imageCount","imageEvents","speechCount","speechEvents","transcriptionCount","transcriptionEvents","videoCount","videoEvents","imagePulse","setImagePulse","createSignal","speechPulse","setSpeechPulse","transcriptionPulse","setTranscriptionPulse","videoPulse","setVideoPulse","triggerPulse","setter","setTimeout","previousImageCount","previousSpeechCount","previousTranscriptionCount","previousVideoCount","createEffect","count","hasMessages","type","messages","hasChunks","hasSummaries","hasSummarize","hasImage","hasSpeech","hasTranscription","hasVideo","visibleTabCount","_el$","_tmpl$8","_$insert","_$createComponent","Show","when","children","_el$2","_tmpl$","_el$3","firstChild","_el$5","nextSibling","$$click","onTabChange","_$effect","_$className","actionButton","activeTab","conversationDetails","tabButtonActive","_$memo","_el$6","_tmpl$2","_el$7","_el$9","_el$0","_tmpl$3","_el$1","_el$11","_el$12","_tmpl$4","_el$13","_el$15","tabButtonPulse","_el$16","_tmpl$5","_el$17","_el$19","_el$20","_tmpl$6","_el$21","_el$23","_el$24","_tmpl$7","_el$25","_el$27","tabsContainer","_$delegateEvents"],"mappings":";;;;AAoBO,MAAMA,mBAAsDC,CAAAA,UAAU;AAC3E,QAAMC,SAASC,UAAAA;AACf,QAAMC,OAAOA,MAAMH,MAAMI;AAGzB,QAAMC,iBAAiBA,MACrBF,KAAAA,EAAOG,OAAOC,OAAO,CAACC,KAAKC,MAAMD,OAAOC,EAAEC,cAAc,IAAI,CAAC;AAE/D,QAAMC,iBAAiBA,MAAMR,KAAAA,EAAOS,WAAWC,UAAU;AACzD,QAAMC,aAAaA,MAAMX,KAAAA,EAAOY,aAAaF,UAAU;AACvD,QAAMG,cAAcA,MAAMb,KAAAA,EAAOc,cAAcJ,UAAU;AACzD,QAAMK,qBAAqBA,MAAMf,KAAAA,EAAOgB,qBAAqBN,UAAU;AACvE,QAAMO,aAAaA,MAAMjB,KAAAA,EAAOkB,aAAaR,UAAU;AAEvD,QAAM,CAACS,YAAYC,aAAa,IAAIC,aAAa,KAAK;AACtD,QAAM,CAACC,aAAaC,cAAc,IAAIF,aAAa,KAAK;AACxD,QAAM,CAACG,oBAAoBC,qBAAqB,IAAIJ,aAAa,KAAK;AACtE,QAAM,CAACK,YAAYC,aAAa,IAAIN,aAAa,KAAK;AAEtD,QAAMO,eAAeA,CAACC,WAAqC;AACzDA,WAAO,IAAI;AACXC,eAAW,MAAMD,OAAO,KAAK,GAAG,GAAI;AAAA,EACtC;AAEA,MAAIE,qBAAqB;AACzB,MAAIC,sBAAsB;AAC1B,MAAIC,6BAA6B;AACjC,MAAIC,qBAAqB;AAEzBC,eAAa,MAAM;AACjB,UAAMC,QAAQzB,WAAAA;AACd,QAAIyB,QAAQ,KAAKL,uBAAuB,GAAG;AACzCH,mBAAaR,aAAa;AAAA,IAC5B;AACAW,yBAAqBK;AAAAA,EACvB,CAAC;AAEDD,eAAa,MAAM;AACjB,UAAMC,QAAQvB,YAAAA;AACd,QAAIuB,QAAQ,KAAKJ,wBAAwB,GAAG;AAC1CJ,mBAAaL,cAAc;AAAA,IAC7B;AACAS,0BAAsBI;AAAAA,EACxB,CAAC;AAEDD,eAAa,MAAM;AACjB,UAAMC,QAAQrB,mBAAAA;AACd,QAAIqB,QAAQ,KAAKH,+BAA+B,GAAG;AACjDL,mBAAaH,qBAAqB;AAAA,IACpC;AACAQ,iCAA6BG;AAAAA,EAC/B,CAAC;AAEDD,eAAa,MAAM;AACjB,UAAMC,QAAQnB,WAAAA;AACd,QAAImB,QAAQ,KAAKF,uBAAuB,GAAG;AACzCN,mBAAaD,aAAa;AAAA,IAC5B;AACAO,yBAAqBE;AAAAA,EACvB,CAAC;AAID,QAAMC,cAAcA,MAClBrC,KAAAA,EAAOsC,SAAS,YAAYtC,KAAAA,EAAOuC,SAAS7B,SAAS;AACvD,QAAM8B,YAAYA,MAAMxC,KAAAA,EAAOG,OAAOO,SAAS,KAAKV,OAAOsC,SAAS;AACpE,QAAMG,eAAeA,MAAMzC,KAAAA,EAAO0C,gBAAgBlC,mBAAmB;AACrE,QAAMmC,WAAWA,MAAM3C,KAAAA,EAAO2C,YAAYhC,eAAe;AACzD,QAAMiC,YAAYA,MAAM5C,KAAAA,EAAO4C,aAAa/B,gBAAgB;AAC5D,QAAMgC,mBAAmBA,MACvB7C,KAAAA,EAAO6C,oBAAoB9B,uBAAuB;AACpD,QAAM+B,WAAWA,MAAM9C,KAAAA,EAAO8C,YAAY7B,eAAe;AAGzD,QAAM8B,kBAAkBA,MAAM;AAC5B,QAAIX,QAAQ;AACZ,QAAIC,cAAeD;AACnB,QAAII,UAAAA,KAAexC,KAAAA,EAAOsC,SAAS,SAAUF;AAC7C,QAAIK,eAAgBL;AACpB,QAAIO,WAAYP;AAChB,QAAIQ,YAAaR;AACjB,QAAIS,mBAAoBT;AACxB,QAAIU,WAAYV;AAChB,WAAOA;AAAAA,EACT;AAGA,MAAIW,gBAAAA,KAAqB,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,QAAAA;AAAAC,WAAAF,MAAAG,gBAGKC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEhB,YAAAA;AAAAA,MAAa;AAAA,MAAA,IAAAiB,WAAA;AAAA,YAAAC,QAAAC,UAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAG;AAAAD,cAAAC;AAAAL,cAAAM,UAOZ,MAAMhE,MAAMiE,YAAY,UAAU;AAACZ,eAAAK,OAAA,MAE9BvD,KAAAA,EAAOuC,SAAS7B,QAAMiD,KAAA;AAAAI,eAAA,MAAAC,UAAAT,OAP7B,GAAGzD,OAAAA,EAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,aAChBpE,OAAAA,EAASqE,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAb;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAL,WAAAF,MAAAG,gBAOLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEgB,KAAA,MAAA,CAAA,CAAA7B,UAAAA,CAAW,EAAA,KAAIxC,KAAAA,EAAOsC,SAAS;AAAA,MAAQ;AAAA,MAAA,IAAAgB,WAAA;AAAA,YAAAgB,QAAAC,WAAAC,QAAAF,MAAAZ,YAAAe,QAAAD,MAAAZ;AAAAa,cAAAb;AAAAU,cAAAT,UAOtC,MAAMhE,MAAMiE,YAAY,QAAQ;AAACZ,eAAAoB,OAE9BpE,gBAAcuE,KAAA;AAAAV,eAAA,MAAAC,UAAAM,OAPnB,GAAGxE,OAAAA,EAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,WAChBpE,OAAAA,EAASqE,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAApB,WAAAF,MAAAG,gBAOLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEZ,aAAAA;AAAAA,MAAc;AAAA,MAAA,IAAAa,WAAA;AAAA,YAAAoB,QAAAC,WAAAC,QAAAF,MAAAhB,YAAAmB,SAAAD,MAAAhB;AAAAiB,eAAAjB;AAAAc,cAAAb,UAOb,MAAMhE,MAAMiE,YAAY,WAAW;AAACZ,eAAAwB,OAE9BlE,gBAAcqE,MAAA;AAAAd,eAAA,MAAAC,UAAAU,OAPtB,GAAG5E,OAAAA,EAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,cAChBpE,OAAAA,EAASqE,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAM;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAxB,WAAAF,MAAAG,gBAMLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEV,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAW,WAAA;AAAA,YAAAwB,SAAAC,WAAAC,SAAAF,OAAApB,YAAAuB,SAAAD,OAAApB;AAAAqB,eAAArB;AAAAkB,eAAAjB,UAOT,MAAMhE,MAAMiE,YAAY,OAAO;AAACZ,eAAA4B,QAE7BnE,YAAUsE,MAAA;AAAAlB,qBAAAC,UAAAc,QAPf,GAAGhF,SAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,UAChBpE,SAASqE,oBAAoBC,kBAC7B,EAAE,IACJjD,WAAAA,IAAerB,OAAAA,EAASqE,oBAAoBe,iBAAiB,EAAE,EAAE,CAAA;AAAA,eAAAJ;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA5B,WAAAF,MAAAG,gBAMxEC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAET,UAAAA;AAAAA,MAAW;AAAA,MAAA,IAAAU,WAAA;AAAA,YAAA6B,SAAAC,WAAAC,SAAAF,OAAAzB,YAAA4B,SAAAD,OAAAzB;AAAA0B,eAAA1B;AAAAuB,eAAAtB,UAOV,MAAMhE,MAAMiE,YAAY,QAAQ;AAACZ,eAAAiC,QAE9BtE,aAAWyE,MAAA;AAAAvB,qBAAAC,UAAAmB,QAPhB,GAAGrF,SAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,WAChBpE,SAASqE,oBAAoBC,kBAC7B,EAAE,IACJ9C,YAAAA,IAAgBxB,OAAAA,EAASqE,oBAAoBe,iBAAiB,EAAE,EAAE,CAAA;AAAA,eAAAC;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAjC,WAAAF,MAAAG,gBAMzEC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAER,iBAAAA;AAAAA,MAAkB;AAAA,MAAA,IAAAS,WAAA;AAAA,YAAAiC,SAAAC,WAAAC,SAAAF,OAAA7B,YAAAgC,SAAAD,OAAA7B;AAAA8B,eAAA9B;AAAA2B,eAAA1B,UAWjB,MAAMhE,MAAMiE,YAAY,eAAe;AAACZ,eAAAqC,QAE9BxE,oBAAkB2E,MAAA;AAAA3B,qBAAAC,UAAAuB,QAX9B,GAAGzF,SAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,kBAChBpE,SAASqE,oBAAoBC,kBAC7B,EAAE,IAEN5C,mBAAAA,IACI1B,OAAAA,EAASqE,oBAAoBe,iBAC7B,EAAE,EACN,CAAA;AAAA,eAAAK;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAArC,WAAAF,MAAAG,gBAMLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEP,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAQ,WAAA;AAAA,YAAAqC,SAAAC,WAAAC,SAAAF,OAAAjC,YAAAoC,SAAAD,OAAAjC;AAAAkC,eAAAlC;AAAA+B,eAAA9B,UAOT,MAAMhE,MAAMiE,YAAY,OAAO;AAACZ,eAAAyC,QAE9B1E,YAAU6E,MAAA;AAAA/B,qBAAAC,UAAA2B,QAPd,GAAG7F,SAASmE,YAAY,IAC7BpE,MAAMqE,cAAc,UAChBpE,SAASqE,oBAAoBC,kBAC7B,EAAE,IACJ1C,WAAAA,IAAe5B,OAAAA,EAASqE,oBAAoBe,iBAAiB,EAAE,EAAE,CAAA;AAAA,eAAAS;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA5B,WAAA,MAAAC,UAAAhB,MAtF/DlD,SAASqE,oBAAoB4B,aAAa,CAAA;AAAA,WAAA/C;AAAAA,EAAA,GAAA;AA8F1D;AAACgD,eAAA,CAAA,OAAA,CAAA;"}
|