qa: shared instances post release (#6893)

* fix: 20 user cap

* qa: invite modal dropdown + other + clamp limits

* fix: hide filters if just one type

* feat: update req banner

* feat: invite management frontend

* fix: moderation issues with shared instances

* feat: instance icon improvements

* fix: better offline handling

* fix: lint

* feat: show avatar in install to play modal

* feat: smaller qa points

* fix: fmt

* fix: fmt

* fix: yeet svg

* fix: 50 user limit
This commit is contained in:
Calum H.
2026-07-28 14:10:12 +00:00
committed by GitHub
parent 5d34e7902a
commit 82348fe40a
61 changed files with 1809 additions and 307 deletions
+13 -3
View File
@@ -4,7 +4,7 @@
:title="formatMessage(copiedMessage)"
@click="copyText"
>
<span>{{ text }}</span>
<span>{{ displayText ?? text }}</span>
<CheckIcon v-if="copied" />
<ClipboardCopyIcon v-else />
</button>
@@ -12,7 +12,7 @@
<script setup lang="ts">
import { CheckIcon, ClipboardCopyIcon } from '@modrinth/assets'
import { ref } from 'vue'
import { onBeforeUnmount, ref } from 'vue'
import { defineMessage, useVIntl } from '../../composables/i18n'
@@ -22,12 +22,22 @@ const copiedMessage = defineMessage({
})
const { formatMessage } = useVIntl()
const props = defineProps<{ text: string }>()
const props = defineProps<{
text: string
displayText?: string
}>()
const copied = ref(false)
let copiedResetTimeout: ReturnType<typeof setTimeout> | undefined
async function copyText() {
await navigator.clipboard.writeText(props.text)
copied.value = true
clearTimeout(copiedResetTimeout)
copiedResetTimeout = setTimeout(() => {
copied.value = false
}, 2000)
}
onBeforeUnmount(() => clearTimeout(copiedResetTimeout))
</script>
@@ -142,6 +142,7 @@ const props = withDefaults(
min?: number
max?: number
step?: number
clamp?: boolean
disabled?: boolean
readonly?: boolean
error?: boolean
@@ -159,6 +160,7 @@ const props = withDefaults(
type: 'text',
size: 'standard',
variant: 'filled',
clamp: false,
disabled: false,
readonly: false,
error: false,
@@ -189,12 +191,22 @@ defineExpose({
function onInput(event: Event) {
const target = event.target as HTMLInputElement | HTMLTextAreaElement
model.value =
props.type === 'number' && !props.multiline
? target.value === ''
? undefined
: Number(target.value)
: target.value
if (props.type !== 'number' || props.multiline) {
model.value = target.value
return
}
if (target.value === '') {
model.value = undefined
return
}
let value = Number(target.value)
if (props.clamp) {
if (props.min !== undefined) value = Math.max(props.min, value)
if (props.max !== undefined) value = Math.min(props.max, value)
target.value = String(value)
}
model.value = value
}
function clear() {