@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
@@ -0,0 +1,195 @@
1
+ .queued-messages-card {
2
+ &__summary {
3
+ align-items: center;
4
+ }
5
+
6
+ &__body {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 4px;
10
+ }
11
+
12
+ &__headline {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 6px;
16
+ min-width: 0;
17
+ }
18
+
19
+ &__headline-icon {
20
+ flex: 0 0 auto;
21
+ font-size: 15px;
22
+ color: var(--primary-color, #2563eb);
23
+ }
24
+
25
+ &__headline-copy {
26
+ min-width: 0;
27
+ display: flex;
28
+ align-items: baseline;
29
+ gap: 6px;
30
+ flex-wrap: wrap;
31
+ }
32
+
33
+ &__headline-title {
34
+ font-size: 11px;
35
+ font-weight: 600;
36
+ line-height: 1.25;
37
+ color: var(--text-color);
38
+ }
39
+
40
+ &__headline-meta {
41
+ font-size: 10px;
42
+ line-height: 1.2;
43
+ color: var(--sub-text-color, #6b7280);
44
+ }
45
+
46
+ &__list {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 4px;
50
+ }
51
+
52
+ &__item {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: space-between;
56
+ gap: 8px;
57
+ padding: 5px 8px;
58
+ border: 1px solid rgba(148, 163, 184, .16);
59
+ border-radius: 10px;
60
+ background: transparent;
61
+ transition: background-color .18s ease, border-color .18s ease;
62
+
63
+ &:hover {
64
+ background: var(--tag-hover-bg, rgba(148, 163, 184, .08));
65
+ border-color: rgba(148, 163, 184, .26);
66
+ }
67
+ }
68
+
69
+ &__item-main {
70
+ min-width: 0;
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 6px;
74
+ flex: 1;
75
+ }
76
+
77
+ &__drag {
78
+ flex: 0 0 auto;
79
+ color: var(--sub-text-color, #94a3b8);
80
+ font-size: 14px;
81
+ cursor: grab;
82
+ }
83
+
84
+ &__item-copy {
85
+ min-width: 0;
86
+ flex: 1;
87
+ }
88
+
89
+ &__item-summary {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 6px;
93
+ min-width: 0;
94
+ }
95
+
96
+ &__flags {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 4px;
100
+ flex: 0 0 auto;
101
+ }
102
+
103
+ &__flag {
104
+ width: 18px;
105
+ height: 18px;
106
+ border-radius: 999px;
107
+ background: var(--tag-bg, rgba(15, 23, 42, .06));
108
+ color: var(--sub-text-color, #6b7280);
109
+ display: inline-flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+
113
+ .material-symbols-rounded {
114
+ font-size: 12px;
115
+ line-height: 1;
116
+ }
117
+ }
118
+
119
+ &__item-text {
120
+ display: -webkit-box;
121
+ overflow: hidden;
122
+ color: var(--text-color);
123
+ font-size: 12px;
124
+ line-height: 1.45;
125
+ white-space: pre-wrap;
126
+ word-break: break-word;
127
+ -webkit-box-orient: vertical;
128
+ -webkit-line-clamp: 3;
129
+ }
130
+
131
+ &__actions {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ gap: 2px;
135
+ flex: 0 0 auto;
136
+ }
137
+
138
+ &__action {
139
+ width: 24px;
140
+ height: 24px;
141
+ border: 0;
142
+ border-radius: 8px;
143
+ background: transparent;
144
+ color: var(--sub-text-color, #6b7280);
145
+ display: inline-flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ cursor: pointer;
149
+ transition: background-color .18s ease, color .18s ease;
150
+
151
+ &:hover {
152
+ background: var(--tag-hover-bg, rgba(148, 163, 184, .12));
153
+ }
154
+
155
+ .material-symbols-rounded {
156
+ font-size: 14px;
157
+ line-height: 1;
158
+ }
159
+ }
160
+
161
+ &__action--edit {
162
+ color: var(--sub-text-color, #6b7280);
163
+
164
+ &:hover {
165
+ background: var(--tag-hover-bg, rgba(148, 163, 184, .12));
166
+ color: var(--text-color);
167
+ }
168
+ }
169
+
170
+ &__action--move {
171
+ color: var(--primary-color, #2563eb);
172
+
173
+ &:hover {
174
+ background: color-mix(
175
+ in srgb,
176
+ var(--primary-color, #2563eb) 12%,
177
+ transparent
178
+ );
179
+ color: color-mix(
180
+ in srgb,
181
+ var(--primary-color, #2563eb) 82%,
182
+ var(--text-color) 18%
183
+ );
184
+ }
185
+ }
186
+
187
+ &__action--delete {
188
+ color: #dc2626;
189
+
190
+ &:hover {
191
+ background: rgba(220, 38, 38, .12);
192
+ color: #b91c1c;
193
+ }
194
+ }
195
+ }
@@ -0,0 +1,170 @@
1
+ import './QueuedMessagesCard.scss'
2
+
3
+ import { useState } from 'react'
4
+ import { useTranslation } from 'react-i18next'
5
+
6
+ import type { ChatMessageContent, SessionQueuedMessage, SessionQueuedMessageMode } from '@vibe-forge/core'
7
+
8
+ import { ChatComposerCard } from './ChatComposerCard'
9
+
10
+ const getSummaryText = (content: ChatMessageContent[]) => {
11
+ const text = content
12
+ .filter((item): item is Extract<ChatMessageContent, { type: 'text' }> => item.type === 'text')
13
+ .map(item => item.text.trim())
14
+ .filter(Boolean)
15
+ .join('\n')
16
+
17
+ return text
18
+ }
19
+
20
+ const getContentFlags = (content: ChatMessageContent[]) => ({
21
+ hasImages: content.some(item => item.type === 'image'),
22
+ hasReferences: content.some(item => item.type === 'file')
23
+ })
24
+
25
+ const reorderIds = (ids: string[], draggedId: string, targetId: string) => {
26
+ if (draggedId === targetId) {
27
+ return ids
28
+ }
29
+
30
+ const current = [...ids]
31
+ const fromIndex = current.indexOf(draggedId)
32
+ const toIndex = current.indexOf(targetId)
33
+ if (fromIndex === -1 || toIndex === -1) {
34
+ return ids
35
+ }
36
+
37
+ current.splice(fromIndex, 1)
38
+ current.splice(toIndex, 0, draggedId)
39
+ return current
40
+ }
41
+
42
+ export function QueuedMessagesCard({
43
+ mode,
44
+ items,
45
+ onMove,
46
+ onDelete,
47
+ onEdit,
48
+ onReorder
49
+ }: {
50
+ mode: SessionQueuedMessageMode
51
+ items: SessionQueuedMessage[]
52
+ onMove: (item: SessionQueuedMessage, targetMode: SessionQueuedMessageMode) => void | Promise<unknown>
53
+ onDelete: (item: SessionQueuedMessage) => void | Promise<unknown>
54
+ onEdit: (item: SessionQueuedMessage) => void | Promise<unknown>
55
+ onReorder: (ids: string[]) => void | Promise<unknown>
56
+ }) {
57
+ const { t } = useTranslation()
58
+ const [draggedId, setDraggedId] = useState<string | null>(null)
59
+
60
+ const summaryLabel = mode === 'next'
61
+ ? t('chat.queue.nextTitle')
62
+ : t('chat.queue.steerTitle')
63
+ const summaryCount = t('chat.queue.count', { count: items.length })
64
+
65
+ if (items.length === 0) {
66
+ return null
67
+ }
68
+
69
+ const targetMode = mode === 'next' ? 'steer' : 'next'
70
+
71
+ return (
72
+ <ChatComposerCard
73
+ className='queued-messages-card'
74
+ summaryClassName='queued-messages-card__summary'
75
+ bodyClassName='queued-messages-card__body'
76
+ narrow
77
+ summary={
78
+ <div className='queued-messages-card__headline'>
79
+ <span className='material-symbols-rounded queued-messages-card__headline-icon'>
80
+ {mode === 'next' ? 'pending' : 'schedule'}
81
+ </span>
82
+ <div className='queued-messages-card__headline-copy'>
83
+ <div className='queued-messages-card__headline-title'>{summaryLabel}</div>
84
+ <div className='queued-messages-card__headline-meta'>{summaryCount}</div>
85
+ </div>
86
+ </div>
87
+ }
88
+ >
89
+ <div className='queued-messages-card__list'>
90
+ {items.map((item) => {
91
+ const summaryText = getSummaryText(item.content)
92
+ const { hasImages, hasReferences } = getContentFlags(item.content)
93
+ return (
94
+ <div
95
+ key={item.id}
96
+ className='queued-messages-card__item'
97
+ draggable
98
+ onDragStart={() => setDraggedId(item.id)}
99
+ onDragEnd={() => setDraggedId(null)}
100
+ onDragOver={(event) => {
101
+ event.preventDefault()
102
+ }}
103
+ onDrop={(event) => {
104
+ event.preventDefault()
105
+ if (draggedId == null) {
106
+ return
107
+ }
108
+ const nextIds = reorderIds(items.map(queueItem => queueItem.id), draggedId, item.id)
109
+ setDraggedId(null)
110
+ void onReorder(nextIds)
111
+ }}
112
+ >
113
+ <div className='queued-messages-card__item-main'>
114
+ <span className='queued-messages-card__drag material-symbols-rounded' aria-hidden='true'>
115
+ drag_indicator
116
+ </span>
117
+ <div className='queued-messages-card__item-copy'>
118
+ <div className='queued-messages-card__item-summary'>
119
+ {(hasImages || hasReferences) && (
120
+ <div className='queued-messages-card__flags'>
121
+ {hasImages && (
122
+ <span className='queued-messages-card__flag' title={t('chat.queue.hasImage')}>
123
+ <span className='material-symbols-rounded'>image</span>
124
+ </span>
125
+ )}
126
+ {hasReferences && (
127
+ <span className='queued-messages-card__flag' title={t('chat.queue.hasReference')}>
128
+ <span className='material-symbols-rounded'>attach_file</span>
129
+ </span>
130
+ )}
131
+ </div>
132
+ )}
133
+ <div className='queued-messages-card__item-text'>
134
+ {summaryText !== '' ? summaryText : t('chat.queue.attachmentsOnly')}
135
+ </div>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ <div className='queued-messages-card__actions'>
140
+ <button
141
+ type='button'
142
+ className='queued-messages-card__action queued-messages-card__action--move'
143
+ onClick={() => void onMove(item, targetMode)}
144
+ title={t(targetMode === 'next' ? 'chat.queue.moveToNext' : 'chat.queue.moveToSteer')}
145
+ aria-label={t(targetMode === 'next' ? 'chat.queue.moveToNext' : 'chat.queue.moveToSteer')}
146
+ >
147
+ <span className='material-symbols-rounded'>swap_horiz</span>
148
+ </button>
149
+ <button
150
+ type='button'
151
+ className='queued-messages-card__action queued-messages-card__action--edit'
152
+ onClick={() => void onEdit(item)}
153
+ >
154
+ <span className='material-symbols-rounded'>edit</span>
155
+ </button>
156
+ <button
157
+ type='button'
158
+ className='queued-messages-card__action queued-messages-card__action--delete'
159
+ onClick={() => void onDelete(item)}
160
+ >
161
+ <span className='material-symbols-rounded'>delete</span>
162
+ </button>
163
+ </div>
164
+ </div>
165
+ )
166
+ })}
167
+ </div>
168
+ </ChatComposerCard>
169
+ )
170
+ }
@@ -84,3 +84,11 @@
84
84
  flex-shrink: 0;
85
85
  opacity: .9;
86
86
  }
87
+
88
+ .adapter-option__icon--fallback {
89
+ display: inline-flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ font-size: 15px;
93
+ line-height: 1;
94
+ }
@@ -1,25 +1,35 @@
1
- .pending-images {
1
+ .pending-attachments {
2
2
  display: flex;
3
- gap: 8px;
4
- padding: 6px 0;
5
- flex-wrap: wrap;
3
+ flex-direction: column;
4
+ gap: 6px;
5
+ padding: 2px 0 8px;
6
+ align-items: flex-start;
6
7
  }
7
8
 
8
- .pending-context-files {
9
+ .pending-attachments__files,
10
+ .pending-attachments__images {
11
+ width: 100%;
9
12
  display: flex;
13
+ gap: 6px;
14
+ align-items: flex-start;
15
+ }
16
+
17
+ .pending-attachments__files {
10
18
  flex-direction: column;
11
- gap: 8px;
12
- padding: 4px 0 6px;
19
+ }
20
+
21
+ .pending-attachments__images {
22
+ flex-wrap: wrap;
13
23
  }
14
24
 
15
25
  .pending-image {
16
26
  position: relative;
17
- width: 56px;
18
- height: 56px;
27
+ width: 60px;
28
+ height: 60px;
19
29
  border-radius: 10px;
20
30
  overflow: hidden;
21
- border: 1px solid var(--border-color);
22
- background-color: var(--bg-color);
31
+ border: 1px solid rgba(148, 163, 184, .18);
32
+ background-color: var(--tag-bg, #f3f4f6);
23
33
 
24
34
  img {
25
35
  width: 100%;
@@ -29,15 +39,53 @@
29
39
  }
30
40
  }
31
41
 
42
+ .pending-image__overlay {
43
+ position: absolute;
44
+ inset: auto 0 0;
45
+ padding: 14px 6px 6px;
46
+ background: linear-gradient(
47
+ 180deg,
48
+ rgba(15, 23, 42, 0),
49
+ rgba(15, 23, 42, .76)
50
+ );
51
+ }
52
+
53
+ .pending-image__meta {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 1px;
57
+ }
58
+
59
+ .pending-image__name,
60
+ .pending-image__size {
61
+ color: #fff;
62
+ line-height: 1.2;
63
+ text-shadow: 0 1px 2px rgba(15, 23, 42, .32);
64
+ }
65
+
66
+ .pending-image__name {
67
+ font-size: 9px;
68
+ font-weight: 600;
69
+ overflow: hidden;
70
+ text-overflow: ellipsis;
71
+ white-space: nowrap;
72
+ }
73
+
74
+ .pending-image__size {
75
+ font-size: 8px;
76
+ opacity: .85;
77
+ }
78
+
32
79
  .pending-context-file {
33
80
  display: flex;
81
+ width: 100%;
34
82
  align-items: center;
35
83
  justify-content: space-between;
36
- gap: 12px;
37
- padding: 8px 10px;
38
- border: 1px solid var(--border-color);
84
+ gap: 6px;
85
+ padding: 5px 8px;
86
+ border: 1px solid rgba(148, 163, 184, .2);
39
87
  border-radius: 10px;
40
- background: var(--bg-color);
88
+ background: var(--tag-bg, #f3f4f6);
41
89
  }
42
90
 
43
91
  .pending-context-file__meta {
@@ -45,30 +93,74 @@
45
93
  display: flex;
46
94
  align-items: center;
47
95
  gap: 8px;
96
+ flex: 1;
48
97
  }
49
98
 
50
99
  .pending-context-file__icon {
51
- font-size: 18px;
52
- color: var(--sub-text-color, #6b7280);
100
+ font-size: 15px;
101
+ color: var(--primary-color, #2563eb);
102
+ width: 24px;
103
+ height: 24px;
104
+ border-radius: 7px;
105
+ background: rgba(37, 99, 235, .1);
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ flex-shrink: 0;
110
+ }
111
+
112
+ .pending-context-file__copy {
113
+ min-width: 0;
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 1px;
117
+ }
118
+
119
+ .pending-context-file__name {
120
+ font-size: 10px;
121
+ font-weight: 600;
122
+ color: var(--text-color);
123
+ line-height: 1.4;
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
53
127
  }
54
128
 
55
129
  .pending-context-file__path {
56
130
  display: block;
57
131
  min-width: 0;
58
- color: var(--text-color);
59
- font-size: 12px;
60
- line-height: 1.5;
61
- overflow-wrap: anywhere;
132
+ color: var(--sub-text-color, #6b7280);
133
+ font-size: 9px;
134
+ line-height: 1.4;
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ .pending-context-file__actions {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 8px;
144
+ flex-shrink: 0;
145
+ }
146
+
147
+ .pending-context-file__size {
148
+ font-size: 9px;
149
+ font-weight: 600;
150
+ color: var(--sub-text-color, #6b7280);
62
151
  }
63
152
 
64
153
  .pending-context-file__remove {
65
- width: 20px;
66
- height: 20px;
154
+ width: 22px;
155
+ height: 22px;
156
+ border: none;
157
+ padding: 0;
67
158
  border-radius: 999px;
68
159
  display: flex;
69
160
  align-items: center;
70
161
  justify-content: center;
71
162
  color: var(--sub-text-color, #6b7280);
163
+ background: transparent;
72
164
  cursor: pointer;
73
165
 
74
166
  &:hover {
@@ -84,20 +176,52 @@
84
176
 
85
177
  .pending-image-remove {
86
178
  position: absolute;
87
- top: 4px;
88
- right: 4px;
179
+ top: 5px;
180
+ right: 5px;
89
181
  width: 18px;
90
182
  height: 18px;
91
- border-radius: 9px;
92
- background-color: rgba(0, 0, 0, .55);
183
+ padding: 0;
184
+ border: 1px solid rgba(255, 255, 255, .18);
185
+ border-radius: 999px;
186
+ background-color: rgba(15, 23, 42, .64);
93
187
  color: #fff;
94
188
  display: flex;
95
189
  align-items: center;
96
190
  justify-content: center;
97
191
  cursor: pointer;
192
+ backdrop-filter: blur(10px);
193
+
194
+ &:hover {
195
+ background-color: rgba(15, 23, 42, .84);
196
+ }
98
197
 
99
198
  .material-symbols-rounded {
100
- font-size: 14px;
199
+ font-size: 12px;
101
200
  line-height: 1;
102
201
  }
103
202
  }
203
+
204
+ html.dark {
205
+ .pending-image {
206
+ border-color: rgba(71, 85, 105, .55);
207
+ }
208
+
209
+ .pending-context-file {
210
+ border-color: rgba(71, 85, 105, .55);
211
+ background: rgba(30, 41, 59, .72);
212
+ }
213
+
214
+ .pending-context-file__icon {
215
+ background: rgba(59, 130, 246, .16);
216
+ }
217
+ }
218
+
219
+ @media (max-width: 640px) {
220
+ .pending-context-file {
221
+ width: 100%;
222
+ }
223
+
224
+ .pending-attachments__images {
225
+ width: 100%;
226
+ }
227
+ }