@nqminds/mcp-client 1.0.33 → 1.0.35
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/dist/MCPChat.d.ts.map +1 -1
- package/dist/MCPChat.js +11 -1
- package/dist/api-helpers.d.ts.map +1 -1
- package/dist/api-helpers.js +9 -5
- package/dist/openai-client.d.ts +11 -0
- package/dist/openai-client.d.ts.map +1 -1
- package/dist/openai-client.js +7 -1
- package/dist/styles/MCPChat.css +202 -0
- package/package.json +1 -1
package/dist/MCPChat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MCPChat.d.ts","sourceRoot":"","sources":["../src/MCPChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,KAAK,EAAyB,YAAY,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"MCPChat.d.ts","sourceRoot":"","sources":["../src/MCPChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,KAAK,EAAyB,YAAY,EAAe,MAAM,SAAS,CAAC;AA+bhF,wBAAgB,OAAO,CAAC,EACtB,aAAa,EACb,WAA6B,EAC7B,YAAiB,EACjB,SAAc,GACf,EAAE,YAAY,qBAyhBd"}
|
package/dist/MCPChat.js
CHANGED
|
@@ -16,13 +16,23 @@ function stripUtmSource(url) {
|
|
|
16
16
|
*
|
|
17
17
|
* Expected JSON shape:
|
|
18
18
|
* { "columns": ["Col A", "Col B"], "rows": [["val1", "val2"], ...] }
|
|
19
|
+
*
|
|
20
|
+
* On mobile the table switches to a card layout using data-label attributes.
|
|
21
|
+
* Rows beyond INITIAL_ROWS are hidden behind an expand button.
|
|
19
22
|
*/
|
|
23
|
+
const INITIAL_ROWS = 5;
|
|
20
24
|
function JsonDataTable({ columns, rows }) {
|
|
25
|
+
const [showAll, setShowAll] = useState(false);
|
|
26
|
+
const visibleRows = showAll ? rows : rows.slice(0, INITIAL_ROWS);
|
|
27
|
+
const hiddenCount = rows.length - INITIAL_ROWS;
|
|
21
28
|
return (React.createElement("div", { className: "mcp-data-table-wrapper" },
|
|
22
29
|
React.createElement("table", { className: "mcp-data-table" },
|
|
23
30
|
React.createElement("thead", null,
|
|
24
31
|
React.createElement("tr", null, columns.map((col, i) => React.createElement("th", { key: i }, col)))),
|
|
25
|
-
React.createElement("tbody", null,
|
|
32
|
+
React.createElement("tbody", null, visibleRows.map((row, ri) => (React.createElement("tr", { key: ri }, row.map((cell, ci) => (React.createElement("td", { key: ci, "data-label": columns[ci] }, String(cell ?? ""))))))))),
|
|
33
|
+
rows.length > INITIAL_ROWS && (React.createElement("button", { className: "mcp-table-expand-btn", onClick: () => setShowAll((s) => !s) }, showAll
|
|
34
|
+
? "▲ Show less"
|
|
35
|
+
: `▼ Show ${hiddenCount} more row${hiddenCount !== 1 ? "s" : ""}`))));
|
|
26
36
|
}
|
|
27
37
|
/**
|
|
28
38
|
* Returns the ReactMarkdown `components` map.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-helpers.d.ts","sourceRoot":"","sources":["../src/api-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,IACnD,SAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"api-helpers.d.ts","sourceRoot":"","sources":["../src/api-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,IACnD,SAAS,OAAO,uBA0H/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,KACrB,SAAS,OAAO,uBAW/B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,kBAKtC"}
|
package/dist/api-helpers.js
CHANGED
|
@@ -9,9 +9,10 @@ const clients = new Map();
|
|
|
9
9
|
*/
|
|
10
10
|
export function createMCPChatHandler(config) {
|
|
11
11
|
return async (request) => {
|
|
12
|
-
const { message, context, sessionId = "default", bypassSystemPrompt = false } = await request.json();
|
|
12
|
+
const { message, context, sessionId = "default", bypassSystemPrompt = false, systemPromptName = "system-prompt" } = await request.json();
|
|
13
13
|
// Get or create client for this session
|
|
14
|
-
|
|
14
|
+
const cacheKey = `${sessionId}:${systemPromptName}`;
|
|
15
|
+
let client = clients.get(cacheKey);
|
|
15
16
|
if (!client) {
|
|
16
17
|
client = new MCPClientOpenAI({
|
|
17
18
|
openaiApiKey: config.openaiApiKey,
|
|
@@ -20,9 +21,11 @@ export function createMCPChatHandler(config) {
|
|
|
20
21
|
logDir: config.logDir || process.env.MCP_LOG_DIR,
|
|
21
22
|
enableCodeInterpreter: config.enableCodeInterpreter,
|
|
22
23
|
codeInterpreterMemoryLimit: config.codeInterpreterMemoryLimit,
|
|
24
|
+
systemPromptName,
|
|
25
|
+
systemPromptArgs: sessionId !== "default" ? { company_number: sessionId } : {},
|
|
23
26
|
});
|
|
24
27
|
await client.connect();
|
|
25
|
-
clients.set(
|
|
28
|
+
clients.set(cacheKey, client);
|
|
26
29
|
}
|
|
27
30
|
// Create an AbortController to handle client disconnection
|
|
28
31
|
const abortController = new AbortController();
|
|
@@ -118,8 +121,9 @@ export function createMCPChatHandler(config) {
|
|
|
118
121
|
*/
|
|
119
122
|
export function createMCPClearHandler() {
|
|
120
123
|
return async (request) => {
|
|
121
|
-
const { sessionId = "default" } = await request.json();
|
|
122
|
-
const
|
|
124
|
+
const { sessionId = "default", systemPromptName = "system-prompt" } = await request.json();
|
|
125
|
+
const cacheKey = `${sessionId}:${systemPromptName}`;
|
|
126
|
+
const client = clients.get(cacheKey);
|
|
123
127
|
if (client) {
|
|
124
128
|
client.clearHistory();
|
|
125
129
|
}
|
package/dist/openai-client.d.ts
CHANGED
|
@@ -57,6 +57,17 @@ export interface MCPClientConfig {
|
|
|
57
57
|
* Omit to use OpenAI's default (1 GB).
|
|
58
58
|
*/
|
|
59
59
|
codeInterpreterMemoryLimit?: "1g" | "2g" | "4g";
|
|
60
|
+
/**
|
|
61
|
+
* Name of the MCP prompt to use as the system prompt.
|
|
62
|
+
* Defaults to "system-prompt".
|
|
63
|
+
*/
|
|
64
|
+
systemPromptName?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Optional arguments to pass when fetching the system prompt from the MCP server.
|
|
67
|
+
* Required when the prompt has a non-empty argsSchema (e.g. company_financial_synopsis needs company_number).
|
|
68
|
+
* Defaults to {} (no arguments).
|
|
69
|
+
*/
|
|
70
|
+
systemPromptArgs?: Record<string, string>;
|
|
60
71
|
}
|
|
61
72
|
interface UsageStats {
|
|
62
73
|
inputTokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../src/openai-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsEH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../src/openai-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsEH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAErC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,0BAA0B,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAEhD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAID,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuB;IAExC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAAuB;IAE3C;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA2B;IAEtD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAGhB;IAEF;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;OAEG;IACH,OAAO,CAAC,SAAS,CAOf;IAEF;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,MAAM,CAA0L;IACxM,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,eAAe;IA2C7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,YAAY,IAAI,IAAI;IAmBpB,QAAQ,IAAI,UAAU;IAItB;;;OAGG;YACW,kBAAkB;IA8BhC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB;;;OAGG;YACW,gBAAgB;IAuB9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAmCpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8EzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;YACW,kBAAkB;IA4DhC;;;OAGG;YACW,mBAAmB;IAoBjC;;;OAGG;IACH,OAAO,CAAC,8BAA8B;IAatC;;OAEG;YACW,UAAU;IAuBxB;;OAEG;YACW,cAAc;IAqC5B;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACtC,WAAW,CAAC,EAAE,WAAW,EACzB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,MAAM,CAAC;IA2RlB;;OAEG;YACW,eAAe;CAgI9B"}
|
package/dist/openai-client.js
CHANGED
|
@@ -140,6 +140,8 @@ export class MCPClientOpenAI {
|
|
|
140
140
|
logDir: config.logDir ?? process.env.MCP_LOG_DIR ?? path.resolve(process.cwd(), "logs"),
|
|
141
141
|
enableCodeInterpreter: config.enableCodeInterpreter ?? false,
|
|
142
142
|
codeInterpreterMemoryLimit: config.codeInterpreterMemoryLimit,
|
|
143
|
+
systemPromptName: config.systemPromptName ?? "system-prompt",
|
|
144
|
+
systemPromptArgs: config.systemPromptArgs ?? {},
|
|
143
145
|
};
|
|
144
146
|
this.logger = new McpLogger(this.config.logDir);
|
|
145
147
|
this.openai = new OpenAI({
|
|
@@ -198,7 +200,11 @@ export class MCPClientOpenAI {
|
|
|
198
200
|
try {
|
|
199
201
|
// SDK typing may not expose getPrompt.
|
|
200
202
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
-
const
|
|
203
|
+
const promptArgs = this.config.systemPromptArgs;
|
|
204
|
+
const result = await this.client.getPrompt({
|
|
205
|
+
name: this.config.systemPromptName,
|
|
206
|
+
...(Object.keys(promptArgs).length > 0 && { arguments: promptArgs }),
|
|
207
|
+
});
|
|
202
208
|
const parts = [];
|
|
203
209
|
for (const msg of result.messages ?? []) {
|
|
204
210
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
package/dist/styles/MCPChat.css
CHANGED
|
@@ -963,3 +963,205 @@
|
|
|
963
963
|
display: flex;
|
|
964
964
|
gap: 8px;
|
|
965
965
|
}
|
|
966
|
+
|
|
967
|
+
/* ───────────────────────────────────────────────
|
|
968
|
+
Table: expand / collapse button
|
|
969
|
+
─────────────────────────────────────────────── */
|
|
970
|
+
.mcp-table-expand-btn {
|
|
971
|
+
display: block;
|
|
972
|
+
width: 100%;
|
|
973
|
+
padding: 10px 16px;
|
|
974
|
+
min-height: 44px;
|
|
975
|
+
font-size: 13px;
|
|
976
|
+
font-weight: 600;
|
|
977
|
+
font-family: inherit;
|
|
978
|
+
color: var(--mcp-primary-color);
|
|
979
|
+
background: transparent;
|
|
980
|
+
border: 1px solid var(--mcp-border);
|
|
981
|
+
border-top: none;
|
|
982
|
+
border-radius: 0 0 6px 6px;
|
|
983
|
+
cursor: pointer;
|
|
984
|
+
text-align: center;
|
|
985
|
+
transition: background 0.15s;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
.mcp-table-expand-btn:hover {
|
|
989
|
+
background: rgba(78, 161, 255, 0.06);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/* ───────────────────────────────────────────────
|
|
993
|
+
Mobile: full-screen panel + compact layout
|
|
994
|
+
─────────────────────────────────────────────── */
|
|
995
|
+
@media (max-width: 640px) {
|
|
996
|
+
/* Panel takes the full viewport */
|
|
997
|
+
.mcp-overlay {
|
|
998
|
+
padding: 0;
|
|
999
|
+
align-items: stretch;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
.mcp-panel {
|
|
1003
|
+
width: 100vw;
|
|
1004
|
+
height: 100dvh;
|
|
1005
|
+
max-height: 100dvh;
|
|
1006
|
+
margin-top: 0;
|
|
1007
|
+
border-radius: 0;
|
|
1008
|
+
border: none;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
/* Tighter header */
|
|
1012
|
+
.mcp-chat-header {
|
|
1013
|
+
padding: 10px 14px;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
.mcp-chat-title {
|
|
1017
|
+
font-size: 17px;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
/* Ensure all interactive elements in header meet 44px tap target */
|
|
1021
|
+
.mcp-chat-button,
|
|
1022
|
+
.mcp-btn-theme,
|
|
1023
|
+
.mcp-btn-icon {
|
|
1024
|
+
min-height: 44px;
|
|
1025
|
+
min-width: 44px;
|
|
1026
|
+
display: inline-flex;
|
|
1027
|
+
align-items: center;
|
|
1028
|
+
justify-content: center;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
/* Hide dev-tool button on mobile — not relevant to end users */
|
|
1032
|
+
.mcp-btn-dev {
|
|
1033
|
+
display: none;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
/* Messages: less padding */
|
|
1037
|
+
.mcp-chat-messages {
|
|
1038
|
+
padding: 10px 12px;
|
|
1039
|
+
gap: 12px;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
/* Message bubbles: use full available width */
|
|
1043
|
+
.mcp-chat-message,
|
|
1044
|
+
.mcp-chat-message-assistant {
|
|
1045
|
+
max-width: 100%;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
/* Tighter bubble padding */
|
|
1049
|
+
.mcp-chat-message-bubble {
|
|
1050
|
+
padding: 10px 14px;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/* Input bar */
|
|
1054
|
+
.mcp-chat-input-form {
|
|
1055
|
+
padding: 10px 12px;
|
|
1056
|
+
gap: 8px;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
.mcp-chat-input {
|
|
1060
|
+
font-size: 16px; /* Prevent iOS auto-zoom on focus */
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
/* Home screen: 2-column grid */
|
|
1064
|
+
.mcp-action-grid {
|
|
1065
|
+
grid-template-columns: repeat(2, 1fr);
|
|
1066
|
+
gap: 10px;
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
.mcp-action-card {
|
|
1070
|
+
padding: 14px 10px;
|
|
1071
|
+
min-height: 72px;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
.mcp-action-card-icon {
|
|
1075
|
+
font-size: 24px;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
.mcp-action-card-label {
|
|
1079
|
+
font-size: 13px;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
.mcp-chat-now-button {
|
|
1083
|
+
min-height: 44px;
|
|
1084
|
+
padding: 10px 28px;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
/* Thinking panel */
|
|
1088
|
+
.mcp-chat-thinking {
|
|
1089
|
+
padding: 14px 16px;
|
|
1090
|
+
min-height: unset;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
/* ───────────────────────────────────────────────
|
|
1095
|
+
Mobile: json-table card layout
|
|
1096
|
+
Each row becomes a labelled card; column headers
|
|
1097
|
+
are hidden and surfaced via data-label pseudo-elements.
|
|
1098
|
+
─────────────────────────────────────────────── */
|
|
1099
|
+
@media (max-width: 640px) {
|
|
1100
|
+
.mcp-data-table-wrapper {
|
|
1101
|
+
overflow-x: visible;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
.mcp-data-table {
|
|
1105
|
+
min-width: unset;
|
|
1106
|
+
display: block;
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
.mcp-data-table thead {
|
|
1110
|
+
display: none; /* labels come from data-label on each td */
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
.mcp-data-table tbody {
|
|
1114
|
+
display: block;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
.mcp-data-table tr {
|
|
1118
|
+
display: block;
|
|
1119
|
+
border: 1px solid var(--mcp-border);
|
|
1120
|
+
border-radius: 8px;
|
|
1121
|
+
margin-bottom: 10px;
|
|
1122
|
+
overflow: hidden;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
.mcp-data-table td {
|
|
1126
|
+
display: grid;
|
|
1127
|
+
grid-template-columns: minmax(80px, 36%) 1fr;
|
|
1128
|
+
gap: 8px;
|
|
1129
|
+
padding: 8px 12px;
|
|
1130
|
+
border: none;
|
|
1131
|
+
border-bottom: 1px solid var(--mcp-border);
|
|
1132
|
+
font-size: 14px;
|
|
1133
|
+
line-height: 1.45;
|
|
1134
|
+
word-break: break-word;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
.mcp-data-table td:last-child {
|
|
1138
|
+
border-bottom: none;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
/* Column label shown from the data-label attribute */
|
|
1142
|
+
.mcp-data-table td::before {
|
|
1143
|
+
content: attr(data-label);
|
|
1144
|
+
font-weight: 700;
|
|
1145
|
+
font-size: 11px;
|
|
1146
|
+
text-transform: uppercase;
|
|
1147
|
+
letter-spacing: 0.06em;
|
|
1148
|
+
color: var(--mcp-text-secondary);
|
|
1149
|
+
align-self: center;
|
|
1150
|
+
line-height: 1.3;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/* Strip alternating row tints — card borders provide separation */
|
|
1154
|
+
.mcp-data-table tbody tr:nth-child(even) {
|
|
1155
|
+
background: transparent;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
.mcp-data-table tbody tr:hover {
|
|
1159
|
+
background: transparent;
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/* Expand button full-width on mobile */
|
|
1163
|
+
.mcp-table-expand-btn {
|
|
1164
|
+
border-radius: 0 0 8px 8px;
|
|
1165
|
+
font-size: 14px;
|
|
1166
|
+
}
|
|
1167
|
+
}
|