Nuxt Swiftsearch
Examples

Manual Widgets Mode

Keep legacy `:widgets` composition while using Swiftsearch components.

This pattern is used in the playground /search page to verify backwards compatibility.

pages/search.vue
<template>
  <AisInstantSearch :configuration="configuration" :widgets="widgets" instance-key="search">
    <AisSearchBox />
    <AisToggleRefinement attribute="free_shipping" />
    <AisRefinementList attribute="brand" searchable />
    <AisSortBy />
    <AisStats />
    <AisInfiniteHits />

    <AisIndex index="airbnb">
      <AisInfiniteHits />
    </AisIndex>
  </AisInstantSearch>
</template>

<script setup lang="ts">
import { algoliasearch } from "algoliasearch";
import { singleIndex as singleIndexMapping } from "instantsearch.js/es/lib/stateMappings";

const client = algoliasearch("latency", "6be0576ff61c053d5f9a3225e2a90f76");
const algoliaRouter = useAisRouter();

const airbnbIndex = useAisIndex({ indexName: "airbnb" });
airbnbIndex.addWidgets([useAisInfiniteHits({})]);

const widgets = computed(() => [
  useAisSortBy({
    items: [
      { value: "instant_search", label: "Default" },
      { value: "instant_search_price_asc", label: "Price asc." },
      { value: "instant_search_price_desc", label: "Price desc." },
    ],
  }),
  useAisStats({}),
  useAisInfiniteHits({ showPrevious: true }),
  useAisRefinementList({ attribute: "brand", showMore: true }, "brand-search"),
  useAisToggleRefinement({ attribute: "free_shipping" }),
  useAisSearchBox({}),
  airbnbIndex,
]);

const configuration = {
  indexName: "instant_search",
  searchClient: client,
  routing: {
    router: algoliaRouter.value.router,
    stateMapping: singleIndexMapping("instant_search"),
  },
};
</script>

Use this mode for dynamic widget generation, advanced branching, or when migrating incrementally.

Copyright © 2026