From 8d5e7065211afecf6e2bd14c8ca848e4fb545c38 Mon Sep 17 00:00:00 2001
From: 230417 <230417@epvc.pt>
Date: Thu, 21 May 2026 10:26:50 +0100
Subject: [PATCH] desing
---
App.tsx | 2 +-
src/components/ui/Badge.tsx | 28 ++--
src/components/ui/Button.tsx | 19 +--
src/components/ui/Card.tsx | 8 +-
src/components/ui/Input.tsx | 19 +--
src/components/ui/Stepper.tsx | 41 +++---
src/lib/theme.ts | 88 +++++++++++++
src/navigation/AppNavigator.tsx | 44 ++++---
src/pages/AuthLogin.tsx | 46 ++++---
src/pages/AuthRegister.tsx | 60 +++++----
src/pages/Booking.tsx | 97 +++++++-------
src/pages/Cart.tsx | 54 ++++----
src/pages/Dashboard.tsx | 227 +++++++++++++++++---------------
src/pages/EventsCreate.tsx | 23 ++--
src/pages/Explore.tsx | 127 ++++++++++--------
src/pages/Landing.tsx | 62 ++++-----
src/pages/Profile.tsx | 117 ++++++++--------
src/pages/ShopDetails.tsx | 96 ++++++++------
18 files changed, 662 insertions(+), 496 deletions(-)
create mode 100644 src/lib/theme.ts
diff --git a/App.tsx b/App.tsx
index a790aa7..9b2795b 100644
--- a/App.tsx
+++ b/App.tsx
@@ -9,7 +9,7 @@ export default function App() {
-
+
);
diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx
index d52dde6..9df35b0 100644
--- a/src/components/ui/Badge.tsx
+++ b/src/components/ui/Badge.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { View, Text, StyleSheet, ViewStyle } from 'react-native';
+import { colors, radius } from '../../lib/theme';
type Props = {
children: React.ReactNode;
@@ -10,20 +11,20 @@ type Props = {
const colorMap = {
solid: {
- amber: { bg: '#f59e0b', text: '#fff' },
- slate: { bg: '#475569', text: '#fff' },
- green: { bg: '#10b981', text: '#fff' },
- red: { bg: '#ef4444', text: '#fff' },
- blue: { bg: '#3b82f6', text: '#fff' },
- indigo: { bg: '#6366f1', text: '#fff' },
+ amber: { bg: colors.accent, text: colors.textInverse },
+ slate: { bg: colors.textSoft, text: colors.textInverse },
+ green: { bg: colors.success, text: colors.textInverse },
+ red: { bg: colors.danger, text: colors.textInverse },
+ blue: { bg: colors.primary, text: colors.textInverse },
+ indigo: { bg: colors.primary, text: colors.textInverse },
},
soft: {
- amber: { bg: '#fef3c7', text: '#92400e' },
- slate: { bg: '#f1f5f9', text: '#475569' },
- green: { bg: '#d1fae5', text: '#065f46' },
- red: { bg: '#fee2e2', text: '#991b1b' },
- blue: { bg: '#dbeafe', text: '#1e40af' },
- indigo: { bg: '#e0e7ff', text: '#4338ca' },
+ amber: { bg: colors.accentSoft, text: '#7a4310' },
+ slate: { bg: colors.backgroundAlt, text: colors.textSoft },
+ green: { bg: colors.successSoft, text: '#166534' },
+ red: { bg: colors.dangerSoft, text: '#991b1b' },
+ blue: { bg: colors.primarySoft, text: colors.primaryDark },
+ indigo: { bg: colors.primarySoft, text: colors.primaryDark },
},
};
@@ -41,7 +42,7 @@ const styles = StyleSheet.create({
badge: {
paddingHorizontal: 10,
paddingVertical: 4,
- borderRadius: 12,
+ borderRadius: radius.pill,
alignSelf: 'flex-start',
},
text: {
@@ -50,4 +51,3 @@ const styles = StyleSheet.create({
},
});
-
diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx
index 862a0d9..00ebd11 100644
--- a/src/components/ui/Button.tsx
+++ b/src/components/ui/Button.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { TouchableOpacity, Text, StyleSheet, ActivityIndicator, ViewStyle, TextStyle, StyleProp } from 'react-native';
+import { colors, radius, shadows } from '../../lib/theme';
type Props = {
children: React.ReactNode;
@@ -36,7 +37,7 @@ export const Button = ({ children, onPress, variant = 'solid', size = 'md', disa
activeOpacity={0.7}
>
{loading ? (
-
+
) : (
{children}
)}
@@ -46,18 +47,20 @@ export const Button = ({ children, onPress, variant = 'solid', size = 'md', disa
const styles = StyleSheet.create({
base: {
- borderRadius: 14,
+ borderRadius: radius.md,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
+ minHeight: 44,
},
solid: {
- backgroundColor: '#6366f1',
+ backgroundColor: colors.primary,
+ ...shadows.soft,
},
outline: {
backgroundColor: 'transparent',
- borderWidth: 1.5,
- borderColor: 'rgba(99,102,241,0.4)',
+ borderWidth: 1,
+ borderColor: colors.borderStrong,
},
ghost: {
backgroundColor: 'transparent',
@@ -81,13 +84,13 @@ const styles = StyleSheet.create({
fontWeight: '700',
},
text_solid: {
- color: '#fff',
+ color: colors.textInverse,
},
text_outline: {
- color: '#a5b4fc',
+ color: colors.primaryDark,
},
text_ghost: {
- color: '#a5b4fc',
+ color: colors.primaryDark,
},
textSize_sm: {
fontSize: 12,
diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx
index 87f2676..72195b2 100644
--- a/src/components/ui/Card.tsx
+++ b/src/components/ui/Card.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { View, StyleSheet, ViewStyle, StyleProp } from 'react-native';
+import { colors, radius, shadows } from '../../lib/theme';
type Props = {
children: React.ReactNode;
@@ -12,10 +13,11 @@ export const Card = ({ children, style }: Props) => {
const styles = StyleSheet.create({
card: {
- backgroundColor: '#141420',
- borderRadius: 20,
+ backgroundColor: colors.surface,
+ borderRadius: radius.sm,
padding: 16,
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.06)',
+ borderColor: colors.border,
+ ...shadows.card,
},
});
diff --git a/src/components/ui/Input.tsx b/src/components/ui/Input.tsx
index 492f3aa..c53f2ab 100644
--- a/src/components/ui/Input.tsx
+++ b/src/components/ui/Input.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { TextInput, View, Text, StyleSheet, TextInputProps } from 'react-native';
+import { colors, radius } from '../../lib/theme';
type Props = TextInputProps & {
label?: string;
@@ -12,7 +13,7 @@ export const Input = ({ label, error, style, ...props }: Props) => {
{label && {label}}
{error && {error}}
@@ -27,27 +28,27 @@ const styles = StyleSheet.create({
label: {
fontSize: 12,
fontWeight: '700',
- color: '#94a3b8',
+ color: colors.textMuted,
textTransform: 'uppercase',
- letterSpacing: 0.5,
+ letterSpacing: 0,
marginBottom: 8,
},
input: {
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.08)',
- borderRadius: 14,
+ borderColor: colors.border,
+ borderRadius: radius.md,
paddingHorizontal: 16,
paddingVertical: 14,
fontSize: 15,
- color: '#f8fafc',
- backgroundColor: '#1c1c2e',
+ color: colors.text,
+ backgroundColor: colors.surface,
},
inputError: {
- borderColor: '#ef4444',
+ borderColor: colors.danger,
},
error: {
fontSize: 12,
- color: '#ef4444',
+ color: colors.danger,
marginTop: 6,
},
});
diff --git a/src/components/ui/Stepper.tsx b/src/components/ui/Stepper.tsx
index 6b4b7aa..05b70e6 100644
--- a/src/components/ui/Stepper.tsx
+++ b/src/components/ui/Stepper.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
+import { colors, radius, shadows } from '../../lib/theme';
type Step = {
id: number;
@@ -69,14 +70,12 @@ export const Stepper = ({ steps, currentStep }: Props) => {
const styles = StyleSheet.create({
container: {
paddingVertical: 20,
- backgroundColor: '#fff',
- borderRadius: 16,
+ backgroundColor: colors.surface,
+ borderRadius: radius.sm,
marginBottom: 16,
- shadowColor: '#000',
- shadowOffset: { width: 0, height: 1 },
- shadowOpacity: 0.05,
- shadowRadius: 2,
- elevation: 2,
+ borderWidth: 1,
+ borderColor: colors.border,
+ ...shadows.soft,
},
stepsWrapper: {
flexDirection: 'row',
@@ -94,44 +93,44 @@ const styles = StyleSheet.create({
width: 30,
height: 30,
borderRadius: 15,
- backgroundColor: '#fff',
+ backgroundColor: colors.surface,
borderWidth: 2,
- borderColor: '#e2e8f0',
+ borderColor: colors.borderStrong,
alignItems: 'center',
justifyContent: 'center',
marginBottom: 6,
},
circleActive: {
- borderColor: '#6366f1',
- backgroundColor: '#6366f1',
+ borderColor: colors.primary,
+ backgroundColor: colors.primary,
},
circleCompleted: {
- borderColor: '#6366f1',
- backgroundColor: '#6366f1',
+ borderColor: colors.primary,
+ backgroundColor: colors.primary,
},
stepNumber: {
fontSize: 12,
fontWeight: 'bold',
- color: '#94a3b8',
+ color: colors.textSubtle,
},
stepNumberActive: {
- color: '#fff',
+ color: colors.textInverse,
},
stepNumberCompleted: {
- color: '#fff',
+ color: colors.textInverse,
},
label: {
fontSize: 9,
fontWeight: 'bold',
- color: '#94a3b8',
+ color: colors.textSubtle,
textTransform: 'uppercase',
textAlign: 'center',
},
labelActive: {
- color: '#6366f1',
+ color: colors.primary,
},
labelCompleted: {
- color: '#6366f1',
+ color: colors.primary,
},
lineBackground: {
position: 'absolute',
@@ -139,7 +138,7 @@ const styles = StyleSheet.create({
left: 50, // approx center of first circle (20 padding + 60/2)
right: 50, // approx center of last circle
height: 2,
- backgroundColor: '#e2e8f0',
+ backgroundColor: colors.border,
zIndex: 0,
},
lineProgress: {
@@ -148,7 +147,7 @@ const styles = StyleSheet.create({
left: 50,
// Width is controlled by style prop
height: 2,
- backgroundColor: '#6366f1',
+ backgroundColor: colors.primary,
zIndex: 0,
maxWidth: '75%', // approx distance between first and last circle centers
},
diff --git a/src/lib/theme.ts b/src/lib/theme.ts
new file mode 100644
index 0000000..c7b7606
--- /dev/null
+++ b/src/lib/theme.ts
@@ -0,0 +1,88 @@
+import { Platform } from 'react-native';
+
+export const colors = {
+ background: '#eef3ef',
+ backgroundAlt: '#e5ebe7',
+ surface: '#ffffff',
+ surfaceMuted: '#f7faf8',
+ surfaceDark: '#14211d',
+ surfaceDarkMuted: '#20312b',
+ text: '#17211d',
+ textSoft: '#35443e',
+ textMuted: '#64736d',
+ textSubtle: '#87948f',
+ textInverse: '#f8fbf8',
+ border: '#dce5df',
+ borderStrong: '#c8d5ce',
+ borderDark: 'rgba(255,255,255,0.12)',
+ primary: '#0f766e',
+ primaryDark: '#0b4f49',
+ primarySoft: '#d9f1ed',
+ accent: '#c87918',
+ accentSoft: '#fff1d1',
+ success: '#16a34a',
+ successSoft: '#dcfce7',
+ danger: '#dc2626',
+ dangerSoft: '#fee2e2',
+ warning: '#d97706',
+ warningSoft: '#fef3c7',
+ star: '#f2a51a',
+ overlay: 'rgba(12,20,17,0.56)',
+ placeholder: '#8a9791',
+};
+
+export const radius = {
+ xs: 6,
+ sm: 8,
+ md: 10,
+ lg: 12,
+ xl: 16,
+ pill: 999,
+};
+
+export const spacing = {
+ screen: 20,
+};
+
+const cardShadow = Platform.select({
+ ios: {
+ shadowColor: '#102018',
+ shadowOffset: { width: 0, height: 8 },
+ shadowOpacity: 0.08,
+ shadowRadius: 18,
+ },
+ android: {
+ elevation: 3,
+ },
+ default: {
+ shadowColor: '#102018',
+ shadowOffset: { width: 0, height: 8 },
+ shadowOpacity: 0.08,
+ shadowRadius: 18,
+ elevation: 3,
+ },
+}) ?? {};
+
+const softShadow = Platform.select({
+ ios: {
+ shadowColor: '#102018',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.06,
+ shadowRadius: 12,
+ },
+ android: {
+ elevation: 2,
+ },
+ default: {
+ shadowColor: '#102018',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.06,
+ shadowRadius: 12,
+ elevation: 2,
+ },
+}) ?? {};
+
+export const shadows = {
+ card: cardShadow,
+ soft: softShadow,
+};
diff --git a/src/navigation/AppNavigator.tsx b/src/navigation/AppNavigator.tsx
index 90dd13c..462587c 100644
--- a/src/navigation/AppNavigator.tsx
+++ b/src/navigation/AppNavigator.tsx
@@ -4,6 +4,7 @@ import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { View, Text, StyleSheet, Platform } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
+import { colors, radius } from '../lib/theme';
import { useApp } from '../context/AppContext';
import AuthLogin from '../pages/AuthLogin';
import AuthRegister from '../pages/AuthRegister';
@@ -23,7 +24,7 @@ const TabIcon = ({ name, focused }: { name: any; focused: boolean }) => (
);
@@ -31,7 +32,7 @@ const TabIcon = ({ name, focused }: { name: any; focused: boolean }) => (
/* ── Client Tab Stacks ── */
function ExploreStack() {
return (
-
+
@@ -41,7 +42,7 @@ function ExploreStack() {
function CartStack() {
return (
-
+
);
@@ -49,7 +50,7 @@ function CartStack() {
function ClientProfileStack() {
return (
-
+
@@ -62,11 +63,12 @@ function ClientTabs() {
const { cart } = useApp();
return (
@@ -103,7 +105,7 @@ function ClientTabs() {
/* ── Barbearia Tab Stacks ── */
function DashboardStack() {
return (
-
+
@@ -112,7 +114,7 @@ function DashboardStack() {
function BarberProfileStack() {
return (
-
+
@@ -122,11 +124,12 @@ function BarberProfileStack() {
function BarbeariaTabs() {
return (
@@ -158,9 +161,10 @@ export default function AppNavigator() {
{!user ? (
@@ -180,8 +184,8 @@ export default function AppNavigator() {
const tabStyles = StyleSheet.create({
bar: {
- backgroundColor: '#0a0a0f',
- borderTopColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.surfaceDark,
+ borderTopColor: colors.borderDark,
borderTopWidth: 1,
height: Platform.OS === 'ios' ? 88 : 64,
paddingBottom: Platform.OS === 'ios' ? 28 : 8,
@@ -190,11 +194,11 @@ const tabStyles = StyleSheet.create({
label: {
fontSize: 10,
fontWeight: '700',
- letterSpacing: 0.5,
+ letterSpacing: 0,
},
badge: {
- backgroundColor: '#6366f1',
- color: '#fff',
+ backgroundColor: colors.accent,
+ color: colors.textInverse,
fontSize: 10,
fontWeight: '800',
minWidth: 18,
@@ -207,15 +211,15 @@ const iconStyles = StyleSheet.create({
wrap: {
width: 32,
height: 32,
- borderRadius: 10,
+ borderRadius: radius.md,
alignItems: 'center',
justifyContent: 'center',
},
wrapActive: {
- backgroundColor: 'rgba(99,102,241,0.15)',
+ backgroundColor: colors.primary,
},
emoji: {
fontSize: 18,
- color: '#94a3b8',
+ color: '#9cad9f',
},
});
diff --git a/src/pages/AuthLogin.tsx b/src/pages/AuthLogin.tsx
index 6e68e8c..b434e28 100644
--- a/src/pages/AuthLogin.tsx
+++ b/src/pages/AuthLogin.tsx
@@ -7,6 +7,7 @@ import { useApp } from '../context/AppContext';
import { Button } from '../components/ui/Button';
import { Input } from '../components/ui/Input';
import { RootStackParamList } from '../navigation/types';
+import { colors, radius, shadows } from '../lib/theme';
export default function AuthLogin() {
const navigation = useNavigation>();
@@ -99,67 +100,78 @@ export default function AuthLogin() {
const styles = StyleSheet.create({
container: {
flex: 1,
- backgroundColor: '#0a0a0f',
+ backgroundColor: colors.background,
},
content: {
- padding: 24,
+ padding: 20,
justifyContent: 'center',
minHeight: '100%',
},
logoRow: {
alignItems: 'center',
- marginBottom: 32,
+ marginBottom: 28,
+ backgroundColor: colors.surface,
+ borderRadius: radius.sm,
+ borderWidth: 1,
+ borderColor: colors.border,
+ paddingVertical: 18,
+ ...shadows.card,
},
logoImage: {
- width: 280,
- height: 140,
+ width: 240,
+ height: 100,
},
title: {
- fontSize: 34,
+ fontSize: 32,
fontWeight: '900',
- color: '#f8fafc',
+ color: colors.text,
textAlign: 'center',
marginBottom: 6,
},
subtitle: {
fontSize: 15,
- color: '#64748b',
+ color: colors.textMuted,
marginBottom: 32,
textAlign: 'center',
fontWeight: '500',
},
errorBox: {
- backgroundColor: 'rgba(239,68,68,0.1)',
- borderColor: 'rgba(239,68,68,0.3)',
+ backgroundColor: colors.dangerSoft,
+ borderColor: '#fecaca',
borderWidth: 1,
- borderRadius: 14,
+ borderRadius: radius.md,
padding: 14,
marginBottom: 16,
},
errorText: {
- color: '#fca5a5',
+ color: '#991b1b',
fontWeight: '600',
fontSize: 13,
},
submitButton: {
width: '100%',
marginTop: 4,
- backgroundColor: '#6366f1',
+ backgroundColor: colors.primary,
paddingVertical: 16,
},
guestButton: {
alignSelf: 'center',
marginTop: 16,
paddingVertical: 10,
+ paddingHorizontal: 16,
+ borderRadius: radius.pill,
+ backgroundColor: colors.surface,
+ borderWidth: 1,
+ borderColor: colors.border,
},
guestText: {
- color: '#64748b',
+ color: colors.primaryDark,
fontWeight: '700',
fontSize: 14,
},
divider: {
height: 1,
- backgroundColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.border,
marginVertical: 24,
},
footer: {
@@ -169,11 +181,11 @@ const styles = StyleSheet.create({
},
footerText: {
fontSize: 14,
- color: '#64748b',
+ color: colors.textMuted,
},
footerLink: {
fontSize: 14,
- color: '#818cf8',
+ color: colors.primaryDark,
fontWeight: '800',
},
});
diff --git a/src/pages/AuthRegister.tsx b/src/pages/AuthRegister.tsx
index 58eac13..855cfec 100644
--- a/src/pages/AuthRegister.tsx
+++ b/src/pages/AuthRegister.tsx
@@ -7,6 +7,7 @@ import { useApp } from '../context/AppContext';
import { Button } from '../components/ui/Button';
import { Input } from '../components/ui/Input';
import { RootStackParamList } from '../navigation/types';
+import { colors, radius, shadows } from '../lib/theme';
export default function AuthRegister() {
const navigation = useNavigation>();
@@ -126,54 +127,60 @@ export default function AuthRegister() {
const styles = StyleSheet.create({
container: {
flex: 1,
- backgroundColor: '#0a0a0f',
+ backgroundColor: colors.background,
},
content: {
- padding: 24,
+ padding: 20,
justifyContent: 'center',
minHeight: '100%',
},
logoRow: {
alignItems: 'center',
- marginBottom: 28,
+ marginBottom: 24,
+ backgroundColor: colors.surface,
+ borderRadius: radius.sm,
+ borderWidth: 1,
+ borderColor: colors.border,
+ paddingVertical: 16,
+ ...shadows.card,
},
logoImage: {
- width: 200,
- height: 100,
+ width: 220,
+ height: 90,
},
title: {
- fontSize: 34,
+ fontSize: 32,
fontWeight: '900',
- color: '#f8fafc',
+ color: colors.text,
textAlign: 'center',
marginBottom: 6,
},
subtitle: {
fontSize: 15,
- color: '#64748b',
+ color: colors.textMuted,
marginBottom: 28,
textAlign: 'center',
fontWeight: '500',
},
errorBox: {
- backgroundColor: 'rgba(239,68,68,0.1)',
- borderColor: 'rgba(239,68,68,0.3)',
+ backgroundColor: colors.dangerSoft,
+ borderColor: '#fecaca',
borderWidth: 1,
- borderRadius: 14,
+ borderRadius: radius.md,
padding: 14,
marginBottom: 16,
},
errorText: {
- color: '#fca5a5',
+ color: '#991b1b',
fontWeight: '600',
fontSize: 13,
},
label: {
fontSize: 12,
- color: '#94a3b8',
+ color: colors.textMuted,
fontWeight: '700',
textTransform: 'uppercase',
- letterSpacing: 0.5,
+ letterSpacing: 0,
marginBottom: 10,
},
roleContainer: {
@@ -184,16 +191,17 @@ const styles = StyleSheet.create({
roleButton: {
flex: 1,
padding: 18,
- borderRadius: 16,
- borderWidth: 1.5,
- borderColor: 'rgba(255,255,255,0.06)',
- backgroundColor: '#141420',
+ borderRadius: radius.sm,
+ borderWidth: 1,
+ borderColor: colors.border,
+ backgroundColor: colors.surface,
alignItems: 'center',
gap: 8,
+ ...shadows.soft,
},
roleButtonActive: {
- borderColor: '#6366f1',
- backgroundColor: 'rgba(99,102,241,0.1)',
+ borderColor: colors.primary,
+ backgroundColor: colors.primarySoft,
},
roleEmoji: {
fontSize: 24,
@@ -201,21 +209,21 @@ const styles = StyleSheet.create({
roleText: {
fontSize: 13,
fontWeight: '800',
- color: '#64748b',
+ color: colors.textMuted,
textTransform: 'uppercase',
},
roleTextActive: {
- color: '#a5b4fc',
+ color: colors.primaryDark,
},
submitButton: {
width: '100%',
marginTop: 4,
- backgroundColor: '#6366f1',
+ backgroundColor: colors.primary,
paddingVertical: 16,
},
divider: {
height: 1,
- backgroundColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.border,
marginVertical: 24,
},
footer: {
@@ -225,11 +233,11 @@ const styles = StyleSheet.create({
},
footerText: {
fontSize: 14,
- color: '#64748b',
+ color: colors.textMuted,
},
footerLink: {
fontSize: 14,
- color: '#818cf8',
+ color: colors.primaryDark,
fontWeight: '800',
},
});
diff --git a/src/pages/Booking.tsx b/src/pages/Booking.tsx
index 061beaf..83e384f 100644
--- a/src/pages/Booking.tsx
+++ b/src/pages/Booking.tsx
@@ -6,6 +6,7 @@ import { useApp } from '../context/AppContext';
import { Card } from '../components/ui/Card';
import { Button } from '../components/ui/Button';
import { currency } from '../lib/format';
+import { colors, radius, shadows } from '../lib/theme';
export default function Booking() {
const route = useRoute();
@@ -185,25 +186,30 @@ export default function Booking() {
const styles = StyleSheet.create({
container: {
flex: 1,
- backgroundColor: '#0a0a0f',
+ backgroundColor: colors.background,
},
header: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 20,
- paddingVertical: 10,
+ paddingVertical: 12,
+ backgroundColor: colors.surface,
+ borderBottomWidth: 1,
+ borderBottomColor: colors.border,
},
backBtn: {
width: 40,
height: 40,
- borderRadius: 12,
- backgroundColor: '#141420',
+ borderRadius: radius.md,
+ backgroundColor: colors.surfaceMuted,
alignItems: 'center',
justifyContent: 'center',
+ borderWidth: 1,
+ borderColor: colors.border,
},
backIcon: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 20,
fontWeight: '700',
},
@@ -211,12 +217,12 @@ const styles = StyleSheet.create({
alignItems: 'center',
},
headerTitle: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 18,
fontWeight: '800',
},
headerSubtitle: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 12,
fontWeight: '600',
},
@@ -228,11 +234,11 @@ const styles = StyleSheet.create({
gap: 12,
},
stepLabel: {
- color: '#94a3b8',
+ color: colors.textMuted,
fontSize: 12,
fontWeight: '800',
textTransform: 'uppercase',
- letterSpacing: 1,
+ letterSpacing: 0,
marginBottom: 8,
},
choiceCard: {
@@ -240,37 +246,37 @@ const styles = StyleSheet.create({
alignItems: 'center',
padding: 16,
gap: 14,
- borderWidth: 1.5,
- borderColor: 'transparent',
+ borderWidth: 1,
+ borderColor: colors.border,
},
choiceCardActive: {
- borderColor: '#6366f1',
- backgroundColor: 'rgba(99,102,241,0.05)',
+ borderColor: colors.primary,
+ backgroundColor: colors.primarySoft,
},
choiceName: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 16,
fontWeight: '700',
},
choiceMeta: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 13,
},
choicePrice: {
- color: '#f8fafc',
+ color: colors.primaryDark,
fontSize: 16,
fontWeight: '800',
},
avatarMini: {
width: 44,
height: 44,
- borderRadius: 14,
- backgroundColor: '#1c1c2e',
+ borderRadius: radius.md,
+ backgroundColor: colors.primarySoft,
alignItems: 'center',
justifyContent: 'center',
},
avatarTxt: {
- color: '#6366f1',
+ color: colors.primary,
fontSize: 18,
fontWeight: '900',
},
@@ -280,30 +286,31 @@ const styles = StyleSheet.create({
dateItem: {
width: 64,
height: 80,
- borderRadius: 16,
- backgroundColor: '#141420',
+ borderRadius: radius.sm,
+ backgroundColor: colors.surface,
alignItems: 'center',
justifyContent: 'center',
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.06)',
+ borderColor: colors.border,
+ ...shadows.soft,
},
dateItemActive: {
- backgroundColor: '#6366f1',
- borderColor: '#6366f1',
+ backgroundColor: colors.primary,
+ borderColor: colors.primary,
},
dateWeek: {
- color: '#475569',
+ color: colors.textMuted,
fontSize: 10,
fontWeight: '800',
},
dateDay: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 20,
fontWeight: '900',
marginTop: 4,
},
dateTextActive: {
- color: '#fff',
+ color: colors.textInverse,
},
slotsGrid: {
flexDirection: 'row',
@@ -313,27 +320,27 @@ const styles = StyleSheet.create({
slotItem: {
width: '22.5%',
height: 44,
- borderRadius: 12,
- backgroundColor: '#141420',
+ borderRadius: radius.md,
+ backgroundColor: colors.surface,
alignItems: 'center',
justifyContent: 'center',
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.06)',
+ borderColor: colors.border,
},
slotActive: {
- backgroundColor: '#6366f1',
- borderColor: '#6366f1',
+ backgroundColor: colors.primary,
+ borderColor: colors.primary,
},
slotBooked: {
opacity: 0.2,
},
slotText: {
- color: '#94a3b8',
+ color: colors.textMuted,
fontSize: 14,
fontWeight: '700',
},
slotTextActive: {
- color: '#fff',
+ color: colors.textInverse,
},
slotTextBooked: {
textDecorationLine: 'line-through',
@@ -347,21 +354,21 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
},
summaryLabel: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 14,
},
summaryValue: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 14,
fontWeight: '700',
},
divider: {
height: 1,
- backgroundColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.border,
marginVertical: 4,
},
summaryTotal: {
- color: '#a5b4fc',
+ color: colors.primary,
fontSize: 22,
fontWeight: '900',
},
@@ -372,22 +379,22 @@ const styles = StyleSheet.create({
notifBtn: {
flex: 1,
paddingVertical: 12,
- borderRadius: 12,
- backgroundColor: '#141420',
+ borderRadius: radius.md,
+ backgroundColor: colors.surface,
alignItems: 'center',
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.06)',
+ borderColor: colors.border,
},
notifBtnActive: {
- backgroundColor: 'rgba(99,102,241,0.15)',
- borderColor: '#6366f1',
+ backgroundColor: colors.primarySoft,
+ borderColor: colors.primary,
},
notifBtnTxt: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 12,
fontWeight: '700',
},
notifBtnTxtActive: {
- color: '#a5b4fc',
+ color: colors.primaryDark,
},
});
diff --git a/src/pages/Cart.tsx b/src/pages/Cart.tsx
index 9618295..2319c10 100644
--- a/src/pages/Cart.tsx
+++ b/src/pages/Cart.tsx
@@ -5,6 +5,7 @@ import { useNavigation } from '@react-navigation/native';
import { useApp } from '../context/AppContext';
import { Button } from '../components/ui/Button';
import { currency } from '../lib/format';
+import { colors, radius, shadows } from '../lib/theme';
export default function Cart() {
const navigation = useNavigation();
@@ -122,7 +123,7 @@ export default function Cart() {
const styles = StyleSheet.create({
container: {
flex: 1,
- backgroundColor: '#0a0a0f',
+ backgroundColor: colors.background,
},
content: {
padding: 20,
@@ -132,7 +133,7 @@ const styles = StyleSheet.create({
title: {
fontSize: 32,
fontWeight: '900',
- color: '#f8fafc',
+ color: colors.text,
marginBottom: 8,
},
emptyState: {
@@ -147,22 +148,23 @@ const styles = StyleSheet.create({
marginBottom: 8,
},
emptyTitle: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 22,
fontWeight: '800',
},
emptyText: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 15,
textAlign: 'center',
},
shopCard: {
- backgroundColor: '#141420',
- borderRadius: 24,
+ backgroundColor: colors.surface,
+ borderRadius: radius.sm,
padding: 20,
borderWidth: 1,
- borderColor: 'rgba(255,255,255,0.06)',
+ borderColor: colors.border,
marginBottom: 16,
+ ...shadows.card,
},
shopHeader: {
flexDirection: 'row',
@@ -172,29 +174,29 @@ const styles = StyleSheet.create({
shopIcon: {
width: 48,
height: 48,
- borderRadius: 16,
- backgroundColor: 'rgba(99,102,241,0.12)',
+ borderRadius: radius.md,
+ backgroundColor: colors.primarySoft,
alignItems: 'center',
justifyContent: 'center',
},
shopIconText: {
- color: '#818cf8',
+ color: colors.primary,
fontSize: 18,
fontWeight: '900',
},
shopName: {
fontSize: 18,
fontWeight: '800',
- color: '#f8fafc',
+ color: colors.text,
},
shopAddress: {
fontSize: 13,
- color: '#475569',
+ color: colors.textMuted,
marginTop: 2,
},
divider: {
height: 1,
- backgroundColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.border,
marginVertical: 16,
},
item: {
@@ -209,14 +211,14 @@ const styles = StyleSheet.create({
},
typePill: {
alignSelf: 'flex-start',
- backgroundColor: 'rgba(99,102,241,0.1)',
- borderRadius: 8,
+ backgroundColor: colors.primarySoft,
+ borderRadius: radius.pill,
paddingHorizontal: 10,
paddingVertical: 3,
marginBottom: 4,
},
typeText: {
- color: '#818cf8',
+ color: colors.primaryDark,
fontSize: 10,
fontWeight: '800',
textTransform: 'uppercase',
@@ -224,24 +226,24 @@ const styles = StyleSheet.create({
itemName: {
fontSize: 16,
fontWeight: '700',
- color: '#f8fafc',
+ color: colors.text,
},
itemQty: {
fontSize: 13,
- color: '#64748b',
+ color: colors.textMuted,
fontWeight: '500',
},
removeBtn: {
width: 36,
height: 36,
- borderRadius: 12,
- backgroundColor: 'rgba(239,68,68,0.08)',
+ borderRadius: radius.md,
+ backgroundColor: colors.dangerSoft,
alignItems: 'center',
justifyContent: 'center',
marginLeft: 12,
},
removeText: {
- color: '#ef4444',
+ color: colors.danger,
fontSize: 14,
fontWeight: '800',
},
@@ -252,20 +254,20 @@ const styles = StyleSheet.create({
marginBottom: 20,
},
totalLabel: {
- color: '#94a3b8',
+ color: colors.textMuted,
fontSize: 14,
fontWeight: '700',
textTransform: 'uppercase',
- letterSpacing: 1,
+ letterSpacing: 0,
},
totalValue: {
- color: '#a5b4fc',
+ color: colors.primary,
fontSize: 26,
fontWeight: '900',
},
checkoutBtn: {
- backgroundColor: '#6366f1',
- borderRadius: 16,
+ backgroundColor: colors.primary,
+ borderRadius: radius.md,
paddingVertical: 16,
},
});
diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx
index 526a15d..d02f3bf 100644
--- a/src/pages/Dashboard.tsx
+++ b/src/pages/Dashboard.tsx
@@ -8,14 +8,15 @@ import { Card } from '../components/ui/Card';
import { Button } from '../components/ui/Button';
import { currency } from '../lib/format';
import { supabase } from '../lib/supabase';
+import { colors, radius, shadows } from '../lib/theme';
type Tab = 'agenda' | 'servicos' | 'produtos' | 'equipa' | 'perfil';
const statusColor: Record = {
- pendente: '#6366f1',
- confirmado: '#10b981',
- concluido: '#10b981',
- cancelado: '#ef4444',
+ pendente: colors.primary,
+ confirmado: colors.success,
+ concluido: colors.success,
+ cancelado: colors.danger,
};
const statusLabel: Record = {
@@ -203,7 +204,7 @@ export default function Dashboard() {
value={dateFilter}
onChangeText={setDateFilter}
placeholder="AAAA-MM-DD"
- placeholderTextColor="#475569"
+ placeholderTextColor={colors.placeholder}
style={styles.dateInput}
/>
@@ -231,8 +232,8 @@ export default function Dashboard() {
)}
{appt.status !== 'cancelado' && appt.status !== 'concluido' && (
- updateAppointmentStatus(appt.id, 'cancelado')} style={[styles.premiumActionBtn, { backgroundColor: 'rgba(239,68,68,0.1)' }]}>
- Cancelar
+ updateAppointmentStatus(appt.id, 'cancelado')} style={[styles.premiumActionBtn, { backgroundColor: colors.dangerSoft, borderColor: '#fecaca' }]}>
+ Cancelar
)}
@@ -265,10 +266,10 @@ export default function Dashboard() {
Novo Serviço
- setFormSvc({...formSvc, name: t})} />
+ setFormSvc({...formSvc, name: t})} />
- setFormSvc({...formSvc, price: t})} />
- setFormSvc({...formSvc, duration: t})} />
+ setFormSvc({...formSvc, price: t})} />
+ setFormSvc({...formSvc, duration: t})} />
))}
-
+
setReviewTarget(null)} style={{ flex: 1 }}>Cancelar
Enviar
@@ -305,96 +306,96 @@ export default function Profile() {
}
const styles = StyleSheet.create({
- container: { flex: 1, backgroundColor: '#0a0a0f' },
+ container: { flex: 1, backgroundColor: colors.background },
content: { padding: 20, paddingBottom: 100 },
- profileHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 32, gap: 16 },
- avatarBox: { width: 64, height: 64, borderRadius: 22, backgroundColor: '#141420', alignItems: 'center', justifyContent: 'center', borderWidth: 1, borderColor: 'rgba(99,102,241,0.3)' },
- avatarText: { color: '#818cf8', fontSize: 24, fontWeight: '900' },
+ profileHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 28, gap: 16, backgroundColor: colors.surfaceDark, borderRadius: radius.sm, padding: 18, ...shadows.card },
+ avatarBox: { width: 64, height: 64, borderRadius: radius.lg, backgroundColor: colors.accentSoft, alignItems: 'center', justifyContent: 'center', borderWidth: 1, borderColor: 'rgba(255,255,255,0.16)' },
+ avatarText: { color: '#7a4310', fontSize: 24, fontWeight: '900' },
profileInfo: { flex: 1, gap: 2 },
- profileName: { color: '#f8fafc', fontSize: 22, fontWeight: '900' },
- profileEmail: { color: '#64748b', fontSize: 14, fontWeight: '500' },
- roleBadge: { alignSelf: 'flex-start', backgroundColor: 'rgba(99,102,241,0.1)', borderRadius: 8, paddingHorizontal: 8, paddingVertical: 3, marginTop: 4 },
- roleText: { color: '#818cf8', fontSize: 10, fontWeight: '800', textTransform: 'uppercase' },
+ profileName: { color: colors.textInverse, fontSize: 22, fontWeight: '900' },
+ profileEmail: { color: '#b7c4bf', fontSize: 14, fontWeight: '500' },
+ roleBadge: { alignSelf: 'flex-start', backgroundColor: colors.primarySoft, borderRadius: radius.pill, paddingHorizontal: 10, paddingVertical: 4, marginTop: 6 },
+ roleText: { color: colors.primaryDark, fontSize: 10, fontWeight: '800', textTransform: 'uppercase' },
reviewActions: { flexDirection: 'row', gap: 14 },
- sectionTitle: { color: '#f8fafc', fontSize: 18, fontWeight: '800', marginBottom: 12 },
+ sectionTitle: { color: colors.text, fontSize: 18, fontWeight: '800', marginBottom: 12 },
notifSection: { marginBottom: 32 },
notifScroll: { marginHorizontal: -20, paddingHorizontal: 20 },
- notifCard: { backgroundColor: '#141420', width: 240, borderRadius: 20, padding: 16, marginRight: 12, borderWidth: 1, borderColor: 'rgba(255,255,255,0.06)', gap: 8, elevation: 2 },
- notifUnread: { borderColor: 'rgba(99,102,241,0.3)', backgroundColor: '#18182b' },
- notifMsg: { color: '#94a3b8', fontSize: 13, lineHeight: 18, fontWeight: '500' },
- markRead: { color: '#818cf8', fontSize: 12, fontWeight: '800', textTransform: 'uppercase', letterSpacing: 0.5 },
- tabBar: { flexDirection: 'row', marginBottom: 24, borderBottomWidth: 1, borderBottomColor: 'rgba(255,255,255,0.06)' },
+ notifCard: { backgroundColor: colors.surface, width: 240, borderRadius: radius.sm, padding: 16, marginRight: 12, borderWidth: 1, borderColor: colors.border, gap: 8, ...shadows.soft },
+ notifUnread: { borderColor: colors.primary, backgroundColor: colors.primarySoft },
+ notifMsg: { color: colors.textMuted, fontSize: 13, lineHeight: 18, fontWeight: '500' },
+ markRead: { color: colors.primaryDark, fontSize: 12, fontWeight: '800', textTransform: 'uppercase', letterSpacing: 0 },
+ tabBar: { flexDirection: 'row', marginBottom: 24, borderBottomWidth: 1, borderBottomColor: colors.border },
tabItem: { paddingVertical: 14, marginRight: 24, position: 'relative' },
tabActive: {},
- tabText: { color: '#64748b', fontSize: 15, fontWeight: '700' },
- tabTextActive: { color: '#f8fafc' },
- tabIndicator: { position: 'absolute', bottom: -1, left: 0, right: 0, height: 3, backgroundColor: '#6366f1', borderRadius: 4 },
+ tabText: { color: colors.textMuted, fontSize: 15, fontWeight: '700' },
+ tabTextActive: { color: colors.text },
+ tabIndicator: { position: 'absolute', bottom: -1, left: 0, right: 0, height: 3, backgroundColor: colors.primary, borderRadius: radius.pill },
tabContent: { minHeight: 200 },
listContainer: { gap: 16 },
- emptyTxt: { color: '#64748b', textAlign: 'center', marginTop: 20, fontWeight: '600' },
- subTitle: { color: '#64748b', fontSize: 13, fontWeight: '700', textTransform: 'uppercase', marginBottom: 8, letterSpacing: 1 },
- agendaCard: { padding: 16, gap: 12, backgroundColor: '#141420', borderRadius: 20, borderWidth: 1, borderColor: 'rgba(255,255,255,0.03)' },
+ emptyTxt: { color: colors.textMuted, textAlign: 'center', marginTop: 20, fontWeight: '600' },
+ subTitle: { color: colors.textMuted, fontSize: 13, fontWeight: '700', textTransform: 'uppercase', marginBottom: 8, letterSpacing: 0 },
+ agendaCard: { padding: 16, gap: 12, backgroundColor: colors.surface, borderRadius: radius.sm, borderWidth: 1, borderColor: colors.border },
agendaTop: { flexDirection: 'row', alignItems: 'center', gap: 14 },
- dateBox: { backgroundColor: '#1c1c2e', padding: 10, borderRadius: 14, alignItems: 'center', minWidth: 55, borderWidth: 1, borderColor: 'rgba(255,255,255,0.05)' },
- dateDay: { color: '#f8fafc', fontSize: 20, fontWeight: '900' },
- dateMonth: { color: '#818cf8', fontSize: 10, fontWeight: '800', textTransform: 'uppercase' },
+ dateBox: { backgroundColor: colors.primarySoft, padding: 10, borderRadius: radius.md, alignItems: 'center', minWidth: 55, borderWidth: 1, borderColor: colors.border },
+ dateDay: { color: colors.primaryDark, fontSize: 20, fontWeight: '900' },
+ dateMonth: { color: colors.primary, fontSize: 10, fontWeight: '800', textTransform: 'uppercase' },
agendaMain: { flex: 1, gap: 3 },
- agendaShop: { color: '#f8fafc', fontSize: 17, fontWeight: '800' },
- agendaTime: { color: '#64748b', fontSize: 13, fontWeight: '500' },
- statusTag: { paddingHorizontal: 12, paddingVertical: 6, borderRadius: 10 },
- statusText: { fontSize: 10, fontWeight: '900', textTransform: 'uppercase', letterSpacing: 0.5 },
- reviewBtn: { marginTop: 8, borderRadius: 12 },
- shopCard: { flexDirection: 'row', alignItems: 'center', gap: 14, padding: 16, backgroundColor: '#141420', borderRadius: 20, marginBottom: 4 },
- shopIcon: { width: 48, height: 48, borderRadius: 14, backgroundColor: 'rgba(99,102,241,0.05)', alignItems: 'center', justifyContent: 'center', borderWidth: 1, borderColor: 'rgba(99,102,241,0.1)' },
- shopIconText: { color: '#818cf8', fontSize: 20, fontWeight: '900' },
- shopName: { color: '#f8fafc', fontSize: 16, fontWeight: '800' },
- shopAddr: { color: '#475569', fontSize: 12, fontWeight: '500' },
- shopRating: { color: '#fbbf24', fontWeight: '900', fontSize: 14 },
- reviewCard: { padding: 18, gap: 10, backgroundColor: '#141420', borderRadius: 20 },
+ agendaShop: { color: colors.text, fontSize: 17, fontWeight: '800' },
+ agendaTime: { color: colors.textMuted, fontSize: 13, fontWeight: '500' },
+ statusTag: { paddingHorizontal: 12, paddingVertical: 6, borderRadius: radius.pill },
+ statusText: { fontSize: 10, fontWeight: '900', textTransform: 'uppercase', letterSpacing: 0 },
+ reviewBtn: { marginTop: 8, borderRadius: radius.md },
+ shopCard: { flexDirection: 'row', alignItems: 'center', gap: 14, padding: 16, backgroundColor: colors.surface, borderRadius: radius.sm, marginBottom: 4 },
+ shopIcon: { width: 48, height: 48, borderRadius: radius.md, backgroundColor: colors.primarySoft, alignItems: 'center', justifyContent: 'center', borderWidth: 1, borderColor: colors.border },
+ shopIconText: { color: colors.primary, fontSize: 20, fontWeight: '900' },
+ shopName: { color: colors.text, fontSize: 16, fontWeight: '800' },
+ shopAddr: { color: colors.textMuted, fontSize: 12, fontWeight: '500' },
+ shopRating: { color: colors.star, fontWeight: '900', fontSize: 14 },
+ reviewCard: { padding: 18, gap: 10, backgroundColor: colors.surface, borderRadius: radius.sm },
reviewHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
- reviewStars: { color: '#fbbf24', fontSize: 15 },
- reviewDate: { color: '#475569', fontSize: 12, fontWeight: '600' },
- reviewComment: { color: '#f8fafc', fontSize: 14, lineHeight: 20, fontWeight: '400' },
- statCard: { padding: 24, alignItems: 'center', gap: 6, backgroundColor: '#141420', borderRadius: 24, borderWidth: 1, borderColor: 'rgba(99,102,241,0.1)' },
- statLabel: { color: '#64748b', fontSize: 12, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 1 },
- statValue: { color: '#f8fafc', fontSize: 28, fontWeight: '900' },
- reviewModal: { marginTop: 24, padding: 24, gap: 16, borderColor: 'rgba(99,102,241,0.3)', borderRadius: 24 },
- reviewTitle: { color: '#f8fafc', fontSize: 18, fontWeight: '800', textAlign: 'center' },
+ reviewStars: { color: colors.star, fontSize: 15 },
+ reviewDate: { color: colors.textSubtle, fontSize: 12, fontWeight: '600' },
+ reviewComment: { color: colors.text, fontSize: 14, lineHeight: 20, fontWeight: '400' },
+ statCard: { padding: 24, alignItems: 'center', gap: 6, backgroundColor: colors.surface, borderRadius: radius.sm, borderWidth: 1, borderColor: colors.border },
+ statLabel: { color: colors.textMuted, fontSize: 12, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0 },
+ statValue: { color: colors.text, fontSize: 28, fontWeight: '900' },
+ reviewModal: { marginTop: 24, padding: 24, gap: 16, borderColor: colors.primary, borderRadius: radius.sm },
+ reviewTitle: { color: colors.text, fontSize: 18, fontWeight: '800', textAlign: 'center' },
stars: { flexDirection: 'row', justifyContent: 'center', gap: 12 },
- star: { fontSize: 36, color: '#1c1c2e' },
- starActive: { color: '#fbbf24' },
- reviewInput: { backgroundColor: '#1c1c2e', borderRadius: 16, padding: 16, color: '#f8fafc', height: 100, textAlignVertical: 'top', borderWidth: 1, borderColor: 'rgba(255,255,255,0.05)' },
+ star: { fontSize: 36, color: colors.borderStrong },
+ starActive: { color: colors.star },
+ reviewInput: { backgroundColor: colors.surfaceMuted, borderRadius: radius.md, padding: 16, color: colors.text, height: 100, textAlignVertical: 'top', borderWidth: 1, borderColor: colors.border },
logoutSection: {
marginTop: 60,
paddingTop: 30,
borderTopWidth: 1,
- borderTopColor: 'rgba(255,255,255,0.06)',
+ borderTopColor: colors.border,
alignItems: 'center',
},
logoutButtonPremium: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
- backgroundColor: 'rgba(239,68,68,0.1)',
+ backgroundColor: colors.dangerSoft,
paddingVertical: 18,
paddingHorizontal: 24,
- borderRadius: 20,
+ borderRadius: radius.sm,
width: '100%',
borderWidth: 1,
- borderColor: 'rgba(239,68,68,0.2)',
+ borderColor: '#fecaca',
gap: 12,
},
logoutButtonText: {
- color: '#ef4444',
+ color: colors.danger,
fontSize: 16,
fontWeight: '800',
},
logoutButtonIcon: {
- color: '#ef4444',
+ color: colors.danger,
fontSize: 20,
},
versionText: {
- color: '#334155',
+ color: colors.textSubtle,
fontSize: 12,
marginTop: 16,
fontWeight: '600',
diff --git a/src/pages/ShopDetails.tsx b/src/pages/ShopDetails.tsx
index 8d8c289..8ee16c4 100644
--- a/src/pages/ShopDetails.tsx
+++ b/src/pages/ShopDetails.tsx
@@ -8,6 +8,7 @@ import { Card } from '../components/ui/Card';
import { Button } from '../components/ui/Button';
import { currency } from '../lib/format';
import { RootStackParamList } from '../navigation/types';
+import { colors, radius } from '../lib/theme';
type Tab = 'servicos' | 'barbeiros' | 'produtos' | 'detalhes';
@@ -199,13 +200,13 @@ export default function ShopDetails() {
const styles = StyleSheet.create({
container: {
flex: 1,
- backgroundColor: '#0a0a0f',
+ backgroundColor: colors.background,
},
scrollContent: {
paddingBottom: 40,
},
hero: {
- height: 380,
+ height: 360,
position: 'relative',
},
heroImage: {
@@ -215,7 +216,7 @@ const styles = StyleSheet.create({
heroPlaceholder: {
width: '100%',
height: '100%',
- backgroundColor: '#141420',
+ backgroundColor: colors.primarySoft,
alignItems: 'center',
justifyContent: 'center',
},
@@ -224,7 +225,7 @@ const styles = StyleSheet.create({
},
heroOverlay: {
...StyleSheet.absoluteFillObject,
- backgroundColor: 'rgba(10,10,15,0.5)',
+ backgroundColor: colors.overlay,
},
heroHeader: {
position: 'absolute',
@@ -239,30 +240,34 @@ const styles = StyleSheet.create({
backBtn: {
width: 44,
height: 44,
- borderRadius: 22,
- backgroundColor: 'rgba(255,255,255,0.1)',
+ borderRadius: radius.pill,
+ backgroundColor: 'rgba(20,33,29,0.72)',
alignItems: 'center',
justifyContent: 'center',
+ borderWidth: 1,
+ borderColor: 'rgba(255,255,255,0.16)',
},
backIcon: {
- color: '#fff',
+ color: colors.textInverse,
fontSize: 20,
fontWeight: '700',
},
favBtn: {
width: 44,
height: 44,
- borderRadius: 22,
- backgroundColor: 'rgba(255,255,255,0.1)',
+ borderRadius: radius.pill,
+ backgroundColor: 'rgba(20,33,29,0.72)',
alignItems: 'center',
justifyContent: 'center',
+ borderWidth: 1,
+ borderColor: 'rgba(255,255,255,0.16)',
},
favIcon: {
- color: '#fff',
+ color: colors.textInverse,
fontSize: 22,
},
favActive: {
- color: '#ef4444',
+ color: colors.danger,
},
heroBody: {
position: 'absolute',
@@ -273,18 +278,18 @@ const styles = StyleSheet.create({
},
ratingBox: {
alignSelf: 'flex-start',
- backgroundColor: 'rgba(99,102,241,0.9)',
- borderRadius: 8,
+ backgroundColor: colors.accent,
+ borderRadius: radius.pill,
paddingHorizontal: 10,
paddingVertical: 4,
},
ratingValue: {
- color: '#fff',
+ color: colors.textInverse,
fontSize: 12,
fontWeight: '900',
},
shopName: {
- color: '#fff',
+ color: colors.textInverse,
fontSize: 32,
fontWeight: '900',
},
@@ -292,34 +297,39 @@ const styles = StyleSheet.create({
opacity: 0.8,
},
shopAddr: {
- color: '#f8fafc',
+ color: colors.textInverse,
fontSize: 14,
fontWeight: '500',
},
tabSection: {
- backgroundColor: '#141420',
- paddingVertical: 6,
+ backgroundColor: colors.surface,
+ paddingVertical: 10,
+ borderBottomWidth: 1,
+ borderBottomColor: colors.border,
},
tabsScroll: {
paddingHorizontal: 20,
- gap: 16,
+ gap: 8,
},
tabItem: {
- paddingVertical: 14,
- paddingHorizontal: 4,
- borderBottomWidth: 2,
- borderBottomColor: 'transparent',
+ paddingVertical: 10,
+ paddingHorizontal: 14,
+ borderRadius: radius.pill,
+ backgroundColor: colors.surfaceMuted,
+ borderWidth: 1,
+ borderColor: colors.border,
},
tabItemActive: {
- borderBottomColor: '#6366f1',
+ backgroundColor: colors.primary,
+ borderColor: colors.primary,
},
tabText: {
- color: '#475569',
+ color: colors.textMuted,
fontSize: 14,
fontWeight: '700',
},
tabTextActive: {
- color: '#f8fafc',
+ color: colors.textInverse,
},
contentArea: {
padding: 20,
@@ -338,12 +348,12 @@ const styles = StyleSheet.create({
gap: 4,
},
svcName: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 16,
fontWeight: '800',
},
svcMeta: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 13,
},
barberList: {
@@ -358,23 +368,23 @@ const styles = StyleSheet.create({
barberAvatar: {
width: 50,
height: 50,
- borderRadius: 16,
- backgroundColor: '#1c1c2e',
+ borderRadius: radius.md,
+ backgroundColor: colors.primarySoft,
alignItems: 'center',
justifyContent: 'center',
},
avatarTxt: {
- color: '#6366f1',
+ color: colors.primary,
fontSize: 20,
fontWeight: '900',
},
barberName: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 16,
fontWeight: '800',
},
barberSpecs: {
- color: '#475569',
+ color: colors.textMuted,
fontSize: 12,
},
productCard: {
@@ -387,18 +397,18 @@ const styles = StyleSheet.create({
alignItems: 'flex-start',
},
prodName: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 16,
fontWeight: '800',
flex: 1,
},
prodPrice: {
- color: '#a5b4fc',
+ color: colors.primary,
fontSize: 16,
fontWeight: '900',
},
prodStock: {
- color: '#475569',
+ color: colors.textMuted,
fontSize: 12,
marginBottom: 4,
},
@@ -407,7 +417,7 @@ const styles = StyleSheet.create({
gap: 12,
},
detailTitle: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 18,
fontWeight: '800',
marginBottom: 8,
@@ -417,25 +427,25 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
},
schedDay: {
- color: '#64748b',
+ color: colors.textMuted,
fontSize: 14,
},
schedTime: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 14,
fontWeight: '600',
},
today: {
- color: '#6366f1',
+ color: colors.primary,
fontWeight: '800',
},
divider: {
height: 1,
- backgroundColor: 'rgba(255,255,255,0.06)',
+ backgroundColor: colors.border,
marginVertical: 12,
},
contactLink: {
- color: '#818cf8',
+ color: colors.primaryDark,
fontSize: 16,
fontWeight: '700',
},
@@ -446,7 +456,7 @@ const styles = StyleSheet.create({
padding: 40,
},
centerTitle: {
- color: '#f8fafc',
+ color: colors.text,
fontSize: 18,
fontWeight: '800',
},