diff --git a/src/components/VButton.vue b/src/components/VButton.vue index 5641f8aada..7ec717157e 100644 --- a/src/components/VButton.vue +++ b/src/components/VButton.vue @@ -366,6 +366,13 @@ https://www.figma.com/file/GIIQ4sDbaToCfFQyKMvzr8/Openverse-Design-Library?node- @apply w-full bg-dark-charcoal-06 font-semibold text-dark-charcoal; } +.dropdown-label { + @apply border border-dark-charcoal-20 text-dark-charcoal focus-slim-tx hover:border-tx hover:bg-dark-charcoal hover:text-white; +} +.dropdown-label-pressed { + @apply border-tx bg-dark-charcoal text-white focus-bold-filled active:hover:border-white; +} + .connection-start { @apply rounded-s-none; } diff --git a/src/components/VExternalSearch/VExternalSearchForm.vue b/src/components/VExternalSearch/VExternalSearchForm.vue index 53903f2360..2e837bac22 100644 --- a/src/components/VExternalSearch/VExternalSearchForm.vue +++ b/src/components/VExternalSearch/VExternalSearchForm.vue @@ -2,7 +2,7 @@ @@ -33,10 +33,56 @@ {{ searchTerm }} - + {{ $t("external-sources.button").toString() + }} + + + + + + + + @@ -46,20 +92,34 @@ import { defineComponent, PropType, ref, + SetupContext, } from "@nuxtjs/composition-api" import { getFocusableElements } from "~/utils/focus-management" import { defineEvent } from "~/types/emits" -import type { MediaType } from "~/constants/media" +import { useUiStore } from "~/stores/ui" +import { useDialogControl } from "~/composables/use-dialog-control" + +import type { MediaType } from "~/constants/media" import type { ExternalSource } from "~/types/external-source" import VExternalSourceList from "~/components/VExternalSearch/VExternalSourceList.vue" +import VButton from "~/components/VButton.vue" +import VIcon from "~/components/VIcon/VIcon.vue" +import VPopoverContent from "~/components/VPopover/VPopoverContent.vue" +import VModalContent from "~/components/VModal/VModalContent.vue" + +import caretDownIcon from "~/assets/icons/caret-down.svg" export default defineComponent({ name: "VExternalSearchForm", components: { + VModalContent, + VPopoverContent, + VIcon, + VButton, VExternalSourceList, }, props: { @@ -88,7 +148,29 @@ export default defineComponent({ tab: defineEvent<[KeyboardEvent]>(), }, setup(_, { emit }) { - const sectionRef = ref() + const sectionRef = ref(null) + const triggerRef = ref | null>(null) + const uiStore = useUiStore() + + const isMd = computed(() => uiStore.isBreakpoint("md")) + + const triggerElement = computed(() => triggerRef.value?.$el as HTMLElement) + + const lockBodyScroll = computed(() => !isMd.value) + + const isVisible = ref(false) + + const { + close: closeDialog, + open: openDialog, + onTriggerClick, + triggerA11yProps, + } = useDialogControl({ + visibleRef: isVisible, + nodeRef: sectionRef, + lockBodyScroll, + emit: emit as SetupContext["emit"], + }) /** * Find the last focusable element in VSearchGridFilter to add a 'Tab' keydown event @@ -107,7 +189,19 @@ export default defineComponent({ } return { sectionRef, + triggerRef, + triggerElement, handleTab, + isMd, + + closeDialog, + openDialog, + onTriggerClick, + triggerA11yProps, + + isVisible, + + caretDownIcon, } }, }) diff --git a/src/components/VExternalSearch/VExternalSourceList.vue b/src/components/VExternalSearch/VExternalSourceList.vue index 7012d2a184..569c92102d 100644 --- a/src/components/VExternalSearch/VExternalSourceList.vue +++ b/src/components/VExternalSearch/VExternalSourceList.vue @@ -1,62 +1,35 @@ - - - {{ $t("external-sources.button").toString() }} - - - - - - - {{ $t("external-sources.title") }} - - - {{ $t("external-sources.caption", { openverse: "Openverse" }) }} - - - {{ source.name }} - - - - - + + + + {{ $t("external-sources.title") }} + + + {{ $t("external-sources.caption", { openverse: "Openverse" }) }} + + + {{ source.name }} + + +
- {{ $t("external-sources.caption", { openverse: "Openverse" }) }} -
+ {{ $t("external-sources.caption", { openverse: "Openverse" }) }} +