llm-testrunner-components 1.0.0 → 1.0.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.
Files changed (103) hide show
  1. package/README.md +139 -81
  2. package/dist/cjs/{index-CCrH7f-W.js → index-CY2lQip_.js} +190 -33
  3. package/dist/cjs/index-CY2lQip_.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +391 -5
  5. package/dist/cjs/index.cjs.js.map +1 -1
  6. package/dist/cjs/llm-test-runner.cjs.entry.js +9 -0
  7. package/dist/cjs/llm-test-runner.entry.cjs.js.map +1 -0
  8. package/dist/cjs/{llm-testrunner-components.cjs.js → llm-testrunner.cjs.js} +5 -7
  9. package/dist/cjs/llm-testrunner.cjs.js.map +1 -0
  10. package/dist/cjs/loader.cjs.js +2 -4
  11. package/dist/collection/collection-manifest.json +3 -4
  12. package/dist/collection/components/error-message/error-message.js +8 -0
  13. package/dist/collection/components/error-message/error-message.js.map +1 -0
  14. package/dist/collection/components/llm-test-runner/llm-test-runner.css +671 -0
  15. package/dist/collection/components/llm-test-runner/llm-test-runner.js +310 -0
  16. package/dist/collection/components/llm-test-runner/llm-test-runner.js.map +1 -0
  17. package/dist/collection/index.js +4 -10
  18. package/dist/collection/index.js.map +1 -1
  19. package/dist/collection/lib/evaluation/evaluation-engine.js +61 -0
  20. package/dist/collection/lib/evaluation/evaluation-engine.js.map +1 -0
  21. package/dist/collection/lib/evaluation/index.js +7 -0
  22. package/dist/collection/lib/evaluation/index.js.map +1 -0
  23. package/dist/collection/lib/evaluation/types.js +2 -0
  24. package/dist/collection/lib/evaluation/types.js.map +1 -0
  25. package/dist/components/index.js +1652 -4
  26. package/dist/components/index.js.map +1 -1
  27. package/dist/components/{current-time.d.ts → llm-test-runner.d.ts} +4 -4
  28. package/dist/components/llm-test-runner.js +9 -0
  29. package/dist/components/llm-test-runner.js.map +1 -0
  30. package/dist/esm/{index-0jlGA6MK.js → index-DBp-rMPb.js} +190 -33
  31. package/dist/esm/index-DBp-rMPb.js.map +1 -0
  32. package/dist/esm/index.js +391 -5
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/llm-test-runner.entry.js +3 -0
  35. package/dist/esm/llm-test-runner.entry.js.map +1 -0
  36. package/dist/esm/{llm-testrunner-components.js → llm-testrunner.js} +5 -7
  37. package/dist/esm/llm-testrunner.js.map +1 -0
  38. package/dist/esm/loader.js +3 -5
  39. package/dist/llm-testrunner/index.esm.js +2 -0
  40. package/dist/llm-testrunner/index.esm.js.map +1 -0
  41. package/dist/llm-testrunner/llm-test-runner.entry.esm.js.map +1 -0
  42. package/dist/llm-testrunner/llm-testrunner.esm.js +2 -0
  43. package/dist/llm-testrunner/llm-testrunner.esm.js.map +1 -0
  44. package/dist/llm-testrunner/p-DBp-rMPb.js +3 -0
  45. package/dist/llm-testrunner/p-DBp-rMPb.js.map +1 -0
  46. package/dist/llm-testrunner/p-ed2ea423.entry.js +2 -0
  47. package/dist/llm-testrunner/p-ed2ea423.entry.js.map +1 -0
  48. package/dist/react/components.d.ts +9 -0
  49. package/dist/react/components.d.ts.map +1 -0
  50. package/dist/react/components.js +12 -0
  51. package/dist/react/index.d.ts +2 -0
  52. package/dist/react/index.d.ts.map +1 -0
  53. package/dist/react/index.js +2 -0
  54. package/dist/types/components/error-message/error-message.d.ts +7 -0
  55. package/dist/types/components/llm-test-runner/llm-test-runner.d.ts +42 -0
  56. package/dist/types/components.d.ts +11 -46
  57. package/dist/types/index.d.ts +2 -10
  58. package/dist/types/lib/evaluation/evaluation-engine.d.ts +8 -0
  59. package/dist/types/lib/evaluation/index.d.ts +5 -0
  60. package/dist/types/lib/evaluation/types.d.ts +23 -0
  61. package/dist/types/stencil-public-runtime.d.ts +41 -3
  62. package/package.json +33 -12
  63. package/dist/cjs/current-time.my-component.entry.cjs.js.map +0 -1
  64. package/dist/cjs/current-time_2.cjs.entry.js +0 -67
  65. package/dist/cjs/current-time_2.cjs.entry.js.map +0 -1
  66. package/dist/cjs/index-CCrH7f-W.js.map +0 -1
  67. package/dist/cjs/llm-testrunner-components.cjs.js.map +0 -1
  68. package/dist/collection/components/my-component/current-time.js +0 -35
  69. package/dist/collection/components/my-component/current-time.js.map +0 -1
  70. package/dist/collection/components/my-component/my-component.css +0 -3
  71. package/dist/collection/components/my-component/my-component.js +0 -96
  72. package/dist/collection/components/my-component/my-component.js.map +0 -1
  73. package/dist/collection/utils/utils.js +0 -4
  74. package/dist/collection/utils/utils.js.map +0 -1
  75. package/dist/components/current-time.js +0 -9
  76. package/dist/components/current-time.js.map +0 -1
  77. package/dist/components/my-component.d.ts +0 -11
  78. package/dist/components/my-component.js +0 -63
  79. package/dist/components/my-component.js.map +0 -1
  80. package/dist/components/p-CbvWSaCI.js +0 -53
  81. package/dist/components/p-CbvWSaCI.js.map +0 -1
  82. package/dist/components/p-DnDi6fKi.js +0 -1101
  83. package/dist/components/p-DnDi6fKi.js.map +0 -1
  84. package/dist/esm/current-time.my-component.entry.js.map +0 -1
  85. package/dist/esm/current-time_2.entry.js +0 -64
  86. package/dist/esm/current-time_2.entry.js.map +0 -1
  87. package/dist/esm/index-0jlGA6MK.js.map +0 -1
  88. package/dist/esm/llm-testrunner-components.js.map +0 -1
  89. package/dist/llm-testrunner-components/current-time.my-component.entry.esm.js.map +0 -1
  90. package/dist/llm-testrunner-components/index.esm.js +0 -2
  91. package/dist/llm-testrunner-components/index.esm.js.map +0 -1
  92. package/dist/llm-testrunner-components/llm-testrunner-components.esm.js +0 -2
  93. package/dist/llm-testrunner-components/llm-testrunner-components.esm.js.map +0 -1
  94. package/dist/llm-testrunner-components/p-0jlGA6MK.js +0 -3
  95. package/dist/llm-testrunner-components/p-0jlGA6MK.js.map +0 -1
  96. package/dist/llm-testrunner-components/p-15e5e0fe.entry.js +0 -2
  97. package/dist/llm-testrunner-components/p-15e5e0fe.entry.js.map +0 -1
  98. package/dist/types/components/my-component/current-time.d.ts +0 -7
  99. package/dist/types/components/my-component/my-component.d.ts +0 -16
  100. package/dist/types/utils/utils.d.ts +0 -1
  101. /package/dist/{llm-testrunner-components → llm-testrunner}/loader.esm.js.map +0 -0
  102. /package/dist/{llm-testrunner-components → llm-testrunner}/p-DQuL1Twl.js +0 -0
  103. /package/dist/{llm-testrunner-components → llm-testrunner}/p-DQuL1Twl.js.map +0 -0
@@ -1,16 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-CCrH7f-W.js');
3
+ var index = require('./index-CY2lQip_.js');
4
4
  var appGlobals = require('./app-globals-V2Kpy_OQ.js');
5
5
 
6
6
  const defineCustomElements = async (win, options) => {
7
7
  if (typeof window === 'undefined') return undefined;
8
8
  await appGlobals.globalScripts();
9
- return index.bootstrapLazy([["current-time_2.cjs",[[257,"my-component",{"first":[1],"middle":[1],"last":[1]}],[256,"current-time",{"currentTime":[32]}]]]], options);
9
+ return index.bootstrapLazy([["llm-test-runner.cjs",[[257,"llm-test-runner",{"apiKey":[1,"api-key"],"testCases":[32],"isRunningAll":[32],"error":[32],"isExportingTestSuite":[32]}]]]], options);
10
10
  };
11
11
 
12
12
  exports.setNonce = index.setNonce;
13
13
  exports.defineCustomElements = defineCustomElements;
14
14
  //# sourceMappingURL=loader.cjs.js.map
15
-
16
- //# sourceMappingURL=loader.cjs.js.map
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "entries": [
3
- "components/my-component/current-time.js",
4
- "components/my-component/my-component.js"
3
+ "components/llm-test-runner/llm-test-runner.js"
5
4
  ],
6
5
  "compiler": {
7
6
  "name": "@stencil/core",
8
- "version": "4.36.1",
9
- "typescriptVersion": "5.5.4"
7
+ "version": "4.38.1",
8
+ "typescriptVersion": "5.9.3"
10
9
  },
11
10
  "collections": [],
12
11
  "bundles": []
@@ -0,0 +1,8 @@
1
+ import { h } from "@stencil/core";
2
+ export const ErrorMessage = ({ message, onClear }) => {
3
+ if (!message) {
4
+ return null;
5
+ }
6
+ return (h("div", { class: "error-message" }, h("span", null, message), onClear && (h("button", { class: "error-close", title: "Close", onClick: onClear }, "\u00D7"))));
7
+ };
8
+ //# sourceMappingURL=error-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-message.js","sourceRoot":"","sources":["../../../src/components/error-message/error-message.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,CAAC,EAAE,MAAM,eAAe,CAAC;AAOvD,MAAM,CAAC,MAAM,YAAY,GAA2C,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;IAC3F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,WAAK,KAAK,EAAC,eAAe;QACxB,gBAAO,OAAO,CAAQ;QACrB,OAAO,IAAI,CACV,cACE,KAAK,EAAC,aAAa,EACnB,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,OAAO,aAGT,CACV,CACG,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { FunctionalComponent, h } from '@stencil/core';\n\ninterface ErrorMessageProps {\n message: string;\n onClear?: () => void;\n}\n\nexport const ErrorMessage: FunctionalComponent<ErrorMessageProps> = ({ message, onClear }) => {\n if (!message) {\n return null;\n }\n\n return (\n <div class=\"error-message\">\n <span>{message}</span>\n {onClear && (\n <button\n class=\"error-close\"\n title=\"Close\"\n onClick={onClear}\n >\n &times;\n </button>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,671 @@
1
+ :host {
2
+ display: block;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
4
+ background-color: #f8fafc;
5
+ min-height: 100vh;
6
+ }
7
+
8
+ .test-runner-container {
9
+ padding: 20px;
10
+ background: white;
11
+ border-radius: 8px;
12
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
13
+ margin: 20px 0;
14
+ }
15
+
16
+ .simple-test {
17
+ margin: 20px 0;
18
+ padding: 20px;
19
+ border: 1px solid #ddd;
20
+ border-radius: 4px;
21
+ }
22
+
23
+ .test-cases {
24
+ margin: 20px 0;
25
+ }
26
+
27
+ .test-case {
28
+ margin: 20px 0;
29
+ padding: 20px;
30
+ border: 1px solid #eee;
31
+ border-radius: 4px;
32
+ background: #f9f9f9;
33
+ }
34
+
35
+ .test-case h3 {
36
+ margin-top: 0;
37
+ color: #333;
38
+ }
39
+
40
+ .test-case textarea {
41
+ width: 100%;
42
+ padding: 10px;
43
+ border: 1px solid #ddd;
44
+ border-radius: 4px;
45
+ font-family: inherit;
46
+ margin: 10px 0;
47
+ }
48
+
49
+ .test-case button {
50
+ background: #007bff;
51
+ color: white;
52
+ border: none;
53
+ padding: 10px 20px;
54
+ border-radius: 4px;
55
+ cursor: pointer;
56
+ margin: 10px 5px 10px 0;
57
+ }
58
+
59
+ .test-case button:disabled {
60
+ background: #ccc;
61
+ cursor: not-allowed;
62
+ }
63
+
64
+ .output, .error {
65
+ margin: 10px 0;
66
+ padding: 10px;
67
+ border-radius: 4px;
68
+ }
69
+
70
+ .output {
71
+ background: #d4edda;
72
+ border: 1px solid #c3e6cb;
73
+ color: #155724;
74
+ }
75
+
76
+ .error {
77
+ background: #f8d7da;
78
+ border: 1px solid #f5c6cb;
79
+ color: #721c24;
80
+ }
81
+
82
+ .test-runner-container {
83
+ max-width: 1400px;
84
+ margin: 0 auto;
85
+ background: white;
86
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
87
+ }
88
+
89
+ /* Header Styles */
90
+ .test-runner-header {
91
+ display: flex;
92
+ justify-content: space-between;
93
+ align-items: center;
94
+ padding: 20px 24px;
95
+ background: /*linear-gradient(135deg, #667eea 0%, #764ba2 100%);*/ white;
96
+ color: white;
97
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
98
+ }
99
+
100
+ .header-left, .header-right {
101
+ display: flex;
102
+ gap: 12px;
103
+ align-items: center;
104
+ }
105
+
106
+ .header-center {
107
+ flex: 1;
108
+ display: flex;
109
+ justify-content: center;
110
+ align-items: center;
111
+ }
112
+
113
+ .api-status {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 0.5rem;
117
+ }
118
+
119
+ .api-status-text {
120
+ color: #28a745;
121
+ font-weight: 500;
122
+ font-size: 0.9rem;
123
+ }
124
+
125
+ /* Button Styles */
126
+ .btn {
127
+ display: inline-flex;
128
+ align-items: center;
129
+ gap: 8px;
130
+ padding: 10px 16px;
131
+ border: none;
132
+ border-radius: 8px;
133
+ font-size: 14px;
134
+ font-weight: 500;
135
+ cursor: pointer;
136
+ transition: all 0.2s ease;
137
+ text-decoration: none;
138
+ position: relative;
139
+ }
140
+
141
+ .btn:disabled {
142
+ opacity: 0.6;
143
+ cursor: not-allowed;
144
+ transform: none !important;
145
+ }
146
+
147
+ .btn-primary {
148
+ color: black;
149
+ box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);
150
+ }
151
+
152
+ .btn-primary:hover:not(:disabled) {
153
+ transform: translateY(-1px);
154
+ box-shadow: 0 4px 8px rgba(59, 130, 246, 0.4);
155
+ }
156
+
157
+ .btn-secondary {
158
+ background: rgba(255, 255, 255, 0.2);
159
+ color: blue;
160
+ border: 1px solid rgba(255, 255, 255, 0.3);
161
+ }
162
+
163
+ .btn-secondary:hover:not(:disabled) {
164
+ background: rgba(255, 255, 255, 0.3);
165
+ transform: translateY(-1px);
166
+ }
167
+
168
+ .btn-outline {
169
+ background: transparent;
170
+ color: #6b7280;
171
+ border: 2px solid #e5e7eb;
172
+ }
173
+
174
+ .btn-outline:hover {
175
+ background: #f9fafb;
176
+ border-color: #d1d5db;
177
+ transform: translateY(-1px);
178
+ }
179
+
180
+ .btn-icon {
181
+ padding: 8px;
182
+ min-width: 40px;
183
+ height: 40px;
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ font-size: 16px;
188
+ }
189
+
190
+ .btn-run {
191
+ color: white;
192
+ }
193
+
194
+ .btn-run:hover:not(:disabled) {
195
+ transform: translateY(-1px);
196
+ }
197
+
198
+ .btn-delete {
199
+ color: white;
200
+ }
201
+
202
+ .btn-delete:hover:not(:disabled) {
203
+ transform: translateY(-1px);
204
+ }
205
+
206
+ .icon {
207
+ font-size: 16px;
208
+ }
209
+
210
+ /* Main Content */
211
+ .test-runner-content {
212
+ padding: 0;
213
+ }
214
+
215
+ /* Column Headers */
216
+ .column-headers {
217
+ display: grid;
218
+ grid-template-columns: 1fr 1.5fr 0.5fr 120px;
219
+ gap: 1px;
220
+ background: #e5e7eb;
221
+ border-bottom: 2px solid #d1d5db;
222
+ }
223
+
224
+ .column-header {
225
+ background: #f8fafc;
226
+ padding: 16px 20px;
227
+ font-weight: 600;
228
+ color: #374151;
229
+ font-size: 14px;
230
+ text-transform: uppercase;
231
+ letter-spacing: 0.05em;
232
+ }
233
+
234
+ /* Test Cases */
235
+ .test-cases {
236
+ background: white;
237
+ }
238
+
239
+ .test-case-row {
240
+ display: grid;
241
+ grid-template-columns: 1fr 1.5fr 0.5fr 120px;
242
+ gap: 1px;
243
+ border-bottom: 1px solid #e5e7eb;
244
+ min-height: 200px;
245
+ }
246
+
247
+ .test-case-row:hover {
248
+ background: #f9fafb;
249
+ }
250
+
251
+ /* Input Column */
252
+ .input-column {
253
+ padding: 20px;
254
+ background: white;
255
+ border-right: 1px solid #e5e7eb;
256
+ }
257
+
258
+ .input-group {
259
+ margin-bottom: 16px;
260
+ }
261
+
262
+ .input-group label {
263
+ display: block;
264
+ margin-bottom: 8px;
265
+ font-weight: 500;
266
+ color: #374151;
267
+ font-size: 14px;
268
+ }
269
+
270
+ .input-group textarea {
271
+ width: 95%;
272
+ padding: 12px;
273
+ border: 2px solid #e5e7eb;
274
+ border-radius: 8px;
275
+ font-size: 14px;
276
+ resize: vertical;
277
+ outline: none;
278
+ transition: border-color 0.2s ease;
279
+ font-family: inherit;
280
+ }
281
+
282
+ .input-group textarea:focus {
283
+ border-color: #3b82f6;
284
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
285
+ }
286
+
287
+ /* Keywords and Links */
288
+ .keywords-group, .links-group {
289
+ margin-bottom: 16px;
290
+ }
291
+
292
+ .keywords-group label, .links-group label {
293
+ display: block;
294
+ margin-bottom: 8px;
295
+ font-weight: 500;
296
+ color: #374151;
297
+ font-size: 14px;
298
+ }
299
+
300
+ .tags-container, .links-container {
301
+ display: flex;
302
+ flex-wrap: wrap;
303
+ gap: 8px;
304
+ align-items: center;
305
+ }
306
+
307
+ .tag {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ gap: 6px;
311
+ background: #dbeafe;
312
+ color: #1e40af;
313
+ padding: 4px 8px;
314
+ border-radius: 16px;
315
+ font-size: 12px;
316
+ font-weight: 500;
317
+ }
318
+
319
+ .tag-remove {
320
+ background: none;
321
+ border: none;
322
+ color: #1e40af;
323
+ cursor: pointer;
324
+ font-size: 14px;
325
+ padding: 0;
326
+ width: 16px;
327
+ height: 16px;
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ border-radius: 50%;
332
+ }
333
+
334
+ .tag-remove:hover {
335
+ background: rgba(30, 64, 175, 0.1);
336
+ }
337
+
338
+ .link-item {
339
+ display: flex;
340
+ align-items: center;
341
+ gap: 6px;
342
+ background: #f0f9ff;
343
+ padding: 4px 8px;
344
+ border-radius: 6px;
345
+ font-size: 12px;
346
+ }
347
+
348
+ .link-item a {
349
+ color: #0369a1;
350
+ text-decoration: none;
351
+ max-width: 200px;
352
+ overflow: hidden;
353
+ text-overflow: ellipsis;
354
+ white-space: nowrap;
355
+ }
356
+
357
+ .link-item a:hover {
358
+ text-decoration: underline;
359
+ }
360
+
361
+ .link-remove {
362
+ background: none;
363
+ border: none;
364
+ color: #0369a1;
365
+ cursor: pointer;
366
+ font-size: 12px;
367
+ padding: 0;
368
+ width: 16px;
369
+ height: 16px;
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: center;
373
+ border-radius: 50%;
374
+ }
375
+
376
+ .link-remove:hover {
377
+ background: rgba(3, 105, 161, 0.1);
378
+ }
379
+
380
+ .tags-container input, .links-container input {
381
+ border: 1px solid #d1d5db;
382
+ border-radius: 6px;
383
+ padding: 6px 8px;
384
+ font-size: 12px;
385
+ outline: none;
386
+ min-width: 120px;
387
+ }
388
+
389
+ .tags-container input:focus, .links-container input:focus {
390
+ border-color: #3b82f6;
391
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
392
+ }
393
+
394
+ /* Output Column */
395
+ .output-column {
396
+ padding: 20px;
397
+ background: white;
398
+ border-right: 1px solid #e5e7eb;
399
+ display: flex;
400
+ flex-direction: column;
401
+ }
402
+
403
+ .output-content {
404
+ background: #f8fafc;
405
+ border: 1px solid #e5e7eb;
406
+ border-radius: 8px;
407
+ padding: 16px;
408
+ font-size: 14px;
409
+ line-height: 1.6;
410
+ color: #374151;
411
+ white-space: pre-wrap;
412
+ word-wrap: break-word;
413
+ flex: 1;
414
+ overflow-y: auto;
415
+ max-height: 250px;
416
+ overflow-x: scroll;
417
+ }
418
+
419
+ .output-placeholder {
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: center;
423
+ color: #9ca3af;
424
+ font-style: italic;
425
+ flex: 1;
426
+ background: #f9fafb;
427
+ border: 2px dashed #d1d5db;
428
+ border-radius: 8px;
429
+ }
430
+
431
+ /* Evaluation Column */
432
+ .evaluation-column {
433
+ padding: 20px;
434
+ background: white;
435
+ border-right: 1px solid #e5e7eb;
436
+ display: flex;
437
+ flex-direction: column;
438
+ }
439
+
440
+ .evaluation-content {
441
+ display: flex;
442
+ flex-direction: column;
443
+ gap: 12px;
444
+ flex: 1;
445
+ }
446
+
447
+ .score-display {
448
+ text-align: center;
449
+ }
450
+
451
+ .score-number {
452
+ font-size: 24px;
453
+ font-weight: 700;
454
+ color: #111827;
455
+ display: block;
456
+ margin-bottom: 8px;
457
+ }
458
+
459
+ .score-bar {
460
+ width: 100%;
461
+ height: 8px;
462
+ background: #e5e7eb;
463
+ border-radius: 4px;
464
+ overflow: hidden;
465
+ }
466
+
467
+ .score-fill {
468
+ height: 100%;
469
+ background: linear-gradient(90deg, #ef4444 0%, #f59e0b 50%, #10b981 100%);
470
+ transition: width 0.3s ease;
471
+ }
472
+
473
+ .evaluation-details {
474
+ display: flex;
475
+ flex-direction: column;
476
+ gap: 8px;
477
+ }
478
+
479
+ .detail-item {
480
+ display: flex;
481
+ align-items: center;
482
+ gap: 8px;
483
+ font-size: 14px;
484
+ }
485
+
486
+ .status {
487
+ width: 20px;
488
+ height: 20px;
489
+ border-radius: 50%;
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: center;
493
+ font-size: 12px;
494
+ font-weight: bold;
495
+ }
496
+
497
+ .status.pass {
498
+ background: #dcfce7;
499
+ color: #166534;
500
+ }
501
+
502
+ .status.fail {
503
+ background: #fef2f2;
504
+ color: #dc2626;
505
+ }
506
+
507
+ .evaluation-text {
508
+ font-size: 12px;
509
+ color: #6b7280;
510
+ line-height: 1.4;
511
+ background: #f9fafb;
512
+ padding: 8px;
513
+ border-radius: 6px;
514
+ border: 1px solid #e5e7eb;
515
+ }
516
+
517
+ .evaluation-placeholder {
518
+ display: flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ color: #9ca3af;
522
+ font-style: italic;
523
+ flex: 1;
524
+ background: #f9fafb;
525
+ border: 2px dashed #d1d5db;
526
+ border-radius: 8px;
527
+ }
528
+
529
+ /* New evaluation result styles */
530
+ .evaluation-result {
531
+ display: flex;
532
+ flex-direction: column;
533
+ gap: 8px;
534
+ }
535
+
536
+ .evaluation-status {
537
+ font-weight: 600;
538
+ font-size: 14px;
539
+ padding: 8px 12px;
540
+ border-radius: 4px;
541
+ text-align: center;
542
+ }
543
+
544
+ .evaluation-status.passed {
545
+ background: #d4edda;
546
+ color: #155724;
547
+ border: 1px solid #c3e6cb;
548
+ }
549
+
550
+ .evaluation-status.failed {
551
+ background: #f8d7da;
552
+ color: #721c24;
553
+ border: 1px solid #f5c6cb;
554
+ }
555
+
556
+ .evaluation-score {
557
+ font-size: 12px;
558
+ color: #495057;
559
+ text-align: center;
560
+ font-weight: 500;
561
+ }
562
+
563
+ .evaluation-feedback {
564
+ font-size: 12px;
565
+ color: #6c757d;
566
+ background: #f8f9fa;
567
+ padding: 8px;
568
+ border-radius: 4px;
569
+ border: 1px solid #dee2e6;
570
+ }
571
+
572
+ /* Actions Column */
573
+ .actions-column {
574
+ padding: 20px;
575
+ background: white;
576
+ display: flex;
577
+ flex-direction: column;
578
+ gap: 12px;
579
+ align-items: center;
580
+ justify-content: flex-start;
581
+ align-self: flex-start;
582
+ }
583
+
584
+ /* Add Test Case */
585
+ .add-test-case {
586
+ padding: 24px;
587
+ text-align: center;
588
+ background: #f9fafb;
589
+ border-top: 1px solid #e5e7eb;
590
+ }
591
+
592
+ .hidden {
593
+ display: none;
594
+ }
595
+
596
+ .error-message {
597
+ background: #ffeaea;
598
+ color: #b71c1c;
599
+ border: 1px solid #f44336;
600
+ padding: 0.75em 2.5em 0.75em 1em;
601
+ border-radius: 4px;
602
+ margin: 1em 0;
603
+ position: relative;
604
+ font-size: 1em;
605
+ display: flex;
606
+ align-items: center;
607
+ gap: 1em;
608
+ }
609
+
610
+ .error-close {
611
+ background: none;
612
+ border: none;
613
+ color: #b71c1c;
614
+ font-size: 1.25em;
615
+ font-weight: bold;
616
+ cursor: pointer;
617
+ position: absolute;
618
+ right: 0.75em;
619
+ top: 50%;
620
+ transform: translateY(-50%);
621
+ line-height: 1;
622
+ padding: 0;
623
+ }
624
+
625
+ /* Responsive Design */
626
+ @media (max-width: 1200px) {
627
+ .test-case-row {
628
+ grid-template-columns: 1fr;
629
+ gap: 0;
630
+ }
631
+
632
+ .column-headers {
633
+ display: none;
634
+ }
635
+
636
+ .input-column, .output-column, .evaluation-column, .actions-column {
637
+ border-right: none;
638
+ border-bottom: 1px solid #e5e7eb;
639
+ }
640
+
641
+ .actions-column {
642
+ flex-direction: row;
643
+ justify-content: center;
644
+ }
645
+ }
646
+
647
+ @media (max-width: 768px) {
648
+ .test-runner-header {
649
+ flex-direction: column;
650
+ gap: 16px;
651
+ padding: 16px;
652
+ }
653
+
654
+ .header-left, .header-right {
655
+ flex-wrap: wrap;
656
+ justify-content: center;
657
+ }
658
+
659
+ .btn {
660
+ font-size: 12px;
661
+ padding: 8px 12px;
662
+ }
663
+
664
+ .input-column, .output-column, .evaluation-column, .actions-column {
665
+ padding: 16px;
666
+ }
667
+
668
+ .test-case-row {
669
+ min-height: auto;
670
+ }
671
+ }