- SAN cert covers all 5 PWA domains (tasks,cal,plans,goals,chat) - i18n hydration: SSR uses cs default, localStorage after mount - Matches ThemeProvider pattern Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
255 lines
4.2 KiB
CSS
255 lines
4.2 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
:root {
|
|
--background: #ffffff;
|
|
--foreground: #171717;
|
|
--card: #f9fafb;
|
|
--card-border: #e5e7eb;
|
|
--muted: #6b7280;
|
|
--primary: #3b82f6;
|
|
}
|
|
|
|
.dark {
|
|
--background: #0a0a0a;
|
|
--foreground: #ededed;
|
|
--card: #1a1a2e;
|
|
--card-border: #2d2d44;
|
|
--muted: #9ca3af;
|
|
--primary: #60a5fa;
|
|
}
|
|
|
|
body {
|
|
background: var(--background);
|
|
color: var(--foreground);
|
|
font-family: system-ui, -apple-system, sans-serif;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
font-size: 16px; /* prevent auto-zoom on iOS */
|
|
max-width: 100vw;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
/* Mobile-first base */
|
|
* {
|
|
box-sizing: border-box;
|
|
-webkit-tap-highlight-color: transparent;
|
|
}
|
|
|
|
input[type="text"],
|
|
input[type="email"],
|
|
input[type="password"],
|
|
input[type="datetime-local"],
|
|
textarea,
|
|
select {
|
|
font-size: 16px; /* Prevent zoom on iOS */
|
|
}
|
|
|
|
/* Touch targets - minimum 44px for accessibility */
|
|
@media (max-width: 768px) {
|
|
button,
|
|
a,
|
|
[role="button"] {
|
|
min-height: 44px;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
.scrollbar-hide {
|
|
-ms-overflow-style: none;
|
|
scrollbar-width: none;
|
|
}
|
|
.scrollbar-hide::-webkit-scrollbar {
|
|
display: none;
|
|
}
|
|
|
|
.text-muted {
|
|
color: var(--muted);
|
|
}
|
|
}
|
|
|
|
/* Smooth scrolling with snap */
|
|
.snap-x {
|
|
scroll-snap-type: x mandatory;
|
|
-webkit-overflow-scrolling: touch;
|
|
}
|
|
.snap-center {
|
|
scroll-snap-align: center;
|
|
}
|
|
.snap-mandatory {
|
|
scroll-snap-type: x mandatory;
|
|
}
|
|
|
|
/* Bottom navigation responsive */
|
|
@media (max-width: 640px) {
|
|
.bottom-nav {
|
|
display: flex;
|
|
}
|
|
.desktop-sidebar {
|
|
display: none;
|
|
}
|
|
}
|
|
@media (min-width: 641px) {
|
|
.bottom-nav {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* Safe area for notched devices */
|
|
.safe-area-bottom {
|
|
padding-bottom: env(safe-area-inset-bottom, 0px);
|
|
}
|
|
|
|
/* Smooth page transitions */
|
|
main {
|
|
animation: fadeIn 0.15s ease-out;
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(4px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
/* Slide-in animations for drawer */
|
|
@keyframes slideInRight {
|
|
from {
|
|
transform: translateX(100%);
|
|
}
|
|
to {
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
.animate-slideInRight {
|
|
animation: slideInRight 0.25s ease-out;
|
|
}
|
|
|
|
/* Swipe overlay animations */
|
|
@keyframes slideOverlayLeft {
|
|
0% {
|
|
opacity: 0;
|
|
transform: translateX(40px) scale(0.9);
|
|
}
|
|
30% {
|
|
opacity: 1;
|
|
transform: translateX(0) scale(1);
|
|
}
|
|
70% {
|
|
opacity: 1;
|
|
transform: translateX(0) scale(1);
|
|
}
|
|
100% {
|
|
opacity: 0;
|
|
transform: translateX(-20px) scale(0.95);
|
|
}
|
|
}
|
|
|
|
@keyframes slideOverlayRight {
|
|
0% {
|
|
opacity: 0;
|
|
transform: translateX(-40px) scale(0.9);
|
|
}
|
|
30% {
|
|
opacity: 1;
|
|
transform: translateX(0) scale(1);
|
|
}
|
|
70% {
|
|
opacity: 1;
|
|
transform: translateX(0) scale(1);
|
|
}
|
|
100% {
|
|
opacity: 0;
|
|
transform: translateX(20px) scale(0.95);
|
|
}
|
|
}
|
|
|
|
.animate-slideOverlayLeft {
|
|
animation: slideOverlayLeft 0.6s ease-out forwards;
|
|
}
|
|
|
|
.animate-slideOverlayRight {
|
|
animation: slideOverlayRight 0.6s ease-out forwards;
|
|
}
|
|
|
|
/* Content slide animations for group switch */
|
|
@keyframes slideContentLeft {
|
|
0% {
|
|
opacity: 0.3;
|
|
transform: translateX(30px);
|
|
}
|
|
100% {
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
@keyframes slideContentRight {
|
|
0% {
|
|
opacity: 0.3;
|
|
transform: translateX(-30px);
|
|
}
|
|
100% {
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
.animate-slideContentLeft {
|
|
animation: slideContentLeft 0.3s ease-out;
|
|
}
|
|
|
|
.animate-slideContentRight {
|
|
animation: slideContentRight 0.3s ease-out;
|
|
}
|
|
|
|
/* Fade-in for backdrop */
|
|
@keyframes fadeInBackdrop {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
.animate-fadeIn {
|
|
animation: fadeInBackdrop 0.2s ease-out;
|
|
}
|
|
|
|
/* Mobile overscroll behavior */
|
|
@media (max-width: 640px) {
|
|
html {
|
|
overscroll-behavior-y: contain;
|
|
}
|
|
}
|
|
|
|
|
|
/* Mobile modal fix */
|
|
.modal-content {
|
|
max-height: 90vh;
|
|
max-height: 90dvh; /* dynamic viewport height */
|
|
overflow-y: auto;
|
|
-webkit-overflow-scrolling: touch;
|
|
overscroll-behavior: contain;
|
|
}
|
|
|
|
/* Ensure modal buttons visible above keyboard */
|
|
@media (max-width: 640px) {
|
|
.modal-content {
|
|
max-height: 85vh;
|
|
max-height: 85dvh;
|
|
}
|
|
}
|
|
|
|
/* Selection color */
|
|
::selection {
|
|
background: rgba(59, 130, 246, 0.3);
|
|
}
|