Skip to content

Commit 6e7258d

Browse files
committed
feat: Add z-index prop to FwbAutocomplete component for customizable dropdown overlay
1 parent 9ef95d6 commit 6e7258d

File tree

5 files changed

+48
-3
lines changed

5 files changed

+48
-3
lines changed

docs/components/autocomplete.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ const countries = [
325325
| `label` | `string` | `undefined` | Label text for the input field |
326326
| `inputComponent` | `Component` | `FwbInput` | Vue component to use as the input field |
327327
| `inputProps` | `Record<string, any>` | `{}` | Additional props to pass to the input component |
328+
| `zIndex` | `number` | `100` | Z-index value for the dropdown overlay |
328329

329330
### Input Component Props
330331

src/components/FwbAutocomplete/FwbAutocomplete.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ const props = withDefaults(
185185
dropdownClass: '',
186186
inputComponent: FwbInput,
187187
inputProps: () => ({}),
188+
zIndex: 100,
188189
},
189190
)
190191

src/components/FwbAutocomplete/composables/useAutocompleteClasses.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { useMergeClasses } from '@/composables/useMergeClasses'
21
import { computed, type Ref } from 'vue'
32

3+
import { useMergeClasses } from '@/composables/useMergeClasses'
4+
45
const baseWrapperClasses = 'relative w-full'
5-
const baseDropdownClasses = 'absolute z-50 w-full mt-1 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto'
66
const baseDropdownItemClasses = 'px-4 py-3 cursor-pointer transition-colors duration-150 border-b border-gray-200 dark:border-gray-600 last:border-b-0'
77
const highlightedDropdownItemClasses = 'bg-blue-50 dark:bg-blue-900/20'
88
const hoverDropdownItemClasses = 'hover:bg-gray-50 dark:hover:bg-gray-700'
@@ -13,6 +13,7 @@ export interface UseAutocompleteClassesProps {
1313
wrapperClass?: Ref<string | Record<string, boolean> | undefined>
1414
labelClass?: Ref<string | Record<string, boolean> | undefined>
1515
dropdownClass?: Ref<string | Record<string, boolean> | undefined>
16+
zIndex?: Ref<number | undefined>
1617
}
1718

1819
export function useAutocompleteClasses (props: UseAutocompleteClassesProps) {
@@ -23,9 +24,13 @@ export function useAutocompleteClasses (props: UseAutocompleteClassesProps) {
2324
])
2425
})
2526

27+
const baseDropdownClasses = computed(() =>
28+
`absolute z-[${props.zIndex?.value}] w-full mt-1 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto`,
29+
)
30+
2631
const dropdownClasses = computed(() => {
2732
return useMergeClasses([
28-
baseDropdownClasses,
33+
baseDropdownClasses.value,
2934
typeof props.dropdownClass?.value === 'string' ? props.dropdownClass.value : '',
3035
])
3136
})

src/components/FwbAutocomplete/tests/Autocomplete.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,4 +484,41 @@ describe('FwbAutocomplete', () => {
484484
const fwbInput = wrapper.findComponent({ name: 'FwbInput' })
485485
expect(fwbInput.exists()).toBe(true)
486486
})
487+
488+
it('applies custom z-index to dropdown', async () => {
489+
const wrapper = mount(FwbAutocomplete, {
490+
props: {
491+
options: mockOptions,
492+
searchFields: ['name'],
493+
display: 'name',
494+
zIndex: 200,
495+
},
496+
})
497+
498+
const input = wrapper.find('input')
499+
await input.trigger('focus')
500+
await nextTick()
501+
502+
const dropdown = wrapper.find('[data-testid="fwb-autocomplete-dropdown"]')
503+
expect(dropdown.exists()).toBe(true)
504+
expect(dropdown.classes()).toContain('z-[200]')
505+
})
506+
507+
it('uses default z-index when not specified', async () => {
508+
const wrapper = mount(FwbAutocomplete, {
509+
props: {
510+
options: mockOptions,
511+
searchFields: ['name'],
512+
display: 'name',
513+
},
514+
})
515+
516+
const input = wrapper.find('input')
517+
await input.trigger('focus')
518+
await nextTick()
519+
520+
const dropdown = wrapper.find('[data-testid="fwb-autocomplete-dropdown"]')
521+
expect(dropdown.exists()).toBe(true)
522+
expect(dropdown.classes()).toContain('z-[100]')
523+
})
487524
})

src/components/FwbAutocomplete/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface AutocompleteProps<T = Record<string, any>> {
2727
dropdownClass?: string | Record<string, boolean>
2828
inputComponent?: Component
2929
inputProps?: Record<string, any>
30+
zIndex?: number
3031
}
3132

3233
export interface AutocompleteEmits<T = Record<string, any>> {

0 commit comments

Comments
 (0)