Skip to content

Accordion Component Code

Dependencies

This component requires:

  • Vue 3 with Composition API

Full Component Code

vue
<template>
  <div class="accordion-container">
    <div class="accordion-header" @click="toggleAccordion">
      <div class="accordion-name">{{ accordionTextRef }}</div>
      <div class="accordion-drop-icon" :class="{ isOpen: isOpen }">
        <svg
          width="8"
          height="5"
          viewBox="0 0 8 5"
          fill="none"
          xmlns="http://www.w3.org/2000/svg"
        >
          <path
            fill-rule="evenodd"
            clip-rule="evenodd"
            d="M0.167367 0.504188C0.390524 0.276382 0.752333 0.276382 0.975489 0.504188L4 3.59171L7.02451 0.504188C7.24767 0.276382 7.60948 0.276382 7.83263 0.504188C8.05579 0.731993 8.05579 1.10134 7.83263 1.32915L4.40406 4.82915C4.1809 5.05695 3.8191 5.05695 3.59594 4.82915L0.167367 1.32915C-0.0557894 1.10134 -0.0557894 0.731994 0.167367 0.504188Z"
            fill="#E9BEB3"
          />
        </svg>
      </div>
    </div>
    <div v-show="isOpen" class="accordion-content-wrapper">
      <slot name="accordionContent"></slot>
    </div>
  </div>
</template>
<script setup>
import { ref } from "vue";
const props = defineProps({
  accordionTextRef: {
    type: String,
    required: false,
    default: "",
  },
  isTextRefI18: {
    type: Boolean,
    required: false,
    default: false,
  },
});
const isOpen = ref(true);
const toggleAccordion = () => {
  isOpen.value = !isOpen.value;
};
</script>
<style lang="scss" scoped>
.accordion-container {
  .accordion-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    cursor: pointer;
    .accordion-name {
      color: gold;
      font-size: 0.625rem;
    }
    .accordion-drop-icon {
      display: flex;
      justify-content: center;
      align-items: center;
      transform: rotate(0deg);
    }
    .isOpen {
      transform: rotate(180deg);
    }
  }
}
</style>