* Start of app redesign * format * continue progress * Content page nearly done * Fix recursion issues with content page * Fix update all alignment * Discover page progress * Settings progress * Removed unlocked-size hack that breaks web * Revamp project page, refactor web project page to share code with app, fixed loading bar, misc UI/UX enhancements, update ko-fi logo, update arrow icons, fix web issues caused by floating-vue migration, fix tooltip issues, update web tooltips, clean up web hydration issues * Ads + run prettier * Begin auth refactor, move common messages to ui lib, add i18n extraction to all apps, begin Library refactor * fix ads not hiding when plus log in * rev lockfile changes/conflicts * Fix sign in page * Add generated * (mostly) Data driven search * Fix search mobile issue * profile fixes * Project versions page, fix typescript on UI lib and misc fixes * Remove unused gallery component * Fix linkfunction err * Search filter controls at top, localization for locked filters * Fix provided filter names * Fix navigating from instance browse to main browse * Friends frontend (#2995) * Friends system frontend * (almost) finish frontend * finish friends, fix lint * Fix lint --------- Signed-off-by: Geometrically <18202329+Geometrically@users.noreply.github.com> * Refresh macOS app icon * Update web search UI more * Fix link opens * Fix frontend build --------- Signed-off-by: Geometrically <18202329+Geometrically@users.noreply.github.com> Co-authored-by: Jai A <jaiagr+gpg@pm.me> Co-authored-by: Geometrically <18202329+Geometrically@users.noreply.github.com>
93 lines
1.8 KiB
Vue
93 lines
1.8 KiB
Vue
<template>
|
|
<div>
|
|
<ButtonStyled v-if="!!slots.title" :type="type">
|
|
<button class="!w-full" @click="() => (isOpen ? close() : open())">
|
|
<slot name="title" /><DropdownIcon
|
|
class="ml-auto size-5 text-contrast transition-transform duration-300"
|
|
:class="{ 'rotate-180': isOpen }"
|
|
/>
|
|
</button>
|
|
</ButtonStyled>
|
|
<div class="accordion-content" :class="{ open: isOpen }">
|
|
<div>
|
|
<div :class="{ 'mt-2': !!slots.title }" v-bind="$attrs" :inert="!isOpen">
|
|
<slot />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { DropdownIcon } from "@modrinth/assets";
|
|
import { ButtonStyled } from "@modrinth/ui";
|
|
|
|
const props = withDefaults(
|
|
defineProps<{
|
|
openByDefault?: boolean;
|
|
type?: "standard" | "outlined" | "transparent";
|
|
}>(),
|
|
{
|
|
type: "standard",
|
|
openByDefault: false,
|
|
},
|
|
);
|
|
|
|
const isOpen = ref(props.openByDefault);
|
|
const emit = defineEmits(["onOpen", "onClose"]);
|
|
|
|
const slots = useSlots();
|
|
|
|
function open() {
|
|
isOpen.value = true;
|
|
emit("onOpen");
|
|
}
|
|
function close() {
|
|
isOpen.value = false;
|
|
emit("onClose");
|
|
}
|
|
|
|
defineExpose({
|
|
open,
|
|
close,
|
|
isOpen,
|
|
});
|
|
|
|
defineOptions({
|
|
inheritAttrs: false,
|
|
});
|
|
</script>
|
|
<style scoped>
|
|
.accordion-content {
|
|
display: grid;
|
|
grid-template-rows: 0fr;
|
|
transition: grid-template-rows 0.3s ease-in-out;
|
|
animation: height-animate 500ms ease-in-out both;
|
|
content-visibility: auto;
|
|
animation-composition: replace;
|
|
}
|
|
|
|
@media (prefers-reduced-motion) {
|
|
.accordion-content {
|
|
transition: none !important;
|
|
}
|
|
}
|
|
|
|
.accordion-content.open {
|
|
grid-template-rows: 1fr;
|
|
}
|
|
|
|
.accordion-content > div {
|
|
overflow: hidden;
|
|
}
|
|
|
|
@keyframes height-animate {
|
|
from {
|
|
block-size: initial;
|
|
}
|
|
to {
|
|
block-size: auto;
|
|
}
|
|
}
|
|
</style>
|