diff --git a/src/components/ShowSelector.vue b/src/components/ShowSelector.vue
deleted file mode 100644
index d85009548c5b2019d2ec6787e16ae0da53cc4de6..0000000000000000000000000000000000000000
--- a/src/components/ShowSelector.vue
+++ /dev/null
@@ -1,105 +0,0 @@
-<template>
-  <div v-if="loaded.shows">
-    <AddShowModal ref="addShowModal" />
-
-    <div class="tw-flex tw-gap-2">
-      <v-select
-        v-if="shows.length > 0"
-        :model-value="show"
-        :options="showOptions"
-        label="name"
-        :clearable="false"
-        class="tw-w-56 tw-h-auto"
-        @update:model-value="show = $event"
-      >
-        <template #selected-option>{{ t('showSelector.selectShow') }}</template>
-        <template #option="show">
-          <span class="tw-block tw-py-1" :class="{ 'tw-opacity-75': !show.is_active }">
-            <span class="tw-block">{{ show.name }}</span>
-            <div class="tw-flex tw-gap-2 tw-justify-between">
-              <span class="tw-text-xs tw-font-bold tw-text-black/40">ID: {{ show.id }}</span>
-              <span
-                v-if="!show.is_active"
-                class="tw-text-sm tw-rounded-full tw-bg-black/10 tw-text-black/75 tw-px-2"
-                >{{ t('showSelector.inactiveShow') }}</span
-              >
-            </div>
-          </span>
-        </template>
-      </v-select>
-
-      <b-button
-        v-if="authStore.isSuperuser"
-        v-b-popover.hover.top="t('showCreator.title')"
-        variant="primary"
-        data-testid="show-selector:add-show"
-        @click="addShowModal.openModal()"
-      >
-        <template v-if="selectedShow">+</template>
-        <template v-else>{{ t('showCreator.title') }}</template>
-      </b-button>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { sort } from 'fast-sort'
-import { useStore } from 'vuex'
-import { computed, ref } from 'vue'
-
-// Move this into main.js if v-select is used a second time.
-import VSelect from 'vue-select'
-import 'vue-select/dist/vue-select.css'
-
-import { useSelectedShow } from '@/utilities'
-import AddShowModal from './shows/AddShowModal.vue'
-import { useI18n } from '@/i18n'
-import { useAuthStore } from '@/stores/auth'
-
-const store = useStore()
-const authStore = useAuthStore()
-const { t } = useI18n()
-const selectedShow = useSelectedShow()
-
-const addShowModal = ref()
-const loaded = computed(() => ({
-  shows: store.state.shows.loaded.shows,
-  types: store.state.shows.loaded.types,
-  fundingCategories: store.state.shows.loaded.fundingcategories,
-}))
-const shows = computed(() => store.state.shows.shows)
-const showOptions = computed(() => {
-  return sort(shows.value).by([
-    { desc: (show) => show.is_active },
-    { asc: (show) => show.name.toLowerCase() },
-  ])
-})
-const show = computed({
-  get() {
-    return selectedShow.value
-  },
-  set(selectedShow) {
-    store.commit('shows/switchShowById', selectedShow.id)
-  },
-})
-
-// TODO: not sure these belong here.
-if (!loaded.value.types) {
-  store.dispatch('shows/fetchMetaArray', { property: 'types', onlyActive: true })
-}
-
-if (!loaded.value.fundingCategories) {
-  store.dispatch('shows/fetchMetaArray', { property: 'fundingcategories', onlyActive: true })
-}
-</script>
-
-<style>
-.vs__dropdown-toggle {
-  height: 100%;
-  padding-top: 3px;
-}
-
-.vs--searchable .vs__dropdown-toggle {
-  cursor: default;
-}
-</style>
diff --git a/src/components/SwitchButton.vue b/src/components/SwitchButton.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ce253c7b28b523db2b1e8025443bc6dbab274548
--- /dev/null
+++ b/src/components/SwitchButton.vue
@@ -0,0 +1,49 @@
+<template>
+  <button
+    :id="id"
+    type="button"
+    role="switch"
+    :aria-checked="value"
+    class="tw-appearance-none tw-border-0 tw-py-[.5em] tw-px-[1em] tw-ring-black tw-relative first:tw-rounded-l last:tw-rounded-r"
+    :class="{
+      'tw-bg-aura-primary tw-text-white': value,
+      'tw-bg-gray-200': !value,
+      'focus:tw-z-10 focus:tw-ring-2 focus:tw-brightness-95': true,
+      'hover:tw-brightness-90': true,
+    }"
+    tabindex="0"
+    @click="value = !value"
+  >
+    <slot>{{ label }}</slot>
+  </button>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue'
+import { useId } from '@/util'
+
+const props = defineProps<{
+  modelValue: boolean
+  label?: string
+}>()
+const emit = defineEmits<{
+  (e: 'update:modelValue', value: boolean): void
+}>()
+const id = useId()
+const value = computed({
+  get() {
+    return props.modelValue
+  },
+  set(value: boolean) {
+    emit('update:modelValue', value)
+  },
+})
+</script>
+
+<script lang="ts">
+export default {
+  compatConfig: {
+    MODE: 3,
+  },
+}
+</script>