Przeglądaj źródła

feat: :sparkles: feat (tipografia) refatorada tipografias

refatorada letras e fontes do aplicativo

fase:dev | origin:escopo
Gustavo Zanatta 1 tydzień temu
rodzic
commit
6075f1d0b4
49 zmienionych plików z 1427 dodań i 2046 usunięć
  1. 20 23
      src/api/user.js
  2. 4 12
      src/components/dashboard/DashboardHeaderBar.vue
  3. 24 41
      src/components/dashboard/DashboardNextSchedules.vue
  4. 21 38
      src/components/dashboard/DashboardOpportunities.vue
  5. 8 19
      src/components/dashboard/DashboardPriceSuggest.vue
  6. 20 56
      src/components/dashboard/DashboardSolicitations.vue
  7. 7 10
      src/components/dashboard/DashboardSummaryInfos.vue
  8. 62 70
      src/components/dashboard/DashboardTodayServices.vue
  9. 26 24
      src/components/dashboard/NextSchedulesDetailsDialog.vue
  10. 8 15
      src/components/dashboard/ScheduleCancelDialog.vue
  11. 10 15
      src/components/dashboard/ScheduleRatingDialog.vue
  12. 38 56
      src/components/dashboard/SolicitationDetailsDialog.vue
  13. 2 2
      src/components/defaults/DefaultFilePicker.vue
  14. 7 15
      src/components/layout/LeftMenuLayout.vue
  15. 6 11
      src/components/layout/LeftMenuLayoutMobile.vue
  16. 19 16
      src/components/login/LoginStepFivePanel.vue
  17. 9 9
      src/components/login/LoginStepFourPanel.vue
  18. 5 5
      src/components/login/LoginStepOnePanel.vue
  19. 19 13
      src/components/login/LoginStepSixPanel.vue
  20. 18 18
      src/components/login/LoginStepThreePanel.vue
  21. 3 4
      src/components/login/LoginStepTwoPanel.vue
  22. 1 1
      src/components/payments/AntecipacaoConfirmDialog.vue
  23. 8 10
      src/components/payments/AntecipacaoDialog.vue
  24. 4 13
      src/components/payments/MovimentacoesDialog.vue
  25. 3 5
      src/components/payments/WithdrawConfirmDialog.vue
  26. 12 13
      src/components/profile/ProfileAddressDialog.vue
  27. 4 11
      src/components/profile/ProfileAvailabilityCalendar.vue
  28. 23 48
      src/components/profile/ProfileAvailabilityDialog.vue
  29. 15 13
      src/components/profile/ProfileBankDataDialog.vue
  30. 7 6
      src/components/profile/ProfileBlockDayDialog.vue
  31. 9 17
      src/components/profile/ProfileHelpDialog.vue
  32. 11 20
      src/components/profile/ProfilePrivacyDialog.vue
  33. 16 14
      src/components/profile/ProfileServiceDataDialog.vue
  34. 1 3
      src/components/shared/LocationMapDialog.vue
  35. 48 4
      src/css/app.scss
  36. 183 214
      src/i18n/locales/en.json
  37. 185 214
      src/i18n/locales/es.json
  38. 205 252
      src/i18n/locales/pt.json
  39. 7 13
      src/layouts/MainLayout.vue
  40. 20 227
      src/pages/LoginPage.vue
  41. 34 49
      src/pages/calendar/CalendarPage.vue
  42. 12 12
      src/pages/dashboard/DashboardPage.vue
  43. 39 66
      src/pages/notifications/NotificationsPage.vue
  44. 71 95
      src/pages/opportunities/OpportunitiesPage.vue
  45. 102 111
      src/pages/opportunities/components/OpportunityDetailsDialog.vue
  46. 2 4
      src/pages/opportunities/components/OpportunityDialog.vue
  47. 22 61
      src/pages/payments/PaymentsPage.vue
  48. 20 34
      src/pages/profile/ProfileEditDialog.vue
  49. 27 44
      src/pages/profile/ProfilePage.vue

+ 20 - 23
src/api/user.js

@@ -40,33 +40,30 @@ export const validateCode = async (email, phone, code, isLogin = false) => {
   return data;
 };
 
-const removeEmptyRegistrationFields = (data) => {
-  if (Array.isArray(data)) {
-    return data.map(removeEmptyRegistrationFields);
-  }
+// const removeEmptyRegistrationFields = (data) => {
+//   if (Array.isArray(data)) {
+//     return data.map(removeEmptyRegistrationFields);
+//   }
 
-  if (!data || typeof data !== "object") {
-    return data;
-  }
+//   if (!data || typeof data !== "object") {
+//     return data;
+//   }
 
-  return Object.entries(data).reduce((payload, [key, value]) => {
-    if (
-      value === undefined ||
-      key === "no_complement" ||
-      key.endsWith("_file")
-    ) {
-      return payload;
-    }
+//   return Object.entries(data).reduce((payload, [key, value]) => {
+//     if (
+//       value === undefined ||
+//       key === "no_complement" ||
+//       key.endsWith("_file")
+//     ) {
+//       return payload;
+//     }
 
-    payload[key] = removeEmptyRegistrationFields(value);
-    return payload;
-  }, {});
-};
+//     payload[key] = removeEmptyRegistrationFields(value);
+//     return payload;
+//   }, {});
+// };
 
 export const createUserAndProvider = async (data) => {
-  const response = await api.post(
-    "/register-provider",
-    removeEmptyRegistrationFields(data),
-  );
+  const response = await api.post("/register-provider", data);
   return response;
 };

+ 4 - 12
src/components/dashboard/DashboardHeaderBar.vue

@@ -4,12 +4,12 @@
     <div class="col column q-gutter-y-xs">
       <div class="row items-center q-gutter-x-xs">
         <q-icon name="mdi-star" color="warning" size="14px" />
-        <span class="dashboard-metric-value">{{ data?.rating != null ? Number(data.rating).toFixed(1).replace('.', ',') : '-' }}</span>
-        <span class="dashboard-metric-meta">({{ data?.total_ratings ?? 0 }})</span>
+        <span class="dashboard-metric-value font10 fontregular">{{ data?.rating != null ? Number(data.rating).toFixed(1).replace('.', ',') : '-' }}</span>
+        <span class="dashboard-metric-meta font10 fontregular">({{ data?.total_ratings ?? 0 }})</span>
       </div>
       <div class="row items-center q-gutter-x-xs">
         <q-icon name="mdi-broom" color="secondary" size="14px" />
-        <span class="dashboard-metric-value">{{ data?.total_services ?? 0 }}</span>
+        <span class="dashboard-metric-value font10 fontregular">{{ data?.total_services ?? 0 }}</span>
       </div>
     </div>
 
@@ -38,7 +38,7 @@
       floating
       rounded
       color="pink"
-      class="notification-badge"
+      class="notification-badge font10 fontregular"
     >
       {{ unreadNotifications }}
     </q-badge>
@@ -93,16 +93,10 @@ const goToNotifications = () => {
   height: 32px;
 }
 .dashboard-metric-value {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 700;
   color: #3a3a4a;
   line-height: 1;
 }
 .dashboard-metric-meta {
-  font-family: "Inter", sans-serif;
-  font-size: 10px;
-  font-weight: 400;
   color: #999;
   line-height: 1;
 }
@@ -110,7 +104,5 @@ const goToNotifications = () => {
 .notification-badge {
   min-width: 16px;
   height: 16px;
-  font-size: 10px;
-  font-weight: 700;
 }
 </style>

+ 24 - 41
src/components/dashboard/DashboardNextSchedules.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="q-mx-md q-mb-md">
-    <div class="section-title gradient-diarista q-mb-sm">{{ $t('provider.dashboard.next_schedules.title') }}</div>
+    <div class="section-title font16 fontbold gradient-diarista q-mb-sm">{{ $t('provider.dashboard.next_schedules.title') }}</div>
 
     <div class="scroll-wrapper">
       <div class="scroll-track">
@@ -14,59 +14,60 @@
             <div class="row no-wrap items-center q-gutter-x-sm">
               <q-avatar size="48px">
                 <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
-                <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:14px;border-radius:50%">{{ (item.customer_name ?? item.client_name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
+                <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ (item.customer_name ?? item.client_name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
               </q-avatar>
               <div class="column flex-1">
                 <div class="row items-center q-gutter-x-xs">
-                  <span class="text-name ellipsis">{{ item.customer_name ?? item.client_name }}</span>
+                  <span class="text-name ellipsis font12 fontmedium">{{ item.customer_name ?? item.client_name }}</span>
                   <div v-if="item.customer_rating" class="row items-center">
                     <q-icon name="mdi-star" color="warning" size="14px" />
-                    <span class="text-rating text-text">{{ item.customer_rating }}</span>
+                    <span class="text-text font11">{{ item.customer_rating }}</span>
                   </div>
                 </div>
                 <div class="row items-center no-wrap">
-                  <span class="text-schedule-date-bold">{{ formatWeekday(item.date) }}</span>
-                  <span class="text-schedule-date-regular">{{ ', ' + formatDayMonth(item.date) }}</span>
+                  <span class="text-schedule-date-bold font9 fontbold">{{ formatWeekday(item.date) }}</span>
+                  <span class="text-schedule-date-regular font9">{{ ', ' + formatDayMonth(item.date) }}</span>
                 </div>
-                <div class="text-schedule-date-regular">
+                <div class="text-schedule-date-regular font9">
                   {{ $t('common.from') }}
-                  <span class="text-schedule-date-bold">{{ item.start_time?.slice(0, 5) }}</span>
+                  <span class="text-schedule-date-bold fontbold">{{ item.start_time?.slice(0, 5) }}</span>
                   {{ $t('common.to') }}
-                  <span class="text-schedule-date-bold">{{ item.end_time?.slice(0, 5) }}</span>
+                  <span class="text-schedule-date-bold fontbold">{{ item.end_time?.slice(0, 5) }}</span>
                 </div>
               </div>
               <div class="column items-end text-text">
-                <div class="text-price">{{ formatCurrency(item.total_amount) }}</div>
-                <div class="text-type">{{ t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
-                <div class="text-distance">{{ item.distance_km ?? 0 }}{{ $t('common.km') }}</div>
+                <div class="text-price font14 fontbold">{{ formatCurrency(item.total_amount) }}</div>
+                <div class="text-type font10 fontmedium">{{ t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
+                <div class="text-distance font10">{{ item.distance_km ?? 0 }}{{ $t('common.km') }}</div>
               </div>
             </div>
 
-            <div class="row q-mt-md items-center text-text text-caption q-px-xs">
+            <div class="row q-mt-md items-center text-text q-px-xs font9 fontmedium">
               <div class="col ellipsis text-grey-7">
                 {{ formatAddress(item.address) || 'N/A' }}
               </div>
-              <q-icon name="mdi-content-copy" color="primary" size="16px" class="q-ml-xs" @click="copyAddress(item.address)"/>
+              <q-icon name="mdi-content-copy" color="primary" size="12px" class="q-ml-xs" @click="copyAddress(item.address)"/>
             </div>
 
             <div class="row q-mt-sm items-center">
               <q-btn
-                flat
+                unelevated
                 no-caps
+                flat
                 color="primary"
-                size="sm"
-                class="col-auto q-px-none btn-details"
+                size="xs"
+                padding="4px 8px"
                 :label="$t('provider.dashboard.next_schedules.details')"
                 @click="emit('view-details', item)"
               />
               <q-space />
-              <div class="row items-center q-gutter-x-xs text-grey-7" style="font-size: 11px;">
-                <q-icon 
-                  :name="item.offers_meal ? 'mdi-silverware' : 'mdi-close-outline'" 
-                  :color="item.offers_meal ? 'secondary' : 'grey-5'" 
-                  size="14px" 
+              <div class="row items-center q-gutter-x-xs text-grey-7 font9">
+                <q-icon
+                  :name="item.offers_meal ? 'mdi-silverware' : 'mdi-close-outline'"
+                  :color="item.offers_meal ? 'secondary' : 'grey-5'"
+                  size="14px"
                 />
-                <span :class="item.offers_meal ? 'text-weight-medium' : ''">
+                <span :class="item.offers_meal ? 'fontmedium' : ''">
                   {{ item.offers_meal ? $t('provider.dashboard.next_schedules.offers_meal') : $t('provider.dashboard.next_schedules.no_meal') }}
                 </span>
               </div>
@@ -136,37 +137,19 @@ const copyAddress = (address) => {
   border-radius: 12px;
 }
 .text-name {
-  font-weight: 700;
   color: #3a3a4a;
 }
-.text-rating {
-  font-size: 12px;
-  font-weight: 600;
-}
 .text-schedule-date-bold {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 700;
   color: #3a3a4a;
 }
 .text-schedule-date-regular {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 400;
   color: #666;
 }
 .text-date, .text-time, .text-type, .text-region, .text-distance {
-  font-size: 11px;
   color: #666;
 }
 .text-price {
-  font-weight: 700;
   color: #3a3a4a;
-  font-size: 14px;
-}
-.btn-details {
-  font-weight: 700;
-  font-size: 13px;
 }
 .flex-1 {
   flex: 1;

+ 21 - 38
src/components/dashboard/DashboardOpportunities.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="q-mx-md q-mb-md">
     <div class="row items-center justify-between q-mb-sm">
-      <div class="section-title gradient-diarista">{{ $t('provider.dashboard.opportunities.title') }}</div>
+      <div class="section-title font16 fontbold gradient-diarista">{{ $t('provider.dashboard.opportunities.title') }}</div>
       <q-btn flat no-caps color="grey-6" size="sm" :label="$t('common.see_all')"  @click="openAllOpportunities"/>
     </div>
 
@@ -17,46 +17,49 @@
             <div class="row no-wrap items-center q-gutter-x-sm">
               <q-avatar size="48px">
                 <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
-                <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:14px;border-radius:50%">{{ (item.client_name ?? item.client?.user?.name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
+                <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ (item.client_name ?? item.client?.user?.name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
               </q-avatar>
               <div class="column flex-1">
                 <div class="row items-center q-gutter-x-xs">
-                  <span class="text-name ellipsis">{{ item.client?.user?.name }}</span>
+                  <span class="ellipsis font12 fontmedium text-text">{{ item.client?.user?.name }}</span>
                   <div class="row items-center">
-                    <q-icon name="mdi-star" color="warning" size="14px" />
-                    <span class="text-rating text-text">{{ item.client?.average_rating }}</span>
+                    <div class="q-my-auto">
+                      <q-icon name="mdi-star" color="warning" size="12px"/>                  
+                    </div>
+                    <div class="q-my-auto">
+                      <span class="text-text font9 fontregular ">{{ item.client?.average_rating }}</span>
+                    </div>
                   </div>
                 </div>
                 <div class="row items-center no-wrap">
-                  <span class="text-schedule-date-bold">{{ formatWeekday(item.date) }}</span>
-                  <span class="text-schedule-date-regular">{{ ', ' + formatDayMonth(item.date) }}</span>
+                  <span class="text-schedule-date-bold font9 fontbold">{{ formatWeekday(item.date) }}</span>
+                  <span class="text-schedule-date-regular font9">{{ ', ' + formatDayMonth(item.date) }}</span>
                 </div>
-                <div class="text-schedule-date-regular">
+                <div class="text-schedule-date-regular font9">
                   {{ $t('common.from') }}
-                  <span class="text-schedule-date-bold">{{ item.start_time?.slice(0, 5) }}</span>
+                  <span class="text-schedule-date-bold fontbold">{{ item.start_time?.slice(0, 5) }}</span>
                   {{ $t('common.to') }}
-                  <span class="text-schedule-date-bold">{{ item.end_time?.slice(0, 5) }}</span>
+                  <span class="text-schedule-date-bold fontbold">{{ item.end_time?.slice(0, 5) }}</span>
                 </div>
               </div>
               <div class="column items-end text-text">
-                <div class="text-price">{{ formatCurrency(item.total_amount) }}</div>
-                <div class="text-type">{{ $t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
-                <div class="text-region text-weight-bold">{{ item.address?.district || 'N/A' }}</div>
-                <div class="text-distance">{{ item.distance_km ?? 0 }}{{ $t('common.km') }}</div>
+                <div class="text-price font12 fontbold">{{ formatCurrency(item.total_amount) }}</div>
+                <div class="text-type font9">{{ $t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
+                <div class="text-region font9">{{ item.address?.district || 'N/A' }}</div>
+                <div class="text-distance font9">{{ item.distance_km ?? 0 }}{{ $t('common.km') }}</div>
               </div>
             </div>
 
             <div class="row q-mt-sm justify-between">
-              <div class="text-text text-primary">
-                  {{ item.custom_schedule?.service_type?.description }}
+              <div class="text-text text-primary font11 fontmedium">
+                  {{ item.custom_schedule?.address_type }}
               </div>
               <q-btn
                  unelevated
                  rounded
                  no-caps
                  color="primary"
-                 size="sm"
-                 class="btn-details"
+                 size="xs"
                  :label="$t('common.details')"
                  @click="openOpportunityDetails(item)"
                 />
@@ -141,37 +144,17 @@ const formatDayMonth = (iso) => {
   min-width: 85vw;
   border-radius: 12px;
 }
-.text-name {
-  font-weight: 700;
-  color: #3a3a4a;
-}
-.text-rating {
-  font-size: 12px;
-  font-weight: 600;
-}
 .text-schedule-date-bold {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 700;
   color: #3a3a4a;
 }
 .text-schedule-date-regular {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 400;
   color: #666;
 }
 .text-date, .text-time, .text-type, .text-region, .text-distance {
-  font-size: 11px;
   color: #666;
 }
 .text-price {
-  font-weight: 700;
   color: #3a3a4a;
-  font-size: 14px;
-}
-.btn-details {
-  font-weight: 700;
 }
 .flex-1 {
   flex: 1;

+ 8 - 19
src/components/dashboard/DashboardPriceSuggest.vue

@@ -4,24 +4,24 @@
       <q-card-section class="q-pa-md">
         <div class="row items-center justify-between q-mb-sm">
           <div class="row items-center q-gutter-x-sm">
-            <span class="text-suggest-label">{{ $t('provider.dashboard.price_suggest.region_label_1') }}</span>
-            <span class="text-suggest-label text-weight-bold">{{ $t('provider.dashboard.price_suggest.region_label_2') }}</span>
+            <span class="text-suggest-label font10">{{ $t('provider.dashboard.price_suggest.region_label_1') }}</span>
+            <span class="text-suggest-label font10 fontbold">{{ $t('provider.dashboard.price_suggest.region_label_2') }}</span>
           </div>
-          <q-badge rounded class="price-badge q-px-md q-py-xs gradient-diarista-bg">
+          <q-badge rounded class="price-badge font10 fontbold q-px-md q-py-xs gradient-diarista-bg">
             {{ formatCurrency(data?.average_price ?? 0) }}
           </q-badge>
         </div>
         <div class="row items-center justify-between no-wrap">
           <div class="row items-center q-gutter-x-sm">
-            <span class="text-suggest-label">{{ $t('provider.dashboard.price_suggest.my_price_label') }}</span>
+            <span class="text-suggest-label font10">{{ $t('provider.dashboard.price_suggest.my_price_label') }}</span>
             <q-chip class="row items-center no-wrap bg-surface" outline color="text">
-              <span class="text-my-price q-mr-xs">{{ showMyPrice ? formatCurrency(data?.your_price ?? 0) : $t('common.price_masked') }}</span>
+              <span class="text-my-price font10 fontsemibold q-mr-xs">{{ showMyPrice ? formatCurrency(data?.your_price ?? 0) : $t('common.price_masked') }}</span>
               <q-btn icon="mdi-eye-off-outline" flat size="xs" color="grey-6" class="q-pa-none q-pl-sm" @click="showMyPrice = !showMyPrice"/>
             </q-chip>
           </div>
-          <q-btn flat no-caps color="primary" padding="0" class="btn-alter" @click="openServiceDataDialog">
-            <div class="row items-center q-gutter-x-xs">
-              <span class="text-weight-bold">{{ $t('common.alter') }}</span>
+          <q-btn flat no-caps color="primary" size="xs" padding="0" @click="openServiceDataDialog">
+            <div class="row items-center q-gutter-x-xs font10">
+              <span class="fontbold">{{ $t('common.alter') }}</span>
               <q-icon name="mdi-pencil-outline" size="xs" />
             </div>
           </q-btn>
@@ -64,23 +64,12 @@ const openServiceDataDialog = () => {
   border-radius: 12px;
 }
 .text-suggest-label {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
   color: #3a3a4a;
 }
 .price-badge {
-  font-family: "Inter", sans-serif;
-  font-size: 14px;
-  font-weight: 700;
   border-radius: 20px;
 }
 .text-my-price {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 600;
   color: #3a3a4a;
 }
-.btn-alter {
-  font-size: 11px;
-}
 </style>

+ 20 - 56
src/components/dashboard/DashboardSolicitations.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="q-mx-md q-mb-md">
     <div class="row items-center justify-between q-mb-sm">
-      <div class="section-title gradient-diarista ">{{ $t('provider.dashboard.solicitations.title') }}</div>
+      <div class="section-title font16 fontbold gradient-diarista">{{ $t('provider.dashboard.solicitations.title') }}</div>
       <q-btn flat no-caps color="grey-6" icon="mdi-chevron-right-outlined" size="sm" :label="$t('common.see_all')" />
     </div>
 
@@ -14,39 +14,37 @@
           :flat="false"
         >
           <q-card-section class="q-pa-sm">
-            <div class="row no-wrap items-center q-gutter-x-sm">
+            <div class="row no-wrap items-center q-gutter-x-sm text-text">
               <q-avatar size="48px">
                 <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
-                <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:14px;border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+                <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
               </q-avatar>
               <div class="column flex-1">
                 <div class="row items-center q-gutter-x-xs">
-                  <span class="text-name ellipsis">{{ item.client_name }}</span>
+                  <span class="ellipsis font9 fontmedium">{{ item.client_name }}</span>
                   <div class="row items-center">
-                    <q-icon name="mdi-star" color="warning" size="14px" />
-                    <span class="text-rating text-text">{{ item.average_rating }}</span>
+                    <q-icon name="mdi-star" color="warning" size="12px" />
+                    <span class="text-text font9">{{ item.average_rating }}</span>
                   </div>
                 </div>
-                <div class="row items-center no-wrap">
-                  <span class="text-schedule-date-bold">{{ formatWeekday(item.date) }}</span>
-                  <span class="text-schedule-date-regular">{{ ', ' + formatDayMonth(item.date) }}</span>
+                <div class="row items-center no-wrap font9">
+                  <span class="fontbold">{{ formatWeekday(item.date) }}</span>
+                  <span class="">{{ ', ' + formatDayMonth(item.date) }}</span>
                 </div>
-                <div class="text-schedule-date-regular">
+                <div class="font9">
                   {{ $t('common.from') }}
-                  <span class="text-schedule-date-bold">
+                  <span class="fontbold">
                     {{ item.start_time?.slice(0, 5) }}
-
                     {{ $t('common.to') }}
-
                     {{ item.end_time?.slice(0, 5) }}
                   </span>
                 </div>
               </div>
               <div class="column items-end text-text">
-                <div class="text-price">{{ formatCurrency(item.total_amount) }}</div>
-                <div class="text-type">{{ t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
-                <div class="text-region text-weight-bold">{{ item.address?.district || 'N/A' }}</div>
-                <div class="text-distance">
+                <div class="font12 fontbold">{{ formatCurrency(item.total_amount) }}</div>
+                <div class="font9">{{ t(labelsPeriodTypes.find(label => label.value == item.period_type)?.label) }}</div>
+                <div class="font9 fontbold">{{ item.address?.district || 'N/A' }}</div>
+                <div class="font9">
                   <span class="q-pr-xs">{{ item.distance_km ?? 0 }}</span>
                   {{ $t('common.km') }}
                 </div>
@@ -55,18 +53,18 @@
 
             <div class="row q-mt-sm q-gutter-x-sm items-center">
               <div>
+                <div class="text-text font9 fontmedium">
+                  {{ item.time_since_request }}
+                </div>
                 <q-btn
                   flat
                   no-caps
                   color="primary"
-                  size="sm"
-                  class="col-auto q-px-none btn-details"
+                  size="xs"
+                  class="col-auto q-px-none"
                   :label="$t('common.details')"
                   @click="emit('view-details', item)"
                 />
-                <div class="text-schedule-date-bold text-text text-weight-bold">
-                  {{ item.time_since_request }}
-                </div>
               </div>
               <q-space />
               <q-btn
@@ -150,41 +148,7 @@ const formatDayMonth = (iso) => {
 .solicitation-card {
   min-width: 85vw;
 }
-.text-name {
-  font-weight: 700;
-  color: #3a3a4a;
-}
-.text-rating {
-  font-size: 12px;
-  font-weight: 600;
-}
-.text-schedule-date-bold {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 700;
-  color: #3a3a4a;
-}
-.text-schedule-date-regular {
-  font-family: "Inter", sans-serif;
-  font-size: 11px;
-  font-weight: 400;
-  color: #666;
-}
-.text-date, .text-time, .text-type, .text-region, .text-distance {
-  font-size: 11px;
-  color: #666;
-}
-.text-price {
-  font-weight: 700;
-  color: #3a3a4a;
-  font-size: 14px;
-}
-.btn-details {
-  font-weight: 700;
-  font-size: 13px;
-}
 .btn-action {
-  font-weight: 700;
   min-width: 90px;
 }
 .flex-1 {

+ 7 - 10
src/components/dashboard/DashboardSummaryInfos.vue

@@ -3,26 +3,26 @@
     <q-card-section class="q-pa-md">
       <div class="row items-center no-wrap q-gutter-x-md">
         <div class="row items-center no-wrap q-gutter-x-sm col">
-          <q-avatar size="54px" :style="!data?.profile_photo ? avatarStyle : undefined" class="text-weight-bold text-h6">
+          <q-avatar size="54px" :style="!data?.profile_photo ? avatarStyle : undefined" class="">
             <img v-if="data?.profile_photo" :src="data.profile_photo" style="object-fit:cover;width:100%;height:100%;border-radius:50%" />
             <span v-else>{{ data?.name?.slice(0, 2).toUpperCase() ?? '??' }}</span>
           </q-avatar>
           <div class="column q-gutter-y-xs min-width-0">
-            <span class="summary-greeting text-greeting">{{ $t('provider.dashboard.summary.welcome') }}</span>
-            <span class="summary-name text-name text-primary">{{ data?.name ?? $t('provider.dashboard.summary.welcome') }}</span>
+            <span class="summary-greeting font14 fontmedium">{{ $t('provider.dashboard.summary.welcome') }}</span>
+            <span class="summary-name text-primary font16 fontbold">{{ data?.name ?? $t('provider.dashboard.summary.welcome') }}</span>
           </div>
         </div>
         <div class="column items-end q-gutter-y-xs col-auto">
-          <span class="summary-label text-label-bold text-text">{{ $t('provider.dashboard.summary.my_schedules') }}</span>
+          <span class="summary-label text-grey-6 font12 fontbold">{{ $t('provider.dashboard.summary.my_schedules') }}</span>
           <span class="summary-count row">
-            <q-icon name="mdi-clock-check-outline" class="q-my-auto" size="xs" color="grey-6" />
-            <span class="q-my-auto q-ml-sm text-caption text-weight-bold">{{ data?.pending_services ?? 0 }}</span>
+            <q-icon name="mdi-clock-check-outline" class="q-my-auto" size="xs" color="positive" />
+            <span class="q-my-auto q-ml-sm">{{ data?.pending_services ?? 0 }}</span>
           </span>
         </div>
       </div>
 
       <div class="row items-center justify-between no-wrap q-mt-xs">
-        <div class="text-text col text-caption">
+        <div class="text-text col font8 fontmedium ellipsis">
           {{ formatAddress(data.address) }}
         </div>
         <q-icon name="mdi-chevron-down" color="secondary" size="18px" class="col-auto" />
@@ -49,9 +49,6 @@ const avatarStyle = {
 .summary-name { display: block; line-height: 1.1; }
 .summary-label { white-space: nowrap; }
 .summary-count {
-  font-family: "Inter", sans-serif;
-  font-size: 20px;
-  font-weight: 500;
   color: #3a3a4a;
 }
 </style>

+ 62 - 70
src/components/dashboard/DashboardTodayServices.vue

@@ -12,51 +12,50 @@
             <div class="row no-wrap items-start q-mb-xs">
               <div class="col-8 row">
                 <q-avatar size="40px" class="flex-shrink-0 q-mr-sm">
+                  <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
                   <span
+                    v-else
                     :style="avatarColors[item.id % avatarColors.length]"
-                    class="text-weight-bold full-width full-height flex flex-center"
-                    style="font-size:14px; border-radius:50%;"
+                    class="full-width full-height flex flex-center"
+                    style="border-radius:50%;"
                   >
                     {{ item.client_name?.slice(0, 2).toUpperCase() ?? '??' }}
                   </span>
                 </q-avatar>
 
                 <div class="col column no-wrap overflow-hidden justify-center">
-                  <span class="text-caption text-text">
+                  <span class="text-text font12">
                     <template v-if="cardState(item) === 'finished'">
                       {{ $t('provider.dashboard.today_services.finished_label') }}
-                      <span class="text-weight-bold"> {{ ' ' + item.client_name ?? '—' }}</span>
+                      <span class="fontbold"> {{ ' ' + item.client_name ?? '—' }}</span>
                       {{ ' ' + $t('provider.dashboard.today_services.finished_suffix') }}
                     </template>
                     <template v-else>
                       {{ $t('provider.dashboard.today_services.start_label') }}
-                      <span class="text-weight-bold"> {{ ' ' + item.client_name ?? '—' }}</span>
+                      <span class="fontbold"> {{ ' ' + item.client_name ?? '—' }}</span>
                     </template>
                   </span>
                   <div class="row items-center q-mt-xs no-wrap">
                     <q-icon name="mdi-clock-outline" size="12px" class="q-mr-xs gradient-diarista" />
-                    <span class="hours-font text-grey-5">
+                    <span class="text-grey-5 font9 fontregular">
                       {{ $t('common.from') }} {{  item.start_time?.slice(0, 5) }} {{ $t('common.to') }} {{ item.end_time?.slice(0, 5) }}
                     </span>
                   </div>
                 </div>
               </div>
 
-              <div class="flex-shrink-0 row items-center justify-center col-4">
+              <div class="flex-shrink-0 row items-right justify-end col-4">
                 <div v-if="cardState(item) === 'awaiting_code'" class="col-12 row items-center justify-center q-pb-sm q-px-sm">
-                  <div class="hint-text text-caption text-text text-center q-mb-xs col-12">
+                  <div class="hint-text text-text text-center font9 q-mb-xs col-12">
                     {{ $t('provider.dashboard.today_services.code_hint') }}
                   </div>
-                  <!-- <div class="hint-text text-caption text-text text-center q-mb-xs col-12">
-                    {{ $t('provider.dashboard.today_services.code_hint2') }}
-                  </div> -->
                   <div class="code-input-row col-12">
                     <input
                       v-for="(_, idx) in 4"
                       :key="idx"
                       :ref="el => setCodeRef(item.id, idx, el)"
                       v-model="codeInputs[item.id][idx]"
-                      class="code-input-box"
+                      class="code-input-box font9 fontbold"
                       type="tel"
                       maxlength="1"
                       inputmode="numeric"
@@ -65,17 +64,17 @@
                       @paste.prevent="onCodePaste(item, $event)"
                     />
                   </div>
-                  <div v-if="codeError[item.id]" class="text-negative code-error-text q-mt-xs text-center">
+                  <div v-if="codeError[item.id]" class="text-negative code-error-text font9 q-mt-xs text-center">
                     {{ codeError[item.id] }}
                   </div>
                 </div>
 
                 <div v-else-if="cardState(item) === 'in_progress'" class="col-12 text-center q-mb-xs">
                   <div class="column items-center">
-                    <span class="badge-status-text text-text text-weight-bold q-my-xs">
+                    <span class="text-text font9 fontmedium q-my-xs">
                       {{ $t('provider.dashboard.today_services.in_progress') }}
                     </span>
-                    <div class="code-pill bg-positive row">
+                    <div class="code-pill font12 fontbold bg-positive row">
                       <q-icon
                         name="mdi-check" size="12px" class="q-mr-xs q-my-auto"
                       />
@@ -84,22 +83,25 @@
                   </div>
                 </div>
 
-                <div v-else>
-                  <div v-if="item.provider_reviewed" class="rate-btn reviewed-badge">
-                    <q-icon name="mdi-star" size="14px" class="q-mr-xs" />
+                <div v-else class="">
+                  <div v-if="item.provider_reviewed" class="rate-btn reviewed-badge column  fontsemibold">
+                    <div class="text-center">
+                      <q-icon name="mdi-star" size="14px" class="q-mr-xs " />
+                    </div>
                     {{ $t('provider.dashboard.today_services.reviewed_badge') }}
                   </div>
-                  <q-btn
-                    v-else
-                    unelevated no-caps
-                    class="rate-btn"
-                    @click.stop="emit('rate', item)"
-                  >
-                    <div class="column items-center">
-                      <q-icon name="mdi-star-outline" size="12px" class="q-mr-xs" />
-                      {{ $t('provider.dashboard.today_services.rate_btn') }}
-                    </div>
-                  </q-btn>
+                  <div v-else class="">
+                    <q-btn
+                      unelevated no-caps
+                      class="rate-btn font10 fontmedium"
+                      @click.stop="emit('rate', item)"
+                    >
+                      <div class="column items-center">
+                        <q-icon name="mdi-star-outline" size="14px" class="q-mr-xs" />
+                        {{ $t('provider.dashboard.today_services.rate_btn') }}
+                      </div>
+                    </q-btn>
+                  </div>
                 </div>
               </div>
             </div>
@@ -124,16 +126,17 @@
               <q-space />
               <template v-if="cardState(item) === 'in_progress'">
                 <q-icon name="mdi-clock-outline" size="13px" class="q-mr-xs flex-shrink-0 gradient-diarista" />
-                <span class="text-caption text-grey-6 text-right text-no-wrap">
+                <span class="text-grey-6 text-right text-no-wrap font11">
                   {{ $t('provider.dashboard.today_services.end_time_label') }} 
                   <span class="gradient-diarista">{{ calculateTimeUntilEnd(item.end_time) }}</span>
                 </span>
               </template>
               <template v-else-if="cardState(item) === 'awaiting_code'">
                 <q-icon name="mdi-map-marker-outline" size="13px" color="grey-6" class="q-mr-xs flex-shrink-0" />
-                <span class="text-caption text-grey-6 col ellipsis text-right">
+                <span class="text-grey-6 col ellipsis text-right font9 fontmedium">
                   {{ [item.address?.address, item.address?.number, item.address?.district].filter(Boolean).join(', ') || '—' }}
                 </span>
+                <q-icon name="mdi-content-copy" color="primary" size="16px" class="q-ml-xs" @click="copyAddress(item.address)"/>
               </template>
             </div>
           </q-card-section>
@@ -149,6 +152,7 @@ import { useQuasar } from 'quasar'
 import { useI18n } from 'vue-i18n'
 import ProfileHelpDialog from 'src/components/profile/ProfileHelpDialog.vue'
 import { verifyScheduleCode } from 'src/api/schedule'
+import { formatAddress } from 'src/helpers/utils';
 
 const props = defineProps({ data: { type: Array, default: () => [] } })
 const emit = defineEmits(['rate', 'refresh'])
@@ -262,6 +266,14 @@ const calculateTimeUntilEnd = (endTimeStr) => {
 const openHelp = () => {
   $q.dialog({ component: ProfileHelpDialog })
 }
+
+const copyAddress = (address) => {
+  const formatted = formatAddress(address);
+  if (formatted) {
+    navigator.clipboard.writeText(formatted);
+  }
+  $q.notify({ message: t('provider.dashboard.next_schedules.address_copied'), color: 'positive' });
+};
 </script>
 
 <style scoped lang="scss">
@@ -287,14 +299,14 @@ const openHelp = () => {
 .hint-text {
   max-width: 100px;
   line-height: 1.3;
-  font-size: 9px;
 }
 
 .code-input-row { 
   display: flex;
   align-items: center; 
   justify-content: center; 
-  gap: 4px; background: #d1d5db; 
+  gap: 4px;
+  background: #d1d5db; 
   border-radius: 999px; 
   padding: 4px 8px; 
   width: 110px; 
@@ -302,66 +314,49 @@ const openHelp = () => {
   margin: 0 auto; 
 }
 
-.code-input-box { 
-  width: 16px; 
-  height: 18px; 
-  background: transparent; 
-  border: none; 
-  border-bottom: 2px solid white; 
-  border-radius: 0; 
-  text-align: center; 
-  font-size: 11px; 
-  font-weight: 700; 
-  color: #1a1a2e; 
-  outline: none; 
-  caret-color: transparent; 
-  &:focus { 
-    border-bottom: 2px solid #ffffff; 
-    box-shadow: none; 
-  } 
+.code-input-box {
+  width: 12px;
+  height: 18px;
+  background: transparent;
+  border: none;
+  border-bottom: 1px solid white;
+  border-radius: 0;
+  text-align: center;
+  color: #1a1a2e;
+  outline: none;
+  caret-color: transparent;
+  &:focus {
+    border-bottom: 2px solid #ffffff;
+    box-shadow: none;
+  }
 }
 
 .code-error-text {
-  font-size: 9px;
   max-width: 110px;
   line-height: 1.2;
 }
 
 .code-pill {
   color: white;
-  font-weight: 800;
-  font-size: 12px;
   letter-spacing: 2px;
   border-radius: 20px;
   padding: 1px 8px;
 }
 
-.badge-status-text {
-  font-size: 11px;
-  
-}
-
 .rate-btn {
   background: #EC4899;
   color: white;
-  font-weight: 600;
-  font-size: 11px;
   white-space: nowrap;
   border-radius: 10px !important;
-  min-width: 45px;
-  min-height: 40px;
+  min-width: 55px;
+  min-height: 50px;
   padding: 3px 5px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
   gap: 4px;
 }
 
 .reviewed-badge {
   cursor: default;
   opacity: 0.85;
-  font-size: 11px;
 }
 
 .progress-track {
@@ -383,7 +378,4 @@ const openHelp = () => {
   }
 }
 
-.hours-font {
-  font-size: 11px;
-}
 </style>

+ 26 - 24
src/components/dashboard/NextSchedulesDetailsDialog.vue

@@ -9,27 +9,27 @@
       <q-card-section class="column items-center q-pt-xs q-pb-sm">
         <q-avatar size="72px" class="q-mb-sm">
           <img v-if="schedule.customer_photo" :src="schedule.customer_photo" style="object-fit:cover" />
-          <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[schedule.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ (schedule.customer_name ?? schedule.client_name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
+          <span v-else class="full-width full-height flex flex-center" :style="avatarColors[schedule.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ (schedule.customer_name ?? schedule.client_name)?.slice(0,2).toUpperCase() ?? '??' }}</span>
         </q-avatar>
-        <div class="text-subtitle1 text-weight-bold text-text">
+        <div class="text-text font16 fontbold">
           {{ schedule.customer_name ?? schedule.client_name }}
         </div>
-        <div class="text-price q-mt-xs">{{ formatCurrency(schedule.total_amount) }}</div>
-        <div class="text-caption text-grey-6 q-mt-xxs">{{ periodLabel }}</div>
+        <div class="text-price font16 fontbold q-mt-xs">{{ formatCurrency(schedule.total_amount) }}</div>
+        <div class="text-grey-6 font12 q-mt-xxs">{{ periodLabel }}</div>
       </q-card-section>
 
       <q-separator class="q-mx-lg" />
 
-      <q-card-section class="column items-center q-py-sm text-text">
-        <div class="text-body2 text-center">
-          <span class="text-weight-bold">{{ weekdayLabel }}</span>
+      <q-card-section class="column items-center q-py-sm text-text font12">
+        <div class="text-center">
+          <span class="fontbold">{{ weekdayLabel }}</span>
           <span class="text-grey-7">{{', ' + dayMonthLabel }}</span>
         </div>
-        <div class="text-body2 text-center q-mt-xxs">
+        <div class="text-center q-mt-xxs">
           {{ $t('common.from') }}
-          <span class="text-weight-bold">{{ schedule.start_time?.slice(0, 5) }}</span>
+          <span class="fontbold">{{ schedule.start_time?.slice(0, 5) }}</span>
           {{ $t('common.to') }}
-          <span class="text-weight-bold">{{ schedule.end_time?.slice(0, 5) }}</span>
+          <span class="fontbold">{{ schedule.end_time?.slice(0, 5) }}</span>
         </div>
       </q-card-section>
 
@@ -42,7 +42,7 @@
             :color="schedule.offers_meal ? 'secondary' : 'grey-5'"
             size="18px"
           />
-          <span class="text-body2" :class="schedule.offers_meal ? 'text-text' : 'text-grey-6'">
+          <span class="font12" :class="schedule.offers_meal ? 'text-text' : 'text-grey-6'">
             {{ schedule.offers_meal
               ? $t('provider.dashboard.next_schedules.offers_meal')
               : $t('provider.dashboard.next_schedules.no_meal') }}
@@ -54,17 +54,27 @@
 
       <q-card-section class="column items-center q-py-sm q-px-lg">
         <div class="row items-start q-gutter-x-xs no-wrap">
-          <q-icon name="mdi-map-marker-outline" color="primary" size="20px" class="q-mt-xxs flex-shrink-0" />
-          <span class="text-body2 text-grey-8 text-center">{{ formattedAddress || 'N/A' }}</span>
+          <div class="col-1 q-my-auto">
+            <q-icon name="mdi-map-marker-outline" color="primary" size="20px" class="q-mt-xxs flex-shrink-0" />
+          </div>
+          <div class="col">
+            <span class="text-grey-8 text-center font12">{{ formattedAddress || 'N/A' }}</span>
+          </div>
+        </div>
+        <div class="text-grey-6 text-center font12 q-mt-xs">
+          {{ $t('provider.dashboard.solicitations.distance_prefix') }}
+          <strong>{{ (schedule.distance_km ?? 0) + ' km' }}</strong>
+          {{ $t('provider.dashboard.solicitations.distance_suffix') }}
         </div>
         <q-btn
           flat
           no-caps
           dense
           color="primary"
+          size="sm"
           icon="mdi-content-copy"
           :label="$t('provider.dashboard.next_schedules.copy_address')"
-          class="q-mt-xs btn-copy"
+          class="q-mt-xs"
           @click="copyAddress"
         />
       </q-card-section>
@@ -75,7 +85,8 @@
           rounded
           no-caps
           color="primary"
-          class="full-width btn-close"
+          size="sm"
+          class="full-width btn-close font14 fontbold"
           :label="$t('provider.dashboard.cancel_schedule.close')"
           @click="onDialogCancel"
         />
@@ -192,22 +203,13 @@ const openHelp = () => {
 }
 
 .text-price {
-  font-size: 26px;
-  font-weight: 700;
   color: var(--q-primary);
 }
 
 .btn-close {
-  font-weight: 700;
-  font-size: 16px;
   padding: 10px 0;
 }
 
-.btn-copy {
-  font-size: 12px;
-  font-weight: 600;
-}
-
 .flex-shrink-0 {
   flex-shrink: 0;
 }

+ 8 - 15
src/components/dashboard/ScheduleCancelDialog.vue

@@ -7,13 +7,13 @@
       </div>
 
       <q-card-section class="q-pt-none q-pb-sm q-px-lg text-center">
-        <div class="cancel-title text-secondary text-weight-bold">
+        <div class="cancel-title text-primary font16 fontbold">
           {{ $t('provider.dashboard.cancel_schedule.title') }}
         </div>
       </q-card-section>
 
       <q-card-section class="q-pt-none q-pb-sm q-px-lg">
-        <div class="text-body2 text-grey-8 text-weight-bold q-mb-xs">
+        <div class="text-grey-8 font14 fontbold q-mb-xs">
           {{ $t('provider.dashboard.cancel_schedule.reason_label') }}
         </div>
         <q-input
@@ -32,17 +32,10 @@
       <q-card-section class="q-pt-xs q-pb-md q-px-lg">
         <div class="warning-box row no-wrap q-gutter-x-sm q-pa-sm">
           <q-icon name="mdi-alert-outline" color="secondary" size="22px" class="q-mt-xs flex-shrink-0" />
-          <div>
-            <span class="text-caption text-weight-bold text-grey-9">
-              {{ $t('provider.dashboard.cancel_schedule.warning_title') }}
-            </span>
-            <span class="text-caption text-grey-8">
-              {{ ' ' + $t('provider.dashboard.cancel_schedule.warning_free') }}
-            </span>
-            <br />
-            <span class="text-caption text-grey-8">
-              {{ $t('provider.dashboard.cancel_schedule.warning_fee') }}
-            </span>
+          <div class="font12 text-grey-8">
+            <span>{{ $t('provider.dashboard.cancel_schedule.warning_before') }}</span>
+            <span class="fontbold">{{ $t('provider.dashboard.cancel_schedule.warning_bold') }}</span>
+            <span>{{ $t('provider.dashboard.cancel_schedule.warning_after') }}</span>
           </div>
         </div>
       </q-card-section>
@@ -53,6 +46,7 @@
             unelevated
             rounded
             no-caps
+            size="sm"
             class="btn-action bg-grey-3 text-grey-8"
             :label="$t('provider.dashboard.cancel_schedule.btn_cancel')"
             @click="onDialogCancel"
@@ -64,6 +58,7 @@
             color="secondary"
             class="btn-action"
             :loading="loading"
+            size="sm"
             :disable="!cancelText || cancelText.trim().length < 5"
             :label="$t('provider.dashboard.cancel_schedule.btn_keep')"
             @click="confirmCancel"
@@ -118,7 +113,6 @@ const confirmCancel = async () => {
 }
 
 .cancel-title {
-  font-size: 18px;
   line-height: 1.35;
 }
 
@@ -129,7 +123,6 @@ const confirmCancel = async () => {
 
 .btn-action {
   min-width: 110px;
-  font-weight: 700;
 }
 
 .flex-shrink-0 {

+ 10 - 15
src/components/dashboard/ScheduleRatingDialog.vue

@@ -10,13 +10,13 @@
         <q-avatar size="64px" class="q-mb-sm">
           <span
             :style="avatarStyle"
-            class="text-weight-bold full-width full-height flex flex-center"
+            class="full-width full-height flex flex-center"
             style="font-size: 20px; border-radius: 50%;"
           >
             {{ initials }}
           </span>
         </q-avatar>
-        <div class="text-body1 text-text text-weight-bold text-center q-px-lg" style="line-height:1.3">
+        <div class="text-text text-center font16 fontbold q-px-lg" style="line-height:1.3">
           {{ $t('provider.dashboard.schedule_rating.title') }}
           <span class="text-primary"> {{ schedule.client_name + '?' }}</span>
         </div>
@@ -35,7 +35,7 @@
       </div>
 
       <q-card-section v-if="stars > 0" class="q-pt-xs q-pb-xs">
-        <div class="text-caption text-grey-7 text-center q-mb-sm">
+        <div class="text-grey-7 text-center font12 q-mb-sm">
           {{ isNegative ? $t('provider.dashboard.schedule_rating.negative_label') : $t('provider.dashboard.schedule_rating.positive_label') }}
         </div>
         <div v-if="loadingTags" class="row justify-center q-py-sm">
@@ -45,8 +45,8 @@
           <div
             v-for="tag in tags"
             :key="tag.id"
-            class="tag-pill"
-            :class="{ 'tag-pill--selected': selectedTagIds.includes(tag.id) }"
+            class="tag-pill font12"
+            :class="{ 'tag-pill--selected': selectedTagIds.includes(tag.id), 'fontsemibold': selectedTagIds.includes(tag.id) }"
             @click="toggleTag(tag.id)"
           >
             {{ tag.description }}
@@ -55,7 +55,7 @@
       </q-card-section>
 
       <q-card-section class="q-pt-xs q-pb-xs q-px-lg">
-        <div class="text-caption text-grey-7 q-mb-xs">
+        <div class="text-grey-7 font12 q-mb-xs">
           {{ $t('provider.dashboard.schedule_rating.comment_placeholder') }}
         </div>
         <q-input
@@ -86,7 +86,7 @@
           </div>
           <div v-if="photos.length < 5" class="photo-add" @click="photoInputRef.click()">
             <q-icon name="mdi-camera-plus-outline" size="24px" color="grey-5" />
-            <div class="photo-add__label">{{ $t('provider.dashboard.schedule_rating.add_photo') }}</div>
+            <div class="photo-add__label font9">{{ $t('provider.dashboard.schedule_rating.add_photo') }}</div>
           </div>
         </div>
       </q-card-section>
@@ -110,7 +110,7 @@
           no-caps
           full-width
           color="primary"
-          class="submit-btn col-12"
+          class="submit-btn font16 fontbold col-12"
           :label="$t('provider.dashboard.schedule_rating.submit_btn')"
           :loading="loading"
           :disable="stars === 0"
@@ -119,7 +119,7 @@
       </q-card-section>
 
       <q-card-section class="q-pt-xs q-pb-lg text-center">
-        <span class="text-caption text-grey-6 cursor-pointer" @click="openHelp">
+        <span class="text-grey-6 font12 cursor-pointer" @click="openHelp">
           {{ $t('provider.dashboard.schedule_rating.help_link') }}
         </span>
       </q-card-section>
@@ -216,7 +216,7 @@ const submit = async () => {
     await createReview({
       schedule_id: props.schedule.id,
       origin: 'provider',
-      origin_id: store.user.provider.id,
+      origin_id: store.user.provider_id,
       stars: stars.value,
       comment: comment.value || null,
       improvements_ids: selectedTagIds.value,
@@ -264,7 +264,6 @@ onMounted(async () => {
   border: 1.5px solid #d1d5db;
   border-radius: 20px;
   padding: 5px 14px;
-  font-size: 12px;
   color: #6b7280;
   cursor: pointer;
   transition: border-color 0.15s, color 0.15s;
@@ -273,13 +272,10 @@ onMounted(async () => {
   &--selected {
     border-color: #8B5CF6;
     color: #8B5CF6;
-    font-weight: 600;
   }
 }
 
 .submit-btn {
-  font-size: 15px;
-  font-weight: 700;
   padding: 10px 0;
 }
 
@@ -320,7 +316,6 @@ onMounted(async () => {
   flex-shrink: 0;
 
   &__label {
-    font-size: 9px;
     color: #9ca3af;
     text-align: center;
     margin-top: 2px;

+ 38 - 56
src/components/dashboard/SolicitationDetailsDialog.vue

@@ -12,15 +12,15 @@
         <q-card-section class="column items-center q-pt-xs q-pb-xs">
           <q-avatar size="72px" class="q-mb-sm">
             <img v-if="solicitation.customer_photo" :src="solicitation.customer_photo" style="object-fit:cover" />
-            <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[solicitation.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ solicitation.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+            <span v-else class="full-width full-height flex flex-center" :style="avatarColors[solicitation.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ solicitation.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
           </q-avatar>
-          <div class="text-subtitle1 text-weight-bold text-text">
+          <div class="text-text font16 fontbold">
             {{ solicitation.client_name }}
           </div>
-          <div v-if="solicitation.address?.district" class="text-caption text-grey-6 q-mt-xs">
+          <div v-if="solicitation.address?.district" class="text-grey-6 font12 q-mt-xs">
             {{ solicitation.address.district }}
           </div>
-          <div v-if="solicitation.address" class="text-caption text-grey-5 text-center q-mt-xs">
+          <div v-if="solicitation.address" class="text-grey-6 font12 text-center q-mt-xs">
             {{ formatAddressShort(solicitation.address) }}
           </div>
         </q-card-section>
@@ -38,7 +38,7 @@
               :color="service.active ? 'secondary' : 'grey-4'"
               size="16px"
             />
-            <span class="text-body2 text-grey-8">{{ service.label }}</span>
+            <span class="text-grey-8 font14">{{ service.label }}</span>
           </div>
         </q-card-section>
 
@@ -46,30 +46,30 @@
 
         <q-card-section class="q-pt-xs q-pb-xs q-px-lg">
           <div class="detail-row">
-            <span class="detail-label text-secondary text-weight-bold">{{ $t('common.terms.date') }}</span>
-            <span class="detail-value text-grey-9">{{ fullDateLabel }}</span>
+            <span class="text-secondary font12 fontsemibold">{{ $t('common.terms.date') }}</span>
+            <span class="text-grey-9 font13">{{ fullDateLabel }}</span>
           </div>
           <div class="detail-row">
-            <span class="detail-label text-secondary text-weight-bold">{{ $t('common.terms.hour') }}</span>
-            <span class="detail-value text-grey-9">
+            <span class="text-secondary font12 fontsemibold">{{ $t('common.terms.hour') }}</span>
+            <span class="text-grey-9 font13">
               {{ solicitation.start_time?.slice(0, 5) }} {{ $t('common.to') }} {{ solicitation.end_time?.slice(0, 5) }}
             </span>
           </div>
           <div class="detail-row">
-            <span class="detail-label text-secondary text-weight-bold">{{ $t('common.terms.total_amount') }}</span>
-            <span class="detail-value text-grey-9">{{ formatCurrency(baseAmount) }}</span>
+            <span class="text-secondary font12 fontsemibold">{{ $t('common.terms.total_amount') }}</span>
+            <span class="text-grey-9 font13">{{ formatCurrency(baseAmount) }}</span>
           </div>
           <div class="detail-row">
-            <span class="detail-label text-secondary text-weight-bold">{{ $t('provider.dashboard.cancel_schedule.service_fee') }}</span>
-            <span class="detail-value text-grey-9">{{ formatCurrency(serviceFee) }}</span>
+            <span class="text-secondary font12 fontsemibold">{{ $t('provider.dashboard.cancel_schedule.service_fee') }}</span>
+            <span class="text-grey-9 font13">{{ formatCurrency(serviceFee) }}</span>
           </div>
         </q-card-section>
 
         <q-separator class="q-mx-md q-my-xs" />
 
         <q-card-section class="q-pt-xs q-pb-sm text-center">
-          <span class="text-weight-bold text-grey-9">{{ $t('provider.dashboard.cancel_schedule.total') }}</span>
-          <span class="total-value text-secondary text-weight-bold q-ml-xs">{{ formatCurrency(solicitation.total_amount) }}</span>
+          <span class="text-grey-9 fontbold">{{ $t('provider.dashboard.cancel_schedule.total') }}</span>
+          <span class="text-secondary fontbold font22 q-ml-xs">{{ formatCurrency(solicitation.total_amount) }}</span>
         </q-card-section>
 
         <q-card-section class="q-pt-none q-pb-xs q-px-lg">
@@ -78,7 +78,7 @@
             rounded
             no-caps
             color="secondary"
-            class="full-width btn-close-paid"
+            class="full-width btn-close-paid font16 fontbold"
             :label="$t('provider.dashboard.cancel_schedule.close')"
             @click="onDialogCancel"
           />
@@ -112,20 +112,20 @@
         <q-card-section class="column items-center q-pt-sm q-pb-sm">
           <q-avatar size="72px" class="q-mb-sm">
             <img v-if="solicitation.customer_photo" :src="solicitation.customer_photo" style="object-fit:cover" />
-            <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[solicitation.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ solicitation.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+            <span v-else class="full-width full-height flex flex-center" :style="avatarColors[solicitation.id % avatarColors.length]" style="font-size:20px;border-radius:50%">{{ solicitation.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
           </q-avatar>
 
-          <div class="text-subtitle1 text-weight-bold text-text">{{ solicitation.client_name }}</div>
+          <div class="text-text font16 fontbold">{{ solicitation.client_name }}</div>
 
-          <div class="text-price q-mt-xs">{{ formatCurrency(solicitation.total_amount) }}</div>
-          <div class="text-caption text-grey-6">{{ periodLabel }}</div>
+          <div class="text-price text-primary font16 fontbold q-mt-xs">{{ formatCurrency(solicitation.total_amount) }}</div>
+          <div class="text-grey-6 font12">{{ periodLabel }}</div>
         </q-card-section>
 
-        <q-card-section class="column items-center q-pt-none q-pb-sm text-text">
-          <div class="text-body2 text-center">
-            <span class="text-weight-bold">{{ weekdayLabel + ' ,' + dayMonthLabel }}</span>
+        <q-card-section class="column items-center q-pt-none q-pb-sm text-text font14">
+          <div class="text-center">
+            <span class="fontbold">{{ weekdayLabel + ' ,' + dayMonthLabel }}</span>
           </div>
-          <div class="text-body2 text-center">
+          <div class="text-center">
             {{ $t('common.from') }} <strong>{{ solicitation.start_time?.slice(0, 5) }}</strong>
             {{ $t('common.to') }} <strong>{{ solicitation.end_time?.slice(0, 5) }}</strong>
           </div>
@@ -138,7 +138,7 @@
               :color="solicitation.offers_meal ? 'positive' : 'grey-5'"
               size="18px"
             />
-            <span class="text-body2 text-grey-7">
+            <span class="text-grey-7 font14">
               {{ solicitation.offers_meal
                 ? $t('provider.dashboard.solicitations.offers_meal')
                 : $t('provider.dashboard.solicitations.not_offers_meal') }}
@@ -148,17 +148,17 @@
 
         <q-card-section class="column items-center q-pt-xs q-pb-sm text-text">
           <div class="row items-center q-gutter-x-xs">
-            <q-icon name="mdi-map-marker" color="secondary" size="20px" />
-            <span class="text-body1 text-weight-bold">{{ solicitation.address?.district || 'N/A' }}</span>
+            <q-icon name="mdi-map-marker" color="primary" size="20px" />
+            <span class="font16 fontbold">{{ solicitation.address?.district || 'N/A' }}</span>
           </div>
-          <div class="text-caption text-grey-6 text-center q-mt-xs">
+          <div class="text-grey-6 text-center font12 q-mt-xs">
             {{ $t('provider.dashboard.solicitations.distance_prefix') }}
             <strong>{{ (solicitation.distance_km ?? 0) + ' km' }}</strong>
             {{ $t('provider.dashboard.solicitations.distance_suffix') }}
           </div>
-          <div class="q-mt-xs">
-            <span class="text-caption text-grey-6">{{ $t('provider.dashboard.solicitations.via_agenda_text') }} </span>
-            <span class="text-caption text-secondary text-weight-bold">{{ ' ' + $t('provider.dashboard.solicitations.via_agenda') }}</span>
+          <div class="q-mt-xs font12">
+            <span class="text-grey-6">{{ $t('provider.dashboard.solicitations.via_agenda_text') }} </span>
+            <span class="text-primary fontbold">{{ ' ' + $t('provider.dashboard.solicitations.via_agenda') }}</span>
           </div>
         </q-card-section>
 
@@ -189,15 +189,16 @@
           </div>
         </q-card-section>
 
-        <div class="q-pa-md">
-          <span class="text-caption text-warning text-weight-bold">{{ $t('provider.dashboard.solicitations.same_day_warning_label') }} </span>
-          <span class="text-caption text-grey-8">{{ $t('provider.dashboard.solicitations.same_day_warning') }}</span>
+        <div class="q-pa-md font12 text-primary">
+          <span>{{ $t('provider.dashboard.solicitations.same_day_warning_before') }}</span>
+          <span class="fontbold">{{ $t('provider.dashboard.solicitations.same_day_warning_bold') }}</span>
+          <span>{{ $t('provider.dashboard.solicitations.same_day_warning_after') }}</span>
         </div>
       </template>
 
       <template v-else-if="view === 'confirm-accept'">
         <q-card-section class="column items-center q-pt-xl q-pb-lg text-center">
-          <div class="confirm-title text-secondary text-weight-bold">
+          <div class="confirm-title text-secondary fontbold">
             {{ $t('provider.dashboard.solicitations.confirm_accept') }}
           </div>
         </q-card-section>
@@ -229,10 +230,10 @@
 
       <template v-else-if="view === 'confirm-reject'">
         <q-card-section class="column items-center q-pt-xl q-pb-md text-center">
-          <div class="confirm-title text-secondary text-weight-bold">
+          <div class="confirm-title text-secondary fontbold">
             {{ $t('provider.dashboard.solicitations.confirm_reject') }}
           </div>
-          <div class="q-mt-md text-body2 text-grey-7 confirm-tip">
+          <div class="q-mt-md text-grey-7 confirm-tip font13">
             <strong>{{ $t('provider.dashboard.solicitations.tip_label') }} </strong>
             {{ $t('provider.dashboard.solicitations.reject_tip') }}
           </div>
@@ -413,30 +414,23 @@ const openCancelDialog = () => {
 }
 
 .text-price {
-  font-size: 24px;
-  font-weight: 700;
   color: var(--q-secondary);
 }
 
 .btn-action {
   min-width: 110px;
-  font-weight: 700;
 }
 
 .btn-close-paid {
-  font-weight: 700;
-  font-size: 16px;
   padding: 10px 0;
 }
 
 .confirm-title {
-  font-size: 20px;
   line-height: 1.35;
   padding: 0 12px;
 }
 
 .confirm-tip {
-  font-size: 13px;
   line-height: 1.5;
   padding: 0 8px;
 }
@@ -448,16 +442,4 @@ const openCancelDialog = () => {
   margin-bottom: 4px;
 }
 
-.detail-label {
-  font-size: 12px;
-  font-weight: 600;
-}
-
-.detail-value {
-  font-size: 13px;
-}
-
-.total-value {
-  font-size: 22px;
-}
 </style>

+ 2 - 2
src/components/defaults/DefaultFilePicker.vue

@@ -35,7 +35,7 @@
             class="absolute-center"
           />
           <div
-            class="text-caption text-grey-6 text-center absolute-bottom q-pb-sm q-px-md"
+            class="text-grey-6 text-center absolute-bottom q-pb-sm q-px-md font12"
           >
             {{
               isDragging
@@ -57,7 +57,7 @@
         <div v-else class="position-relative column full-height flex-center">
           <q-icon name="mdi-file-check" size="48px" color="grey-6" />
           <div
-            class="absolute-bottom text-caption text-grey-6 text-center q-mb-sm q-px-md"
+            class="absolute-bottom text-grey-6 text-center q-mb-sm q-px-md"
           >
             {{ model.name }}
           </div>

+ 7 - 15
src/components/layout/LeftMenuLayout.vue

@@ -56,7 +56,7 @@
               class="q-my-xs"
             >
               <q-item-section avatar>
-                <q-icon :name="item.icon" style="font-size: 18px" />
+                <q-icon :name="item.icon" />
               </q-item-section>
               <q-item-section>{{ $t(item.title) }}</q-item-section>
               <q-tooltip
@@ -89,7 +89,7 @@
                 >
                   <template #header>
                     <q-item-section avatar>
-                      <q-icon :name="item.icon" style="font-size: 18px" />
+                      <q-icon :name="item.icon" />
                     </q-item-section>
                     <q-item-section>{{ $t(item.title) }}</q-item-section>
                   </template>
@@ -103,7 +103,7 @@
                       class="menu-item--spaced q-pl-lg"
                     >
                       <q-item-section avatar>
-                        <q-icon :name="child.icon" style="font-size: 18px" />
+                        <q-icon :name="child.icon" />
                       </q-item-section>
                       <q-item-section>{{ $t(child.title) }}</q-item-section>
                       <q-tooltip
@@ -126,7 +126,7 @@
                   class="menu-item--spaced"
                 >
                   <q-item-section avatar>
-                    <q-icon :name="item.icon" style="font-size: 18px" />
+                    <q-icon :name="item.icon" />
                   </q-item-section>
                   <q-item-section>{{ $t(item.title) }}</q-item-section>
                   <q-tooltip
@@ -149,7 +149,7 @@
                         exact-active-class="menu-selected"
                       >
                         <q-item-section avatar>
-                          <q-icon :name="child.icon" style="font-size: 18px" />
+                          <q-icon :name="child.icon" />
                         </q-item-section>
                         <q-item-section>{{ $t(child.title) }}</q-item-section>
                       </q-item>
@@ -176,7 +176,6 @@
                 <q-icon
                   name="mdi-account"
                   color="primary"
-                  style="font-size: 20px"
                 />
               </template>
             </q-item-section>
@@ -204,7 +203,6 @@
                     <q-icon
                       name="account_circle"
                       color="primary"
-                      style="font-size: 18px"
                     />
                   </q-item-section>
                   <q-item-section>{{
@@ -218,7 +216,6 @@
                     <q-icon
                       name="logout"
                       color="negative"
-                      style="font-size: 18px"
                     />
                   </q-item-section>
                   <q-item-section>{{ $t("auth.logout") }}</q-item-section>
@@ -242,8 +239,8 @@
           </div>
         </q-item>
       </q-list>
-      <div class="full-width text-center text-subtitle3">
-        <span class="text-caption text-weight-light">{{ version }}</span>
+      <div class="full-width text-center">
+        <span class="font10 fontregular">{{ version }}</span>
       </div>
     </div>
   </q-drawer>
@@ -313,11 +310,6 @@ watch(miniState, () => {
 
 <style lang="scss" scoped>
 @import "/src/css/quasar.variables.scss";
-.text-subtitle3 {
-  font-size: 1.1rem !important;
-  font-weight: 400 !important;
-}
-
 .menu-selected {
   background-color: rgba($primary, 0.1);
   color: $primary;

+ 6 - 11
src/components/layout/LeftMenuLayoutMobile.vue

@@ -25,14 +25,14 @@
               class="q-my-xs"
             >
               <q-item-section avatar>
-                <q-icon :name="item.icon" style="font-size: 18px" />
+                <q-icon :name="item.icon" />
               </q-item-section>
               <q-item-section>{{ $t(item.title) }}</q-item-section>
             </q-item>
             <!-- Expansive Menu with children -->
             <q-expansion-item
               v-else
-              :key="item.name"
+              :key="item.name + item.id"
               v-model="isExpasionItemExpanded"
               header-class="menu-item--spaced"
               :class="{
@@ -42,7 +42,7 @@
             >
               <template #header>
                 <q-item-section avatar>
-                  <q-icon :name="item.icon" style="font-size: 18px" />
+                  <q-icon :name="item.icon" />
                 </q-item-section>
                 <q-item-section>{{ $t(item.title) }}</q-item-section>
               </template>
@@ -56,7 +56,7 @@
                   class="menu-item--spaced q-pl-lg"
                 >
                   <q-item-section avatar>
-                    <q-icon :name="child.icon" style="font-size: 18px" />
+                    <q-icon :name="child.icon" />
                   </q-item-section>
                   <q-item-section>{{ $t(child.title) }}</q-item-section>
                 </q-item>
@@ -76,8 +76,8 @@
           </div>
         </q-item>
       </q-list>
-      <div class="full-width text-center text-subtitle3">
-        <span class="text-caption text-weight-light">1.0.0</span>
+      <div class="full-width text-center">
+        <span class="font10 fontregular">1.0.0</span>
       </div>
     </div>
   </q-drawer>
@@ -111,11 +111,6 @@ const openUrl = (url) => {
 
 <style lang="scss" scoped>
 @import "/src/css/quasar.variables.scss";
-.text-subtitle3 {
-  font-size: 1.1rem !important;
-  font-weight: 400 !important;
-}
-
 .menu-selected {
   background-color: rgba($primary, 0.1);
   color: $primary;

+ 19 - 16
src/components/login/LoginStepFivePanel.vue

@@ -1,46 +1,49 @@
 <template>
   <q-card-section class="no-padding">
-    <div class="text-text q-mb-sm text-weight-medium">{{ $t('provider.login.steps.step_5.daily_price_title') }}</div>
+    <div class="text-text font12 fontbold q-mb-sm">{{ $t('provider.login.steps.step_5.daily_price_title') }}</div>
     <DefaultCurrencyInput
       v-model="form.daily_price_8h"
       rounded
       no-error-icon
       class="bg-surface q-mb-sm custom-currency-input"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="R$ 0,00"
       :error="!!priceError"
       hide-bottom-space
       label=""
     />
 
-    <div class="text-caption text-center text-grey-7 q-mb-md">{{ $t('provider.login.steps.step_5.daily_price_min_max') }}</div>
+    <div class="text-center text-grey-7 font10 fontmedium q-mb-md">{{ $t('provider.login.steps.step_5.daily_price_min_max') }}</div>
 
     <q-banner class="bg-blue-1 text-primary q-mb-lg q-pa-md bannerRound">
       <template #avatar>
         <q-icon name="mdi-alert-outline" color="primary" />
       </template>
-      <span class="text-weight-bold">{{ $t('provider.login.steps.step_5.dont_worry') }}</span> {{ $t('provider.login.steps.step_5.change_anytime') }}
+      <span class="fontbold font12">{{ $t('provider.login.steps.step_5.dont_worry') }}</span> 
+      <span class="font12 q-ml-xs">
+        {{ $t('provider.login.steps.step_5.change_anytime') }}
+      </span>
     </q-banner>
 
-    <div class="text-text text-center q-mb-sm">{{ $t('provider.login.steps.step_5.shorter_services') }}</div>
+    <div class="text-text text-center font12 fontmedium q-mb-sm">{{ $t('provider.login.steps.step_5.shorter_services') }}</div>
 
     <div class="row q-col-gutter-sm q-mb-lg q-mt-md">
       <div class="col-4">
-        <div class="text-text text-center text-weight-bold">{{ $t('provider.login.steps.step_5.up_to_6h') }}</div>
-        <q-input :model-value="formatCurrency(form.daily_price_6h)" readonly class="bg-surface" input-class="text-text"/>
+        <div class="text-text text-center fontbold font12">{{ $t('provider.login.steps.step_5.up_to_6h') }}</div>
+        <q-input :model-value="formatCurrency(form.daily_price_6h)" readonly class="bg-surface" input-class="text-text font12 fontmedium"/>
       </div>
       <div class="col-4">
-        <div class="text-text text-center text-weight-bold">{{ $t('provider.login.steps.step_5.up_to_4h') }}</div>
-        <q-input :model-value="formatCurrency(form.daily_price_4h)" readonly class="bg-surface" input-class="text-text"/>
+        <div class="text-text text-center fontbold font12">{{ $t('provider.login.steps.step_5.up_to_4h') }}</div>
+        <q-input :model-value="formatCurrency(form.daily_price_4h)" readonly class="bg-surface" input-class="text-text font12 fontmedium"/>
       </div>
       <div class="col-4 column">
-        <div class="text-text text-center text-weight-bold">{{ $t('provider.login.steps.step_5.up_to_2h') }}</div>
-        <q-input :model-value="formatCurrency(form.daily_price_2h)" readonly class="bg-surface" input-class="text-text"/>
+        <div class="text-text text-center fontbold font12">{{ $t('provider.login.steps.step_5.up_to_2h') }}</div>
+        <q-input :model-value="formatCurrency(form.daily_price_2h)" readonly class="bg-surface" input-class="text-text font12 fontmedium"/>
       </div>
     </div>
 
-    <div class="text-text text-weight-medium q-mb-xs text-center">{{ $t('provider.login.steps.step_5.other_services') }}</div>
-    <div class="text-caption text-grey-7 q-mb-md text-center">{{ $t('provider.login.steps.step_5.change_in_profile') }}</div>
+    <div class="text-text q-mb-xs text-center fontbold 12">{{ $t('provider.login.steps.step_5.other_services') }}</div>
+    <div class="text-grey-7 q-mb-md text-center font10">{{ $t('provider.login.steps.step_5.change_in_profile') }}</div>
 
     <div v-if="loadingServiceTypes" class="row justify-center q-mb-lg">
       <q-spinner color="primary" size="28px" />
@@ -52,16 +55,16 @@
           :model-value="selectedServices.includes(service.value)"
           :label="service.label"
           color="primary"
-          class="q-mb-md text-text"
+          class="q-mb-md text-text font12 fontmedium"
           keep-color
           @update:model-value="(checked) => onServiceToggle(service.value, checked)"
         />
       </div>
     </div>
 
-    <div v-else class="text-caption text-grey-7 q-mb-lg">{{ $t('provider.login.steps.step_5.no_services') }}</div>
+    <div v-else class="text-grey-7 q-mb-lg font12 fontmedium">{{ $t('provider.login.steps.step_5.no_services') }}</div>
 
-    <div class="text-caption text-grey-7 text-center">{{ $t('provider.login.steps.step_5.search_visibility') }}</div>
+    <div class="text-grey-7 text-center font12 fontmedium">{{ $t('provider.login.steps.step_5.search_visibility') }}</div>
   </q-card-section>
 </template>
 

+ 9 - 9
src/components/login/LoginStepFourPanel.vue

@@ -20,12 +20,12 @@
             padding="10px 28px"
             @click="subStep = 'selfie_camera'"
           />
-          <div class="text-caption text-grey-6 text-center">{{ t('provider.login.steps.step_4.selfie_hint') }}</div>
+          <div class="text-text text-center font12">{{ t('provider.login.steps.step_4.selfie_hint') }}</div>
         </template>
         <template v-else>
           <div class="row items-center q-gutter-x-xs">
             <q-icon name="check_circle" color="positive" size="18px" />
-            <span class="text-body2 text-weight-bold text-primary">{{ t('provider.login.steps.step_4.selfie_sent') }}</span>
+            <span class="text-primary">{{ t('provider.login.steps.step_4.selfie_sent') }}</span>
           </div>
         </template>
       </div>
@@ -48,12 +48,12 @@
             padding="10px 28px"
             @click="subStep = 'doc_front_camera'"
           />
-          <div class="text-caption text-grey-6 text-center">{{ t('provider.login.steps.step_4.document_hint') }}</div>
+          <div class="text-text text-center font12">{{ t('provider.login.steps.step_4.document_hint') }}</div>
         </template>
         <template v-else>
           <div class="row items-center q-gutter-x-xs">
             <q-icon name="check_circle" color="positive" size="18px" />
-            <span class="text-body2 text-weight-bold text-primary">{{ t('provider.login.steps.step_4.document_sent') }}</span>
+            <span class="text-primary">{{ t('provider.login.steps.step_4.document_sent') }}</span>
           </div>
         </template>
       </div>
@@ -65,7 +65,7 @@
         <div v-if="isCameraState" class="fs-camera">
           <div class="fs-header">
             <q-btn flat dense round icon="chevron_left" color="black" @click="goBack" />
-            <span class="text-weight-bold text-body1">{{ t('common.actions.back') }}</span>
+            <span class="font14">{{ t('common.actions.back') }}</span>
           </div>
           <div class="fs-viewport">
             <video ref="videoRef" autoplay playsinline muted class="fs-video" />
@@ -88,7 +88,7 @@
         <div v-else-if="isPreviewState" class="fs-camera">
           <div class="fs-header">
             <q-btn flat dense round icon="chevron_left" color="black" @click="goBack" />
-            <span class="text-weight-bold text-body1">{{ t('common.actions.back') }}</span>
+            <span class="font14">{{ t('common.actions.back') }}</span>
           </div>
           <div class="fs-viewport">
             <img :src="currentPreview" class="fs-video fs-preview-img" />
@@ -134,11 +134,11 @@
 
           <template v-if="docResult === 'error'">
             <q-icon name="cancel" color="negative" size="28px" class="q-mt-md" />
-            <div class="text-body1 text-weight-bold text-primary text-center q-mt-xs q-px-lg">
+            <div class="text-primary text-center q-mt-xs q-px-lg font14">
               {{ t('provider.login.steps.step_4.error_message') }}
             </div>
           </template>
-          <div v-else class="text-body1 text-weight-bold text-primary text-center q-mt-md q-px-lg">
+          <div v-else class="text-primary text-center q-mt-md q-px-lg font14">
             {{ subStep === 'selfie_result' ? t('provider.login.steps.step_4.selfie_success') : t('provider.login.steps.step_4.document_success') }}
           </div>
 
@@ -153,7 +153,7 @@
             @click="handleResult"
           />
 
-          <div v-if="subStep === 'doc_result' && docResult !== 'error'" class="text-caption text-grey-6 text-center q-mt-sm">
+          <div v-if="subStep === 'doc_result' && docResult !== 'error'" class="text-grey-6 text-center q-mt-sm font12">
             {{ t('provider.login.steps.step_4.document_hint_result') }}
           </div>
         </div>

+ 5 - 5
src/components/login/LoginStepOnePanel.vue

@@ -1,7 +1,7 @@
 <template>
   <q-card-section class="full-width">
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.email') }}</span>
+      <span class="fontbold font12">{{ $t('common.terms.email') }}</span>
     </div>
     <q-input
       v-model="email"
@@ -9,7 +9,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       :placeholder="$t('common.terms.email')"
       hide-bottom-space
       :rules="!phone ? [inputRules.requiredHideMessage, inputRules.email] : [inputRules.email]"
@@ -21,15 +21,15 @@
       <div class="col-5 q-my-auto">
         <q-separator class="q-my-sm bg-grey-4" />
       </div>
-      <span class="col text-center text-text">{{ $t('common.ui.misc.or') }}</span>
+      <span class="col text-center text-text font12 fontmedium">{{ $t('common.ui.misc.or') }}</span>
       <div class="col-5 q-my-auto">
         <q-separator class="q-my-sm bg-grey-4" />
       </div>
     </div>
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.phone') }}</span>
-      <span class="text-weight-light">{{ ' (' + $t('common.terms.celular') + ')' }}</span>
+      <span class="fontbold font12">{{ $t('common.terms.phone') }}</span>
+      <span class="fontlight font12">{{ ' (' + $t('common.terms.celular') + ')' }}</span>
     </div>
     <q-input
       v-model="phone"

+ 19 - 13
src/components/login/LoginStepSixPanel.vue

@@ -1,6 +1,6 @@
 <template>
   <q-card-section class="no-padding">
-    <div class="text-subtitle1 text-center text-weight-bold text-grey-8 q-mb-md">
+    <div class="text-center text-grey-8 q-mb-md font12 fontbold">
       {{ $t('provider.login.steps.step_6.title') }}
     </div>
 
@@ -8,8 +8,13 @@
       <div class="row items-start q-mb-md">
         <q-icon name="mdi-lock-outline" size="20px" color="grey-6" class="q-mr-sm" />
         <div class="col">
-          <div class="text-caption text-weight-bold text-grey-8 line-height-tight">
-            {{ $t('provider.login.steps.step_6.lock_hint') }} <span class="text-weight-regular text-grey-6">{{ $t('provider.login.steps.step_6.lock_description') }}</span>
+          <div class="text-grey-8 line-height-tight font12">
+            <span class="fontbold">
+              {{ $t('provider.login.steps.step_6.lock_hint') }} 
+            </span>
+            <span class="">
+              {{ $t('provider.login.steps.step_6.lock_description') }}
+            </span>
           </div>
         </div>
       </div>
@@ -17,7 +22,7 @@
       <div class="days-grid q-mb-lg">
         <div v-for="day in days" :key="day.value" class="day-column">
           <div
-            class="day-header q-mb-sm text-center"
+            class="day-header font9 fontbold q-mb-sm text-center"
             :class="isDayAvailable(day.value) ? 'gradient-diarista-bg text-white' : 'bg-grey-3 text-grey-6'"
             @click="toggleDay(day.value)"
           >
@@ -30,7 +35,7 @@
             @click="togglePeriod(day.value, 'morning')"
           >
             <q-icon v-if="!isSelected(day.value, 'morning')" name="mdi-lock-outline" size="24px" color="grey-6" class="absolute-center lock-icon" />
-            <span class="period-label">{{ $t('provider.login.steps.step_6.morning') }}</span>
+            <span class="period-label font9">{{ $t('provider.login.steps.step_6.morning') }}</span>
           </div>
 
           <div
@@ -39,12 +44,12 @@
             @click="togglePeriod(day.value, 'afternoon')"
           >
             <q-icon v-if="!isSelected(day.value, 'afternoon')" name="mdi-lock-outline" size="24px" color="grey-6" class="absolute-center lock-icon" />
-            <span class="period-label">{{ $t('provider.login.steps.step_6.afternoon') }}</span>
+            <span class="period-label font9">{{ $t('provider.login.steps.step_6.afternoon') }}</span>
           </div>
         </div>
       </div>
 
-      <div class="text-caption text-grey-6 text-center">
+      <div class="text-grey-6 text-center font9 fontmedium">
         {{ $t('provider.login.steps.step_6.instruction') }}
       </div>
     </q-card>
@@ -53,7 +58,12 @@
       <template #avatar>
         <q-icon name="mdi-alert-outline" color="primary" />
       </template>
-      <span class="text-weight-bold">{{ $t('provider.login.steps.step_6.dont_worry') }}</span> {{ $t('provider.login.steps.step_6.change_anytime') }}
+      <span class="fontbold font12">
+        {{ $t('provider.login.steps.step_6.dont_worry') }}
+      </span>
+      <span class="font12 q-ml-xs">
+        {{ $t('provider.login.steps.step_6.change_anytime') }}
+      </span>
     </q-banner>
   </q-card-section>
 </template>
@@ -132,8 +142,6 @@ onMounted(() => {
 }
 
 .day-header {
-  font-size: 10px;
-  font-weight: bold;
   padding: 2px 0;
   border-radius: 10px;
   cursor: pointer;
@@ -141,7 +149,6 @@ onMounted(() => {
 }
 
 .period-button {
-  font-size: 10px;
   height: 36px;
   width: 36px;
   margin-left: auto;
@@ -163,8 +170,7 @@ onMounted(() => {
 
 .active-morning, .active-afternoon {
   background-color: #00ff7f;
-  color: #004d40;
-  font-weight: bold;
+  color: #000000;
 }
 
 .inactive-period {

+ 18 - 18
src/components/login/LoginStepThreePanel.vue

@@ -1,7 +1,7 @@
 <template>
   <q-card-section class="no-padding">
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('provider.login.steps.step_3.full_name') }}</span>
+      <span class="font12 fontbold">{{ $t('provider.login.steps.step_3.full_name') }}</span>
     </div>
     <q-input
       v-model="form.name"
@@ -9,7 +9,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       :placeholder="$t('provider.login.steps.step_3.full_name')"
       hide-bottom-space
       :rules="[inputRules.required]"
@@ -17,7 +17,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.phone') }}</span>
+      <span class="font12 fontbold">{{ $t('common.terms.phone') }}</span>
     </div>
     <q-input
       v-model="form.phone"
@@ -25,7 +25,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="(00) 00000-0000"
       hide-bottom-space
       :rules="[inputRules.required]"
@@ -34,7 +34,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.email') }}</span>
+      <span class="font12 fontbold">{{ $t('common.terms.email') }}</span>
     </div>
     <q-input
       v-model="form.email"
@@ -42,7 +42,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="nome@email.com"
       hide-bottom-space
       readonly
@@ -52,7 +52,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('provider.login.steps.step_3.rg') }}</span>
+      <span class="font12 fontbold">{{ $t('provider.login.steps.step_3.rg') }}</span>
     </div>
     <q-input
       v-model="form.rg"
@@ -60,7 +60,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="00.000.000-0"
       hide-bottom-space
       :rules="[inputRules.required, validateRG]"
@@ -69,7 +69,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.cpf') }}</span>
+      <span class="font12 fontbold">{{ $t('common.terms.cpf') }}</span>
     </div>
     <q-input
       v-model="form.document"
@@ -77,7 +77,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="000.000.000-00"
       hide-bottom-space
       :rules="[inputRules.required, inputRules.cpf]"
@@ -86,7 +86,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('provider.login.steps.step_3.birth_date') }}</span>
+      <span class="font12 fontbold">{{ $t('provider.login.steps.step_3.birth_date') }}</span>
     </div>
     <q-input
       v-model="form.birth_date"
@@ -94,7 +94,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       :placeholder="$t('provider.login.steps.step_3.birth_date_placeholder')"
       hide-bottom-space
       :rules="[inputRules.required, validateBirthDate]"
@@ -103,7 +103,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.cep') }}</span>
+      <span class="font12 fontbold">{{ $t('common.terms.cep') }}</span>
     </div>
     <q-input
       v-model="form.zip_code"
@@ -111,7 +111,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       placeholder="00000-000"
       hide-bottom-space
       :rules="[inputRules.required, inputRules.cep]"
@@ -122,7 +122,7 @@
     />
 
     <div class="text-text">
-      <span class="text-weight-medium">{{ $t('common.terms.address') }}</span>
+      <span class="font12 fontbold">{{ $t('common.terms.address') }}</span>
     </div>
     <q-input
       v-model="form.address"
@@ -130,7 +130,7 @@
       outlined
       rounded
       class="bg-surface q-mt-sm q-mb-md"
-      input-class="text-text"
+      input-class="text-text font12 fontmedium"
       :placeholder="$t('provider.login.steps.step_3.address_placeholder')"
       hide-bottom-space
       :rules="[inputRules.required]"
@@ -148,7 +148,7 @@
 
     <template v-if="!form.no_complement">
       <div class="text-text">
-        <span class="text-weight-medium">{{ $t('common.terms.complement') }}</span>
+        <span class="font12 fontbold">{{ $t('common.terms.complement') }}</span>
       </div>
       <q-input
         v-model="form.complement"
@@ -156,7 +156,7 @@
         outlined
         rounded
         class="bg-surface q-mt-sm q-mb-md"
-        input-class="text-text"
+        input-class="text-text font12 fontmedium"
         :placeholder="$t('provider.login.steps.step_3.complement_placeholder')"
         hide-bottom-space
         :rules="[inputRules.required]"

+ 3 - 4
src/components/login/LoginStepTwoPanel.vue

@@ -1,7 +1,7 @@
 <template>
   <q-card-section class="no-padding q-mb-xl">
     <div class="text-text q-mb-xs text-left">
-      <span class="text-weight-medium">{{ $t('auth.validation_code') }}</span>
+      <span class="fontmedium">{{ $t('auth.validation_code') }}</span>
     </div>
 
     <div class="code-boxes-wrapper" @click="focusCodeInput">
@@ -12,7 +12,7 @@
         :class="{ 'code-box--active': code.length === i - 1 }"
       >
         <span v-if="code[i - 1]" class="text-text">{{ code[i - 1] }}</span>
-        <span v-else class="text-text-light text-h6">{{ placeholder }}</span>
+        <span v-else class="text-text-light">{{ placeholder }}</span>
       </div>
     </div>
 
@@ -61,8 +61,7 @@ const focusCodeInput = () => {
     display: flex;
     align-items: center;
     justify-content: center;
-    font-size: 1.4rem;
-    font-weight: 600;
+    font-size: 22px;
     color: var(--q-text);
     transition: border-color 0.2s ease;
 

+ 1 - 1
src/components/payments/AntecipacaoConfirmDialog.vue

@@ -6,7 +6,7 @@
       </div>
 
       <q-card-section class="column items-center q-pt-xs q-pb-sm q-px-lg">
-        <div class="text-body1 text-weight-bold text-text text-center">
+        <div class="text-text text-center font16 fontbold">
           {{ $t('provider.payments.anticipation_confirm_title') }}
         </div>
       </q-card-section>

+ 8 - 10
src/components/payments/AntecipacaoDialog.vue

@@ -7,27 +7,27 @@
 
       <q-card-section class="q-pt-xs q-pb-xs q-px-lg">
         <div class="text-center q-mb-xs">
-          <span class="text-body2 text-grey-7">{{ $t('provider.payments.anticipation_available') }}</span>
-          <span class="text-body2 text-weight-bold text-secondary q-ml-xs">{{ formatCurrency(service.total_amount) }}</span>
+          <span class="text-grey-7 font14">{{ $t('provider.payments.anticipation_available') }}</span>
+          <span class="text-secondary font14 fontbold q-ml-xs">{{ formatCurrency(service.total_amount) }}</span>
         </div>
 
         <div class="text-center q-mb-sm">
-          <span class="text-body2 text-grey-7">{{ $t('provider.payments.anticipation_fee_label', { percent: ANTICIPATION_FEE_PERCENT }) }}</span>
-          <span class="text-body2 text-weight-bold text-secondary q-ml-xs">{{ '-' + formatCurrency(fee) }}</span>
+          <span class="text-grey-7 font14">{{ $t('provider.payments.anticipation_fee_label', { percent: ANTICIPATION_FEE_PERCENT }) }}</span>
+          <span class="text-secondary font14 fontbold q-ml-xs">{{ '-' + formatCurrency(fee) }}</span>
         </div>
 
         <q-separator class="q-my-sm" />
 
-        <div class="text-body2 text-grey-7 text-center q-mb-xs">
+        <div class="text-grey-7 text-center font12 q-mb-xs">
           {{ $t('provider.payments.anticipation_total_label') }}
         </div>
-        <div class="anticipation-total gradient-diarista text-center q-mb-md">
+        <div class="anticipation-total font28 fontbold gradient-diarista text-center q-mb-md">
           {{ formatCurrency(totalAfterFee) }}
         </div>
 
         <div class="info-note row items-start q-gutter-x-xs q-mb-sm">
           <q-icon name="mdi-alert-outline" color="primary" size="16px" class="q-mt-xxs" />
-          <span class="text-caption text-grey-7 col">{{ $t('provider.payments.anticipation_note') }}</span>
+          <span class="text-grey-7 font12 col">{{ $t('provider.payments.anticipation_note') }}</span>
         </div>
       </q-card-section>
 
@@ -54,7 +54,7 @@
       </q-card-section>
 
       <q-card-section class="q-pt-xs q-pb-lg q-px-lg">
-        <div class="text-caption text-grey-6 text-center">
+        <div class="text-grey-6 text-center font12">
           <strong>{{ $t('provider.payments.anticipation_remind_label') }}</strong>
           {{ ' ' + $t('provider.payments.anticipation_reminder') }}
         </div>
@@ -91,8 +91,6 @@ const totalAfterFee = computed(() => +(props.service.total_amount - fee.value).t
 }
 
 .anticipation-total {
-  font-size: 28px;
-  font-weight: 700;
   line-height: 1.2;
 }
 

+ 4 - 13
src/components/payments/MovimentacoesDialog.vue

@@ -4,7 +4,7 @@
       <div class="movements-header row items-center bg-white q-px-sm">
         <q-btn flat round dense icon="mdi-arrow-left" color="text" @click="onDialogCancel" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold gradient-diarista">{{ $t('provider.payments.movements_title') }}</span>
+        <span class="gradient-diarista font16 fontbold">{{ $t('provider.payments.movements_title') }}</span>
         <q-space />
         <div style="width: 40px" />
       </div>
@@ -27,10 +27,10 @@
                   <q-icon :name="movIcon(item.type)" size="20px" />
                 </q-avatar>
                 <div class="col column">
-                  <span class="mov-label">{{ movLabel(item) }}</span>
-                  <span class="mov-date">{{ formatMovDate(item.created_at) }}</span>
+                  <span class="font13 fontsemibold text-dark">{{ movLabel(item) }}</span>
+                  <span class="mov-date font11">{{ formatMovDate(item.created_at) }}</span>
                 </div>
-                <span class="mov-value" :class="item.gross_amount >= 0 ? 'text-success' : 'text-error'">
+                <span class="mov-value font14 fontbold" :class="item.gross_amount >= 0 ? 'text-success' : 'text-error'">
                   {{ (item.gross_amount >= 0 ? '+' : '') + formatCurrency(Math.abs(item.gross_amount)) }}
                 </span>
               </div>
@@ -139,21 +139,12 @@ onMounted(() => {
   border-radius: 12px;
 }
 
-.mov-label {
-  font-size: 13px;
-  font-weight: 600;
-  color: #3a3a4a;
-}
-
 .mov-date {
-  font-size: 11px;
   color: #888;
   margin-top: 2px;
 }
 
 .mov-value {
-  font-size: 14px;
-  font-weight: 700;
   white-space: nowrap;
 }
 </style>

+ 3 - 5
src/components/payments/WithdrawConfirmDialog.vue

@@ -7,13 +7,13 @@
 
       <q-card-section class="column items-center q-pt-xs q-pb-sm q-px-lg">
         <q-icon name="mdi-bank-transfer-out" color="secondary" size="42px" class="q-mb-sm" />
-        <div class="text-body1 text-weight-bold text-text text-center q-mb-xs">
+        <div class="text-text text-center font16 fontbold q-mb-xs">
           {{ $t('provider.payments.withdraw_confirm_title') }}
         </div>
-        <div class="withdraw-amount text-secondary text-center">
+        <div class="withdraw-amount font28 fontbold text-secondary text-center">
           {{ formatCurrency(amount) }}
         </div>
-        <div class="text-caption text-grey-6 text-center q-mt-xs">
+        <div class="text-grey-6 text-center font12 q-mt-xs">
           {{ $t('provider.payments.withdraw_confirm_message', { amount: formatCurrency(amount) }) }}
         </div>
       </q-card-section>
@@ -66,8 +66,6 @@ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginC
 }
 
 .withdraw-amount {
-  font-size: 28px;
-  font-weight: 700;
   line-height: 1.2;
 }
 </style>

+ 12 - 13
src/components/profile/ProfileAddressDialog.vue

@@ -4,14 +4,14 @@
       <div class="row items-center q-pa-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.address.title') }}</span>
+        <span class="font16 fontbold gradient-diarista">{{ $t('profile.address.title') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
       <q-card-section class="col q-pa-lg">
         <div class="text-text">
-          <div class="text-h6 text-weight-bold gradient-diarista">{{ $t('profile.address.address_subtitle') }}</div>
-          <div class="text-caption text-grey-7 q-mb-lg">{{ $t('profile.address.address_description') }}</div>
+          <div class="gradient-diarista font16 fontbold">{{ $t('profile.address.address_subtitle') }}</div>
+          <div class="text-grey-7 q-mb-lg font12">{{ $t('profile.address.address_description') }}</div>
  
 
           <q-card class="q-pa-lg bg-white shadow-card" style="border-radius: 25px;" :flat="false">
@@ -28,7 +28,7 @@
               </template>
             </q-input>
 
-            <div class="text-weight-bold text-text q-mb-xs">{{ $t('profile.address.cep') }}</div>
+            <div class="text-text q-mb-xs font14 fontbold">{{ $t('profile.address.cep') }}</div>
             <q-input
               v-model="form.zip_code"
               input-class="text-text"
@@ -45,7 +45,7 @@
               </template>
             </q-input>
 
-            <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.address_label') }}</div>
+            <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.address_label') }}</div>
             <q-input 
               v-model="form.address" 
               outlined 
@@ -57,31 +57,31 @@
 
             <div class="row q-col-gutter-sm q-mb-md">
               <div class="col-4">
-                <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.number') }}</div>
+                <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.number') }}</div>
                 <q-input v-model="form.number" outlined dense input-class="text-text" placeholder="0000"/>
               </div>
               <div class="col-8">
-                <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.complement') }}</div>
+                <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.complement') }}</div>
                 <q-input v-model="form.complement" outlined dense input-class="text-text" :placeholder="$t('profile.address.complement_placeholder')"/>
               </div>
             </div>
 
-            <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.district_label') }}</div>
+            <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.district_label') }}</div>
             <q-input v-model="form.district" outlined dense class="q-mb-md" input-class="text-text"/>
 
             <div class="row q-col-gutter-sm q-mb-lg">
               <div class="col-8">
-                <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.city_label') }}</div>
+                <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.city_label') }}</div>
                 <q-input :model-value="form.city?.name" readonly outlined dense input-class="text-text"/>
               </div>
               <div class="col-4">
-                <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.address.state_label') }}</div>
+                <div class="q-mb-xs text-text font14 fontbold">{{ $t('profile.address.state_label') }}</div>
                 <q-input :model-value="form.state?.name" readonly outlined dense input-class="text-text"/>
               </div>
             </div>
 
             <div v-if="missingCoords" class="q-mb-md">
-              <q-banner rounded dense class="bg-orange-1 text-orange-9 q-mb-sm">
+              <q-banner rounded dense class="bg-orange-1 text-warning q-mb-sm">
                 <template #avatar>
                   <q-icon name="mdi-map-marker-off" color="orange-7" />
                 </template>
@@ -106,9 +106,8 @@
               rounded
               no-caps
               color="primary"
-              class="full-width q-py-md text-weight-bold"
+              class="full-width q-py-md"
               padding="8px 16px"
-              style="font-size: 1.1rem;"
               :label="$t('profile.address.update_address')"
               :loading="saving"
               :disable="!hasUpdatedFields"

+ 4 - 11
src/components/profile/ProfileAvailabilityCalendar.vue

@@ -3,11 +3,11 @@
 
     <div class="avail-cal__nav row items-center justify-between q-px-md q-pt-md q-pb-sm q-gutter-x-sm">
       <q-btn flat round dense icon="mdi-chevron-left" size="sm" color="text" @click="prevMonth" />
-      <span class="avail-cal__nav-label month-label">{{ monthLabel }}</span>
+      <span class="avail-cal__nav-label font16 fontbold month-label">{{ monthLabel }}</span>
       <q-btn flat round dense icon="mdi-chevron-right" size="sm" color="text" @click="nextMonth" />
 
       <q-btn flat round dense icon="mdi-chevron-left" size="xs" color="text" @click="prevYear" />
-      <span class="avail-cal__nav-label year-label">{{ currentYear }}</span>
+      <span class="avail-cal__nav-label font16 fontbold year-label">{{ currentYear }}</span>
       <q-btn flat round dense icon="mdi-chevron-right" size="xs" color="text" @click="nextYear" />
     </div>
 
@@ -15,7 +15,7 @@
       <div
         v-for="wd in weekdayLabels"
         :key="wd"
-        class="avail-cal__weekday col text-center text-weight-bold"
+        class="avail-cal__weekday font11 col text-center"
       >
         {{ wd }}
       </div>
@@ -34,7 +34,7 @@
         class="avail-cal__cell column items-center justify-start"
       >
         <button
-          class="avail-cal__day-btn"
+          class="avail-cal__day-btn font13 fontmedium"
           :class="{
             'avail-cal__day--today': isToday(day),
             'avail-cal__day--past': isPast(day),
@@ -211,18 +211,15 @@ $free-opacity:    0.05;
 }
 
 .avail-cal__nav-label {
-  font-weight: 700;
   color: #1E293B;
 
   &.month-label {
     color: #6366F1;
-    font-size: 15px;
     text-transform: capitalize;
   }
 
   &.year-label {
     color: #6366F1;
-    font-size: 15px;
   }
 }
 
@@ -233,7 +230,6 @@ $free-opacity:    0.05;
 }
 
 .avail-cal__weekday {
-  font-size: 11px;
   color: #6366F1;
   opacity: 0.8;
   padding: 4px 0;
@@ -260,9 +256,6 @@ $free-opacity:    0.05;
   border: none;
   background: transparent;
   border-radius: 50%;
-  font-family: 'Inter', sans-serif;
-  font-size: 13px;
-  font-weight: 500;
   color: #1E293B;
   cursor: pointer;
   display: flex;

+ 23 - 48
src/components/profile/ProfileAvailabilityDialog.vue

@@ -5,7 +5,7 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.availability.title') }}</span>
+        <span class="gradient-diarista font16 fontbold">{{ $t('profile.availability.title') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
@@ -13,10 +13,10 @@
       <div class="col overflow-auto">
         <div class="q-px-md q-pt-lg">
 
-          <div class="text-h6 text-weight-bold gradient-diarista q-mb-xs">
+          <div class="gradient-diarista q-mb-xs font14 fontbold">
             {{ $t('profile.availability.working_days_title') }}
           </div>
-          <div class="text-caption text-text q-mb-md">
+          <div class="text-text q-mb-md font12 fontregular">
             {{ $t('profile.availability.working_days_subtitle') }}
           </div>
 
@@ -25,19 +25,19 @@
           <div flat class="q-mb-lg availability-notice-card">
             <q-card-section class="q-pa-sm row items-start no-wrap q-gutter-x-sm">
               <q-icon name="mdi-lock-outline" color="grey-5" size="20px" class="q-mt-xs" />
-              <div class="text-caption text-text">{{ $t('profile.availability.working_days_hint') }}</div>
+              <div class="text-text font9 fontmedium">{{ $t('profile.availability.working_days_hint') }}</div>
             </q-card-section>
           </div>
             <div class="working-days-grid">
               <div v-for="day in daysOfWeek" :key="day" class="day-column">
                 <div
-                  class="day-label text-center text-weight-bold cursor-pointer q-mb-xs gradient-diarista-bg"
+                  class="day-label font9 fontbold text-center cursor-pointer q-mb-xs gradient-diarista-bg"
                   @click="toggleDay(day)"
                 >
                   {{ $t(`profile.availability.days_short.${day}`) }}
                 </div>
                 <div
-                  class="period-chip text-center cursor-pointer q-mb-xs"
+                  class="period-chip font9 fontbold text-center cursor-pointer q-mb-xs"
                   :class="isSelected(day, 'morning') ? 'chip-active' : 'chip-inactive'"
                   @click.stop="togglePeriod(day, 'morning')"
                 >
@@ -45,7 +45,7 @@
                   <span v-else>{{ $t('profile.availability.morning') }}</span>
                 </div>
                 <div
-                  class="period-chip text-center cursor-pointer"
+                  class="period-chip font9 fontbold text-center cursor-pointer"
                   :class="isSelected(day, 'afternoon') ? 'chip-active' : 'chip-inactive'"
                   @click.stop="togglePeriod(day, 'afternoon')"
                 >
@@ -54,37 +54,21 @@
                 </div>
               </div>
             </div>
-            <div class="text-caption text-text text-center q-px-sm q-pt-md">
+            <div class="text-text text-center q-px-sm q-pt-md font9 fontregular">
               {{ $t('profile.availability.working_days_instructions') }}
             </div>
           </div>
 
 
-          <div class="text-h6 text-weight-bold q-mb-xs q-pt-md">
-            <span class="gradient-diarista">
+          <div class="q-mb-xs q-pt-md">
+            <span class="gradient-diarista font16 fontbold">
               {{ $t('profile.availability.agenda_title') }}
             </span>
           </div>
-          <div class="text-caption text-text q-mb-md">
+          <div class="text-text q-mb-md font12 fontregular">
             {{ $t('profile.availability.agenda_subtitle') }}
           </div>
 
-          <!-- <div class="shadow-card q-mb-xl " style="border-radius: 20px; overflow: hidden;">
-            <q-date
-              ref="calendar"
-              v-model="calendarDate"
-              square
-              class="full-width calendar-custom text-text"
-              :first-day-of-week="0"
-              :events="blockedDatesForCalendar"
-              event-color="negative"
-              minimal
-              @update:model-value="onDateClick"
-              @navigation="onNavigation"
-            >
-            </q-date>
-          </div> -->
-
           <div class="shadow-card q-mb-xl" style="border-radius: 20px; overflow: hidden;">
             <ProfileAvailabilityCalendar
               :blocked-days="blockedDays"
@@ -102,7 +86,7 @@
           <div class="action-sheet-panel bg-white q-pa-lg">
 
             <template v-if="currentDateBlockedDays.length > 0">
-              <div class="text-subtitle2 text-weight-bold text-center text-text text-capitalize q-mb-md">
+              <div class="text-center text-text q-mb-md font14 fontbold">
                 {{ $t('profile.availability.already_blocked_title') }}
               </div>
               <div
@@ -112,10 +96,10 @@
               >
                 <q-icon name="mdi-calendar-remove-outline" color="negative" size="20px" class="q-mr-sm" />
                 <div class="col text-text">
-                  <div class="text-weight-bold">
+                  <div class="font12 fontbold">
                     {{ $t(`profile.availability.period_labels.${bd.period}`) }}
                   </div>
-                  <div class="text-caption text-grey-6">{{ `${bd.init_hour} - ${bd.end_hour}` }}</div>
+                  <div class="text-grey-6 font11">{{ `${bd.init_hour} - ${bd.end_hour}` }}</div>
                 </div>
                 <q-btn
                   rounded
@@ -125,7 +109,6 @@
                   :label="$t('profile.availability.unblock_btn')"
                   :loading="loadingUnblock[bd.id]"
                   class="q-ml-sm"
-                  style="font-size: 11px;"
                   @click="unblockDay(bd)"
                 />
               </div>
@@ -135,8 +118,8 @@
               <div class="row items-center q-py-sm no-wrap">
                 <q-icon name="mdi-information-outline" color="grey-5" size="20px" class="q-mr-sm" />
                 <div class="col">
-                  <div class="text-weight-bold text-text">{{ $t('profile.availability.block_day_title') }}</div>
-                  <div class="text-caption text-grey-6">{{ $t('profile.availability.block_day_description') }}</div>
+                  <div class="text-text font12 fontbold">{{ $t('profile.availability.block_day_title') }}</div>
+                  <div class="text-grey-6 font12">{{ $t('profile.availability.block_day_description') }}</div>
                 </div>
                 <q-btn
                   rounded
@@ -144,8 +127,8 @@
                   unelevated
                   color="secondary"
                   :label="$t('profile.availability.close_agenda_btn')"
-                  class="q-ml-sm"
-                  style="font-size: 11px;"
+                  class="q-ml-sm font10"
+                  padding="4px 12px"
                   @click="openBlockDayConfirm"
                 />
               </div>
@@ -153,8 +136,8 @@
               <div class="row items-center q-py-sm no-wrap">
                 <q-icon name="mdi-information-outline" color="grey-5" size="20px" class="q-mr-sm" />
                 <div class="col">
-                  <div class="text-weight-bold text-text">{{ $t('profile.availability.block_period_title') }}</div>
-                  <div class="text-caption text-grey-6">{{ $t('profile.availability.block_period_description') }}</div>
+                  <div class="text-text font12 fontbold">{{ $t('profile.availability.block_period_title') }}</div>
+                  <div class="text-grey-6 font12">{{ $t('profile.availability.block_period_description') }}</div>
                 </div>
                 <q-btn
                   rounded
@@ -162,8 +145,8 @@
                   unelevated
                   color="secondary"
                   :label="$t('profile.availability.close_agenda_btn')"
-                  class="q-ml-sm"
-                  style="font-size: 11px;"
+                  class="q-ml-sm font10"
+                  padding="4px 12px"
                   @click="openBlockPeriodSelect"
                 />
               </div>
@@ -446,8 +429,6 @@ onMounted(async () => {
 }
 
 .day-label {
-  font-size: 10px;
-  font-weight: bold;
   padding: 2px 0;
   border-radius: 10px;
   cursor: pointer;
@@ -468,7 +449,6 @@ onMounted(async () => {
 }
 
 .period-chip {
-  font-size: 10px;
   height: 36px;
   width: 36px;
   margin-left: auto;
@@ -479,10 +459,9 @@ onMounted(async () => {
   display: flex;
   align-items: center;
   justify-content: center;
-  font-weight: bold;
 
   &.chip-active {
-    background-color: #00ff7f;
+    background-color: #00dd6f;
   }
 
   &.chip-inactive {
@@ -537,14 +516,11 @@ onMounted(async () => {
   }
 
   :deep(.q-date__calendar-days .q-btn__content) {
-    font-family: 'Inter', sans-serif;
-    font-weight: 500;
     color: #1E293B;
   }
 
   :deep(.q-date__calendar-weekdays > div) {
     color: #6366F1;
-    font-weight: 700;
     opacity: 0.8;
   }
 
@@ -560,7 +536,6 @@ onMounted(async () => {
   :deep(.q-date__nav-btn-month),
   :deep(.q-date__nav-btn-year) {
     color: #6366F1 !important;
-    font-weight: 700;
   }
 
   :deep(.q-date__event) {

+ 15 - 13
src/components/profile/ProfileBankDataDialog.vue

@@ -4,30 +4,32 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.bank_data.title') }}</span>
+        <span class="gradient-diarista font16 fontbold">{{ $t('profile.bank_data.title') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
 
       <q-card-section class="col">
         <div class="text-text">
-          <div class="text-h6 text-weight-bold gradient-diarista">{{ $t('profile.bank_data.my_bank_data_title') }}</div>
-          <div class="text-caption text-grey-7 q-mb-md">{{ $t('profile.bank_data.subtitle') }}</div>
+          <div class="gradient-diarista font14 fontbold">{{ $t('profile.bank_data.my_bank_data_title') }}</div>
+          <div class="text-grey-7 q-mb-md font12 fontregular">{{ $t('profile.bank_data.subtitle') }}</div>
 
           <div class="pix-warning q-pa-md q-mb-md row items-start q-col-gutter-sm">
             <q-icon name="mdi-alert-outline" color="warning" size="20px" class="q-mt-xs" />
-            <div class="col text-caption">
-              <span class="text-weight-bold">{{ $t('profile.bank_data.warning_title') }}</span>
+            <div class="col font12">
+              <span class="fontbold">{{ $t('profile.bank_data.warning_title') }}</span>
               {{ $t('profile.bank_data.warning_message') }}
             </div>
           </div>
 
-          <div class="text-subtitle1 text-weight-bold text-center text-text q-mb-sm">
-            {{ $t('profile.bank_data.pix_title') }}
-          </div>
+
 
           <q-card class="q-pa-md bg-white shadow-card q-mb-md" style="border-radius: 20px;" :flat="false">
-            <div class="text-weight-bold q-mb-xs text-text">{{ $t('profile.bank_data.pix_key') }}</div>
+            <div class="text-center text-text q-mb-sm font14 fontbold">
+              <div>
+                {{ $t('profile.bank_data.pix_title') }}
+              </div>
+            </div>
             <q-input
               v-model="pixForm.pix_key"
               outlined
@@ -42,8 +44,8 @@
               rounded
               no-caps
               color="primary"
-              class="full-width text-weight-bold"
-              padding="8px 16px"
+              class="full-width"
+              padding="4px 12px"
               :label="pixAlreadyRegistered ? $t('profile.bank_data.att_pix') : $t('profile.bank_data.save_pix')"
               :loading="savingPix"
               :disable="!hasPixUpdatedFields"
@@ -53,7 +55,7 @@
 
 
           <q-card class="q-pa-md bg-white row shadow-card q-mb-md" style="border-radius: 20px;" :flat="false">
-            <div class="text-subtitle1 text-weight-bold text-center text-text q-mb-sm col-12">
+            <div class="text-center text-text q-mb-sm col-12 font14 fontbold">
               {{ $t('profile.bank_data.bank_account_title') }}
             </div>
             <div class="row q-mb-sm q-my-auto col-12 row items-center">
@@ -108,7 +110,7 @@
               no-caps
               color="primary"
               padding="8px 16px"
-              class="full-width text-weight-bold"
+              class="full-width"
               :label="bankAlreadyRegistered ? $t('profile.bank_data.att_bank') : $t('profile.bank_data.save_account')"
               :loading="savingBank"
               :disable="!hasBankUpdatedFields"

+ 7 - 6
src/components/profile/ProfileBlockDayDialog.vue

@@ -2,11 +2,11 @@
   <q-dialog ref="dialogRef">
     <q-card class="block-confirm-card shadow-card" style="border-radius: 20px; min-width: 280px;">
       <q-card-section class="text-white text-center q-pa-lg">
-        <div class="text-h6 text-weight-bold q-mb-sm">{{ title }}</div>
-        <div class="text-caption q-mb-md">{{ subtitle }}</div>
-        <div v-if="dateLabel" class="text-subtitle1 text-weight-bold">{{ dateLabel }}</div>
+        <div class="q-mb-sm font16 fontbold">{{ title }}</div>
+        <div class="q-mb-md font12 fontmedium">{{ subtitle }}</div>
+        <div v-if="dateLabel" class="font14 fontbold">{{ dateLabel }}</div>
         
-        <div v-if="isPeriod" class="row justify-center q-gutter-lg q-mt-md">
+        <div v-if="isPeriod" class="row justify-center q-gutter-lg q-mt-md font12 fontbold">
           <q-radio
             v-model="selectedPeriod"
             val="morning"
@@ -31,8 +31,9 @@
           rounded
           no-caps
           unelevated
-          class="full-width q-mx-lg text-weight-bold"
-          style="background-color: #ff70ff; color: white; height: 50px; border-radius: 15px;"
+          class="full-width q-mx-lg font14"
+          padding="4px 12px"
+          style="background-color: #ff70ff; border-radius: 15px;"
           :label="$t('profile.availability.block_btn')"
           :loading="loading"
           :disable="isPeriod && !selectedPeriod"

+ 9 - 17
src/components/profile/ProfileHelpDialog.vue

@@ -5,7 +5,7 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.help.title') }}</span>
+        <span class="text-primary font16 fontbold gradient-diarista">{{ $t('profile.help.title') }}</span>
         <q-space />
         <q-btn
           v-if="store.messages.length > 1"
@@ -25,15 +25,15 @@
         <div class="support-banner row no-wrap">
           <div class="col-8 q-pa-md">
             <div class="row items-center q-mb-xs q-gutter-x-sm">
-              <span class="text-h6 text-white text-weight-bold">{{ $t('profile.help.support_title') }}</span>
+              <span class="text-white font16 fontbold">{{ $t('profile.help.support_title') }}</span>
             </div>
             <div class="row items-center q-gutter-x-xs q-mb-md">
               <q-icon name="mdi-circle" color="green-4" size="10px" />
-              <span class="text-caption text-white">{{ $t('profile.help.online_status') }}</span>
+              <span class="text-white font14 fontmedium">{{ $t('profile.help.online_status') }}</span>
             </div>
             <div class="row items-center q-gutter-x-sm">
               <q-icon name="mdi-robot-outline" color="white" size="18px" />
-              <span class="text-caption text-white">{{ $t('profile.help.ai_assistant_label') }}</span>
+              <span class="text-white font14 fontmedium">{{ $t('profile.help.ai_assistant_label') }}</span>
             </div>
           </div>
           <div class="col-4 flex items-end">
@@ -62,8 +62,8 @@
               class="bubble q-pa-sm"
               :class="msg.role === 'user' ? 'bubble-user' : 'bubble-bot'"
             >
-              <p class="q-mb-xs bubble-text">{{ msg.text }}</p>
-              <span class="bubble-time">{{ msg.time }}</span>
+              <p class="q-mb-xs bubble-text font14">{{ msg.text }}</p>
+              <span class="bubble-time font10">{{ msg.time }}</span>
             </div>
           </div>
 
@@ -76,14 +76,14 @@
           </div>
 
           <div v-if="store.messages.length === 1" class="q-pt-sm">
-            <div class="col-12 text-caption text-grey-6 q-mb-sm">{{ $t('profile.help.quick_suggestions') }}</div>
+            <div class="col-12 text-grey-6 q-mb-sm">{{ $t('profile.help.quick_suggestions') }}</div>
             <div
               v-for="suggestion in suggestions"
               :key="suggestion"
               class="row col-12 q-py-xs"
               @click="sendMessage(suggestion)"
             >
-              <span class="text-text bg-surface suggestion-btn q-py-sm q-px-md cursor-pointer">{{ suggestion }}</span>
+              <span class="text-text bg-surface suggestion-btn font12 fontregular q-py-sm q-px-md cursor-pointer">{{ suggestion }}</span>
             </div>
           </div>
 
@@ -113,7 +113,7 @@
             @click="sendMessage()"
           />
         </div>
-        <div class="footer-disclaimer text-text text-center q-my-md">
+        <div class="footer-disclaimer font9 fontregular text-text text-center q-my-md">
           {{ $t('profile.help.footer_disclaimer') }}
         </div>
       </div>
@@ -231,7 +231,6 @@ onMounted(() => {
 }
 
 .bubble-text {
-  font-size: 14px;
   line-height: 1.45;
   color: #2c2c2c;
   margin: 0 0 4px 0;
@@ -239,7 +238,6 @@ onMounted(() => {
 }
 
 .bubble-time {
-  font-size: 10px;
   color: #aaa;
   display: block;
   text-align: right;
@@ -267,10 +265,7 @@ onMounted(() => {
 
 .suggestion-btn {
   border-radius: 32px;
-  font-size: 12px;
   border: 1.15px solid #d8d7d7ce;
-  font-family: Inter;
-  font-weight: 400;
   line-height: 16px;
   transition: background 0.2s;
 
@@ -328,9 +323,6 @@ onMounted(() => {
 }
 
 .footer-disclaimer {
-  font-family: Inter;
-  font-weight: 400;
-  font-size: 12px;
   line-height: 15px;
   text-align: center;
 }

+ 11 - 20
src/components/profile/ProfilePrivacyDialog.vue

@@ -5,7 +5,7 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.privacy.title') }}</span>
+        <span class="text-primary font16 fontbold gradient-diarista">{{ $t('profile.privacy.title') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
@@ -21,17 +21,17 @@
           fit="contain"
           class="q-mb-lg"
         />
-        <p class="text-text text-center text-weight-bold q-mb-xs" style="font-size: 15px;">
+        <p class="text-primary text-center q-mb-xs fontbold" style="font-size: 24px">
           {{ $t('profile.privacy.empty_message') }}
         </p>
-        <p class="text-grey-6 text-center q-mb-xl" style="font-size: 13px;">
+        <p class="text-grey-6 text-center q-mb-xl font12 fontregular">
           {{ $t('profile.privacy.empty_sub') }}
         </p>
       </div>
 
       <div v-else class="col overflow-auto q-pb-xl">
         <div class="q-px-md q-mt-md">
-          <p class="text-weight-bold text-primary q-mb-md blocked-title">
+          <p class="text-primary q-mb-md font16 fontbold gradient-diarista">
             {{ $t('profile.privacy.blocked_title') }}
           </p>
 
@@ -41,28 +41,28 @@
             class="block-item row items-center no-wrap q-mb-md"
           >
             <q-avatar size="48px" class="flex-shrink-0 q-mr-sm">
+              <img v-if="block.client_photo" :src="block.client_photo" style="object-fit: cover;" />
               <span
+                v-else
                 :style="avatarStyle(block)"
-                class="text-weight-bold full-width full-height flex flex-center"
-                style="font-size: 16px; border-radius: 50%;"
+                class="full-width full-height flex flex-center"
+                style="border-radius: 50%;"
               >
                 {{ block.client_name?.slice(0, 2).toUpperCase() ?? '??' }}
               </span>
             </q-avatar>
 
             <div class="col column no-wrap overflow-hidden">
-              <span class="text-weight-bold text-text" style="font-size: 14px; line-height: 1.3;">
+              <span class="text-text font12 fontmedium" style="line-height: 1.3;">
                 {{ block.client_name }}
               </span>
               <div v-if="block.client_rating" class="row items-center q-mt-xs">
-                <q-icon name="mdi-star" color="amber" size="13px" class="q-mr-xs" />
-                <span class="text-grey-7" style="font-size: 12px;">{{ Number(block.client_rating).toFixed(1) }}</span>
+                <q-icon name="mdi-star" color="amber" size="12px" class="q-mr-xs" />
+                <span class="text-grey-7 font9 fontregular">{{ Number(block.client_rating).toFixed(1) }}</span>
               </div>
             </div>
 
             <q-btn
-              outline
-              no-caps
               rounded
               color="primary"
               size="sm"
@@ -132,20 +132,11 @@ onMounted(async () => {
   box-shadow: 0px 1px 8px rgba(0, 0, 0, 0.1);
 }
 
-.blocked-title {
-  font-size: 18px;
-}
-
 .block-item {
-  background: white;
-  border-radius: 12px;
   padding: 12px;
-  box-shadow: 0 1px 6px rgba(0,0,0,0.07);
 }
 
 .unblock-btn {
-  font-size: 12px;
-  font-weight: 600;
   padding: 4px 14px;
 }
 

+ 16 - 14
src/components/profile/ProfileServiceDataDialog.vue

@@ -4,7 +4,7 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile bg-surface">
         <q-btn v-close-popup icon="mdi-chevron-left" flat round dense color="primary" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.service_data.title') }}</span>
+        <span class="gradient-diarista font16 fontbold">{{ $t('profile.service_data.title') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
@@ -16,7 +16,7 @@
           </div>
 
           <div class="q-mb-lg">
-            <div class="text-weight-medium text-text q-mb-sm">
+            <div class="text-text q-mb-sm font12 fontbold">
               {{ $t('profile.service_data.price_8h_label') }}
             </div>
 
@@ -30,17 +30,17 @@
               label=""
             />
 
-            <div class="text-caption text-grey-6 text-center q-mb-lg">
+            <div class="text-text text-center q-mb-lg font10 fontmedium">
               {{ $t('profile.service_data.price_min_max') }}
             </div>
 
-            <div class="text-text text-center q-mb-sm">
+            <div class="text-text text-center q-mb-sm font12 fontmedium">
               {{ $t('profile.service_data.shorter_services') }}
             </div>
 
             <div class="row q-col-gutter-sm q-mb-sm">
               <div class="col-4">
-                <div class="text-caption text-weight-bold text-text text-center q-mb-xs">
+                <div class="text-text text-center q-mb-xs font11 fontbold">
                   {{ $t('profile.service_data.up_to_6h') }}
                 </div>
                 <q-input
@@ -53,7 +53,7 @@
                 />
               </div>
               <div class="col-4">
-                <div class="text-caption text-weight-bold text-text text-center q-mb-xs">
+                <div class="text-text text-center q-mb-xs font11 fontbold">
                   {{ $t('profile.service_data.up_to_4h') }}
                 </div>
                 <q-input
@@ -66,7 +66,7 @@
                 />
               </div>
               <div class="col-4">
-                <div class="text-caption text-weight-bold text-text text-center q-mb-xs">
+                <div class="text-text text-center q-mb-xs font11 fontbold">
                   {{ $t('profile.service_data.up_to_2h') }}
                 </div>
                 <q-input
@@ -81,9 +81,11 @@
             </div>
           </div>
 
-          <div class="text-caption text-weight-bold text-text text-center">
-            {{ $t('profile.service_data.services_subtitle') }}
-            <div class="text-caption text-text q-mb-md text-center">
+          <div class="text-text text-center font12">
+            <span class="fontbold">
+              {{ $t('profile.service_data.services_subtitle') }}
+            </span>
+            <div class="text-text q-mb-md text-center font12">
               {{ $t('profile.service_data.change_in_profile') }}
             </div>
             <div class="q-mb-lg">
@@ -105,11 +107,11 @@
                 </div>
               </div>
 
-              <div v-else class="text-caption text-grey-7 text-center q-py-md">
+              <div v-else class="text-grey-7 text-center q-py-md font12">
                 {{ $t('profile.service_data.no_services') }}
               </div>
 
-              <div class="text-caption text-grey-6 text-center q-mt-md">
+              <div class="text-grey-6 text-center q-mt-md font12">
                 {{ $t('profile.service_data.services_hint') }}
               </div>
             </div>
@@ -121,8 +123,8 @@
             rounded
             no-caps
             color="primary"
-            padding="8px 16px"
-            class="full-width q-py-md text-weight-bold"
+            padding="4px 12px"
+            class="full-width q-py-md"
             :label="$t('common.actions.update')"
             :loading="saving"
             :disable="!!priceError || saving"

+ 1 - 3
src/components/shared/LocationMapDialog.vue

@@ -13,7 +13,7 @@
       />
 
       <div class="location-map-bottom-card">
-        <p class="location-map-address-label">{{ $t('common.terms.address') }}</p>
+        <p class="location-map-address-label font14 fontbold">{{ $t('common.terms.address') }}</p>
         <q-input
           :model-value="currentAddress"
           outlined
@@ -194,8 +194,6 @@ onUnmounted(async () => {
 }
 
 .location-map-address-label {
-  font-size: 14px;
-  font-weight: 600;
   color: var(--q-text);
   margin: 0 0 8px;
 }

+ 48 - 4
src/css/app.scss

@@ -136,11 +136,55 @@ box-shadow: 1px 4px 4px 0px rgba(0,0,0,0.2);
 -moz-box-shadow: 1px 4px 4px 0px rgba(0,0,0,0.2);
 }
 
-.section-title {
-  font-size: 18px;
+.shadow-profile {
+  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.05);
+}
+
+.font8 {
+  font-size: 8px;
+}
+
+.font9 {
+  font-size: 9px;
+}
+
+.font10 {
+  font-size: 10px;
+}
+
+.font12 {
+  font-size: 12px;
+}
+
+.font14 {
+  font-size: 14px;
+}
+
+.font16 {
+  font-size: 16px;
+}
+
+.fontbold {
   font-weight: 700;
 }
 
-.shadow-profile {
-  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.05);
+.fontmedium {
+  font-weight: 500;
+}
+
+.fontregular {
+  font-weight: 400;
+}
+
+.fontlight {
+  font-weight: 300;
+}
+
+// ─── Layout utilities ──────────────────────────────────────────────────────────
+.card-border { border-radius: 18px; }
+
+.dashboard-section-title { line-height: 1.05; }
+
+.section-title {
+  line-height: 1.05;
 }

+ 183 - 214
src/i18n/locales/en.json

@@ -136,6 +136,16 @@
       "created_by": "Created by"
     }
   },
+  "nav": {
+    "home": "Home",
+    "payments": "Payments",
+    "agenda": "Agenda",
+    "profile": "Profile"
+  },
+  "notifications": {
+    "title": "Notifications",
+    "unread": "Unread:"
+  },
   "auth": {
     "validation_code": "Validation code",
     "login": "Login",
@@ -143,8 +153,8 @@
     "logout": "Logout",
     "forgot_password": "Forgot my password",
     "confirm_password": "Confirm password",
-    "geocoding_failed_short": "Location not found",
-    "geocoding_failed": "Could not get the address for this location.",
+    "geocoding_failed_short": "Find address",
+    "geocoding_failed": "Could not detect address. Adjust the pin manually.",
     "confirm_location": "Confirm location"
   },
   "provider": {
@@ -159,7 +169,7 @@
         "step_3": {
           "full_name": "Full Name",
           "birth_date": "Date of birth",
-          "birth_date_placeholder": "dd/mm/yyyy",
+          "birth_date_placeholder": "mm/dd/yyyy",
           "no_complement": "Address without complement",
           "complement_placeholder": "Ex: Apartment, Suite, House.",
           "address_placeholder": "Street, Number, Neighborhood, City - ST",
@@ -177,25 +187,25 @@
           "selfie_desc": "Take a selfie holding your document near your face.",
           "photo_captured": "Photo captured!",
           "action": "send documents",
-          "upload_all_photos": "Upload all photos to continue.",
-          "btn_selfie": "take a selfie",
-          "selfie_hint": "Choose a well-lit environment",
-          "selfie_sent": "Photo sent.",
-          "btn_document": "take a photo of the document",
-          "document_hint": "ID with CPF, front and back.",
-          "document_sent": "Document sent.",
-          "btn_capture_selfie": "take photo",
-          "btn_capture_front": "take photo of the front",
-          "btn_capture_back": "take photo of the back",
-          "btn_retake": "take another photo",
-          "btn_confirm": "confirm",
-          "btn_use_photo": "use this photo",
-          "btn_retry": "take the photo",
-          "btn_continue": "continue",
-          "error_message": "Oops, something went wrong! Take a new photo of your document.",
-          "selfie_success": "Your photo was sent successfully!",
-          "document_success": "Your document was sent successfully!",
-          "document_hint_result": "ID with CPF, front and back."
+          "btn_selfie": "Take selfie",
+          "selfie_hint": "Hold your document close to your face",
+          "selfie_sent": "Selfie sent!",
+          "btn_document": "Photograph document",
+          "document_hint": "Front and back of document",
+          "document_sent": "Document sent!",
+          "btn_retake": "Retake photo",
+          "btn_confirm": "Use this selfie",
+          "btn_use_photo": "Use this photo",
+          "error_message": "Could not process the image. Please try again.",
+          "selfie_success": "Selfie sent successfully!",
+          "document_success": "Document sent successfully!",
+          "btn_retry": "Try again",
+          "btn_continue": "Continue",
+          "document_hint_result": "Continue to send the back of the document",
+          "btn_capture_selfie": "Capture selfie",
+          "btn_capture_front": "Capture front",
+          "btn_capture_back": "Capture back",
+          "upload_all_photos": "Attach all the necessary photos!"
         },
         "step_5": {
           "daily_price_title": "What is the value of your daily rate for up to 8 hours?",
@@ -224,22 +234,73 @@
           "select_at_least_one": "Select at least one work period.",
           "action": "finish registration"
         }
-      },
-      "pending_approval": {
-        "title": "Registration submitted!",
-        "description": "Your registration is awaiting approval. Once reviewed, you will be able to access the app."
       }
     },
+    "payments": {
+      "anticipation_available": "Available for anticipation:",
+      "anticipation_fee_label": "Anticipation fee ({percent}%):",
+      "anticipation_total_label": "You will receive",
+      "anticipation_note": "The amount will be credited to your registered bank account.",
+      "anticipation_btn_close": "Close",
+      "anticipation_btn_anticipate": "Anticipate",
+      "anticipation_remind_label": "Remember:",
+      "anticipation_reminder": "The anticipation is processed within 2 business days.",
+      "anticipation_confirm_title": "Confirm anticipation?",
+      "anticipation_confirm_cancel": "Cancel",
+      "anticipation_confirm_ok": "Confirm",
+      "withdraw_confirm_title": "Confirm withdrawal?",
+      "withdraw_confirm_message": "You are about to withdraw {amount}.",
+      "movements_title": "Movements",
+      "mov_servico": "Service",
+      "mov_saque": "Withdrawal",
+      "title": "Payments",
+      "total_earnings_title": "Total earnings",
+      "total_earnings_count": "{count} services completed",
+      "total_earnings_days": "Last {days} days",
+      "available_balance_label": "Available balance",
+      "btn_withdraw": "Withdraw",
+      "available_balance_prefix": "Available for withdrawal via",
+      "available_balance_highlight": "PIX or bank account",
+      "pending_balance_label": "Balance to be released",
+      "pending_balance_desc": "Awaiting payment confirmation",
+      "services_title": "Completed services",
+      "btn_view_movements": "View movements",
+      "services_date_service": "Service:",
+      "services_date_payment": "Payment:",
+      "default_client_name": "Client",
+      "pay_status_pending": "Pending",
+      "pay_status_paid": "Paid",
+      "pay_status_authorized": "Authorized",
+      "pay_status_processing": "Processing",
+      "pay_status_failed": "Failed",
+      "pay_status_cancelled": "Cancelled",
+      "period_week": "Week",
+      "period_month": "Month",
+      "period_year": "Year"
+    },
     "dashboard": {
       "summary": {
         "welcome": "Hello,",
         "my_schedules": "My schedules"
       },
       "price_suggest": {
+        "region_label": "Suggested daily rate in the region",
         "region_label_1": "Suggested daily rate",
         "region_label_2": "in the region",
         "my_price_label": "My daily rate"
       },
+      "today_services": {
+        "finished_label": "Service with",
+        "finished_suffix": "completed!",
+        "start_label": "Service with",
+        "code_hint": "Enter the client's code",
+        "in_progress": "In progress",
+        "reviewed_badge": "Reviewed",
+        "rate_btn": "Rate",
+        "help": "help",
+        "end_time_label": "Ends at:",
+        "code_error": "Invalid code. Please try again."
+      },
       "solicitations": {
         "title": "Requests for you",
         "until_8h": "Full day (up to 8h)",
@@ -248,80 +309,57 @@
         "until_2h": "Quick (up to 2h)",
         "offers_meal": "Offers meal",
         "not_offers_meal": "Does not offer meal",
-        "distance_prefix": "At",
-        "distance_suffix": "km from your registered address.",
-        "via_agenda_text": "Request made via",
-        "via_agenda": "schedule",
-        "same_day_warning_label": "Note:",
-        "same_day_warning": "When receiving more than one request for the same day, check the time and distance to plan your travel time.",
-        "confirm_accept": "Are you sure you want to accept this service?",
-        "confirm_reject": "Are you sure you want to refuse this service?",
+        "distance_prefix": "The client is",
+        "distance_suffix": "from you",
+        "via_agenda_text": "Request via",
+        "via_agenda": "agenda",
+        "same_day_warning_before": "Notice: ",
+        "same_day_warning_bold": "When receiving more than one request for the same day, check the schedule and distance",
+        "same_day_warning_after": " to plan your travel time.",
+        "confirm_accept": "Request accepted!",
+        "confirm_reject": "Request declined",
         "tip_label": "Tip:",
-        "reject_tip": "If you are not available, access your profile and block the days you do not want to receive requests."
-      },
-      "today_services": {
-        "start_label": "Service start for",
-        "finished_label": "Service by",
-        "finished_suffix": "completed",
-        "code_hint": "Ask the client for the code to begin",
-        "code_hint1": "Ask the client for ",
-        "code_hint2": "the code to begin",
-        "code_placeholder": "0000",
-        "code_success": "Code verified successfully!",
-        "code_error": "Invalid code. Please try again.",
-        "step_accepted": "Accepted",
-        "step_paid": "Paid",
-        "step_started": "Started",
-        "step_finished": "Finished",
-        "in_progress": "Service in progress!",
-        "end_time_label": "Service ends at",
-        "rate_btn": "Rate",
-        "help": "help",
-        "reviewed_badge": "reviewed!"
-      },
-      "schedule_rating": {
-        "title": "How was the service by",
-        "positive_label": "What did you like most?",
-        "negative_label": "What could be improved?",
-        "comment_placeholder": "Would you like to leave a comment?",
-        "block_label": "Stop receiving requests from this client",
-        "add_photo": "Add photo",
-        "submit_btn": "submit review",
-        "help_link": "Help",
-        "already_reviewed": "You have already reviewed this service.",
-        "reviewed_badge": "reviewed!"
+        "reject_tip": "Declining requests frequently may reduce your visibility."
       },
       "opportunities": {
         "title": "Opportunities",
-        "banner_text": "Client requests for Diária professionals. Check the request details, apply for the service and if the client accepts, you will receive a new job.",
-        "full_day": "Full day (up to 8h)",
+        "banner_text": "Client requests for Diária professionals. View the order details, apply for the service, and if the client accepts, you will receive a notification.",
+        "empty": "No opportunities available at the moment.",
+        "distance_km": "{distance} km from you",
         "details": "View details",
-        "empty": "No opportunities found",
-        "distance_km": "{distance} km",
-        "client_default": "Client",
-        "address_not_found": "Address not available",
-        "currency": "$ {value}"
+        "currency": "R$ {value}"
       },
       "opportunity_details": {
         "title": "Service details",
-        "client_default": "Client",
-        "price_label": "Full day (up to 8h)",
-        "distance_text": "It is {distance} away from your registered address.",
-        "distance_default": "0 km",
-        "sob_medida": "Request made",
-        "sob_medida_highlight": "custom",
+        "distance_text": "{distance} km from you",
+        "sob_medida": "Custom service",
+        "sob_medida_highlight": "tailored",
         "para": "for",
-        "info_title": "Service information",
-        "description_not_found": "No description provided",
-        "address_not_found": "Address not provided",
-        "hour_not_found": "Time not provided",
-        "button_accept": "accept job",
-        "alert_text": "If your request is accepted by the client, you will receive a notification confirming the booking.",
-        "offers_meal": "On-site meal"
+        "offers_meal": "Offers meal",
+        "info_title": "Additional information",
+        "button_accept": "I want to attend",
+        "alert_text": "If your request is accepted by the client, you will receive a notification and it will appear in your upcoming services."
       },
       "opportunities_dialog": {
-        "message": "If your request is accepted by the client, you will receive a confirmation notification and it will appear in your upcoming services.",
-        "close": "close"
+        "message": "If your request is accepted by the client, you will receive a confirmation and it will appear in your upcoming services.",
+        "close": "Close"
+      },
+      "agenda": {
+        "title": "Agenda",
+        "upcoming_title": "Upcoming services",
+        "completed_title": "Completed services",
+        "type_custom": "Opportunity",
+        "type_default": "Scheduled",
+        "btn_view_details": "View details",
+        "btn_rate": "Rate",
+        "empty_upcoming": "No scheduled services",
+        "empty_completed": "No completed services",
+        "status_pending": "Pending",
+        "status_accepted": "Accepted",
+        "status_paid": "Paid",
+        "status_started": "In progress",
+        "status_finished": "Completed",
+        "status_cancelled": "Cancelled"
       },
       "favorites": {
         "title": "Your favorites",
@@ -342,100 +380,49 @@
         "no_meal": "Does not offer meal",
         "place_home": "Residential",
         "place_apartment": "Apartment",
+        "place_commercial": "Commercial",
         "place_unknown": "Address",
-        "address_copied": "Address copied to clipboard",
-        "copy_address": "copy address",
+        "copy_address": "Copy address",
+        "address_copied": "Address copied!",
         "btn_cancel_service": "Cancel service",
         "btn_need_help": "I need help"
       },
-      "last_schedules": {
-        "title": "Last ones performed",
-        "reschedule": "Reschedule"
-      },
       "cancel_schedule": {
-        "title": "Are you sure you want to cancel your order?",
-        "reason_label": "What is the reason for cancellation?",
-        "reason_placeholder": "Describe the reason...",
-        "warning_title": "Attention!",
-        "warning_free": "Free cancellations up to 12 hours before the scheduled time.",
-        "warning_fee": "Cancellations after this period result in a 50% refund as compensation for the professional.",
-        "btn_cancel": "Go back",
+        "title": "Are you sure you want to cancel your booking?",
+        "reason_label": "Reason for cancellation",
+        "reason_placeholder": "Describe the reason for cancellation...",
+        "warning_before": "Canceling already scheduled services ",
+        "warning_bold": "may lead to a temporary or even permanent block",
+        "warning_after": " of your profile in the app.",
+        "btn_cancel": "Back",
         "btn_keep": "Cancel the service",
+        "service_fee": "Service fee",
+        "total": "Total to receive:",
+        "close": "Close",
         "btn_cancel_order": "Cancel order",
-        "help": "Help",
-        "schedule_details_title": "Details",
-        "service_fee": "Service fee:",
-        "total": "Total:",
-        "close": "close"
+        "help": "I need help"
+      },
+      "schedule_rating": {
+        "title": "How did you like working with",
+        "negative_label": "What could have been better?",
+        "positive_label": "What did you like most?",
+        "comment_placeholder": "Leave a comment (optional)",
+        "add_photo": "Add photo",
+        "block_label": "I don't want to receive this client again",
+        "submit_btn": "Submit review",
+        "help_link": "I had an issue with this service",
+        "already_reviewed": "You have already reviewed this service"
+      },
+      "last_schedules": {
+        "title": "Last ones performed",
+        "reschedule": "Reschedule"
       },
       "providers_close": {
         "title": "Close to you",
         "until_8h": "Up to 8h",
         "place_home": "Residential",
         "schedule": "Schedule"
-      },
-      "agenda": {
-        "title": "Agenda",
-        "upcoming_title": "Upcoming services",
-        "completed_title": "Completed services",
-        "type_default": "Appointment",
-        "type_custom": "Custom",
-        "status_pending": "Pending",
-        "status_accepted": "Confirmed",
-        "status_paid": "Confirmed",
-        "status_started": "In progress",
-        "status_finished": "Completed",
-        "status_cancelled": "Cancelled",
-        "btn_view_details": "view details",
-        "btn_rate": "rate",
-        "btn_reschedule": "reschedule",
-        "empty_upcoming": "No scheduled services",
-        "empty_completed": "No completed services"
       }
-    },
-    "payments": {
-      "title": "Payments",
-      "total_earnings_title": "View total earnings",
-      "total_earnings_count": "{count} services completed",
-      "total_earnings_days": "Referring to the last {days} days",
-      "period_week": "week",
-      "period_month": "month",
-      "period_year": "year",
-      "available_balance_label": "Available balance",
-      "available_balance_prefix": "Values are available for withdrawal within",
-      "available_balance_highlight": "5 days after service completion.",
-      "btn_withdraw": "withdraw",
-      "pending_balance_label": "Balance to be released",
-      "pending_balance_desc": "Amount from services awaiting release.",
-      "pending_balance_empty": "No pending payments.",
-      "services_title": "Services",
-      "btn_view_movements": "view movements",
-      "services_date_service": "Service date:",
-      "services_date_payment": "Payment date:",
-      "pay_status_pending": "Pending",
-      "pay_status_paid": "Paid",
-      "pay_status_anticipated": "Anticipated payment",
-      "pay_status_cancelled": "Cancelled service",
-      "btn_anticipate": "anticipate",
-      "movements_title": "Movements",
-      "mov_tarifa": "Platform fee",
-      "mov_saque": "Withdrawal",
-      "mov_servico": "Service",
-      "mov_service_code": "Service code: {id}",
-      "anticipation_available": "Total available:",
-      "anticipation_fee_label": "Anticipation fee ({percent}%)*:",
-      "anticipation_total_label": "Total to be paid using anticipation:",
-      "anticipation_note": "*The anticipation fee is charged by the payment system. The Diária app has no participation in this operation.",
-      "anticipation_remind_label": "Remember:",
-      "anticipation_reminder": "You can wait for the expected payment date for this service and avoid the fee charged by anticipation.",
-      "anticipation_btn_close": "close",
-      "anticipation_btn_anticipate": "anticipate",
-      "anticipation_confirm_title": "Are you sure you want to anticipate this payment?",
-      "anticipation_confirm_cancel": "cancel",
-      "anticipation_confirm_ok": "confirm",
-      "default_client_name": "Client",
-      "withdraw_confirm_title": "Confirm withdrawal",
-      "withdraw_confirm_message": "Do you want to withdraw {amount} to your account?"
     }
   },
   "business": {
@@ -459,10 +446,6 @@
     "placeholder_name": "Enter your name",
     "placeholder_email": "Enter your e-mail",
     "placeholder_phone": "Enter your phone",
-    "language": "Language",
-    "lang_pt": "PT-br",
-    "lang_en": "EN-us",
-    "lang_es": "ES-es",
     "bank_data": {
       "title": "Bank data",
       "description": "Pix, agency and account",
@@ -474,6 +457,8 @@
       "pix_key": "Pix key",
       "pix_key_placeholder": "Enter your pix key",
       "pix_key_required": "Please enter your pix key",
+      "att_pix": "Update pix",
+      "att_bank": "Update account",
       "save_pix": "register pix",
       "pix_saved": "Pix key saved successfully!",
       "bank_account_title": "Agency and account",
@@ -486,9 +471,7 @@
       "bank_fields_required": "Please enter agency and account",
       "save_account": "register account",
       "account_saved": "Bank account saved successfully!",
-      "save_error": "Error saving. Please try again.",
-      "att_pix": "Update pix",
-      "att_bank": "Update bank account"
+      "save_error": "Error saving. Please try again."
     },
     "availability": {
       "title": "Availability",
@@ -549,7 +532,7 @@
       "services_subtitle": "In addition to basic cleaning, what other services do you also provide?",
       "services_hint": "This information will appear to those searching your profile.",
       "no_services": "No services available at the moment.",
-      "change_in_profile": "(you can change it in your profile)"
+      "change_in_profile": "(can be changed in profile)"
     },
     "address": {
       "title": "Address",
@@ -567,42 +550,40 @@
       "state_label": "State",
       "update_address": "Change address",
       "search_placeholder": "Search",
-      "missing_coords": "Coordinates not found for this address.",
+      "missing_coords": "Address without location. Set the pin on the map.",
       "update_on_map": "Update on map"
     },
     "help": {
       "title": "Help",
       "description": "Questions and support",
-      "support_title": "Support",
-      "online_status": "Online",
+      "support_title": "Diarista Support",
+      "online_status": "Online now",
       "ai_assistant_label": "AI Assistant",
-      "virtual_assistant": "Virtual Assistant",
-      "greeting_message": "Hi! 👋 I'm the Diária virtual assistant. How can I help you today?",
       "quick_suggestions": "Quick suggestions:",
-      "suggestion_cancel": "How to cancel a service?",
-      "suggestion_data": "Change registration data",
-      "suggestion_payment": "Questions about payment",
-      "suggestion_human": "Talk to an agent",
-      "contact_title": "Contact us",
-      "contact_subtitle": "Choose your preferred support channel.",
-      "channel_whatsapp": "WhatsApp",
-      "channel_whatsapp_desc": "Quick support via WhatsApp",
-      "channel_email": "E-mail",
-      "channel_email_desc": "Send your question by e-mail",
-      "channel_phone": "Phone",
-      "channel_phone_desc": "Talk directly with our team",
       "message_placeholder": "Type your message...",
-      "footer_disclaimer": "⚡ Automatic AI responses • Human support available",
-      "coming_soon": "Coming soon",
-      "error_message": "Could not process your message. Please try again."
+      "footer_disclaimer": "Responses are generated by artificial intelligence.",
+      "suggestion_cancel": "How do I cancel a service?",
+      "suggestion_data": "How do I update my data?",
+      "suggestion_payment": "When do I receive my payment?",
+      "suggestion_human": "I want to talk to a human",
+      "error_message": "An error occurred. Please try again.",
+      "greeting_message": "Hello! How can I help you today?"
+    },
+    "privacy": {
+      "title": "Privacy",
+      "description": "Blocked clients",
+      "empty_message": "No blocked clients",
+      "empty_sub": "Clients you block will appear here.",
+      "blocked_title": "Blocked clients",
+      "unblock_btn": "Unblock"
     },
     "privacy_policy": {
-      "title": "Privacy Policy",
-      "description": "How we handle your data"
+      "title": "Privacy policy",
+      "description": "Terms and conditions of use"
     },
     "support_page": {
-      "title": "Support Center",
-      "description": "Usage guide and tutorials"
+      "title": "Support page",
+      "description": "Help center and customer service"
     },
     "logout": {
       "title": "Logout",
@@ -800,17 +781,5 @@
         }
       }
     }
-  },
-  "address": {
-    "types": {
-      "home": "Residential",
-      "commercial": "Commercial"
-    }
-  },
-  "nav": {
-    "home": "Home",
-    "payments": "Payments",
-    "agenda": "Schedule",
-    "profile": "Profile"
   }
-}
+}

+ 185 - 214
src/i18n/locales/es.json

@@ -136,6 +136,16 @@
       "created_by": "Creado por"
     }
   },
+  "nav": {
+    "home": "Inicio",
+    "payments": "Pagos",
+    "agenda": "Agenda",
+    "profile": "Perfil"
+  },
+  "notifications": {
+    "title": "Notificaciones",
+    "unread": "No leídas:"
+  },
   "auth": {
     "validation_code": "Código de validación",
     "login": "Ingresar",
@@ -143,8 +153,8 @@
     "logout": "Cerrar sesión",
     "forgot_password": "Olvidé mi contraseña",
     "confirm_password": "Confirmar contraseña",
-    "geocoding_failed_short": "Ubicación no encontrada",
-    "geocoding_failed": "No se pudo obtener la dirección para esta ubicación.",
+    "geocoding_failed_short": "Buscar dirección",
+    "geocoding_failed": "No se pudo detectar la dirección. Ajuste el pin manualmente.",
     "confirm_location": "Confirmar ubicación"
   },
   "provider": {
@@ -177,25 +187,25 @@
           "selfie_desc": "Tome una selfie sosteniendo su documento cerca de su rostro.",
           "photo_captured": "¡Foto capturada!",
           "action": "enviar documentos",
-          "upload_all_photos": "Suba todas las fotos para continuar.",
-          "btn_selfie": "tomar una selfie",
-          "selfie_hint": "Elija un ambiente bien iluminado",
-          "selfie_sent": "Foto enviada.",
-          "btn_document": "tomar foto del documento",
-          "document_hint": "RG con CPF, frente y dorso.",
-          "document_sent": "Documento enviado.",
-          "btn_capture_selfie": "tomar foto",
-          "btn_capture_front": "tomar foto del frente",
-          "btn_capture_back": "tomar foto del dorso",
-          "btn_retake": "tomar otra foto",
-          "btn_confirm": "confirmar",
-          "btn_use_photo": "usar esta foto",
-          "btn_retry": "tomar la foto",
-          "btn_continue": "continuar",
-          "error_message": "¡Ups, algo salió mal! Tome una nueva foto de su documento.",
-          "selfie_success": "¡Su foto fue enviada con éxito!",
-          "document_success": "¡Su documento fue enviado con éxito!",
-          "document_hint_result": "RG con CPF, frente y dorso."
+          "btn_selfie": "Tomar selfie",
+          "selfie_hint": "Sostenga el documento cerca de su rostro",
+          "selfie_sent": "¡Selfie enviada!",
+          "btn_document": "Fotografiar documento",
+          "document_hint": "Frente y dorso del documento",
+          "document_sent": "¡Documento enviado!",
+          "btn_retake": "Retomar foto",
+          "btn_confirm": "Usar esta selfie",
+          "btn_use_photo": "Usar esta foto",
+          "error_message": "No se pudo procesar la imagen. Inténtelo de nuevo.",
+          "selfie_success": "¡Selfie enviada con éxito!",
+          "document_success": "¡Documento enviado con éxito!",
+          "btn_retry": "Intentar de nuevo",
+          "btn_continue": "Continuar",
+          "document_hint_result": "Continúe para enviar el dorso del documento",
+          "btn_capture_selfie": "Capturar selfie",
+          "btn_capture_front": "Capturar frente",
+          "btn_capture_back": "Capturar dorso",
+          "upload_all_photos": "¡Adjunta todas las fotos necesarias!"
         },
         "step_5": {
           "daily_price_title": "¿Cuál es el valor de su jornada de hasta 8 horas?",
@@ -224,22 +234,73 @@
           "select_at_least_one": "Seleccione al menos un período de trabajo.",
           "action": "finalizar registro"
         }
-      },
-      "pending_approval": {
-        "title": "¡Registro enviado!",
-        "description": "Su registro está pendiente de aprobación. Una vez revisado, podrá acceder a la aplicación."
       }
     },
+    "payments": {
+      "anticipation_available": "Disponible para anticipación:",
+      "anticipation_fee_label": "Tarifa de anticipación ({percent}%):",
+      "anticipation_total_label": "Recibirás",
+      "anticipation_note": "El monto se acreditará en su cuenta bancaria registrada.",
+      "anticipation_btn_close": "Cerrar",
+      "anticipation_btn_anticipate": "Anticipar",
+      "anticipation_remind_label": "Recuerde:",
+      "anticipation_reminder": "La anticipación se procesa en hasta 2 días hábiles.",
+      "anticipation_confirm_title": "¿Confirmar anticipación?",
+      "anticipation_confirm_cancel": "Cancelar",
+      "anticipation_confirm_ok": "Confirmar",
+      "withdraw_confirm_title": "¿Confirmar retiro?",
+      "withdraw_confirm_message": "Está a punto de retirar {amount}.",
+      "movements_title": "Movimientos",
+      "mov_servico": "Servicio",
+      "mov_saque": "Retiro",
+      "title": "Pagos",
+      "total_earnings_title": "Total ganado",
+      "total_earnings_count": "{count} servicios realizados",
+      "total_earnings_days": "Últimos {days} días",
+      "available_balance_label": "Saldo disponible",
+      "btn_withdraw": "Retirar",
+      "available_balance_prefix": "Disponible para retiro vía",
+      "available_balance_highlight": "PIX o cuenta bancaria",
+      "pending_balance_label": "Saldo por liberar",
+      "pending_balance_desc": "En espera de confirmación de pago",
+      "services_title": "Servicios realizados",
+      "btn_view_movements": "Ver movimientos",
+      "services_date_service": "Servicio:",
+      "services_date_payment": "Pago:",
+      "default_client_name": "Cliente",
+      "pay_status_pending": "Pendiente",
+      "pay_status_paid": "Pagado",
+      "pay_status_authorized": "Autorizado",
+      "pay_status_processing": "Procesando",
+      "pay_status_failed": "Fallido",
+      "pay_status_cancelled": "Cancelado",
+      "period_week": "Semana",
+      "period_month": "Mes",
+      "period_year": "Año"
+    },
     "dashboard": {
       "summary": {
         "welcome": "Hola,",
         "my_schedules": "Mis citas"
       },
       "price_suggest": {
-        "region_label_1": "Precio de jornada",
-        "region_label_2": "sugerido en la región",
+        "region_label": "Precio de jornada sugerido en la región",
+        "region_label_1": "Precio de jornada sugerido",
+        "region_label_2": "en la región",
         "my_price_label": "Precio de mi jornada"
       },
+      "today_services": {
+        "finished_label": "Servicio con",
+        "finished_suffix": "¡completado!",
+        "start_label": "Servicio con",
+        "code_hint": "Ingrese el código del cliente",
+        "in_progress": "En progreso",
+        "reviewed_badge": "Evaluado",
+        "rate_btn": "Evaluar",
+        "help": "ayuda",
+        "end_time_label": "Termina a las:",
+        "code_error": "Código inválido. Inténtelo de nuevo."
+      },
       "solicitations": {
         "title": "Solicitudes para ti",
         "until_8h": "Integral (hasta 8h)",
@@ -248,78 +309,57 @@
         "until_2h": "Jornada Rápida (Hasta 2h)",
         "offers_meal": "Ofrece comida",
         "not_offers_meal": "No ofrece comida",
-        "distance_prefix": "A",
-        "distance_suffix": "km de su dirección registrada.",
-        "via_agenda_text": "Pedido hecho vía",
+        "distance_prefix": "El cliente está a",
+        "distance_suffix": "de ti",
+        "via_agenda_text": "Solicitud vía",
         "via_agenda": "agenda",
-        "same_day_warning_label": "Aviso:",
-        "same_day_warning": "Al recibir más de una solicitud para el mismo día, verifique el horario y la distancia para planificar su tiempo de desplazamiento.",
-        "confirm_accept": "¿Está seguro de que desea aceptar este servicio?",
-        "confirm_reject": "¿Está seguro de que desea rechazar este servicio?",
+        "same_day_warning_before": "Aviso: ",
+        "same_day_warning_bold": "Al recibir más de una solicitud para el mismo día, verifique el horario y la distancia",
+        "same_day_warning_after": " para planificar su tiempo de desplazamiento.",
+        "confirm_accept": "¡Solicitud aceptada!",
+        "confirm_reject": "Solicitud rechazada",
         "tip_label": "Consejo:",
-        "reject_tip": "Si no tienes disponibilidad, accede a tu perfil y cierra los días en que no deseas recibir solicitudes."
-      },
-      "today_services": {
-        "start_label": "Inicio del servicio para",
-        "code_hint": "Solicite al cliente el código para comenzar",
-        "code_hint1": "Solicite al cliente el ",
-        "code_hint2": "código para comenzar",
-        "code_placeholder": "0000",
-        "code_success": "¡Código verificado con éxito!",
-        "code_error": "Código inválido. Inténtalo de nuevo.",
-        "step_accepted": "Aceptado",
-        "step_paid": "Pagado",
-        "step_started": "Iniciado",
-        "step_finished": "Concluido",
-        "in_progress": "Servicio en progreso!",
-        "end_time_label": "Término del servicio en",
-        "rate_btn": "Evaluar",
-        "help": "ayuda",
-        "reviewed_badge": "¡evaluado!"
-      },
-      "schedule_rating": {
-        "title": "¿Cómo fue el servicio de",
-        "positive_label": "¿Qué te gustó más?",
-        "negative_label": "¿Qué podría mejorar?",
-        "comment_placeholder": "¿Deseas dejar un comentario?",
-        "block_label": "No recibir más pedidos de este cliente",
-        "add_photo": "Agregar foto",
-        "submit_btn": "enviar evaluación",
-        "help_link": "Ayuda",
-        "already_reviewed": "Ya evaluaste este servicio.",
-        "reviewed_badge": "¡evaluado!"
+        "reject_tip": "Rechazar solicitudes con frecuencia puede reducir su visibilidad."
       },
       "opportunities": {
         "title": "Oportunidades",
-        "banner_text": "Solicitudes de clientes para los profesionales de Diária. Consulta los detalles del pedido, postúlate al servicio y si el cliente te acepta recibirás una nueva jornada.",
-        "full_day": "Jornada completa (hasta 8h)",
+        "banner_text": "Pedidos de clientes para os profissionais do Diária. Veja os detalhes do pedido, se candidate ao serviço e se o cliente aceitar, você receberá um aviso.",
+        "empty": "No hay oportunidades disponibles en este momento.",
+        "distance_km": "{distance} km de ti",
         "details": "Ver detalles",
-        "empty": "No se encontraron oportunidades",
-        "distance_km": "{distance} km",
-        "client_default": "Cliente",
-        "address_not_found": "Dirección no informada",
         "currency": "R$ {value}"
       },
       "opportunity_details": {
         "title": "Detalles del servicio",
-        "client_default": "Cliente",
-        "price_label": "Jornada completa (hasta 8h)",
-        "distance_text": "Está a {distance} de distancia de su dirección registrada.",
-        "distance_default": "0 km",
-        "sob_medida": "Solicitud hecha",
-        "sob_medida_highlight": "a medida",
+        "distance_text": "{distance} km de ti",
+        "sob_medida": "Servicio",
+        "sob_medida_highlight": "personalizado",
         "para": "para",
-        "info_title": "Información del servicio",
-        "description_not_found": "Sin descripción proporcionada",
-        "address_not_found": "Dirección no informada",
-        "hour_not_found": "Horario no informado",
-        "button_accept": "quiero atender",
-        "alert_text": "Si el cliente acepta tu solicitud, recibirás una notificación confirmando el servicio.",
-        "offers_meal": "Comida en el lugar"
+        "offers_meal": "Ofrece comida",
+        "info_title": "Información adicional",
+        "button_accept": "Quiero atender",
+        "alert_text": "Se su solicitud es aceptada por el cliente, recibirá un aviso y aparecerá en sus próximos servicios."
       },
       "opportunities_dialog": {
-        "message": "Si su solicitud es aceptada por el cliente, recibirá una notificación de confirmación y aparecerá en sus próximos servicios.",
-        "close": "cerrar"
+        "message": "Si su solicitud es aceptada por el cliente, recibirá una confirmación y aparecerá en sus próximos servicios.",
+        "close": "Cerrar"
+      },
+      "agenda": {
+        "title": "Agenda",
+        "upcoming_title": "Próximos servicios",
+        "completed_title": "Servicios realizados",
+        "type_custom": "Oportunidad",
+        "type_default": "Agendado",
+        "btn_view_details": "Ver detalles",
+        "btn_rate": "Evaluar",
+        "empty_upcoming": "Ningún servicio agendado",
+        "empty_completed": "Ningún servicio realizado",
+        "status_pending": "Pendiente",
+        "status_accepted": "Aceptado",
+        "status_paid": "Pagado",
+        "status_started": "En progreso",
+        "status_finished": "Completado",
+        "status_cancelled": "Cancelado"
       },
       "favorites": {
         "title": "Tus favoritos",
@@ -340,100 +380,49 @@
         "no_meal": "No ofrece comida",
         "place_home": "Residencial",
         "place_apartment": "Apartamento",
+        "place_commercial": "Comercial",
         "place_unknown": "Dirección",
-        "address_copied": "Dirección copiada al portapapeles",
-        "copy_address": "copiar dirección",
+        "copy_address": "Copiar dirección",
+        "address_copied": "¡Dirección copiada!",
         "btn_cancel_service": "Cancelar servicio",
-        "btn_need_help": "Preciso de ayuda"
+        "btn_need_help": "Necesito ayuda"
+      },
+      "cancel_schedule": {
+        "title": "¿Está seguro de que desea cancelar su cita?",
+        "reason_label": "Motivo de cancelación",
+        "reason_placeholder": "Describa el motivo de la cancelación...",
+        "warning_before": "Cancelar servicios ya agendados ",
+        "warning_bold": "puede ocasionar el bloqueo temporal o incluso permanente",
+        "warning_after": " de su perfil en la aplicación.",
+        "btn_cancel": "Cancelar el servicio",
+        "btn_keep": "Volver",
+        "service_fee": "Tarifa de servicio",
+        "total": "Total a recibir:",
+        "close": "Cerrar",
+        "btn_cancel_order": "Cancelar pedido",
+        "help": "Necesito ayuda"
+      },
+      "schedule_rating": {
+        "title": "¿Cómo te pareció trabajar con",
+        "negative_label": "¿Qué podría haber sido mejor?",
+        "positive_label": "¿Qué fue lo que más te gustó?",
+        "comment_placeholder": "Deja un comentario (opcional)",
+        "add_photo": "Añadir foto",
+        "block_label": "No quiero recibir a este cliente nuevamente",
+        "submit_btn": "Enviar evaluación",
+        "help_link": "Tuve un problema con este servicio",
+        "already_reviewed": "Ya evaluaste este servicio"
       },
       "last_schedules": {
         "title": "Últimas realizadas",
         "reschedule": "Reprogramar"
       },
-      "cancel_schedule": {
-        "title": "¿Estás seguro de que deseas cancelar tu pedido?",
-        "reason_label": "¿Cuál es el motivo de la cancelación?",
-        "reason_placeholder": "Describe el motivo...",
-        "warning_title": "¡Atención!",
-        "warning_free": "Cancelaciones gratuitas hasta 12 horas antes del horario programado.",
-        "warning_fee": "Las cancelaciones después de este período generan un reembolso del 50% como compensación al profesional.",
-        "btn_cancel": "Volver",
-        "btn_keep": "Cancelar el servicio",
-        "btn_cancel_order": "Cancelar pedido",
-        "help": "Ayuda",
-        "schedule_details_title": "Detalles",
-        "service_fee": "Tarifa de servicio:",
-        "total": "Total:",
-        "close": "cerrar"
-      },
       "providers_close": {
         "title": "Cerca de ti",
         "until_8h": "Hasta 8h",
         "place_home": "Residencial",
         "schedule": "Agendar"
-      },
-      "agenda": {
-        "title": "Agenda",
-        "upcoming_title": "Próximos servicios",
-        "completed_title": "Servicios completados",
-        "type_default": "Agendamiento",
-        "type_custom": "A medida",
-        "status_pending": "Pendiente",
-        "status_accepted": "Confirmado",
-        "status_paid": "Confirmado",
-        "status_started": "En progreso",
-        "status_finished": "Completado",
-        "status_cancelled": "Cancelado",
-        "btn_view_details": "ver detalles",
-        "btn_rate": "evaluar",
-        "btn_reschedule": "reprogramar",
-        "empty_upcoming": "Sin servicios programados",
-        "empty_completed": "Sin servicios completados"
       }
-    },
-    "payments": {
-      "title": "Pagos",
-      "total_earnings_title": "Ver ganancias totales",
-      "total_earnings_count": "{count} servicios realizados",
-      "total_earnings_days": "Referente a los últimos {days} días",
-      "period_week": "semana",
-      "period_month": "mes",
-      "period_year": "año",
-      "available_balance_label": "Saldo disponible",
-      "available_balance_prefix": "Los valores están disponibles para retiro en hasta",
-      "available_balance_highlight": "5 días después de la conclusión del servicio.",
-      "btn_withdraw": "retirar",
-      "pending_balance_label": "Saldo a liberar",
-      "pending_balance_desc": "Monto de servicios esperando liberación.",
-      "pending_balance_empty": "Ningún pago pendiente.",
-      "services_title": "Servicios",
-      "btn_view_movements": "ver movimientos",
-      "services_date_service": "Fecha del servicio:",
-      "services_date_payment": "Fecha de pago:",
-      "pay_status_pending": "Pendiente",
-      "pay_status_paid": "Pagado",
-      "pay_status_anticipated": "Pago anticipado",
-      "pay_status_cancelled": "Servicio cancelado",
-      "btn_anticipate": "anticipar",
-      "movements_title": "Movimientos",
-      "mov_tarifa": "Tarifa de plataforma",
-      "mov_saque": "Retiro",
-      "mov_servico": "Servicio",
-      "mov_service_code": "Cód. del servicio: {id}",
-      "anticipation_available": "Total disponible:",
-      "anticipation_fee_label": "Tasa de anticipación ({percent}%)*:",
-      "anticipation_total_label": "Total a pagar usando la anticipación:",
-      "anticipation_note": "*La tasa de anticipación es cobrada por el sistema de pago. La aplicación Diária no participa en esta operación.",
-      "anticipation_remind_label": "Recuerda:",
-      "anticipation_reminder": "Puede esperar la fecha de pago prevista para este servicio y evitar la tarifa cobrada por la anticipación.",
-      "anticipation_btn_close": "cerrar",
-      "anticipation_btn_anticipate": "anticipar",
-      "anticipation_confirm_title": "¿Está seguro de que desea anticipar este pago?",
-      "anticipation_confirm_cancel": "cancelar",
-      "anticipation_confirm_ok": "confirmar",
-      "default_client_name": "Cliente",
-      "withdraw_confirm_title": "Confirmar retiro",
-      "withdraw_confirm_message": "¿Desea retirar {amount} a su cuenta?"
     }
   },
   "business": {
@@ -457,10 +446,6 @@
     "placeholder_name": "Escriba su nombre",
     "placeholder_email": "Escriba su correo electrónico",
     "placeholder_phone": "Escriba su teléfono",
-    "language": "Idioma",
-    "lang_pt": "PT-br",
-    "lang_en": "EN-us",
-    "lang_es": "ES-es",
     "bank_data": {
       "title": "Datos bancarios",
       "description": "Pix, agencia y cuenta",
@@ -472,6 +457,8 @@
       "pix_key": "Clave pix",
       "pix_key_placeholder": "Ingrese su clave pix",
       "pix_key_required": "Por favor ingrese su clave pix",
+      "att_pix": "Actualizar pix",
+      "att_bank": "Actualizar cuenta",
       "save_pix": "registrar pix",
       "pix_saved": "¡Clave pix guardada con éxito!",
       "bank_account_title": "Agencia y cuenta",
@@ -484,9 +471,7 @@
       "bank_fields_required": "Por favor ingrese agencia y cuenta",
       "save_account": "registrar cuenta",
       "account_saved": "¡Cuenta bancaria guardada con éxito!",
-      "save_error": "Error al guardar. Inténtelo de nuevo.",
-      "att_pix": "Actualizar pix",
-      "att_bank": "Actualizar cuenta bancaria"
+      "save_error": "Error al guardar. Inténtelo de nuevo."
     },
     "availability": {
       "title": "Disponibilidad",
@@ -547,7 +532,7 @@
       "services_subtitle": "Además de la limpieza básica, ¿qué otros servicios también realizas?",
       "services_hint": "Esta información aparecerá para quienes busquen tu perfil.",
       "no_services": "No hay servicios disponibles por el momento.",
-      "change_in_profile": "(podrás cambiarlo en tu perfil)"
+      "change_in_profile": "(puede ser cambiado en el perfil)"
     },
     "address": {
       "title": "Dirección",
@@ -565,42 +550,40 @@
       "state_label": "Estado/Provincia",
       "update_address": "Cambiar dirección",
       "search_placeholder": "Buscar",
-      "missing_coords": "Coordenadas no encontradas para esta dirección.",
+      "missing_coords": "Dirección sin ubicación. Defina el punto en el mapa.",
       "update_on_map": "Actualizar en el mapa"
     },
     "help": {
       "title": "Ayuda",
       "description": "Dudas y soporte",
-      "support_title": "Soporte",
-      "online_status": "En línea",
-      "ai_assistant_label": "Asistente con IA",
-      "virtual_assistant": "Asistente Virtual",
-      "greeting_message": "¡Hola! 👋 Soy el asistente virtual de Diária. ¿Cómo puedo ayudarte hoy?",
+      "support_title": "Soporte Diarista",
+      "online_status": "En línea ahora",
+      "ai_assistant_label": "Asistente IA",
       "quick_suggestions": "Sugerencias rápidas:",
-      "suggestion_cancel": "¿Cómo cancelar un servicio?",
-      "suggestion_data": "Cambiar datos de registro",
-      "suggestion_payment": "Dudas sobre el pago",
-      "suggestion_human": "Hablar con un agente",
-      "contact_title": "Contáctenos",
-      "contact_subtitle": "Elige tu canal de atención preferido.",
-      "channel_whatsapp": "WhatsApp",
-      "channel_whatsapp_desc": "Atención rápida por WhatsApp",
-      "channel_email": "Correo electrónico",
-      "channel_email_desc": "Envía tu duda por correo electrónico",
-      "channel_phone": "Teléfono",
-      "channel_phone_desc": "Habla directamente con nuestro equipo",
-      "message_placeholder": "Escribe tu mensaje...",
-      "footer_disclaimer": "⚡ Respuestas automáticas por IA • Atención humana disponible",
-      "coming_soon": "Próximamente disponible",
-      "error_message": "No se pudo procesar tu mensaje. Inténtalo de nuevo."
+      "message_placeholder": "Escriba su mensaje...",
+      "footer_disclaimer": "Las respuestas son generadas por inteligencia artificial.",
+      "suggestion_cancel": "¿Cómo cancelo un servicio?",
+      "suggestion_data": "¿Cómo actualizo mis datos?",
+      "suggestion_payment": "¿Cuándo recibo mi pago?",
+      "suggestion_human": "Quiero hablar con un humano",
+      "error_message": "Ocurrió un error. Inténtelo de nuevo.",
+      "greeting_message": "¡Hola! ¿En qué puedo ayudarte hoy?"
+    },
+    "privacy": {
+      "title": "Privacidad",
+      "description": "Clientes bloqueados",
+      "empty_message": "Ningún cliente bloqueado",
+      "empty_sub": "Los clientes que bloquee aparecerán aquí.",
+      "blocked_title": "Clientes bloqueados",
+      "unblock_btn": "Desbloquear"
     },
     "privacy_policy": {
-      "title": "Política de Privacidad",
-      "description": "Cómo tratamos tus datos"
+      "title": "Política de privacidad",
+      "description": "Términos y condiciones de uso"
     },
     "support_page": {
-      "title": "Centro de Soporte",
-      "description": "Guía de uso y tutoriales"
+      "title": "Página de soporte",
+      "description": "Centro de ayuda y atención al cliente"
     },
     "logout": {
       "title": "Salir",
@@ -798,17 +781,5 @@
         }
       }
     }
-  },
-  "address": {
-    "types": {
-      "home": "Residencial",
-      "commercial": "Comercial"
-    }
-  },
-  "nav": {
-    "home": "Inicio",
-    "payments": "Pagos",
-    "agenda": "Agenda",
-    "profile": "Perfil"
   }
-}
+}

+ 205 - 252
src/i18n/locales/pt.json

@@ -136,6 +136,16 @@
       "created_by": "Criado por"
     }
   },
+  "nav": {
+    "home": "Início",
+    "payments": "Pagamentos",
+    "agenda": "Agenda",
+    "profile": "Perfil"
+  },
+  "notifications": {
+    "title": "Notificações",
+    "unread": "Não lidas:"
+  },
   "auth": {
     "validation_code": "Código de validação",
     "login": "Entrar",
@@ -143,8 +153,8 @@
     "logout": "Sair",
     "forgot_password": "Esqueci minha senha",
     "confirm_password": "Confirmar senha",
-    "geocoding_failed_short": "Localização não encontrada",
-    "geocoding_failed": "Não foi possível obter o endereço para esta localização.",
+    "geocoding_failed_short": "Buscar endereço",
+    "geocoding_failed": "Não foi possível detectar o endereço. Ajuste o pin manualmente.",
     "confirm_location": "Confirmar localização"
   },
   "provider": {
@@ -169,77 +179,128 @@
           "rg": "RG"
         },
         "step_4": {
-          "document_front": "Lado 1 (Frente)",
-          "document_front_desc": "Foto da frente do seu documento (RG ou CNH).",
-          "document_back": "Lado 2 (Verso)",
-          "document_back_desc": "Foto do verso do seu documento (RG ou CNH).",
-          "selfie": "Selfie com documento",
-          "selfie_desc": "Tire uma selfie segurando o seu documento próximo ao rosto.",
-          "photo_captured": "Foto capturada!",
-          "action": "enviar documentos",
-          "upload_all_photos": "Faça upload de todas as fotos para continuar.",
-          "btn_selfie": "tirar uma selfie",
-          "selfie_hint": "Escolha um ambiente iluminado",
-          "selfie_sent": "Foto enviada.",
-          "btn_document": "tirar foto do documento",
-          "document_hint": "RG com CPF, frente e verso.",
-          "document_sent": "Documento enviado.",
-          "btn_capture_selfie": "tirar foto",
-          "btn_capture_front": "tirar foto da frente",
-          "btn_capture_back": "tirar foto do verso",
-          "btn_retake": "tirar outra foto",
-          "btn_confirm": "confirmar",
-          "btn_use_photo": "usar esta foto",
-          "btn_retry": "tirar a foto",
-          "btn_continue": "continuar",
-          "error_message": "Ops, algo deu errado! Tire uma nova foto do seu documento.",
-          "selfie_success": "Sua foto foi enviada com sucesso!",
-          "document_success": "Seu documento foi enviado com sucesso!",
-          "document_hint_result": "RG com CPF, frente e verso."
+            "document_front": "Lado 1 (Frente)",
+            "document_front_desc": "Foto da frente do seu documento (RG ou CNH).",
+            "document_back": "Lado 2 (Verso)",
+            "document_back_desc": "Foto do verso do seu documento (RG ou CNH).",
+            "selfie": "Selfie com documento",
+            "selfie_desc": "Tire uma selfie segurando o seu documento próximo ao rosto.",
+            "photo_captured": "Foto capturada!",
+            "action": "enviar documentos",
+            "btn_selfie": "Tirar selfie",
+            "selfie_hint": "Escolha um ambiente iluminado",
+            "selfie_sent": "Selfie enviada!",
+            "btn_document": "Fotografar documento",
+            "document_hint": "RG com CPF, frente e verso",
+            "document_sent": "Documento enviado!",
+            "btn_retake": "Tirar outra foto",
+            "btn_confirm": "Usar esta selfie",
+            "btn_use_photo": "Usar esta foto",
+            "error_message": "Não foi possível processar a imagem. Tente novamente.",
+            "selfie_success": "Selfie enviada com sucesso!",
+            "document_success": "Documento enviado com sucesso!",
+            "btn_retry": "Tentar novamente",
+            "btn_continue": "Continuar",
+            "document_hint_result": "Continue para enviar o verso do documento",
+            "btn_capture_selfie": "Tirar selfie",
+            "btn_capture_front": "Fotografar frente",
+            "btn_capture_back": "Fotografar verso",
+            "upload_all_photos": "Anexe todas as fotos necessárias!"
         },
         "step_5": {
-          "daily_price_title": "Qual valor da sua diária de até 8 horas?",
-          "daily_price_min_max": "Valor mínimo R$ 100,00. Valor máximo R$ 500,00.",
-          "dont_worry": "Não se preocupe!",
-          "change_anytime": "Você pode alterar o valor da sua diária quando quiser ;)",
-          "shorter_services": "Baseado no valor acima, os valores de serviços mais curtos serão:",
-          "up_to_6h": "até 6 horas",
-          "up_to_4h": "até 4 horas",
-          "up_to_2h": "até 2 horas",
-          "other_services": "Além da limpeza básica, quais serviços você também realiza?",
-          "change_in_profile": "(poderá ser alterado no perfil)",
-          "no_services": "Nenhum tipo de serviço disponível no momento.",
-          "search_visibility": "Essas informações aparecerão para quem buscar o seu perfil na busca.",
-          "action": "continuar"
+            "daily_price_title": "Qual valor da sua diária de até 8 horas?",
+            "daily_price_min_max": "Valor mínimo R$ 100,00. Valor máximo R$ 500,00.",
+            "dont_worry": "Não se preocupe!",
+            "change_anytime": "Você pode alterar o valor da sua diária quando quiser ;)",
+            "shorter_services": "Baseado no valor acima, os valores de serviços mais curtos serão:",
+            "up_to_6h": "até 6 horas",
+            "up_to_4h": "até 4 horas",
+            "up_to_2h": "até 2 horas",
+            "other_services": "Além da limpeza básica, quais serviços você também realiza?",
+            "change_in_profile": "(poderá ser alterado no perfil)",
+            "no_services": "Nenhum tipo de serviço disponível no momento.",
+            "search_visibility": "Essas informações aparecerão para quem buscar o seu perfil na busca.",
+            "action": "continuar"
         },
         "step_6": {
-          "title": "Agora vamos escolher quais melhor horários para você receber solicitações de serviços!",
-          "lock_hint": "Toque e bloqueie os dias ou períodos",
-          "lock_description": "se você não deseja receber solicitações de serviços neste período.",
-          "morning": "manhã",
-          "afternoon": "tarde",
-          "instruction": "Para bloquear dias individuais, clique no dia, para bloquear apenas períodos, clique em manhã ou tarde.",
-          "dont_worry": "Não se preocupe!",
-          "change_anytime": "Depois você poderá alterar a disponibilidade de sua preferência a qualquer momento no app ;)",
-          "select_at_least_one": "Selecione ao menos um período de trabalho.",
-          "action": "concluir cadastro"
+            "title": "Agora vamos escolher quais melhor horários para você receber solicitações de serviços!",
+            "lock_hint": "Toque e bloqueie os dias ou períodos",
+            "lock_description": "se você não deseja receber solicitações de serviços neste período.",
+            "morning": "manhã",
+            "afternoon": "tarde",
+            "instruction": "Para bloquear dias individuais, clique no dia, para bloquear apenas períodos, clique em manhã ou tarde.",
+            "dont_worry": "Não se preocupe!",
+            "change_anytime": "Depois você poderá alterar a disponibilidade de sua preferência a qualquer momento no app ;)",
+            "select_at_least_one": "Selecione ao menos um período de trabalho.",
+            "action": "concluir cadastro"
         }
-      },
-      "pending_approval": {
-        "title": "Cadastro enviado!",
-        "description": "Seu cadastro está aguardando aprovação. Assim que for revisado, você poderá acessar o aplicativo."
       }
     },
+    "payments": {
+      "anticipation_available": "Disponível para antecipação:",
+      "anticipation_fee_label": "Taxa de antecipação ({percent}%):",
+      "anticipation_total_label": "Você vai receber",
+      "anticipation_note": "O valor será creditado em sua conta bancária cadastrada.",
+      "anticipation_btn_close": "Fechar",
+      "anticipation_btn_anticipate": "Antecipar",
+      "anticipation_remind_label": "Lembre-se:",
+      "anticipation_reminder": "A antecipação é processada em até 2 dias úteis.",
+      "anticipation_confirm_title": "Confirmar antecipação?",
+      "anticipation_confirm_cancel": "Cancelar",
+      "anticipation_confirm_ok": "Confirmar",
+      "withdraw_confirm_title": "Confirmar saque?",
+      "withdraw_confirm_message": "Você está prestes a sacar {amount}.",
+      "movements_title": "Movimentações",
+      "mov_servico": "Serviço",
+      "mov_saque": "Saque",
+      "title": "Pagamentos",
+      "total_earnings_title": "Total ganho",
+      "total_earnings_count": "{count} serviços realizados",
+      "total_earnings_days": "Últimos {days} dias",
+      "available_balance_label": "Saldo disponível",
+      "btn_withdraw": "Sacar",
+      "available_balance_prefix": "Disponível para saque via",
+      "available_balance_highlight": "PIX ou conta bancária",
+      "pending_balance_label": "Saldo a liberar",
+      "pending_balance_desc": "Aguardando confirmação de pagamento",
+      "services_title": "Serviços realizados",
+      "btn_view_movements": "Ver movimentações",
+      "services_date_service": "Serviço:",
+      "services_date_payment": "Pagamento:",
+      "default_client_name": "Cliente",
+      "pay_status_pending": "Pendente",
+      "pay_status_paid": "Pago",
+      "pay_status_authorized": "Autorizado",
+      "pay_status_processing": "Processando",
+      "pay_status_failed": "Falhou",
+      "pay_status_cancelled": "Cancelado",
+      "period_week": "Semana",
+      "period_month": "Mês",
+      "period_year": "Ano"
+    },
     "dashboard": {
       "summary": {
         "welcome": "Olá,",
         "my_schedules": "Minhas diárias"
       },
       "price_suggest": {
-        "region_label_1": "Preço de diária",
-        "region_label_2": "sugerido na região",
+        "region_label": "Preço de diária sugerido na região",
+        "region_label_1": "Preço de diária sugerido",
+        "region_label_2": "na região",
         "my_price_label": "Preço da minha diária"
       },
+      "today_services": {
+        "finished_label": "Serviço com",
+        "finished_suffix": "concluído!",
+        "start_label": "Serviço com",
+        "code_hint": "Informe o código do cliente",
+        "in_progress": "Em andamento",
+        "reviewed_badge": "Avaliado",
+        "rate_btn": "Avaliar",
+        "help": "ajuda",
+        "end_time_label": "Término:",
+        "code_error": "Código inválido. Tente novamente."
+      },
       "solicitations": {
         "title": "Solicitações para você",
         "until_8h": "Integral (até 8h)",
@@ -248,80 +309,57 @@
         "until_2h": "Diária Rápida (Até 2h)",
         "offers_meal": "Oferece refeição",
         "not_offers_meal": "Não oferece refeição",
-        "distance_prefix": "",
-        "distance_suffix": "km de distância do seu endereço cadastrado.",
-        "via_agenda_text": "Pedido feito via",
+        "distance_prefix": "O cliente está a",
+        "distance_suffix": "de você",
+        "via_agenda_text": "Solicitação via",
         "via_agenda": "agenda",
-        "same_day_warning_label": "Aviso:",
-        "same_day_warning": "Ao receber mais de uma solicitação para o mesmo dia, verifique o horário e a distância para planejar seu tempo de deslocamento.",
-        "confirm_accept": "Tem certeza que deseja aceitar esse serviço?",
-        "confirm_reject": "Tem certeza que deseja recusar esse serviço?",
+        "same_day_warning_before": "Aviso: ",
+        "same_day_warning_bold": "Ao receber mais de uma solicitação para o mesmo dia, verifique o horário e a distância",
+        "same_day_warning_after": " para planejar o seu tempo de deslocamento.",
+        "confirm_accept": "Proposta aceita com sucesso!",
+        "confirm_reject": "Proposta recusada",
         "tip_label": "Dica:",
-        "reject_tip": "Se você não tiver disponibilidade, acesse o seu perfil e feche os dias que não deseja receber solicitações."
-      },
-      "today_services": {
-        "start_label": "Início do serviço para",
-        "finished_label": "Serviço de",
-        "finished_suffix": "concluído",
-        "code_hint": "Solicite ao cliente o código para começar",
-        "code_hint1": "Solicite ao cliente o ",
-        "code_hint2": "código para começar",
-        "code_placeholder": "0000",
-        "code_success": "Código verificado com sucesso!",
-        "code_error": "Código inválido. Tente novamente.",
-        "step_accepted": "Aceito",
-        "step_paid": "Pago",
-        "step_started": "Iniciado",
-        "step_finished": "Concluído",
-        "in_progress": "Serviço em andamento!",
-        "end_time_label": "Término do serviço em",
-        "rate_btn": "Avaliar",
-        "help": "ajuda",
-        "reviewed_badge": "avaliado!"
-      },
-      "schedule_rating": {
-        "title": "Como foi o serviço de",
-        "positive_label": "O que mais gostou?",
-        "negative_label": "O que poderia melhorar?",
-        "comment_placeholder": "Deseja deixar um comentário?",
-        "block_label": "Não receber mais pedidos deste cliente",
-        "add_photo": "Adicionar foto",
-        "submit_btn": "enviar avaliação",
-        "help_link": "Ajuda",
-        "already_reviewed": "Você já avaliou este serviço.",
-        "reviewed_badge": "avaliado!"
+        "reject_tip": "Recusar solicitações com frequência pode reduzir sua visibilidade."
       },
       "opportunities": {
         "title": "Oportunidades",
-        "banner_text": "Pedidos de clientes para os profissionais do Diário. Veja os detalhes do pedido, se candidate ao serviço e se o cliente aceitar você receberá uma nova diária.",
-        "full_day": "Integral (até 8h)",
+        "banner_text": "Pedidos de clientes para os profissionais do Diária. Veja os detalhes do pedido, se candidate ao serviço e se o cliente aceitar, você receberá um aviso.",
+        "empty": "Nenhuma oportunidade disponível no momento.",
+        "distance_km": "{distance} km de você",
         "details": "Ver detalhes",
-        "empty": "Nenhuma oportunidade encontrada",
-        "distance_km": "{distance} km",
-        "client_default": "Cliente",
-        "address_not_found": "Endereço não informado",
         "currency": "R$ {value}"
       },
       "opportunity_details": {
         "title": "Detalhes do serviço",
-        "client_default": "Cliente",
-        "price_label": "Integral (até 8h)",
-        "distance_text": "Há {distance} de distância do seu endereço cadastrado.",
-        "distance_default": "0 km",
-        "sob_medida": "Pedido feito",
+        "distance_text": "{distance} km de você",
+        "sob_medida": "Serviço",
         "sob_medida_highlight": "sob medida",
         "para": "para",
-        "info_title": "Informações do serviço",
-        "description_not_found": "Sem descrição informada",
-        "address_not_found": "Endereço não informado",
-        "hour_not_found": "Horário não informado",
-        "button_accept": "quero atender",
-        "alert_text": "Se seu pedido for aceito pelo cliente você receberá um aviso confirmando o agendamento.",
-        "offers_meal": "Refeição no local"
+        "offers_meal": "Oferece refeição",
+        "info_title": "Informações adicionais",
+        "button_accept": "Quero atender",
+        "alert_text": "Se seu pedido for aceito pelo cliente você receberá um aviso e aparecerá nos seus próximos serviços."
       },
       "opportunities_dialog": {
-        "message": "Se seu pedido for aceito pelo cliente você receberá um aviso confirmando o agendamento e aparecerá nos seus próximos serviços.",
-        "close": "fechar"
+        "message": "Se seu pedido for aceito pelo cliente, você receberá um aviso confirmando o agendamento e aparecerá nos seus próximos serviços.",
+        "close": "Fechar"
+      },
+      "agenda": {
+        "title": "Agenda",
+        "upcoming_title": "Próximos serviços",
+        "completed_title": "Serviços realizados",
+        "type_custom": "Sob Medida",
+        "type_default": "Agendamento",
+        "btn_view_details": "Ver detalhes",
+        "btn_rate": "Avaliar",
+        "empty_upcoming": "Nenhum serviço agendado",
+        "empty_completed": "Nenhum serviço realizado",
+        "status_pending": "Pendente",
+        "status_accepted": "Aceito",
+        "status_paid": "Pago",
+        "status_started": "Em andamento",
+        "status_finished": "Concluído",
+        "status_cancelled": "Cancelado"
       },
       "favorites": {
         "title": "Seus favoritos",
@@ -342,103 +380,49 @@
         "no_meal": "Não oferece refeição",
         "place_home": "Residencial",
         "place_apartment": "Apartamento",
+        "place_commercial": "Comercial",
         "place_unknown": "Endereço",
+        "copy_address": "Copiar endereço",
         "address_copied": "Endereço copiado!",
-        "copy_address": "copiar endereço",
         "btn_cancel_service": "Cancelar serviço",
         "btn_need_help": "Preciso de ajuda"
       },
-      "last_schedules": {
-        "title": "Últimas realizadas",
-        "reschedule": "Reagendar"
-      },
       "cancel_schedule": {
-        "title": "Tem certeza que deseja cancelar seu pedido?",
-        "reason_label": "Qual é o motivo do cancelamento?",
-        "reason_placeholder": "Descreva o motivo...",
-        "warning_title": "Atenção!",
-        "warning_free": "Cancelamentos gratuitos até 12h antes do horário agendado.",
-        "warning_fee": "Cancelamentos após este período geram reembolso de 50% do valor, como taxa de compensação ao profissional.",
+        "title": "Tem certeza que deseja cancelar seu agendamento?",
+        "reason_label": "Motivo do cancelamento",
+        "reason_placeholder": "Descreva o motivo do cancelamento...",
+        "warning_before": "Cancelar serviços já agendados ",
+        "warning_bold": "pode ocasionar no bloqueio temporário ou até permanente",
+        "warning_after": " do seu perfil no aplicativo.",
         "btn_cancel": "Voltar",
         "btn_keep": "Cancelar o serviço",
+        "service_fee": "Taxa de serviço",
+        "total": "Total a receber:",
+        "close": "Fechar",
         "btn_cancel_order": "Cancelar pedido",
-        "help": "Ajuda",
-        "schedule_details_title": "Detalhes",
-        "service_fee": "Taxa de serviço:",
-        "total": "Total:",
-        "close": "fechar"
+        "help": "Preciso de ajuda"
+      },
+      "schedule_rating": {
+        "title": "O que você achou de trabalhar com",
+        "negative_label": "O que poderia ter sido melhor?",
+        "positive_label": "O que você mais gostou?",
+        "comment_placeholder": "Deixe um comentário (opcional)",
+        "add_photo": "Adicionar foto",
+        "block_label": "Não quero receber este cliente novamente",
+        "submit_btn": "Enviar avaliação",
+        "help_link": "Tive um problema com este serviço",
+        "already_reviewed": "Você já avaliou este serviço"
+      },
+      "last_schedules": {
+        "title": "Últimas realizadas",
+        "reschedule": "Reagendar"
       },
       "providers_close": {
         "title": "Próximos a você",
         "until_8h": "Até 8h",
         "place_home": "Residencial",
         "schedule": "Agendar"
-      },
-      "agenda": {
-        "title": "Agenda",
-        "upcoming_title": "Próximos serviços",
-        "completed_title": "Serviços concluídos",
-        "type_default": "Agendamento",
-        "type_custom": "Sob Medida",
-        "status_pending": "Pendente",
-        "status_accepted": "Confirmado",
-        "status_paid": "Confirmado",
-        "status_started": "Em andamento",
-        "status_finished": "Concluído",
-        "status_cancelled": "Cancelado",
-        "btn_view_details": "ver detalhes",
-        "btn_rate": "avaliar",
-        "btn_reschedule": "reagendar",
-        "empty_upcoming": "Nenhum serviço agendado",
-        "empty_completed": "Nenhum serviço concluído"
       }
-    },
-    "payments": {
-      "title": "Pagamentos",
-      "total_earnings_title": "Ver ganhos totais",
-      "total_earnings_count": "{count} serviços realizados",
-      "total_earnings_days": "Valores referentes aos últimos {days} dias",
-      "period_week": "semana",
-      "period_month": "mês",
-      "period_year": "ano",
-      "available_balance_label": "Saldo disponível",
-      "available_balance_prefix": "Os valores ficam disponíveis para saque em até",
-      "available_balance_highlight": "5 dias após a conclusão do serviço.",
-      "btn_withdraw": "sacar",
-      "pending_balance_label": "Saldo a liberar",
-      "pending_balance_desc": "Valor de serviços aguardando liberação.",
-      "pending_balance_empty": "Nenhum pagamento pendente.",
-      "services_title": "Serviços",
-      "btn_view_movements": "ver movimentações",
-      "services_date_service": "Data do serviço:",
-      "services_date_payment": "Data do pagamento:",
-      "pay_status_pending": "Pendente",
-      "pay_status_paid": "Pago",
-      "pay_status_authorized": "Autorizado",
-      "pay_status_processing": "Processando",
-      "pay_status_failed": "Falhou",
-      "pay_status_anticipated": "Pago antecipado",
-      "pay_status_cancelled": "Serviço cancelado",
-      "btn_anticipate": "antecipar",
-      "movements_title": "Movimentações",
-      "mov_tarifa": "Tarifa da plataforma",
-      "mov_saque": "Saque",
-      "mov_servico": "Serviço",
-      "mov_service_code": "Cód. do serviço: {id}",
-      "anticipation_available": "Total disponível:",
-      "anticipation_fee_label": "Taxa de antecipação ({percent}%)*:",
-      "anticipation_total_label": "Total a ser pago utilizando a antecipação:",
-      "anticipation_note": "*A taxa de antecipação é cobrada pelo sistema de pagamento. O aplicativo Diária não tem participação nessa operação.",
-      "anticipation_remind_label": "Lembre-se:",
-      "anticipation_reminder": "Você pode aguardar a data prevista do pagamento deste serviço e evitar a taxa cobrada pela antecipação.",
-      "anticipation_btn_close": "fechar",
-      "anticipation_btn_anticipate": "antecipar",
-      "anticipation_confirm_title": "Tem certeza que deseja antecipar esse pagamento?",
-      "anticipation_confirm_cancel": "cancelar",
-      "anticipation_confirm_ok": "confirmar",
-      "default_client_name": "Cliente",
-      "withdraw_confirm_title": "Confirmar saque",
-      "withdraw_confirm_message": "Deseja sacar {amount} para sua conta?"
     }
   },
   "business": {
@@ -462,10 +446,6 @@
     "placeholder_name": "Digite seu nome",
     "placeholder_email": "Digite seu e-mail",
     "placeholder_phone": "Digite seu telefone",
-    "language": "Idioma",
-    "lang_pt": "PT-br",
-    "lang_en": "EN-us",
-    "lang_es": "ES-es",
     "bank_data": {
       "title": "Dados bancários",
       "description": "Pix, agência e conta",
@@ -477,6 +457,8 @@
       "pix_key": "Chave pix",
       "pix_key_placeholder": "Digite sua chave pix",
       "pix_key_required": "Informe a chave pix",
+      "att_pix": "Atualizar pix",
+      "att_bank": "Atualizar conta",
       "save_pix": "cadastrar pix",
       "pix_saved": "Chave pix salva com sucesso!",
       "bank_account_title": "Agência e conta",
@@ -489,9 +471,7 @@
       "bank_fields_required": "Informe agência e conta",
       "save_account": "cadastrar conta",
       "account_saved": "Conta bancária salva com sucesso!",
-      "save_error": "Erro ao salvar. Tente novamente.",
-      "att_pix": "Atualizar pix",
-      "att_bank": "Atualizar conta bancária"
+      "save_error": "Erro ao salvar. Tente novamente."
     },
     "availability": {
       "title": "Disponibilidade",
@@ -552,7 +532,7 @@
       "services_subtitle": "Além da limpeza básica, quais serviços você também realiza?",
       "services_hint": "Essas informações aparecerão para quem buscar o seu perfil na busca.",
       "no_services": "Nenhum serviço disponível no momento.",
-      "change_in_profile": "(pode ser alterado no perfil)"
+      "change_in_profile": "(pode ser alterado no perfil)"
     },
     "address": {
       "title": "Endereço",
@@ -570,50 +550,40 @@
       "state_label": "Estado",
       "update_address": "Alterar endereço",
       "search_placeholder": "Buscar",
-      "missing_coords": "Coordenadas não encontradas para este endereço.",
+      "missing_coords": "Endereço sem localização. Defina o ponto no mapa.",
       "update_on_map": "Atualizar no mapa"
     },
     "help": {
       "title": "Ajuda",
       "description": "Dúvidas e suporte",
-      "support_title": "Suporte",
-      "online_status": "Online",
-      "ai_assistant_label": "Assistente com IA",
-      "virtual_assistant": "Assistente Virtual",
-      "greeting_message": "Olá! 👋 Sou o assistente virtual do Diária. Como posso ajudar você hoje?",
+      "support_title": "Suporte Diarista",
+      "online_status": "Online agora",
+      "ai_assistant_label": "Assistente IA",
       "quick_suggestions": "Sugestões rápidas:",
-      "suggestion_cancel": "Como cancelar um serviço?",
-      "suggestion_data": "Alterar dados cadastrais",
-      "suggestion_payment": "Dúvidas sobre pagamento",
-      "suggestion_human": "Falar com atendente",
-      "contact_title": "Fale conosco",
-      "contact_subtitle": "Escolha o canal de atendimento de sua preferência.",
-      "channel_whatsapp": "WhatsApp",
-      "channel_whatsapp_desc": "Atendimento rápido pelo WhatsApp",
-      "channel_email": "E-mail",
-      "channel_email_desc": "Envie sua dúvida por e-mail",
-      "channel_phone": "Telefone",
-      "channel_phone_desc": "Fale diretamente com nossa equipe",
       "message_placeholder": "Digite sua mensagem...",
-      "footer_disclaimer": "⚡ Respostas automáticas por IA • Atendimento humano disponível",
-      "coming_soon": "Em breve disponível",
-      "error_message": "Não foi possível processar sua mensagem. Tente novamente."
+      "footer_disclaimer": "As respostas são geradas por inteligência artificial.",
+      "suggestion_cancel": "Como cancelo um serviço?",
+      "suggestion_data": "Como atualizo meus dados?",
+      "suggestion_payment": "Quando recebo meu pagamento?",
+      "suggestion_human": "Quero falar com um humano",
+      "error_message": "Ocorreu um erro. Tente novamente.",
+      "greeting_message": "Olá! Como posso te ajudar hoje?"
     },
     "privacy": {
       "title": "Privacidade",
-      "description": "Contas bloqueadas",
-      "blocked_title": "Contas bloqueadas",
+      "description": "Clientes bloqueados",
       "empty_message": "Você não possui clientes bloqueados",
       "empty_sub": "Você pode bloquear clientes que não deseja receber novos pedidos.",
+      "blocked_title": "Clientes bloqueados",
       "unblock_btn": "Desbloquear"
     },
     "privacy_policy": {
-      "title": "Política de Privacidade",
-      "description": "Como tratamos seus dados"
+      "title": "Política de privacidade",
+      "description": "Termos e condições de uso"
     },
     "support_page": {
-      "title": "Central de Suporte",
-      "description": "Guia de uso e tutoriais"
+      "title": "Página de suporte",
+      "description": "Central de ajuda e atendimento"
     },
     "logout": {
       "title": "Sair",
@@ -811,22 +781,5 @@
         }
       }
     }
-  },
-  "address": {
-    "types": {
-      "home": "Casa",
-      "commercial": "Comercial"
-    }
-  },
-  "nav": {
-    "home": "Início",
-    "payments": "Pagamentos",
-    "agenda": "Agenda",
-    "profile": "Perfil"
-  },
-  "notifications": {
-    "title": "Notificações",
-    "unread": "Não lidas",
-    "mark_all_read": " Marcar todas como lidas"
   }
-}
+}

+ 7 - 13
src/layouts/MainLayout.vue

@@ -38,8 +38,8 @@
           class="provider-bottom-nav-item"
           :class="{ 'provider-bottom-nav-item--active': isNavItemActive(item) }"
         >
-          <q-icon :name="item.icon" class="provider-bottom-nav-icon" />
-          <span class="provider-bottom-nav-label">{{ item.label }}</span>
+          <q-icon :name="item.icon" class="provider-bottom-nav-icon font30" />
+          <span class="provider-bottom-nav-label font12" :class="isNavItemActive(item) ? 'fontbold' : 'fontregular'">{{ item.label }}</span>
         </router-link>
       </nav>
     </q-footer>
@@ -167,8 +167,8 @@ watch(
   display: grid;
   grid-template-columns: repeat(4, minmax(0, 1fr));
   align-items: end;
-  height: 80px;
-  padding: 12px 10px calc(12px + env(safe-area-inset-bottom));
+  height: 60px;
+  padding: 0px 0px calc(12px + env(safe-area-inset-bottom));
 }
 
 .provider-bottom-nav-item {
@@ -176,8 +176,8 @@ watch(
   flex-direction: column;
   align-items: center;
   justify-content: flex-end;
-  gap: 8px;
-  min-height: 56px;
+  gap: 2px;
+  min-height: 40px;
   color: #a1a1a1;
   text-decoration: none;
   transition: color 0.2s ease;
@@ -188,18 +188,12 @@ watch(
 }
 
 .provider-bottom-nav-icon {
-  font-size: 30px;
+  font-size: 24px;
   line-height: 1;
 }
 
 .provider-bottom-nav-label {
-  font-size: 12px;
-  font-weight: 400;
   line-height: 1.1;
   letter-spacing: -0.02em;
 }
-
-.provider-bottom-nav-item--active .provider-bottom-nav-label {
-  font-weight: 700;
-}
 </style>

+ 20 - 227
src/pages/LoginPage.vue

@@ -1,6 +1,9 @@
 <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
 <template>
   <q-page class="login-page bg-surface-dark">
+      <span class="text-text">
+      {{steps}}
+      </span>
     <Transition name="fade-slide" mode="out-in">
       <div v-if="!clicked" key="splash" class="splash-screen" @click="clicked = true">
         <img :src="BackgroundLogin" class="splash-layer splash-layer--bg" />
@@ -31,167 +34,11 @@
               v-model="stepFourForm"
               @update:show-sub-step="showSubStep = $event"
             />
-            <LoginStepFivePanel
-              v-else-if="steps === 5"
-              v-model="stepFiveForm"
-            />
-            <q-card-section v-else-if="steps === 6" class="no-padding">
-              <div
-                class="text-subtitle1 text-center text-weight-bold text-text q-mb-md"
-              >
-                Dados bancários
-              </div>
-
-              <div class="text-caption text-grey-7 text-center q-mb-md">
-                Informe uma conta vinculada ao mesmo CPF do cadastro para
-                receber os pagamentos.
-              </div>
-
-              <div class="row q-mb-sm items-center">
-                <q-radio
-                  v-model="stepSixForm.account_type"
-                  val="checking"
-                  label="Conta corrente"
-                  color="primary"
-                  keep-color
-                  class="q-mr-lg text-text"
-                />
-                <q-radio
-                  v-model="stepSixForm.account_type"
-                  val="savings"
-                  label="Poupança"
-                  color="primary"
-                  keep-color
-                  class="text-text"
-                />
-              </div>
-
-              <div class="text-text">
-                <span class="text-weight-medium">Código do banco</span>
-              </div>
-              <q-input
-                v-model="stepSixForm.bank"
-                no-error-icon
-                outlined
-                rounded
-                class="bg-surface q-mt-sm q-mb-md"
-                input-class="text-text"
-                placeholder="Ex: 001"
-                hide-bottom-space
-                :rules="[requiredRule]"
-                lazy-rules
-                maxlength="3"
-              />
-
-              <div class="row q-col-gutter-sm">
-                <div class="col-8">
-                  <div class="text-text">
-                    <span class="text-weight-medium">Agência</span>
-                  </div>
-                  <q-input
-                    v-model="stepSixForm.branch_number"
-                    no-error-icon
-                    outlined
-                    rounded
-                    class="bg-surface q-mt-sm q-mb-md"
-                    input-class="text-text"
-                    placeholder="0000"
-                    hide-bottom-space
-                    :rules="[requiredRule]"
-                    lazy-rules
-                    maxlength="20"
-                  />
-                </div>
-                <div class="col-4">
-                  <div class="text-text">
-                    <span class="text-weight-medium">Dígito</span>
-                  </div>
-                  <q-input
-                    v-model="stepSixForm.branch_check_digit"
-                    no-error-icon
-                    outlined
-                    rounded
-                    class="bg-surface q-mt-sm q-mb-md"
-                    input-class="text-text"
-                    placeholder="0"
-                    hide-bottom-space
-                    lazy-rules
-                    maxlength="10"
-                  />
-                </div>
-              </div>
-
-              <div class="row q-col-gutter-sm">
-                <div class="col-8">
-                  <div class="text-text">
-                    <span class="text-weight-medium">Conta</span>
-                  </div>
-                  <q-input
-                    v-model="stepSixForm.account_number"
-                    no-error-icon
-                    outlined
-                    rounded
-                    class="bg-surface q-mt-sm q-mb-md"
-                    input-class="text-text"
-                    placeholder="000000"
-                    hide-bottom-space
-                    :rules="[requiredRule]"
-                    lazy-rules
-                    maxlength="20"
-                  />
-                </div>
-                <div class="col-4">
-                  <div class="text-text">
-                    <span class="text-weight-medium">Dígito</span>
-                  </div>
-                  <q-input
-                    v-model="stepSixForm.account_check_digit"
-                    no-error-icon
-                    outlined
-                    rounded
-                    class="bg-surface q-mt-sm q-mb-md"
-                    input-class="text-text"
-                    placeholder="0"
-                    hide-bottom-space
-                    :rules="[requiredRule]"
-                    lazy-rules
-                    maxlength="10"
-                  />
-                </div>
-              </div>
-
-              <div class="text-text">
-                <span class="text-weight-medium">Chave Pix</span>
-              </div>
-              <q-input
-                v-model="stepSixForm.pix_key"
-                no-error-icon
-                outlined
-                rounded
-                class="bg-surface q-mt-sm q-mb-md"
-                input-class="text-text"
-                placeholder="Opcional"
-                hide-bottom-space
-                lazy-rules
-                maxlength="255"
-              />
-            </q-card-section>
-            <LoginStepSixPanel
-              v-else-if="steps === 7"
-              v-model="stepSevenForm"
-            />
-
-            <div
-              v-else-if="steps === 8"
-              class="column items-center justify-center q-gutter-md text-center"
-            >
-              <q-icon name="mdi-clock-outline" size="64px" color="warning" />
-              <div class="text-h6 text-text">{{ $t('provider.login.pending_approval.title') }}</div>
-              <div class="text-body2 text-grey-5">{{ $t('provider.login.pending_approval.description') }}</div>
-            </div>
+            <LoginStepFivePanel v-else-if="steps === 5" v-model="stepFiveForm" />
+            <LoginStepSixPanel v-else-if="steps === 6" v-model="stepSixForm" />
           </div>
 
-          <div v-if="!showSubStep && steps !== 7" class="flow-footer">
+          <div v-if="!showSubStep" class="flow-footer">
             <q-btn
               color="primary-button"
               :label="actionLabel"
@@ -243,7 +90,6 @@ const steps = ref(1);
 const submitting = ref(false);
 const loginForm = ref(null);
 const isLogin = ref(false);
-
 const email = ref('');
 const phone = ref('');
 const code = ref('');
@@ -317,9 +163,9 @@ const mapWorkingDays = () => {
   return mapped;
 };
 
-// const hasWorkingDaySelected = () => {
-//   return mapWorkingDays().length > 0;
-// };
+const hasWorkingDaySelected = () => {
+  return mapWorkingDays().length > 0;
+};
 
 const validateCurrentStep = async () => {
   const isValid = await loginForm.value?.validate();
@@ -328,7 +174,7 @@ const validateCurrentStep = async () => {
     return false;
   }
 
-  if(steps.value === 4) {
+    if(steps.value === 4) {
     const hasSelfie = !!stepFourForm.value.selfie;
     const hasDocumentFront = !!stepFourForm.value.document_front;
     const hasDocumentBack = !!stepFourForm.value.document_back;
@@ -342,6 +188,14 @@ const validateCurrentStep = async () => {
     }
   }
 
+  if (steps.value === 6 && !hasWorkingDaySelected()) {
+    $q.notify({
+      type: 'negative',
+      message: t('provider.login.steps.step_6.select_at_least_one'),
+    });
+    return false;
+  }
+
   return true;
 };
 
@@ -369,63 +223,6 @@ const validateCodeInput = async () => {
   }
 };
 
-// const registerUserAndProvider = async () => {
-//   const workingDays = mapWorkingDays();
-
-//   const payload = {
-//     ...stepThreeForm.value,
-//     email: stepThreeForm.value.email || email.value,
-//     phone: stepThreeForm.value.phone || phone.value,
-//     code: code.value,
-//     birth_date: toISODate(stepThreeForm.value.birth_date),
-//     has_complement: !stepThreeForm.value.no_complement,
-//     complement: stepThreeForm.value.no_complement ? null : stepThreeForm.value.complement,
-
-//     selfie_base64: stepFourForm.value.selfie_base64,
-//     document_front_base64: stepFourForm.value.document_front_base64,
-//     document_back_base64: stepFourForm.value.document_back_base64,
-
-//     daily_price_8h: Number(stepFiveForm.value.daily_price_8h),
-//     daily_price_6h: Number(stepFiveForm.value.daily_price_6h),
-//     daily_price_4h: Number(stepFiveForm.value.daily_price_4h),
-//     daily_price_2h: Number(stepFiveForm.value.daily_price_2h),
-//     services_types_ids: stepFiveForm.value.services_types_ids,
-
-//     working_days: workingDays,
-
-//   };
-
-//   form.append('selfie', stepFourForm.value.selfie);
-//   form.append('document_front', stepFourForm.value.document_front);
-//   form.append('document_back', stepFourForm.value.document_back);
-
-//   append('recipient_name', stepThreeForm.value.name);
-//   append('recipient_email', stepThreeForm.value.email || email.value);
-//   append('recipient_document', stepThreeForm.value.document);
-//   append('recipient_type', 'individual');
-//   append('recipient_payment_mode', 'bank_transfer');
-//   append('recipient_default_bank_account[type]', stepSixForm.value.account_type);
-//   append('recipient_default_bank_account[bank]', stepSixForm.value.bank);
-//   append('recipient_default_bank_account[branch_number]', stepSixForm.value.branch_number);
-//   append('recipient_default_bank_account[branch_check_digit]', stepSixForm.value.branch_check_digit);
-//   append('recipient_default_bank_account[account_number]', stepSixForm.value.account_number);
-//   append('recipient_default_bank_account[account_check_digit]', stepSixForm.value.account_check_digit);
-//   append('recipient_default_bank_account[pix_key]', stepSixForm.value.pix_key);
-//   append('recipient_default_bank_account[holder_name]', stepThreeForm.value.name);
-//   append('recipient_default_bank_account[holder_document]', stepThreeForm.value.document);
-//   append('recipient_default_bank_account[holder_type]', 'individual');
-
-//   const response = await createUserAndProvider(form);
-//   if (response.status === 200) {
-//     if (response.data?.payload?.access_token) {
-//       await setAuthDataFromPayload(response.data.payload);
-//       router.push({ name: "DashboardPage" });
-//       return;
-//     }
-//     steps.value = 8;
-//   }
-// };
-
 const registerUserAndProvider = async () => {
   const workingDays = mapWorkingDays();
   const form = new FormData();
@@ -487,12 +284,8 @@ const registerUserAndProvider = async () => {
 
   const response = await createUserAndProvider(form);
   if (response.status === 200) {
-      if (response.data?.payload?.access_token) {
-      await setAuthDataFromPayload(response.data.payload);
-      router.push({ name: "DashboardPage" });
-      return;
-    }
-    steps.value = 8;
+    await setAuthDataFromPayload(response.data.payload);
+    router.push({ name: 'DashboardPage' });
   }
 };
 

+ 34 - 49
src/pages/calendar/CalendarPage.vue

@@ -2,7 +2,7 @@
   <q-page class="bg-page q-pb-xl">
     <div class="calendar-header row items-center bg-white">
       <q-space />
-      <span class="gradient-diarista">{{ $t('provider.dashboard.agenda.title') }}</span>
+      <span class="font16 fontbold gradient-diarista">{{ $t('provider.dashboard.agenda.title') }}</span>
       <q-space />
     </div>
 
@@ -14,7 +14,7 @@
 
     <template v-else>
       <div class="q-mt-md q-mx-md">
-        <div class="section-title gradient-diarista q-mb-sm">{{ $t('provider.dashboard.agenda.upcoming_title') }}</div>
+        <div class="section-title font16 fontbold gradient-diarista q-mb-sm">{{ $t('provider.dashboard.agenda.upcoming_title') }}</div>
 
         <template v-if="upcomingSchedules.length > 0">
           <q-card
@@ -27,45 +27,46 @@
               <div class="row no-wrap items-start q-gutter-x-sm">
                 <q-avatar size="44px">
                   <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
-                  <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:13px;border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+                  <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
                 </q-avatar>
 
-                <div class="col columns">
-                  <span class="text-name ellipsis">{{ item.client_name }}</span>
+                <div class="col column text-text">
+                  <span class="font12 fontmedium ellipsis">{{ item.client_name }}</span>
                   <div class="row items-center no-wrap">
-                    <span class="">{{ formatWeekday(item.date) }}</span>
-                    <span class="">{{ ', ' + formatDayMonth(item.date) }}</span>
+                    <span class="font9 fontbold">{{ formatWeekday(item.date) }}</span>
+                    <span class="font9 fontmedium">{{ ', ' + formatDayMonth(item.date) }}</span>
                   </div>
-                  <span class="">
+                  <span class="font9 fontmedium">
                     {{ $t('common.from') }}
-                    <span class="">{{ item.start_time?.slice(0, 5) }}</span>
+                    <span class="font9 fontbold">{{ item.start_time?.slice(0, 5) }}</span>
                     {{ $t('common.to') }}
-                    <span class="">{{ item.end_time?.slice(0, 5) }}</span>
+                    <span class="font9 fontbold">{{ item.end_time?.slice(0, 5) }}</span>
                   </span>
                 </div>
 
-                <div class="col-auto column items-ends">
+                <div class="col-auto column items-end">
                   <q-chip
                     dense
                     square
                     :color="statusBgColor(item.status)"
                     :text-color="statusTextColor(item.status)"
                     :label="statusLabel(item.status)"
-                    class="status-chip"
+                    class="status-chip font9"
                   />
-                  <span class="text-price">{{ formatCurrency(item.total_amount) }}</span>
-                  <span class="text-period">{{ periodLabel(item.period_type) }}</span>
+                  <span class="text-price font10 fontbold">{{ formatCurrency(item.total_amount) }}</span>
+                  <span class="text-period font9 fontmedium">{{ periodLabel(item.period_type) }}</span>
                 </div>
               </div>
 
               <div class="row items-center no-wrap q-mt-xs">
-                <span class="type-label" :class="item.schedule_type === 'custom' ? 'type-custom' : 'type-default'">
+                <span class="type-label text-primary font10 fontmedium">
                   {{ item.schedule_type === 'custom' ? $t('provider.dashboard.agenda.type_custom') : $t('provider.dashboard.agenda.type_default') }}
                 </span>
                 <q-space />
                 <q-btn
-                  flat
-                  no-caps
+                  rounded
+                  unelevated
+                  padding="4px 12px"
                   color="primary"
                   size="xs"
                   :label="$t('provider.dashboard.agenda.btn_view_details')"
@@ -76,13 +77,13 @@
           </q-card>
         </template>
 
-        <div v-else class="text-center text-grey-5 q-py-lg">
+        <div v-else class="font16 fontbold text-center text-grey-5 q-py-lg">
           {{ $t('provider.dashboard.agenda.empty_upcoming') }}
         </div>
       </div>
 
       <div class="q-mt-lg q-mx-md">
-        <div class="section-title gradient-diarista q-mb-sm">{{ $t('provider.dashboard.agenda.completed_title') }}</div>
+        <div class="section-title font16 fontbold gradient-diarista q-mb-sm">{{ $t('provider.dashboard.agenda.completed_title') }}</div>
 
         <template v-if="completedSchedules.length > 0">
           <q-card
@@ -95,39 +96,39 @@
               <div class="row no-wrap items-start q-gutter-x-sm">
                 <q-avatar size="44px">
                   <img v-if="item.customer_photo" :src="item.customer_photo" style="object-fit:cover" />
-                  <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:13px;border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+                  <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
                 </q-avatar>
 
-                <div class="col columns">
-                  <span class="text-name ellipsis">{{ item.client_name }}</span>
+                <div class="col column text-text">
+                  <span class="font12 fontmedium ellipsis">{{ item.client_name }}</span>
                   <div class="row items-center no-wrap">
-                    <span class="">{{ formatWeekday(item.date) }}</span>
-                    <span class="">{{ ', ' + formatDayMonth(item.date) }}</span>
+                    <span class="font9 fontbold">{{ formatWeekday(item.date) }}</span>
+                    <span class="font9 fontmedium">{{ ', ' + formatDayMonth(item.date) }}</span>
                   </div>
-                  <span class="">
+                  <span class="font9 fontmedium">
                     {{ $t('common.from') }}
-                    <span class="">{{ item.start_time?.slice(0, 5) }}</span>
+                    <span class="font9 fontbold">{{ item.start_time?.slice(0, 5) }}</span>
                     {{ $t('common.to') }}
-                    <span class="">{{ item.end_time?.slice(0, 5) }}</span>
+                    <span class="font9 fontbold">{{ item.end_time?.slice(0, 5) }}</span>
                   </span>
                 </div>
 
-                <div class="col-auto column items-ends">
+                <div class="col-auto column items-end">
                   <q-chip
                     dense
                     square
                     :color="statusBgColor(item.status)"
                     :text-color="statusTextColor(item.status)"
                     :label="statusLabel(item.status)"
-                    class="status-chip"
+                    class="status-chip font9"
                   />
-                  <span class="text-price">{{ formatCurrency(item.total_amount) }}</span>
-                  <span class="text-period">{{ periodLabel(item.period_type) }}</span>
+                  <span class="text-price font10 fontbold">{{ formatCurrency(item.total_amount) }}</span>
+                  <span class="text-period font9 fontmedium">{{ periodLabel(item.period_type) }}</span>
                 </div>
               </div>
 
               <div class="row items-center no-wrap q-mt-xs">
-                <span class="type-label" :class="item.schedule_type === 'custom' ? 'type-custom' : 'type-default'">
+                <span class="type-label text-primary font10 fontmedium">
                   {{ item.schedule_type === 'custom' ? $t('provider.dashboard.agenda.type_custom') : $t('provider.dashboard.agenda.type_default') }}
                 </span>
                 <q-space />
@@ -145,6 +146,7 @@
                   v-if="!item.provider_reviewed"
                   unelevated
                   rounded
+                  padding="4px 12px"
                   no-caps
                   color="secondary"
                   size="xs"
@@ -303,22 +305,6 @@ onMounted(async () => {
   line-height: 1.2;
 }
 
-.type-default {
-  color: #8B5CF6;
-}
-
-.type-custom {
-  color: #EC4899;
-}
-
-.text-name {
-  color: #3a3a4a;
-  max-width: 130px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
 .text-price {
   color: #3a3a4a;
   white-space: nowrap;
@@ -332,7 +318,6 @@ onMounted(async () => {
 
 .status-chip {
   height: auto;
-  padding: 2px 2px;
 }
 
 .btn-rate {

+ 12 - 12
src/pages/dashboard/DashboardPage.vue

@@ -40,13 +40,14 @@ import SolicitationDetailsDialog from 'src/components/dashboard/SolicitationDeta
 import NextSchedulesDetailsDialog from 'src/components/dashboard/NextSchedulesDetailsDialog.vue';
 import ScheduleRatingDialog from 'src/components/dashboard/ScheduleRatingDialog.vue';
 import OpportunityDialog from 'src/pages/opportunities/components/OpportunityDialog.vue';
-import { onMounted, ref } from 'vue';
+import { onMounted, ref, watch } from 'vue';
 import { useQuasar } from 'quasar';
 import { dadosDashboard } from 'src/api/dashboard';
 import { updateScheduleStatus } from 'src/api/schedule';
-import { useRouter } from 'vue-router';
+import { useRouter, useRoute } from 'vue-router';
 
 const router = useRouter();
+const route = useRoute();
 
 const headerBar = ref({});
 const summaryInfos = ref({});
@@ -57,10 +58,17 @@ const nextSchedules = ref([]);
 const opportunities = ref([]);
 const notifications = ref([]);
 
-const showSuccessModal = ref(router.currentRoute.value.fullPath.includes('showSuccessModal') || false);
-
 const $q = useQuasar();
 
+watch(() => route.query.showSuccessModal, (val) => {
+  if (val === 'true') {
+    $q.dialog({ component: OpportunityDialog })
+      .onDismiss(() => {
+        router.replace({ path: route.path, query: {} });
+      });
+  }
+}, { immediate: true });
+
 const loading = ref(true);
 
 const loadDashboard = async () => {
@@ -76,14 +84,6 @@ const loadDashboard = async () => {
     notifications.value = response.notifications ?? [];
   }
 
-  if( showSuccessModal.value == true) {
-    $q.dialog({
-       component: OpportunityDialog   
-       })
-
-    showSuccessModal.value = false;
-    router.replace({ path: router.currentRoute.value.path, query: {} });
-  }
 }
 
 const handleScheduleAction = async (id, status) => {

+ 39 - 66
src/pages/notifications/NotificationsPage.vue

@@ -13,7 +13,7 @@
         @click="router.back()"
       />
 
-      <div class="header-title">
+      <div class="header-title gradient-diarista font16 fontbold">
         {{ $t('notifications.title') }}
       </div>
 
@@ -22,14 +22,14 @@
     <!-- ACTIONS -->
     <div class="actions row justify-between items-center">
 
-      <div class="unread-text">
+      <div class="unread-text font12 fontregular">
         {{ $t('notifications.unread') }} {{ unreadCount }}
       </div>
 
       <q-btn
         flat
         no-caps
-        class="mark-read-btn"
+        class="text-secondary font12"
         label="✓ Marcar todas como lidas"
         @click="markAllAsRead"
       />
@@ -39,55 +39,54 @@
     <!-- LIST -->
     <div class="notifications-list">
 
-       <q-card
-    v-for="item in notifications"
-    :key="item.id"
-    flat
-    clickable
-    class="notification-card"
-    :class="{ unread: !item.read }"
-    @click="markAsRead(item)"
-  >
+      <q-card
+        v-for="item in notifications"
+        :key="item.id"
+        flat
+        clickable
+        class="notification-card"
+        :class="{ unread: !item.read }"
+        @click="markAsRead(item)"
+      >
 
-    <div class="row no-wrap items-start">
+        <div class="row no-wrap items-start">
 
-      <!-- AVATAR -->
-      <q-avatar size="42px" class="q-mr-md">
-        <img :src="logoDiaria" />
-      </q-avatar>
+          <!-- AVATAR -->
+          <q-avatar size="42px" class="q-mr-md">
+            <img :src="logoDiaria" />
+          </q-avatar>
 
-      <!-- CONTENT -->
-      <div class="col">
+          <!-- CONTENT -->
+          <div class="col">
 
-        <div class="row justify-between items-start">
+            <div class="row justify-between items-start">
 
-          <div class="notification-title">
-            {{ item.title }}
-          </div>
+              <div class="notification-title font12 fontbold">
+                {{ item.title }}
+              </div>
 
-          <!-- STATUS -->
-          <div
-            class="status-dot"
-            :class="{ active: !item.read }"
-          />
+              <!-- STATUS -->
+              <div
+                class="status-dot"
+                :class="{ active: !item.read }"
+              />
 
-        </div>
+            </div>
 
-        <div class="notification-description">
-          {{ item.description }}
-        </div>
+            <div class="notification-description font10 fontregular text-text">
+              {{ item.description }}
+            </div>
 
-        <div class="notification-time">
-          {{ item.time }}
-        </div>
+            <div class="notification-time font10 fontregular text-text">
+              {{ item.time }}
+            </div>
 
-      </div>
-
-    </div>
+          </div>
 
-  </q-card>
+        </div>
 
-</div>
+      </q-card>
+    </div>
 
   </q-page>
 </template>
@@ -142,13 +141,6 @@ const markAsRead = async (notification) => {
       return item
     })
 
-    if (
-      notification.origin === 'schedule'
-      && notification.origin_id
-    ) {
-      router.push(`/schedule/${notification.origin_id}`)
-    }
-
   } catch (error) {
     console.error(error)
   }
@@ -191,11 +183,6 @@ const markAllAsRead = async () => {
 .header-title {
   width: 100%;
   text-align: center;
-
-  font-size: 16px;
-  font-weight: 700;
-
-  color: #8B5CF6;
 }
 
 /* ACTIONS */
@@ -204,14 +191,9 @@ const markAllAsRead = async () => {
 }
 
 .unread-text {
-  font-size: 13px;
   color: #666;
 }
 
-.mark-read-btn {
-  font-size: 12px;
-  color: #ff4fd8;
-}
 
 /* LIST */
 .notifications-list {
@@ -236,27 +218,18 @@ const markAllAsRead = async () => {
 
 /* TITLE */
 .notification-title {
-  font-size: 14px;
-  font-weight: 700;
   color: #555;
 }
 
 /* DESCRIPTION */
 .notification-description {
   margin-top: 4px;
-
-  font-size: 12px;
   line-height: 1.4;
-
-  color: #777;
 }
 
 /* TIME */
 .notification-time {
   margin-top: 10px;
-
-  font-size: 11px;
-  color: #aaa;
 }
 
 /* STATUS */

+ 71 - 95
src/pages/opportunities/OpportunitiesPage.vue

@@ -2,14 +2,14 @@
   <q-page class="opportunities-page">
     <div class="page-header">
       <q-btn flat round dense icon="chevron_left" class="back-btn" @click="router.back()" />
-      <div class="page-title">
+      <div class="gradient-diarista font16 fontbold">
         {{ $t('provider.dashboard.opportunities.title') }}
       </div>
     </div>
 
     <q-card flat class="info-banner">
-      <q-icon name="mdi-auto-fix" size="22px" />
-      <div class="banner-text">
+      <q-icon name="mdi-auto-fix" size="30px" />
+      <div class="banner-text font10 fontmedium">
         {{ $t('provider.dashboard.opportunities.banner_text') }}
       </div>
     </q-card>
@@ -18,57 +18,61 @@
       <q-spinner-dots color="secondary" size="32px" />
     </div>
 
-    <div v-else-if="!opportunities.length" class="text-center q-pa-md text-grey">
+    <div v-else-if="!opportunities.length" class="text-center q-pa-md font14 medium text-text">
       {{ $t('provider.dashboard.opportunities.empty') }}
     </div>
 
     <div v-else class="opportunity-list">
-      <q-card v-for="item in opportunities" :key="item.id" flat class="opportunity-card">
-        <div class="avatar-column">
-          <img v-if="item.customer_photo" :src="item.customer_photo" alt="Avatar" class="client-avatar" />
-          <div v-else class="client-avatar client-avatar--initials" :style="avatarColors[item.id % avatarColors.length]">{{ (item.client_name ?? item.client?.user?.name)?.slice(0,2).toUpperCase() ?? '??' }}</div>
-          <div class="service-type">
-            {{ item.custom_schedule?.service_type.description }}
+      <q-card v-for="item in opportunities" :key="item.id" :flat="false" class="opportunity-card shadow-card bg-surface">
+        <div class="row">
+          <div>
+            <img v-if="item.customer_photo" :src="item.customer_photo" alt="Avatar" class="client-avatar" />
+            <div v-else class="client-avatar client-avatar--initials font14 fontbold" :style="avatarColors[item.id % avatarColors.length]">{{ (item.client_name ?? item.client?.user?.name)?.slice(0,2).toUpperCase() ?? '??' }}</div>
           </div>
-        </div>
-
-        <div class="center-content">
-          <div class="client-name-row">
-            <span class="client-name">{{ item.client?.user.name }}</span>
-
-            <!-- campo de avaliação -->
-            <span class="rating">
-              <q-icon name="star" size="11px" />
-              {{ item.client?.average_rating }}
-            </span>
+          <div class="center-content q-pl-md">
+            <div class="client-name-row">
+              <span class="text-text font12 fontmedium">{{ item.client?.user.name }}</span>
+
+              <span class="rating font9 fontregular">
+                <q-icon name="star" size="11px" />
+                {{ item.client?.average_rating }}
+              </span>
+            </div>
+
+            <div class="service-date text-text font9">
+              <span class="fontbold">{{ formatWeekday(item.date) }}</span><span>{{ ', ' + formatDayMonth(item.date) }}</span>
+            </div>
+
+            <div class="service-hour text-text font9">
+              {{ $t('common.from') }} <span class="fontbold">{{ formatHour(item.start_time) }} {{ $t('common.to') }} {{ formatHour(item.end_time) }}</span>
+            </div>
           </div>
 
-          <div class="service-date">
-            {{ formatDate(item.date) }}
-          </div>
-
-          <div class="service-hour">
-           {{ `Das ${formatHour(item.start_time)} às ${formatHour(item.end_time)}` }}
-          </div>
-        </div>
+          <div class="right-content">
+            <div class="price font14 fontbold">
+              {{ filterCurrency(chooseprice(item.period_type, user.user.provider.daily_price_8h)) }}
+            </div>
 
-        <div class="right-content">
-          <div class="price">
-             {{ filterCurrency(chooseprice(item.period_type, user.user.provider.daily_price_8h)) }}
-          </div>
+            <div class="font9 fontmedium text-text">{{ t(labelsPeriodTypes.find(l => l.value == item.period_type)?.label) }}</div>
 
-          <div class="service-address">
-            {{ item.address?.district }}
-          </div>
+            <div class="service-address font10 fontbold">
+              {{ item.address?.district }}
+            </div>
 
+            <div class="distance font9">
+              {{ $t('provider.dashboard.opportunities.distance_km', { distance: item.distance_km ?? 0 }) }}
+            </div>
 
-          <div class="distance">
-            {{ $t('provider.dashboard.opportunities.distance_km', { distance: item.distance_km ?? 0 }) }}
           </div>
 
-          
 
-          <q-btn unelevated rounded no-caps color="secondary" :label="$t('provider.dashboard.opportunities.details')" class="details-btn" @click="goToOpportunityDetails(item)" />
+        </div>
+        <div class="row">
+          <div class="q-my-auto text-primary font9 fontbold">
+            {{ item.custom_schedule?.service_type.description }}
+          </div>
+          <q-space/>
+          <q-btn unelevated rounded size="xs" padding="4px 12px" no-caps color="secondary" :label="$t('provider.dashboard.opportunities.details')" class="font11 fontsemibold" @click="goToOpportunityDetails(item)" />      
         </div>
       </q-card>
     </div>
@@ -77,13 +81,18 @@
 <script setup>
 import { ref, onMounted } from 'vue'
 import { useQuasar } from 'quasar'
+import { useI18n } from 'vue-i18n'
 import { chooseprice, filterCurrency } from 'src/helpers/utils'
 import { getProviderOpportunities } from 'src/api/opportunities'
 import { userStore } from 'src/stores/user'
+import { labelsPeriodTypes } from 'src/helpers/arraysOptions/labelsPeriodTypes.js'
 import OpportunityDetailsDialog from './components/OpportunityDetailsDialog.vue'
+import { useRouter } from 'vue-router'
 
-const $q = useQuasar()
-const user = userStore()
+const $q = useQuasar();
+const user = userStore();
+const router = useRouter();
+const { t } = useI18n();
 
 const avatarColors = [
   { background: '#ffd5df', color: '#932e57' },
@@ -107,18 +116,25 @@ const goToOpportunityDetails = (item) => {
   })
 }
 
-// formatando a data
-const formatDate = (date) => {
-  if (!date) return ''
-
-  return new Date(date).toLocaleDateString('pt-BR', {
-    weekday: 'long',
-    day: '2-digit',
-    month: '2-digit'
-  })
-}
+const parseLocalDate = (iso) => {
+  if (!iso) return null;
+  const m = String(iso).match(/^(\d{4})-(\d{2})-(\d{2})/);
+  return m ? new Date(+m[1], +m[2] - 1, +m[3]) : null;
+};
+
+const formatWeekday = (iso) => {
+  const d = parseLocalDate(iso);
+  if (!d) return '';
+  const w = d.toLocaleDateString('pt-BR', { weekday: 'long' });
+  return w.charAt(0).toUpperCase() + w.slice(1);
+};
+
+const formatDayMonth = (iso) => {
+  const d = parseLocalDate(iso);
+  if (!d) return '';
+  return d.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' });
+};
 
-// formatando hora para exibir só HH:mm
 const formatHour = (time) => {
   if (!time) return ''
   return time.slice(0, 5)
@@ -177,12 +193,6 @@ onMounted(loadOpportunities)
   color: #7c5cff;
 }
 
-.page-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #7c5cff;
-}
-
 .info-banner {
   display: flex;
   gap: 12px;
@@ -194,7 +204,6 @@ onMounted(loadOpportunities)
 }
 
 .banner-text {
-  font-size: 12px;
   line-height: 1.4;
 }
 
@@ -207,19 +216,17 @@ onMounted(loadOpportunities)
 
 .opportunity-card {
   display: flex;
+  flex-direction: column;
   gap: 14px;
   padding: 14px;
   border-radius: 18px;
-  background: #fff;
-  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
-  align-items: flex-start;
+  // align-items: flex-start;
 }
 
 .avatar-column {
   display: flex;
   flex-direction: column;
   align-items: center;
-  width: 58px;
 }
 
 .client-avatar {
@@ -233,17 +240,8 @@ onMounted(loadOpportunities)
   display: flex;
   align-items: center;
   justify-content: center;
-  font-weight: 700;
-  font-size: 14px;
 }
 
-.service-type {
-  margin-top: 8px;
-  font-size: 11px;
-  color: #7c5cff;
-  font-weight: 500;
-  text-align: center;
-}
 
 .center-content {
   flex: 1;
@@ -257,15 +255,8 @@ onMounted(loadOpportunities)
   gap: 4px;
 }
 
-.client-name {
-  font-size: 15px;
-  font-weight: 600;
-  color: #2d2d2d;
-}
-
 .district {
   margin-top: 4px;
-  font-size: 11px;
   color: #666;
 }
 
@@ -273,14 +264,11 @@ onMounted(loadOpportunities)
   display: flex;
   align-items: center;
   gap: 2px;
-  font-size: 11px;
   color: #ffb800;
 }
 
 .service-date,
 .service-hour {
-  font-size: 11px;
-  color: #666;
   line-height: 1.35;
 }
 
@@ -288,18 +276,14 @@ onMounted(loadOpportunities)
   display: flex;
   flex-direction: column;
   align-items: flex-end;
-  min-width: 110px;
 }
 
 .price {
-  font-size: 22px;
-  font-weight: 700;
   color: #2d2d2d;
 }
 
 .service-address {
   margin-top: 6px;
-  font-size: 11px;
   color: #666;
   text-align: right;
   line-height: 1.3;
@@ -308,15 +292,7 @@ onMounted(loadOpportunities)
 
 .distance {
   margin-top: 4px;
-  font-size: 11px;
   color: #999;
 }
 
-.details-btn {
-  margin-top: 10px;
-  min-height: 30px;
-  padding: 0 18px;
-  font-size: 11px;
-  font-weight: 600;
-}
 </style>

+ 102 - 111
src/pages/opportunities/components/OpportunityDetailsDialog.vue

@@ -5,7 +5,7 @@
     transition-show="slide-up"
     transition-hide="slide-down"
   >
-    <div v-if="details" class="details-page">
+    <div v-if="details" class="details-page bg-surface">
 
       <!-- HEADER -->
       <div class="page-header">
@@ -18,23 +18,25 @@
           @click="goBack"
         />
 
-        <div class="page-title">
+        <div class="gradient-diarista font16 fontbold">
           {{ $t('provider.dashboard.opportunity_details.title') }}
         </div>
       </div>
 
       <!-- CLIENTE -->
       <div class="client-section">
-        <img :src="details.avatar" class="client-avatar" />
+        <q-avatar size="90px" class="q-mb-sm">
+          <img v-if="details.schedule?.customer_photo" :src="details.schedule.customer_photo" style="object-fit:cover" />
+          <span v-else class="full-width full-height flex flex-center fontbold" :style="avatarColors[details.schedule?.client_id % avatarColors.length]" style="border-radius:50%">
+            {{ details.schedule?.client_name?.slice(0,2).toUpperCase() ?? '??' }}
+          </span>
+        </q-avatar>
 
-        <div class="client-name">
+        <div class="client-name font16 fontmedium">
           {{ details.schedule?.client_name }}
-          <span class="rating">
-            {{ details.schedule?.rating }}
-          </span>
         </div>
 
-        <div class="client-price">
+        <div class="client-price text-primary q-pt-md fontbold">
           {{
             $t('provider.dashboard.opportunities.currency', {
               value: chooseprice(details.schedule?.period_type)
@@ -42,24 +44,25 @@
           }}
         </div>
 
-        <div class="date">
-          {{ formatDate(details.schedule?.date) }}
+        <div class="font10 fontmedium text-grey-6">{{ t(labelsPeriodTypes.find(l => l.value == details.schedule?.period_type)?.label) }}</div>
+
+        <div class="date font11">
+          <span class="fontbold">{{ formatWeekday(details.schedule?.date) }}</span><span>{{ ', ' + formatDayMonth(details.schedule?.date) }}</span>
         </div>
 
-        <div class="hour">
-          {{ formatHour(details.schedule?.start_time) }}
-          {{ formatHour(details.schedule?.end_time) }}
+        <div class="hour font11">
+          {{ $t('common.from') }} <span class="fontbold">{{ formatHour(details.schedule?.start_time) }} {{ $t('common.to') }} {{ formatHour(details.schedule?.end_time) }}</span>
         </div>
       </div>
 
       <!-- ENDEREÇO -->
-      <div class="address">
-        <q-icon name="place" size="16px" />
+      <div class="address font14 fontbold">
+        <q-icon name="place" size="16px" class="gradient-diarista" />
 
         {{ details.schedule?.address?.district }}
       </div>
 
-      <div class="distance">
+      <div class="distance font12 fontbold">
         {{
           $t(
             'provider.dashboard.opportunity_details.distance_text',
@@ -81,7 +84,7 @@
       </div>
 
       <!-- INFO -->
-      <div class="service-type">
+      <div class="service-type font12 fontbold">
         {{ $t('provider.dashboard.opportunity_details.sob_medida') }}
 
         <span>
@@ -102,43 +105,55 @@
       </div>
 
       <div class="address-type">
-        <span class="chip-type">
-          {{ details.address_type }}
-        </span>
+        <q-chip outline color="primary" class="font11 items-center">
+          <q-icon :name="addressIcon(details.address_type)" size="14px" class="q-mr-xs" />
+          {{ addressLabel(details.address_type) }}
+        </q-chip>
 
-        <span
-          v-if="details.offers_meal"
-          class="chip-type"
-        >
-          {{ $t('provider.dashboard.opportunity_details.offers_meal') }}
-        </span>
+        <q-chip outline :color="details.offers_meal ? 'primary' : 'grey-5'" class="font11 items-center">
+          <q-icon
+            :name="details.offers_meal ? 'mdi-silverware' : 'mdi-close-circle-outline'"
+            :color="details.offers_meal ? 'primary' : 'grey-5'"
+            size="14px"
+            class="q-mr-xs"
+          />
+          <span :class="details.offers_meal ? '' : 'text-grey-6'">
+            {{ details.offers_meal
+              ? $t('provider.dashboard.next_schedules.offers_meal')
+              : $t('provider.dashboard.next_schedules.no_meal') }}
+          </span>
+        </q-chip>
       </div>
 
       <!-- INFO TITLE -->
       <div
         v-if="details.description"
-        class="service-type gradient-diarista"
+        class="gradient-diarista text-center font16 fontbold"
       >
         {{ $t('provider.dashboard.opportunity_details.info_title') }}
       </div>
 
       <!-- DESCRIÇÃO -->
-      <div class="description-box">
+      <div class="description-box font12">
         {{ details.description }}
       </div>
 
       <!-- BOTÃO -->
-      <q-btn
-        unelevated
-        rounded
-        no-caps
-        class="accept-btn"
-        :label="$t('provider.dashboard.opportunity_details.button_accept')"
-        @click="goToProposalFlow"
-      />
+      <div class="text-center q-px-md">
+        <q-btn
+          unelevated
+          rounded
+          no-caps
+          color="primary"
+          class="font11 fontsemibold full-width"
+          :label="$t('provider.dashboard.opportunity_details.button_accept')"
+          @click="goToProposalFlow"
+        />
+      </div>
+
 
       <!-- ALERTA -->
-      <div class="alert-box">
+      <div class="alert-box font12">
         <q-icon
           name="warning"
           size="18px"
@@ -158,7 +173,9 @@
 import { ref, onMounted } from 'vue'
 import { useRouter } from 'vue-router'
 import { useDialogPluginComponent } from 'quasar'
+import { useI18n } from 'vue-i18n'
 import { userStore } from 'src/stores/user'
+import { labelsPeriodTypes } from 'src/helpers/arraysOptions/labelsPeriodTypes.js'
 import {
   getOpportunityById,
   proposalOpportunity
@@ -185,49 +202,67 @@ const {
 } = useDialogPluginComponent()
 
 const router = useRouter()
+const { t } = useI18n()
 
 const user = userStore()
 const details = ref(null)
 const loading = ref(true)
 
+const avatarColors = [
+  { background: '#ffd5df', color: '#932e57' },
+  { background: '#d7e8ff', color: '#2158a8' },
+  { background: '#dfd',    color: '#2a7a3b' },
+  { background: '#ffe5cc', color: '#8a4500' },
+]
+
 const chooseprice = (periodType) => {
   switch (periodType) {
-    case "8":
-      return user.user.provider_daily_price_8h
-    case "6":
-      return user.user.provider_daily_price_6h
-    case "4":
-      return user.user.provider_daily_price_4h
-    case "2":
-      return user.user.provider_daily_price_2h
-    default:
-      return 0
+    case "8": return user.user.provider_daily_price_8h
+    case "6": return user.user.provider_daily_price_6h
+    case "4": return user.user.provider_daily_price_4h
+    case "2": return user.user.provider_daily_price_2h
+    default:  return 0
   }
 }
 
-// formatando a data
-const formatDate = (date) => {
-  if (!date) return ''
-
-  const [day, month, year] = date.split('/')
-
-  const parsedDate = new Date(year, month - 1, day)
+// data vem como DD/MM/YYYY do backend
+const parseLocalDate = (ddmmyyyy) => {
+  if (!ddmmyyyy) return null
+  const m = String(ddmmyyyy).match(/^(\d{2})\/(\d{2})\/(\d{4})$/)
+  return m ? new Date(+m[3], +m[2] - 1, +m[1]) : null
+}
 
-  const formatted = parsedDate.toLocaleDateString('pt-BR', {
-    weekday: 'long',
-    day: '2-digit',
-    month: '2-digit'
-  })
+const formatWeekday = (date) => {
+  const d = parseLocalDate(date)
+  if (!d) return ''
+  const w = d.toLocaleDateString('pt-BR', { weekday: 'long' })
+  return w.charAt(0).toUpperCase() + w.slice(1)
+}
 
-  return formatted.charAt(0).toUpperCase() + formatted.slice(1)
+const formatDayMonth = (date) => {
+  const d = parseLocalDate(date)
+  if (!d) return ''
+  return d.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' })
 }
 
-// formatando hora para exibir só HH:mm
 const formatHour = (time) => {
   if (!time) return ''
   return time.slice(0, 5)
 }
 
+const addressIcon = (type) => {
+  if (type === 'home')      return 'mdi-home-outline'
+  if (type === 'apartment') return 'mdi-domain'
+  return 'mdi-office-building-outline'
+}
+
+const addressLabel = (type) => {
+  if (type === 'home')       return t('provider.dashboard.next_schedules.place_home')
+  if (type === 'apartment')  return t('provider.dashboard.next_schedules.place_apartment')
+  if (type === 'commercial') return t('provider.dashboard.next_schedules.place_commercial')
+  return t('provider.dashboard.next_schedules.place_unknown')
+}
+
 const goBack = () => {
   onDialogOK()
 }
@@ -270,26 +305,24 @@ onMounted(async () => {
 
 <style scoped lang="scss">
 .details-page {
-  padding: 24px 16px;
-  background: #f4f5f7;
   min-height: 100vh;
 }
 
 /* HEADER */
 .page-header {
   display: flex;
-  align-items: center;      
+  align-items: center;
   justify-content: center;
   position: relative;
 
-  height: 56px;            
-  padding: 0 16px;
-
+  padding: 14px 16px;
   background: #fff;
+
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
   border-radius: 0 0 16px 16px;
 
-  margin-bottom: 20px;
+  margin-bottom: 16px;
+  z-index: 10;
 }
 
 .back-btn {
@@ -300,11 +333,6 @@ onMounted(async () => {
   color: #7c5cff;
 }
 
-.page-title {
-  font-size: 16px;
-  font-weight: 600;
-  color: #7c5cff;
-}
 
 /* CLIENTE */
 .client-section {
@@ -321,34 +349,25 @@ onMounted(async () => {
 }
 
 .client-name {
-  font-size: 16px;
-  font-weight: 600;
   color: #444;
 }
 
 .rating {
   color: #ffb800;
-  font-size: 12px;
   margin-left: 4px;
 }
 
 .client-price {
-  margin-top: 10px;
-  font-size: 26px;
-  font-weight: 700;
-  color: #7c5cff;
+  font-size: 24px;
 }
 
 /* DATA */
 .date {
   margin-top: 10px;
-  font-size: 13px;
-  font-weight: 600;
   color: #555;
 }
 
 .hour {
-  font-size: 13px;
   color: #777;
   margin-bottom: 10px;
 }
@@ -361,13 +380,10 @@ onMounted(async () => {
   align-items: center;
   gap: 6px;
   color: #7c5cff;
-  font-size: 14px;
-  font-weight: 600;
 }
 
 .distance {
   text-align: center;
-  font-size: 12px;
   color: #888;
   margin-top: 4px;
   margin-bottom: 14px;
@@ -376,7 +392,6 @@ onMounted(async () => {
 /* TEXTO SOB MEDIDA */
 .service-type {
   text-align: center;
-  font-size: 13px;
   margin-top: 14px;
   color: #666;
   line-height: 1.5;
@@ -384,12 +399,10 @@ onMounted(async () => {
 
 .service-type span {
   color: #7c5cff;
-  font-weight: 600;
 }
 
 .highlight-service {
   color: #7c5cff;
-  font-weight: 600;
 }
 
 /* CHIPS */
@@ -406,40 +419,19 @@ onMounted(async () => {
   color: #7c5cff;
   padding: 6px 16px;
   border-radius: 999px;
-  font-size: 12px;
-  font-weight: 600;
   background: white;
 }
 
-/* INFO TITLE */
-.gradient-diarista {
-  text-align: center;
-  font-weight: 700;
-  color: #7c5cff;
-  margin-top: 18px;
-  font-size: 14px;
-}
 
 /* DESCRIÇÃO */
 .description-box {
   text-align: center;
-  font-size: 13px;
   color: #666;
   margin: 12px 0 24px;
   line-height: 1.5;
   padding: 0 10px;
 }
 
-/* BOTÃO */
-.accept-btn {
-  width: 100%;
-  height: 52px;
-  border-radius: 28px;
-  background: linear-gradient(90deg, #7c5cff, #9f7aea);
-  color: white;
-  font-weight: 600;
-  font-size: 15px;
-}
 
 /* ALERTA */
 .alert-box {
@@ -447,7 +439,6 @@ onMounted(async () => {
   background: #e9f0ff;
   padding: 12px;
   border-radius: 14px;
-  font-size: 12px;
   text-align: center;
   color: #5c6b8a;
 

+ 2 - 4
src/pages/opportunities/components/OpportunityDialog.vue

@@ -7,7 +7,7 @@
     <q-icon name="warning" size="36px" class="icon" />
 
     <!-- TEXTO -->
-    <div class="text">
+    <div class="text font14">
       {{ $t('provider.dashboard.opportunities_dialog.message') }}
     </div>
 
@@ -15,7 +15,7 @@
     <q-btn
       :label="$t('provider.dashboard.opportunities_dialog.close')"
       no-caps
-      class="btn"
+      class="btn font14 fontsemibold"
       @click="goBack"
     />
 
@@ -75,7 +75,6 @@ function goBack () {
 
 /* texto */
 .text {
-  font-size: 13px;
   color: #666;
   line-height: 1.5;
   margin-bottom: 20px;
@@ -88,6 +87,5 @@ function goBack () {
   border-radius: 24px;
   background: linear-gradient(90deg, #7c5cff, #9f7aea);
   color: white;
-  font-weight: 600;
 }
 </style>

+ 22 - 61
src/pages/payments/PaymentsPage.vue

@@ -2,7 +2,7 @@
   <q-page class="bg-page q-pb-xl">
     <div class="payments-header row items-center bg-white">
       <q-space />
-      <span class="text-subtitle1 text-weight-bold gradient-diarista">{{ $t('provider.payments.title') }}</span>
+      <span class="gradient-diarista font16 fontbold">{{ $t('provider.payments.title') }}</span>
       <q-space />
     </div>
 
@@ -11,7 +11,7 @@
         <q-card-section class="q-pa-md">
           <div class="row items-center no-wrap">
             <q-icon name="mdi-currency-usd" size="22px" color="white" class="q-mr-sm" />
-            <span class="text-body1 text-weight-bold text-white">{{ $t('provider.payments.total_earnings_title') }}</span>
+            <span class="text-white font16 fontbold">{{ $t('provider.payments.total_earnings_title') }}</span>
             <q-space />
             <q-icon
               :name="earningsExpanded ? 'mdi-chevron-up' : 'mdi-chevron-down'"
@@ -25,10 +25,10 @@
           <div v-show="earningsExpanded" @click.stop>
             <q-separator color="white" style="opacity: 0.2;" />
             <q-card-section class="q-pa-md">
-              <div class="earnings-value text-white">
+              <div class="earnings-value font28 fontbold text-white">
                 {{ formatCurrency(earningsByPeriod[selectedPeriod].value) }}
               </div>
-              <div class="earnings-count text-white q-mb-md">
+              <div class="earnings-count font12 text-white q-mb-md">
                 {{ $t('provider.payments.total_earnings_count', { count: earningsByPeriod[selectedPeriod].count }) }}
               </div>
 
@@ -44,12 +44,11 @@
                   :color="selectedPeriod === period.key ? 'white' : undefined"
                   :text-color="selectedPeriod === period.key ? 'primary' : 'white'"
                   :label="$t(period.labelKey)"
-                  class="period-btn"
                   @click.stop="selectedPeriod = period.key"
                 />
               </div>
 
-              <div class="text-caption text-white" style="opacity: 0.8;">
+              <div class="text-white font12" style="opacity: 0.8;">
                 {{ $t('provider.payments.total_earnings_days', { days: periodDays[selectedPeriod] }) }}
               </div>
             </q-card-section>
@@ -63,21 +62,21 @@
         <q-card-section class="q-pa-md">
           <div class="row items-center no-wrap q-mb-xs">
             <div class="col">
-              <div class="text-caption text-grey-6 text-weight-bold">{{ $t('provider.payments.available_balance_label') }}</div>
-              <div class="balance-value text-secondary">{{ formatCurrency(saldoDisponivel) }}</div>
+              <div class="text-grey-6 font12 fontbold">{{ $t('provider.payments.available_balance_label') }}</div>
+              <div class="balance-value fontbold text-secondary">{{ formatCurrency(saldoDisponivel) }}</div>
             </div>
             <q-btn
               unelevated
               no-caps
               color="secondary"
-              class="btn-withdraw"
+              class="btn-withdraw font13 fontbold"
               :label="$t('provider.payments.btn_withdraw')"
               :loading="withdrawLoading"
               :disable="saldoDisponivel <= 0 || withdrawLoading"
               @click="onSacar"
             />
           </div>
-          <div class="text-caption text-grey-6">
+          <div class="text-grey-6 font12">
             {{ $t('provider.payments.available_balance_prefix') }}
             <strong>{{ $t('provider.payments.available_balance_highlight') }}</strong>
           </div>
@@ -90,9 +89,9 @@
         <q-card-section class="q-pa-md">
           <div class="row items-center no-wrap">
             <div class="col">
-              <div class="text-caption text-white">{{ $t('provider.payments.pending_balance_label') }}</div>
-              <div class="balance-value text-white">{{ formatCurrency(saldoALiberar) }}</div>
-              <div class="text-caption text-white q-mt-xs" style="opacity: 0.85;">
+              <div class="text-white font12">{{ $t('provider.payments.pending_balance_label') }}</div>
+              <div class="balance-value fontbold text-white">{{ formatCurrency(saldoALiberar) }}</div>
+              <div class="text-white font12 q-mt-xs" style="opacity: 0.85;">
                 {{ $t('provider.payments.pending_balance_desc') }}
               </div>
             </div>
@@ -104,7 +103,7 @@
 
     <div class="q-mx-md q-mt-md">
       <div class="row items-center no-wrap q-mb-sm">
-        <span class="section-title gradient-diarista">{{ $t('provider.payments.services_title') }}</span>
+        <span class="section-title font16 fontbold gradient-diarista">{{ $t('provider.payments.services_title') }}</span>
         <q-space />
         <q-btn
           flat
@@ -130,17 +129,17 @@
             <div class="row no-wrap items-start q-gutter-x-sm">
               <q-avatar size="44px">
                 <img v-if="item.client_photo" :src="item.client_photo" style="object-fit:cover" />
-              <span v-else class="text-weight-bold full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="font-size:13px;border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
+              <span v-else class="full-width full-height flex flex-center" :style="avatarColors[item.id % avatarColors.length]" style="border-radius:50%">{{ item.client_name?.slice(0,2).toUpperCase() ?? '??' }}</span>
               </q-avatar>
 
               <div class="col column">
-                <span class="text-name ellipsis">{{ item.client_name }}</span>
-                <div class="text-date-regular">
-                  <span class="text-date-bold">{{ $t('provider.payments.services_date_service') }}</span>
+                <span class="text-name font13 fontbold ellipsis">{{ item.client_name }}</span>
+                <div class="">
+                  <span class="">{{ $t('provider.payments.services_date_service') }}</span>
                   {{ ' ' + item.date }}
                 </div>
-                <div class="text-date-regular">
-                  <span class="text-date-bold">{{ $t('provider.payments.services_date_payment') }}</span>
+                <div class="">
+                  <span class="">{{ $t('provider.payments.services_date_payment') }}</span>
                   {{ ' ' + item.payment_date }}
                 </div>
               </div>
@@ -152,10 +151,10 @@
                   :color="payStatusBgColor(item.payment_status)"
                   :text-color="payStatusTextColor(item.payment_status)"
                   :label="payStatusLabel(item.payment_status)"
-                  class="status-chip"
+                  class="status-chip font11 fontbold"
                 />
-                <span class="text-price">{{ formatCurrency(item.total_amount) }}</span>
-                <span class="text-period">{{ item.period_label }}</span>
+                <span class="text-price font13 fontbold">{{ formatCurrency(item.total_amount) }}</span>
+                <span class="text-period font10">{{ item.period_label }}</span>
               </div>
             </div>
           </q-card-section>
@@ -407,37 +406,23 @@ onMounted(() => {
 }
 
 .earnings-value {
-  font-size: 28px;
-  font-weight: 700;
   line-height: 1.2;
 }
 
 .earnings-count {
-  font-size: 12px;
   opacity: 0.9;
 }
 
 .balance-value {
-  font-size: 20px;
-  font-weight: 700;
   line-height: 1.2;
 }
 
 .btn-withdraw {
   border-radius: 8px !important;
-  font-size: 13px;
-  font-weight: 700;
   padding: 6px 18px;
 }
 
-.period-btn {
-  font-size: 12px;
-  font-weight: 600;
-}
-
 .text-name {
-  font-size: 13px;
-  font-weight: 700;
   color: #3a3a4a;
   max-width: 130px;
   overflow: hidden;
@@ -445,43 +430,19 @@ onMounted(() => {
   white-space: nowrap;
 }
 
-.text-date-bold {
-  font-family: 'Inter', sans-serif;
-  font-size: 11px;
-  font-weight: 700;
-  color: #3a3a4a;
-}
-
-.text-date-regular {
-  font-family: 'Inter', sans-serif;
-  font-size: 11px;
-  font-weight: 400;
-  color: #666;
-}
-
 .text-price {
-  font-size: 13px;
-  font-weight: 700;
   color: #3a3a4a;
   white-space: nowrap;
 }
 
 .text-period {
-  font-size: 10px;
   color: #888;
   text-align: right;
   white-space: nowrap;
 }
 
 .status-chip {
-  font-size: 11px !important;
-  font-weight: 700;
   height: auto;
   padding: 2px 2px;
 }
-
-.section-title {
-  font-size: 15px;
-  font-weight: 700;
-}
 </style>

+ 20 - 34
src/pages/profile/ProfileEditDialog.vue

@@ -4,7 +4,7 @@
       <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile">
         <q-btn flat round dense icon="mdi-chevron-left" color="primary" @click="onDialogCancel" />
         <q-space />
-        <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.edit_data') }}</span>
+        <span class="font16 fontbold gradient-diarista">{{ $t('profile.edit_data') }}</span>
         <q-space />
         <div style="width: 32px"></div>
       </div>
@@ -16,15 +16,16 @@
       <template v-else>
         <q-scroll-area class="col" style="height: calc(100vh - 72px)">
           <div class="column items-center q-mt-xl q-mb-md">
-            <q-avatar size="140px" color="indigo-1" text-color="indigo-4" class="text-weight-bold text-h2 shadow-1">
-              {{ form.name ? form.name.charAt(0).toUpperCase() : '' }}
+            <q-avatar size="140px" class="shadow-1" :style="!profilePhoto ? avatarStyle : undefined">
+              <img v-if="profilePhoto" :src="profilePhoto" style="object-fit:cover;width:100%;height:100%;border-radius:50%" />
+              <span v-else style="color: #7a154f">{{ form.name ? form.name.slice(0, 2).toUpperCase() : '' }}</span>
             </q-avatar>
-            <q-btn flat no-caps color="grey-6" class="q-mt-sm" :label="$t('profile.change_photo')" />
+            <q-btn flat no-caps color="grey-6" class="q-mt-sm font12 fontregular" :label="$t('profile.change_photo')" />
           </div>
 
           <div class="q-px-xl q-gutter-y-lg">
             <div>
-              <div class="text-weight-bold text-grey-8 q-mb-sm">{{ $t('profile.full_name') }}</div>
+              <div class="text-grey-8 q-mb-sm font12 fontbold">{{ $t('profile.full_name') }}</div>
               <q-input
                 v-model="form.name"
                 outlined
@@ -35,7 +36,7 @@
             </div>
 
             <div>
-              <div class="text-weight-bold text-grey-8 q-mb-sm">{{ $t('profile.email') }}</div>
+              <div class="text-grey-8 q-mb-sm font12 fontbold">{{ $t('profile.email') }}</div>
               <q-input
                 v-model="form.email"
                 outlined
@@ -46,7 +47,7 @@
             </div>
 
             <div>
-              <div class="text-weight-bold text-grey-8 q-mb-sm">{{ $t('profile.phone') }}</div>
+              <div class="text-grey-8 q-mb-sm font12 fontbold">{{ $t('profile.phone') }}</div>
               <q-input
                 v-model="form.phone"
                 outlined
@@ -57,24 +58,17 @@
                 :placeholder="$t('profile.placeholder_phone')"
               />
             </div>
-
-            <div>
-              <div class="text-weight-bold text-grey-8 q-mb-sm">{{ $t('profile.language') }}</div>
-              <div class="row q-gutter-x-md">
-                <q-radio v-model="selectedLocale" val="pt" :label="$t('profile.lang_pt')" color="primary" class="text-text" keep-color @update:model-value="onLocaleChange" />
-                <q-radio v-model="selectedLocale" val="en" :label="$t('profile.lang_en')" color="primary" class="text-text" keep-color @update:model-value="onLocaleChange" />
-                <q-radio v-model="selectedLocale" val="es" :label="$t('profile.lang_es')" color="primary" class="text-text" keep-color @update:model-value="onLocaleChange" />
-              </div>
-            </div>
           </div>
 
+          <q-space/>
+
           <div class="q-pa-xl q-mt-md">
             <q-btn
               unelevated
               rounded
               no-caps
               padding="8px 16px"
-              class="full-width q-py-md text-weight-bold"
+              class="full-width q-py-md"
               :label="$t('profile.update')"
               :color="hasUpdatedFields ? 'primary' : 'grey-4'"
               :disable="!hasUpdatedFields"
@@ -90,10 +84,16 @@
 
 <script setup>
 import { ref, onMounted } from 'vue';
-import { useDialogPluginComponent, Cookies } from 'quasar';
+import { useDialogPluginComponent } from 'quasar';
 import { updateUser } from 'src/api/user';
 import { useFormUpdateTracker } from 'src/composables/useFormUpdateTracker';
-import { i18n } from 'src/boot/i18n';
+
+const avatarStyle = {
+  background: 'linear-gradient(135deg, #ffd7e8 0%, #ff9acc 100%)',
+  color: '#7a154f',
+};
+
+const profilePhoto = ref(null);
 
 const props = defineProps({
   userData: {
@@ -109,21 +109,6 @@ const loading = ref(false);
 const submitting = ref(false);
 const userId = ref(null);
 
-const normalizeLocale = (loc) => {
-  if (!loc) return 'pt'
-  const l = String(loc).toLowerCase()
-  if (l.startsWith('pt')) return 'pt'
-  if (l.startsWith('en')) return 'en'
-  if (l.startsWith('es')) return 'es'
-  return 'pt'
-}
-const selectedLocale = ref(normalizeLocale(i18n.global.locale.value ?? i18n.global.locale))
-
-const onLocaleChange = (val) => {
-  i18n.global.locale.value = val
-  Cookies.set('locale', val, { expires: 365, path: '/' })
-}
-
 const { form, hasUpdatedFields, setUpdateFormAsOriginal } = useFormUpdateTracker({
   name: '',
   email: '',
@@ -157,6 +142,7 @@ onMounted(async () => {
     form.name = data.name || '';
     form.email = data.email || '';
     form.phone = data.phone || '';
+    profilePhoto.value = data.profile_photo || null;
     setUpdateFormAsOriginal(data);
     return;
   }

+ 27 - 44
src/pages/profile/ProfilePage.vue

@@ -3,7 +3,7 @@
   <q-page class="bg-page q-pb-xl">
     <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile">
       <q-space />
-      <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.title') }}</span>
+      <span class="font16 fontbold gradient-diarista">{{ $t('profile.title') }}</span>
       <q-space />
     </div>
 
@@ -12,14 +12,14 @@
         <q-btn flat round dense icon="mdi-share-variant-outline" color="grey-6" class="absolute-top-right q-ma-sm" />
         
         <q-card-section class="column items-center q-pb-md">
-          <q-avatar size="70px" class="shadow-card">
-            <img v-if="user.provider?.profile_media?.url" :src="user.provider.profile_media.url" style="object-fit:cover">
-            <q-icon v-else name="mdi-account-circle" size="70px" color="grey-4" />
+          <q-avatar size="70px" class="shadow-card" :style="!user.profile_photo ? avatarStyle : undefined">
+            <img v-if="user.profile_photo" :src="user.profile_photo" style="object-fit:cover;width:100%;height:100%;border-radius:50%" />
+            <span v-else class="font16 fontbold ">{{ user.name ? user.name.slice(0, 2).toUpperCase() : '??' }}</span>
           </q-avatar>
           
-          <div class="fonte-nome-profile text-weight-bold q-mt-md text-dark">{{ user.name || '—' }}</div>
-          <div class="fonte-email-profile text-grey-6 q-my-sm">{{ user.email || '—' }}</div>
-          <div class="fonte-telefone-profile text-grey-7">{{ user.phone || '—' }}</div> 
+          <div class="fonte-nome-profile font16 fontbold q-mt-md text-text">{{ user.name || '—' }}</div>
+          <div class="fonte-email-profile font9 fontmedium text-grey-6 q-my-sm">{{ user.email || '—' }}</div>
+          <div class="fonte-telefone-profile font9 fontmedium text-grey-7">{{ user.phone || '—' }}</div> 
           
           <q-btn 
             outline 
@@ -29,8 +29,8 @@
             @click="openEditProfile"
           >
             <div class="row items-center q-gutter-x-sm">
-              <q-icon name="mdi-account-outline" size="18px" />
-              <span class="text-weight-medium">{{ $t('profile.edit_profile') }}</span>
+              <q-icon name="mdi-account-outline" size="16px" />
+              <span class="font9 fontbold">{{ $t('profile.edit_profile') }}</span>
             </div>
           </q-btn>
         </q-card-section>
@@ -40,8 +40,8 @@
     <div class="q-mt-md q-px-md column">
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openBankDataDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.bank_data.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.bank_data.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.bank_data.title') }}</span>
+          <span class="font12 fontregular text-text">{{ $t('profile.bank_data.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -49,8 +49,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openAvailabilityDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.availability.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.availability.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.availability.title') }}</span>
+          <span class="font12 fontregular text-text">{{ $t('profile.availability.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -58,8 +58,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openServiceDataDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.service_data.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.service_data.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.service_data.title') }}</span>
+          <span class="font12 fontregular text-text">{{ $t('profile.service_data.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -67,8 +67,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openAddressDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.address.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.address.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.address.title') }}</span>
+          <span class="font12 fontregular text-text">{{ $t('profile.address.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -76,8 +76,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openHelpDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.help.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.help.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.help.title') }}</span>
+          <span class="font12 fontregular menu-description text-text">{{ $t('profile.help.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -85,8 +85,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openPrivacyDialog">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.privacy.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.privacy.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.privacy.title') }}</span>
+          <span class="font12 fontregular menu-description text-text">{{ $t('profile.privacy.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -94,8 +94,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openPrivacyPolicy">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.privacy_policy.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.privacy_policy.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.privacy_policy.title') }}</span>
+          <span class="font12 fontregular menu-description text-text">{{ $t('profile.privacy_policy.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -103,8 +103,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openSupportPage">
         <div class="column">
-          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.support_page.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.support_page.description') }}</span>
+          <span class="font16 fontbold menu-title gradient-diarista">{{ $t('profile.support_page.title') }}</span>
+          <span class="font12 fontregular menu-description text-text">{{ $t('profile.support_page.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -114,8 +114,8 @@
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="logOutPrestador">
         <div class="column">
-          <span class="menu-title text-weight-bold text-text">{{ $t('profile.logout.title') }}</span>
-          <span class="menu-description text-text">{{ $t('profile.logout.description') }}</span>
+          <span class="font16 fontbold menu-title text-text">{{ $t('profile.logout.title') }}</span>
+          <span class="font12 fontregular text-text">{{ $t('profile.logout.description') }}</span>
         </div>
         <q-space/>
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
@@ -239,7 +239,6 @@ onMounted(async () => {
 }
 
 .menu-title {
-  font-size: 18px;
   line-height: 1.4;
 }
 
@@ -251,33 +250,17 @@ onMounted(async () => {
   flex: 1;
 }
 
-.text-dark {
-  color: #2c3e50;
-}
-
 .fonte-email-profile {
-  font-family: Inter;
-  font-weight: 500;
-  font-style: Medium;
-  font-size: 12px;
   line-height: 100%;
   letter-spacing: 0%;
 }
 
 .fonte-telefone-profile {
-  font-family: Inter;
-  font-weight: 500;
-  font-style: Medium;
-  font-size: 12px;
   line-height: 100%;
   letter-spacing: 0%;
 }
 
 .fonte-nome-profile {
-  font-family: Inter;
-  font-weight: 700;
-  font-style: Bold;
-  font-size: 18px;
   line-height: 100%;
   letter-spacing: 0%;
   text-align: center;