progresspulse-pwa
Version:
A modern PWA for tracking progress and achieving goals with iPhone-style design
643 lines (549 loc) • 14.4 kB
CSS
@import url('https://fonts.googleapis.com/css2?family=SF+Pro+Display:wght@100;200;300;400;500;600;700;800;900&family=SF+Pro+Text:wght@300;400;500;600;700&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Ensure full width pages use complete screen width */
.w-full {
width: 100% ;
max-width: none ;
}
/* Mobile: Prevent horizontal overflow and ensure proper scrolling */
@media (max-width: 768px) {
/* Prevent horizontal scroll */
html, body {
overflow-x: hidden;
width: 100%;
}
/* Ensure all content fits within viewport */
* {
max-width: 100vw;
box-sizing: border-box;
}
/* Fix specific components that might overflow */
.grid {
max-width: 100%;
overflow-x: auto;
}
.card {
max-width: calc(100vw - 2rem);
}
table {
max-width: 100%;
overflow-x: auto;
display: block;
white-space: nowrap;
}
/* Ensure dialogs fit on mobile */
[role="dialog"] {
max-width: 95vw;
margin: 0.5rem auto;
}
/* Fix for mobile navigation spacing */
main {
padding-bottom: 5rem; /* Space for mobile nav */
}
/* Mobile button sizing */
button {
font-size: 0.875rem; /* 14px */
padding: 0.5rem 1rem;
}
/* Ensure buttons don't stretch on mobile */
.flex button {
flex-shrink: 0;
}
/* Mobile-specific adjustments */
.content-section {
@apply px-4 py-3;
}
/* Ensure proper text sizing on mobile */
.content-section h1 {
@apply text-2xl;
}
}
:root {
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
line-height: 1.47;
font-weight: 400;
letter-spacing: -0.022em;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #000000;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: 'kern' 1, 'liga' 1, 'calt' 1;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
@layer base {
:root {
/* iPhone-style Light Mode Colors */
--background: 0 0% 98%;
--foreground: 0 0% 7%;
--card: 0 0% 100%;
--card-foreground: 0 0% 7%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 7%;
--primary: 211 100% 50%;
--primary-foreground: 0 0% 100%;
--secondary: 210 40% 96%;
--secondary-foreground: 0 0% 7%;
--muted: 210 40% 96%;
--muted-foreground: 0 0% 45%;
--accent: 210 40% 96%;
--accent-foreground: 0 0% 7%;
--destructive: 0 84% 60%;
--destructive-foreground: 0 0% 98%;
--border: 214 32% 91%;
--input: 214 32% 91%;
--ring: 211 100% 50%;
--chart-1: 211 100% 50%;
--chart-2: 142 76% 36%;
--chart-3: 346 87% 43%;
--chart-4: 262 83% 58%;
--chart-5: 47 96% 53%;
--radius: 0.75rem;
/* iPhone-style spacing and sizing */
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--spacing-xl: 2rem;
--spacing-2xl: 3rem;
/* iPhone-style typography scale */
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 1.875rem;
--text-4xl: 2.25rem;
/* iPhone-style shadows */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
/* iPhone-style blur effects */
--blur-sm: 4px;
--blur: 8px;
--blur-md: 12px;
--blur-lg: 16px;
--blur-xl: 24px;
}
.dark {
/* iPhone-style Dark Mode Colors */
--background: 0 0% 6%;
--foreground: 0 0% 98%;
--card: 0 0% 8%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 8%;
--popover-foreground: 0 0% 98%;
--primary: 211 100% 50%;
--primary-foreground: 0 0% 100%;
--secondary: 217 33% 17%;
--secondary-foreground: 0 0% 98%;
--muted: 217 33% 17%;
--muted-foreground: 0 0% 65%;
--accent: 217 33% 17%;
--accent-foreground: 0 0% 98%;
--destructive: 0 84% 60%;
--destructive-foreground: 0 0% 98%;
--border: 217 33% 17%;
--input: 217 33% 17%;
--ring: 211 100% 50%;
--chart-1: 211 100% 50%;
--chart-2: 142 76% 36%;
--chart-3: 346 87% 43%;
--chart-4: 262 83% 58%;
--chart-5: 47 96% 53%;
/* Dark mode shadows */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
--shadow: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.4);
}
}
@layer base {
* {
@apply border-border;
}
html {
height: 100%;
overflow-x: hidden;
}
body {
@apply bg-background text-foreground;
margin: 0;
padding: 0;
min-width: 320px;
height: 100%;
overflow-x: hidden;
}
#root {
width: 100%;
height: 100%;
min-height: 100vh;
}
}
@layer components {
/* iPhone-style Typography */
.text-ios-title {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 700;
font-size: 2.125rem;
line-height: 1.2;
letter-spacing: -0.03em;
@apply text-foreground;
}
.text-ios-headline {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 600;
font-size: 1.375rem;
line-height: 1.3;
letter-spacing: -0.02em;
@apply text-foreground;
}
.text-ios-body {
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.47;
letter-spacing: -0.022em;
@apply text-foreground;
}
.text-ios-caption {
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
font-size: 0.75rem;
line-height: 1.33;
letter-spacing: -0.01em;
@apply text-muted-foreground;
}
/* iPhone-style Cards */
.card-ios {
@apply bg-card/80 backdrop-blur-xl border border-border/50 rounded-2xl shadow-lg;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.card-ios:hover {
@apply shadow-xl scale-[1.02];
transform: translateY(-2px) scale(1.02);
}
.card-ios-glass {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.2);
@apply rounded-2xl shadow-2xl;
}
/* iPhone-style Buttons */
.btn-ios-primary {
@apply bg-primary text-primary-foreground font-semibold rounded-2xl px-6 py-3;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 1rem;
line-height: 1.2;
letter-spacing: -0.022em;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 14px 0 rgba(59, 130, 246, 0.3);
}
.btn-ios-primary:hover {
@apply scale-105;
box-shadow: 0 6px 20px 0 rgba(59, 130, 246, 0.4);
}
.btn-ios-primary:active {
@apply scale-95;
transition: all 0.1s cubic-bezier(0.4, 0, 0.2, 1);
}
.btn-ios-secondary {
@apply bg-secondary text-secondary-foreground font-medium rounded-2xl px-6 py-3;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.btn-ios-secondary:hover {
@apply scale-105 bg-secondary/80;
}
/* iPhone-style Animations */
.animate-ios-fade-in {
animation: iosFadeIn 0.6s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
.animate-ios-slide-up {
animation: iosSlideUp 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
.animate-ios-bounce {
animation: iosBounce 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;
}
.animate-ios-scale {
animation: iosScale 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
/* iPhone-style Layout */
.container-ios {
@apply w-full max-w-sm mx-auto px-4;
}
.page-ios {
@apply w-full h-full min-h-screen bg-background;
background: linear-gradient(135deg, hsl(var(--background)) 0%, hsl(var(--muted)) 100%);
}
.content-section-ios {
@apply px-6 py-4 space-y-4;
}
/* iPhone-style Navigation */
.nav-ios {
@apply bg-card/80 backdrop-blur-xl border-t border-border/50;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1);
}
.nav-item-ios {
@apply flex flex-col items-center justify-center p-2 rounded-xl;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.nav-item-ios:hover {
@apply bg-primary/10 scale-110;
}
.nav-item-ios.active {
@apply bg-primary/20 text-primary;
}
/* iPhone-style Form Elements */
.input-ios {
@apply bg-card border border-border/50 rounded-2xl px-4 py-3;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.input-ios:focus {
@apply border-primary/50 ring-2 ring-primary/20 scale-[1.02];
}
/* iPhone-style Progress */
.progress-ios {
@apply bg-secondary rounded-full overflow-hidden;
height: 8px;
}
.progress-ios-bar {
@apply bg-gradient-to-r from-primary to-primary/80 h-full rounded-full;
transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
/* iPhone-style Shadows and Effects */
.shadow-ios {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
.shadow-ios-lg {
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
}
.blur-ios {
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
}
/* iPhone-style Grid */
.grid-ios {
@apply grid gap-4;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
/* iPhone-style Status Elements */
.status-ios-success {
@apply bg-green-500/10 text-green-600 border border-green-500/20 rounded-2xl px-3 py-1;
}
.status-ios-warning {
@apply bg-yellow-500/10 text-yellow-600 border border-yellow-500/20 rounded-2xl px-3 py-1;
}
.status-ios-error {
@apply bg-red-500/10 text-red-600 border border-red-500/20 rounded-2xl px-3 py-1;
}
}
@layer utilities {
/* Responsive spacing utilities */
.p-responsive {
@apply p-4 sm:p-6 lg:p-8;
}
.m-responsive {
@apply m-4 sm:m-6 lg:m-8;
}
/* Responsive width utilities */
.w-responsive {
@apply w-full max-w-full;
}
/* Safe area utilities for mobile */
.safe-top {
padding-top: env(safe-area-inset-top);
}
.safe-bottom {
padding-bottom: env(safe-area-inset-bottom);
}
.safe-left {
padding-left: env(safe-area-inset-left);
}
.safe-right {
padding-right: env(safe-area-inset-right);
}
}
/* iPhone-style Keyframe Animations */
@keyframes iosFadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes iosSlideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes iosBounce {
0% {
opacity: 0;
transform: scale(0.3) translateY(50px);
}
50% {
opacity: 1;
transform: scale(1.05) translateY(-10px);
}
70% {
transform: scale(0.95) translateY(0);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
@keyframes iosScale {
from {
opacity: 0;
transform: scale(0.8);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes iosPulse {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.8;
transform: scale(1.05);
}
}
@keyframes iosShimmer {
0% {
background-position: -200px 0;
}
100% {
background-position: calc(200px + 100%) 0;
}
}
/* iPhone-style Haptic Feedback Simulation */
@keyframes iosHaptic {
0% { transform: translateX(0); }
25% { transform: translateX(-1px); }
75% { transform: translateX(1px); }
100% { transform: translateX(0); }
}
.animate-ios-haptic {
animation: iosHaptic 0.1s ease-in-out;
}
/* iPhone-style Loading States */
.loading-ios {
background: linear-gradient(90deg,
hsl(var(--muted)) 25%,
hsl(var(--muted-foreground) / 0.1) 50%,
hsl(var(--muted)) 75%
);
background-size: 200px 100%;
animation: iosShimmer 1.5s infinite;
}
/* iPhone-style Scroll Behavior */
html {
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
}
/* iPhone-style Selection */
::selection {
background: hsl(var(--primary) / 0.2);
color: hsl(var(--primary-foreground));
}
::-moz-selection {
background: hsl(var(--primary) / 0.2);
color: hsl(var(--primary-foreground));
}
/* iPhone-style Scrollbar */
::-webkit-scrollbar {
width: 4px;
height: 4px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: hsl(var(--muted-foreground) / 0.3);
border-radius: 2px;
}
::-webkit-scrollbar-thumb:hover {
background: hsl(var(--muted-foreground) / 0.5);
}
/* iPhone-style Focus States */
.focus-ios:focus {
outline: none;
box-shadow: 0 0 0 3px hsl(var(--primary) / 0.2);
border-color: hsl(var(--primary));
}
/* iPhone-style Disabled States */
.disabled-ios {
opacity: 0.5;
pointer-events: none;
filter: grayscale(0.5);
}