Index: ReserveNGo-frontend/src/Api_Classes/HttpClient.js
===================================================================
--- ReserveNGo-frontend/src/Api_Classes/HttpClient.js	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/Api_Classes/HttpClient.js	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -12,5 +12,9 @@
     const url = new URL(endpoint)
     if (queryParams) {
-      Object.entries(queryParams).forEach(([k, v]) => url.searchParams.append(k, v))
+      Object.entries(queryParams).forEach(([k, v]) => {
+        if (v !== undefined && v !== null && v !== '') {
+          url.searchParams.append(k, String(v))
+        }
+      })
     }
 
Index: ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/components/Project/Event/events_carousel.vue	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -104,4 +104,8 @@
 
     getImageLogo(imageLogo) {
+      if (!imageLogo) {
+        return noImg
+      }
+
       try {
         const url = new URL(imageLogo, config.API_BASE_URL)
@@ -110,5 +114,5 @@
         return config.API_BASE_URL + imageLogo
       }
-    },
+    }
   },
 
Index: ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/home_.vue	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -4,5 +4,5 @@
 import SearchFilterPanel from '@/components/Project/Restaurant/search_filter_panel.vue'
 import Events_carousel from '@/components/Project/Event/events_carousel.vue'
-import { transformArray } from '@/mixins/utilFunctions.js'
+
 import { useEvents } from '@/repository/Events.ts'
 import { useLocales } from '@/repository/Locale.ts'
@@ -19,75 +19,104 @@
   data() {
     return {
-      allEvents: [],
-      allEventsRaw: [],
       locals: [],
+      events: [],
       activeView: 'locals',
-      favouriteEvents: [],
+
+      localPage: 0,
+      localTotalPages: 0,
+      eventPage: 0,
+      eventTotalPages: 0,
+      pageSize: 5,
+
+      /* filters */
+      lastSearch: '',
+      lastSortBy: 'name',
+      lastDirection: 'asc',
+
+      lastIsOpen: null,
+      lastLocalType: null,
+      lastServices: [],
+
+      lastEventStatus: null,
+      lastEventType: null,
     }
   },
 
   methods: {
-    sendSearchQuery(searchQuery, sortBy, directions, isOpen) {
+    /* ===================== LOCALS ===================== */
+    fetchLocals(page = 0) {
+      useLocales
+        .getLocals({
+          name: this.lastSearch,
+          sortBy: this.lastSortBy,
+          direction: this.lastDirection,
+          isOpen: this.lastIsOpen,
+          localType: this.lastLocalType,
+          services: this.lastServices,
+          page,
+          size: this.pageSize,
+        })
+        .then((data) => {
+          this.locals = data.locals
+          this.localPage = data.currentPage
+          this.localTotalPages = data.totalPages
+        })
+    },
+
+    /* ===================== EVENTS ===================== */
+    fetchEvents(page = 0) {
+      useEvents
+        .getEvents({
+          name: this.lastSearch,
+          sortBy: this.lastSortBy,
+          direction: this.lastDirection,
+          eventStatus: this.lastEventStatus,
+          eventType: this.lastEventType,
+          page,
+          size: this.pageSize,
+        })
+        .then((data) => {
+          this.events = data.events
+          this.eventPage = data.currentPage
+          this.eventTotalPages = data.totalPages
+        })
+    },
+
+    /* ===================== SEARCH / FILTER ===================== */
+    sendSearchQuery(payload) {
+      this.lastSearch = payload.name || ''
+      this.lastSortBy = payload.sortBy || 'name'
+      this.lastDirection = payload.direction || 'asc'
+
       if (this.activeView === 'locals') {
-        useLocales
-          .getLocals(searchQuery, sortBy, directions, isOpen)
-          .then((data) => {
-            this.locals = data.locals
-          })
-          .catch((err) => console.log('The locals are not being caught.', err))
+        this.lastIsOpen = payload.isOpen
+        this.lastLocalType = payload.localType
+        this.lastServices = payload.services || []
+
+        this.localPage = 0
+        this.fetchLocals(0)
       } else {
-        this.filterEvents(searchQuery, sortBy, directions)
-      }
-    },
-
-    filterEvents(searchQuery, sortBy, directions) {
-      let filteredEvents = [...this.allEventsRaw]
-
-      if (searchQuery) {
-        const query = searchQuery.toLowerCase()
-        filteredEvents = filteredEvents.filter(
-          (event) =>
-            (event.title && event.title.toLowerCase().includes(query)) ||
-            (event.name && event.name.toLowerCase().includes(query)) ||
-            (event.description && event.description.toLowerCase().includes(query)) ||
-            (event.location && event.location.toLowerCase().includes(query)),
-        )
-      }
-
-      if (sortBy) {
-        filteredEvents.sort((a, b) => {
-          let compareA, compareB
-
-          switch (sortBy) {
-            case 'name':
-              compareA = (a.title || a.name || '').toLowerCase()
-              compareB = (b.title || b.name || '').toLowerCase()
-              return directions === 'desc'
-                ? compareB.localeCompare(compareA)
-                : compareA.localeCompare(compareB)
-
-            case 'date':
-              compareA = new Date(a.date || 0)
-              compareB = new Date(b.date || 0)
-              return directions === 'desc' ? compareB - compareA : compareA - compareB
-
-            case 'newest':
-              compareA = new Date(a.createdAt || a.date || 0)
-              compareB = new Date(b.createdAt || b.date || 0)
-              return compareB - compareA
-
-            default:
-              return 0
-          }
-        })
-      }
-
-      this.allEvents = transformArray(filteredEvents, 3)
+        this.lastEventStatus = payload.eventStatus
+        this.lastEventType = payload.eventType
+
+        this.eventPage = 0
+        this.fetchEvents(0)
+      }
     },
 
     setActiveView(view) {
       this.activeView = view
-    },
-
+
+      // Load data if switching view and a list is empty
+      if (view === 'locals' && this.locals.length === 0) {
+        this.fetchLocals(this.localPage)
+      }
+
+      if (view === 'events' && this.events.length === 0) {
+        this.fetchEvents(this.eventPage)
+      }
+    },
+
+    /* ===================== FAVOURITES ===================== */
     async loadFavouriteEvents() {
       try {
@@ -111,18 +140,11 @@
             this.favouriteEvents = this.favouriteEvents.filter((fav) => fav.id !== id)
           } else {
-            const event = this.allEventsRaw.find((e) => e.id === id)
+            const event = this.events.find((e) => e.id === id)
             if (event) {
               this.favouriteEvents.push(event)
-            } else {
-              this.loadFavouriteEvents()
             }
           }
         })
-        .catch((err) => {
-          console.log('Error toggling favourite:', err)
-          if (err.message && err.message.includes('409')) {
-            this.loadFavouriteEvents()
-          }
-        })
+        .catch((err) => console.log('Error toggling favourite:', err))
     },
   },
@@ -130,19 +152,6 @@
   beforeMount() {
     this.loadFavouriteEvents()
-
-    useEvents
-      .listAll()
-      .then((data) => {
-        this.allEventsRaw = data.events
-        this.allEvents = transformArray(data.events, 3)
-      })
-      .catch((error) => console.log('Failed fetching events', error))
-
-    useLocales
-      .getLocals()
-      .then((data) => {
-        this.locals = data.locals
-      })
-      .catch((err) => console.log('The locals are not being caught.', err))
+    this.fetchLocals(0)
+    this.fetchEvents(0)
   },
 }
@@ -153,12 +162,15 @@
     <div class="container-fluid px-0">
       <div class="row justify-content-center">
+        <!-- SEARCH -->
         <SearchFilterPanel :activeView="activeView" @search-query-sent="sendSearchQuery" />
 
+        <!-- EVENTS CAROUSEL (NOT PAGED) -->
         <div class="col-12 events-section-wrapper">
           <div class="container">
-            <Events_carousel :all-events="allEvents" />
+            <Events_carousel :all-events="events" />
           </div>
         </div>
 
+        <!-- VIEW TOGGLE -->
         <div class="col-md-8">
           <div class="navigation-toggle">
@@ -178,12 +190,62 @@
         </div>
 
+        <!-- LISTING -->
         <div class="col-md-8 listing-column">
           <Locale_listing_container v-if="activeView === 'locals'" :locals="locals" mode="all" />
+
           <Event_listing_container
             v-else
-            :events="allEvents"
+            :events="events"
             :favouriteEvents="favouriteEvents"
             @toggle-favourite="toggleFavouriteEvent"
           />
+
+          <!-- ===================== PAGINATION ===================== -->
+          <div
+            v-if="activeView === 'locals' && localTotalPages > 1"
+            class="d-flex justify-content-center align-items-center mt-4 gap-2"
+          >
+            <button
+              class="btn btn-outline-secondary"
+              :disabled="localPage === 0"
+              @click="fetchLocals(localPage - 1)"
+            >
+              Prev
+            </button>
+
+            <span>Page {{ localPage + 1 }} of {{ localTotalPages }}</span>
+
+            <button
+              class="btn btn-outline-secondary"
+              :disabled="localPage >= localTotalPages - 1"
+              @click="fetchLocals(localPage + 1)"
+            >
+              Next
+            </button>
+          </div>
+
+          <div
+            v-if="activeView === 'events' && eventTotalPages > 1"
+            class="d-flex justify-content-center align-items-center mt-4 gap-2"
+          >
+            <button
+              class="btn btn-outline-secondary"
+              :disabled="eventPage === 0"
+              @click="fetchEvents(eventPage - 1)"
+            >
+              Prev
+            </button>
+
+            <span>Page {{ eventPage + 1 }} of {{ eventTotalPages }}</span>
+
+            <button
+              class="btn btn-outline-secondary"
+              :disabled="eventPage >= eventTotalPages - 1"
+              @click="fetchEvents(eventPage + 1)"
+            >
+              Next
+            </button>
+          </div>
+          <!-- ===================== END PAGINATION ===================== -->
         </div>
       </div>
@@ -223,15 +285,8 @@
 }
 
-.nav-btn:hover {
-  background-color: #f8f9fa;
-  border-color: #5ea5bc;
-  color: #5ea5bc;
-}
-
 .nav-btn.active {
   background-color: #5ea5bc;
   border-color: #5ea5bc;
   color: #fff;
-  box-shadow: 0 2px 8px rgba(94, 165, 188, 0.3);
 }
 
Index: ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/components/Project/Restaurant/search_filter_panel.vue	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -9,140 +9,224 @@
 })
 
-const selectedFilters = ref<string[]>([])
-
-const localeFilterOptions = {
-  'Open Now': 'isOpen',
-  'Top Rated': 'rating',
-  Nearby: 'distance',
-}
-
-const eventFilterOptions = {
-  Upcoming: 'upcoming',
-  'This Week': 'thisWeek',
-  'This Month': 'thisMonth',
-}
-
-const localeSortOptions = [
-  { value: '', text: 'Sort by' },
-  { value: 'name,asc', text: 'Name (A-Z)' },
-  { value: 'name,desc', text: 'Name (Z-A)' },
-  { value: 'rating', text: 'Rating' },
-  { value: 'newest', text: 'Newest' },
+/* ===================== STATE ===================== */
+const searchInput = ref('')
+const sortQuery = ref('')
+
+/* Locals */
+const isOpen = ref(false)
+const localType = ref<string | null>(null)
+const services = ref<string[]>([])
+
+/* Events */
+const eventStatus = ref<string | null>(null)
+const eventType = ref<string | null>(null)
+
+/* ===================== OPTIONS ===================== */
+const localSortOptions = [
+  { value: 'name,asc', text: 'Name (A–Z)' },
+  { value: 'name,desc', text: 'Name (Z–A)' },
+  { value: 'rating,desc', text: 'Highest rating' },
+  { value: 'createdAt,desc', text: 'Newest' },
 ]
 
 const eventSortOptions = [
-  { value: '', text: 'Sort by' },
-  { value: 'name,asc', text: 'Name (A-Z)' },
-  { value: 'name,desc', text: 'Name (Z-A)' },
-  { value: 'date,asc', text: 'Date (Soonest)' },
-  { value: 'date,desc', text: 'Date (Latest)' },
-  { value: 'newest', text: 'Newest' },
-]
-
-const filterOptions = computed(() =>
-  props.activeView === 'locals' ? localeFilterOptions : eventFilterOptions,
+  { value: 'name,asc', text: 'Name (A–Z)' },
+  { value: 'name,desc', text: 'Name (Z–A)' },
+  { value: 'createdAt,desc', text: 'Newest' },
+]
+
+const localTypes = [
+  { value: 'RESTAURANT', label: 'Restaurant' },
+  { value: 'CAFE', label: 'Café' },
+  { value: 'BAR', label: 'Bar' },
+  { value: 'PUB', label: 'Pub' },
+  { value: 'BISTRO', label: 'Bistro' },
+  { value: 'FOOD_TRUCK', label: 'Food truck' },
+  { value: 'BUFFET', label: 'Buffet' },
+  { value: 'FAST_FOOD', label: 'Fast food' },
+  { value: 'LOUNGE', label: 'Lounge' },
+  { value: 'DELI', label: 'Deli' },
+]
+
+const serviceOptions = [
+  { value: 'WIFI', label: 'Wi-Fi' },
+  { value: 'PET_FRIENDLY', label: 'Pet friendly' },
+  { value: 'PARKING', label: 'Parking' },
+  { value: 'OUTDOOR', label: 'Outdoor seating' },
+  { value: 'INDOOR', label: 'Indoor seating' },
+  { value: 'PLAYGROUND', label: 'Playground' },
+  { value: 'VEGAN_FRIENDLY', label: 'Vegan friendly' },
+  { value: 'VEGETARIAN_FRIENDLY', label: 'Vegetarian friendly' },
+  { value: 'GLUTEN_FREE_FRIENDLY', label: 'Gluten-free friendly' },
+  { value: 'FAMILY_KIDS_FRIENDLY', label: 'Family & kids friendly' },
+  { value: 'SMOKING_FRIENDLY', label: 'Smoking friendly' },
+]
+
+const eventStatuses = [
+  { value: 'UPCOMING', label: 'Upcoming' },
+  { value: 'ACTIVE', label: 'Active' },
+  { value: 'FINISHED', label: 'Finished' },
+]
+
+const eventTypes = [
+  { value: 'LIVE_MUSIC', label: 'Live music' },
+  { value: 'DJ_NIGHT', label: 'DJ night' },
+  { value: 'FOOD_SPECIAL', label: 'Food special' },
+  { value: 'DRINK_SPECIAL', label: 'Drink special' },
+  { value: 'HAPPY_HOUR', label: 'Happy hour' },
+  { value: 'SPORTS_SCREENING', label: 'Sports screening' },
+  { value: 'KARAOKE', label: 'Karaoke' },
+  { value: 'THEME_PARTY', label: 'Theme party' },
+  { value: 'OPEN_MIC', label: 'Open mic' },
+  { value: 'BRUNCH', label: 'Brunch' },
+  { value: 'COOKING_WORKSHOP', label: 'Cooking workshop' },
+  { value: 'ART_EXHIBITION', label: 'Art exhibition' },
+  { value: 'COMEDY_SHOW', label: 'Comedy show' },
+  { value: 'GAME_NIGHT', label: 'Game night' },
+  { value: 'PRIVATE_EVENT', label: 'Private event' },
+  { value: 'SEASONAL_EVENT', label: 'Seasonal event' },
+]
+
+const sortOptions = computed(() =>
+  props.activeView === 'locals' ? localSortOptions : eventSortOptions,
 )
 
-const sortOptions = computed(() =>
-  props.activeView === 'locals' ? localeSortOptions : eventSortOptions,
-)
-
-const placeholderText = computed(() =>
-  props.activeView === 'locals' ? 'Search locals...' : 'Search events...',
-)
-
-const sortQuery = ref('')
-const searchInput = ref('')
-
+/* ===================== EMIT ===================== */
+const emit = defineEmits<{ (e: 'searchQuerySent', payload: any): void }>()
 let debounceTimer: number | null = null
-const emit = defineEmits<{
-  (e: 'searchQuerySent', search: string, sort: string, direction: string, filters: any): void
-}>()
-
-watch(
-  () => props.activeView,
-  () => {
-    selectedFilters.value = []
-    sortQuery.value = ''
-    searchInput.value = ''
-  },
-)
-
-watch([searchInput, sortQuery, selectedFilters], (newValues) => {
+
+watch([searchInput, sortQuery, isOpen, localType, services, eventStatus, eventType], () => {
   if (debounceTimer) clearTimeout(debounceTimer)
 
   debounceTimer = window.setTimeout(() => {
-    const [search, sort, filters] = newValues
-    const [sortField, direction = 'asc'] = sort.split(',')
+    const [sortBy, direction = 'asc'] = sortQuery.value.split(',')
 
     if (props.activeView === 'locals') {
-      emit('searchQuerySent', search, sortField, direction, filters.includes('isOpen'))
+      emit('searchQuerySent', {
+        name: searchInput.value,
+        sortBy,
+        direction,
+        isOpen: isOpen.value || null,
+        localType: localType.value,
+        services: services.value,
+      })
     } else {
-      emit('searchQuerySent', search, sortField, direction, filters)
+      emit('searchQuerySent', {
+        name: searchInput.value,
+        sortBy,
+        direction,
+        eventStatus: eventStatus.value,
+        eventType: eventType.value,
+      })
     }
-  }, 400)
+  }, 350)
 })
 </script>
 
+<
 <template>
-  <!-- ✅ STICKY WRAPPER (NOT A BOOTSTRAP COL) -->
   <div class="search-bar-wrapper">
     <div class="container">
       <div class="row justify-content-center">
-        <div class="col-12 col-md-8 search-bar shadow-sm px-3 py-3 mb-5">
+        <!-- ================= FILTER BOX ================= -->
+        <div class="col-12 col-md-10 search-bar shadow-sm px-3 py-3">
           <div class="row g-2 align-items-center">
-            <!-- Search -->
-            <div class="col-12 col-md-6">
+            <!-- SEARCH -->
+            <div class="col-12 col-md-4">
               <input
                 v-model="searchInput"
                 type="text"
                 class="form-control"
-                :placeholder="placeholderText"
+                :placeholder="activeView === 'locals' ? 'Search locals…' : 'Search events…'"
               />
             </div>
 
-            <!-- Sort -->
-            <div class="col-6 col-md-3">
+            <!-- SORT -->
+            <div class="col-6 col-md-2">
               <select v-model="sortQuery" class="form-select">
                 <option disabled value="">Sort by</option>
-                <option v-for="option in sortOptions" :key="option.value" :value="option.value">
-                  {{ option.text }}
+                <option v-for="opt in sortOptions" :key="opt.value" :value="opt.value">
+                  {{ opt.text }}
                 </option>
               </select>
             </div>
 
-            <!-- Filter -->
-            <div class="col-6 col-md-3">
-              <div class="dropdown">
-                <button
-                  class="btn btn-outline-secondary dropdown-toggle w-100"
-                  type="button"
-                  data-bs-toggle="dropdown"
-                >
-                  Filter
-                  <span v-if="selectedFilters.length" class="badge bg-primary ms-1">
-                    {{ selectedFilters.length }}
-                  </span>
-                </button>
-
-                <ul class="dropdown-menu p-2" style="min-width: 200px">
-                  <li v-for="(option, key) in filterOptions" :key="key">
-                    <div class="form-check">
-                      <input
-                        class="form-check-input"
-                        type="checkbox"
-                        :id="option"
-                        :value="option"
-                        v-model="selectedFilters"
-                      />
-                      <label class="form-check-label" :for="option">
-                        {{ key }}
-                      </label>
-                    </div>
-                  </li>
-                </ul>
-              </div>
-            </div>
+            <!-- LOCALS FILTERS -->
+            <template v-if="activeView === 'locals'">
+              <!-- LOCAL TYPE -->
+              <div class="col-6 col-md-3">
+                <select v-model="localType" class="form-select">
+                  <option :value="null">Type</option>
+                  <option v-for="t in localTypes" :key="t.value" :value="t.value">
+                    {{ t.label }}
+                  </option>
+                </select>
+              </div>
+
+              <!-- SERVICES (SAME ROW) -->
+              <div class="col-12 col-md-3">
+                <div class="dropdown w-100">
+                  <button
+                    class="form-select services-select"
+                    type="button"
+                    data-bs-toggle="dropdown"
+                  >
+                    Services
+                    <span v-if="services.length" class="badge bg-primary ms-1">
+                      {{ services.length }}
+                    </span>
+                  </button>
+
+                  <ul class="dropdown-menu p-3 services-dropdown">
+                    <li v-for="s in serviceOptions" :key="s.value">
+                      <div class="form-check">
+                        <input
+                          class="form-check-input"
+                          type="checkbox"
+                          :value="s.value"
+                          v-model="services"
+                        />
+                        <label class="form-check-label">
+                          {{ s.label }}
+                        </label>
+                      </div>
+                    </li>
+                  </ul>
+                </div>
+              </div>
+            </template>
+
+            <!-- EVENTS FILTERS -->
+            <template v-else>
+              <div class="col-6 col-md-3">
+                <select v-model="eventStatus" class="form-select">
+                  <option :value="null">Status</option>
+                  <option v-for="s in eventStatuses" :key="s.value" :value="s.value">
+                    {{ s.label }}
+                  </option>
+                </select>
+              </div>
+
+              <div class="col-6 col-md-3">
+                <select v-model="eventType" class="form-select">
+                  <option :value="null">Type</option>
+                  <option v-for="t in eventTypes" :key="t.value" :value="t.value">
+                    {{ t.label }}
+                  </option>
+                </select>
+              </div>
+            </template>
           </div>
+        </div>
+
+        <!-- ================= OPEN NOW (OUTSIDE BOX) ================= -->
+        <div
+          v-if="activeView === 'locals'"
+          class="col-12 col-md-10 mt-2 d-flex align-items-center gap-2"
+        >
+          <div class="form-check form-switch">
+            <input class="form-check-input open-switch" type="checkbox" v-model="isOpen" />
+          </div>
+          <span class="fw-medium text-success">Open now</span>
         </div>
       </div>
@@ -152,21 +236,39 @@
 
 <style scoped>
-/* ✅ Sticky must live OUTSIDE bootstrap grid */
 .search-bar-wrapper {
   position: sticky;
-  top: 0;          /* 👈 key change */
-  z-index: 900;    /* still below navbar */
-}
-
-/* Actual bar */
+  top: 0;
+  z-index: 900;
+}
+
 .search-bar {
   background-color: #f3f5f8;
-}
-
-/* Badge */
-.badge {
-  font-size: 0.7rem;
-  padding: 0.25rem 0.4rem;
   border-radius: 10px;
 }
+
+/* Services dropdown styled like select */
+.services-select {
+  appearance: none;
+  background-color: #fff;
+  border: 1px solid #ced4da;
+  cursor: pointer;
+  text-align: left;
+}
+
+.services-select:focus {
+  border-color: #86b7fe;
+  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+
+.services-dropdown {
+  min-width: 260px;
+  max-height: 300px;
+  overflow-y: auto;
+}
+
+/* Green switch */
+.open-switch:checked {
+  background-color: #5ea5bc;
+  border-color: #5ea5bc;
+}
 </style>
Index: ReserveNGo-frontend/src/components/Project/StaticPages/AboutUs.vue
===================================================================
--- ReserveNGo-frontend/src/components/Project/StaticPages/AboutUs.vue	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/components/Project/StaticPages/AboutUs.vue	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -256,11 +256,4 @@
 
 /* stats */
-.stats .stat {
-  min-width: 72px;
-}
-.stat-value {
-  font-weight: 700;
-  font-size: 1.1rem;
-}
 
 /* features / roles */
@@ -291,15 +284,6 @@
 }
 
-/* callout */
-.callout {
-  border-left: 4px solid #5ea5bc;
-}
-
 /* small responsiveness */
 @media (max-width: 768px) {
-  .stats {
-    justify-content: space-between;
-    width: 100%;
-  }
   .hero .card-body {
     gap: 1rem;
Index: ReserveNGo-frontend/src/repository/Events.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Events.ts	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/repository/Events.ts	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -11,6 +11,26 @@
   }
 
-  listAll(): Promise<any> {
-    return this.httpClient.get()
+  getEvents(params: {
+    localId?: number
+    name?: string
+    eventType?: string
+    eventStatus?: string
+    sortBy?: string
+    direction?: string
+    page?: number
+    size?: number
+  }) {
+    return this.httpClient.get('', {
+      queryParams: {
+        localId: params.localId,
+        name: params.name,
+        eventType: params.eventType,
+        eventStatus: params.eventStatus,
+        sortBy: params.sortBy,
+        direction: params.direction,
+        page: params.page ?? 0,
+        size: params.size ?? 10,
+      },
+    })
   }
 }
Index: ReserveNGo-frontend/src/repository/Locale.ts
===================================================================
--- ReserveNGo-frontend/src/repository/Locale.ts	(revision 2bbbe73e207cbd8a8655d0a7ffc9133bf0f39a8d)
+++ ReserveNGo-frontend/src/repository/Locale.ts	(revision 8cef9e57a5e71205951552cc01ae2037e4dcce2d)
@@ -11,9 +11,24 @@
   }
 
-  getLocals(name?: string, sortBy?: string, direction?: string, isOpen?: boolean) {
-    if (name || sortBy || direction)
-      return this.httpClient.get('', { queryParams: { name, sortBy, direction, isOpen } })
-    else return this.httpClient.get()
+  getLocals(params: {
+    name?: string
+    sortBy?: string
+    direction?: string
+    isOpen?: boolean
+    page?: number
+    size?: number
+  }) {
+    return this.httpClient.get('', {
+      queryParams: {
+        name: params.name,
+        sortBy: params.sortBy,
+        direction: params.direction,
+        isOpen: params.isOpen,
+        page: params.page ?? 0,
+        size: params.size ?? 10,
+      },
+    })
   }
+
   getSpecificLocale(localeId: number) {
     return this.httpClient.get(`${localeId}`)
