@midscene/visualizer 1.7.9 → 1.7.10-beta-20260507123827.0

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 (37) hide show
  1. package/dist/es/component/playground/index.css +61 -11
  2. package/dist/es/component/prompt-input/index.css +61 -11
  3. package/dist/es/component/prompt-input/index.mjs +144 -111
  4. package/dist/es/component/screenshot-viewer/index.css +6 -0
  5. package/dist/es/component/screenshot-viewer/index.mjs +7 -3
  6. package/dist/es/component/universal-playground/empty-state.mjs +5 -0
  7. package/dist/es/component/universal-playground/index.css +8 -0
  8. package/dist/es/component/universal-playground/index.mjs +53 -1
  9. package/dist/es/icons/action-chevron.mjs +61 -0
  10. package/dist/es/icons/prompt-history.mjs +70 -0
  11. package/dist/es/utils/empty-state-scroll.mjs +8 -0
  12. package/dist/es/utils/playground-utils.mjs +1 -18
  13. package/dist/es/utils/prompt-input-utils.mjs +9 -1
  14. package/dist/es/utils/prompt-placeholder.mjs +19 -0
  15. package/dist/lib/component/playground/index.css +61 -11
  16. package/dist/lib/component/prompt-input/index.css +61 -11
  17. package/dist/lib/component/prompt-input/index.js +145 -111
  18. package/dist/lib/component/screenshot-viewer/index.css +6 -0
  19. package/dist/lib/component/screenshot-viewer/index.js +7 -3
  20. package/dist/lib/component/universal-playground/empty-state.js +39 -0
  21. package/dist/lib/component/universal-playground/index.css +8 -0
  22. package/dist/lib/component/universal-playground/index.js +53 -1
  23. package/dist/lib/icons/action-chevron.js +95 -0
  24. package/dist/lib/icons/prompt-history.js +104 -0
  25. package/dist/lib/utils/empty-state-scroll.js +42 -0
  26. package/dist/lib/utils/playground-utils.js +2 -19
  27. package/dist/lib/utils/prompt-input-utils.js +12 -1
  28. package/dist/lib/utils/prompt-placeholder.js +53 -0
  29. package/dist/types/component/prompt-input/index.d.ts +1 -2
  30. package/dist/types/component/screenshot-viewer/index.d.ts +4 -0
  31. package/dist/types/component/universal-playground/empty-state.d.ts +3 -0
  32. package/dist/types/types.d.ts +6 -0
  33. package/dist/types/utils/empty-state-scroll.d.ts +11 -0
  34. package/dist/types/utils/playground-utils.d.ts +1 -1
  35. package/dist/types/utils/prompt-input-utils.d.ts +1 -0
  36. package/dist/types/utils/prompt-placeholder.d.ts +1 -0
  37. package/package.json +13 -6
@@ -11,9 +11,12 @@ import { PlaygroundResultView } from "../playground-result/index.mjs";
11
11
  import "./index.css";
12
12
  import avatar from "../../icons/avatar.mjs";
13
13
  import { defaultMainButtons } from "../../utils/constants.mjs";
14
+ import { calculateEmptyStatePromptScrollTop } from "../../utils/empty-state-scroll.mjs";
14
15
  import { resolveProgressActionIcon } from "../../utils/progress-action-icon.mjs";
16
+ import { shouldOffsetEmptyStateForPromptInput } from "../../utils/prompt-input-utils.mjs";
15
17
  import { PromptInput } from "../prompt-input/index.mjs";
16
18
  import shiny_text from "../shiny-text/index.mjs";
19
+ import { shouldRenderCustomEmptyState } from "./empty-state.mjs";
17
20
  import { createStorageProvider, detectBestStorageType } from "./providers/storage-provider.mjs";
18
21
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
19
22
  try {
@@ -195,6 +198,52 @@ function UniversalPlayground({ playgroundSDK, storage, contextProvider, config:
195
198
  }, [
196
199
  infoList
197
200
  ]);
201
+ const renderCustomEmptyState = shouldRenderCustomEmptyState(visibleInfoList, componentConfig.emptyState);
202
+ const shouldOffsetEmptyStateForPrompt = useMemo(()=>renderCustomEmptyState && shouldOffsetEmptyStateForPromptInput(actionSpace, selectedType), [
203
+ actionSpace,
204
+ renderCustomEmptyState,
205
+ selectedType
206
+ ]);
207
+ useEffect(()=>{
208
+ if (!shouldOffsetEmptyStateForPrompt) return;
209
+ const adjustEmptyStateScroll = ()=>{
210
+ const container = infoListRef.current;
211
+ if (!container) return;
212
+ const wrapper = container.querySelector('.playground-empty-state-wrapper');
213
+ const contentStart = null == wrapper ? void 0 : wrapper.querySelector('[data-playground-empty-state-content-start]');
214
+ const contentEnd = null == wrapper ? void 0 : wrapper.querySelector('[data-playground-empty-state-content-end]');
215
+ if (!(contentStart instanceof HTMLElement) || !(contentEnd instanceof HTMLElement)) return;
216
+ const containerRect = container.getBoundingClientRect();
217
+ const startRect = contentStart.getBoundingClientRect();
218
+ const endRect = contentEnd.getBoundingClientRect();
219
+ const top = calculateEmptyStatePromptScrollTop({
220
+ currentScrollTop: container.scrollTop,
221
+ maxScrollTop: Math.max(0, container.scrollHeight - container.clientHeight),
222
+ containerTop: containerRect.top,
223
+ containerBottom: containerRect.bottom,
224
+ contentStartTop: startRect.top,
225
+ contentEndBottom: endRect.bottom
226
+ });
227
+ container.scrollTo({
228
+ top,
229
+ behavior: 'auto'
230
+ });
231
+ };
232
+ const animationFrameId = window.requestAnimationFrame(adjustEmptyStateScroll);
233
+ const timeoutId = window.setTimeout(adjustEmptyStateScroll, 160);
234
+ return ()=>{
235
+ window.cancelAnimationFrame(animationFrameId);
236
+ window.clearTimeout(timeoutId);
237
+ };
238
+ }, [
239
+ infoListRef,
240
+ selectedType,
241
+ shouldOffsetEmptyStateForPrompt
242
+ ]);
243
+ const emptyStateWrapperClassName = [
244
+ 'playground-empty-state-wrapper',
245
+ shouldOffsetEmptyStateForPrompt ? 'playground-empty-state-wrapper-offset-for-prompt' : ''
246
+ ].filter(Boolean).join(' ');
198
247
  return /*#__PURE__*/ jsx("div", {
199
248
  className: `playground-container ${layout}-mode ${className}`.trim(),
200
249
  children: /*#__PURE__*/ jsxs(Form, {
@@ -226,7 +275,10 @@ function UniversalPlayground({ playgroundSDK, storage, contextProvider, config:
226
275
  /*#__PURE__*/ jsx("div", {
227
276
  ref: infoListRef,
228
277
  className: "info-list-container",
229
- children: /*#__PURE__*/ jsx(List, {
278
+ children: renderCustomEmptyState ? /*#__PURE__*/ jsx("div", {
279
+ className: emptyStateWrapperClassName,
280
+ children: componentConfig.emptyState
281
+ }) : /*#__PURE__*/ jsx(List, {
230
282
  itemLayout: "vertical",
231
283
  dataSource: visibleInfoList,
232
284
  renderItem: (item)=>/*#__PURE__*/ jsxs(List.Item, {
@@ -0,0 +1,61 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ function _define_property(obj, key, value) {
4
+ if (key in obj) Object.defineProperty(obj, key, {
5
+ value: value,
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true
9
+ });
10
+ else obj[key] = value;
11
+ return obj;
12
+ }
13
+ function _object_spread(target) {
14
+ for(var i = 1; i < arguments.length; i++){
15
+ var source = null != arguments[i] ? arguments[i] : {};
16
+ var ownKeys = Object.keys(source);
17
+ if ("function" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
18
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
19
+ }));
20
+ ownKeys.forEach(function(key) {
21
+ _define_property(target, key, source[key]);
22
+ });
23
+ }
24
+ return target;
25
+ }
26
+ function action_chevron_ownKeys(object, enumerableOnly) {
27
+ var keys = Object.keys(object);
28
+ if (Object.getOwnPropertySymbols) {
29
+ var symbols = Object.getOwnPropertySymbols(object);
30
+ if (enumerableOnly) symbols = symbols.filter(function(sym) {
31
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
32
+ });
33
+ keys.push.apply(keys, symbols);
34
+ }
35
+ return keys;
36
+ }
37
+ function _object_spread_props(target, source) {
38
+ source = null != source ? source : {};
39
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
40
+ else action_chevron_ownKeys(Object(source)).forEach(function(key) {
41
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
42
+ });
43
+ return target;
44
+ }
45
+ const SvgActionChevron = (props)=>/*#__PURE__*/ jsx("svg", _object_spread_props(_object_spread({
46
+ xmlns: "http://www.w3.org/2000/svg",
47
+ width: 6,
48
+ height: 10,
49
+ fill: "none",
50
+ viewBox: "0 0 6 10"
51
+ }, props), {
52
+ children: /*#__PURE__*/ jsx("path", {
53
+ fill: "#000",
54
+ fillOpacity: 0.25,
55
+ fillRule: "evenodd",
56
+ d: "M.195 9.138a.667.667 0 0 1 0-.943l3.529-3.528L.195 1.138a.667.667 0 0 1 .943-.943l4 4c.26.26.26.683 0 .943l-4 4a.667.667 0 0 1-.943 0",
57
+ clipRule: "evenodd"
58
+ })
59
+ }));
60
+ const action_chevron = SvgActionChevron;
61
+ export { action_chevron as default };
@@ -0,0 +1,70 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import "react";
3
+ function _define_property(obj, key, value) {
4
+ if (key in obj) Object.defineProperty(obj, key, {
5
+ value: value,
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true
9
+ });
10
+ else obj[key] = value;
11
+ return obj;
12
+ }
13
+ function _object_spread(target) {
14
+ for(var i = 1; i < arguments.length; i++){
15
+ var source = null != arguments[i] ? arguments[i] : {};
16
+ var ownKeys = Object.keys(source);
17
+ if ("function" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
18
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
19
+ }));
20
+ ownKeys.forEach(function(key) {
21
+ _define_property(target, key, source[key]);
22
+ });
23
+ }
24
+ return target;
25
+ }
26
+ function prompt_history_ownKeys(object, enumerableOnly) {
27
+ var keys = Object.keys(object);
28
+ if (Object.getOwnPropertySymbols) {
29
+ var symbols = Object.getOwnPropertySymbols(object);
30
+ if (enumerableOnly) symbols = symbols.filter(function(sym) {
31
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
32
+ });
33
+ keys.push.apply(keys, symbols);
34
+ }
35
+ return keys;
36
+ }
37
+ function _object_spread_props(target, source) {
38
+ source = null != source ? source : {};
39
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
40
+ else prompt_history_ownKeys(Object(source)).forEach(function(key) {
41
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
42
+ });
43
+ return target;
44
+ }
45
+ const SvgPromptHistory = (props)=>/*#__PURE__*/ jsxs("svg", _object_spread_props(_object_spread({
46
+ xmlns: "http://www.w3.org/2000/svg",
47
+ width: 16,
48
+ height: 16,
49
+ fill: "none",
50
+ viewBox: "0 0 16 16"
51
+ }, props), {
52
+ children: [
53
+ /*#__PURE__*/ jsx("path", {
54
+ stroke: "#878787",
55
+ strokeLinecap: "round",
56
+ strokeLinejoin: "round",
57
+ strokeWidth: 1.33,
58
+ d: "M1.505 4.164c-2.862 6.126 2.197 10.501 6.063 10.501a7 7 0 1 0-6.063-10.5"
59
+ }),
60
+ /*#__PURE__*/ jsx("path", {
61
+ stroke: "#878787",
62
+ strokeLinecap: "round",
63
+ strokeLinejoin: "round",
64
+ strokeWidth: 1.33,
65
+ d: "M7.57 3.465v4.203l2.967 2.968"
66
+ })
67
+ ]
68
+ }));
69
+ const prompt_history = SvgPromptHistory;
70
+ export { prompt_history as default };
@@ -0,0 +1,8 @@
1
+ const DEFAULT_SAFE_MARGIN = 24;
2
+ function calculateEmptyStatePromptScrollTop({ currentScrollTop, maxScrollTop, containerTop, containerBottom, contentStartTop, contentEndBottom, topSafeMargin = DEFAULT_SAFE_MARGIN, bottomSafeMargin = DEFAULT_SAFE_MARGIN }) {
3
+ const scrollForContentEnd = currentScrollTop + contentEndBottom - (containerBottom - bottomSafeMargin);
4
+ const maxScrollWithContentStartVisible = currentScrollTop + contentStartTop - (containerTop + topSafeMargin);
5
+ const targetScrollTop = Math.min(scrollForContentEnd, maxScrollWithContentStartVisible, maxScrollTop);
6
+ return Math.max(0, Math.round(targetScrollTop));
7
+ }
8
+ export { calculateEmptyStatePromptScrollTop };
@@ -1,28 +1,11 @@
1
1
  import { StaticPage, StaticPageAgent } from "@midscene/web/static";
2
2
  import { isZodObjectSchema, unwrapZodType } from "../types.mjs";
3
3
  import { actionNameForType } from "./action-label.mjs";
4
+ import { getPlaceholderForType } from "./prompt-placeholder.mjs";
4
5
  const staticAgentFromContext = (context)=>{
5
6
  const page = new StaticPage(context);
6
7
  return new StaticPageAgent(page);
7
8
  };
8
- const getPlaceholderForType = (type)=>{
9
- if ('aiQuery' === type) return 'What do you want to query?';
10
- if ('aiAssert' === type) return 'What do you want to assert?';
11
- if ('aiTap' === type) return 'What element do you want to tap?';
12
- if ('aiDoubleClick' === type) return 'What element do you want to double-click?';
13
- if ('aiHover' === type) return 'What element do you want to hover over?';
14
- if ('aiInput' === type) return 'Format: <value> | <element>\nExample: hello world | search box';
15
- if ('aiRightClick' === type) return 'What element do you want to right-click?';
16
- if ('aiKeyboardPress' === type) return 'Format: <key> | <element (optional)>\nExample: Enter | text field';
17
- if ('aiScroll' === type) return 'Format: <direction> <amount> | <element (optional)>\nExample: down 500 | main content';
18
- if ('aiLocate' === type) return 'What element do you want to locate?';
19
- if ('aiBoolean' === type) return 'What do you want to check (returns true/false)?';
20
- if ('aiNumber' === type) return 'What number do you want to extract?';
21
- if ('aiString' === type) return 'What text do you want to extract?';
22
- if ('aiAsk' === type) return 'What do you want to ask?';
23
- if ('aiWaitFor' === type) return 'What condition do you want to wait for?';
24
- return 'What do you want to do?';
25
- };
26
9
  const isRunButtonEnabled = (runButtonEnabled, needsStructuredParams, params, actionSpace, selectedType, promptValue)=>{
27
10
  if (!runButtonEnabled) return false;
28
11
  const needsAnyInput = (()=>{
@@ -42,4 +42,12 @@ const getInlineStructuredFieldConfig = (actionSpace, selectedType)=>{
42
42
  placeholder
43
43
  };
44
44
  };
45
- export { getAvailablePromptActionTypes, getInlineStructuredFieldConfig };
45
+ const shouldOffsetEmptyStateForPromptInput = (actionSpace, selectedType)=>{
46
+ if (!(null == actionSpace ? void 0 : actionSpace.length) || !selectedType) return false;
47
+ if (getInlineStructuredFieldConfig(actionSpace, selectedType)) return false;
48
+ const action = actionSpace.find((item)=>item.interfaceAlias === selectedType || item.name === selectedType);
49
+ if (!(null == action ? void 0 : action.paramSchema) || !isZodObjectSchema(action.paramSchema)) return false;
50
+ const schema = action.paramSchema;
51
+ return Object.keys(schema.shape || {}).length > 1;
52
+ };
53
+ export { getAvailablePromptActionTypes, getInlineStructuredFieldConfig, shouldOffsetEmptyStateForPromptInput };
@@ -0,0 +1,19 @@
1
+ const getPlaceholderForType = (type)=>{
2
+ if ('aiQuery' === type) return 'What do you want to query?';
3
+ if ('aiAssert' === type) return 'What do you want to assert?';
4
+ if ('aiTap' === type) return 'What element do you want to tap?';
5
+ if ('aiDoubleClick' === type) return 'What element do you want to double-click?';
6
+ if ('aiHover' === type) return 'What element do you want to hover over?';
7
+ if ('aiInput' === type) return 'Format: <value> | <element>\nExample: hello world | search box';
8
+ if ('aiRightClick' === type) return 'What element do you want to right-click?';
9
+ if ('aiKeyboardPress' === type) return 'Format: <key> | <element (optional)>\nExample: Enter | text field';
10
+ if ('aiScroll' === type) return 'Format: <direction> <amount> | <element (optional)>\nExample: down 500 | main content';
11
+ if ('aiLocate' === type) return 'What element do you want to locate?';
12
+ if ('aiBoolean' === type) return 'What do you want to check (returns true/false)?';
13
+ if ('aiNumber' === type) return 'What number do you want to extract?';
14
+ if ('aiString' === type) return 'What text do you want to extract?';
15
+ if ('aiAsk' === type) return 'What do you want to ask?';
16
+ if ('aiWaitFor' === type) return 'What condition do you want to wait for?';
17
+ return 'What do you want to do?';
18
+ };
19
+ export { getPlaceholderForType };
@@ -586,7 +586,7 @@
586
586
 
587
587
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-left {
588
588
  align-items: center;
589
- gap: 4px;
589
+ gap: 2px;
590
590
  min-width: 0;
591
591
  display: flex;
592
592
  }
@@ -606,11 +606,12 @@
606
606
  border-radius: 32px;
607
607
  gap: 4px;
608
608
  height: 32px;
609
- padding: 4px 8px;
609
+ margin-right: 16px;
610
+ padding: 4px 0;
610
611
  }
611
612
 
612
613
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:hover {
613
- background: rgba(0, 0, 0, .03);
614
+ color: #5f6368;
614
615
  }
615
616
 
616
617
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:disabled {
@@ -642,11 +643,11 @@
642
643
 
643
644
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron {
644
645
  object-fit: contain;
645
- opacity: .25;
646
- width: 5.3px;
647
- height: 9.3px;
648
- margin-left: -2px;
649
- transform: rotate(-90deg);
646
+ opacity: 1;
647
+ width: 6px;
648
+ height: 10px;
649
+ margin-left: 0;
650
+ display: block;
650
651
  }
651
652
 
652
653
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron-fallback {
@@ -669,7 +670,7 @@
669
670
  }
670
671
 
671
672
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-icon-trigger:hover {
672
- background: rgba(0, 0, 0, .03);
673
+ background: rgba(0, 0, 0, .04);
673
674
  }
674
675
 
675
676
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon {
@@ -679,8 +680,8 @@
679
680
  }
680
681
 
681
682
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-history {
682
- width: 18px;
683
- height: 18px;
683
+ width: 16px;
684
+ height: 16px;
684
685
  }
685
686
 
686
687
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-fallback {
@@ -695,6 +696,55 @@
695
696
  position: static;
696
697
  }
697
698
 
699
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger {
700
+ width: 32px;
701
+ min-width: 32px;
702
+ height: 32px;
703
+ box-shadow: none;
704
+ color: #fff;
705
+ background: #1979ff;
706
+ border: none;
707
+ border-radius: 50%;
708
+ justify-content: center;
709
+ align-items: center;
710
+ padding: 0;
711
+ display: inline-flex;
712
+ }
713
+
714
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:hover {
715
+ color: #fff;
716
+ background: #0f6ff0;
717
+ }
718
+
719
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:focus-visible {
720
+ color: #fff;
721
+ background: #0f6ff0;
722
+ }
723
+
724
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:disabled {
725
+ color: #bfbfbf;
726
+ background: #f0f0f0;
727
+ }
728
+
729
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger .anticon {
730
+ font-size: 16px;
731
+ }
732
+
733
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop {
734
+ color: #666;
735
+ background: #f0f0f0;
736
+ }
737
+
738
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop:hover {
739
+ color: #333;
740
+ background: #e6e6e6;
741
+ }
742
+
743
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop:focus-visible {
744
+ color: #333;
745
+ background: #e6e6e6;
746
+ }
747
+
698
748
  .more-apis-dropdown .ant-dropdown-menu {
699
749
  scrollbar-width: thin;
700
750
  max-height: 400px;
@@ -494,7 +494,7 @@
494
494
 
495
495
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-left {
496
496
  align-items: center;
497
- gap: 4px;
497
+ gap: 2px;
498
498
  min-width: 0;
499
499
  display: flex;
500
500
  }
@@ -514,11 +514,12 @@
514
514
  border-radius: 32px;
515
515
  gap: 4px;
516
516
  height: 32px;
517
- padding: 4px 8px;
517
+ margin-right: 16px;
518
+ padding: 4px 0;
518
519
  }
519
520
 
520
521
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:hover {
521
- background: rgba(0, 0, 0, .03);
522
+ color: #5f6368;
522
523
  }
523
524
 
524
525
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:disabled {
@@ -550,11 +551,11 @@
550
551
 
551
552
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron {
552
553
  object-fit: contain;
553
- opacity: .25;
554
- width: 5.3px;
555
- height: 9.3px;
556
- margin-left: -2px;
557
- transform: rotate(-90deg);
554
+ opacity: 1;
555
+ width: 6px;
556
+ height: 10px;
557
+ margin-left: 0;
558
+ display: block;
558
559
  }
559
560
 
560
561
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron-fallback {
@@ -577,7 +578,7 @@
577
578
  }
578
579
 
579
580
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-icon-trigger:hover {
580
- background: rgba(0, 0, 0, .03);
581
+ background: rgba(0, 0, 0, .04);
581
582
  }
582
583
 
583
584
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon {
@@ -587,8 +588,8 @@
587
588
  }
588
589
 
589
590
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-history {
590
- width: 18px;
591
- height: 18px;
591
+ width: 16px;
592
+ height: 16px;
592
593
  }
593
594
 
594
595
  .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-fallback {
@@ -603,6 +604,55 @@
603
604
  position: static;
604
605
  }
605
606
 
607
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger {
608
+ width: 32px;
609
+ min-width: 32px;
610
+ height: 32px;
611
+ box-shadow: none;
612
+ color: #fff;
613
+ background: #1979ff;
614
+ border: none;
615
+ border-radius: 50%;
616
+ justify-content: center;
617
+ align-items: center;
618
+ padding: 0;
619
+ display: inline-flex;
620
+ }
621
+
622
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:hover {
623
+ color: #fff;
624
+ background: #0f6ff0;
625
+ }
626
+
627
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:focus-visible {
628
+ color: #fff;
629
+ background: #0f6ff0;
630
+ }
631
+
632
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger:disabled {
633
+ color: #bfbfbf;
634
+ background: #f0f0f0;
635
+ }
636
+
637
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger .anticon {
638
+ font-size: 16px;
639
+ }
640
+
641
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop {
642
+ color: #666;
643
+ background: #f0f0f0;
644
+ }
645
+
646
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop:hover {
647
+ color: #333;
648
+ background: #e6e6e6;
649
+ }
650
+
651
+ .prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-run-trigger-stop:focus-visible {
652
+ color: #333;
653
+ background: #e6e6e6;
654
+ }
655
+
606
656
  .more-apis-dropdown .ant-dropdown-menu {
607
657
  scrollbar-width: thin;
608
658
  max-height: 400px;