CSS · 6799 bytes Raw Blame History
1 @import "tailwindcss";
2
3 /* ode to a pallette */
4 :root {
5 --color-bg: #F7F1E8; /* creamy... */
6 --color-text: #2D2D2D; /* ...charcoal, */
7 --color-head: #3A2449; /* tastes like deep plum. */
8 --color-sub: #C081A8; /* a dusty rose... */
9 --color-accent: #D4AF37; /* tumbles on warm ochre. */
10 --color-border: #A99FAF; /* lavender-gray... okay this one is normal */
11 }
12
13 h1 {
14 color: var(--color-head);
15 }
16
17 h2 {
18 color: var(--color-sub);
19 }
20
21 @theme inline {
22 --color-background: var(--background);
23 --color-foreground: var(--foreground);
24 --font-sans: var(--font-geist-sans);
25 --font-mono: var(--font-geist-mono);
26 }
27
28 @media (prefers-color-scheme: dark) {
29 :root {
30 /* TODO: dark mode support */
31 }
32 }
33
34 body {
35 background: var(--color-bg);
36 color: var(--color-text);
37 font-family: Arial, Helvetica, sans-serif;
38 }
39
40 /* base floating animation */
41 @keyframes floatUpDown {
42 0% { transform: translateY(0px); }
43 50% { transform: translateY(-10px); }
44 100% { transform: translateY(0px); }
45 }
46
47 /* alarm clock ringing animation - rotational shake */
48 @keyframes alarmRing {
49 0% { transform: rotate(0deg); }
50 10% { transform: rotate(-8deg); }
51 20% { transform: rotate(8deg); }
52 30% { transform: rotate(-6deg); }
53 40% { transform: rotate(6deg); }
54 50% { transform: rotate(-4deg); }
55 60% { transform: rotate(4deg); }
56 70% { transform: rotate(-3deg); }
57 80% { transform: rotate(3deg); }
58 90% { transform: rotate(-1deg); }
59 100% { transform: rotate(0deg); }
60 }
61
62 /* wobble-swell for click action */
63 @keyframes shakeBounce {
64 0% { transform: translate(0, 0) scale(1) rotate(0deg); }
65 10% { transform: translate(-10px, -15px) scale(1.05) rotate(-5deg); }
66 20% { transform: translate(10px, -25px) scale(1.1) rotate(5deg); }
67 30% { transform: translate(-8px, -20px) scale(1.08) rotate(-4deg); }
68 40% { transform: translate(8px, -30px) scale(1.12) rotate(4deg); }
69 50% { transform: translate(-6px, -25px) scale(1.1) rotate(-3deg); }
70 60% { transform: translate(6px, -15px) scale(1.05) rotate(3deg); }
71 70% { transform: translate(-4px, -10px) scale(1.02) rotate(-2deg); }
72 80% { transform: translate(4px, -5px) scale(1.01) rotate(2deg); }
73 90% { transform: translate(-2px, -2px) scale(1) rotate(-1deg); }
74 100% { transform: translate(0, 0) scale(1) rotate(0deg); }
75 }
76
77 /* glow effect */
78 @keyframes glow {
79 0% { filter: drop-shadow(0 0 0 rgba(255, 215, 0, 0)); }
80 50% { filter: drop-shadow(0 0 32px rgba(198, 177, 23, 1)); }
81 100% { filter: drop-shadow(0 0 0 rgba(255, 215, 0, 0)); }
82 }
83
84 @keyframes glowAccent {
85 0% {
86 filter: drop-shadow(0 0 0 rgba(212, 175, 55, 0));
87 }
88 50% {
89 filter:
90 drop-shadow(0 0 12px rgba(236, 193, 51, 1))
91 drop-shadow(0 0 30px rgba(236, 193, 51, 0.7))
92 drop-shadow(0 0 40px rgba(236, 193, 51, 0.4));
93 }
94 100% {
95 filter: drop-shadow(0 0 0 rgba(212, 175, 55, 0));
96 }
97 }
98
99 /* FLOATING CONTAINER - handles continuous up/down motion */
100 .bird-float {
101 animation: floatUpDown 4s ease-in-out infinite;
102 }
103
104 /* SHAKE CONTAINER - handles rotation and click effects */
105 .bird-shake {
106 transform-origin: center center;
107 transition: transform 0.1s ease;
108 }
109
110 /* hover state - alarm clock ringing (only affects rotation) */
111 .bird-shake:hover {
112 animation: alarmRing 0.5s ease-in-out infinite;
113 }
114
115 /* click animation - overrides hover */
116 .bird-shake.shake {
117 animation:
118 shakeBounce 0.8s ease-in-out,
119 glowAccent 0.8s ease-in-out;
120 }
121
122 /* Loading state - affect the floating container */
123 .bird-float.loading {
124 opacity: 0.7;
125 animation: floatUpDown 2s ease-in-out infinite;
126 }
127
128 /* base SVG styling */
129 .bird-icon {
130 width: 172px;
131 height: 172px;
132 color: #3A2449;
133 fill: #3A2449;
134 cursor: pointer;
135 display: block;
136 }
137
138 /* fade in/out animation for the "copied!" notif */
139 @keyframes fade-in-out {
140 0% { opacity: 0; transform: translateY(10px) translateX(-50%); }
141 20% { opacity: 1; transform: translateY(0) translateX(-50%); }
142 80% { opacity: 1; transform: translateY(0) translateX(-50%); }
143 100% { opacity: 0; transform: translateY(-10px) translateX(-50%); }
144 }
145
146 .animate-fade-in-out {
147 animation: fade-in-out 2s ease-in-out;
148 }
149
150 /* make gennied word look clickable */
151 .cursor-pointer.select-none:hover {
152 text-shadow: 0 0 10px rgba(236, 72, 153, 0.3);
153 }
154
155 .bg-rose-to-cream {
156 background: linear-gradient(
157 136deg,
158 var(--color-sub) 0%,
159 var(--color-bg) 60%
160 );
161 }
162
163 /* Corpus Radio Button Styles */
164 .corpus-selector-desktop {
165 justify-content: center;
166 margin-top: 1.5rem;
167 margin-bottom: 1.5rem;
168 }
169
170 .corpus-radio-group {
171 display: flex;
172 flex-wrap: wrap;
173 justify-content: center;
174 gap: 1rem;
175 padding: 0.75rem;
176 background: rgba(58, 36, 73, 0.05);
177 border-radius: 2rem;
178 border: 1px solid rgba(58, 36, 73, 0.1);
179 max-width: 100%;
180 }
181
182 .corpus-radio-label {
183 cursor: pointer;
184 position: relative;
185 flex-shrink: 0;
186 }
187
188 .corpus-radio-input {
189 position: absolute;
190 opacity: 0;
191 width: 0;
192 height: 0;
193 }
194
195 .corpus-radio-button {
196 display: flex;
197 align-items: center;
198 gap: 0.625rem;
199 padding: 0.75rem 1.25rem;
200 border-radius: 1.75rem;
201 border: 2px solid transparent;
202 background: white;
203 transition: all 0.2s ease;
204 font-size: 0.9375rem;
205 font-weight: 500;
206 color: var(--color-text);
207 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
208 white-space: nowrap;
209 }
210
211 .corpus-radio-emoji {
212 font-size: 1.25rem;
213 line-height: 1;
214 }
215
216 .corpus-radio-name {
217 white-space: nowrap;
218 }
219
220 /* Hover state */
221 .corpus-radio-label:hover .corpus-radio-button {
222 border-color: rgba(244, 114, 182, 0.3);
223 box-shadow: 0 2px 8px rgba(244, 114, 182, 0.15);
224 transform: translateY(-1px);
225 }
226
227 /* Selected state */
228 .corpus-radio-input:checked + .corpus-radio-button {
229 background: linear-gradient(135deg, #f472b6 0%, #ec4899 100%);
230 color: white;
231 border-color: #ec4899;
232 box-shadow: 0 4px 14px rgba(236, 72, 153, 0.35);
233 }
234
235 /* Focus state for accessibility */
236 .corpus-radio-input:focus-visible + .corpus-radio-button {
237 outline: 2px solid #f472b6;
238 outline-offset: 2px;
239 }
240
241 /* Mobile selector */
242 .corpus-selector-mobile {
243 margin-top: 1.5rem;
244 margin-bottom: 1.5rem;
245 }
246
247 /* Responsive adjustments */
248 @media (max-width: 1024px) {
249 .corpus-radio-group {
250 gap: 0.875rem;
251 padding: 0.625rem;
252 }
253
254 .corpus-radio-button {
255 padding: 0.625rem 1.125rem;
256 font-size: 0.875rem;
257 }
258
259 .corpus-radio-emoji {
260 font-size: 1.125rem;
261 }
262 }
263
264 /* Tablet screens */
265 @media (max-width: 768px) {
266 .corpus-radio-group {
267 gap: 0.75rem;
268 padding: 0.5rem;
269 }
270
271 .corpus-radio-button {
272 padding: 0.5rem 1rem;
273 font-size: 0.8125rem;
274 }
275
276 .corpus-radio-emoji {
277 font-size: 1rem;
278 }
279 }
280
281 /* Small mobile screens - switch to select dropdown via md:hidden */
282 @media (max-width: 639px) {
283 /* The mobile select is shown via md:hidden class in the component */
284 }