@consilioweb/payload-support 0.6.2 → 0.6.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 (65) hide show
  1. package/dist/components/TicketConversation/components/AISummaryPanel.cjs +77 -0
  2. package/dist/components/TicketConversation/components/AISummaryPanel.js +76 -0
  3. package/dist/components/TicketConversation/components/ActionPanels.cjs +121 -0
  4. package/dist/components/TicketConversation/components/ActionPanels.js +118 -0
  5. package/dist/components/TicketConversation/components/ActivityLog.cjs +24 -0
  6. package/dist/components/TicketConversation/components/ActivityLog.js +23 -0
  7. package/dist/components/TicketConversation/components/ClientBar.cjs +43 -0
  8. package/dist/components/TicketConversation/components/ClientBar.js +42 -0
  9. package/dist/components/TicketConversation/components/ClientHistory.cjs +138 -0
  10. package/dist/components/TicketConversation/components/ClientHistory.js +137 -0
  11. package/dist/components/TicketConversation/components/CodeBlock.cjs +154 -0
  12. package/dist/components/TicketConversation/components/CodeBlock.js +152 -0
  13. package/dist/components/TicketConversation/components/CodeBlockInserter.cjs +156 -0
  14. package/dist/components/TicketConversation/components/CodeBlockInserter.js +155 -0
  15. package/dist/components/TicketConversation/components/QuickActions.cjs +66 -0
  16. package/dist/components/TicketConversation/components/QuickActions.js +65 -0
  17. package/dist/components/TicketConversation/components/TicketHeader.cjs +93 -0
  18. package/dist/components/TicketConversation/components/TicketHeader.js +92 -0
  19. package/dist/components/TicketConversation/components/TimeTrackingPanel.cjs +134 -0
  20. package/dist/components/TicketConversation/components/TimeTrackingPanel.js +133 -0
  21. package/dist/components/TicketConversation/config.cjs +44 -0
  22. package/dist/components/TicketConversation/config.js +41 -0
  23. package/dist/components/TicketConversation/constants.cjs +100 -0
  24. package/dist/components/TicketConversation/constants.js +96 -0
  25. package/dist/components/TicketConversation/context.cjs +13 -0
  26. package/dist/components/TicketConversation/context.js +11 -0
  27. package/dist/components/TicketConversation/hooks/useAI.cjs +177 -0
  28. package/dist/components/TicketConversation/hooks/useAI.js +176 -0
  29. package/dist/components/TicketConversation/hooks/useMessageActions.cjs +136 -0
  30. package/dist/components/TicketConversation/hooks/useMessageActions.js +135 -0
  31. package/dist/components/TicketConversation/hooks/useReply.cjs +188 -0
  32. package/dist/components/TicketConversation/hooks/useReply.js +187 -0
  33. package/dist/components/TicketConversation/hooks/useTicketActions.cjs +231 -0
  34. package/dist/components/TicketConversation/hooks/useTicketActions.js +230 -0
  35. package/dist/components/TicketConversation/hooks/useTimeTracking.cjs +123 -0
  36. package/dist/components/TicketConversation/hooks/useTimeTracking.js +122 -0
  37. package/dist/components/TicketConversation/hooks/useTranslation.cjs +78 -0
  38. package/dist/components/TicketConversation/hooks/useTranslation.js +70 -0
  39. package/dist/components/TicketConversation/index.cjs +1128 -0
  40. package/dist/components/TicketConversation/index.js +1123 -0
  41. package/dist/components/TicketConversation/locales/en.json +878 -0
  42. package/dist/components/TicketConversation/locales/fr.json +878 -0
  43. package/dist/components/TicketConversation/types.cjs +2 -0
  44. package/dist/components/TicketConversation/types.js +2 -0
  45. package/dist/components/TicketConversation/utils.cjs +27 -0
  46. package/dist/components/TicketConversation/utils.js +25 -0
  47. package/dist/styles/BillingView.module.scss +311 -0
  48. package/dist/styles/ChatView.module.scss +438 -0
  49. package/dist/styles/CommandPalette.module.scss +160 -0
  50. package/dist/styles/CrmView.module.scss +554 -0
  51. package/dist/styles/EmailTracking.module.scss +238 -0
  52. package/dist/styles/ImportConversation.module.scss +267 -0
  53. package/dist/styles/Layout.module.scss +55 -0
  54. package/dist/styles/Logs.module.scss +164 -0
  55. package/dist/styles/NewTicket.module.scss +143 -0
  56. package/dist/styles/PendingEmails.module.scss +629 -0
  57. package/dist/styles/SupportDashboard.module.scss +649 -0
  58. package/dist/styles/TicketDetail.module.scss +1050 -0
  59. package/dist/styles/TicketInbox.module.scss +296 -0
  60. package/dist/styles/TicketingSettings.module.scss +358 -0
  61. package/dist/styles/TimeDashboard.module.scss +287 -0
  62. package/dist/styles/_tokens.scss +78 -0
  63. package/dist/{components/TicketConversation.css → styles/theme.css} +326 -13
  64. package/package.json +2 -2
  65. package/dist/components/TicketConversation.js +0 -3004
@@ -0,0 +1,1050 @@
1
+ // TicketDetail — Premium helpdesk UI inspired by HelpScout/Linear 2026
2
+ // Uses Payload CMS CSS variables for dark mode compatibility
3
+
4
+ .page {
5
+ max-width: 1920px;
6
+ margin: 0 auto;
7
+ padding: 0 24px 60px;
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', system-ui, sans-serif;
9
+ }
10
+
11
+ // ─── TOP BAR ───
12
+ .topBar {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 14px;
16
+ padding: 16px 0 14px;
17
+ border-bottom: 1px solid var(--theme-elevation-150, #f1f5f9);
18
+ margin-bottom: 20px;
19
+ }
20
+
21
+ .backLink {
22
+ color: var(--theme-elevation-500);
23
+ text-decoration: none;
24
+ font-size: 22px;
25
+ line-height: 1;
26
+ display: flex;
27
+ align-items: center;
28
+ transition: color 100ms;
29
+ &:hover { color: var(--theme-text); }
30
+ }
31
+
32
+ .ticketMeta {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 2px;
36
+ flex: 1;
37
+ min-width: 0;
38
+ }
39
+
40
+ .ticketNumber {
41
+ font-size: 12px;
42
+ font-weight: 500;
43
+ color: var(--theme-elevation-500);
44
+ font-family: 'SF Mono', 'Fira Code', 'JetBrains Mono', 'Cascadia Code', monospace;
45
+ letter-spacing: 0.02em;
46
+ }
47
+
48
+ .ticketSubject {
49
+ font-size: 18px;
50
+ font-weight: 700;
51
+ color: var(--theme-text);
52
+ overflow: hidden;
53
+ text-overflow: ellipsis;
54
+ white-space: nowrap;
55
+ line-height: 1.3;
56
+ }
57
+
58
+ .topBarRight {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 10px;
62
+ flex-shrink: 0;
63
+ }
64
+
65
+ .statusChip {
66
+ padding: 5px 28px 5px 14px;
67
+ border-radius: 20px;
68
+ font-size: 12px;
69
+ font-weight: 700;
70
+ border: 1px solid transparent;
71
+ cursor: pointer;
72
+ transition: all 100ms;
73
+ appearance: none;
74
+ -webkit-appearance: none;
75
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'></polyline></svg>");
76
+ background-repeat: no-repeat;
77
+ background-position: right 10px center;
78
+
79
+ &:hover {
80
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08);
81
+ }
82
+ }
83
+
84
+ .sentimentBadge {
85
+ font-size: 12px;
86
+ font-weight: 600;
87
+ display: inline-flex;
88
+ align-items: center;
89
+ gap: 4px;
90
+ padding: 4px 10px;
91
+ border-radius: 20px;
92
+ }
93
+
94
+ .moreBtn {
95
+ width: 36px;
96
+ height: 36px;
97
+ border-radius: 8px;
98
+ border: 1px solid var(--theme-elevation-200);
99
+ background: none;
100
+ cursor: pointer;
101
+ font-size: 18px;
102
+ color: var(--theme-elevation-500);
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ transition: all 100ms;
107
+ &:hover { background: var(--theme-elevation-100); color: var(--theme-text); }
108
+ }
109
+
110
+ // ─── LAYOUT ───
111
+ .layout {
112
+ display: grid;
113
+ grid-template-columns: 1fr 300px;
114
+ gap: 24px;
115
+ align-items: start;
116
+ @media (max-width: 1060px) { grid-template-columns: 1fr; }
117
+ }
118
+
119
+ .conversationCol {
120
+ min-width: 0;
121
+ }
122
+
123
+ .sidebar {
124
+ border: 1px solid var(--theme-elevation-150, #f1f5f9);
125
+ border-radius: 12px;
126
+ overflow: hidden;
127
+ position: sticky;
128
+ top: 72px;
129
+ @media (max-width: 1060px) { position: static; }
130
+ }
131
+
132
+ // ─── SIDEBAR SECTIONS ───
133
+ .sideSection {
134
+ padding: 16px;
135
+ border-bottom: 1px solid var(--theme-elevation-150, #f1f5f9);
136
+ &:last-child { border-bottom: none; }
137
+ }
138
+
139
+ .sideSectionTitle {
140
+ font-size: 10px;
141
+ font-weight: 700;
142
+ text-transform: uppercase;
143
+ letter-spacing: 0.06em;
144
+ color: var(--theme-elevation-500);
145
+ margin: 0 0 12px;
146
+ display: flex;
147
+ justify-content: space-between;
148
+ align-items: center;
149
+ }
150
+
151
+ .sideField {
152
+ display: flex;
153
+ justify-content: space-between;
154
+ align-items: center;
155
+ padding: 4px 0;
156
+ font-size: 13px;
157
+ }
158
+
159
+ .sideLabel { color: var(--theme-elevation-500); font-weight: 500; }
160
+ .sideValue { color: var(--theme-text); font-weight: 600; }
161
+
162
+ // Inline select for sidebar editable fields (#1)
163
+ .sideSelect {
164
+ padding: 2px 6px;
165
+ border-radius: 6px;
166
+ border: 1px solid transparent;
167
+ background: none;
168
+ font-size: 13px;
169
+ font-weight: 600;
170
+ color: var(--theme-text);
171
+ cursor: pointer;
172
+ transition: all 100ms;
173
+ text-align: right;
174
+ max-width: 140px;
175
+
176
+ &:hover { border-color: var(--theme-elevation-200); background: var(--theme-elevation-50); }
177
+ &:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.12); }
178
+ }
179
+
180
+ // Client card
181
+ .clientCard {
182
+ display: flex;
183
+ align-items: center;
184
+ gap: 12px;
185
+ }
186
+
187
+ .clientAvatar {
188
+ width: 40px;
189
+ height: 40px;
190
+ border-radius: 50%;
191
+ background: linear-gradient(135deg, #e0e7ff, #c7d2fe);
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ font-size: 14px;
196
+ font-weight: 700;
197
+ color: #4338ca;
198
+ flex-shrink: 0;
199
+ }
200
+
201
+ .clientInfo { flex: 1; min-width: 0; }
202
+ .clientName { font-size: 14px; font-weight: 700; color: var(--theme-text); }
203
+ .clientCompany { font-size: 12px; color: var(--theme-elevation-500); margin-top: 1px; }
204
+
205
+ .clientEmail {
206
+ font-size: 12px;
207
+ color: #2563eb;
208
+ text-decoration: none;
209
+ margin-top: 2px;
210
+ display: block;
211
+ &:hover { text-decoration: underline; }
212
+ }
213
+
214
+ .clientActions {
215
+ display: flex;
216
+ gap: 6px;
217
+ margin-top: 10px;
218
+ }
219
+
220
+ .smallBtn {
221
+ padding: 5px 12px;
222
+ border-radius: 6px;
223
+ border: 1px solid var(--theme-elevation-200);
224
+ background: none;
225
+ font-size: 11px;
226
+ font-weight: 600;
227
+ color: var(--theme-elevation-500);
228
+ cursor: pointer;
229
+ text-decoration: none;
230
+ transition: all 100ms;
231
+ &:hover { background: var(--theme-elevation-100); color: var(--theme-text); }
232
+ }
233
+
234
+ // ─── MESSAGES ───
235
+ .thread {
236
+ display: flex;
237
+ flex-direction: column;
238
+ gap: 0;
239
+ margin-bottom: 12px;
240
+ }
241
+
242
+ .dateSeparator {
243
+ display: flex;
244
+ align-items: center;
245
+ gap: 16px;
246
+ padding: 12px 0 6px;
247
+ &::before, &::after {
248
+ content: '';
249
+ flex: 1;
250
+ height: 1px;
251
+ background: var(--theme-elevation-150, #f1f5f9);
252
+ }
253
+ }
254
+
255
+ .dateSeparatorText {
256
+ font-size: 11px;
257
+ font-weight: 600;
258
+ color: var(--theme-elevation-500);
259
+ white-space: nowrap;
260
+ padding: 3px 12px;
261
+ background: var(--theme-elevation-50);
262
+ border-radius: 10px;
263
+ }
264
+
265
+ // #4 — Message separation
266
+ .message + .message {
267
+ border-top: 1px solid var(--theme-elevation-100);
268
+ }
269
+
270
+ .message {
271
+ display: flex;
272
+ gap: 12px;
273
+ padding: 14px 12px;
274
+ border-radius: 10px;
275
+ position: relative;
276
+ transition: background 80ms;
277
+
278
+ &:hover { background: var(--theme-elevation-50); }
279
+ }
280
+
281
+ .messageInternal {
282
+ background: #fefce8;
283
+ border-left: 3px dashed #d97706;
284
+ &:hover { background: #fef9c3; }
285
+ }
286
+
287
+ .avatar {
288
+ flex-shrink: 0;
289
+ width: 32px;
290
+ height: 32px;
291
+ border-radius: 50%;
292
+ display: flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ font-size: 11px;
296
+ font-weight: 700;
297
+ color: #fff;
298
+ margin-top: 2px;
299
+ }
300
+
301
+ .messageContent { flex: 1; min-width: 0; }
302
+
303
+ .messageHeader {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 8px;
307
+ margin-bottom: 4px;
308
+ flex-wrap: wrap;
309
+ }
310
+
311
+ .messageAuthor { font-size: 13px; font-weight: 700; color: var(--theme-text); }
312
+
313
+ .messageTime {
314
+ font-size: 11px;
315
+ color: var(--theme-elevation-500);
316
+ font-weight: 500;
317
+ }
318
+
319
+ .badge {
320
+ display: inline-flex;
321
+ align-items: center;
322
+ padding: 2px 8px;
323
+ border-radius: 4px;
324
+ font-size: 10px;
325
+ font-weight: 700;
326
+ letter-spacing: 0.02em;
327
+ }
328
+
329
+ .messageMeta {
330
+ margin-left: auto;
331
+ display: flex;
332
+ gap: 6px;
333
+ align-items: center;
334
+ font-size: 10px;
335
+ font-weight: 600;
336
+ }
337
+
338
+ // #11 — Message font size 14px
339
+ .messageBody {
340
+ font-size: 14px;
341
+ line-height: 1.7;
342
+ color: var(--theme-text);
343
+ white-space: pre-wrap;
344
+ word-break: break-word;
345
+ }
346
+
347
+ .messageActions {
348
+ display: flex;
349
+ gap: 4px;
350
+ margin-top: 6px;
351
+ }
352
+
353
+ .actionIcon {
354
+ width: 28px;
355
+ height: 28px;
356
+ border: none;
357
+ background: none;
358
+ cursor: pointer;
359
+ border-radius: 4px;
360
+ font-size: 13px;
361
+ color: var(--theme-elevation-500);
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ transition: all 80ms;
366
+ &:hover { background: var(--theme-elevation-100); color: var(--theme-text); }
367
+ &.danger:hover { color: #ef4444; }
368
+ }
369
+
370
+ // ─── TYPING ───
371
+ .typing {
372
+ display: flex;
373
+ align-items: center;
374
+ gap: 8px;
375
+ padding: 8px 14px;
376
+ font-size: 12px;
377
+ color: #7c3aed;
378
+ font-weight: 500;
379
+ }
380
+
381
+ .typingDots {
382
+ display: flex;
383
+ gap: 3px;
384
+ span {
385
+ width: 5px; height: 5px; border-radius: 50%; background: #7c3aed;
386
+ animation: bounce 1.2s infinite;
387
+ &:nth-child(2) { animation-delay: 150ms; }
388
+ &:nth-child(3) { animation-delay: 300ms; }
389
+ }
390
+ }
391
+
392
+ @keyframes bounce {
393
+ 0%, 60%, 100% { transform: translateY(0); }
394
+ 30% { transform: translateY(-4px); }
395
+ }
396
+
397
+ // ─── COMPOSER ───
398
+ .composer {
399
+ border: 1px solid var(--theme-elevation-200);
400
+ border-radius: 12px;
401
+ overflow: visible;
402
+ position: relative;
403
+ background: var(--theme-elevation-0, #fff);
404
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
405
+ transition: border-color 150ms, box-shadow 150ms;
406
+
407
+ &:focus-within {
408
+ border-color: #2563eb;
409
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.08);
410
+ }
411
+ }
412
+
413
+ .composerInternal {
414
+ border-color: #d97706;
415
+ border-style: dashed;
416
+ &:focus-within { border-color: #d97706; box-shadow: 0 0 0 3px rgba(217, 119, 6, 0.08); }
417
+ }
418
+
419
+ // #5 — Drag & drop highlight
420
+ .composerDragOver {
421
+ border-color: #2563eb;
422
+ background: rgba(37, 99, 235, 0.04);
423
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);
424
+ }
425
+
426
+ .composerToolbar {
427
+ display: flex;
428
+ gap: 2px;
429
+ padding: 8px 12px;
430
+ border-bottom: 1px solid var(--theme-elevation-100, #f8fafc);
431
+ align-items: center;
432
+ }
433
+
434
+ .toolbarBtn {
435
+ width: 32px;
436
+ height: 32px;
437
+ border-radius: 6px;
438
+ border: none;
439
+ background: none;
440
+ cursor: pointer;
441
+ font-size: 15px;
442
+ color: var(--theme-elevation-500);
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ transition: all 80ms;
447
+ position: relative;
448
+
449
+ &:hover {
450
+ background: var(--theme-elevation-100);
451
+ color: var(--theme-text);
452
+ }
453
+
454
+ &:disabled { opacity: 0.3; cursor: not-allowed; }
455
+
456
+ // Tooltip
457
+ &::after {
458
+ content: attr(data-tooltip);
459
+ position: absolute;
460
+ bottom: -28px;
461
+ left: 50%;
462
+ transform: translateX(-50%);
463
+ padding: 3px 8px;
464
+ border-radius: 4px;
465
+ background: var(--theme-text);
466
+ color: var(--theme-elevation-0, #fff);
467
+ font-size: 10px;
468
+ font-weight: 600;
469
+ white-space: nowrap;
470
+ opacity: 0;
471
+ pointer-events: none;
472
+ transition: opacity 100ms;
473
+ }
474
+ &:hover::after { opacity: 1; }
475
+ }
476
+
477
+ .toolbarDivider {
478
+ width: 1px;
479
+ height: 20px;
480
+ background: var(--theme-elevation-200);
481
+ margin: 0 4px;
482
+ }
483
+
484
+ .cannedSelect {
485
+ padding: 4px 8px;
486
+ border-radius: 6px;
487
+ border: 1px solid var(--theme-elevation-200);
488
+ background: none;
489
+ font-size: 11px;
490
+ font-weight: 600;
491
+ color: var(--theme-elevation-500);
492
+ cursor: pointer;
493
+ margin-left: auto;
494
+ &:hover { background: var(--theme-elevation-100); }
495
+ }
496
+
497
+ .composerFooter {
498
+ display: flex;
499
+ justify-content: space-between;
500
+ align-items: center;
501
+ padding: 10px 14px;
502
+ border-top: 1px solid var(--theme-elevation-100, #f8fafc);
503
+ }
504
+
505
+ .composerOptions {
506
+ display: flex;
507
+ gap: 16px;
508
+ align-items: center;
509
+ font-size: 12px;
510
+ color: var(--theme-elevation-500);
511
+
512
+ label {
513
+ display: flex;
514
+ align-items: center;
515
+ gap: 6px;
516
+ cursor: pointer;
517
+ font-weight: 500;
518
+ user-select: none;
519
+ }
520
+
521
+ // Custom toggle switch
522
+ input[type="checkbox"] {
523
+ appearance: none;
524
+ -webkit-appearance: none;
525
+ width: 34px;
526
+ height: 20px;
527
+ border-radius: 10px;
528
+ background: var(--theme-elevation-300);
529
+ position: relative;
530
+ cursor: pointer;
531
+ transition: background 150ms;
532
+
533
+ &::after {
534
+ content: '';
535
+ position: absolute;
536
+ top: 2px;
537
+ left: 2px;
538
+ width: 16px;
539
+ height: 16px;
540
+ border-radius: 50%;
541
+ background: #fff;
542
+ transition: transform 150ms;
543
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
544
+ }
545
+
546
+ &:checked {
547
+ background: #2563eb;
548
+ &::after { transform: translateX(14px); }
549
+ }
550
+ }
551
+ }
552
+
553
+ .sendBtn {
554
+ padding: 8px 22px;
555
+ border-radius: 8px;
556
+ border: none;
557
+ background: #2563eb;
558
+ color: #fff;
559
+ font-size: 13px;
560
+ font-weight: 700;
561
+ cursor: pointer;
562
+ transition: background 100ms;
563
+ display: flex;
564
+ align-items: center;
565
+ gap: 6px;
566
+
567
+ &:hover { background: #1d4ed8; }
568
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
569
+ }
570
+
571
+ .sendBtnInternal {
572
+ background: #d97706;
573
+ &:hover { background: #b45309; }
574
+ }
575
+
576
+ // ─── ATTACHMENTS ───
577
+ .attachments {
578
+ display: flex;
579
+ gap: 8px;
580
+ flex-wrap: wrap;
581
+ margin-top: 8px;
582
+ }
583
+
584
+ .attachmentImg {
585
+ max-width: 220px;
586
+ max-height: 180px;
587
+ border-radius: 8px;
588
+ border: 1px solid var(--theme-elevation-200);
589
+ object-fit: cover;
590
+ cursor: pointer;
591
+ transition: opacity 100ms;
592
+ &:hover { opacity: 0.85; }
593
+ }
594
+
595
+ .attachmentFile {
596
+ display: inline-flex;
597
+ align-items: center;
598
+ gap: 4px;
599
+ padding: 5px 10px;
600
+ border-radius: 6px;
601
+ border: 1px solid var(--theme-elevation-200);
602
+ font-size: 11px;
603
+ font-weight: 600;
604
+ color: var(--theme-text);
605
+ text-decoration: none;
606
+ background: var(--theme-elevation-50);
607
+ transition: background 80ms;
608
+ &:hover { background: var(--theme-elevation-100); }
609
+ }
610
+
611
+ // Timer in sidebar
612
+ .timer {
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 10px;
616
+ }
617
+
618
+ .timerDisplay {
619
+ font-family: 'SF Mono', 'Fira Code', 'JetBrains Mono', 'Cascadia Code', monospace;
620
+ font-size: 20px;
621
+ font-weight: 700;
622
+ color: var(--theme-text);
623
+ letter-spacing: 0.02em;
624
+
625
+ &.timerActive { color: #dc2626; }
626
+ }
627
+
628
+ .timerBtn {
629
+ padding: 5px 14px;
630
+ border-radius: 6px;
631
+ border: 1px solid var(--theme-elevation-200);
632
+ background: none;
633
+ font-size: 12px;
634
+ font-weight: 700;
635
+ cursor: pointer;
636
+ transition: all 80ms;
637
+ &:hover { background: var(--theme-elevation-100); }
638
+ }
639
+
640
+ // Activity in sidebar
641
+ .collapseBtn {
642
+ background: none;
643
+ border: none;
644
+ cursor: pointer;
645
+ color: var(--theme-elevation-500);
646
+ font-size: 13px;
647
+ font-weight: 600;
648
+ padding: 0;
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 4px;
652
+ &:hover { color: var(--theme-text); }
653
+ }
654
+
655
+ .activityItem {
656
+ font-size: 12px;
657
+ padding: 6px 0;
658
+ border-bottom: 1px solid var(--theme-elevation-100, #f8fafc);
659
+ display: flex;
660
+ gap: 8px;
661
+ align-items: flex-start;
662
+
663
+ &:last-child { border-bottom: none; }
664
+ }
665
+
666
+ .activityDot {
667
+ width: 8px;
668
+ height: 8px;
669
+ border-radius: 50%;
670
+ margin-top: 4px;
671
+ flex-shrink: 0;
672
+ }
673
+
674
+ .activityContent { flex: 1; min-width: 0; }
675
+ .activityText { font-weight: 500; color: var(--theme-text); font-size: 12px; }
676
+ .activityTime { font-size: 11px; color: var(--theme-elevation-500); margin-top: 1px; }
677
+
678
+ // ─── DROPDOWN ───
679
+ .dropdown { position: relative; display: inline-block; }
680
+
681
+ .dropdownMenu {
682
+ position: absolute;
683
+ top: calc(100% + 6px);
684
+ right: 0;
685
+ z-index: 50;
686
+ min-width: 200px;
687
+ padding: 6px;
688
+ border-radius: 10px;
689
+ border: 1px solid var(--theme-elevation-200);
690
+ background: var(--theme-elevation-0, #fff);
691
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
692
+ }
693
+
694
+ .dropdownItem {
695
+ display: block;
696
+ width: 100%;
697
+ padding: 8px 12px;
698
+ border: none;
699
+ background: none;
700
+ text-align: left;
701
+ font-size: 13px;
702
+ font-weight: 500;
703
+ color: var(--theme-text);
704
+ cursor: pointer;
705
+ border-radius: 6px;
706
+ text-decoration: none;
707
+ &:hover { background: var(--theme-elevation-100); }
708
+ }
709
+
710
+ // RTE
711
+ .rteDisplay {
712
+ :global {
713
+ blockquote { border-left: 3px solid #2563eb; margin: 8px 0; padding: 8px 16px; background: var(--theme-elevation-50); border-radius: 0 6px 6px 0; }
714
+ img { max-width: 100%; height: auto; border-radius: 8px; margin: 8px 0; }
715
+ a { color: #2563eb; text-decoration: underline; }
716
+ ul, ol { margin: 8px 0; padding-left: 24px; }
717
+ li { margin: 2px 0; }
718
+ p { margin: 0 0 6px 0; }
719
+ }
720
+ }
721
+
722
+ // ─── UNDO TOAST (#2) ───
723
+ .undoToast {
724
+ position: fixed;
725
+ bottom: 24px;
726
+ left: 50%;
727
+ transform: translateX(-50%);
728
+ z-index: 100;
729
+ display: flex;
730
+ align-items: center;
731
+ gap: 12px;
732
+ padding: 12px 20px;
733
+ border-radius: 10px;
734
+ background: var(--theme-text, #1e293b);
735
+ color: var(--theme-elevation-0, #fff);
736
+ font-size: 13px;
737
+ font-weight: 600;
738
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
739
+ animation: toastIn 200ms ease-out;
740
+ }
741
+
742
+ .undoBtn {
743
+ padding: 4px 14px;
744
+ border-radius: 6px;
745
+ border: 1px solid rgba(255, 255, 255, 0.3);
746
+ background: rgba(255, 255, 255, 0.12);
747
+ color: #fff;
748
+ font-size: 12px;
749
+ font-weight: 700;
750
+ cursor: pointer;
751
+ transition: background 100ms;
752
+ &:hover { background: rgba(255, 255, 255, 0.25); }
753
+ }
754
+
755
+ @keyframes toastIn {
756
+ from { opacity: 0; transform: translateX(-50%) translateY(12px); }
757
+ to { opacity: 1; transform: translateX(-50%) translateY(0); }
758
+ }
759
+
760
+ // ─── SPLIT MODAL (#2) ───
761
+ .splitOverlay {
762
+ position: fixed;
763
+ inset: 0;
764
+ z-index: 90;
765
+ background: rgba(0, 0, 0, 0.3);
766
+ display: flex;
767
+ align-items: center;
768
+ justify-content: center;
769
+ animation: fadeIn 150ms ease-out;
770
+ }
771
+
772
+ .splitModal {
773
+ background: var(--theme-elevation-0, #fff);
774
+ border-radius: 12px;
775
+ border: 1px solid var(--theme-elevation-200);
776
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.15);
777
+ width: 440px;
778
+ max-width: 90vw;
779
+ padding: 24px;
780
+ }
781
+
782
+ .splitTitle {
783
+ font-size: 16px;
784
+ font-weight: 700;
785
+ color: var(--theme-text);
786
+ margin: 0 0 8px;
787
+ }
788
+
789
+ .splitPreview {
790
+ font-size: 12px;
791
+ color: var(--theme-elevation-500);
792
+ margin: 0 0 16px;
793
+ line-height: 1.5;
794
+ max-height: 80px;
795
+ overflow: hidden;
796
+ padding: 8px;
797
+ border-radius: 6px;
798
+ background: var(--theme-elevation-50);
799
+ }
800
+
801
+ .splitInput {
802
+ width: 100%;
803
+ padding: 10px 14px;
804
+ border-radius: 8px;
805
+ border: 1px solid var(--theme-elevation-200);
806
+ font-size: 14px;
807
+ color: var(--theme-text);
808
+ background: var(--theme-elevation-0, #fff);
809
+ margin-bottom: 16px;
810
+ transition: border-color 100ms;
811
+
812
+ &:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); }
813
+ }
814
+
815
+ .splitActions {
816
+ display: flex;
817
+ justify-content: flex-end;
818
+ gap: 8px;
819
+ }
820
+
821
+ .splitCancelBtn {
822
+ padding: 8px 16px;
823
+ border-radius: 8px;
824
+ border: 1px solid var(--theme-elevation-200);
825
+ background: none;
826
+ font-size: 13px;
827
+ font-weight: 600;
828
+ color: var(--theme-elevation-500);
829
+ cursor: pointer;
830
+ &:hover { background: var(--theme-elevation-100); }
831
+ }
832
+
833
+ .splitConfirmBtn {
834
+ padding: 8px 16px;
835
+ border-radius: 8px;
836
+ border: none;
837
+ background: #2563eb;
838
+ color: #fff;
839
+ font-size: 13px;
840
+ font-weight: 700;
841
+ cursor: pointer;
842
+ &:hover { background: #1d4ed8; }
843
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
844
+ }
845
+
846
+ @keyframes fadeIn {
847
+ from { opacity: 0; }
848
+ to { opacity: 1; }
849
+ }
850
+
851
+ // ─── TAGS (#6) ───
852
+ .tagsWrap {
853
+ display: flex;
854
+ flex-wrap: wrap;
855
+ gap: 6px;
856
+ margin-top: 4px;
857
+ }
858
+
859
+ .tagChip {
860
+ display: inline-flex;
861
+ align-items: center;
862
+ gap: 4px;
863
+ padding: 3px 10px;
864
+ border-radius: 20px;
865
+ background: var(--theme-elevation-100);
866
+ font-size: 11px;
867
+ font-weight: 600;
868
+ color: var(--theme-text);
869
+ }
870
+
871
+ .tagRemove {
872
+ background: none;
873
+ border: none;
874
+ cursor: pointer;
875
+ font-size: 14px;
876
+ line-height: 1;
877
+ color: var(--theme-elevation-400);
878
+ padding: 0;
879
+ display: flex;
880
+ align-items: center;
881
+ transition: color 80ms;
882
+ &:hover { color: #ef4444; }
883
+ }
884
+
885
+ .tagAddBtn {
886
+ padding: 3px 10px;
887
+ border-radius: 20px;
888
+ border: 1px dashed var(--theme-elevation-300);
889
+ background: none;
890
+ font-size: 11px;
891
+ font-weight: 600;
892
+ color: var(--theme-elevation-400);
893
+ cursor: pointer;
894
+ transition: all 80ms;
895
+ &:hover { border-color: #2563eb; color: #2563eb; background: rgba(37, 99, 235, 0.04); }
896
+ }
897
+
898
+ .tagInput {
899
+ padding: 3px 8px;
900
+ border-radius: 20px;
901
+ border: 1px solid #2563eb;
902
+ font-size: 11px;
903
+ font-weight: 600;
904
+ color: var(--theme-text);
905
+ background: var(--theme-elevation-0, #fff);
906
+ width: 100px;
907
+ &:focus { outline: none; }
908
+ }
909
+
910
+ // ─── FILE UPLOAD PREVIEW (#5) ───
911
+ .uploadPreview {
912
+ display: flex;
913
+ flex-wrap: wrap;
914
+ gap: 8px;
915
+ padding: 8px 12px;
916
+ border-top: 1px solid var(--theme-elevation-100);
917
+ }
918
+
919
+ .uploadPreviewItem {
920
+ display: flex;
921
+ align-items: center;
922
+ gap: 6px;
923
+ padding: 4px 10px;
924
+ border-radius: 6px;
925
+ background: var(--theme-elevation-50);
926
+ border: 1px solid var(--theme-elevation-200);
927
+ font-size: 11px;
928
+ font-weight: 600;
929
+ color: var(--theme-text);
930
+ }
931
+
932
+ .uploadRemoveBtn {
933
+ background: none;
934
+ border: none;
935
+ cursor: pointer;
936
+ font-size: 14px;
937
+ line-height: 1;
938
+ color: var(--theme-elevation-400);
939
+ padding: 0;
940
+ &:hover { color: #ef4444; }
941
+ }
942
+
943
+ // Hidden file input
944
+ .hiddenFileInput {
945
+ display: none;
946
+ }
947
+
948
+ // ─── RESPONSIVE BREAKPOINTS (#8) ───
949
+ @media (max-width: 768px) {
950
+ .page {
951
+ padding: 0 12px 40px;
952
+ }
953
+
954
+ .topBar {
955
+ gap: 10px;
956
+ padding: 12px 0 10px;
957
+ flex-wrap: wrap;
958
+ }
959
+
960
+ .ticketSubject {
961
+ font-size: 15px;
962
+ }
963
+
964
+ .topBarRight {
965
+ gap: 6px;
966
+ }
967
+
968
+ .sentimentBadge {
969
+ display: none;
970
+ }
971
+
972
+ .message {
973
+ padding: 10px 8px;
974
+ }
975
+
976
+ .composerToolbar {
977
+ flex-wrap: wrap;
978
+ gap: 4px;
979
+ }
980
+
981
+ .composerFooter {
982
+ flex-direction: column;
983
+ gap: 10px;
984
+ align-items: stretch;
985
+ }
986
+
987
+ .composerOptions {
988
+ justify-content: center;
989
+ }
990
+
991
+ .sendBtn {
992
+ justify-content: center;
993
+ width: 100%;
994
+ }
995
+
996
+ .sidebar {
997
+ border-radius: 8px;
998
+ }
999
+ }
1000
+
1001
+ @media (max-width: 480px) {
1002
+ .page {
1003
+ padding: 0 8px 32px;
1004
+ }
1005
+
1006
+ .topBar {
1007
+ gap: 8px;
1008
+ }
1009
+
1010
+ .ticketSubject {
1011
+ font-size: 14px;
1012
+ }
1013
+
1014
+ .ticketNumber {
1015
+ font-size: 10px;
1016
+ }
1017
+
1018
+ .statusChip {
1019
+ font-size: 11px;
1020
+ padding: 4px 10px;
1021
+ }
1022
+
1023
+ .avatar {
1024
+ width: 28px;
1025
+ height: 28px;
1026
+ font-size: 10px;
1027
+ }
1028
+
1029
+ .messageAuthor {
1030
+ font-size: 12px;
1031
+ }
1032
+
1033
+ .messageBody {
1034
+ font-size: 13px;
1035
+ }
1036
+
1037
+ .attachmentImg {
1038
+ max-width: 160px;
1039
+ max-height: 120px;
1040
+ }
1041
+
1042
+ .composerOptions {
1043
+ flex-direction: column;
1044
+ gap: 8px;
1045
+ }
1046
+
1047
+ .sideField {
1048
+ font-size: 12px;
1049
+ }
1050
+ }