index.css 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. @import "tailwindcss";
  2. /* Import fonts */
  3. @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=Noto+Sans:wght@400;500;600;700&display=swap');
  4. /* Material Icons */
  5. @import url('https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined');
  6. /* Theme configuration using CSS variables */
  7. @theme {
  8. --color-border: hsl(214.3 31.8% 91.4%);
  9. --color-input: hsl(214.3 31.8% 91.4%);
  10. --color-ring: hsl(207 90% 50%);
  11. --color-background: hsl(220 14% 98%);
  12. --color-foreground: hsl(222.2 84% 4.9%);
  13. --color-primary: hsl(207 90% 50%);
  14. --color-primary-foreground: hsl(210 40% 98%);
  15. --color-secondary: hsl(210 40% 96.1%);
  16. --color-secondary-foreground: hsl(222.2 47.4% 11.2%);
  17. --color-muted: hsl(220 14% 92%);
  18. --color-muted-foreground: hsl(215.4 16.3% 46.9%);
  19. --color-accent: hsl(210 40% 96.1%);
  20. --color-accent-foreground: hsl(222.2 47.4% 11.2%);
  21. --color-destructive: hsl(0 84.2% 60.2%);
  22. --color-destructive-foreground: hsl(210 40% 98%);
  23. --color-card: hsl(0 0% 100%);
  24. --color-card-foreground: hsl(222.2 84% 4.9%);
  25. --color-popover: hsl(0 0% 100%);
  26. --color-popover-foreground: hsl(222.2 84% 4.9%);
  27. --radius: 0.5rem;
  28. --radius-lg: 0.75rem;
  29. --radius-md: calc(var(--radius) - 2px);
  30. --radius-sm: calc(var(--radius) - 4px);
  31. --font-family-sans: 'Plus Jakarta Sans', 'Noto Sans', sans-serif;
  32. }
  33. /* Dark mode */
  34. .dark {
  35. color-scheme: dark;
  36. --color-border: hsl(0 0% 32%);
  37. --color-input: hsl(0 0% 32%);
  38. --color-ring: hsl(207 90% 50%);
  39. --color-background: hsl(0 0% 10%);
  40. --color-foreground: hsl(210 40% 98%);
  41. --color-primary: hsl(207 90% 50%);
  42. --color-primary-foreground: hsl(210 40% 98%);
  43. --color-secondary: hsl(0 0% 25%);
  44. --color-secondary-foreground: hsl(210 40% 98%);
  45. --color-muted: hsl(0 0% 25%);
  46. --color-muted-foreground: hsl(215 20.2% 65.1%);
  47. --color-accent: hsl(0 0% 25%);
  48. --color-accent-foreground: hsl(210 40% 98%);
  49. --color-destructive: hsl(0 62.8% 50.6%);
  50. --color-destructive-foreground: hsl(210 40% 98%);
  51. --color-card: hsl(0 0% 18%);
  52. --color-card-foreground: hsl(210 40% 98%);
  53. --color-input-background: hsl(0 0% 28%);
  54. --color-popover: hsl(0 0% 15%);
  55. --color-popover-foreground: hsl(210 40% 98%);
  56. }
  57. /* Base styles */
  58. * {
  59. border-color: var(--color-border);
  60. }
  61. /* Form label spacing - adds margin below labels for better readability */
  62. label {
  63. display: block;
  64. margin-bottom: 0.5rem;
  65. }
  66. /* Form input background - lighter than card for visibility */
  67. .dark input:not([type="checkbox"]):not([type="radio"]),
  68. .dark select,
  69. .dark textarea,
  70. .dark [role="combobox"] {
  71. background-color: var(--color-input-background);
  72. }
  73. body {
  74. background-color: var(--color-background);
  75. color: var(--color-foreground);
  76. font-family: var(--font-family-sans);
  77. margin: 0;
  78. min-height: 100dvh; /* Use dynamic viewport height for mobile */
  79. }
  80. /* Safe area utilities for iOS notch/home indicator */
  81. .pb-safe {
  82. padding-bottom: env(safe-area-inset-bottom, 0px);
  83. }
  84. .mb-safe {
  85. margin-bottom: env(safe-area-inset-bottom, 0px);
  86. }
  87. /* Material Icons */
  88. .material-icons,
  89. .material-icons-outlined {
  90. font-family: 'Material Icons';
  91. font-weight: normal;
  92. font-style: normal;
  93. font-size: 24px;
  94. line-height: 1;
  95. letter-spacing: normal;
  96. text-transform: none;
  97. display: inline-block;
  98. white-space: nowrap;
  99. word-wrap: normal;
  100. direction: ltr;
  101. -webkit-font-feature-settings: 'liga';
  102. -webkit-font-smoothing: antialiased;
  103. }
  104. .material-icons-outlined {
  105. font-family: 'Material Icons Outlined';
  106. }
  107. /* Invert pattern previews in dark mode */
  108. .dark .pattern-preview {
  109. filter: invert(1);
  110. }
  111. /* Marquee animation for scrolling text */
  112. @keyframes marquee {
  113. 0%, 10% {
  114. transform: translateX(calc(-100% + 100cqw));
  115. }
  116. 45%, 55% {
  117. transform: translateX(0);
  118. }
  119. 90%, 100% {
  120. transform: translateX(calc(-100% + 100cqw));
  121. }
  122. }
  123. .marquee-container {
  124. container-type: inline-size;
  125. overflow: hidden;
  126. }
  127. .animate-marquee {
  128. display: inline-block;
  129. }
  130. /* Marquee animation only on mobile */
  131. @media (max-width: 767px) {
  132. .animate-marquee {
  133. animation: marquee 8s ease-in-out infinite;
  134. animation-play-state: running;
  135. }
  136. .animate-marquee:hover {
  137. animation-play-state: paused;
  138. }
  139. }
  140. /* Now Playing Bar heights - responsive for mobile vs desktop */
  141. [data-now-playing-bar="collapsed"] {
  142. height: 200px;
  143. }
  144. [data-now-playing-bar="expanded"] {
  145. height: 50vh;
  146. }
  147. @media (max-width: 767px) {
  148. [data-now-playing-bar="collapsed"] {
  149. height: 256px;
  150. }
  151. [data-now-playing-bar="expanded"] {
  152. height: calc(100vh - 64px - 64px);
  153. }
  154. }
  155. /* Smooth fade in for lazy-loaded content */
  156. @keyframes fadeIn {
  157. from {
  158. opacity: 0;
  159. transform: scale(0.98);
  160. }
  161. to {
  162. opacity: 1;
  163. transform: scale(1);
  164. }
  165. }
  166. .animate-fade-in {
  167. animation: fadeIn 0.2s ease-out forwards;
  168. }
  169. /* Subtle pulse for connection status */
  170. @keyframes subtle-pulse {
  171. 0%, 100% {
  172. opacity: 1;
  173. }
  174. 50% {
  175. opacity: 0.6;
  176. }
  177. }
  178. .animate-subtle-pulse {
  179. animation: subtle-pulse 2s ease-in-out infinite;
  180. }
  181. /* Slide in from right for panels */
  182. @keyframes slideInRight {
  183. from {
  184. transform: translateX(100%);
  185. opacity: 0;
  186. }
  187. to {
  188. transform: translateX(0);
  189. opacity: 1;
  190. }
  191. }
  192. .animate-slide-in-right {
  193. animation: slideInRight 0.3s ease-out forwards;
  194. }