@contenify/chatbot 0.1.2 → 0.1.4

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/dist/styles.css CHANGED
@@ -1,49 +1,1102 @@
1
1
  /* contenify-chatbot component styles */
2
- /* Consumers must have Tailwind CSS configured in their project */
2
+ /* No external CSS framework required */
3
3
 
4
+ /* ========================================
5
+ CSS Variables
6
+ ======================================== */
4
7
  :root {
5
- --color-primary: #10b981;
6
- --color-secondary: #064e3b;
8
+ --cnfy-primary: #10b981;
9
+ --cnfy-secondary: #064e3b;
10
+ --cnfy-white: #ffffff;
11
+ --cnfy-black: #000000;
12
+ --cnfy-gray-50: #f9fafb;
13
+ --cnfy-gray-100: #f3f4f6;
14
+ --cnfy-gray-200: #e5e7eb;
15
+ --cnfy-gray-300: #d1d5db;
16
+ --cnfy-gray-400: #9ca3af;
17
+ --cnfy-gray-500: #6b7280;
18
+ --cnfy-gray-600: #4b5563;
19
+ --cnfy-gray-700: #374151;
20
+ --cnfy-gray-800: #1f2937;
21
+ --cnfy-gray-900: #111827;
22
+ --cnfy-red-50: #fef2f2;
23
+ --cnfy-red-600: #dc2626;
24
+ --cnfy-emerald-600: #059669;
25
+ --cnfy-emerald-700: #047857;
26
+ --cnfy-purple-500: #8b5cf6;
27
+ --cnfy-purple-600: #7c3aed;
28
+ --cnfy-pink-500: #ec4899;
29
+ --cnfy-pink-600: #db2777;
7
30
  }
8
31
 
9
- /* React Select portal fix */
10
- .react-select__menu-portal {
11
- pointer-events: auto !important;
12
- z-index: 999999 !important;
32
+ /* ========================================
33
+ Keyframe Animations
34
+ ======================================== */
35
+ @keyframes cnfy-spin {
36
+ from { transform: rotate(0deg); }
37
+ to { transform: rotate(360deg); }
38
+ }
39
+
40
+ @keyframes cnfy-bounce {
41
+ 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8, 0, 1, 1); }
42
+ 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
43
+ }
44
+
45
+ @keyframes cnfy-pulse {
46
+ 0%, 100% { opacity: 1; }
47
+ 50% { opacity: 0.5; }
48
+ }
49
+
50
+ @keyframes cnfy-marquee {
51
+ 0% { transform: translateX(0%); }
52
+ 100% { transform: translateX(-100%); }
53
+ }
54
+
55
+ .cnfy-animate-spin {
56
+ animation: cnfy-spin 1s linear infinite;
57
+ }
58
+
59
+ .cnfy-animate-bounce {
60
+ animation: cnfy-bounce 1s infinite;
61
+ }
62
+
63
+ .cnfy-animate-pulse {
64
+ animation: cnfy-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
65
+ }
66
+
67
+ /* ========================================
68
+ Base / Reset
69
+ ======================================== */
70
+ .cnfy-root {
71
+ width: 100%;
72
+ height: 100vh;
73
+ display: flex;
74
+ flex-direction: column;
75
+ background-color: var(--cnfy-white);
76
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
77
+ box-sizing: border-box;
78
+ }
79
+
80
+ .cnfy-root *, .cnfy-root *::before, .cnfy-root *::after {
81
+ box-sizing: border-box;
82
+ }
83
+
84
+ /* ========================================
85
+ ChatBot.tsx
86
+ ======================================== */
87
+ .cnfy-loading {
88
+ width: 100%;
89
+ height: 100vh;
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ background-color: var(--cnfy-white);
94
+ }
95
+
96
+ .cnfy-loading-inner {
97
+ display: flex;
98
+ flex-direction: column;
99
+ align-items: center;
100
+ gap: 0.75rem;
101
+ }
102
+
103
+ .cnfy-loading-spinner {
104
+ height: 2rem;
105
+ width: 2rem;
106
+ color: var(--cnfy-gray-400);
107
+ }
108
+
109
+ .cnfy-loading-text {
110
+ font-size: 0.875rem;
111
+ color: var(--cnfy-gray-500);
112
+ }
113
+
114
+ .cnfy-main {
115
+ flex: 1;
116
+ min-height: 0;
117
+ }
118
+
119
+ .cnfy-main--with-news {
120
+ display: flex;
121
+ }
122
+
123
+ @media (min-width: 768px) {
124
+ .cnfy-main--with-news {
125
+ display: grid;
126
+ grid-template-columns: repeat(12, minmax(0, 1fr));
127
+ }
128
+ }
129
+
130
+ .cnfy-sidebar {
131
+ position: relative;
132
+ grid-column: span 4 / span 4;
133
+ background-color: rgba(249, 250, 251, 0.6);
134
+ border-right: 1px solid var(--cnfy-gray-300);
135
+ height: 90vh;
136
+ overflow-y: auto;
137
+ }
138
+
139
+ .cnfy-chat-section {
140
+ background-color: var(--cnfy-white);
141
+ display: flex;
142
+ flex-direction: column;
143
+ height: 100%;
144
+ position: relative;
145
+ }
146
+
147
+ .cnfy-chat-section--with-news {
148
+ grid-column: span 8 / span 8;
149
+ }
150
+
151
+ .cnfy-chat-section--full {
152
+ width: 100%;
153
+ }
154
+
155
+ .cnfy-chat-section--hidden-mobile {
156
+ display: none;
157
+ }
158
+
159
+ @media (min-width: 768px) {
160
+ .cnfy-chat-section--hidden-mobile {
161
+ display: flex;
162
+ }
163
+ }
164
+
165
+ .cnfy-chat-section--visible {
166
+ display: flex;
167
+ }
168
+
169
+ .cnfy-mobile-back {
170
+ border-bottom: 1px solid var(--cnfy-gray-300);
171
+ padding: 0.75rem;
172
+ }
173
+
174
+ @media (min-width: 768px) {
175
+ .cnfy-mobile-back {
176
+ display: none;
177
+ }
178
+ }
179
+
180
+ .cnfy-mobile-back-btn {
181
+ font-size: 0.875rem;
182
+ color: var(--cnfy-gray-600);
183
+ background: none;
184
+ border: none;
185
+ cursor: pointer;
186
+ padding: 0;
187
+ }
188
+
189
+ .cnfy-chat-inner {
190
+ flex: 1;
191
+ min-height: 0;
192
+ }
193
+
194
+ .cnfy-empty-state {
195
+ pointer-events: none;
196
+ position: absolute;
197
+ inset: 0;
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ text-align: center;
202
+ color: var(--cnfy-gray-400);
203
+ font-size: 0.875rem;
204
+ padding: 0 1rem;
205
+ }
206
+
207
+ .cnfy-empty-state-title {
208
+ font-weight: 500;
209
+ }
210
+
211
+ .cnfy-empty-state-subtitle {
212
+ margin-top: 0.25rem;
213
+ }
214
+
215
+ /* ========================================
216
+ HeaderBar.tsx
217
+ ======================================== */
218
+ .cnfy-header {
219
+ position: sticky;
220
+ top: 0;
221
+ z-index: 40;
222
+ background-color: var(--cnfy-white);
223
+ border-bottom: 1px solid var(--cnfy-gray-200);
224
+ }
225
+
226
+ .cnfy-header-inner {
227
+ margin: 0 auto;
228
+ display: flex;
229
+ height: 3.5rem;
230
+ align-items: center;
231
+ justify-content: space-between;
232
+ padding: 0 1rem;
233
+ }
234
+
235
+ .cnfy-header-left {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 0.75rem;
239
+ cursor: pointer;
240
+ }
241
+
242
+ .cnfy-header-logo-img {
243
+ height: 2rem;
244
+ width: 2rem;
245
+ border-radius: 0.375rem;
246
+ object-fit: cover;
247
+ }
248
+
249
+ .cnfy-header-logo-fallback {
250
+ height: 2rem;
251
+ width: 2rem;
252
+ border-radius: 0.375rem;
253
+ color: var(--cnfy-white);
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ font-weight: 700;
258
+ font-size: 0.875rem;
259
+ }
260
+
261
+ .cnfy-header-brand {
262
+ font-weight: 600;
263
+ color: var(--cnfy-gray-900);
264
+ font-size: 1rem;
265
+ }
266
+
267
+ .cnfy-header-right {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 0.75rem;
271
+ }
272
+
273
+ /* ========================================
274
+ UserMenu.tsx
275
+ ======================================== */
276
+ .cnfy-user-menu {
277
+ position: relative;
278
+ }
279
+
280
+ .cnfy-user-menu-trigger {
281
+ padding: 0.5rem;
282
+ border-radius: 9999px;
283
+ background: none;
284
+ border: none;
285
+ cursor: pointer;
286
+ transition: background-color 0.15s;
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ }
291
+
292
+ .cnfy-user-menu-trigger:hover {
293
+ background-color: var(--cnfy-gray-100);
294
+ }
295
+
296
+ .cnfy-user-menu-trigger-icon {
297
+ color: var(--cnfy-gray-600);
298
+ }
299
+
300
+ .cnfy-dropdown {
301
+ position: absolute;
302
+ right: 0;
303
+ top: 100%;
304
+ margin-bottom: 0.5rem;
305
+ width: 13rem;
306
+ background-color: var(--cnfy-white);
307
+ border: 1px solid var(--cnfy-gray-200);
308
+ border-radius: 0.5rem;
309
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
310
+ z-index: 50;
311
+ }
312
+
313
+ .cnfy-dropdown-divider {
314
+ border-top: 1px solid var(--cnfy-gray-300);
315
+ margin: 0.25rem 0;
316
+ }
317
+
318
+ .cnfy-menu-item {
319
+ width: 100%;
320
+ display: flex;
321
+ align-items: center;
322
+ gap: 0.5rem;
323
+ padding: 0.5rem 1rem;
324
+ font-size: 0.875rem;
325
+ transition: background-color 0.15s;
326
+ background: none;
327
+ border: none;
328
+ cursor: pointer;
329
+ text-align: left;
330
+ color: var(--cnfy-gray-700);
13
331
  }
14
332
 
15
- /* Chat scroll container */
16
- .chat-scroll {
17
- overflow-y: auto !important;
333
+ .cnfy-menu-item:hover {
334
+ background-color: var(--cnfy-gray-100);
335
+ }
336
+
337
+ .cnfy-menu-item--danger {
338
+ color: var(--cnfy-red-600);
339
+ }
340
+
341
+ .cnfy-menu-item--danger:hover {
342
+ background-color: var(--cnfy-red-50);
343
+ }
344
+
345
+ /* ========================================
346
+ ChatWindow.tsx
347
+ ======================================== */
348
+ .cnfy-chat {
349
+ height: 100%;
350
+ display: flex;
351
+ width: 100%;
352
+ flex-direction: column;
353
+ }
354
+
355
+ .cnfy-chat-area {
356
+ flex: 1;
357
+ padding: 1rem 1rem 1.5rem;
358
+ }
359
+
360
+ .cnfy-chat-scroll {
361
+ max-width: 48rem;
362
+ overflow-y: auto;
18
363
  height: 73vh;
364
+ margin: 0 auto;
365
+ }
366
+
367
+ .cnfy-chat-scroll > * + * {
368
+ margin-top: 1.5rem;
369
+ }
370
+
371
+ .cnfy-msg {
372
+ display: flex;
373
+ gap: 0.75rem;
374
+ }
375
+
376
+ .cnfy-msg-avatar-wrap {
377
+ flex-shrink: 0;
378
+ }
379
+
380
+ .cnfy-msg-avatar {
381
+ height: 2rem;
382
+ width: 2rem;
383
+ border-radius: 9999px;
384
+ display: flex;
385
+ align-items: center;
386
+ justify-content: center;
387
+ font-size: 0.75rem;
388
+ font-weight: 600;
389
+ color: var(--cnfy-white);
390
+ }
391
+
392
+ .cnfy-msg-body {
393
+ flex: 1;
394
+ font-size: 0.875rem;
395
+ line-height: 1.625;
396
+ }
397
+
398
+ .cnfy-msg-body > * + * {
399
+ margin-top: 0.75rem;
400
+ }
401
+
402
+ .cnfy-msg-copy-row {
403
+ display: flex;
404
+ justify-content: flex-end;
405
+ margin-top: -0.25rem;
406
+ margin-bottom: 0.5rem;
407
+ }
408
+
409
+ .cnfy-msg-copy-btn {
410
+ padding: 0.375rem;
411
+ border-radius: 0.375rem;
412
+ background: none;
413
+ border: none;
414
+ cursor: pointer;
415
+ transition: background-color 0.15s, color 0.15s;
416
+ color: var(--cnfy-gray-400);
417
+ display: flex;
418
+ align-items: center;
419
+ }
420
+
421
+ .cnfy-msg-copy-btn:hover {
422
+ background-color: var(--cnfy-gray-100);
423
+ color: var(--cnfy-gray-600);
424
+ }
425
+
426
+ .cnfy-msg-copy-btn--copied {
427
+ color: var(--cnfy-emerald-600);
428
+ }
429
+
430
+ .cnfy-msg-h1 {
431
+ font-size: 0.875rem;
432
+ font-weight: 600;
433
+ margin: 0;
434
+ }
435
+
436
+ .cnfy-msg-h2 {
437
+ font-size: 1rem;
438
+ font-weight: 600;
439
+ margin-top: 1rem;
440
+ }
441
+
442
+ .cnfy-msg-p {
443
+ color: var(--cnfy-gray-800);
444
+ margin: 0;
445
+ }
446
+
447
+ .cnfy-msg-keywords {
448
+ padding-top: 1rem;
449
+ border-top: 1px solid var(--cnfy-gray-200);
450
+ margin-top: 1.5rem;
451
+ }
452
+
453
+ .cnfy-msg-keywords-list {
454
+ display: flex;
455
+ flex-wrap: wrap;
456
+ gap: 0.5rem;
457
+ }
458
+
459
+ .cnfy-msg-keyword-tag {
460
+ font-size: 0.75rem;
461
+ padding: 0.25rem 0.75rem;
462
+ border-radius: 9999px;
463
+ background-color: var(--cnfy-gray-100);
464
+ color: var(--cnfy-gray-700);
465
+ }
466
+
467
+ .cnfy-msg-actions {
468
+ display: flex;
469
+ flex-wrap: wrap;
470
+ gap: 0.5rem;
471
+ padding-top: 1rem;
472
+ margin-top: 0.5rem;
19
473
  }
20
474
 
21
- /* Chat input textarea */
22
- .input_box_textarea {
23
- height: 50px !important;
475
+ .cnfy-msg-action-btn {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 0.5rem;
479
+ padding: 0.5rem 1rem;
480
+ border: 1px solid var(--cnfy-gray-200);
481
+ border-radius: 0.5rem;
482
+ font-size: 0.875rem;
483
+ font-weight: 500;
484
+ color: var(--cnfy-gray-700);
485
+ background: none;
486
+ cursor: pointer;
487
+ transition: background-color 0.15s, border-color 0.15s;
488
+ }
489
+
490
+ .cnfy-msg-action-btn:hover {
491
+ background-color: var(--cnfy-gray-50);
492
+ border-color: var(--cnfy-gray-300);
493
+ }
494
+
495
+ .cnfy-msg-edit-actions {
496
+ display: flex;
497
+ gap: 0.75rem;
498
+ padding-top: 1rem;
499
+ margin-top: 0.5rem;
500
+ }
501
+
502
+ .cnfy-btn-edit {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 0.5rem;
506
+ padding: 0.5rem 1rem;
507
+ border: 1px solid var(--cnfy-gray-300);
508
+ border-radius: 0.5rem;
509
+ font-size: 0.875rem;
510
+ font-weight: 500;
511
+ color: var(--cnfy-gray-700);
512
+ background: none;
513
+ cursor: pointer;
514
+ transition: background-color 0.15s;
515
+ }
516
+
517
+ .cnfy-btn-edit:hover {
518
+ background-color: var(--cnfy-gray-50);
519
+ }
520
+
521
+ .cnfy-btn-post {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: 0.5rem;
525
+ padding: 0.5rem 1rem;
526
+ border-radius: 0.5rem;
527
+ font-size: 0.875rem;
528
+ font-weight: 500;
529
+ color: var(--cnfy-white);
530
+ background: none;
531
+ border: none;
532
+ cursor: pointer;
533
+ transition: background-color 0.15s;
534
+ }
535
+
536
+ /* Input Area */
537
+ .cnfy-input-area {
538
+ flex-shrink: 0;
539
+ background-color: var(--cnfy-white);
540
+ padding: 0.75rem 1rem;
541
+ }
542
+
543
+ .cnfy-input-inner {
544
+ max-width: 48rem;
545
+ margin: 0 auto;
546
+ position: relative;
547
+ display: flex;
548
+ gap: 0.5rem;
549
+ align-items: flex-end;
550
+ }
551
+
552
+ .cnfy-news-trigger-wrap {
553
+ position: absolute;
554
+ left: 0.75rem;
555
+ top: 50%;
556
+ transform: translateY(-50%);
557
+ z-index: 10;
558
+ }
559
+
560
+ .cnfy-news-trigger-btn {
561
+ display: flex;
562
+ height: 2rem;
563
+ width: 2rem;
564
+ align-items: center;
565
+ justify-content: center;
566
+ border-radius: 9999px;
567
+ background: linear-gradient(to right, var(--cnfy-purple-500), var(--cnfy-pink-500));
568
+ color: var(--cnfy-white);
569
+ border: none;
570
+ cursor: pointer;
571
+ transition: all 0.15s;
572
+ animation: cnfy-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
573
+ }
574
+
575
+ .cnfy-news-trigger-btn:hover {
576
+ background: linear-gradient(to right, var(--cnfy-purple-600), var(--cnfy-pink-600));
577
+ animation: none;
578
+ }
579
+
580
+ /* News Dropdown */
581
+ .cnfy-news-dropdown {
582
+ position: absolute;
583
+ bottom: 100%;
584
+ left: 0;
585
+ margin-bottom: 0.5rem;
586
+ width: 600px;
587
+ background-color: var(--cnfy-white);
588
+ border: 1px solid var(--cnfy-gray-200);
589
+ border-radius: 0.5rem;
590
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
591
+ max-height: 600px;
592
+ overflow: hidden;
593
+ }
594
+
595
+ .cnfy-news-dropdown-header {
596
+ display: flex;
597
+ align-items: center;
598
+ justify-content: space-between;
599
+ padding: 0.5rem 0.75rem;
600
+ border-bottom: 1px solid var(--cnfy-gray-100);
601
+ }
602
+
603
+ .cnfy-news-dropdown-title {
604
+ font-size: 0.875rem;
605
+ font-weight: 500;
606
+ color: var(--cnfy-white);
607
+ }
608
+
609
+ .cnfy-news-dropdown-close {
610
+ padding: 0.25rem;
611
+ border-radius: 0.25rem;
612
+ border: none;
613
+ cursor: pointer;
614
+ transition: background-color 0.15s;
615
+ display: flex;
616
+ align-items: center;
617
+ }
618
+
619
+ .cnfy-news-dropdown-close:hover {
620
+ opacity: 0.8;
621
+ }
622
+
623
+ .cnfy-news-dropdown-source-bar {
624
+ padding: 0.5rem 0.75rem;
625
+ border-bottom: 1px solid var(--cnfy-gray-100);
626
+ display: flex;
627
+ align-items: center;
628
+ gap: 0.5rem;
629
+ }
630
+
631
+ .cnfy-news-dropdown-select-wrap {
632
+ flex: 1;
633
+ min-width: 180px;
634
+ }
635
+
636
+ .cnfy-news-dropdown-list {
637
+ overflow-y: auto;
638
+ max-height: 320px;
639
+ }
640
+
641
+ .cnfy-news-dropdown-empty {
642
+ padding: 1rem;
643
+ text-align: center;
644
+ font-size: 0.875rem;
645
+ color: var(--cnfy-gray-500);
646
+ }
647
+
648
+ .cnfy-news-dropdown-empty-hint {
649
+ margin-top: 0.25rem;
650
+ font-size: 0.75rem;
651
+ }
652
+
653
+ /* Chat textarea */
654
+ .cnfy-chat-textarea {
655
+ flex: 1;
656
+ resize: none;
657
+ overflow: hidden;
658
+ border: 1px solid var(--cnfy-gray-300);
24
659
  border-radius: 50px;
25
- padding-top: 10px !important;
26
- padding-bottom: 10px;
27
- padding-left: 30px;
28
- padding-right: 30px;
660
+ padding: 10px 50px 10px 30px;
661
+ font-size: 0.875rem;
662
+ height: 50px;
663
+ outline: none;
664
+ font-family: inherit;
29
665
  }
30
666
 
31
- /* Sticky top utility */
32
- .staky-top {
33
- position: sticky;
34
- top: 0px;
667
+ .cnfy-chat-textarea--with-trigger {
668
+ padding-left: 3.5rem;
669
+ }
670
+
671
+ .cnfy-chat-textarea:focus {
672
+ border-color: var(--cnfy-gray-400);
35
673
  }
36
674
 
37
- /* TipTap Editor Styles */
675
+ .cnfy-send-btn {
676
+ display: flex;
677
+ height: 2.5rem;
678
+ width: 2.5rem;
679
+ position: absolute;
680
+ right: 10px;
681
+ top: 5px;
682
+ align-items: center;
683
+ justify-content: center;
684
+ border-radius: 9999px;
685
+ border: none;
686
+ cursor: pointer;
687
+ color: var(--cnfy-white);
688
+ }
689
+
690
+ /* ========================================
691
+ ArticleModal.tsx
692
+ ======================================== */
693
+ .cnfy-article-modal-overlay {
694
+ position: fixed;
695
+ inset: 0;
696
+ z-index: 50;
697
+ background-color: rgba(0, 0, 0, 0.5);
698
+ backdrop-filter: blur(4px);
699
+ display: flex;
700
+ align-items: center;
701
+ justify-content: center;
702
+ padding: 0 1rem;
703
+ }
704
+
705
+ .cnfy-article-modal {
706
+ position: relative;
707
+ width: 100%;
708
+ max-width: 48rem;
709
+ background-color: var(--cnfy-white);
710
+ border-radius: 0.75rem;
711
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
712
+ border: 1px solid var(--cnfy-gray-200);
713
+ }
714
+
715
+ .cnfy-article-modal-header {
716
+ display: flex;
717
+ align-items: flex-start;
718
+ justify-content: space-between;
719
+ padding: 1rem 1.5rem;
720
+ border-bottom: 1px solid var(--cnfy-gray-300);
721
+ }
722
+
723
+ .cnfy-article-modal-source {
724
+ font-size: 0.75rem;
725
+ color: var(--cnfy-gray-500);
726
+ margin-bottom: 0.25rem;
727
+ }
728
+
729
+ .cnfy-article-modal-title {
730
+ font-size: 1.125rem;
731
+ font-weight: 600;
732
+ color: var(--cnfy-gray-900);
733
+ line-height: 1.4;
734
+ margin: 0;
735
+ }
736
+
737
+ .cnfy-article-modal-close-btn {
738
+ color: var(--cnfy-gray-400);
739
+ background: none;
740
+ border: none;
741
+ cursor: pointer;
742
+ transition: color 0.15s;
743
+ padding: 0;
744
+ font-size: 1.25rem;
745
+ line-height: 1;
746
+ }
747
+
748
+ .cnfy-article-modal-close-btn:hover {
749
+ color: var(--cnfy-gray-700);
750
+ }
751
+
752
+ .cnfy-article-modal-body {
753
+ padding: 1.25rem 1.5rem;
754
+ max-height: 65vh;
755
+ overflow-y: auto;
756
+ }
757
+
758
+ .cnfy-article-modal-content {
759
+ max-width: none;
760
+ color: var(--cnfy-gray-800);
761
+ font-size: 0.875rem;
762
+ line-height: 1.7;
763
+ }
764
+
765
+ .cnfy-article-modal-footer {
766
+ display: flex;
767
+ align-items: center;
768
+ justify-content: space-between;
769
+ padding: 1rem 1.5rem;
770
+ border-top: 1px solid var(--cnfy-gray-200);
771
+ background-color: var(--cnfy-gray-50);
772
+ border-radius: 0 0 0.75rem 0.75rem;
773
+ }
774
+
775
+ .cnfy-article-modal-footer-text {
776
+ font-size: 0.75rem;
777
+ color: var(--cnfy-gray-400);
778
+ }
779
+
780
+ .cnfy-article-modal-footer-actions {
781
+ display: flex;
782
+ gap: 0.5rem;
783
+ }
784
+
785
+ .cnfy-btn-cancel {
786
+ padding: 0.5rem 1rem;
787
+ font-size: 0.875rem;
788
+ border-radius: 0.375rem;
789
+ border: 1px solid var(--cnfy-gray-300);
790
+ color: var(--cnfy-gray-700);
791
+ background: none;
792
+ cursor: pointer;
793
+ transition: background-color 0.15s;
794
+ }
795
+
796
+ .cnfy-btn-cancel:hover {
797
+ background-color: var(--cnfy-gray-100);
798
+ }
799
+
800
+ .cnfy-btn-recreate {
801
+ padding: 0.5rem 1rem;
802
+ font-size: 0.875rem;
803
+ border-radius: 0.375rem;
804
+ background-color: var(--cnfy-gray-900);
805
+ color: var(--cnfy-white);
806
+ border: none;
807
+ cursor: pointer;
808
+ transition: background-color 0.15s;
809
+ }
810
+
811
+ .cnfy-btn-recreate:hover {
812
+ background-color: var(--cnfy-black);
813
+ }
814
+
815
+ /* ========================================
816
+ EditModal.tsx
817
+ ======================================== */
818
+ .cnfy-edit-modal-overlay {
819
+ position: fixed;
820
+ inset: 0;
821
+ z-index: 50;
822
+ display: flex;
823
+ align-items: center;
824
+ justify-content: center;
825
+ }
826
+
827
+ .cnfy-edit-modal-backdrop {
828
+ position: absolute;
829
+ inset: 0;
830
+ background-color: rgba(0, 0, 0, 0.5);
831
+ }
832
+
833
+ .cnfy-edit-modal {
834
+ position: relative;
835
+ width: 100%;
836
+ height: 100%;
837
+ max-width: 64rem;
838
+ max-height: 90vh;
839
+ margin: 1rem;
840
+ background-color: var(--cnfy-white);
841
+ border-radius: 0.75rem;
842
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
843
+ display: flex;
844
+ flex-direction: column;
845
+ overflow: hidden;
846
+ }
847
+
848
+ .cnfy-edit-modal-header {
849
+ display: flex;
850
+ align-items: center;
851
+ justify-content: space-between;
852
+ padding: 1rem 1.5rem;
853
+ border-bottom: 1px solid var(--cnfy-gray-200);
854
+ }
855
+
856
+ .cnfy-edit-modal-title {
857
+ font-size: 1.25rem;
858
+ font-weight: 600;
859
+ color: var(--cnfy-gray-900);
860
+ margin: 0;
861
+ }
862
+
863
+ .cnfy-edit-modal-close-btn {
864
+ padding: 0.5rem;
865
+ border-radius: 9999px;
866
+ background: none;
867
+ border: none;
868
+ cursor: pointer;
869
+ transition: background-color 0.15s;
870
+ display: flex;
871
+ align-items: center;
872
+ }
873
+
874
+ .cnfy-edit-modal-close-btn:hover {
875
+ background-color: var(--cnfy-gray-100);
876
+ }
877
+
878
+ .cnfy-edit-modal-close-icon {
879
+ color: var(--cnfy-gray-500);
880
+ }
881
+
882
+ .cnfy-edit-modal-body {
883
+ flex: 1;
884
+ overflow-y: auto;
885
+ padding: 1.5rem;
886
+ }
887
+
888
+ .cnfy-edit-modal-body > * + * {
889
+ margin-top: 1.5rem;
890
+ }
891
+
892
+ .cnfy-edit-label {
893
+ display: block;
894
+ font-size: 0.875rem;
895
+ font-weight: 500;
896
+ color: var(--cnfy-gray-700);
897
+ margin-bottom: 0.5rem;
898
+ }
899
+
900
+ .cnfy-keyword-list {
901
+ display: flex;
902
+ flex-wrap: wrap;
903
+ gap: 0.5rem;
904
+ margin-bottom: 0.75rem;
905
+ }
906
+
907
+ .cnfy-keyword-tag {
908
+ display: inline-flex;
909
+ align-items: center;
910
+ gap: 0.25rem;
911
+ padding: 0.25rem 0.75rem;
912
+ background-color: var(--cnfy-gray-100);
913
+ color: var(--cnfy-gray-700);
914
+ border-radius: 9999px;
915
+ font-size: 0.875rem;
916
+ }
917
+
918
+ .cnfy-keyword-remove-btn {
919
+ margin-left: 0.25rem;
920
+ color: var(--cnfy-gray-400);
921
+ background: none;
922
+ border: none;
923
+ cursor: pointer;
924
+ padding: 0;
925
+ display: flex;
926
+ align-items: center;
927
+ }
928
+
929
+ .cnfy-keyword-remove-btn:hover {
930
+ color: var(--cnfy-gray-600);
931
+ }
932
+
933
+ .cnfy-keyword-input-row {
934
+ display: flex;
935
+ gap: 0.5rem;
936
+ }
937
+
938
+ .cnfy-keyword-input {
939
+ flex: 1;
940
+ padding: 0.5rem 0.75rem;
941
+ border: 1px solid var(--cnfy-gray-300);
942
+ border-radius: 0.5rem;
943
+ font-size: 0.875rem;
944
+ outline: none;
945
+ }
946
+
947
+ .cnfy-keyword-input:focus {
948
+ box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.3);
949
+ border-color: var(--cnfy-primary);
950
+ }
951
+
952
+ .cnfy-btn-add-keyword {
953
+ padding: 0.5rem 1rem;
954
+ background-color: var(--cnfy-gray-100);
955
+ color: var(--cnfy-gray-700);
956
+ border-radius: 0.5rem;
957
+ font-size: 0.875rem;
958
+ font-weight: 500;
959
+ border: none;
960
+ cursor: pointer;
961
+ transition: background-color 0.15s;
962
+ }
963
+
964
+ .cnfy-btn-add-keyword:hover {
965
+ background-color: var(--cnfy-gray-200);
966
+ }
967
+
968
+ .cnfy-edit-modal-footer {
969
+ display: flex;
970
+ align-items: center;
971
+ justify-content: flex-end;
972
+ gap: 0.75rem;
973
+ padding: 1rem 1.5rem;
974
+ border-top: 1px solid var(--cnfy-gray-200);
975
+ background-color: var(--cnfy-gray-50);
976
+ }
977
+
978
+ .cnfy-btn-footer-cancel {
979
+ padding: 0.5rem 1rem;
980
+ color: var(--cnfy-gray-700);
981
+ font-size: 0.875rem;
982
+ font-weight: 500;
983
+ background: none;
984
+ border: none;
985
+ border-radius: 0.5rem;
986
+ cursor: pointer;
987
+ transition: background-color 0.15s;
988
+ }
989
+
990
+ .cnfy-btn-footer-cancel:hover {
991
+ background-color: var(--cnfy-gray-100);
992
+ }
993
+
994
+ .cnfy-btn-save-draft {
995
+ padding: 0.5rem 1rem;
996
+ background-color: var(--cnfy-gray-200);
997
+ color: var(--cnfy-gray-800);
998
+ font-size: 0.875rem;
999
+ font-weight: 500;
1000
+ border: none;
1001
+ border-radius: 0.5rem;
1002
+ cursor: pointer;
1003
+ transition: background-color 0.15s;
1004
+ }
1005
+
1006
+ .cnfy-btn-save-draft:hover {
1007
+ background-color: var(--cnfy-gray-300);
1008
+ }
1009
+
1010
+ .cnfy-btn-post-article {
1011
+ padding: 0.5rem 1rem;
1012
+ font-size: 0.875rem;
1013
+ font-weight: 500;
1014
+ border: none;
1015
+ border-radius: 0.5rem;
1016
+ cursor: pointer;
1017
+ transition: background-color 0.15s;
1018
+ color: var(--cnfy-white);
1019
+ }
1020
+
1021
+ /* ========================================
1022
+ RichTextEditor.tsx
1023
+ ======================================== */
1024
+ .cnfy-editor-loading {
1025
+ width: 100%;
1026
+ height: 400px;
1027
+ border: 1px solid var(--cnfy-gray-300);
1028
+ border-radius: 0.5rem;
1029
+ display: flex;
1030
+ align-items: center;
1031
+ justify-content: center;
1032
+ color: var(--cnfy-gray-400);
1033
+ }
1034
+
1035
+ .cnfy-editor {
1036
+ width: 100%;
1037
+ border: 1px solid var(--cnfy-gray-300);
1038
+ border-radius: 0.5rem;
1039
+ overflow: hidden;
1040
+ }
1041
+
1042
+ .cnfy-toolbar {
1043
+ display: flex;
1044
+ flex-wrap: wrap;
1045
+ align-items: center;
1046
+ gap: 0.25rem;
1047
+ padding: 0.5rem;
1048
+ border-bottom: 1px solid var(--cnfy-gray-200);
1049
+ background-color: var(--cnfy-gray-50);
1050
+ }
1051
+
1052
+ .cnfy-toolbar-btn {
1053
+ padding: 0.5rem;
1054
+ border-radius: 0.25rem;
1055
+ background: none;
1056
+ border: none;
1057
+ cursor: pointer;
1058
+ transition: background-color 0.15s;
1059
+ color: var(--cnfy-gray-600);
1060
+ display: flex;
1061
+ align-items: center;
1062
+ }
1063
+
1064
+ .cnfy-toolbar-btn:hover {
1065
+ background-color: var(--cnfy-gray-200);
1066
+ }
1067
+
1068
+ .cnfy-toolbar-btn--active {
1069
+ background-color: var(--cnfy-gray-200);
1070
+ color: var(--cnfy-emerald-600);
1071
+ }
1072
+
1073
+ .cnfy-toolbar-btn--disabled {
1074
+ opacity: 0.4;
1075
+ cursor: not-allowed;
1076
+ }
1077
+
1078
+ .cnfy-toolbar-divider {
1079
+ width: 1px;
1080
+ height: 1.5rem;
1081
+ background-color: var(--cnfy-gray-300);
1082
+ margin: 0 0.25rem;
1083
+ }
1084
+
1085
+ .cnfy-editor-content {
1086
+ min-height: 350px;
1087
+ }
1088
+
1089
+ /* ProseMirror */
38
1090
  .ProseMirror {
39
1091
  outline: none;
40
1092
  min-height: 350px;
1093
+ padding: 1rem;
41
1094
  }
42
1095
 
43
1096
  .ProseMirror h1 {
44
1097
  font-size: 1.5rem;
45
1098
  font-weight: 600;
46
- color: #111827;
1099
+ color: var(--cnfy-gray-900);
47
1100
  margin-bottom: 0.75rem;
48
1101
  line-height: 1.3;
49
1102
  }
@@ -51,14 +1104,14 @@
51
1104
  .ProseMirror h2 {
52
1105
  font-size: 1.125rem;
53
1106
  font-weight: 600;
54
- color: #1f2937;
1107
+ color: var(--cnfy-gray-800);
55
1108
  margin-top: 1.25rem;
56
1109
  margin-bottom: 0.5rem;
57
1110
  line-height: 1.4;
58
1111
  }
59
1112
 
60
1113
  .ProseMirror p {
61
- color: #374151;
1114
+ color: var(--cnfy-gray-700);
62
1115
  margin-bottom: 0.75rem;
63
1116
  line-height: 1.7;
64
1117
  }
@@ -79,7 +1132,7 @@
79
1132
 
80
1133
  .ProseMirror li {
81
1134
  margin-bottom: 0.25rem;
82
- color: #374151;
1135
+ color: var(--cnfy-gray-700);
83
1136
  }
84
1137
 
85
1138
  .ProseMirror strong {
@@ -90,21 +1143,287 @@
90
1143
  font-style: italic;
91
1144
  }
92
1145
 
93
- /* TipTap Placeholder */
94
1146
  .ProseMirror p.is-editor-empty:first-child::before {
95
1147
  content: attr(data-placeholder);
96
1148
  float: left;
97
- color: #9ca3af;
1149
+ color: var(--cnfy-gray-400);
98
1150
  pointer-events: none;
99
1151
  height: 0;
100
1152
  }
101
1153
 
102
- /* Marquee animation */
103
- @keyframes marquee {
104
- 0% {
105
- transform: translateX(0%);
106
- }
107
- 100% {
108
- transform: translateX(-100%);
109
- }
1154
+ /* ========================================
1155
+ TypingIndicator.tsx
1156
+ ======================================== */
1157
+ .cnfy-typing {
1158
+ display: flex;
1159
+ gap: 0.25rem;
1160
+ align-items: center;
1161
+ padding: 0.5rem;
1162
+ }
1163
+
1164
+ .cnfy-typing-dot {
1165
+ width: 0.5rem;
1166
+ height: 0.5rem;
1167
+ background-color: var(--cnfy-gray-400);
1168
+ border-radius: 9999px;
1169
+ animation: cnfy-bounce 1s infinite;
1170
+ }
1171
+
1172
+ /* ========================================
1173
+ CategoryBar.tsx
1174
+ ======================================== */
1175
+ .cnfy-category-bar {
1176
+ display: flex;
1177
+ gap: 0.5rem;
1178
+ border-bottom: 1px solid var(--cnfy-gray-300);
1179
+ padding: 0.75rem 1rem;
1180
+ background-color: var(--cnfy-white);
1181
+ position: sticky;
1182
+ top: 0;
1183
+ }
1184
+
1185
+ .cnfy-category-btn {
1186
+ padding: 0.375rem 0.75rem;
1187
+ font-size: 0.875rem;
1188
+ border-radius: 0.375rem;
1189
+ transition: background-color 0.15s, color 0.15s;
1190
+ border: none;
1191
+ cursor: pointer;
1192
+ background: none;
1193
+ color: var(--cnfy-gray-600);
1194
+ }
1195
+
1196
+ .cnfy-category-btn:hover {
1197
+ background-color: var(--cnfy-gray-100);
1198
+ }
1199
+
1200
+ .cnfy-category-btn--active {
1201
+ background-color: var(--cnfy-gray-900);
1202
+ color: var(--cnfy-white);
1203
+ }
1204
+
1205
+ /* ========================================
1206
+ TrendingNews.tsx
1207
+ ======================================== */
1208
+ .cnfy-trending-loading {
1209
+ padding: 1rem;
1210
+ font-size: 0.875rem;
1211
+ color: var(--cnfy-gray-500);
1212
+ }
1213
+
1214
+ .cnfy-trending-empty {
1215
+ padding: 1rem;
1216
+ font-size: 0.875rem;
1217
+ color: var(--cnfy-gray-500);
1218
+ text-align: center;
1219
+ }
1220
+
1221
+ .cnfy-trending-empty-hint {
1222
+ margin-top: 0.25rem;
1223
+ font-size: 0.75rem;
1224
+ }
1225
+
1226
+ /* ========================================
1227
+ NewsList.tsx
1228
+ ======================================== */
1229
+ .cnfy-news-list {
1230
+ padding: 1rem;
1231
+ }
1232
+
1233
+ .cnfy-news-list > * + * {
1234
+ margin-top: 0.75rem;
1235
+ }
1236
+
1237
+ .cnfy-news-card {
1238
+ display: flex;
1239
+ align-items: flex-start;
1240
+ justify-content: space-between;
1241
+ gap: 0.75rem;
1242
+ border-radius: 0.5rem;
1243
+ border: 1px solid var(--cnfy-gray-200);
1244
+ background-color: var(--cnfy-white);
1245
+ padding: 0.75rem;
1246
+ font-size: 0.875rem;
1247
+ transition: background-color 0.15s;
1248
+ }
1249
+
1250
+ .cnfy-news-card:hover {
1251
+ background-color: var(--cnfy-gray-50);
1252
+ }
1253
+
1254
+ .cnfy-news-card-content {
1255
+ min-width: 0;
1256
+ }
1257
+
1258
+ .cnfy-news-card-title {
1259
+ font-weight: 700;
1260
+ color: var(--cnfy-gray-900);
1261
+ display: -webkit-box;
1262
+ -webkit-line-clamp: 2;
1263
+ -webkit-box-orient: vertical;
1264
+ overflow: hidden;
1265
+ margin: 0;
1266
+ }
1267
+
1268
+ .cnfy-news-card-meta {
1269
+ display: flex;
1270
+ flex-wrap: wrap;
1271
+ align-items: center;
1272
+ gap: 0.5rem;
1273
+ margin-top: 0.5rem;
1274
+ font-size: 0.75rem;
1275
+ color: var(--cnfy-gray-500);
1276
+ }
1277
+
1278
+ .cnfy-news-badge {
1279
+ display: inline-flex;
1280
+ align-items: center;
1281
+ border-radius: 9999px;
1282
+ padding: 0.125rem 0.5rem;
1283
+ font-weight: 500;
1284
+ border: 1px solid;
1285
+ }
1286
+
1287
+ .cnfy-news-card-category {
1288
+ text-transform: capitalize;
1289
+ }
1290
+
1291
+ .cnfy-news-card-actions {
1292
+ display: flex;
1293
+ flex-direction: column;
1294
+ gap: 0.5rem;
1295
+ flex-shrink: 0;
1296
+ }
1297
+
1298
+ .cnfy-news-action-btn {
1299
+ padding: 0.25rem;
1300
+ color: var(--cnfy-gray-400);
1301
+ background: none;
1302
+ border: none;
1303
+ cursor: pointer;
1304
+ transition: color 0.15s;
1305
+ display: flex;
1306
+ align-items: center;
1307
+ }
1308
+
1309
+ .cnfy-news-action-btn:hover {
1310
+ color: var(--cnfy-gray-700);
1311
+ }
1312
+
1313
+ /* ========================================
1314
+ SourceSelector.tsx
1315
+ ======================================== */
1316
+ .cnfy-source-selector {
1317
+ padding: 0.5rem 0.75rem;
1318
+ border-bottom: 1px solid var(--cnfy-gray-100);
1319
+ display: flex;
1320
+ align-items: center;
1321
+ gap: 0.5rem;
1322
+ }
1323
+
1324
+ .cnfy-source-select-wrap {
1325
+ flex: 1;
1326
+ min-width: 180px;
1327
+ }
1328
+
1329
+ .cnfy-scrape-btn {
1330
+ display: flex;
1331
+ align-items: center;
1332
+ gap: 0.375rem;
1333
+ padding: 0.5rem 0.75rem;
1334
+ background-color: var(--cnfy-emerald-600);
1335
+ color: var(--cnfy-white);
1336
+ border-radius: 0.5rem;
1337
+ font-size: 0.875rem;
1338
+ font-weight: 500;
1339
+ border: none;
1340
+ cursor: pointer;
1341
+ transition: background-color 0.15s;
1342
+ }
1343
+
1344
+ .cnfy-scrape-btn:hover {
1345
+ background-color: var(--cnfy-emerald-700);
1346
+ }
1347
+
1348
+ .cnfy-scrape-btn:disabled {
1349
+ opacity: 0.5;
1350
+ cursor: not-allowed;
1351
+ }
1352
+
1353
+ .cnfy-refresh-btn {
1354
+ display: flex;
1355
+ align-items: center;
1356
+ gap: 0.25rem;
1357
+ padding: 0.5rem 0.75rem;
1358
+ font-size: 0.875rem;
1359
+ color: var(--cnfy-gray-600);
1360
+ border: 1px solid var(--cnfy-gray-200);
1361
+ border-radius: 0.5rem;
1362
+ background: none;
1363
+ cursor: pointer;
1364
+ transition: color 0.15s;
1365
+ }
1366
+
1367
+ .cnfy-refresh-btn:hover {
1368
+ color: var(--cnfy-gray-900);
1369
+ }
1370
+
1371
+ /* ========================================
1372
+ Modal.tsx (UI)
1373
+ ======================================== */
1374
+ .cnfy-modal-overlay {
1375
+ position: fixed;
1376
+ inset: 0;
1377
+ z-index: 50;
1378
+ display: flex;
1379
+ align-items: center;
1380
+ justify-content: center;
1381
+ }
1382
+
1383
+ .cnfy-modal-backdrop {
1384
+ position: absolute;
1385
+ inset: 0;
1386
+ background-color: rgba(0, 0, 0, 0.3);
1387
+ }
1388
+
1389
+ .cnfy-modal-content {
1390
+ position: relative;
1391
+ width: 100%;
1392
+ max-width: 28rem;
1393
+ border-radius: 0.75rem;
1394
+ background-color: var(--cnfy-white);
1395
+ padding: 1.5rem;
1396
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
1397
+ }
1398
+
1399
+ .cnfy-modal-close-btn {
1400
+ position: absolute;
1401
+ right: 1rem;
1402
+ top: 1rem;
1403
+ color: var(--cnfy-gray-400);
1404
+ background: none;
1405
+ border: none;
1406
+ cursor: pointer;
1407
+ padding: 0;
1408
+ display: flex;
1409
+ align-items: center;
1410
+ }
1411
+
1412
+ .cnfy-modal-close-btn:hover {
1413
+ color: var(--cnfy-gray-600);
1414
+ }
1415
+
1416
+ .cnfy-modal-title {
1417
+ margin-bottom: 1rem;
1418
+ font-size: 1.125rem;
1419
+ font-weight: 600;
1420
+ margin-top: 0;
1421
+ }
1422
+
1423
+ /* ========================================
1424
+ React Select portal fix
1425
+ ======================================== */
1426
+ .react-select__menu-portal {
1427
+ pointer-events: auto !important;
1428
+ z-index: 999999 !important;
110
1429
  }