1+ /* =========================================================================
2+ Penn AI Mode Effect - Inspired by Google AI Mode Rainbow
3+ Using Penn's signature colors instead of rainbow spectrum
4+ ========================================================================= */
5+
6+ /* Animation keyframes that will be used by both effects */
7+ @keyframes penn-ai-flash {
8+ 0% {
9+ opacity : 0 ;
10+ background-position : 100% 0 ;
11+ transform : scaleY (1 );
12+ }
13+ 5% {
14+ opacity : 1 ;
15+ transform : scaleY (1.5 );
16+ }
17+ 50% {
18+ opacity : 1 ;
19+ background-position : 0% 0 ;
20+ transform : scaleY (1.2 );
21+ }
22+ 95% {
23+ opacity : 1 ;
24+ transform : scaleY (1.5 );
25+ }
26+ 100% {
27+ opacity : 0 ;
28+ background-position : -100% 0 ;
29+ transform : scaleY (1 );
30+ }
31+ }
32+
33+ /* Continuous rotation mode (like Google's ambient state) */
34+ @keyframes penn-ai-rotate {
35+ 0% {
36+ background-position : 0% 0 ;
37+ }
38+ 100% {
39+ background-position : -300% 0 ;
40+ }
41+ }
42+
43+ /* Alternative: Radial expansion effect (like iOS implementation) */
44+ @keyframes penn-ai-expand {
45+ 0% {
46+ opacity : 0 ;
47+ transform : scaleX (0 ) scaleY (1 );
48+ }
49+ 10% {
50+ opacity : 1 ;
51+ transform : scaleX (0.1 ) scaleY (1.5 );
52+ }
53+ 50% {
54+ opacity : 1 ;
55+ transform : scaleX (1 ) scaleY (1.2 );
56+ background-position : -50% 0 ;
57+ }
58+ 90% {
59+ opacity : 1 ;
60+ transform : scaleX (1 ) scaleY (1.5 );
61+ }
62+ 100% {
63+ opacity : 0 ;
64+ transform : scaleX (1 ) scaleY (1 );
65+ background-position : -100% 0 ;
66+ }
67+ }
68+
69+ /* Circle effect around search or buttons (like Circle to Search) */
70+ .penn-ai-circle {
71+ position : relative;
72+ }
73+
74+ .penn-ai-circle ::before {
75+ content : "" ;
76+ position : absolute;
77+ inset : -3px ;
78+ border-radius : inherit;
79+ padding : 2px ;
80+ background : linear-gradient (
81+ 45deg ,
82+ # 011F5B,
83+ # 019CDE,
84+ # 990000,
85+ # 019CDE,
86+ # 011F5B
87+ );
88+ background-size : 300% 300% ;
89+ -webkit-mask :
90+ linear-gradient (# fff 0 0 ) content-box,
91+ linear-gradient (# fff 0 0 );
92+ -webkit-mask-composite : exclude;
93+ mask-composite : exclude;
94+ opacity : 0 ;
95+ animation : penn-circle-rotate 3s linear infinite;
96+ }
97+
98+ @keyframes penn-circle-rotate {
99+ 0% {
100+ background-position : 0% 50% ;
101+ opacity : 0.8 ;
102+ }
103+ 50% {
104+ background-position : 100% 50% ;
105+ opacity : 1 ;
106+ }
107+ 100% {
108+ background-position : 0% 50% ;
109+ opacity : 0.8 ;
110+ }
111+ }
112+
113+ .penn-ai-active .penn-ai-circle ::before {
114+ opacity : 1 ;
115+ }
116+
117+ /* Performance optimizations */
118+ @media (prefers-reduced-motion : reduce) {
119+ main .container ::before ,
120+ .penn-ai-circle ::before {
121+ animation : none !important ;
122+ }
123+
124+ .penn-gradient-pulse main .container ::before {
125+ opacity : 0.5 ;
126+ background-position : -50% 0 ;
127+ }
128+ }
129+
130+ /* =========================================================================
131+ HEADER BOTTOM BORDER FLASH: Animate the existing border
132+ ========================================================================= */
133+
134+ /* Animate the header's bottom border color directly */
135+ @keyframes penn-header-border-flash {
136+ 0% {
137+ border-bottom-color : # 990000 ;
138+ }
139+ 10% {
140+ border-bottom-color : # 011F5B ;
141+ }
142+ 30% {
143+ border-bottom-color : # 019CDE ;
144+ }
145+ 50% {
146+ border-bottom-color : # 990000 ;
147+ }
148+ 70% {
149+ border-bottom-color : # 019CDE ;
150+ }
151+ 90% {
152+ border-bottom-color : # 011F5B ;
153+ }
154+ 100% {
155+ border-bottom-color : # 990000 ;
156+ }
157+ }
158+
159+ /* Apply the animation to the header - just animate the border color */
160+ .penn-gradient-flash .gdoc-header {
161+ animation : penn-header-border-flash 2s cubic-bezier (0.4 , 0 , 0.2 , 1 );
162+ }
163+
164+ /* Dark mode adjustments */
165+ : root [color-theme = "dark" ] main .container {
166+ border-top-color : var (--penn-electric-blue , # 019CDE );
167+ }
168+
169+ : root [color-theme = "dark" ] main .container ::before {
170+ filter : brightness (1.2 );
171+ }
172+
173+ : root [color-theme = "dark" ] .penn-gradient-flash main .container ::before ,
174+ : root [color-theme = "dark" ] .penn-gradient-pulse main .container ::before {
175+ box-shadow :
176+ 0 0 15px rgba (1 , 156 , 222 , 0.7 ),
177+ 0 0 30px rgba (1 , 156 , 222 , 0.4 ),
178+ 0 0 45px rgba (153 , 0 , 0 , 0.3 );
179+ }
180+
181+ : root [color-theme = "dark" ] .gdoc-header ::after {
182+ filter : brightness (1.2 );
183+ }
184+
185+ : root [color-theme = "dark" ] .penn-gradient-flash .gdoc-header ::after ,
186+ : root [color-theme = "dark" ] .penn-gradient-pulse .gdoc-header ::after {
187+ box-shadow :
188+ 0 2px 15px rgba (1 , 156 , 222 , 0.7 ),
189+ 0 4px 30px rgba (1 , 156 , 222 , 0.4 ),
190+ 0 6px 45px rgba (153 , 0 , 0 , 0.3 );
191+ }
0 commit comments