Components renaming (#225)
* 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>
This commit is contained in:
67
src/components/FwbDropdown/composables/useDropdownClasses.ts
Normal file
67
src/components/FwbDropdown/composables/useDropdownClasses.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import { computed, nextTick, ref, type Ref, watch } from 'vue'
|
||||
import classNames from 'classnames'
|
||||
import type { DropdownPlacement } from '../types'
|
||||
|
||||
const defaultDropdownClasses = 'absolute z-10 bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700'
|
||||
|
||||
const defaultGapInPx = 8
|
||||
|
||||
const placementDropdownClasses: Record<DropdownPlacement, string> = {
|
||||
bottom: '',
|
||||
left: 'top-0',
|
||||
right: 'top-0',
|
||||
top: '',
|
||||
}
|
||||
|
||||
export type UseDropdownClassesProps = {
|
||||
placement: Ref<DropdownPlacement>
|
||||
contentRef: Ref<HTMLDivElement | undefined>
|
||||
visible: Ref<boolean>
|
||||
}
|
||||
|
||||
const placementCalculators: Record<DropdownPlacement, (rect: DOMRect) => string> = {
|
||||
bottom (rect: DOMRect): string {
|
||||
return `bottom: -${rect.height + defaultGapInPx}px;`
|
||||
},
|
||||
left (rect: DOMRect): string {
|
||||
return `left: -${rect.width + defaultGapInPx}px;`
|
||||
},
|
||||
right (rect: DOMRect): string {
|
||||
return `right: -${rect.width + defaultGapInPx}px;`
|
||||
},
|
||||
top (rect: DOMRect): string {
|
||||
return `top: -${rect.height + defaultGapInPx}px;`
|
||||
},
|
||||
}
|
||||
|
||||
export function useDropdownClasses (props: UseDropdownClassesProps): {
|
||||
contentClasses: Ref<string>
|
||||
contentStyles: Ref<string>
|
||||
} {
|
||||
watch(props.visible, (value: boolean) => {
|
||||
if (value) nextTick(() => calculatePlacementClasses())
|
||||
})
|
||||
|
||||
const placementStyles = ref('')
|
||||
|
||||
const calculatePlacementClasses = () => {
|
||||
const boundingRect = props.contentRef.value?.getBoundingClientRect()
|
||||
if (!boundingRect) {
|
||||
placementStyles.value = ''
|
||||
return
|
||||
}
|
||||
placementStyles.value = placementCalculators[props.placement.value](boundingRect)
|
||||
}
|
||||
|
||||
const contentClasses = computed(() => {
|
||||
return classNames(
|
||||
defaultDropdownClasses,
|
||||
placementDropdownClasses[props.placement.value],
|
||||
)
|
||||
})
|
||||
|
||||
return {
|
||||
contentClasses,
|
||||
contentStyles: placementStyles,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user