@contenify/chatbot 0.1.2 → 0.1.5

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,1107 @@
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
+ z-index: 40;
220
+ background-color: var(--cnfy-white);
221
+ border-bottom: 1px solid var(--cnfy-gray-200);
222
+ position: sticky;
223
+ top: 0;
224
+ width: 95%;
225
+ margin-left: auto;
226
+ margin-right: auto;
227
+ }
228
+
229
+ .cnfy-header-inner {
230
+ margin: 0 auto;
231
+ display: flex;
232
+ height: 3.5rem;
233
+ align-items: center;
234
+ justify-content: space-between;
235
+ padding: 0 1rem;
236
+ }
237
+
238
+ .cnfy-header-left {
239
+ display: flex;
240
+ align-items: center;
241
+ gap: 0.75rem;
242
+ cursor: pointer;
243
+ }
244
+
245
+ .cnfy-header-logo-img {
246
+ height: 2rem;
247
+ width: 2rem;
248
+ border-radius: 0.375rem;
249
+ object-fit: cover;
250
+ }
251
+
252
+ .cnfy-header-logo-fallback {
253
+ height: 2rem;
254
+ width: 2rem;
255
+ border-radius: 0.375rem;
256
+ color: var(--cnfy-white);
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ font-weight: 700;
261
+ font-size: 0.875rem;
262
+ }
263
+
264
+ .cnfy-header-brand {
265
+ font-weight: 600;
266
+ color: var(--cnfy-gray-900);
267
+ font-size: 1rem;
268
+ }
269
+
270
+ .cnfy-header-right {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 0.75rem;
274
+ }
275
+
276
+ /* ========================================
277
+ UserMenu.tsx
278
+ ======================================== */
279
+ .cnfy-user-menu {
280
+ position: relative;
281
+ }
282
+
283
+ .cnfy-user-menu-trigger {
284
+ padding: 0.5rem;
285
+ border-radius: 9999px;
286
+ background: none;
287
+ border: none;
288
+ cursor: pointer;
289
+ transition: background-color 0.15s;
290
+ display: flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ }
294
+
295
+ .cnfy-user-menu-trigger:hover {
296
+ background-color: var(--cnfy-gray-100);
297
+ }
298
+
299
+ .cnfy-user-menu-trigger-icon {
300
+ color: var(--cnfy-gray-600);
301
+ }
302
+
303
+ .cnfy-dropdown {
304
+ position: absolute;
305
+ right: 0;
306
+ top: 100%;
307
+ margin-bottom: 0.5rem;
308
+ width: 13rem;
309
+ background-color: var(--cnfy-white);
310
+ border: 1px solid var(--cnfy-gray-200);
311
+ border-radius: 0.5rem;
312
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
313
+ z-index: 50;
314
+ }
315
+
316
+ .cnfy-dropdown-divider {
317
+ border-top: 1px solid var(--cnfy-gray-300);
318
+ margin: 0.25rem 0;
13
319
  }
14
320
 
15
- /* Chat scroll container */
16
- .chat-scroll {
17
- overflow-y: auto !important;
321
+ .cnfy-menu-item {
322
+ width: 100%;
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 0.5rem;
326
+ padding: 0.5rem 1rem;
327
+ font-size: 0.875rem;
328
+ transition: background-color 0.15s;
329
+ background: none;
330
+ border: none;
331
+ cursor: pointer;
332
+ text-align: left;
333
+ color: var(--cnfy-gray-700);
334
+ }
335
+
336
+ .cnfy-menu-item:hover {
337
+ background-color: var(--cnfy-gray-100);
338
+ }
339
+
340
+ .cnfy-menu-item--danger {
341
+ color: var(--cnfy-red-600);
342
+ }
343
+
344
+ .cnfy-menu-item--danger:hover {
345
+ background-color: var(--cnfy-red-50);
346
+ }
347
+
348
+ /* ========================================
349
+ ChatWindow.tsx
350
+ ======================================== */
351
+ .cnfy-chat {
352
+ height: 100%;
353
+ display: flex;
354
+ width: 100%;
355
+ flex-direction: column;
356
+ }
357
+
358
+ .cnfy-chat-area {
359
+ flex: 1;
360
+ padding: 1rem 1rem 1.5rem;
361
+ }
362
+
363
+ .cnfy-chat-scroll {
364
+ max-width: 48rem;
365
+ overflow-y: auto;
18
366
  height: 73vh;
367
+ margin: 0 auto;
19
368
  }
20
369
 
21
- /* Chat input textarea */
22
- .input_box_textarea {
23
- height: 50px !important;
24
- border-radius: 50px;
25
- padding-top: 10px !important;
26
- padding-bottom: 10px;
27
- padding-left: 30px;
28
- padding-right: 30px;
370
+ .cnfy-chat-scroll > * + * {
371
+ margin-top: 1.5rem;
29
372
  }
30
373
 
31
- /* Sticky top utility */
32
- .staky-top {
33
- position: sticky;
34
- top: 0px;
374
+ .cnfy-msg {
375
+ display: flex;
376
+ gap: 0.75rem;
377
+ }
378
+
379
+ .cnfy-msg-avatar-wrap {
380
+ flex-shrink: 0;
381
+ }
382
+
383
+ .cnfy-msg-avatar {
384
+ height: 2rem;
385
+ width: 2rem;
386
+ border-radius: 9999px;
387
+ display: flex;
388
+ align-items: center;
389
+ justify-content: center;
390
+ font-size: 0.75rem;
391
+ font-weight: 600;
392
+ color: var(--cnfy-white);
393
+ }
394
+
395
+ .cnfy-msg-body {
396
+ flex: 1;
397
+ font-size: 0.875rem;
398
+ line-height: 1.625;
399
+ }
400
+
401
+ .cnfy-msg-body > * + * {
402
+ margin-top: 0.75rem;
403
+ }
404
+
405
+ .cnfy-msg-copy-row {
406
+ display: flex;
407
+ justify-content: flex-end;
408
+ margin-top: -0.25rem;
409
+ margin-bottom: 0.5rem;
410
+ }
411
+
412
+ .cnfy-msg-copy-btn {
413
+ padding: 0.375rem;
414
+ border-radius: 0.375rem;
415
+ background: none;
416
+ border: none;
417
+ cursor: pointer;
418
+ transition: background-color 0.15s, color 0.15s;
419
+ color: var(--cnfy-gray-400);
420
+ display: flex;
421
+ align-items: center;
422
+ }
423
+
424
+ .cnfy-msg-copy-btn:hover {
425
+ background-color: var(--cnfy-gray-100);
426
+ color: var(--cnfy-gray-600);
427
+ }
428
+
429
+ .cnfy-msg-copy-btn--copied {
430
+ color: var(--cnfy-emerald-600);
431
+ }
432
+
433
+ .cnfy-msg-h1 {
434
+ font-size: 0.875rem;
435
+ font-weight: 600;
436
+ margin: 0;
437
+ }
438
+
439
+ .cnfy-msg-h2 {
440
+ font-size: 1rem;
441
+ font-weight: 600;
442
+ margin-top: 1rem;
443
+ }
444
+
445
+ .cnfy-msg-p {
446
+ color: var(--cnfy-gray-800);
447
+ margin: 0;
448
+ }
449
+
450
+ .cnfy-msg-keywords {
451
+ padding-top: 1rem;
452
+ border-top: 1px solid var(--cnfy-gray-200);
453
+ margin-top: 1.5rem;
454
+ }
455
+
456
+ .cnfy-msg-keywords-list {
457
+ display: flex;
458
+ flex-wrap: wrap;
459
+ gap: 0.5rem;
460
+ }
461
+
462
+ .cnfy-msg-keyword-tag {
463
+ font-size: 0.75rem;
464
+ padding: 0.25rem 0.75rem;
465
+ border-radius: 9999px;
466
+ background-color: var(--cnfy-gray-100);
467
+ color: var(--cnfy-gray-700);
468
+ }
469
+
470
+ .cnfy-msg-actions {
471
+ display: flex;
472
+ flex-wrap: wrap;
473
+ gap: 0.5rem;
474
+ padding-top: 1rem;
475
+ margin-top: 0.5rem;
476
+ }
477
+
478
+ .cnfy-msg-action-btn {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: 0.5rem;
482
+ padding: 0.5rem 1rem;
483
+ border: 1px solid var(--cnfy-gray-200);
484
+ border-radius: 0.5rem;
485
+ font-size: 0.875rem;
486
+ font-weight: 500;
487
+ color: var(--cnfy-gray-700);
488
+ background: none;
489
+ cursor: pointer;
490
+ transition: background-color 0.15s, border-color 0.15s;
491
+ }
492
+
493
+ .cnfy-msg-action-btn:hover {
494
+ background-color: var(--cnfy-gray-50);
495
+ border-color: var(--cnfy-gray-300);
496
+ }
497
+
498
+ .cnfy-msg-edit-actions {
499
+ display: flex;
500
+ gap: 0.75rem;
501
+ padding-top: 1rem;
502
+ margin-top: 0.5rem;
503
+ }
504
+
505
+ .cnfy-btn-edit {
506
+ display: flex;
507
+ align-items: center;
508
+ gap: 0.5rem;
509
+ padding: 0.5rem 1rem;
510
+ border: 1px solid var(--cnfy-gray-300);
511
+ border-radius: 0.5rem;
512
+ font-size: 0.875rem;
513
+ font-weight: 500;
514
+ color: var(--cnfy-gray-700);
515
+ background: none;
516
+ cursor: pointer;
517
+ transition: background-color 0.15s;
518
+ }
519
+
520
+ .cnfy-btn-edit:hover {
521
+ background-color: var(--cnfy-gray-50);
522
+ }
523
+
524
+ .cnfy-btn-post {
525
+ display: flex;
526
+ align-items: center;
527
+ gap: 0.5rem;
528
+ padding: 0.5rem 1rem;
529
+ border-radius: 0.5rem;
530
+ font-size: 0.875rem;
531
+ font-weight: 500;
532
+ color: var(--cnfy-white);
533
+ background: none;
534
+ border: none;
535
+ cursor: pointer;
536
+ transition: background-color 0.15s;
537
+ }
538
+
539
+ /* Input Area */
540
+ .cnfy-input-area {
541
+ flex-shrink: 0;
542
+ background-color: var(--cnfy-white);
543
+ padding: 0.75rem 1rem;
544
+ }
545
+
546
+ .cnfy-input-inner {
547
+ max-width: 48rem;
548
+ margin: 0 auto;
549
+ position: relative;
550
+ display: flex;
551
+ gap: 0.5rem;
552
+ align-items: flex-end;
553
+ }
554
+
555
+ .cnfy-news-trigger-wrap {
556
+ position: absolute;
557
+ left: 0.75rem;
558
+ top: 50%;
559
+ transform: translateY(-50%);
560
+ z-index: 10;
561
+ }
562
+
563
+ .cnfy-news-trigger-btn {
564
+ display: flex;
565
+ height: 2rem;
566
+ width: 2rem;
567
+ align-items: center;
568
+ justify-content: center;
569
+ border-radius: 9999px;
570
+ background: linear-gradient(to right, var(--cnfy-purple-500), var(--cnfy-pink-500));
571
+ color: var(--cnfy-white);
572
+ border: none;
573
+ cursor: pointer;
574
+ transition: all 0.15s;
575
+ animation: cnfy-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
576
+ }
577
+
578
+ .cnfy-news-trigger-btn:hover {
579
+ background: linear-gradient(to right, var(--cnfy-purple-600), var(--cnfy-pink-600));
580
+ animation: none;
581
+ }
582
+
583
+ /* News Dropdown */
584
+ .cnfy-news-dropdown {
585
+ background-color: var(--cnfy-white);
586
+ border: 1px solid var(--cnfy-gray-200);
587
+ border-radius: .5rem;
588
+ width: 600px;
589
+ max-height: 600px;
590
+ margin-bottom: .5rem;
591
+ position: absolute;
592
+ bottom: 100%;
593
+ left: 0;
594
+ z-index: 9999;
595
+ overflow: hidden;
596
+ box-shadow: 0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;
597
+ }
598
+
599
+ .cnfy-news-dropdown-header {
600
+ display: flex;
601
+ align-items: center;
602
+ justify-content: space-between;
603
+ padding: 0.5rem 0.75rem;
604
+ border-bottom: 1px solid var(--cnfy-gray-100);
605
+ }
606
+
607
+ .cnfy-news-dropdown-title {
608
+ font-size: 0.875rem;
609
+ font-weight: 500;
610
+ color: var(--cnfy-white);
611
+ }
612
+
613
+ .cnfy-news-dropdown-close {
614
+ padding: 0.25rem;
615
+ border-radius: 0.25rem;
616
+ border: none;
617
+ cursor: pointer;
618
+ transition: background-color 0.15s;
619
+ display: flex;
620
+ align-items: center;
621
+ }
622
+
623
+ .cnfy-news-dropdown-close:hover {
624
+ opacity: 0.8;
625
+ }
626
+
627
+ .cnfy-news-dropdown-source-bar {
628
+ padding: 0.5rem 0.75rem;
629
+ border-bottom: 1px solid var(--cnfy-gray-100);
630
+ display: flex;
631
+ align-items: center;
632
+ gap: 0.5rem;
633
+ }
634
+
635
+ .cnfy-news-dropdown-select-wrap {
636
+ flex: 1;
637
+ min-width: 180px;
638
+ margin-right: 10px;
639
+ }
640
+
641
+ .cnfy-news-dropdown-list {
642
+ overflow-y: auto;
643
+ max-height: 320px;
644
+ }
645
+
646
+ .cnfy-news-dropdown-empty {
647
+ padding: 1rem;
648
+ text-align: center;
649
+ font-size: 0.875rem;
650
+ color: var(--cnfy-gray-500);
651
+ }
652
+
653
+ .cnfy-news-dropdown-empty-hint {
654
+ margin-top: 0.25rem;
655
+ font-size: 0.75rem;
656
+ }
657
+
658
+ /* Chat textarea */
659
+ .cnfy-chat-textarea {
660
+ resize: none;
661
+ border: 1px solid var(--cnfy-gray-300);
662
+ border-radius: 50px;
663
+ outline: none;
664
+ flex: 1;
665
+ height: 50px !important;
666
+ padding: 15px 55px 10px 42px;
667
+ font-family: inherit;
668
+ font-size: .875rem;
669
+ overflow: hidden;
670
+ }
671
+
672
+ .cnfy-chat-textarea--with-trigger {
673
+ padding-left: 3.5rem;
674
+ }
675
+
676
+ .cnfy-chat-textarea:focus {
677
+ border-color: var(--cnfy-gray-400);
678
+ }
679
+
680
+ .cnfy-send-btn {
681
+ display: flex;
682
+ height: 2.5rem;
683
+ width: 2.5rem;
684
+ position: absolute;
685
+ right: 10px;
686
+ top: 5px;
687
+ align-items: center;
688
+ justify-content: center;
689
+ border-radius: 9999px;
690
+ border: none;
691
+ cursor: pointer;
692
+ color: var(--cnfy-white);
693
+ }
694
+
695
+ /* ========================================
696
+ ArticleModal.tsx
697
+ ======================================== */
698
+ .cnfy-article-modal-overlay {
699
+ position: fixed;
700
+ inset: 0;
701
+ z-index: 50;
702
+ background-color: rgba(0, 0, 0, 0.5);
703
+ backdrop-filter: blur(4px);
704
+ display: flex;
705
+ align-items: center;
706
+ justify-content: center;
707
+ padding: 0 1rem;
708
+ }
709
+
710
+ .cnfy-article-modal {
711
+ position: relative;
712
+ width: 100%;
713
+ max-width: 48rem;
714
+ background-color: var(--cnfy-white);
715
+ border-radius: 0.75rem;
716
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
717
+ border: 1px solid var(--cnfy-gray-200);
718
+ }
719
+
720
+ .cnfy-article-modal-header {
721
+ display: flex;
722
+ align-items: flex-start;
723
+ justify-content: space-between;
724
+ padding: 1rem 1.5rem;
725
+ border-bottom: 1px solid var(--cnfy-gray-300);
726
+ }
727
+
728
+ .cnfy-article-modal-source {
729
+ font-size: 0.75rem;
730
+ color: var(--cnfy-gray-500);
731
+ margin-bottom: 0.25rem;
732
+ }
733
+
734
+ .cnfy-article-modal-title {
735
+ font-size: 1.125rem;
736
+ font-weight: 600;
737
+ color: var(--cnfy-gray-900);
738
+ line-height: 1.4;
739
+ margin: 0;
740
+ }
741
+
742
+ .cnfy-article-modal-close-btn {
743
+ color: var(--cnfy-gray-400);
744
+ background: none;
745
+ border: none;
746
+ cursor: pointer;
747
+ transition: color 0.15s;
748
+ padding: 0;
749
+ font-size: 1.25rem;
750
+ line-height: 1;
751
+ }
752
+
753
+ .cnfy-article-modal-close-btn:hover {
754
+ color: var(--cnfy-gray-700);
755
+ }
756
+
757
+ .cnfy-article-modal-body {
758
+ padding: 1.25rem 1.5rem;
759
+ max-height: 65vh;
760
+ overflow-y: auto;
761
+ }
762
+
763
+ .cnfy-article-modal-content {
764
+ max-width: none;
765
+ color: var(--cnfy-gray-800);
766
+ font-size: 0.875rem;
767
+ line-height: 1.7;
768
+ }
769
+
770
+ .cnfy-article-modal-footer {
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: space-between;
774
+ padding: 1rem 1.5rem;
775
+ border-top: 1px solid var(--cnfy-gray-200);
776
+ background-color: var(--cnfy-gray-50);
777
+ border-radius: 0 0 0.75rem 0.75rem;
778
+ }
779
+
780
+ .cnfy-article-modal-footer-text {
781
+ font-size: 0.75rem;
782
+ color: var(--cnfy-gray-400);
783
+ }
784
+
785
+ .cnfy-article-modal-footer-actions {
786
+ display: flex;
787
+ gap: 0.5rem;
788
+ }
789
+
790
+ .cnfy-btn-cancel {
791
+ padding: 0.5rem 1rem;
792
+ font-size: 0.875rem;
793
+ border-radius: 0.375rem;
794
+ border: 1px solid var(--cnfy-gray-300);
795
+ color: var(--cnfy-gray-700);
796
+ background: none;
797
+ cursor: pointer;
798
+ transition: background-color 0.15s;
799
+ }
800
+
801
+ .cnfy-btn-cancel:hover {
802
+ background-color: var(--cnfy-gray-100);
803
+ }
804
+
805
+ .cnfy-btn-recreate {
806
+ padding: 0.5rem 1rem;
807
+ font-size: 0.875rem;
808
+ border-radius: 0.375rem;
809
+ background-color: var(--cnfy-gray-900);
810
+ color: var(--cnfy-white);
811
+ border: none;
812
+ cursor: pointer;
813
+ transition: background-color 0.15s;
814
+ }
815
+
816
+ .cnfy-btn-recreate:hover {
817
+ background-color: var(--cnfy-black);
818
+ }
819
+
820
+ /* ========================================
821
+ EditModal.tsx
822
+ ======================================== */
823
+ .cnfy-edit-modal-overlay {
824
+ position: fixed;
825
+ inset: 0;
826
+ z-index: 50;
827
+ display: flex;
828
+ align-items: center;
829
+ justify-content: center;
830
+ }
831
+
832
+ .cnfy-edit-modal-backdrop {
833
+ position: absolute;
834
+ inset: 0;
835
+ background-color: rgba(0, 0, 0, 0.5);
836
+ }
837
+
838
+ .cnfy-edit-modal {
839
+ position: relative;
840
+ width: 100%;
841
+ height: 100%;
842
+ max-width: 64rem;
843
+ max-height: 90vh;
844
+ margin: 1rem;
845
+ background-color: var(--cnfy-white);
846
+ border-radius: 0.75rem;
847
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
848
+ display: flex;
849
+ flex-direction: column;
850
+ overflow: hidden;
851
+ }
852
+
853
+ .cnfy-edit-modal-header {
854
+ display: flex;
855
+ align-items: center;
856
+ justify-content: space-between;
857
+ padding: 1rem 1.5rem;
858
+ border-bottom: 1px solid var(--cnfy-gray-200);
859
+ }
860
+
861
+ .cnfy-edit-modal-title {
862
+ font-size: 1.25rem;
863
+ font-weight: 600;
864
+ color: var(--cnfy-gray-900);
865
+ margin: 0;
866
+ }
867
+
868
+ .cnfy-edit-modal-close-btn {
869
+ padding: 0.5rem;
870
+ border-radius: 9999px;
871
+ background: none;
872
+ border: none;
873
+ cursor: pointer;
874
+ transition: background-color 0.15s;
875
+ display: flex;
876
+ align-items: center;
877
+ }
878
+
879
+ .cnfy-edit-modal-close-btn:hover {
880
+ background-color: var(--cnfy-gray-100);
881
+ }
882
+
883
+ .cnfy-edit-modal-close-icon {
884
+ color: var(--cnfy-gray-500);
885
+ }
886
+
887
+ .cnfy-edit-modal-body {
888
+ flex: 1;
889
+ overflow-y: auto;
890
+ padding: 1.5rem;
891
+ }
892
+
893
+ .cnfy-edit-modal-body > * + * {
894
+ margin-top: 1.5rem;
35
895
  }
36
896
 
37
- /* TipTap Editor Styles */
897
+ .cnfy-edit-label {
898
+ display: block;
899
+ font-size: 0.875rem;
900
+ font-weight: 500;
901
+ color: var(--cnfy-gray-700);
902
+ margin-bottom: 0.5rem;
903
+ }
904
+
905
+ .cnfy-keyword-list {
906
+ display: flex;
907
+ flex-wrap: wrap;
908
+ gap: 0.5rem;
909
+ margin-bottom: 0.75rem;
910
+ }
911
+
912
+ .cnfy-keyword-tag {
913
+ display: inline-flex;
914
+ align-items: center;
915
+ gap: 0.25rem;
916
+ padding: 0.25rem 0.75rem;
917
+ background-color: var(--cnfy-gray-100);
918
+ color: var(--cnfy-gray-700);
919
+ border-radius: 9999px;
920
+ font-size: 0.875rem;
921
+ }
922
+
923
+ .cnfy-keyword-remove-btn {
924
+ margin-left: 0.25rem;
925
+ color: var(--cnfy-gray-400);
926
+ background: none;
927
+ border: none;
928
+ cursor: pointer;
929
+ padding: 0;
930
+ display: flex;
931
+ align-items: center;
932
+ }
933
+
934
+ .cnfy-keyword-remove-btn:hover {
935
+ color: var(--cnfy-gray-600);
936
+ }
937
+
938
+ .cnfy-keyword-input-row {
939
+ display: flex;
940
+ gap: 0.5rem;
941
+ }
942
+
943
+ .cnfy-keyword-input {
944
+ flex: 1;
945
+ padding: 0.5rem 0.75rem;
946
+ border: 1px solid var(--cnfy-gray-300);
947
+ border-radius: 0.5rem;
948
+ font-size: 0.875rem;
949
+ outline: none;
950
+ }
951
+
952
+ .cnfy-keyword-input:focus {
953
+ box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.3);
954
+ border-color: var(--cnfy-primary);
955
+ }
956
+
957
+ .cnfy-btn-add-keyword {
958
+ padding: 0.5rem 1rem;
959
+ background-color: var(--cnfy-gray-100);
960
+ color: var(--cnfy-gray-700);
961
+ border-radius: 0.5rem;
962
+ font-size: 0.875rem;
963
+ font-weight: 500;
964
+ border: none;
965
+ cursor: pointer;
966
+ transition: background-color 0.15s;
967
+ }
968
+
969
+ .cnfy-btn-add-keyword:hover {
970
+ background-color: var(--cnfy-gray-200);
971
+ }
972
+
973
+ .cnfy-edit-modal-footer {
974
+ display: flex;
975
+ align-items: center;
976
+ justify-content: flex-end;
977
+ gap: 0.75rem;
978
+ padding: 1rem 1.5rem;
979
+ border-top: 1px solid var(--cnfy-gray-200);
980
+ background-color: var(--cnfy-gray-50);
981
+ }
982
+
983
+ .cnfy-btn-footer-cancel {
984
+ padding: 0.5rem 1rem;
985
+ color: var(--cnfy-gray-700);
986
+ font-size: 0.875rem;
987
+ font-weight: 500;
988
+ background: none;
989
+ border: none;
990
+ border-radius: 0.5rem;
991
+ cursor: pointer;
992
+ transition: background-color 0.15s;
993
+ }
994
+
995
+ .cnfy-btn-footer-cancel:hover {
996
+ background-color: var(--cnfy-gray-100);
997
+ }
998
+
999
+ .cnfy-btn-save-draft {
1000
+ padding: 0.5rem 1rem;
1001
+ background-color: var(--cnfy-gray-200);
1002
+ color: var(--cnfy-gray-800);
1003
+ font-size: 0.875rem;
1004
+ font-weight: 500;
1005
+ border: none;
1006
+ border-radius: 0.5rem;
1007
+ cursor: pointer;
1008
+ transition: background-color 0.15s;
1009
+ }
1010
+
1011
+ .cnfy-btn-save-draft:hover {
1012
+ background-color: var(--cnfy-gray-300);
1013
+ }
1014
+
1015
+ .cnfy-btn-post-article {
1016
+ padding: 0.5rem 1rem;
1017
+ font-size: 0.875rem;
1018
+ font-weight: 500;
1019
+ border: none;
1020
+ border-radius: 0.5rem;
1021
+ cursor: pointer;
1022
+ transition: background-color 0.15s;
1023
+ color: var(--cnfy-white);
1024
+ }
1025
+
1026
+ /* ========================================
1027
+ RichTextEditor.tsx
1028
+ ======================================== */
1029
+ .cnfy-editor-loading {
1030
+ width: 100%;
1031
+ height: 400px;
1032
+ border: 1px solid var(--cnfy-gray-300);
1033
+ border-radius: 0.5rem;
1034
+ display: flex;
1035
+ align-items: center;
1036
+ justify-content: center;
1037
+ color: var(--cnfy-gray-400);
1038
+ }
1039
+
1040
+ .cnfy-editor {
1041
+ width: 100%;
1042
+ border: 1px solid var(--cnfy-gray-300);
1043
+ border-radius: 0.5rem;
1044
+ overflow: hidden;
1045
+ }
1046
+
1047
+ .cnfy-toolbar {
1048
+ display: flex;
1049
+ flex-wrap: wrap;
1050
+ align-items: center;
1051
+ gap: 0.25rem;
1052
+ padding: 0.5rem;
1053
+ border-bottom: 1px solid var(--cnfy-gray-200);
1054
+ background-color: var(--cnfy-gray-50);
1055
+ }
1056
+
1057
+ .cnfy-toolbar-btn {
1058
+ padding: 0.5rem;
1059
+ border-radius: 0.25rem;
1060
+ background: none;
1061
+ border: none;
1062
+ cursor: pointer;
1063
+ transition: background-color 0.15s;
1064
+ color: var(--cnfy-gray-600);
1065
+ display: flex;
1066
+ align-items: center;
1067
+ }
1068
+
1069
+ .cnfy-toolbar-btn:hover {
1070
+ background-color: var(--cnfy-gray-200);
1071
+ }
1072
+
1073
+ .cnfy-toolbar-btn--active {
1074
+ background-color: var(--cnfy-gray-200);
1075
+ color: var(--cnfy-emerald-600);
1076
+ }
1077
+
1078
+ .cnfy-toolbar-btn--disabled {
1079
+ opacity: 0.4;
1080
+ cursor: not-allowed;
1081
+ }
1082
+
1083
+ .cnfy-toolbar-divider {
1084
+ width: 1px;
1085
+ height: 1.5rem;
1086
+ background-color: var(--cnfy-gray-300);
1087
+ margin: 0 0.25rem;
1088
+ }
1089
+
1090
+ .cnfy-editor-content {
1091
+ min-height: 350px;
1092
+ }
1093
+
1094
+ /* ProseMirror */
38
1095
  .ProseMirror {
39
1096
  outline: none;
40
1097
  min-height: 350px;
1098
+ padding: 1rem;
41
1099
  }
42
1100
 
43
1101
  .ProseMirror h1 {
44
1102
  font-size: 1.5rem;
45
1103
  font-weight: 600;
46
- color: #111827;
1104
+ color: var(--cnfy-gray-900);
47
1105
  margin-bottom: 0.75rem;
48
1106
  line-height: 1.3;
49
1107
  }
@@ -51,14 +1109,14 @@
51
1109
  .ProseMirror h2 {
52
1110
  font-size: 1.125rem;
53
1111
  font-weight: 600;
54
- color: #1f2937;
1112
+ color: var(--cnfy-gray-800);
55
1113
  margin-top: 1.25rem;
56
1114
  margin-bottom: 0.5rem;
57
1115
  line-height: 1.4;
58
1116
  }
59
1117
 
60
1118
  .ProseMirror p {
61
- color: #374151;
1119
+ color: var(--cnfy-gray-700);
62
1120
  margin-bottom: 0.75rem;
63
1121
  line-height: 1.7;
64
1122
  }
@@ -79,7 +1137,7 @@
79
1137
 
80
1138
  .ProseMirror li {
81
1139
  margin-bottom: 0.25rem;
82
- color: #374151;
1140
+ color: var(--cnfy-gray-700);
83
1141
  }
84
1142
 
85
1143
  .ProseMirror strong {
@@ -90,21 +1148,662 @@
90
1148
  font-style: italic;
91
1149
  }
92
1150
 
93
- /* TipTap Placeholder */
94
1151
  .ProseMirror p.is-editor-empty:first-child::before {
95
1152
  content: attr(data-placeholder);
96
1153
  float: left;
97
- color: #9ca3af;
1154
+ color: var(--cnfy-gray-400);
98
1155
  pointer-events: none;
99
1156
  height: 0;
100
1157
  }
101
1158
 
102
- /* Marquee animation */
103
- @keyframes marquee {
104
- 0% {
105
- transform: translateX(0%);
106
- }
107
- 100% {
108
- transform: translateX(-100%);
1159
+ /* ========================================
1160
+ TypingIndicator.tsx
1161
+ ======================================== */
1162
+ .cnfy-typing {
1163
+ display: flex;
1164
+ gap: 0.25rem;
1165
+ align-items: center;
1166
+ padding: 0.5rem;
1167
+ }
1168
+
1169
+ .cnfy-typing-dot {
1170
+ width: 0.5rem;
1171
+ height: 0.5rem;
1172
+ background-color: var(--cnfy-gray-400);
1173
+ border-radius: 9999px;
1174
+ animation: cnfy-bounce 1s infinite;
1175
+ }
1176
+
1177
+ /* ========================================
1178
+ CategoryBar.tsx
1179
+ ======================================== */
1180
+ .cnfy-category-bar {
1181
+ display: flex;
1182
+ gap: 0.5rem;
1183
+ border-bottom: 1px solid var(--cnfy-gray-300);
1184
+ padding: 0.75rem 1rem;
1185
+ background-color: var(--cnfy-white);
1186
+ position: sticky;
1187
+ top: 0;
1188
+ }
1189
+
1190
+ .cnfy-category-btn {
1191
+ padding: 0.375rem 0.75rem;
1192
+ font-size: 0.875rem;
1193
+ border-radius: 0.375rem;
1194
+ transition: background-color 0.15s, color 0.15s;
1195
+ border: none;
1196
+ cursor: pointer;
1197
+ background: none;
1198
+ color: var(--cnfy-gray-600);
1199
+ }
1200
+
1201
+ .cnfy-category-btn:hover {
1202
+ background-color: var(--cnfy-gray-100);
1203
+ }
1204
+
1205
+ .cnfy-category-btn--active {
1206
+ background-color: var(--cnfy-gray-900);
1207
+ color: var(--cnfy-white);
1208
+ }
1209
+
1210
+ /* ========================================
1211
+ TrendingNews.tsx
1212
+ ======================================== */
1213
+ .cnfy-trending-loading {
1214
+ padding: 1rem;
1215
+ font-size: 0.875rem;
1216
+ color: var(--cnfy-gray-500);
1217
+ }
1218
+
1219
+ .cnfy-trending-empty {
1220
+ padding: 1rem;
1221
+ font-size: 0.875rem;
1222
+ color: var(--cnfy-gray-500);
1223
+ text-align: center;
1224
+ }
1225
+
1226
+ .cnfy-trending-empty-hint {
1227
+ margin-top: 0.25rem;
1228
+ font-size: 0.75rem;
1229
+ }
1230
+
1231
+ /* ========================================
1232
+ NewsList.tsx
1233
+ ======================================== */
1234
+ .cnfy-news-list {
1235
+ padding: 1rem;
1236
+ }
1237
+
1238
+ .cnfy-news-list > * + * {
1239
+ margin-top: 0.75rem;
1240
+ }
1241
+
1242
+ .cnfy-news-card {
1243
+ display: flex;
1244
+ align-items: flex-start;
1245
+ justify-content: space-between;
1246
+ gap: 0.75rem;
1247
+ border-radius: 0.5rem;
1248
+ border: 1px solid var(--cnfy-gray-200);
1249
+ background-color: var(--cnfy-white);
1250
+ padding: 0.75rem;
1251
+ font-size: 0.875rem;
1252
+ transition: background-color 0.15s;
1253
+ }
1254
+
1255
+ .cnfy-news-card:hover {
1256
+ background-color: var(--cnfy-gray-50);
1257
+ }
1258
+
1259
+ .cnfy-news-card-content {
1260
+ min-width: 0;
1261
+ }
1262
+
1263
+ .cnfy-news-card-title {
1264
+ font-weight: 700;
1265
+ color: var(--cnfy-gray-900);
1266
+ display: -webkit-box;
1267
+ -webkit-line-clamp: 2;
1268
+ -webkit-box-orient: vertical;
1269
+ overflow: hidden;
1270
+ margin: 0;
1271
+ }
1272
+
1273
+ .cnfy-news-card-meta {
1274
+ display: flex;
1275
+ flex-wrap: wrap;
1276
+ align-items: center;
1277
+ gap: 0.5rem;
1278
+ margin-top: 0.5rem;
1279
+ font-size: 0.75rem;
1280
+ color: var(--cnfy-gray-500);
1281
+ }
1282
+
1283
+ .cnfy-news-badge {
1284
+ display: inline-flex;
1285
+ align-items: center;
1286
+ border-radius: 9999px;
1287
+ padding: 0.125rem 0.5rem;
1288
+ font-weight: 500;
1289
+ border: 1px solid;
1290
+ }
1291
+
1292
+ .cnfy-news-card-category {
1293
+ text-transform: capitalize;
1294
+ }
1295
+
1296
+ .cnfy-news-card-actions {
1297
+ display: flex;
1298
+ flex-direction: column;
1299
+ gap: 0.5rem;
1300
+ flex-shrink: 0;
1301
+ }
1302
+
1303
+ .cnfy-news-action-btn {
1304
+ padding: 0.25rem;
1305
+ color: var(--cnfy-gray-400);
1306
+ background: none;
1307
+ border: none;
1308
+ cursor: pointer;
1309
+ transition: color 0.15s;
1310
+ display: flex;
1311
+ align-items: center;
1312
+ }
1313
+
1314
+ .cnfy-news-action-btn:hover {
1315
+ color: var(--cnfy-gray-700);
1316
+ }
1317
+
1318
+ /* ========================================
1319
+ SourceSelector.tsx
1320
+ ======================================== */
1321
+ .cnfy-source-selector {
1322
+ padding: 0.5rem 0.75rem;
1323
+ border-bottom: 1px solid var(--cnfy-gray-100);
1324
+ display: flex;
1325
+ align-items: center;
1326
+ gap: 0.5rem;
1327
+ }
1328
+
1329
+ .cnfy-source-select-wrap {
1330
+ flex: 1;
1331
+ min-width: 180px;
1332
+ }
1333
+
1334
+ .cnfy-scrape-btn {
1335
+ display: flex;
1336
+ align-items: center;
1337
+ gap: 0.375rem;
1338
+ padding: 0.5rem 0.75rem;
1339
+ background-color: var(--cnfy-emerald-600);
1340
+ color: var(--cnfy-white);
1341
+ border-radius: 0.5rem;
1342
+ font-size: 0.875rem;
1343
+ font-weight: 500;
1344
+ border: none;
1345
+ cursor: pointer;
1346
+ transition: background-color 0.15s;
1347
+ }
1348
+
1349
+ .cnfy-scrape-btn:hover {
1350
+ background-color: var(--cnfy-emerald-700);
1351
+ }
1352
+
1353
+ .cnfy-scrape-btn:disabled {
1354
+ opacity: 0.5;
1355
+ cursor: not-allowed;
1356
+ }
1357
+
1358
+ .cnfy-refresh-btn {
1359
+ display: flex;
1360
+ align-items: center;
1361
+ gap: 0.25rem;
1362
+ padding: 0.5rem 0.75rem;
1363
+ font-size: 0.875rem;
1364
+ color: var(--cnfy-gray-600);
1365
+ border: 1px solid var(--cnfy-gray-200);
1366
+ border-radius: 0.5rem;
1367
+ background: none;
1368
+ cursor: pointer;
1369
+ transition: color 0.15s;
1370
+ }
1371
+
1372
+ .cnfy-refresh-btn:hover {
1373
+ color: var(--cnfy-gray-900);
1374
+ }
1375
+
1376
+ /* ========================================
1377
+ Modal.tsx (UI)
1378
+ ======================================== */
1379
+ .cnfy-modal-overlay {
1380
+ position: fixed;
1381
+ inset: 0;
1382
+ z-index: 50;
1383
+ display: flex;
1384
+ align-items: center;
1385
+ justify-content: center;
1386
+ }
1387
+
1388
+ .cnfy-modal-backdrop {
1389
+ position: absolute;
1390
+ inset: 0;
1391
+ background-color: rgba(0, 0, 0, 0.3);
1392
+ }
1393
+
1394
+ .cnfy-modal-content {
1395
+ position: relative;
1396
+ width: 100%;
1397
+ max-width: 28rem;
1398
+ border-radius: 0.75rem;
1399
+ background-color: var(--cnfy-white);
1400
+ padding: 1.5rem;
1401
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
1402
+ }
1403
+
1404
+ .cnfy-modal-close-btn {
1405
+ position: absolute;
1406
+ right: 1rem;
1407
+ top: 1rem;
1408
+ color: var(--cnfy-gray-400);
1409
+ background: none;
1410
+ border: none;
1411
+ cursor: pointer;
1412
+ padding: 0;
1413
+ display: flex;
1414
+ align-items: center;
1415
+ }
1416
+
1417
+ .cnfy-modal-close-btn:hover {
1418
+ color: var(--cnfy-gray-600);
1419
+ }
1420
+
1421
+ .cnfy-modal-title {
1422
+ margin-bottom: 1rem;
1423
+ font-size: 1.125rem;
1424
+ font-weight: 600;
1425
+ margin-top: 0;
1426
+ }
1427
+
1428
+ /* ========================================
1429
+ Drawer.tsx
1430
+ ======================================== */
1431
+ @keyframes cnfy-slide-in-right {
1432
+ from { transform: translateX(100%); }
1433
+ to { transform: translateX(0); }
1434
+ }
1435
+
1436
+ @keyframes cnfy-fade-in {
1437
+ from { opacity: 0; }
1438
+ to { opacity: 1; }
1439
+ }
1440
+
1441
+ .cnfy-drawer-overlay {
1442
+ position: fixed;
1443
+ inset: 0;
1444
+ z-index: 50;
1445
+ display: flex;
1446
+ justify-content: flex-end;
1447
+ }
1448
+
1449
+ .cnfy-drawer-backdrop {
1450
+ position: absolute;
1451
+ inset: 0;
1452
+ background-color: rgba(0, 0, 0, 0.4);
1453
+ animation: cnfy-fade-in 0.2s ease-out;
1454
+ }
1455
+
1456
+ .cnfy-drawer-panel {
1457
+ position: relative;
1458
+ width: 50%;
1459
+ min-width: 360px;
1460
+ max-width: 720px;
1461
+ height: 100%;
1462
+ background-color: var(--cnfy-white);
1463
+ box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
1464
+ display: flex;
1465
+ flex-direction: column;
1466
+ animation: cnfy-slide-in-right 0.25s ease-out;
1467
+ }
1468
+
1469
+ @media (max-width: 768px) {
1470
+ .cnfy-drawer-panel {
1471
+ width: 100%;
1472
+ max-width: none;
109
1473
  }
110
1474
  }
1475
+
1476
+ .cnfy-drawer-header {
1477
+ display: flex;
1478
+ align-items: center;
1479
+ justify-content: space-between;
1480
+ padding: 1rem 1.5rem;
1481
+ border-bottom: 1px solid var(--cnfy-gray-200);
1482
+ flex-shrink: 0;
1483
+ }
1484
+
1485
+ .cnfy-drawer-title {
1486
+ font-size: 1.125rem;
1487
+ font-weight: 600;
1488
+ color: var(--cnfy-gray-900);
1489
+ margin: 0;
1490
+ }
1491
+
1492
+ .cnfy-drawer-close-btn {
1493
+ padding: 0.5rem;
1494
+ border-radius: 0.375rem;
1495
+ background: none;
1496
+ border: none;
1497
+ cursor: pointer;
1498
+ color: var(--cnfy-gray-400);
1499
+ display: flex;
1500
+ align-items: center;
1501
+ transition: background-color 0.15s, color 0.15s;
1502
+ }
1503
+
1504
+ .cnfy-drawer-close-btn:hover {
1505
+ background-color: var(--cnfy-gray-100);
1506
+ color: var(--cnfy-gray-600);
1507
+ }
1508
+
1509
+ .cnfy-drawer-body {
1510
+ flex: 1;
1511
+ overflow-y: auto;
1512
+ padding: 1.5rem;
1513
+ }
1514
+
1515
+ /* ========================================
1516
+ Preferences Form Styles
1517
+ ======================================== */
1518
+ .cnfy-dash-page {
1519
+ max-width: 48rem;
1520
+ }
1521
+
1522
+ .cnfy-dash-page > * + * {
1523
+ margin-top: 1.5rem;
1524
+ }
1525
+
1526
+ .cnfy-dash-page-title {
1527
+ font-size: 1.5rem;
1528
+ font-weight: 600;
1529
+ margin: 0;
1530
+ }
1531
+
1532
+ .cnfy-dash-page-subtitle {
1533
+ color: var(--cnfy-gray-500);
1534
+ margin: 0;
1535
+ }
1536
+
1537
+ .cnfy-dash-card {
1538
+ background-color: var(--cnfy-white);
1539
+ border-radius: 0.5rem;
1540
+ border: 1px solid var(--cnfy-gray-200);
1541
+ padding: 1.5rem;
1542
+ }
1543
+
1544
+ .cnfy-dash-card > * + * {
1545
+ margin-top: 1.25rem;
1546
+ }
1547
+
1548
+ .cnfy-dash-card-title {
1549
+ font-size: 1.125rem;
1550
+ font-weight: 600;
1551
+ color: var(--cnfy-gray-900);
1552
+ border-bottom: 1px solid var(--cnfy-gray-200);
1553
+ padding-bottom: 0.5rem;
1554
+ margin: 0;
1555
+ }
1556
+
1557
+ .cnfy-dash-card-header {
1558
+ margin-bottom: 1rem;
1559
+ }
1560
+
1561
+ .cnfy-dash-card-title-inline {
1562
+ font-size: 1.125rem;
1563
+ font-weight: 600;
1564
+ color: var(--cnfy-gray-900);
1565
+ margin: 0;
1566
+ }
1567
+
1568
+ .cnfy-dash-card-desc {
1569
+ font-size: 0.875rem;
1570
+ color: var(--cnfy-gray-500);
1571
+ margin: 0.25rem 0 0;
1572
+ }
1573
+
1574
+ .cnfy-dash-field {
1575
+ margin-bottom: 0;
1576
+ }
1577
+
1578
+ .cnfy-dash-label {
1579
+ font-size: 0.875rem;
1580
+ font-weight: 500;
1581
+ display: block;
1582
+ margin-bottom: 0.375rem;
1583
+ color: var(--cnfy-gray-700);
1584
+ }
1585
+
1586
+ .cnfy-dash-label-muted {
1587
+ font-size: 0.875rem;
1588
+ font-weight: 500;
1589
+ color: var(--cnfy-gray-500);
1590
+ }
1591
+
1592
+ .cnfy-dash-label-bold {
1593
+ font-weight: 600;
1594
+ color: var(--cnfy-gray-900);
1595
+ margin: 0.25rem 0 0;
1596
+ }
1597
+
1598
+ .cnfy-dash-input {
1599
+ width: 100%;
1600
+ border: 1px solid var(--cnfy-gray-200);
1601
+ border-radius: 0.5rem;
1602
+ padding: 0.5rem 0.75rem;
1603
+ font-size: 0.875rem;
1604
+ outline: none;
1605
+ font-family: inherit;
1606
+ }
1607
+
1608
+ .cnfy-dash-input:focus {
1609
+ border-color: var(--cnfy-gray-400);
1610
+ }
1611
+
1612
+ .cnfy-dash-hint {
1613
+ margin-top: 0.25rem;
1614
+ font-size: 0.75rem;
1615
+ color: var(--cnfy-gray-500);
1616
+ }
1617
+
1618
+ .cnfy-dash-grid {
1619
+ display: grid;
1620
+ gap: 1rem;
1621
+ }
1622
+
1623
+ .cnfy-dash-grid--sm {
1624
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1625
+ }
1626
+
1627
+ .cnfy-dash-badge {
1628
+ display: inline-flex;
1629
+ align-items: center;
1630
+ padding: 0.25rem 0.75rem;
1631
+ border-radius: 9999px;
1632
+ font-size: 0.75rem;
1633
+ font-weight: 500;
1634
+ }
1635
+
1636
+ .cnfy-dash-badge--green {
1637
+ background-color: #dcfce7;
1638
+ color: #15803d;
1639
+ }
1640
+
1641
+ .cnfy-dash-badge--yellow {
1642
+ background-color: #fef9c3;
1643
+ color: #a16207;
1644
+ }
1645
+
1646
+ .cnfy-dash-info-text {
1647
+ font-size: 0.875rem;
1648
+ color: var(--cnfy-gray-600);
1649
+ margin-bottom: 0.75rem;
1650
+ }
1651
+
1652
+ .cnfy-dash-btn-save {
1653
+ padding: 0.5rem 1.5rem;
1654
+ border-radius: 0.5rem;
1655
+ color: var(--cnfy-white);
1656
+ font-weight: 500;
1657
+ font-size: 0.875rem;
1658
+ border: none;
1659
+ cursor: pointer;
1660
+ }
1661
+
1662
+ .cnfy-dash-btn-save:disabled {
1663
+ opacity: 0.5;
1664
+ cursor: not-allowed;
1665
+ }
1666
+
1667
+ .cnfy-dash-actions {
1668
+ display: flex;
1669
+ align-items: center;
1670
+ gap: 1rem;
1671
+ }
1672
+
1673
+ .cnfy-dash-success {
1674
+ font-size: 0.875rem;
1675
+ font-weight: 500;
1676
+ }
1677
+
1678
+ /* Toggle switch */
1679
+ .cnfy-toggle {
1680
+ position: relative;
1681
+ display: inline-flex;
1682
+ height: 1.5rem;
1683
+ width: 2.75rem;
1684
+ flex-shrink: 0;
1685
+ cursor: pointer;
1686
+ border-radius: 9999px;
1687
+ border: 2px solid transparent;
1688
+ transition: background-color 0.2s ease-in-out;
1689
+ outline: none;
1690
+ background: none;
1691
+ padding: 0;
1692
+ }
1693
+
1694
+ .cnfy-toggle-thumb {
1695
+ pointer-events: none;
1696
+ display: inline-block;
1697
+ height: 1.25rem;
1698
+ width: 1.25rem;
1699
+ transform: translateX(0);
1700
+ border-radius: 9999px;
1701
+ background-color: var(--cnfy-white);
1702
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
1703
+ transition: transform 0.2s ease-in-out;
1704
+ }
1705
+
1706
+ .cnfy-toggle-thumb--on {
1707
+ transform: translateX(1.25rem);
1708
+ }
1709
+
1710
+ .cnfy-toggle-group {
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ gap: 1rem;
1714
+ }
1715
+
1716
+ .cnfy-toggle-row {
1717
+ display: flex;
1718
+ align-items: center;
1719
+ justify-content: space-between;
1720
+ gap: 1rem;
1721
+ }
1722
+
1723
+ .cnfy-toggle-label {
1724
+ font-size: 0.875rem;
1725
+ font-weight: 500;
1726
+ color: var(--cnfy-gray-700);
1727
+ margin: 0;
1728
+ }
1729
+
1730
+ .cnfy-toggle-desc {
1731
+ font-size: 0.75rem;
1732
+ color: var(--cnfy-gray-500);
1733
+ margin: 0.125rem 0 0;
1734
+ }
1735
+
1736
+ /* Logo upload */
1737
+ .cnfy-logo-upload {
1738
+ display: flex;
1739
+ align-items: center;
1740
+ gap: 1rem;
1741
+ }
1742
+
1743
+ .cnfy-logo-preview {
1744
+ height: 4rem;
1745
+ width: 4rem;
1746
+ border: 1px solid var(--cnfy-gray-200);
1747
+ border-radius: 0.5rem;
1748
+ background-color: var(--cnfy-gray-50);
1749
+ overflow: hidden;
1750
+ display: flex;
1751
+ align-items: center;
1752
+ justify-content: center;
1753
+ flex-shrink: 0;
1754
+ }
1755
+
1756
+ .cnfy-logo-img {
1757
+ height: 100%;
1758
+ width: 100%;
1759
+ object-fit: cover;
1760
+ }
1761
+
1762
+ .cnfy-logo-placeholder {
1763
+ font-size: 0.625rem;
1764
+ color: var(--cnfy-gray-400);
1765
+ }
1766
+
1767
+ .cnfy-file-input {
1768
+ font-size: 0.875rem;
1769
+ color: var(--cnfy-gray-600);
1770
+ }
1771
+
1772
+ /* ========================================
1773
+ React Select portal fix
1774
+ ======================================== */
1775
+ .react-select__menu-portal {
1776
+ pointer-events: auto !important;
1777
+ z-index: 999999 !important;
1778
+ }
1779
+
1780
+
1781
+ .cnfy-news-pulse-btn {
1782
+ position: absolute;
1783
+ left: 1rem;
1784
+ top: 50%;
1785
+ transform: translateY(-50%);
1786
+ z-index: 10;
1787
+ display: flex;
1788
+ height: 2rem;
1789
+ width: 2rem;
1790
+ align-items: center;
1791
+ justify-content: center;
1792
+ border-radius: 9999px;
1793
+ background: linear-gradient(to right, var(--cnfy-purple-500), var(--cnfy-pink-500));
1794
+ color: var(--cnfy-white);
1795
+ border: none;
1796
+ cursor: pointer;
1797
+ transition: all 0.15s;
1798
+ }
1799
+
1800
+ .cnfy-news-dropdown-source{
1801
+ display: flex;
1802
+ justify-content: space-around;
1803
+ padding-left: 15px;
1804
+ padding-right: 15px;
1805
+ background-color: #fff;
1806
+ padding-bottom: 5px;
1807
+ padding-top: 5px;
1808
+ box-shadow: 0px 2px 4px #0003;
1809
+ }