@adatechnology/conversations-ui 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -20
- package/dist/{chunk-JXJCPN34.js → chunk-FAQLC3TX.js} +1 -1
- package/dist/{chunk-RJMSM3YA.js → chunk-O6457XHK.js} +17 -11
- package/dist/chunk-OVFCLRQQ.js +84 -0
- package/dist/index.d.ts +14 -4
- package/dist/index.js +7 -7
- package/dist/participant/index.d.ts +25 -1
- package/dist/participant/index.js +454 -194
- package/dist/preview/index.js +2 -2
- package/dist/styles.css +106 -0
- package/package.json +3 -3
- package/src/MessageBubble.test.tsx +2 -2
- package/src/MessageText.test.tsx +27 -10
- package/src/MessageText.tsx +25 -17
- package/src/MessageTextCopiedBadge.tsx +10 -2
- package/src/StatusTicks.test.tsx +27 -6
- package/src/StatusTicks.tsx +30 -15
- package/src/cssBlocks.test-helper.ts +31 -0
- package/src/legacyChannels.golden.test.ts +89 -0
- package/src/legacyDefaults.golden.test.tsx +127 -0
- package/src/legacyStyles.fixture.css +1121 -0
- package/src/legacyStyles.golden.test.ts +92 -0
- package/src/messageTextCopyInteraction.test.ts +75 -0
- package/src/messageTextCopyInteraction.ts +37 -0
- package/src/participant/ParticipantChannelBadges.test.tsx +59 -0
- package/src/participant/ParticipantChannelBadges.tsx +75 -0
- package/src/participant/ParticipantConversations.tsx +13 -6
- package/src/participant/ParticipantConversationsScreen.tsx +18 -7
- package/src/participant/ParticipantInbox.test.tsx +99 -2
- package/src/participant/ParticipantInbox.tsx +27 -46
- package/src/participant/ParticipantInboxRow.tsx +75 -0
- package/src/participant/ParticipantInboxSearchField.tsx +34 -0
- package/src/participant/ParticipantMessageBubble.test.tsx +2 -0
- package/src/participant/ParticipantMessageBubble.tsx +3 -3
- package/src/participant/ParticipantProtocolBadge.tsx +74 -0
- package/src/participant/ParticipantProtocolView.test.tsx +208 -0
- package/src/participant/ParticipantThread.test.tsx +19 -2
- package/src/participant/ParticipantThread.tsx +25 -15
- package/src/participant/index.ts +1 -0
- package/src/participant/participant.types.ts +9 -0
- package/src/participant/participantChannels.test.ts +42 -0
- package/src/participant/participantChannels.ts +33 -0
- package/src/participant/participantGrouping.test.ts +101 -3
- package/src/participant/participantGrouping.ts +20 -7
- package/src/participant/participantLabels.ts +29 -0
- package/src/participant/participantProtocol.test.ts +104 -0
- package/src/participant/participantProtocol.ts +52 -0
- package/src/participant/participantProtocolCopy.test.ts +45 -0
- package/src/participant/participantProtocolCopy.ts +32 -0
- package/src/participantLayoutShrink.test.ts +82 -0
- package/src/styles.css +22 -1
- package/dist/chunk-WSFGNR5R.js +0 -55
|
@@ -0,0 +1,1121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallpaper de fundo da conversa — padrão de doodles do WhatsApp.
|
|
3
|
+
* Extraído 1:1 de financiamento-imobiliario-bot/apps/web/src/index.css:119-129
|
|
4
|
+
* (mesmas cores, mesmo SVG, mesma opacidade) para preservar paridade visual.
|
|
5
|
+
*
|
|
6
|
+
* Consumo: import '@adatechnology/conversations-ui/styles.css' uma vez no host.
|
|
7
|
+
* Alterna claro/escuro via ancestral `.dark` (mesma convenção do darkMode: 'class'
|
|
8
|
+
* do Tailwind) — não depende de nenhuma configuração do Tailwind do host.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
.cv-wallpaper {
|
|
12
|
+
background-color: #efeae2;
|
|
13
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill='none' stroke='%23d7cfc0' stroke-width='1.2' opacity='0.7'%3E%3Ccircle cx='15' cy='15' r='3'/%3E%3Cpath d='M40 10 q5 8 0 16 q-5 -8 0 -16z'/%3E%3Ccircle cx='70' cy='28' r='2'/%3E%3Cpath d='M18 55 l6 6 m-6 0 l6 -6'/%3E%3Ccircle cx='55' cy='68' r='2.5'/%3E%3Cpath d='M85 58 q6 6 0 12 q-6 -6 0 -12z'/%3E%3Ccircle cx='8' cy='85' r='2'/%3E%3Cpath d='M65 90 l5 5 m-5 0 l5 -5'/%3E%3C/g%3E%3C/svg%3E");
|
|
14
|
+
background-repeat: repeat;
|
|
15
|
+
background-size: 100px 100px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.dark .cv-wallpaper {
|
|
19
|
+
background-color: #0b141a;
|
|
20
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill='none' stroke='%2319232a' stroke-width='1.2' opacity='0.9'%3E%3Ccircle cx='15' cy='15' r='3'/%3E%3Cpath d='M40 10 q5 8 0 16 q-5 -8 0 -16z'/%3E%3Ccircle cx='70' cy='28' r='2'/%3E%3Cpath d='M18 55 l6 6 m-6 0 l6 -6'/%3E%3Ccircle cx='55' cy='68' r='2.5'/%3E%3Cpath d='M85 58 q6 6 0 12 q-6 -6 0 -12z'/%3E%3Ccircle cx='8' cy='85' r='2'/%3E%3Cpath d='M65 90 l5 5 m-5 0 l5 -5'/%3E%3C/g%3E%3C/svg%3E");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Botão de ação do cabeçalho de conversa e do aviso de janela. Vive no stylesheet, como o
|
|
24
|
+
.cv-wallpaper, para não depender da configuração de Tailwind do consumidor. */
|
|
25
|
+
/* `inline-flex` com gap em todo controle com ícone: o ícone é SVG e, como elemento inline, assentava
|
|
26
|
+
na baseline do texto — o traço ficava um fio abaixo do rótulo em cada botão. */
|
|
27
|
+
.cv-header-action {
|
|
28
|
+
display: inline-flex;
|
|
29
|
+
align-items: center;
|
|
30
|
+
gap: 0.375rem;
|
|
31
|
+
border: 1px solid rgb(203 213 225);
|
|
32
|
+
border-radius: 0.375rem;
|
|
33
|
+
padding: 0.375rem 0.75rem;
|
|
34
|
+
font-size: 0.8125rem;
|
|
35
|
+
background: transparent;
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
}
|
|
38
|
+
.cv-header-action:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
39
|
+
.dark .cv-header-action { border-color: rgb(71 85 105); color: rgb(226 232 240); }
|
|
40
|
+
|
|
41
|
+
.cv-header-icon {
|
|
42
|
+
display: inline-flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
justify-content: center;
|
|
45
|
+
border: 1px solid rgb(203 213 225);
|
|
46
|
+
border-radius: 0.5rem;
|
|
47
|
+
padding: 0.375rem 0.5rem;
|
|
48
|
+
background: transparent;
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
line-height: 1;
|
|
51
|
+
}
|
|
52
|
+
.cv-header-icon--active { background: rgb(241 245 249); border-color: rgb(148 163 184); }
|
|
53
|
+
.cv-header-icon:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
54
|
+
.dark .cv-header-icon { border-color: rgb(71 85 105); }
|
|
55
|
+
.dark .cv-header-icon--active { background: rgb(51 65 85); }
|
|
56
|
+
|
|
57
|
+
.cv-header-action--primary {
|
|
58
|
+
background: rgb(37 99 235);
|
|
59
|
+
border-color: rgb(37 99 235);
|
|
60
|
+
color: white;
|
|
61
|
+
font-weight: 500;
|
|
62
|
+
}
|
|
63
|
+
.cv-header-action--danger {
|
|
64
|
+
background: rgb(239 68 68);
|
|
65
|
+
border-color: rgb(239 68 68);
|
|
66
|
+
color: white;
|
|
67
|
+
font-weight: 500;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.cv-subtab {
|
|
71
|
+
padding: 0.5rem 0.75rem;
|
|
72
|
+
font-size: 0.8125rem;
|
|
73
|
+
color: rgb(100 116 139);
|
|
74
|
+
background: transparent;
|
|
75
|
+
border: 0;
|
|
76
|
+
border-bottom: 2px solid transparent;
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
}
|
|
79
|
+
.cv-subtab--active { color: inherit; font-weight: 500; border-bottom-color: rgb(37 99 235); }
|
|
80
|
+
|
|
81
|
+
/* Pills de estado da conversa. No stylesheet, como os demais cv-*, para não depender do Tailwind
|
|
82
|
+
do consumidor. */
|
|
83
|
+
.cv-pill {
|
|
84
|
+
display: inline-flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 0.25rem;
|
|
87
|
+
font-size: 0.6875rem;
|
|
88
|
+
font-weight: 500;
|
|
89
|
+
line-height: 1;
|
|
90
|
+
padding: 0.25rem 0.5rem;
|
|
91
|
+
border-radius: 9999px;
|
|
92
|
+
background: rgb(241 245 249);
|
|
93
|
+
color: rgb(71 85 105);
|
|
94
|
+
}
|
|
95
|
+
.cv-pill--success { background: rgb(220 252 231); color: rgb(21 128 61); }
|
|
96
|
+
.cv-pill--warning { background: rgb(254 243 199); color: rgb(146 64 14); }
|
|
97
|
+
.cv-pill--danger { background: rgb(255 237 213); color: rgb(194 65 12); }
|
|
98
|
+
.dark .cv-pill { background: rgb(51 65 85); color: rgb(203 213 225); }
|
|
99
|
+
.dark .cv-pill--success { background: rgb(20 83 45); color: rgb(187 247 208); }
|
|
100
|
+
.dark .cv-pill--warning { background: rgb(120 53 15); color: rgb(253 230 138); }
|
|
101
|
+
.dark .cv-pill--danger { background: rgb(124 45 18); color: rgb(254 215 170); }
|
|
102
|
+
|
|
103
|
+
/* Linha da inbox: realce e hover cobrem a linha toda, incluindo checkbox, barra de janela e pills. */
|
|
104
|
+
.cv-row:hover { background: #f0f2f5; }
|
|
105
|
+
.cv-row--active, .cv-row--active:hover { background: #f0f2f5; }
|
|
106
|
+
.dark .cv-row:hover { background: rgb(30 41 59); }
|
|
107
|
+
.dark .cv-row--active, .dark .cv-row--active:hover { background: rgb(30 41 59); }
|
|
108
|
+
|
|
109
|
+
/* Voltar do master/detail: existe só onde lista e conversa não cabem lado a lado. */
|
|
110
|
+
.cv-back {
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
justify-content: center;
|
|
114
|
+
border: 1px solid rgb(203 213 225);
|
|
115
|
+
border-radius: 0.5rem;
|
|
116
|
+
padding: 0.25rem 0.5rem;
|
|
117
|
+
background: transparent;
|
|
118
|
+
cursor: pointer;
|
|
119
|
+
line-height: 1;
|
|
120
|
+
}
|
|
121
|
+
@media (min-width: 1024px) { .cv-back { display: none; } }
|
|
122
|
+
.dark .cv-back { border-color: rgb(71 85 105); color: rgb(226 232 240); }
|
|
123
|
+
|
|
124
|
+
/* Contador do cabeçalho da inbox: ícone e número na mesma linha de base ótica. */
|
|
125
|
+
.cv-stat {
|
|
126
|
+
display: inline-flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: 0.25rem;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* Utilitários de densidade: em tela estreita o texto das ações vira ícone, porque rótulo longo
|
|
132
|
+
empilha e come a altura útil da conversa. */
|
|
133
|
+
.cv-only-wide { display: none; }
|
|
134
|
+
@media (min-width: 1024px) { .cv-only-wide { display: inline; } }
|
|
135
|
+
.cv-only-narrow { display: inline-flex; }
|
|
136
|
+
@media (min-width: 1024px) { .cv-only-narrow { display: none; } }
|
|
137
|
+
|
|
138
|
+
.cv-menu { position: relative; }
|
|
139
|
+
.cv-menu-panel {
|
|
140
|
+
position: absolute;
|
|
141
|
+
right: 0;
|
|
142
|
+
top: calc(100% + 0.25rem);
|
|
143
|
+
z-index: 20;
|
|
144
|
+
min-width: 12rem;
|
|
145
|
+
display: flex;
|
|
146
|
+
flex-direction: column;
|
|
147
|
+
gap: 0.25rem;
|
|
148
|
+
padding: 0.375rem;
|
|
149
|
+
border: 1px solid rgb(203 213 225);
|
|
150
|
+
border-radius: 0.5rem;
|
|
151
|
+
background: #fff;
|
|
152
|
+
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
|
|
153
|
+
}
|
|
154
|
+
.dark .cv-menu-panel { background: rgb(30 41 59); border-color: rgb(71 85 105); }
|
|
155
|
+
.cv-menu-panel .cv-header-action { text-align: left; }
|
|
156
|
+
|
|
157
|
+
/* Área de toque mínima do padrão de responsividade (44px). Só em tela estreita: no desktop o
|
|
158
|
+
cursor é preciso e botões de 44px viram blocos desproporcionais. */
|
|
159
|
+
@media (max-width: 1023px) {
|
|
160
|
+
.cv-touch { min-width: 44px; min-height: 44px; }
|
|
161
|
+
.cv-back { min-width: 44px; min-height: 44px; }
|
|
162
|
+
.cv-menu-panel .cv-touch { min-height: 44px; }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Em tela estreita o painel do menu ancora na viewport, não no botão: ancorado ao botão ele
|
|
166
|
+
escapava pela borda quando o gatilho ficava perto da esquerda, e o texto era cortado. */
|
|
167
|
+
@media (max-width: 1023px) {
|
|
168
|
+
.cv-menu-panel {
|
|
169
|
+
position: fixed;
|
|
170
|
+
right: 0.75rem;
|
|
171
|
+
left: auto;
|
|
172
|
+
top: auto;
|
|
173
|
+
max-width: calc(100vw - 1.5rem);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Scrollbar fina — paridade com `.scrollbar-thin` de
|
|
179
|
+
* financiamento-imobiliario-bot/apps/web/src/index.css.
|
|
180
|
+
*
|
|
181
|
+
* Prefixo `cv-` porque o host pode ter a própria `.scrollbar-thin` (plugin do Tailwind ou CSS
|
|
182
|
+
* próprio): colidir no nome faria o painel herdar regra alheia sem ninguém entender por quê.
|
|
183
|
+
*
|
|
184
|
+
* Usada onde a área rola dentro de um bloco de altura limitada, como o grid de "Suas Seleções":
|
|
185
|
+
* a barra padrão do sistema ocupa ~15px e, num card de 3 colunas, come uma coluna inteira.
|
|
186
|
+
*/
|
|
187
|
+
.cv-scrollbar-thin {
|
|
188
|
+
scrollbar-width: thin;
|
|
189
|
+
scrollbar-color: rgba(0, 0, 0, 0.15) transparent;
|
|
190
|
+
}
|
|
191
|
+
.cv-scrollbar-thin::-webkit-scrollbar { width: 4px; height: 4px; }
|
|
192
|
+
.cv-scrollbar-thin::-webkit-scrollbar-track { background: transparent; }
|
|
193
|
+
.cv-scrollbar-thin::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.15); border-radius: 2px; }
|
|
194
|
+
.cv-scrollbar-thin::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.3); }
|
|
195
|
+
.dark .cv-scrollbar-thin { scrollbar-color: rgba(255, 255, 255, 0.15) transparent; }
|
|
196
|
+
.dark .cv-scrollbar-thin::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.15); }
|
|
197
|
+
.dark .cv-scrollbar-thin::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.3); }
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Mãozinha no que é clicável.
|
|
201
|
+
*
|
|
202
|
+
* O Preflight do Tailwind v3 punha `cursor: pointer` em `button`; o v4 removeu, e sem regra
|
|
203
|
+
* explícita o botão herda o `cursor: default` do browser — os componentes deste pacote deixam de
|
|
204
|
+
* parecer clicáveis num host v4. São 91 botões aqui: carimbar a classe em cada um seria ruído que o
|
|
205
|
+
* próximo componente esqueceria de repetir.
|
|
206
|
+
*
|
|
207
|
+
* `:where()` zera a especificidade de propósito: a regra vence o UA stylesheet (autor sempre vence)
|
|
208
|
+
* mas perde de qualquer regra do host, então quem quiser outro cursor não precisa de `!important`.
|
|
209
|
+
*/
|
|
210
|
+
:where(button:not(:disabled), [role='button']:not(:disabled), summary) {
|
|
211
|
+
cursor: pointer;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Simulador de cliente. Largura fixa porque é painel auxiliar: a thread ao lado é que deve
|
|
216
|
+
* ganhar o espaço restante quando a janela encolhe.
|
|
217
|
+
*/
|
|
218
|
+
.cv-simulator-panel {
|
|
219
|
+
display: flex;
|
|
220
|
+
flex-direction: column;
|
|
221
|
+
width: 24rem;
|
|
222
|
+
flex-shrink: 0;
|
|
223
|
+
border-left: 1px solid rgb(229 231 235);
|
|
224
|
+
background: #fff;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.cv-simulator-panel__header {
|
|
228
|
+
display: flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: space-between;
|
|
231
|
+
gap: 0.5rem;
|
|
232
|
+
padding: 0.75rem 1rem;
|
|
233
|
+
border-bottom: 1px solid rgb(229 231 235);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.cv-simulator-panel__heading { min-width: 0; }
|
|
237
|
+
|
|
238
|
+
.cv-simulator-panel__title {
|
|
239
|
+
font-size: 0.875rem;
|
|
240
|
+
font-weight: 600;
|
|
241
|
+
color: rgb(17 24 39);
|
|
242
|
+
overflow: hidden;
|
|
243
|
+
text-overflow: ellipsis;
|
|
244
|
+
white-space: nowrap;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.cv-simulator-panel__subtitle {
|
|
248
|
+
font-size: 0.75rem;
|
|
249
|
+
color: rgb(156 163 175);
|
|
250
|
+
overflow: hidden;
|
|
251
|
+
text-overflow: ellipsis;
|
|
252
|
+
white-space: nowrap;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.cv-simulator-panel__actions {
|
|
256
|
+
display: flex;
|
|
257
|
+
align-items: center;
|
|
258
|
+
gap: 0.25rem;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.cv-simulator-panel__close {
|
|
262
|
+
display: inline-flex;
|
|
263
|
+
padding: 0.375rem;
|
|
264
|
+
border: 0;
|
|
265
|
+
border-radius: 0.5rem;
|
|
266
|
+
background: transparent;
|
|
267
|
+
color: rgb(156 163 175);
|
|
268
|
+
transition: color 150ms, background-color 150ms;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.cv-simulator-panel__close:hover {
|
|
272
|
+
color: rgb(55 65 81);
|
|
273
|
+
background: rgb(243 244 246);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* `min-height: 0` para o transcript rolar dentro do painel em vez de esticar o `<aside>`. */
|
|
277
|
+
.cv-simulator-panel__body { flex: 1; min-height: 0; }
|
|
278
|
+
|
|
279
|
+
.dark .cv-simulator-panel {
|
|
280
|
+
border-left-color: rgb(31 41 55);
|
|
281
|
+
background: rgb(17 24 39);
|
|
282
|
+
}
|
|
283
|
+
.dark .cv-simulator-panel__header { border-bottom-color: rgb(31 41 55); }
|
|
284
|
+
.dark .cv-simulator-panel__title { color: rgb(243 244 246); }
|
|
285
|
+
.dark .cv-simulator-panel__subtitle { color: rgb(107 114 128); }
|
|
286
|
+
.dark .cv-simulator-panel__close:hover { color: rgb(229 231 235); background: rgb(31 41 55); }
|
|
287
|
+
|
|
288
|
+
/* Painel auxiliar não cabe ao lado da thread em tela estreita: vira sobreposição de tela cheia. */
|
|
289
|
+
@media (max-width: 1023px) {
|
|
290
|
+
.cv-simulator-panel {
|
|
291
|
+
position: fixed;
|
|
292
|
+
inset: 0;
|
|
293
|
+
width: 100%;
|
|
294
|
+
z-index: 40;
|
|
295
|
+
border-left: 0;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Workspace de atendimento: a grade da tela inteira (lista · conversa · simulador).
|
|
301
|
+
*
|
|
302
|
+
* Cada coluna é um cartão sobre fundo neutro, com respiro entre elas — separação por espaço lê mais
|
|
303
|
+
* rápido que por borda. Todas as alturas presas em `min-height: 0` porque, em grid e flex, o padrão
|
|
304
|
+
* é não encolher abaixo do conteúdo: sem isso o scroll interno nunca ativa e quem rola é a página.
|
|
305
|
+
*/
|
|
306
|
+
.cv-workspace {
|
|
307
|
+
display: flex;
|
|
308
|
+
flex-direction: column;
|
|
309
|
+
height: 100%;
|
|
310
|
+
min-height: 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.cv-workspace-header {
|
|
314
|
+
display: flex;
|
|
315
|
+
align-items: center;
|
|
316
|
+
justify-content: space-between;
|
|
317
|
+
gap: 0.5rem;
|
|
318
|
+
padding: 0.75rem 1rem;
|
|
319
|
+
border-bottom: 1px solid rgb(229 231 235);
|
|
320
|
+
}
|
|
321
|
+
.dark .cv-workspace-header { border-color: rgb(51 65 85); }
|
|
322
|
+
|
|
323
|
+
.cv-workspace-header__titles { min-width: 0; }
|
|
324
|
+
.cv-workspace-header__titles h1 {
|
|
325
|
+
font-size: 1.125rem;
|
|
326
|
+
font-weight: 600;
|
|
327
|
+
overflow: hidden;
|
|
328
|
+
text-overflow: ellipsis;
|
|
329
|
+
white-space: nowrap;
|
|
330
|
+
}
|
|
331
|
+
.cv-workspace-header__titles p {
|
|
332
|
+
display: flex;
|
|
333
|
+
flex-wrap: wrap;
|
|
334
|
+
gap: 0.25rem 0.75rem;
|
|
335
|
+
font-size: 0.875rem;
|
|
336
|
+
color: rgb(107 114 128);
|
|
337
|
+
}
|
|
338
|
+
.cv-workspace-header__waiting { color: rgb(217 119 6); }
|
|
339
|
+
.dark .cv-workspace-header__waiting { color: rgb(251 191 36); }
|
|
340
|
+
|
|
341
|
+
.cv-workspace-header__actions {
|
|
342
|
+
display: flex;
|
|
343
|
+
flex-shrink: 0;
|
|
344
|
+
align-items: center;
|
|
345
|
+
gap: 0.5rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.cv-workspace-toggle {
|
|
349
|
+
display: inline-flex;
|
|
350
|
+
align-items: center;
|
|
351
|
+
gap: 0.375rem;
|
|
352
|
+
border: 1px solid rgb(229 231 235);
|
|
353
|
+
border-radius: 0.375rem;
|
|
354
|
+
padding: 0.5rem 0.75rem;
|
|
355
|
+
font-size: 0.875rem;
|
|
356
|
+
/* 44px de área de toque em mobile — abaixo disso o dedo erra o alvo. */
|
|
357
|
+
min-height: 2.75rem;
|
|
358
|
+
}
|
|
359
|
+
.cv-workspace-toggle:disabled { opacity: 0.5; }
|
|
360
|
+
.cv-workspace-toggle--on { background: rgb(37 99 235); color: #fff; border-color: rgb(37 99 235); }
|
|
361
|
+
.dark .cv-workspace-toggle { border-color: rgb(71 85 105); color: rgb(226 232 240); }
|
|
362
|
+
|
|
363
|
+
.cv-workspace-failure {
|
|
364
|
+
border-bottom: 1px solid rgb(253 230 138);
|
|
365
|
+
background: rgb(255 251 235);
|
|
366
|
+
padding: 0.5rem 1rem;
|
|
367
|
+
font-size: 0.875rem;
|
|
368
|
+
color: rgb(146 64 14);
|
|
369
|
+
}
|
|
370
|
+
.dark .cv-workspace-failure { background: rgb(69 26 3); color: rgb(253 230 138); border-color: rgb(120 53 15); }
|
|
371
|
+
|
|
372
|
+
.cv-workspace-grid {
|
|
373
|
+
display: grid;
|
|
374
|
+
flex: 1;
|
|
375
|
+
min-height: 0;
|
|
376
|
+
grid-template-columns: minmax(0, 1fr);
|
|
377
|
+
gap: 0.75rem;
|
|
378
|
+
padding: 0.75rem;
|
|
379
|
+
background: rgb(243 244 246);
|
|
380
|
+
}
|
|
381
|
+
.dark .cv-workspace-grid { background: rgb(17 24 39); }
|
|
382
|
+
|
|
383
|
+
.cv-workspace-list,
|
|
384
|
+
.cv-workspace-detail,
|
|
385
|
+
.cv-workspace-simulator {
|
|
386
|
+
display: flex;
|
|
387
|
+
flex-direction: column;
|
|
388
|
+
min-height: 0;
|
|
389
|
+
min-width: 0;
|
|
390
|
+
overflow: hidden;
|
|
391
|
+
border: 1px solid rgb(229 231 235);
|
|
392
|
+
border-radius: 0.75rem;
|
|
393
|
+
background: #fff;
|
|
394
|
+
}
|
|
395
|
+
.dark .cv-workspace-list,
|
|
396
|
+
.dark .cv-workspace-detail,
|
|
397
|
+
.dark .cv-workspace-simulator { background: rgb(31 41 55); border-color: rgb(51 65 85); }
|
|
398
|
+
|
|
399
|
+
/* Em linha, e não em coluna: o painel do simulador não tem teto de altura — empilhado ele cresce
|
|
400
|
+
com o transcript e transborda o cartão; em linha herda a altura da faixa e rola por dentro. */
|
|
401
|
+
.cv-workspace-simulator { flex-direction: row; }
|
|
402
|
+
|
|
403
|
+
/* Master/detail abaixo de 1024px: com conversa aberta, some a lista; sem ela, some o detalhe.
|
|
404
|
+
Empilhar os dois na mesma altura fixa dava duas fatias inúteis. */
|
|
405
|
+
@media (max-width: 1023px) {
|
|
406
|
+
.cv-workspace-grid[data-detail='open'] .cv-workspace-list { display: none; }
|
|
407
|
+
.cv-workspace-grid[data-detail='closed'] .cv-workspace-detail { display: none; }
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
@media (min-width: 1024px) {
|
|
411
|
+
.cv-workspace-grid { grid-template-columns: 360px minmax(0, 1fr); }
|
|
412
|
+
/* Entre `lg` e `xl` as três não cabem — sobrariam ~100px para a conversa e o texto quebraria uma
|
|
413
|
+
palavra por linha. Enquanto se testa UMA conversa, é a lista que menos importa. */
|
|
414
|
+
.cv-workspace-grid--with-simulator { grid-template-columns: minmax(0, 1fr) 24rem; }
|
|
415
|
+
.cv-workspace-grid--with-simulator .cv-workspace-list { display: none; }
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
@media (min-width: 1280px) {
|
|
419
|
+
.cv-workspace-grid--with-simulator { grid-template-columns: 320px minmax(0, 1fr) 24rem; }
|
|
420
|
+
.cv-workspace-grid--with-simulator .cv-workspace-list { display: flex; }
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.cv-workspace-pane {
|
|
424
|
+
display: flex;
|
|
425
|
+
flex-direction: column;
|
|
426
|
+
height: 100%;
|
|
427
|
+
min-height: 0;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.cv-workspace-transcript {
|
|
431
|
+
position: relative;
|
|
432
|
+
flex: 1;
|
|
433
|
+
min-height: 0;
|
|
434
|
+
overflow-y: auto;
|
|
435
|
+
padding: 0.75rem 1rem;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.cv-workspace-failure__link {
|
|
439
|
+
text-decoration: underline;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.cv-workspace-selection {
|
|
443
|
+
display: flex;
|
|
444
|
+
align-items: center;
|
|
445
|
+
justify-content: space-between;
|
|
446
|
+
gap: 0.5rem;
|
|
447
|
+
border-top: 1px solid #bfdbfe;
|
|
448
|
+
background: #eff6ff;
|
|
449
|
+
padding: 0.5rem 0.75rem;
|
|
450
|
+
font-size: 0.8125rem;
|
|
451
|
+
color: #1d4ed8;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.cv-workspace-selection__actions {
|
|
455
|
+
display: flex;
|
|
456
|
+
gap: 0.5rem;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.cv-workspace-selection__actions button {
|
|
460
|
+
min-height: 2.75rem;
|
|
461
|
+
border-radius: 0.375rem;
|
|
462
|
+
border: 1px solid #bfdbfe;
|
|
463
|
+
padding: 0 0.625rem;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.dark .cv-workspace-selection {
|
|
467
|
+
border-color: #1e40af;
|
|
468
|
+
background: rgb(23 37 84 / 40%);
|
|
469
|
+
color: #93c5fd;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.dark .cv-workspace-selection__actions button {
|
|
473
|
+
border-color: #1e40af;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.cv-workspace-notice {
|
|
477
|
+
border-top: 1px solid var(--cv-border, #e5e7eb);
|
|
478
|
+
background: #f3f4f6;
|
|
479
|
+
padding: 0.75rem 1rem;
|
|
480
|
+
text-align: center;
|
|
481
|
+
font-size: 0.875rem;
|
|
482
|
+
color: #6b7280;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.cv-workspace-load-older {
|
|
486
|
+
display: flex;
|
|
487
|
+
justify-content: center;
|
|
488
|
+
padding: 0.5rem 0;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.cv-workspace-load-older button {
|
|
492
|
+
min-height: 2.75rem;
|
|
493
|
+
border-radius: 0.375rem;
|
|
494
|
+
border: 1px solid var(--cv-border, #e5e7eb);
|
|
495
|
+
padding: 0 0.75rem;
|
|
496
|
+
font-size: 0.8125rem;
|
|
497
|
+
color: #6b7280;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.cv-workspace-load-older button:disabled {
|
|
501
|
+
opacity: 0.6;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.dark .cv-workspace-notice {
|
|
505
|
+
border-top-color: #374151;
|
|
506
|
+
background: #1f2937;
|
|
507
|
+
color: #9ca3af;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.cv-workspace-alert {
|
|
511
|
+
border-top: 1px solid rgb(254 202 202);
|
|
512
|
+
background: rgb(254 242 242);
|
|
513
|
+
padding: 0.5rem 1rem;
|
|
514
|
+
font-size: 0.875rem;
|
|
515
|
+
color: rgb(185 28 28);
|
|
516
|
+
}
|
|
517
|
+
.dark .cv-workspace-alert { background: rgb(69 10 10); color: rgb(252 165 165); border-color: rgb(127 29 29); }
|
|
518
|
+
|
|
519
|
+
.cv-workspace-filters {
|
|
520
|
+
display: flex;
|
|
521
|
+
flex-direction: column;
|
|
522
|
+
gap: 0.5rem;
|
|
523
|
+
padding: 0.75rem;
|
|
524
|
+
border-bottom: 1px solid rgb(229 231 235);
|
|
525
|
+
}
|
|
526
|
+
.dark .cv-workspace-filters { border-color: rgb(51 65 85); }
|
|
527
|
+
|
|
528
|
+
.cv-workspace-search {
|
|
529
|
+
width: 100%;
|
|
530
|
+
border: 1px solid rgb(229 231 235);
|
|
531
|
+
border-radius: 0.375rem;
|
|
532
|
+
padding: 0.5rem 0.75rem;
|
|
533
|
+
font-size: 0.875rem;
|
|
534
|
+
background: transparent;
|
|
535
|
+
}
|
|
536
|
+
.dark .cv-workspace-search { border-color: rgb(71 85 105); color: rgb(226 232 240); }
|
|
537
|
+
|
|
538
|
+
/* Linha única com rolagem, e não wrap: quebrando, a fila de janelas empurrava a categoria e a
|
|
539
|
+
lista para baixo toda vez que a coluna estreitava. */
|
|
540
|
+
.cv-workspace-chips {
|
|
541
|
+
display: flex;
|
|
542
|
+
flex-wrap: nowrap;
|
|
543
|
+
align-items: center;
|
|
544
|
+
gap: 0.375rem;
|
|
545
|
+
font-size: 0.75rem;
|
|
546
|
+
overflow-x: auto;
|
|
547
|
+
scrollbar-width: none;
|
|
548
|
+
}
|
|
549
|
+
.cv-workspace-chips::-webkit-scrollbar { display: none; }
|
|
550
|
+
.cv-workspace-chips__legend { color: rgb(107 114 128); flex-shrink: 0; }
|
|
551
|
+
.cv-workspace-chip {
|
|
552
|
+
display: flex;
|
|
553
|
+
flex-shrink: 0;
|
|
554
|
+
align-items: center;
|
|
555
|
+
gap: 0.25rem;
|
|
556
|
+
white-space: nowrap;
|
|
557
|
+
border-radius: 0.375rem;
|
|
558
|
+
padding: 0.25rem 0.5rem;
|
|
559
|
+
}
|
|
560
|
+
.cv-workspace-chip--on { background: rgb(229 231 235); }
|
|
561
|
+
.dark .cv-workspace-chip--on { background: rgb(51 65 85); }
|
|
562
|
+
|
|
563
|
+
/* A cor do próprio rótulo é o estado da janela; selecionado, o mesmo tom vira o fundo. */
|
|
564
|
+
.cv-workspace-chip--fresh { color: rgb(22 163 74); }
|
|
565
|
+
.cv-workspace-chip--warning { color: rgb(202 138 4); }
|
|
566
|
+
.cv-workspace-chip--critical { color: rgb(220 38 38); }
|
|
567
|
+
.cv-workspace-chip--expired { color: rgb(107 114 128); }
|
|
568
|
+
.cv-workspace-chip--fresh.cv-workspace-chip--on { background: rgb(220 252 231); }
|
|
569
|
+
.cv-workspace-chip--warning.cv-workspace-chip--on { background: rgb(254 249 195); }
|
|
570
|
+
.cv-workspace-chip--critical.cv-workspace-chip--on { background: rgb(254 226 226); }
|
|
571
|
+
.cv-workspace-chip--expired.cv-workspace-chip--on { background: rgb(229 231 235); }
|
|
572
|
+
.dark .cv-workspace-chip--fresh { color: rgb(74 222 128); }
|
|
573
|
+
.dark .cv-workspace-chip--warning { color: rgb(250 204 21); }
|
|
574
|
+
.dark .cv-workspace-chip--critical { color: rgb(248 113 113); }
|
|
575
|
+
.dark .cv-workspace-chip--expired { color: rgb(148 163 184); }
|
|
576
|
+
.dark .cv-workspace-chip--fresh.cv-workspace-chip--on { background: rgb(20 83 45); }
|
|
577
|
+
.dark .cv-workspace-chip--warning.cv-workspace-chip--on { background: rgb(113 63 18); }
|
|
578
|
+
.dark .cv-workspace-chip--critical.cv-workspace-chip--on { background: rgb(127 29 29); }
|
|
579
|
+
.dark .cv-workspace-chip--expired.cv-workspace-chip--on { background: rgb(51 65 85); }
|
|
580
|
+
|
|
581
|
+
.cv-workspace-selectall {
|
|
582
|
+
display: flex;
|
|
583
|
+
align-items: center;
|
|
584
|
+
gap: 0.5rem;
|
|
585
|
+
font-size: 0.75rem;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
.cv-workspace-rows { flex: 1; min-height: 0; overflow-y: auto; }
|
|
589
|
+
|
|
590
|
+
.cv-workspace-empty { padding: 1rem; font-size: 0.875rem; color: rgb(107 114 128); }
|
|
591
|
+
|
|
592
|
+
.cv-workspace-bulk {
|
|
593
|
+
display: flex;
|
|
594
|
+
flex-wrap: wrap;
|
|
595
|
+
align-items: center;
|
|
596
|
+
justify-content: space-between;
|
|
597
|
+
gap: 0.5rem;
|
|
598
|
+
padding: 0.5rem 0.75rem;
|
|
599
|
+
border-bottom: 1px solid rgb(191 219 254);
|
|
600
|
+
background: rgb(239 246 255);
|
|
601
|
+
font-size: 0.75rem;
|
|
602
|
+
}
|
|
603
|
+
.dark .cv-workspace-bulk { background: rgb(23 37 84); border-color: rgb(30 58 138); }
|
|
604
|
+
.cv-workspace-bulk__count { font-weight: 500; color: rgb(29 78 216); }
|
|
605
|
+
.dark .cv-workspace-bulk__count { color: rgb(147 197 253); }
|
|
606
|
+
.cv-workspace-bulk__actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
|
|
607
|
+
.cv-workspace-bulk__actions button {
|
|
608
|
+
border: 1px solid rgb(191 219 254);
|
|
609
|
+
border-radius: 0.375rem;
|
|
610
|
+
padding: 0.25rem 0.5rem;
|
|
611
|
+
}
|
|
612
|
+
.cv-workspace-bulk__actions button:disabled { opacity: 0.5; }
|
|
613
|
+
|
|
614
|
+
.cv-workspace-pager {
|
|
615
|
+
display: flex;
|
|
616
|
+
align-items: center;
|
|
617
|
+
justify-content: space-between;
|
|
618
|
+
gap: 0.5rem;
|
|
619
|
+
border-top: 1px solid rgb(229 231 235);
|
|
620
|
+
padding: 0.5rem 0.75rem;
|
|
621
|
+
font-size: 0.75rem;
|
|
622
|
+
color: rgb(107 114 128);
|
|
623
|
+
}
|
|
624
|
+
.dark .cv-workspace-pager { border-color: rgb(51 65 85); }
|
|
625
|
+
.cv-workspace-pager__buttons { display: flex; align-items: center; gap: 0.25rem; }
|
|
626
|
+
.cv-workspace-pager__buttons button { padding: 0 0.5rem; }
|
|
627
|
+
.cv-workspace-pager__buttons button:disabled { opacity: 0.4; }
|
|
628
|
+
|
|
629
|
+
/* Modal de template do envio em lote. Sobre a tela inteira e não dentro da coluna da lista: a
|
|
630
|
+
escolha vale para todas as conversas marcadas, e ancorado na lista parecia filtro dela. */
|
|
631
|
+
.cv-workspace-modal {
|
|
632
|
+
position: fixed;
|
|
633
|
+
inset: 0;
|
|
634
|
+
z-index: 50;
|
|
635
|
+
display: flex;
|
|
636
|
+
align-items: center;
|
|
637
|
+
justify-content: center;
|
|
638
|
+
padding: 1rem;
|
|
639
|
+
background: rgb(0 0 0 / 50%);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
.cv-workspace-modal__box {
|
|
643
|
+
display: flex;
|
|
644
|
+
width: 100%;
|
|
645
|
+
max-width: 28rem;
|
|
646
|
+
max-height: 80vh;
|
|
647
|
+
flex-direction: column;
|
|
648
|
+
overflow: hidden;
|
|
649
|
+
border-radius: 0.75rem;
|
|
650
|
+
border: 1px solid #e5e7eb;
|
|
651
|
+
background: #fff;
|
|
652
|
+
box-shadow: 0 20px 25px -5px rgb(0 0 0 / 25%);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
.cv-workspace-modal__header {
|
|
656
|
+
display: flex;
|
|
657
|
+
align-items: flex-start;
|
|
658
|
+
justify-content: space-between;
|
|
659
|
+
gap: 0.75rem;
|
|
660
|
+
border-bottom: 1px solid #e5e7eb;
|
|
661
|
+
padding: 1rem 1.25rem;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
.cv-workspace-modal__header h3 {
|
|
665
|
+
font-weight: 600;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
.cv-workspace-modal__header p {
|
|
669
|
+
margin-top: 0.125rem;
|
|
670
|
+
font-size: 0.75rem;
|
|
671
|
+
color: #6b7280;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
.cv-workspace-modal__search {
|
|
675
|
+
border-bottom: 1px solid #f3f4f6;
|
|
676
|
+
padding: 0.75rem 1rem;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.cv-workspace-modal__search input {
|
|
680
|
+
width: 100%;
|
|
681
|
+
border-radius: 0.5rem;
|
|
682
|
+
border: 1px solid #e5e7eb;
|
|
683
|
+
padding: 0.5rem 0.75rem;
|
|
684
|
+
font-size: 0.875rem;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
.cv-workspace-modal__list {
|
|
688
|
+
flex: 1;
|
|
689
|
+
overflow-y: auto;
|
|
690
|
+
padding: 0.5rem;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.cv-workspace-modal__item {
|
|
694
|
+
display: flex;
|
|
695
|
+
width: 100%;
|
|
696
|
+
flex-direction: column;
|
|
697
|
+
gap: 0.125rem;
|
|
698
|
+
border: 1px solid transparent;
|
|
699
|
+
border-radius: 0.5rem;
|
|
700
|
+
padding: 0.625rem 0.75rem;
|
|
701
|
+
text-align: left;
|
|
702
|
+
font-size: 0.875rem;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.cv-workspace-modal__item:hover {
|
|
706
|
+
background: #f9fafb;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
.cv-workspace-modal__item--on {
|
|
710
|
+
border-color: #bfdbfe;
|
|
711
|
+
background: #eff6ff;
|
|
712
|
+
color: #1d4ed8;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
.cv-workspace-modal__item-name {
|
|
716
|
+
overflow: hidden;
|
|
717
|
+
text-overflow: ellipsis;
|
|
718
|
+
white-space: nowrap;
|
|
719
|
+
font-weight: 500;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
.cv-workspace-modal__item-meta {
|
|
723
|
+
font-size: 0.75rem;
|
|
724
|
+
color: #9ca3af;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
.cv-workspace-modal__warning {
|
|
728
|
+
border-top: 1px solid #fde68a;
|
|
729
|
+
background: #fffbeb;
|
|
730
|
+
padding: 0.5rem 1rem;
|
|
731
|
+
font-size: 0.75rem;
|
|
732
|
+
color: #b45309;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
.cv-workspace-modal__footer {
|
|
736
|
+
display: flex;
|
|
737
|
+
justify-content: flex-end;
|
|
738
|
+
gap: 0.5rem;
|
|
739
|
+
border-top: 1px solid #e5e7eb;
|
|
740
|
+
padding: 0.75rem 1rem;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
.cv-workspace-modal__footer button {
|
|
744
|
+
min-height: 2.75rem;
|
|
745
|
+
border-radius: 0.5rem;
|
|
746
|
+
border: 1px solid #e5e7eb;
|
|
747
|
+
padding: 0 0.875rem;
|
|
748
|
+
font-size: 0.875rem;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
.cv-workspace-modal__footer button:last-child {
|
|
752
|
+
border-color: transparent;
|
|
753
|
+
background: #2563eb;
|
|
754
|
+
color: #fff;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
.cv-workspace-modal__footer button:disabled {
|
|
758
|
+
opacity: 0.5;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
.dark .cv-workspace-modal__box {
|
|
762
|
+
border-color: #374151;
|
|
763
|
+
background: #1f2937;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
.dark .cv-workspace-modal__header,
|
|
767
|
+
.dark .cv-workspace-modal__footer {
|
|
768
|
+
border-color: #374151;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.dark .cv-workspace-modal__search {
|
|
772
|
+
border-color: #374151;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
.dark .cv-workspace-modal__search input {
|
|
776
|
+
border-color: #4b5563;
|
|
777
|
+
background: #374151;
|
|
778
|
+
color: #f3f4f6;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
.dark .cv-workspace-modal__item:hover {
|
|
782
|
+
background: rgb(55 65 81 / 50%);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
.dark .cv-workspace-modal__item--on {
|
|
786
|
+
border-color: #1e40af;
|
|
787
|
+
background: rgb(23 37 84 / 40%);
|
|
788
|
+
color: #93c5fd;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
.dark .cv-workspace-modal__warning {
|
|
792
|
+
border-color: #92400e;
|
|
793
|
+
background: rgb(69 26 3 / 40%);
|
|
794
|
+
color: #fbbf24;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
.dark .cv-workspace-modal__footer button {
|
|
798
|
+
border-color: #4b5563;
|
|
799
|
+
color: #f3f4f6;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/* Fila de anexos acima da barra: nomes visíveis para conferir antes de mandar, e um X por item —
|
|
803
|
+
escolher seis arquivos e não poder tirar o errado obrigava a recomeçar. */
|
|
804
|
+
.cv-workspace-attachments {
|
|
805
|
+
display: flex;
|
|
806
|
+
flex-wrap: wrap;
|
|
807
|
+
gap: 0.5rem;
|
|
808
|
+
margin: 0 0 0.5rem;
|
|
809
|
+
padding: 0;
|
|
810
|
+
list-style: none;
|
|
811
|
+
}
|
|
812
|
+
.cv-workspace-attachments li {
|
|
813
|
+
display: flex;
|
|
814
|
+
align-items: center;
|
|
815
|
+
gap: 0.5rem;
|
|
816
|
+
max-width: 14rem;
|
|
817
|
+
padding: 0.25rem 0.5rem;
|
|
818
|
+
border: 1px solid rgb(226 232 240);
|
|
819
|
+
border-radius: 0.5rem;
|
|
820
|
+
font-size: 0.75rem;
|
|
821
|
+
}
|
|
822
|
+
.cv-workspace-attachments li span {
|
|
823
|
+
overflow: hidden;
|
|
824
|
+
text-overflow: ellipsis;
|
|
825
|
+
white-space: nowrap;
|
|
826
|
+
}
|
|
827
|
+
.cv-workspace-attachments li button {
|
|
828
|
+
flex: none;
|
|
829
|
+
min-width: 1.5rem;
|
|
830
|
+
min-height: 1.5rem;
|
|
831
|
+
cursor: pointer;
|
|
832
|
+
background: none;
|
|
833
|
+
border: 0;
|
|
834
|
+
color: inherit;
|
|
835
|
+
}
|
|
836
|
+
.dark .cv-workspace-attachments li {
|
|
837
|
+
border-color: rgb(51 65 85);
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/* Item da fila com miniatura, estado de envio (QR-47) e saída com transição curta. */
|
|
841
|
+
.cv-attachment-item {
|
|
842
|
+
max-width: 16rem;
|
|
843
|
+
}
|
|
844
|
+
.cv-attachment-item__thumbnail {
|
|
845
|
+
display: block;
|
|
846
|
+
flex: none;
|
|
847
|
+
width: 2rem;
|
|
848
|
+
height: 2rem;
|
|
849
|
+
overflow: hidden;
|
|
850
|
+
border-radius: 0.375rem;
|
|
851
|
+
background: rgb(226 232 240);
|
|
852
|
+
}
|
|
853
|
+
.dark .cv-attachment-item__thumbnail { background: rgb(51 65 85); }
|
|
854
|
+
.cv-attachment-item__thumbnail img { width: 100%; height: 100%; object-fit: cover; }
|
|
855
|
+
.cv-attachment-item__info {
|
|
856
|
+
display: flex;
|
|
857
|
+
flex-direction: column;
|
|
858
|
+
overflow: hidden;
|
|
859
|
+
min-width: 0;
|
|
860
|
+
}
|
|
861
|
+
.cv-attachment-item__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
|
|
862
|
+
.cv-attachment-item__meta { font-size: 0.6875rem; color: rgb(100 116 139); }
|
|
863
|
+
.dark .cv-attachment-item__meta { color: rgb(148 163 184); }
|
|
864
|
+
.cv-attachment-item--failed .cv-attachment-item__meta { color: rgb(220 38 38); }
|
|
865
|
+
.dark .cv-attachment-item--failed .cv-attachment-item__meta { color: rgb(248 113 113); }
|
|
866
|
+
.cv-attachment-item--sent .cv-attachment-item__meta { color: rgb(22 163 74); }
|
|
867
|
+
.dark .cv-attachment-item--sent .cv-attachment-item__meta { color: rgb(74 222 128); }
|
|
868
|
+
.cv-attachment-item--skipped .cv-attachment-item__meta { color: rgb(180 83 9); }
|
|
869
|
+
.dark .cv-attachment-item--skipped .cv-attachment-item__meta { color: rgb(251 191 36); }
|
|
870
|
+
.cv-attachment-item__retry {
|
|
871
|
+
flex: none;
|
|
872
|
+
border: 0;
|
|
873
|
+
background: none;
|
|
874
|
+
padding: 0;
|
|
875
|
+
font-size: 0.6875rem;
|
|
876
|
+
text-decoration: underline;
|
|
877
|
+
color: rgb(37 99 235);
|
|
878
|
+
cursor: pointer;
|
|
879
|
+
}
|
|
880
|
+
.cv-attachment-item {
|
|
881
|
+
transition: opacity 200ms ease, transform 200ms ease;
|
|
882
|
+
opacity: 1;
|
|
883
|
+
transform: scale(1);
|
|
884
|
+
}
|
|
885
|
+
.cv-attachment-item--departing {
|
|
886
|
+
opacity: 0;
|
|
887
|
+
transform: scale(0.92);
|
|
888
|
+
}
|
|
889
|
+
@media (prefers-reduced-motion: reduce) {
|
|
890
|
+
.cv-attachment-item { transition: none; }
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/* Esqueleto de linha — usado no painel de mensagens prontas e na tabela de cadastro (QR-47): nunca
|
|
894
|
+
"Carregando…" solto, e o conteúdo nunca aparece de uma vez. */
|
|
895
|
+
.cv-skeleton-line {
|
|
896
|
+
border-radius: 0.25rem;
|
|
897
|
+
background: linear-gradient(90deg, rgb(226 232 240) 25%, rgb(241 245 249) 50%, rgb(226 232 240) 75%);
|
|
898
|
+
background-size: 200% 100%;
|
|
899
|
+
animation: cv-skeleton-shimmer 1.4s ease-in-out infinite;
|
|
900
|
+
}
|
|
901
|
+
.dark .cv-skeleton-line {
|
|
902
|
+
background: linear-gradient(90deg, rgb(51 65 85) 25%, rgb(71 85 105) 50%, rgb(51 65 85) 75%);
|
|
903
|
+
background-size: 200% 100%;
|
|
904
|
+
}
|
|
905
|
+
@keyframes cv-skeleton-shimmer {
|
|
906
|
+
0% { background-position: 200% 0; }
|
|
907
|
+
100% { background-position: -200% 0; }
|
|
908
|
+
}
|
|
909
|
+
@media (prefers-reduced-motion: reduce) {
|
|
910
|
+
.cv-skeleton-line { animation: none; }
|
|
911
|
+
}
|
|
912
|
+
/* Larguras da linha de esqueleto da tabela de mensagens prontas: uma por coluna, porque colunas
|
|
913
|
+
diferentes leem melhor com proporções diferentes em vez de todas do mesmo tamanho. */
|
|
914
|
+
.cv-skeleton-line--title { width: 70%; height: 0.75rem; }
|
|
915
|
+
.cv-skeleton-line--shortcut { width: 50%; height: 0.75rem; }
|
|
916
|
+
.cv-skeleton-line--body { width: 90%; height: 0.75rem; }
|
|
917
|
+
|
|
918
|
+
/* Linha excluída sai com transição curta em vez de sumir de repente (QR-47). */
|
|
919
|
+
.cv-row-departing {
|
|
920
|
+
transition: opacity 200ms ease;
|
|
921
|
+
opacity: 0;
|
|
922
|
+
}
|
|
923
|
+
@media (prefers-reduced-motion: reduce) {
|
|
924
|
+
.cv-row-departing { transition: none; }
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
/* Peças de listagem (documentos, mensagens): tabela com filtros, seleção em lote e paginação. */
|
|
928
|
+
.cv-filter-count {
|
|
929
|
+
display: inline-flex;
|
|
930
|
+
align-items: center;
|
|
931
|
+
justify-content: center;
|
|
932
|
+
min-width: 1rem;
|
|
933
|
+
height: 1rem;
|
|
934
|
+
padding: 0 0.25rem;
|
|
935
|
+
border-radius: 9999px;
|
|
936
|
+
background: rgb(37 99 235);
|
|
937
|
+
color: white;
|
|
938
|
+
font-size: 0.625rem;
|
|
939
|
+
font-weight: 600;
|
|
940
|
+
}
|
|
941
|
+
.cv-filter-menu {
|
|
942
|
+
position: absolute;
|
|
943
|
+
top: 100%;
|
|
944
|
+
left: 0;
|
|
945
|
+
z-index: 20;
|
|
946
|
+
margin-top: 0.25rem;
|
|
947
|
+
min-width: 12rem;
|
|
948
|
+
padding: 0.5rem;
|
|
949
|
+
border: 1px solid rgb(226 232 240);
|
|
950
|
+
border-radius: 0.5rem;
|
|
951
|
+
background: white;
|
|
952
|
+
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
|
|
953
|
+
}
|
|
954
|
+
.dark .cv-filter-menu { background: rgb(30 41 59); border-color: rgb(71 85 105); }
|
|
955
|
+
.cv-filter-option {
|
|
956
|
+
display: flex;
|
|
957
|
+
align-items: center;
|
|
958
|
+
gap: 0.5rem;
|
|
959
|
+
padding: 0.375rem 0.5rem;
|
|
960
|
+
border-radius: 0.375rem;
|
|
961
|
+
font-size: 0.75rem;
|
|
962
|
+
cursor: pointer;
|
|
963
|
+
}
|
|
964
|
+
.cv-filter-option:hover { background: rgb(241 245 249); }
|
|
965
|
+
.dark .cv-filter-option:hover { background: rgb(51 65 85); }
|
|
966
|
+
.cv-bulk-bar {
|
|
967
|
+
display: flex;
|
|
968
|
+
flex-wrap: wrap;
|
|
969
|
+
align-items: center;
|
|
970
|
+
gap: 0.5rem;
|
|
971
|
+
padding: 0.5rem 0.75rem;
|
|
972
|
+
border: 1px solid rgb(191 219 254);
|
|
973
|
+
border-radius: 0.5rem;
|
|
974
|
+
background: rgb(239 246 255);
|
|
975
|
+
}
|
|
976
|
+
.dark .cv-bulk-bar { background: rgb(30 58 138 / 0.25); border-color: rgb(30 64 175); }
|
|
977
|
+
.cv-listing-pagination {
|
|
978
|
+
display: flex;
|
|
979
|
+
flex-wrap: wrap;
|
|
980
|
+
align-items: center;
|
|
981
|
+
justify-content: space-between;
|
|
982
|
+
gap: 0.5rem;
|
|
983
|
+
padding-top: 0.5rem;
|
|
984
|
+
border-top: 1px solid rgb(241 245 249);
|
|
985
|
+
}
|
|
986
|
+
.dark .cv-listing-pagination { border-color: rgb(30 41 59); }
|
|
987
|
+
.cv-listing-perpage {
|
|
988
|
+
height: 2rem;
|
|
989
|
+
padding: 0 0.5rem;
|
|
990
|
+
border: 1px solid rgb(226 232 240);
|
|
991
|
+
border-radius: 0.375rem;
|
|
992
|
+
background: transparent;
|
|
993
|
+
font-size: 0.75rem;
|
|
994
|
+
}
|
|
995
|
+
.dark .cv-listing-perpage { border-color: rgb(71 85 105); }
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* Cor padrão de borda para as classes `border` sem cor ao lado.
|
|
999
|
+
*
|
|
1000
|
+
* O Tailwind v4 trocou o padrão de `gray-200` por `currentColor`, e os componentes daqui foram
|
|
1001
|
+
* escritos no v3. Em produto que traz a base do shadcn nada aparece — ela já redefine isto; em
|
|
1002
|
+
* produto sem shadcn, cada `border` sai na cor do texto, e a tabela de documentos vinha com régua
|
|
1003
|
+
* azul-quase-preta em vez de cinza. `:where()` zera a especificidade do seletor, então qualquer
|
|
1004
|
+
* `border-*` do host ou daqui continua ganhando por especificidade — sem depender da camada
|
|
1005
|
+
* `base` do Tailwind, que quebra o build de host que importa este arquivo fora do pipeline do
|
|
1006
|
+
* Tailwind (erro do postcss: "`@layer base` is used but no matching `@tailwind base` directive").
|
|
1007
|
+
*/
|
|
1008
|
+
:root { --cv-border-color: rgb(229 231 235); }
|
|
1009
|
+
.dark { --cv-border-color: rgb(51 65 85); }
|
|
1010
|
+
|
|
1011
|
+
:where(*, ::before, ::after, ::backdrop, ::file-selector-button) {
|
|
1012
|
+
border-color: var(--cv-border-color);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/* Tabela de listagem: a moldura, o cabeçalho e a zebra que `web.md` §7 exige, no stylesheet pelo
|
|
1016
|
+
mesmo motivo do resto — host que não varre `node_modules` com `@source` não compila utilitário
|
|
1017
|
+
nenhum do pacote, e a tabela sairia crua. */
|
|
1018
|
+
.cv-table-card {
|
|
1019
|
+
overflow-x: auto;
|
|
1020
|
+
border: 1px solid rgb(229 231 235);
|
|
1021
|
+
border-radius: 0.75rem;
|
|
1022
|
+
background: #fff;
|
|
1023
|
+
}
|
|
1024
|
+
.dark .cv-table-card { border-color: rgb(51 65 85); background: rgb(17 24 39); }
|
|
1025
|
+
|
|
1026
|
+
/* `collapse` porque a régua de baixo mora no `tr`: com o `separate` padrão o navegador ignora borda
|
|
1027
|
+
de linha e a tabela ficava sem separação nenhuma entre os registros. */
|
|
1028
|
+
.cv-table {
|
|
1029
|
+
width: 100%;
|
|
1030
|
+
border-collapse: collapse;
|
|
1031
|
+
font-size: 0.875rem;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
.cv-table thead {
|
|
1035
|
+
background: rgb(248 250 252);
|
|
1036
|
+
color: rgb(100 116 139);
|
|
1037
|
+
}
|
|
1038
|
+
.dark .cv-table thead { background: rgb(30 41 59 / 60%); color: rgb(148 163 184); }
|
|
1039
|
+
|
|
1040
|
+
.cv-table thead th {
|
|
1041
|
+
border-bottom: 1px solid rgb(226 232 240);
|
|
1042
|
+
white-space: nowrap;
|
|
1043
|
+
}
|
|
1044
|
+
.dark .cv-table thead th { border-bottom-color: rgb(51 65 85); }
|
|
1045
|
+
|
|
1046
|
+
.cv-table tbody tr { border-bottom: 1px solid rgb(241 245 249); }
|
|
1047
|
+
.dark .cv-table tbody tr { border-bottom-color: rgb(30 41 59); }
|
|
1048
|
+
.cv-table tbody tr:last-child { border-bottom: 0; }
|
|
1049
|
+
|
|
1050
|
+
/* A alternada é o que leva o olho do nome do arquivo até a coluna de ações; em tela larga a régua
|
|
1051
|
+
sozinha não segura a linha. */
|
|
1052
|
+
.cv-table tbody tr:nth-child(even) { background: rgb(248 250 252 / 70%); }
|
|
1053
|
+
.dark .cv-table tbody tr:nth-child(even) { background: rgb(30 41 59 / 35%); }
|
|
1054
|
+
|
|
1055
|
+
.cv-table tbody tr:hover { background: rgb(239 246 255); }
|
|
1056
|
+
.dark .cv-table tbody tr:hover { background: rgb(30 58 138 / 25%); }
|
|
1057
|
+
|
|
1058
|
+
/* Extensão do arquivo como etiqueta: `PDF` e `DOCX` têm larguras parecidas e a coluna para de dançar
|
|
1059
|
+
a cada linha, o que o MIME cru não permitia. */
|
|
1060
|
+
.cv-type-tag {
|
|
1061
|
+
display: inline-block;
|
|
1062
|
+
border-radius: 0.25rem;
|
|
1063
|
+
background: rgb(241 245 249);
|
|
1064
|
+
padding: 0.125rem 0.375rem;
|
|
1065
|
+
font-size: 0.6875rem;
|
|
1066
|
+
font-weight: 600;
|
|
1067
|
+
letter-spacing: 0.02em;
|
|
1068
|
+
color: rgb(71 85 105);
|
|
1069
|
+
}
|
|
1070
|
+
.dark .cv-type-tag { background: rgb(51 65 85); color: rgb(203 213 225); }
|
|
1071
|
+
|
|
1072
|
+
/* Dica de ação (ver `Tooltip.tsx`). Impressa em `document.body`, então a posição é da janela e o
|
|
1073
|
+
`z-index` fica acima de qualquer painel do produto. */
|
|
1074
|
+
.cv-tooltip {
|
|
1075
|
+
position: fixed;
|
|
1076
|
+
z-index: 9999;
|
|
1077
|
+
max-width: min(16rem, 90vw);
|
|
1078
|
+
transform: translate(-50%, -100%);
|
|
1079
|
+
border-radius: 0.375rem;
|
|
1080
|
+
background: rgb(17 24 39 / 95%);
|
|
1081
|
+
padding: 0.3125rem 0.5rem;
|
|
1082
|
+
font-size: 0.75rem;
|
|
1083
|
+
line-height: 1.2;
|
|
1084
|
+
color: #fff;
|
|
1085
|
+
text-align: center;
|
|
1086
|
+
box-shadow: 0 4px 12px rgb(0 0 0 / 18%);
|
|
1087
|
+
pointer-events: none;
|
|
1088
|
+
animation: cv-tooltip-in 90ms ease-out;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
.cv-tooltip--bottom {
|
|
1092
|
+
transform: translate(-50%, 0);
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
.dark .cv-tooltip {
|
|
1096
|
+
background: rgb(243 244 246 / 96%);
|
|
1097
|
+
color: rgb(17 24 39);
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
@keyframes cv-tooltip-in {
|
|
1101
|
+
from { opacity: 0; }
|
|
1102
|
+
to { opacity: 1; }
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1106
|
+
.cv-tooltip { animation: none; }
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
/* Barra de composição: fundo neutro para separar da conversa e para os atalhos e o campo de texto
|
|
1110
|
+
terem contraste próprio. Sobre branco, régua branca e campo cinza-claro se confundiam num bloco
|
|
1111
|
+
só, sem hierarquia. */
|
|
1112
|
+
.cv-composer-bar {
|
|
1113
|
+
border-top: 1px solid rgb(229 231 235);
|
|
1114
|
+
background: rgb(240 242 245);
|
|
1115
|
+
padding: 0.625rem 0.75rem;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
.dark .cv-composer-bar {
|
|
1119
|
+
border-top-color: rgb(51 65 85);
|
|
1120
|
+
background: rgb(17 24 39);
|
|
1121
|
+
}
|