@vibe-forge/client 0.11.2 → 0.11.3

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 (111) hide show
  1. package/dist/assets/{arc-De_WjPJ3.js → arc-h39NrT24.js} +1 -1
  2. package/dist/assets/{blockDiagram-c4efeb88-C4aR2zTE.js → blockDiagram-c4efeb88-CaDg46I6.js} +1 -1
  3. package/dist/assets/{c4Diagram-c83219d4-BZH3rq_m.js → c4Diagram-c83219d4-CDqjcF9U.js} +1 -1
  4. package/dist/assets/channel-CBULQbJz.js +1 -0
  5. package/dist/assets/{classDiagram-beda092f-BzJgBrIK.js → classDiagram-beda092f-BDnZm8nO.js} +1 -1
  6. package/dist/assets/{classDiagram-v2-2358418a-5ZtXcnT3.js → classDiagram-v2-2358418a-BUi85KJW.js} +1 -1
  7. package/dist/assets/clone-dkS7LczW.js +1 -0
  8. package/dist/assets/{createText-1719965b-DUVvEtmR.js → createText-1719965b-Ca5dEwfo.js} +1 -1
  9. package/dist/assets/{cssMode-GoTNjuXX.js → cssMode-Ysz7NfYo.js} +1 -1
  10. package/dist/assets/{edges-96097737-Dd7m4Cvs.js → edges-96097737-CdSKqxZt.js} +1 -1
  11. package/dist/assets/{erDiagram-0228fc6a-DxqFlG_f.js → erDiagram-0228fc6a-B-veAUv_.js} +1 -1
  12. package/dist/assets/{flowDb-c6c81e3f-DU0C5kCI.js → flowDb-c6c81e3f-DD8Cx7_9.js} +1 -1
  13. package/dist/assets/{flowDiagram-50d868cf-Di1uDa_X.js → flowDiagram-50d868cf-9f-_x1ET.js} +1 -1
  14. package/dist/assets/flowDiagram-v2-4f6560a1-1miffU4x.js +1 -0
  15. package/dist/assets/{flowchart-elk-definition-6af322e1-CwG8aty5.js → flowchart-elk-definition-6af322e1-5RhpQM4M.js} +1 -1
  16. package/dist/assets/{freemarker2-j39cqTlI.js → freemarker2-SgMdIXw4.js} +1 -1
  17. package/dist/assets/{ganttDiagram-a2739b55-baO_lzL-.js → ganttDiagram-a2739b55-DnxNghZA.js} +1 -1
  18. package/dist/assets/{gitGraphDiagram-82fe8481-COoHjYMf.js → gitGraphDiagram-82fe8481-CBvS3Tf9.js} +1 -1
  19. package/dist/assets/{graph-KxESr4M5.js → graph-CkHF299-.js} +1 -1
  20. package/dist/assets/{handlebars-BgjdZO8G.js → handlebars-C57IyLUe.js} +1 -1
  21. package/dist/assets/{html-Ba7tYObe.js → html-YsDy5wvW.js} +1 -1
  22. package/dist/assets/{htmlMode-Bztvbig1.js → htmlMode-7o_VDODD.js} +1 -1
  23. package/dist/assets/{index-5325376f-BMTAx2mL.js → index-5325376f-BzOVQPu-.js} +1 -1
  24. package/dist/assets/{index-Pm_kLJvG.js → index-BHFpctk6.js} +320 -319
  25. package/dist/assets/index-D_XqxIvp.css +32 -0
  26. package/dist/assets/{infoDiagram-8eee0895-CC74qbHY.js → infoDiagram-8eee0895-DJ-UI1h4.js} +1 -1
  27. package/dist/assets/{javascript-C1e1cllX.js → javascript-BHQ9NEZr.js} +1 -1
  28. package/dist/assets/{journeyDiagram-c64418c1-C4MyOdE6.js → journeyDiagram-c64418c1-DwfykcG9.js} +1 -1
  29. package/dist/assets/{jsonMode-BC98AlvF.js → jsonMode-3QjftkMM.js} +1 -1
  30. package/dist/assets/{layout-CxAyTlr7.js → layout-CbViRb_b.js} +1 -1
  31. package/dist/assets/{line-DhaUfI71.js → line-DBdBvv9D.js} +1 -1
  32. package/dist/assets/{linear-MYukzldK.js → linear-BDAfhcjn.js} +1 -1
  33. package/dist/assets/{liquid-DahfJEYl.js → liquid-B0cPPzIR.js} +1 -1
  34. package/dist/assets/{lspLanguageFeatures-BWDJcswW.js → lspLanguageFeatures-IOxbobOz.js} +1 -1
  35. package/dist/assets/{mdx-BELlF_FD.js → mdx-Dma_RA8P.js} +1 -1
  36. package/dist/assets/{mermaid.core-BrQnSGSY.js → mermaid.core-Cvn8Go4x.js} +4 -4
  37. package/dist/assets/{mindmap-definition-8da855dc-B0FoxTiy.js → mindmap-definition-8da855dc-DEnYq0Lc.js} +1 -1
  38. package/dist/assets/{pieDiagram-a8764435-Ddr2cjSL.js → pieDiagram-a8764435-ZC4j8sHU.js} +1 -1
  39. package/dist/assets/{python--C9if_AD.js → python-Be0WX4q5.js} +1 -1
  40. package/dist/assets/{quadrantDiagram-1e28029f-BlEs7Mrl.js → quadrantDiagram-1e28029f-DUaqHlIB.js} +1 -1
  41. package/dist/assets/{razor-B9U9JxKn.js → razor-Tjhny-uT.js} +1 -1
  42. package/dist/assets/{requirementDiagram-08caed73-kEFOAu2v.js → requirementDiagram-08caed73-DjSal3es.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-a04cb91d-BBghez8I.js → sankeyDiagram-a04cb91d-BMDXMrMz.js} +1 -1
  44. package/dist/assets/{sequenceDiagram-c5b8d532-CJqgzdUE.js → sequenceDiagram-c5b8d532-CQl9YUlH.js} +1 -1
  45. package/dist/assets/{stateDiagram-1ecb1508-BER4XEI6.js → stateDiagram-1ecb1508-DG7mU9jD.js} +1 -1
  46. package/dist/assets/{stateDiagram-v2-c2b004d7-EBV2vSks.js → stateDiagram-v2-c2b004d7-DTbR_azy.js} +1 -1
  47. package/dist/assets/{styles-b4e223ce-k0eswZsE.js → styles-b4e223ce-C9aS3zb8.js} +1 -1
  48. package/dist/assets/{styles-ca3715f6-Ckr7GA-0.js → styles-ca3715f6-Bh3keVTZ.js} +1 -1
  49. package/dist/assets/{styles-d45a18b0-C1bpSwV3.js → styles-d45a18b0-BDcLLa65.js} +1 -1
  50. package/dist/assets/{svgDrawCommon-b86b1483-CDtKpGvy.js → svgDrawCommon-b86b1483-B9H5ZS_9.js} +1 -1
  51. package/dist/assets/{timeline-definition-faaaa080-BeGR-vua.js → timeline-definition-faaaa080-DCMYCBhK.js} +1 -1
  52. package/dist/assets/{tsMode-D_gJXIy3.js → tsMode-DVqLsn98.js} +1 -1
  53. package/dist/assets/{typescript-BoKcNXkN.js → typescript-wMVyXw7G.js} +1 -1
  54. package/dist/assets/{xml-DZvURlJ-.js → xml-w0gzmn0c.js} +1 -1
  55. package/dist/assets/{xychartDiagram-f5964ef8-DxfeLuYV.js → xychartDiagram-f5964ef8-CdxyD3K5.js} +1 -1
  56. package/dist/assets/{yaml-CTC8PAGY.js → yaml-C29TL1ed.js} +1 -1
  57. package/dist/index.html +2 -2
  58. package/package.json +4 -4
  59. package/src/api/sessions.ts +70 -1
  60. package/src/api/types.ts +2 -1
  61. package/src/api.ts +5 -0
  62. package/src/components/chat/AGENTS.md +14 -2
  63. package/src/components/chat/ChatComposerCard.scss +73 -0
  64. package/src/components/chat/ChatComposerCard.tsx +59 -0
  65. package/src/components/chat/ChatHeader.tsx +3 -1
  66. package/src/components/chat/ChatHistoryView.tsx +215 -49
  67. package/src/components/chat/CurrentTodoList.scss +210 -200
  68. package/src/components/chat/CurrentTodoList.tsx +116 -48
  69. package/src/components/chat/QueuedMessagesCard.scss +195 -0
  70. package/src/components/chat/QueuedMessagesCard.tsx +170 -0
  71. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +8 -0
  72. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +152 -28
  73. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +95 -23
  74. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +7 -0
  75. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +161 -45
  76. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +310 -71
  77. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +18 -0
  78. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +86 -9
  79. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +98 -1
  80. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +137 -17
  81. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +12 -6
  82. package/src/components/chat/sender/@core/build-sender-controller-result.ts +6 -0
  83. package/src/components/chat/sender/@core/build-sender-toolbar.ts +25 -2
  84. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +9 -2
  85. package/src/components/chat/sender/@core/interaction-request.ts +2 -2
  86. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +28 -4
  87. package/src/components/chat/sender/@hooks/use-sender-controller.ts +56 -11
  88. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +64 -0
  89. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +16 -1
  90. package/src/components/chat/sender/@hooks/use-sender-submit.ts +16 -8
  91. package/src/components/chat/sender/@types/sender-props.ts +19 -3
  92. package/src/components/chat/sender/@types/sender-toolbar-types.ts +12 -1
  93. package/src/components/chat/sender/Sender.scss +3 -0
  94. package/src/components/chat/sender/Sender.tsx +2 -12
  95. package/src/hooks/chat/session-view-cache.ts +4 -1
  96. package/src/hooks/chat/use-chat-adapter.ts +5 -1
  97. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +5 -1
  98. package/src/hooks/chat/use-chat-session-actions.ts +99 -4
  99. package/src/hooks/chat/use-chat-session-messages.ts +20 -1
  100. package/src/hooks/chat/use-chat-session.ts +2 -0
  101. package/src/main.tsx +8 -0
  102. package/src/resources/locales/en.json +32 -1
  103. package/src/resources/locales/zh.json +32 -1
  104. package/src/routes/ChatRoute.scss +45 -1
  105. package/src/routes/ChatRoute.tsx +3 -0
  106. package/dist/assets/channel-BvERb8WU.js +0 -1
  107. package/dist/assets/clone-B9_0v-6Y.js +0 -1
  108. package/dist/assets/flowDiagram-v2-4f6560a1-LpS8Kb00.js +0 -1
  109. package/dist/assets/index-C1oh0w9H.css +0 -32
  110. package/src/components/chat/ThinkingStatus.scss +0 -70
  111. package/src/components/chat/ThinkingStatus.tsx +0 -13
@@ -1,7 +1,44 @@
1
1
  import './SenderAttachments.scss'
2
2
 
3
+ import { useTranslation } from 'react-i18next'
4
+
3
5
  import type { PendingContextFile, PendingImage } from '../../@types/sender-composer'
4
6
 
7
+ const formatAttachmentSize = (size?: number) => {
8
+ if (size == null || Number.isNaN(size) || size <= 0) {
9
+ return null
10
+ }
11
+
12
+ if (size < 1024) {
13
+ return `${size} B`
14
+ }
15
+
16
+ if (size < 1024 * 1024) {
17
+ return `${(size / 1024).toFixed(size >= 10 * 1024 ? 0 : 1)} KB`
18
+ }
19
+
20
+ return `${(size / (1024 * 1024)).toFixed(size >= 10 * 1024 * 1024 ? 0 : 1)} MB`
21
+ }
22
+
23
+ const getFileDisplayName = (file: PendingContextFile) => {
24
+ if (file.name != null && file.name !== '') {
25
+ return file.name
26
+ }
27
+
28
+ const parts = file.path.split(/[\\/]/)
29
+ return parts.at(-1) ?? file.path
30
+ }
31
+
32
+ const getFileParentPath = (path: string) => {
33
+ const normalized = path.replace(/\\/g, '/')
34
+ const lastSlashIndex = normalized.lastIndexOf('/')
35
+ if (lastSlashIndex <= 0) {
36
+ return '.'
37
+ }
38
+
39
+ return normalized.slice(0, lastSlashIndex)
40
+ }
41
+
5
42
  export function SenderAttachments({
6
43
  pendingImages,
7
44
  pendingFiles,
@@ -13,33 +50,68 @@ export function SenderAttachments({
13
50
  onRemovePendingImage: (id: string) => void
14
51
  onRemovePendingFile: (path: string) => void
15
52
  }) {
53
+ const { t } = useTranslation()
54
+
16
55
  return (
17
56
  <>
18
- {pendingImages.length > 0 && (
19
- <div className='pending-images'>
20
- {pendingImages.map(image => (
21
- <div key={image.id} className='pending-image'>
22
- <img src={image.url} alt={image.name ?? 'image'} />
23
- <div className='pending-image-remove' onClick={() => onRemovePendingImage(image.id)}>
24
- <span className='material-symbols-rounded'>close</span>
25
- </div>
57
+ {(pendingImages.length > 0 || pendingFiles.length > 0) && (
58
+ <div className='pending-attachments'>
59
+ {pendingFiles.length > 0 && (
60
+ <div className='pending-attachments__files'>
61
+ {pendingFiles.map((file) => {
62
+ const sizeLabel = formatAttachmentSize(file.size)
63
+
64
+ return (
65
+ <div key={file.path} className='pending-context-file'>
66
+ <div className='pending-context-file__meta'>
67
+ <span className='material-symbols-rounded pending-context-file__icon'>attach_file</span>
68
+ <div className='pending-context-file__copy'>
69
+ <span className='pending-context-file__name'>{getFileDisplayName(file)}</span>
70
+ <code className='pending-context-file__path'>{getFileParentPath(file.path)}</code>
71
+ </div>
72
+ </div>
73
+ <div className='pending-context-file__actions'>
74
+ {sizeLabel != null && <span className='pending-context-file__size'>{sizeLabel}</span>}
75
+ <button
76
+ type='button'
77
+ className='pending-context-file__remove'
78
+ onClick={() => onRemovePendingFile(file.path)}
79
+ >
80
+ <span className='material-symbols-rounded'>close</span>
81
+ </button>
82
+ </div>
83
+ </div>
84
+ )
85
+ })}
26
86
  </div>
27
- ))}
28
- </div>
29
- )}
30
- {pendingFiles.length > 0 && (
31
- <div className='pending-context-files'>
32
- {pendingFiles.map(file => (
33
- <div key={file.path} className='pending-context-file'>
34
- <div className='pending-context-file__meta'>
35
- <span className='material-symbols-rounded pending-context-file__icon'>description</span>
36
- <code className='pending-context-file__path'>{file.path}</code>
37
- </div>
38
- <div className='pending-context-file__remove' onClick={() => onRemovePendingFile(file.path)}>
39
- <span className='material-symbols-rounded'>close</span>
40
- </div>
87
+ )}
88
+ {pendingImages.length > 0 && (
89
+ <div className='pending-attachments__images'>
90
+ {pendingImages.map((image) => {
91
+ const displayName = image.name ?? t('chat.attachments.pastedImage')
92
+ const sizeLabel = formatAttachmentSize(image.size)
93
+
94
+ return (
95
+ <div key={image.id} className='pending-image'>
96
+ <img src={image.url} alt={image.name ?? ''} />
97
+ <div className='pending-image__overlay'>
98
+ <div className='pending-image__meta'>
99
+ <span className='pending-image__name'>{displayName}</span>
100
+ {sizeLabel != null && <span className='pending-image__size'>{sizeLabel}</span>}
101
+ </div>
102
+ </div>
103
+ <button
104
+ type='button'
105
+ className='pending-image-remove'
106
+ onClick={() => onRemovePendingImage(image.id)}
107
+ >
108
+ <span className='material-symbols-rounded'>close</span>
109
+ </button>
110
+ </div>
111
+ )
112
+ })}
41
113
  </div>
42
- ))}
114
+ )}
43
115
  </div>
44
116
  )}
45
117
  </>
@@ -35,6 +35,8 @@ export function SenderBody({
35
35
  onCursorChange,
36
36
  onKeyDown,
37
37
  onPaste,
38
+ secondarySendShortcut,
39
+ onSecondarySendShortcut,
38
40
  resolveCompletionMatch,
39
41
  resolveTokenDecorations,
40
42
  toolbarState,
@@ -60,6 +62,8 @@ export function SenderBody({
60
62
  onCursorChange: (cursorOffset: number | null) => void
61
63
  onKeyDown: (event: KeyboardEvent) => void
62
64
  onPaste: (event: ClipboardEvent) => void | Promise<void>
65
+ secondarySendShortcut?: string
66
+ onSecondarySendShortcut?: () => void
63
67
  resolveCompletionMatch: (
64
68
  value: string,
65
69
  cursorOffset: number | null,
@@ -91,7 +95,10 @@ export function SenderBody({
91
95
  placeholder={placeholder || t('chat.inputPlaceholder')}
92
96
  disabled={(!isInlineEdit && modelUnavailable) || (isInlineEdit && isBusy)}
93
97
  sendShortcut={toolbarState.resolvedSendShortcut}
98
+ sendShortcutDisabled={toolbarState.sendBlocked}
94
99
  onSendShortcut={toolbarHandlers.onSend}
100
+ secondarySendShortcut={secondarySendShortcut}
101
+ onSecondarySendShortcut={onSecondarySendShortcut}
95
102
  onInputChange={onInputChange}
96
103
  onCursorChange={onCursorChange}
97
104
  onKeyDown={onKeyDown}
@@ -1,57 +1,123 @@
1
1
  .chat-input-wrapper--permission {
2
2
  .interaction-panel {
3
- margin-bottom: 0;
3
+ max-height: none;
4
+ overflow-y: visible;
4
5
  }
5
6
  }
6
7
 
7
8
  .interaction-panel {
8
- display: flex;
9
- flex-direction: column;
10
- width: 100%;
11
- gap: 6px;
12
- padding: 12px;
13
- border: 1px solid var(--border-color);
14
- border-radius: 12px;
15
- background-color: var(--input-bg, #f9fafb);
9
+ --interaction-muted: var(--sub-text-color, #6b7280);
10
+ --interaction-option-bg: var(--bg-color);
11
+ --interaction-option-border: var(--border-color);
12
+ --interaction-option-hover-border: rgba(59, 130, 246, .3);
13
+ --interaction-option-active-bg: rgba(59, 130, 246, .08);
14
+ --interaction-option-active-border: rgba(59, 130, 246, .42);
15
+ --interaction-info-bg: rgba(15, 23, 42, .06);
16
16
 
17
- &__header {
17
+ &__summary {
18
+ align-items: flex-start;
19
+ padding: 10px 12px 6px;
20
+ gap: 10px;
21
+ }
22
+
23
+ &__body {
18
24
  display: flex;
19
25
  flex-direction: column;
26
+ gap: 6px;
27
+ padding: 0 8px 8px;
20
28
  }
21
29
 
22
- &__options {
30
+ &__header {
31
+ width: 100%;
23
32
  display: flex;
24
- flex-direction: column;
33
+ align-items: flex-start;
34
+ justify-content: space-between;
35
+ gap: 8px;
36
+ }
37
+
38
+ &__title-wrap {
39
+ flex: 1;
40
+ min-width: 0;
41
+ display: flex;
42
+ align-items: center;
25
43
  gap: 6px;
26
44
  }
27
45
 
28
- &__secondary {
46
+ &__title-icon {
47
+ flex: 0 0 auto;
48
+ font-size: 15px;
49
+ color: var(--primary-color, #2563eb);
50
+ }
51
+
52
+ &__options {
29
53
  display: flex;
30
54
  flex-direction: column;
31
55
  gap: 6px;
32
- overflow: hidden;
33
- animation: interaction-panel-secondary-enter .2s ease;
34
- transform-origin: top;
56
+ }
57
+
58
+ &__nav {
59
+ flex: 0 0 auto;
60
+ display: inline-flex;
61
+ align-items: center;
62
+ gap: 2px;
63
+ margin-top: -1px;
64
+ }
65
+
66
+ &__nav-button {
67
+ width: 22px;
68
+ height: 22px;
69
+ padding: 0;
70
+ border: none;
71
+ border-radius: 6px;
72
+ background: transparent;
73
+ color: var(--interaction-muted);
74
+ display: inline-flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ cursor: pointer;
78
+ transition: background-color .18s ease, color .18s ease;
79
+
80
+ .material-symbols-rounded {
81
+ font-size: 17px;
82
+ line-height: 1;
83
+ }
84
+
85
+ &:hover,
86
+ &:focus-visible {
87
+ background: rgba(148, 163, 184, .14);
88
+ color: var(--text-color);
89
+ outline: none;
90
+ }
35
91
  }
36
92
 
37
93
  &__option.ant-btn {
38
94
  height: auto;
39
95
  display: flex;
40
- align-items: center;
96
+ align-items: flex-start;
41
97
  justify-content: flex-start;
42
98
  gap: 8px;
43
99
  padding: 8px 10px;
44
100
  border-radius: 10px;
45
- border-color: var(--border-color);
46
- background: var(--bg-color);
101
+ border-color: var(--interaction-option-border);
102
+ background: var(--interaction-option-bg);
47
103
  box-shadow: none;
48
104
  text-align: left;
49
- }
105
+ transition:
106
+ background-color .18s ease,
107
+ border-color .18s ease,
108
+ color .18s ease;
109
+
110
+ &.is-active {
111
+ background: var(--interaction-option-active-bg);
112
+ border-color: var(--interaction-option-active-border);
113
+ }
50
114
 
51
- &__option.ant-btn:hover,
52
- &__option.ant-btn:focus {
53
- border-color: rgba(59, 130, 246, .3);
54
- background: var(--bg-color);
115
+ &:hover,
116
+ &:focus-visible {
117
+ border-color: var(--interaction-option-hover-border);
118
+ background: var(--interaction-option-bg);
119
+ outline: none;
120
+ }
55
121
  }
56
122
 
57
123
  &__option--allow.ant-btn {
@@ -75,6 +141,24 @@
75
141
  }
76
142
  }
77
143
 
144
+ &__option--question.ant-btn {
145
+ display: block;
146
+ padding: 6px 8px;
147
+ background: transparent;
148
+ border-color: rgba(148, 163, 184, .16);
149
+
150
+ &.is-active {
151
+ background: rgba(148, 163, 184, .16);
152
+ border-color: rgba(148, 163, 184, .38);
153
+ }
154
+
155
+ &:hover,
156
+ &:focus-visible {
157
+ background: rgba(148, 163, 184, .14);
158
+ border-color: rgba(148, 163, 184, .3);
159
+ }
160
+ }
161
+
78
162
  &__option-icon {
79
163
  display: inline-flex;
80
164
  align-items: center;
@@ -85,6 +169,7 @@
85
169
  flex: 0 0 auto;
86
170
  align-self: center;
87
171
  font-size: 13px;
172
+ margin-top: 1px;
88
173
  }
89
174
 
90
175
  &__option-copy {
@@ -101,7 +186,25 @@
101
186
  min-width: 0;
102
187
  }
103
188
 
189
+ &__option-main {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 8px;
193
+ width: 100%;
194
+ min-width: 0;
195
+ }
196
+
197
+ &__option-index {
198
+ flex: 0 0 auto;
199
+ color: var(--interaction-muted);
200
+ font-size: 11px;
201
+ font-weight: 600;
202
+ line-height: 1.25;
203
+ user-select: none;
204
+ }
205
+
104
206
  &__option-label {
207
+ min-width: 0;
105
208
  font-size: 11px;
106
209
  font-weight: 500;
107
210
  line-height: 1.35;
@@ -116,6 +219,26 @@
116
219
  word-break: break-word;
117
220
  }
118
221
 
222
+ &__option-side {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ flex: 0 0 auto;
226
+ }
227
+
228
+ &__info-trigger {
229
+ width: 16px;
230
+ height: 16px;
231
+ border-radius: 999px;
232
+ display: inline-flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ background: var(--interaction-info-bg);
236
+ color: var(--interaction-muted);
237
+ font-size: 12px;
238
+ line-height: 1;
239
+ cursor: help;
240
+ }
241
+
119
242
  &__toggle.ant-btn {
120
243
  height: auto;
121
244
  display: inline-flex;
@@ -144,35 +267,28 @@
144
267
  }
145
268
  }
146
269
 
147
- @keyframes interaction-panel-secondary-enter {
148
- from {
149
- max-height: 0;
150
- opacity: 0;
151
- transform: translateY(-4px);
152
- }
153
-
154
- to {
155
- max-height: 240px;
156
- opacity: 1;
157
- transform: translateY(0);
158
- }
159
- }
160
-
161
270
  .interaction-question {
271
+ min-width: 0;
162
272
  font-size: 12px;
163
273
  font-weight: 600;
164
274
  line-height: 1.4;
165
275
  color: var(--text-color);
166
276
  }
167
277
 
168
- @media (prefers-reduced-motion: reduce) {
169
- .interaction-panel__secondary {
170
- animation: none;
171
- }
172
- }
173
-
174
278
  html.dark {
175
279
  .interaction-panel {
176
- --input-bg: #1f1f1f;
280
+ --interaction-option-bg: rgba(15, 23, 42, .52);
281
+ --interaction-option-border: rgba(71, 85, 105, .36);
282
+ --interaction-option-hover-border: rgba(148, 163, 184, .5);
283
+ --interaction-option-active-bg: rgba(51, 65, 85, .44);
284
+ --interaction-option-active-border: rgba(148, 163, 184, .52);
285
+ --interaction-info-bg: rgba(148, 163, 184, .14);
286
+ }
287
+
288
+ .interaction-panel__option.ant-btn {
289
+ &:hover,
290
+ &:focus-visible {
291
+ background: var(--interaction-option-bg);
292
+ }
177
293
  }
178
294
  }