@consilioweb/payload-support 0.6.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.
Files changed (84) hide show
  1. package/dist/{styles/theme.css → components/TicketConversation.css} +13 -326
  2. package/dist/components/TicketConversation.js +3004 -0
  3. package/dist/index.cjs +11 -11
  4. package/dist/index.js +11 -11
  5. package/dist/views.cjs +6184 -0
  6. package/dist/{views/TicketingSettingsView/TicketingSettings.module.scss → views.css} +66 -138
  7. package/dist/views.d.cts +30 -0
  8. package/dist/views.d.ts +30 -0
  9. package/dist/views.js +6165 -0
  10. package/package.json +14 -7
  11. package/src/plugin.ts +11 -11
  12. package/src/views.ts +17 -0
  13. package/dist/components/TicketConversation/components/AISummaryPanel.js +0 -76
  14. package/dist/components/TicketConversation/components/ActionPanels.js +0 -118
  15. package/dist/components/TicketConversation/components/ActivityLog.js +0 -23
  16. package/dist/components/TicketConversation/components/ClientBar.js +0 -42
  17. package/dist/components/TicketConversation/components/ClientHistory.js +0 -137
  18. package/dist/components/TicketConversation/components/CodeBlock.js +0 -152
  19. package/dist/components/TicketConversation/components/CodeBlockInserter.js +0 -155
  20. package/dist/components/TicketConversation/components/QuickActions.js +0 -65
  21. package/dist/components/TicketConversation/components/TicketHeader.js +0 -92
  22. package/dist/components/TicketConversation/components/TimeTrackingPanel.js +0 -133
  23. package/dist/components/TicketConversation/config.js +0 -41
  24. package/dist/components/TicketConversation/constants.js +0 -96
  25. package/dist/components/TicketConversation/context.js +0 -11
  26. package/dist/components/TicketConversation/hooks/useAI.js +0 -176
  27. package/dist/components/TicketConversation/hooks/useMessageActions.js +0 -135
  28. package/dist/components/TicketConversation/hooks/useReply.js +0 -187
  29. package/dist/components/TicketConversation/hooks/useTicketActions.js +0 -230
  30. package/dist/components/TicketConversation/hooks/useTimeTracking.js +0 -122
  31. package/dist/components/TicketConversation/hooks/useTranslation.js +0 -70
  32. package/dist/components/TicketConversation/index.js +0 -1123
  33. package/dist/components/TicketConversation/locales/en.json +0 -878
  34. package/dist/components/TicketConversation/locales/fr.json +0 -878
  35. package/dist/components/TicketConversation/types.js +0 -2
  36. package/dist/components/TicketConversation/utils.js +0 -25
  37. package/dist/styles/BillingView.module.scss +0 -311
  38. package/dist/styles/ChatView.module.scss +0 -438
  39. package/dist/styles/CommandPalette.module.scss +0 -160
  40. package/dist/styles/CrmView.module.scss +0 -554
  41. package/dist/styles/EmailTracking.module.scss +0 -238
  42. package/dist/styles/ImportConversation.module.scss +0 -267
  43. package/dist/styles/Layout.module.scss +0 -55
  44. package/dist/styles/Logs.module.scss +0 -164
  45. package/dist/styles/NewTicket.module.scss +0 -143
  46. package/dist/styles/PendingEmails.module.scss +0 -629
  47. package/dist/styles/SupportDashboard.module.scss +0 -649
  48. package/dist/styles/TicketDetail.module.scss +0 -1050
  49. package/dist/styles/TicketInbox.module.scss +0 -296
  50. package/dist/styles/TicketingSettings.module.scss +0 -358
  51. package/dist/styles/TimeDashboard.module.scss +0 -287
  52. package/dist/styles/_tokens.scss +0 -78
  53. package/dist/views/BillingView/client.js +0 -204
  54. package/dist/views/BillingView/index.js +0 -29
  55. package/dist/views/ChatView/client.js +0 -252
  56. package/dist/views/ChatView/index.js +0 -29
  57. package/dist/views/CrmView/client.js +0 -232
  58. package/dist/views/CrmView/index.js +0 -29
  59. package/dist/views/EmailTrackingView/client.js +0 -154
  60. package/dist/views/EmailTrackingView/index.js +0 -29
  61. package/dist/views/ImportConversationView/client.js +0 -204
  62. package/dist/views/ImportConversationView/index.js +0 -29
  63. package/dist/views/LogsView/client.js +0 -148
  64. package/dist/views/LogsView/index.js +0 -27
  65. package/dist/views/NewTicketView/client.js +0 -224
  66. package/dist/views/NewTicketView/index.js +0 -27
  67. package/dist/views/PendingEmailsView/client.js +0 -172
  68. package/dist/views/PendingEmailsView/index.js +0 -29
  69. package/dist/views/SupportDashboardView/client.js +0 -296
  70. package/dist/views/SupportDashboardView/index.js +0 -29
  71. package/dist/views/TicketDetailView/client.js +0 -844
  72. package/dist/views/TicketDetailView/index.js +0 -29
  73. package/dist/views/TicketInboxView/client.js +0 -294
  74. package/dist/views/TicketInboxView/index.js +0 -27
  75. package/dist/views/TicketingSettingsView/client.js +0 -728
  76. package/dist/views/TicketingSettingsView/index.js +0 -29
  77. package/dist/views/TimeDashboardView/client.js +0 -164
  78. package/dist/views/TimeDashboardView/index.js +0 -29
  79. package/dist/views/shared/AdminViewHeader.js +0 -67
  80. package/dist/views/shared/ErrorBoundary.js +0 -50
  81. package/dist/views/shared/Skeleton.js +0 -72
  82. package/dist/views/shared/adminTokens.js +0 -32
  83. package/dist/views/shared/config.js +0 -41
  84. package/dist/views/shared/index.js +0 -6
@@ -1,1050 +0,0 @@
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
- }