Daniel McKnight NeonClary Neon:ryan commited on
Commit
9288c82
·
unverified ·
1 Parent(s): b89ca25

Add Neon AI Branding (#15)

Browse files

* feat: add Neon.ai branding and copyright footers to UI

Add neon-logo.png asset. Replace generic footer with Neon.ai copyright and patents link on HomePage, CanvasPage, ChatPage welcome state, and Sidebar. Add Powered by Neon.ai to Login page.

Made-with: Cursor

* Refactor Copyright Notice to one imported definition

* Enhance Login Component with Copyright Notice and Layout Adjustments

- Added CopyrightNotice component to the Login page footer.
- Refactored layout structure by renaming 'login-container' to 'login-content' for clarity.
- Updated CSS styles for improved layout and footer presentation.

---------

Co-authored-by: NeonClary <askclary@gmail.com>
Co-authored-by: Neon:ryan <ryan@neon.ai>

phd-advisor-frontend/public/neon-logo.png ADDED

Git LFS Details

  • SHA256: 9c9839f8c25e457a57c2d30bffefbf7d31607b071ad85004445054f899c5ec28
  • Pointer size: 131 Bytes
  • Size of remote file: 130 kB
phd-advisor-frontend/src/components/CopyrightNotice.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ const CopyrightNotice = ({ variant = 'footer', className = '' }) => {
4
+ const isSidebar = variant === 'sidebar';
5
+ const textClass = isSidebar ? 'sidebar-copyright-text' : 'footer-text';
6
+ const patentsClass = isSidebar ? 'sidebar-patents-link' : 'footer-patents-link';
7
+ const combinedClass = className ? `${textClass} ${className}` : textClass;
8
+
9
+ return (
10
+ <p className={combinedClass}>
11
+ {'\u00A9 '}
12
+ {isSidebar ? (
13
+ 'Neon.ai'
14
+ ) : (
15
+ <a
16
+ href="https://neon.ai"
17
+ target="_blank"
18
+ rel="noopener noreferrer"
19
+ className="footer-neon-link"
20
+ >
21
+ <img src="/neon-logo.png" alt="" className="footer-neon-logo" />
22
+ Neon.ai
23
+ </a>
24
+ )}
25
+ , {'\u00A9 '}University of Colorado Boulder. All rights reserved.{' '}
26
+ <a
27
+ href="https://www.neon.ai/contact"
28
+ target="_blank"
29
+ rel="noopener noreferrer"
30
+ className={patentsClass}
31
+ >
32
+ Patents and licensing.
33
+ </a>
34
+ </p>
35
+ );
36
+ };
37
+
38
+ export default CopyrightNotice;
phd-advisor-frontend/src/components/Login.js CHANGED
@@ -1,6 +1,7 @@
1
  import React, { useState } from 'react';
2
  import { Eye, EyeOff, Mail, Lock, ArrowRight, BookOpen, Phone } from 'lucide-react';
3
  import { useAppConfig } from '../contexts/AppConfigContext';
 
4
  import '../styles/Login.css';
5
 
6
  const Login = ({ onNavigateToSignup, onNavigateToHome }) => {
@@ -97,7 +98,8 @@ const Login = ({ onNavigateToSignup, onNavigateToHome }) => {
97
 
98
  return (
99
  <div className="login-page">
100
- <div className="login-container">
 
101
  {/* Header */}
102
  <div className="login-header">
103
  <div className="logo-container">
@@ -247,8 +249,18 @@ const Login = ({ onNavigateToSignup, onNavigateToHome }) => {
247
  Sign up here
248
  </button>
249
  </p>
 
 
 
 
 
 
250
  </div>
251
  </div>
 
 
 
 
252
  </div>
253
  );
254
  };
 
1
  import React, { useState } from 'react';
2
  import { Eye, EyeOff, Mail, Lock, ArrowRight, BookOpen, Phone } from 'lucide-react';
3
  import { useAppConfig } from '../contexts/AppConfigContext';
4
+ import CopyrightNotice from './CopyrightNotice';
5
  import '../styles/Login.css';
6
 
7
  const Login = ({ onNavigateToSignup, onNavigateToHome }) => {
 
98
 
99
  return (
100
  <div className="login-page">
101
+ <div className="login-content">
102
+ <div className="login-container">
103
  {/* Header */}
104
  <div className="login-header">
105
  <div className="logo-container">
 
249
  Sign up here
250
  </button>
251
  </p>
252
+ <div className="login-powered-by">
253
+ <a href="https://neon.ai" target="_blank" rel="noopener noreferrer" className="footer-neon-link">
254
+ <img src="/neon-logo.png" alt="" className="footer-neon-logo" />
255
+ Powered by Neon.ai
256
+ </a>
257
+ </div>
258
  </div>
259
  </div>
260
+ </div>
261
+ <footer className="login-page-footer">
262
+ <CopyrightNotice className="login-page-copyright" />
263
+ </footer>
264
  </div>
265
  );
266
  };
phd-advisor-frontend/src/components/Sidebar.js CHANGED
@@ -14,6 +14,7 @@ import {
14
  FileText
15
  } from 'lucide-react';
16
  import { useAppConfig } from '../contexts/AppConfigContext';
 
17
  import '../styles/Sidebar.css';
18
 
19
  const Sidebar = ({
@@ -346,6 +347,21 @@ const Sidebar = ({
346
  </div>
347
  )}
348
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  </div>
350
 
351
  {isMobileOpen && (
 
14
  FileText
15
  } from 'lucide-react';
16
  import { useAppConfig } from '../contexts/AppConfigContext';
17
+ import CopyrightNotice from './CopyrightNotice';
18
  import '../styles/Sidebar.css';
19
 
20
  const Sidebar = ({
 
347
  </div>
348
  )}
349
  </div>
350
+
351
+ {/* Footer */}
352
+ <div className={`sidebar-footer ${isCollapsed ? 'collapsed' : ''}`}>
353
+ <a
354
+ href="https://neon.ai"
355
+ target="_blank"
356
+ rel="noopener noreferrer"
357
+ className="sidebar-neon-link"
358
+ title="Neon.ai"
359
+ >
360
+ <img src="/neon-logo.png" alt="" className="sidebar-neon-logo" />
361
+ {!isCollapsed && <span className="sidebar-neon-text">Neon.ai</span>}
362
+ </a>
363
+ {!isCollapsed && <CopyrightNotice variant="sidebar" />}
364
+ </div>
365
  </div>
366
 
367
  {isMobileOpen && (
phd-advisor-frontend/src/pages/CanvasPage.js CHANGED
@@ -16,6 +16,7 @@ import {
16
  Printer
17
  } from 'lucide-react';
18
  import { useAppConfig } from '../contexts/AppConfigContext';
 
19
  import '../styles/CanvasPage.css';
20
 
21
  // Section icons mapping
@@ -402,22 +403,33 @@ const CanvasPage = ({ user, authToken, onNavigateToChat, onSignOut }) => {
402
  </div>
403
 
404
  <div className="header-actions">
405
- <button
406
- onClick={handleRefreshCanvas}
407
- disabled={isRefreshing || isUpdating}
408
- className={`refresh-button ${(isRefreshing || isUpdating) ? 'disabled' : ''}`}
409
- >
410
- <RefreshCw className={`refresh-icon ${(isRefreshing || isUpdating) ? 'spinning' : ''}`} />
411
- {(isRefreshing || isUpdating) ? 'Refreshing...' : 'Refresh Canvas'}
412
- </button>
413
-
414
- <button
415
- className="action-button print-button"
416
- onClick={handlePrint}
 
 
 
 
 
 
 
 
 
 
 
417
  >
418
- <Printer className="action-icon" />
419
- Print
420
- </button>
421
  </div>
422
  </div>
423
 
@@ -500,6 +512,11 @@ const CanvasPage = ({ user, authToken, onNavigateToChat, onSignOut }) => {
500
  )}
501
  </div>
502
 
 
 
 
 
 
503
  {/* Print Footer */}
504
  {isPrintView && (
505
  <div className="print-footer">
 
16
  Printer
17
  } from 'lucide-react';
18
  import { useAppConfig } from '../contexts/AppConfigContext';
19
+ import CopyrightNotice from '../components/CopyrightNotice';
20
  import '../styles/CanvasPage.css';
21
 
22
  // Section icons mapping
 
403
  </div>
404
 
405
  <div className="header-actions">
406
+ <div className="header-buttons">
407
+ <button
408
+ onClick={handleRefreshCanvas}
409
+ disabled={isRefreshing || isUpdating}
410
+ className={`refresh-button ${(isRefreshing || isUpdating) ? 'disabled' : ''}`}
411
+ >
412
+ <RefreshCw className={`refresh-icon ${(isRefreshing || isUpdating) ? 'spinning' : ''}`} />
413
+ {(isRefreshing || isUpdating) ? 'Refreshing...' : 'Refresh Canvas'}
414
+ </button>
415
+
416
+ <button
417
+ className="action-button print-button"
418
+ onClick={handlePrint}
419
+ >
420
+ <Printer className="action-icon" />
421
+ Print
422
+ </button>
423
+ </div>
424
+ <a
425
+ href="https://neon.ai"
426
+ target="_blank"
427
+ rel="noopener noreferrer"
428
+ className="canvas-powered-by"
429
  >
430
+ <img src="/neon-logo.png" alt="" className="canvas-powered-by-logo" />
431
+ Powered by Neon.ai
432
+ </a>
433
  </div>
434
  </div>
435
 
 
512
  )}
513
  </div>
514
 
515
+ {/* Copyright Footer */}
516
+ <footer className="canvas-copyright-footer">
517
+ <CopyrightNotice />
518
+ </footer>
519
+
520
  {/* Print Footer */}
521
  {isPrintView && (
522
  <div className="print-footer">
phd-advisor-frontend/src/pages/HomePage.js CHANGED
@@ -2,6 +2,7 @@ import React from 'react';
2
  import { MessageCircle, ArrowRight } from 'lucide-react';
3
  import AdvisorCard from '../components/AdvisorCard';
4
  import ThemeToggle from '../components/ThemeToggle';
 
5
  import { useAppConfig } from '../contexts/AppConfigContext';
6
 
7
  const HomePage = ({ onNavigateToChat, isAuthenticated }) => {
@@ -80,9 +81,7 @@ const HomePage = ({ onNavigateToChat, isAuthenticated }) => {
80
  {/* Footer */}
81
  <footer className="footer">
82
  <div className="footer-content">
83
- <p className="footer-text">
84
- {config.app.footer_text}
85
- </p>
86
  </div>
87
  </footer>
88
  </div>
 
2
  import { MessageCircle, ArrowRight } from 'lucide-react';
3
  import AdvisorCard from '../components/AdvisorCard';
4
  import ThemeToggle from '../components/ThemeToggle';
5
+ import CopyrightNotice from '../components/CopyrightNotice';
6
  import { useAppConfig } from '../contexts/AppConfigContext';
7
 
8
  const HomePage = ({ onNavigateToChat, isAuthenticated }) => {
 
81
  {/* Footer */}
82
  <footer className="footer">
83
  <div className="footer-content">
84
+ <CopyrightNotice />
 
 
85
  </div>
86
  </footer>
87
  </div>
phd-advisor-frontend/src/styles/CanvasPage.css CHANGED
@@ -90,10 +90,37 @@
90
  }
91
 
92
  .header-actions {
 
 
 
 
 
 
 
93
  display: flex;
94
  gap: 1rem;
95
  }
96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  .print-view .header-actions {
98
  display: none;
99
  }
@@ -541,4 +568,12 @@
541
  .stat-item {
542
  min-width: auto;
543
  }
 
 
 
 
 
 
 
 
544
  }
 
90
  }
91
 
92
  .header-actions {
93
+ display: flex;
94
+ flex-direction: column;
95
+ align-items: flex-end;
96
+ gap: 8px;
97
+ }
98
+
99
+ .header-buttons {
100
  display: flex;
101
  gap: 1rem;
102
  }
103
 
104
+ .canvas-powered-by {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ gap: 4px;
108
+ color: var(--text-tertiary);
109
+ font-size: 12px;
110
+ text-decoration: none;
111
+ transition: opacity 0.2s ease;
112
+ }
113
+
114
+ .canvas-powered-by:hover {
115
+ opacity: 0.8;
116
+ }
117
+
118
+ .canvas-powered-by-logo {
119
+ height: 1em;
120
+ width: auto;
121
+ vertical-align: middle;
122
+ }
123
+
124
  .print-view .header-actions {
125
  display: none;
126
  }
 
568
  .stat-item {
569
  min-width: auto;
570
  }
571
+ }
572
+
573
+ /* Canvas Copyright Footer */
574
+ .canvas-copyright-footer {
575
+ padding: 24px;
576
+ text-align: center;
577
+ border-top: 1px solid var(--border-light, #e5e7eb);
578
+ margin-top: 32px;
579
  }
phd-advisor-frontend/src/styles/Login.css CHANGED
@@ -4,9 +4,34 @@
4
  min-height: 100vh;
5
  background: var(--bg-gradient);
6
  display: flex;
 
 
 
 
 
 
 
7
  align-items: center;
8
  justify-content: center;
9
- padding: 24px 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  }
11
 
12
  .login-container {
@@ -334,7 +359,7 @@
334
  /* Footer */
335
  .login-footer {
336
  text-align: center;
337
- padding: 24px 32px 32px 32px;
338
  border-top: 1px solid var(--border-primary);
339
  background: var(--bg-secondary);
340
  }
@@ -345,6 +370,18 @@
345
  margin: 0;
346
  }
347
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  .link-btn {
349
  background: none;
350
  border: none;
 
4
  min-height: 100vh;
5
  background: var(--bg-gradient);
6
  display: flex;
7
+ flex-direction: column;
8
+ padding: 24px 16px;
9
+ }
10
+
11
+ .login-content {
12
+ flex: 1;
13
+ display: flex;
14
  align-items: center;
15
  justify-content: center;
16
+ width: 100%;
17
+ }
18
+
19
+ .login-page-footer {
20
+ flex-shrink: 0;
21
+ width: 100%;
22
+ padding-top: 24px;
23
+ display: flex;
24
+ justify-content: center;
25
+ }
26
+
27
+ .login-page-copyright {
28
+ max-width: 720px;
29
+ margin: 0 auto;
30
+ padding: 0 16px 8px 16px;
31
+ font-size: 12px;
32
+ line-height: 1.4;
33
+ color: var(--text-tertiary);
34
+ text-align: center;
35
  }
36
 
37
  .login-container {
 
359
  /* Footer */
360
  .login-footer {
361
  text-align: center;
362
+ padding: 24px 32px 16px 32px;
363
  border-top: 1px solid var(--border-primary);
364
  background: var(--bg-secondary);
365
  }
 
370
  margin: 0;
371
  }
372
 
373
+ .login-powered-by {
374
+ margin-top: 16px;
375
+ padding-top: 16px;
376
+ border-top: 1px solid var(--border-secondary);
377
+ text-align: center;
378
+ }
379
+
380
+ .login-powered-by .footer-neon-link {
381
+ font-size: 13px;
382
+ color: var(--text-tertiary);
383
+ }
384
+
385
  .link-btn {
386
  background: none;
387
  border: none;
phd-advisor-frontend/src/styles/Sidebar.css CHANGED
@@ -588,6 +588,73 @@
588
  background: var(--bg-tertiary-dark, #4b5563);
589
  }
590
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
591
  /* Tooltip for collapsed state */
592
  .session-item.collapsed {
593
  position: relative;
 
588
  background: var(--bg-tertiary-dark, #4b5563);
589
  }
590
 
591
+ /* Sidebar Footer */
592
+ .sidebar-footer {
593
+ flex-shrink: 0;
594
+ padding: 20px;
595
+ border-top: 1px solid var(--border-light, #e5e7eb);
596
+ background: var(--bg-primary, #ffffff);
597
+ }
598
+
599
+ .dark .sidebar-footer {
600
+ border-top-color: var(--border-dark, #374151);
601
+ background: var(--bg-primary-dark, #1f2937);
602
+ }
603
+
604
+ .sidebar-neon-link {
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: flex-start;
608
+ gap: 8px;
609
+ color: var(--text-primary, #111827);
610
+ text-decoration: none;
611
+ font-size: 28px;
612
+ font-weight: bold;
613
+ transition: opacity 0.2s ease;
614
+ }
615
+
616
+ .sidebar-neon-link:hover {
617
+ opacity: 0.8;
618
+ }
619
+
620
+ .dark .sidebar-neon-link {
621
+ color: var(--text-primary-dark, #f9fafb);
622
+ }
623
+
624
+ .sidebar-neon-logo {
625
+ height: 1em;
626
+ width: auto;
627
+ flex-shrink: 0;
628
+ }
629
+
630
+ .sidebar-copyright-text {
631
+ margin: 8px 0 0 0;
632
+ font-size: 10px;
633
+ line-height: 1.4;
634
+ color: var(--text-secondary, #6b7280);
635
+ }
636
+
637
+ .dark .sidebar-copyright-text {
638
+ color: var(--text-secondary-dark, #9ca3af);
639
+ }
640
+
641
+ .sidebar-patents-link {
642
+ color: var(--text-secondary, #6b7280);
643
+ text-decoration: underline;
644
+ }
645
+
646
+ .dark .sidebar-patents-link {
647
+ color: var(--text-secondary-dark, #9ca3af);
648
+ }
649
+
650
+ .sidebar-footer.collapsed .sidebar-neon-link {
651
+ justify-content: center;
652
+ }
653
+
654
+ .sidebar-footer.collapsed .sidebar-neon-logo {
655
+ height: 28px;
656
+ }
657
+
658
  /* Tooltip for collapsed state */
659
  .session-item.collapsed {
660
  position: relative;
phd-advisor-frontend/src/styles/components.css CHANGED
@@ -886,6 +886,33 @@
886
  margin: 0;
887
  }
888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
889
  .rag-info-overlay {
890
  position: absolute;
891
  top: 100%;
 
886
  margin: 0;
887
  }
888
 
889
+ .footer-neon-link {
890
+ color: var(--text-secondary);
891
+ text-decoration: none;
892
+ transition: opacity 0.2s ease;
893
+ }
894
+
895
+ .footer-neon-link:hover {
896
+ opacity: 0.8;
897
+ }
898
+
899
+ .footer-neon-logo {
900
+ height: 1em;
901
+ width: auto;
902
+ vertical-align: text-bottom;
903
+ margin-right: 2px;
904
+ }
905
+
906
+ .footer-patents-link {
907
+ color: var(--text-secondary);
908
+ text-decoration: underline;
909
+ transition: opacity 0.2s ease;
910
+ }
911
+
912
+ .footer-patents-link:hover {
913
+ opacity: 0.8;
914
+ }
915
+
916
  .rag-info-overlay {
917
  position: absolute;
918
  top: 100%;