You've already forked AstralRinth
forked from didirus/AstralRinth
* refactor: migrate to common eslint+prettier configs * fix: prettier frontend * feat: config changes * fix: lint issues * fix: lint * fix: type imports * fix: cyclical import issue * fix: lockfile * fix: missing dep * fix: switch to tabs * fix: continue switch to tabs * fix: rustfmt parity * fix: moderation lint issue * fix: lint issues * fix: ui intl * fix: lint issues * Revert "fix: rustfmt parity" This reverts commit cb99d2376c321d813d4b7fc7e2a213bb30a54711. * feat: revert last rs
67 lines
1.8 KiB
Vue
67 lines
1.8 KiB
Vue
<script setup lang="ts">
|
|
import { SpinnerIcon } from '@modrinth/assets'
|
|
import { formatPrice } from '@modrinth/utils'
|
|
import { useVIntl } from '@vintl/vintl'
|
|
import { computed } from 'vue'
|
|
|
|
import Accordion from '../base/Accordion.vue'
|
|
|
|
const { locale } = useVIntl()
|
|
|
|
export type BillingItem = {
|
|
title: string
|
|
amount: number
|
|
}
|
|
|
|
const props = defineProps<{
|
|
period?: string
|
|
currency: string
|
|
total: number
|
|
billingItems: BillingItem[]
|
|
loading?: boolean
|
|
}>()
|
|
|
|
const periodSuffix = computed(() => {
|
|
return props.period ? ` / ${props.period}` : ''
|
|
})
|
|
</script>
|
|
<template>
|
|
<Accordion
|
|
class="rounded-2xl overflow-hidden bg-bg"
|
|
button-class="bg-transparent p-0 w-full p-4 active:scale-[0.98] transition-transform duration-100"
|
|
>
|
|
<template #title>
|
|
<div class="w-full flex items-center justify-between">
|
|
<div class="flex items-center gap-2 text-contrast font-bold">Total</div>
|
|
<div class="text-right mr-1">
|
|
<span class="text-primary font-bold">
|
|
<template v-if="loading">
|
|
<SpinnerIcon class="animate-spin size-4" />
|
|
</template>
|
|
<template v-else> {{ formatPrice(locale, total, currency) }} </template
|
|
><span class="text-xs text-secondary">{{ periodSuffix }}</span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<div class="p-4 flex flex-col gap-4 bg-table-alternateRow">
|
|
<div
|
|
v-for="{ title, amount } in billingItems"
|
|
:key="title"
|
|
class="flex items-center justify-between"
|
|
>
|
|
<div class="font-semibold">
|
|
{{ title }}
|
|
</div>
|
|
<div class="text-right">
|
|
<template v-if="loading">
|
|
<SpinnerIcon class="animate-spin size-4" />
|
|
</template>
|
|
<template v-else> {{ formatPrice(locale, amount, currency) }} </template
|
|
><span class="text-xs text-secondary">{{ periodSuffix }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</Accordion>
|
|
</template>
|