* refactor: eslint config adjusted for better diff's * refactor: stricter linting + dependencies updated * refactoring: paragraph component - component - docs * refactoring: heading component - component - docs * Update docs/components/heading.md Co-authored-by: Ilya Artamonov <ilya.sosidka@gmail.com> * refactoring: link component - component - docs * refactoring: image component - component - docs * refactoring: alert component - component - docs * refactoring: avatar component - component - docs * refactoring: removed unnecessary code - component names come from the file name * refactoring: breadcrumb component - component - docs * refactoring: accordion component - component - docs * refactoring: buttom component - component - docs * refactoring: badge component - component - docs * refactoring: card component - component - docs * refactoring: order of components in docs updated * refactoring: unnecessary semicolons removed * refactoring: button group component - component - docs * refactoring: carousel component - component - docs * refactoring: dropdown component - component - docs * refactoring: footer component - component - docs * refactoring:list-group component - component - docs * refactoring: modal component - component - docs * refactoring: navbar component - component - docs * refactoring: pagination component - component - docs * refactoring: progress component - component - docs * refactoring: rating component - component - docs * refactoring: spinner component - component - docs * refactoring: table component - component - docs * refactoring: tabs component - component - docs * feat: Updated pagination examples * lint: Lister fixes * feat: Sidebar component and some fixes * feat: Input component * feat: Some fixes * feat: Some fixes * chore: update deps * refactor: removed old Modal component * refactor: radio component and some fixes * fix: fixed path error * refactor: Range component * refactoring: timeline component - component - docs * refactor: Select component * refactoring: toast component - component - docs * refactoring: tooltip component - component - docs * refactoring: sidebar component - component - docs * refactoring: input component - component - docs * refactoring: fileInput component - component - docs * refactoring: select component - component - docs * refactoring: textarea component - component - docs * refactoring: checkbox component - component - docs * refactoring: radio component - component - docs * refactoring: toggle component - component - docs * refactoring: range component - component - docs * local configs linted * documentation quick start updated * flowbite-themable refactored to fit new linters and style guide * random linter fixes * refactoring: toast-provider component - component - docs * final linter fixes * lint: Linter fixes * fix: Fixed types * fix: Fixed card component * docs: Updated card examples * fix: Fixed tabs * refactor: Heading component refactoring * Fwb rename - few fixes after component review (#237) * fix: button documentation * fix: model type in range examples * chore: Toast marked as WIP --------- Co-authored-by: Sqrcz <naorniakowski@slashlab.pl> Co-authored-by: Sqrcz <naorniakowski@gmail.com>
64 lines
2.0 KiB
Vue
64 lines
2.0 KiB
Vue
<template>
|
|
<div ref="header">
|
|
<button
|
|
v-if="isLoaded"
|
|
type="button"
|
|
:class="headerClasses"
|
|
@click="toggleItem"
|
|
>
|
|
<span class="w-full"><slot /></span>
|
|
<svg
|
|
data-accordion-icon
|
|
:class="arrowClasses"
|
|
fill="currentColor"
|
|
viewBox="0 0 20 20"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
>
|
|
<path
|
|
fill-rule="evenodd"
|
|
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { computed, type ComputedRef, onMounted, ref } from 'vue'
|
|
import { useAccordionState } from './composables/useAccordionState'
|
|
import { useAccordionHeaderClasses } from './composables/useAccordionHeaderClasses'
|
|
|
|
const isLoaded = ref(false)
|
|
const header = ref()
|
|
const accordionId = computed(() => header.value.parentElement.parentElement.dataset.accordionId)
|
|
const panelId = computed(() => header.value.parentElement.dataset.panelId)
|
|
|
|
const { accordionsStates } = useAccordionState()
|
|
const accordionState = computed(() => accordionsStates[accordionId.value])
|
|
const panelState = computed(() => accordionState.value.panels[panelId.value])
|
|
|
|
let headerClasses: ComputedRef, arrowClasses: ComputedRef
|
|
function commonToggleItem () {
|
|
const isSelectedVisible = panelState.value.isVisible
|
|
for (const panelIndex in accordionState.value.panels) {
|
|
const panel = accordionState.value.panels[panelIndex]
|
|
if (panel.id !== panelId.value) panel.isVisible = false
|
|
else panel.isVisible = !isSelectedVisible
|
|
}
|
|
}
|
|
function alwaysOpenToggleItem () {
|
|
panelState.value.isVisible = !panelState.value.isVisible
|
|
}
|
|
function toggleItem () {
|
|
if (accordionState.value.alwaysOpen) return alwaysOpenToggleItem()
|
|
commonToggleItem()
|
|
}
|
|
|
|
onMounted(() => {
|
|
const accordionHeaderClasses = useAccordionHeaderClasses(header)
|
|
headerClasses = accordionHeaderClasses.headerClasses
|
|
arrowClasses = accordionHeaderClasses.arrowClasses
|
|
isLoaded.value = true
|
|
})
|
|
</script>
|