Files
ember-market-frontend/app/globals.css
g e7fcfd63a2 Add Christmas theme and snow effects for December
Introduces a Christmas theme that activates in December, including themed colors, subtle background patterns, and snowflake effects on loading screens. Adds a reusable SnowLoader component and utility for December detection. Updates layout and loading components to conditionally apply decorations and styles only during December.
2025-12-08 00:47:57 +00:00

459 lines
11 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
body {
font-family: Arial, Helvetica, sans-serif;
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
/* Accessibility improvements */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Better focus states for keyboard navigation */
.focus-visible:focus-visible {
outline: 2px solid hsl(var(--ring));
outline-offset: 2px;
}
/* Improved touch targets for mobile/Chromebook */
.touch-target {
min-height: 44px;
min-width: 44px;
}
/* Better contrast for Chromebook displays */
@media (prefers-contrast: high) {
.border-input {
border-color: hsl(var(--foreground));
}
}
/* Chromebook and touch device optimizations */
@media (pointer: coarse) {
.touch-target {
min-height: 48px;
min-width: 48px;
}
/* Larger touch targets for interactive elements */
button, input, textarea, [role="button"] {
min-height: 44px;
}
}
/* Better focus indicators for keyboard navigation */
.focus-visible:focus-visible {
outline: 2px solid hsl(var(--ring));
outline-offset: 2px;
box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2);
}
/* Improved scrolling for touch devices */
.overflow-y-auto {
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;
}
/* Enhanced contrast for better visibility */
.text-muted-foreground {
color: hsl(var(--muted-foreground) / 0.8);
}
/* Better button contrast */
button:not(:disabled):hover {
filter: brightness(1.05);
}
/* Improved focus visibility */
input:focus, textarea:focus, button:focus {
outline: 2px solid hsl(var(--ring));
outline-offset: 2px;
}
/* Better message bubble contrast */
.bg-primary {
background-color: hsl(var(--primary) / 0.9);
}
/* Chromebook-specific optimizations */
@media screen and (max-width: 1366px) and (min-resolution: 1.5dppx) {
/* Chromebook display optimizations */
.text-sm {
font-size: 0.875rem;
line-height: 1.25rem;
}
.text-base {
font-size: 1rem;
line-height: 1.5rem;
}
/* Better touch targets for Chromebooks */
button, input, textarea, [role="button"], [role="tab"] {
min-height: 48px;
min-width: 48px;
}
/* Improved spacing for Chromebook screens */
.space-y-2 > * + * {
margin-top: 0.75rem;
}
.space-y-4 > * + * {
margin-top: 1.25rem;
}
}
/* Chromebook touch screen optimizations */
@media (pointer: coarse) and (hover: none) {
/* Larger touch targets */
.touch-target {
min-height: 52px;
min-width: 52px;
}
/* Better spacing for touch interactions */
.space-y-2 > * + * {
margin-top: 1rem;
}
/* Improved button padding */
button {
padding: 0.75rem 1rem;
}
/* Better input field sizing */
input, textarea {
padding: 0.875rem;
font-size: 1rem;
}
/* Enhanced focus states for touch */
button:focus-visible, input:focus-visible, textarea:focus-visible {
outline: 3px solid hsl(var(--ring));
outline-offset: 2px;
}
}
/* Chromebook keyboard navigation improvements */
@media (hover: hover) and (pointer: fine) {
/* Better hover states for mouse/trackpad */
button:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Improved focus indicators */
button:focus-visible, input:focus-visible, textarea:focus-visible {
outline: 2px solid hsl(var(--ring));
outline-offset: 2px;
box-shadow: 0 0 0 4px hsl(var(--ring) / 0.2);
}
}
/* Chromebook display scaling fixes */
@media screen and (min-resolution: 1.5dppx) {
/* Prevent text from being too small on high-DPI displays */
html {
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
/* Better font rendering */
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
/* Chromebook scrolling improvements */
.overflow-y-auto {
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;
/* Better momentum scrolling for Chromebooks */
overscroll-behavior: contain;
}
/* Chromebook chat interface optimizations */
.chat-message {
/* Better message bubble sizing for touch */
min-height: 44px;
padding: 0.75rem;
}
/* Chromebook form optimizations */
.form-input {
/* Better input field sizing for Chromebooks */
min-height: 48px;
font-size: 1rem;
padding: 0.75rem 1rem;
}
/* Chromebook button optimizations */
.btn-chromebook {
min-height: 48px;
min-width: 48px;
padding: 0.75rem 1rem;
font-size: 1rem;
border-radius: 0.5rem;
}
/* Enhanced keyboard focus indicators for Chromebooks */
.keyboard-focus {
outline: 3px solid hsl(var(--ring));
outline-offset: 2px;
box-shadow: 0 0 0 4px hsl(var(--ring) / 0.3);
}
/* Better focus management for Chromebook keyboard navigation */
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
[role="button"]:focus-visible,
[role="tab"]:focus-visible {
outline: 3px solid hsl(var(--ring));
outline-offset: 2px;
box-shadow: 0 0 0 4px hsl(var(--ring) / 0.3);
}
/* Chromebook-specific focus ring */
@media (prefers-reduced-motion: no-preference) {
.keyboard-focus {
transition: outline 0.2s ease, box-shadow 0.2s ease;
}
}
.bg-muted {
background-color: hsl(var(--muted) / 0.8);
}
/* Christmas-themed animations */
@keyframes twinkle {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.3; transform: scale(0.8); }
}
@keyframes snowflake {
0% {
transform: translateY(-100vh) rotate(0deg);
opacity: 1;
}
100% {
transform: translateY(100vh) rotate(360deg);
opacity: 0;
}
}
@keyframes sparkle {
0%, 100% {
opacity: 0;
transform: scale(0) rotate(0deg);
}
50% {
opacity: 1;
transform: scale(1) rotate(180deg);
}
}
@keyframes glow {
0%, 100% {
box-shadow: 0 0 5px hsl(var(--christmas-red)), 0 0 10px hsl(var(--christmas-red)), 0 0 15px hsl(var(--christmas-red));
}
50% {
box-shadow: 0 0 10px hsl(var(--christmas-green)), 0 0 20px hsl(var(--christmas-green)), 0 0 30px hsl(var(--christmas-green));
}
}
/* Christmas decorative elements */
.christmas-twinkle {
animation: twinkle 2s ease-in-out infinite;
}
.christmas-snowflake {
position: absolute;
color: white;
font-size: 1rem;
animation: snowflake 10s linear infinite;
pointer-events: none;
}
.christmas-sparkle {
animation: sparkle 1.5s ease-in-out infinite;
}
.christmas-glow {
animation: glow 2s ease-in-out infinite;
}
/* Subtle Christmas gradient backgrounds */
.christmas-gradient {
background: linear-gradient(135deg,
hsl(var(--christmas-red) / 0.1) 0%,
hsl(var(--christmas-green) / 0.1) 50%,
hsl(var(--christmas-gold) / 0.1) 100%);
}
/* Christmas-themed borders */
.christmas-border {
border: 2px solid;
border-image: linear-gradient(45deg,
hsl(var(--christmas-red)),
hsl(var(--christmas-green)),
hsl(var(--christmas-gold))) 1;
}
/* Christmas-themed styles - only active in December */
.christmas-theme {
/* Subtle Christmas pattern overlay */
--christmas-pattern: radial-gradient(circle at 20% 50%, hsl(var(--christmas-red) / 0.03) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, hsl(var(--christmas-green) / 0.03) 0%, transparent 50%),
radial-gradient(circle at 40% 20%, hsl(var(--christmas-gold) / 0.03) 0%, transparent 50%);
}
.christmas-theme body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
radial-gradient(circle at 20% 50%, hsl(var(--christmas-red) / 0.03) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, hsl(var(--christmas-green) / 0.03) 0%, transparent 50%),
radial-gradient(circle at 40% 20%, hsl(var(--christmas-gold) / 0.03) 0%, transparent 50%);
pointer-events: none;
z-index: 0;
}
/* Christmas-themed card hover effects */
.christmas-theme .card:hover {
border-color: hsl(var(--christmas-red) / 0.3);
transition: border-color 0.3s ease;
}
/* Christmas-themed button hover effects */
.christmas-theme button.bg-primary:hover {
background: linear-gradient(135deg,
hsl(var(--christmas-red)),
hsl(var(--christmas-green)));
transition: background 0.3s ease;
}
/* Christmas-themed link colors */
.christmas-theme a:hover {
color: hsl(var(--christmas-red));
transition: color 0.2s ease;
}
/* Subtle Christmas border on focus */
.christmas-theme *:focus-visible {
outline-color: hsl(var(--christmas-red));
}
}
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 0 0% 3.9%;
--card: 0 0% 100%;
--card-foreground: 0 0% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 3.9%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 98%;
--secondary: 0 0% 96.1%;
--secondary-foreground: 0 0% 9%;
--muted: 0 0% 96.1%;
--muted-foreground: 0 0% 45.1%;
--accent: 0 0% 96.1%;
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 89.8%;
--input: 0 0% 89.8%;
--ring: 0 0% 3.9%;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
--radius: 0.5rem;
/* Christmas colors */
--christmas-red: 0 84% 50%;
--christmas-green: 142 76% 36%;
--christmas-gold: 43 96% 56%;
}
.dark {
--background: 0 0% 3.9%;
--foreground: 0 0% 98%;
--card: 0 0% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 0 0% 9%;
--secondary: 0 0% 14.9%;
--secondary-foreground: 0 0% 98%;
--muted: 0 0% 14.9%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 14.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 14.9%;
--input: 0 0% 14.9%;
--ring: 0 0% 83.1%;
--chart-1: 220 70% 50%;
--chart-2: 160 60% 45%;
--chart-3: 30 80% 55%;
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%;
/* Christmas colors */
--christmas-red: 0 84% 50%;
--christmas-green: 142 76% 36%;
--christmas-gold: 43 96% 56%;
}
/* Apply Christmas colors only in December */
html.christmas-theme.dark,
html.christmas-theme .dark {
--primary: 0 84% 50%;
--primary-foreground: 0 0% 98%;
--secondary: 142 76% 36%;
--secondary-foreground: 0 0% 98%;
--accent: 142 76% 36%;
--accent-foreground: 0 0% 98%;
--border: 142 76% 20%;
--ring: 0 84% 50%;
--chart-1: 0 84% 50%;
--chart-2: 142 76% 36%;
--chart-3: 43 96% 56%;
--chart-4: 0 84% 50%;
--chart-5: 142 76% 36%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
}