feat: add logical utils

This commit is contained in:
kolaente 2025-08-02 10:53:21 +02:00
parent 16f7fa087a
commit d290f2e99c
56 changed files with 172 additions and 130 deletions

View File

@ -74,7 +74,7 @@
>
<span class="username">{{ authStore.userDisplayName }}</span>
<span
class="ms-1 dropdown-icon icon is-small"
class="mis-1 dropdown-icon icon is-small"
:style="{
transform: open ? 'rotate(180deg)' : 'rotate(0)',
}"

View File

@ -34,7 +34,7 @@ onMounted(async () => {
<template>
<template v-if="show && !loading">
<p class="mt-4">
<p class="mbs-4">
{{ $t('home.project.importText') }}
</p>
<XButton

View File

@ -110,7 +110,7 @@
</template>
<PoweredByLink
class="mt-auto"
class="mbs-auto"
utm-medium="navigation"
/>
</aside>

View File

@ -55,7 +55,7 @@
<XButton
v-if="!isEmpty"
:disabled="isEmpty"
class="is-small ms-2"
class="is-small mis-2"
:shadow="false"
variant="secondary"
@click="reset"

View File

@ -28,7 +28,7 @@
>
<span
:key="`item${key}`"
class="tag ms-2 mt-2"
class="tag mis-2 mbs-2"
>
{{ label !== '' ? item[label] : item }}
<BaseButton

View File

@ -125,7 +125,7 @@
<XButton
v-else-if="isEditing && showSave"
v-cy="'saveEditor'"
class="mt-4"
class="mbs-4"
variant="secondary"
:shadow="false"
:disabled="!contentHasChanged"

View File

@ -53,7 +53,7 @@
<Message
v-if="errorMsg !== ''"
variant="danger"
class="mt-2"
class="mbs-2"
>
{{ errorMsg }}
</Message>

View File

@ -38,7 +38,7 @@
variant="primary"
:icon="primaryIcon"
:disabled="primaryDisabled || loading"
class="ms-2"
class="mis-2"
@click.prevent.stop="primary"
>
{{ primaryLabel || $t('misc.create') }}

View File

@ -28,7 +28,7 @@
<ApiConfig v-if="showApiConfig" />
<Message
v-if="motd !== ''"
class="is-hidden-tablet mb-4"
class="is-hidden-tablet mbe-4"
>
{{ motd }}
</Message>

View File

@ -1,5 +1,5 @@
<template>
<p class="has-text-centered has-text-grey is-italic p-4 mb-4">
<p class="has-text-centered has-text-grey is-italic p-4 mbe-4">
<slot />
</p>
</template>

View File

@ -26,7 +26,7 @@
<Message
v-else
variant="danger"
class="mb-4"
class="mbe-4"
>
<p>
{{ $t('ready.errorOccured') }}<br>

View File

@ -15,7 +15,7 @@
<Message
v-if="s.available"
class="mb-4"
class="mbe-4"
>
{{
typeof s.available === 'undefined' ?

View File

@ -44,7 +44,7 @@
<div>
<span
v-if="n.notification.doer"
class="has-text-weight-bold me-1"
class="has-text-weight-bold mie-1"
>
{{ getDisplayName(n.notification.doer) }}
</span>
@ -66,7 +66,7 @@
<XButton
v-if="notifications.length > 0 && unreadNotifications > 0"
variant="tertiary"
class="mt-2 is-fullwidth"
class="mbs-2 is-fullwidth"
@click="markAllRead"
>
{{ $t('notification.markAllRead') }}

View File

@ -34,7 +34,7 @@
<Message
v-if="currentProject?.isArchived"
variant="warning"
class="mb-4"
class="mbe-4"
>
{{ $t('project.archivedMessage') }}
</Message>

View File

@ -13,7 +13,7 @@
<div
v-if="filterFromView"
class="tw-text-sm tw-mb-2"
class="tw-text-sm tw-mbe-2"
>
{{ $t('filters.fromView') }}
<code>{{ filterFromView }}</code><br>
@ -37,7 +37,7 @@
>
<XButton
variant="secondary"
class="me-2"
class="mie-2"
:disabled="filterQuery === ''"
@click.prevent.stop="clearFiltersAndEmit"
>

View File

@ -46,7 +46,7 @@
<span
v-if="bucket.id !== 0 && view?.doneBucketId === bucket.id"
v-tooltip="$t('project.kanban.doneBucketHint')"
class="icon is-small has-text-success me-2"
class="icon is-small has-text-success mie-2"
>
<Icon icon="check-double" />
</span>

View File

@ -12,7 +12,7 @@
<XButton
icon="th"
variant="secondary"
class="me-2"
class="mie-2"
@click.prevent.stop="toggle()"
>
{{ $t('project.table.columns') }}
@ -87,7 +87,7 @@
:has-content="false"
>
<div class="has-horizontal-overflow">
<table class="table has-actions is-hoverable is-fullwidth mb-0">
<table class="table has-actions is-hoverable is-fullwidth mbe-0">
<thead>
<tr>
<th v-if="activeColumns.index">
@ -219,7 +219,7 @@
v-if="t.assignees.length > 0"
:assignees="t.assignees"
:avatar-size="28"
class="ms-1"
class="mis-1"
:inline="true"
/>
</td>

View File

@ -177,10 +177,10 @@ function handleBubbleSave() {
v-model="view.filter.filter"
:project-id="view.projectId"
:input-label="$t('project.views.filter')"
class="mb-1"
class="mbe-1"
/>
<div class="is-size-7 mb-3">
<div class="is-size-7 mbe-3">
<FilterInputDocs />
</div>
@ -260,7 +260,7 @@ function handleBubbleSave() {
v-model="view.bucketConfiguration[index].filter.filter"
:project-id="view.projectId"
:input-label="$t('project.views.filter')"
class="mb-2"
class="mbe-2"
/>
<div class="is-size-7">
@ -285,7 +285,7 @@ function handleBubbleSave() {
>
<XButton
variant="tertiary"
class="me-2"
class="mie-2"
@click="emit('cancel')"
>
{{ $t('misc.cancel') }}

View File

@ -4,7 +4,7 @@
{{ $t('project.share.links.title') }}
<span
v-tooltip="$t('project.share.links.explanation')"
class="is-size-7 has-text-grey is-italic ms-3"
class="is-size-7 has-text-grey is-italic mis-3"
>
{{ $t('project.share.links.what') }}
</span>
@ -14,7 +14,7 @@
<XButton
v-if="!(linkShares.length === 0 || showNewForm)"
icon="plus"
class="mb-4"
class="mbe-4"
@click="showNewForm = true"
>
{{ $t('project.share.links.create') }}
@ -114,12 +114,12 @@
<td>
<p
v-if="s.name !== ''"
class="mb-2 is-italic"
class="mbe-2 is-italic"
>
{{ s.name }}
</p>
<p class="mb-2">
<p class="mbe-2">
<i18n-t
keypath="project.share.links.sharedBy"
scope="global"
@ -128,7 +128,7 @@
</i18n-t>
</p>
<p class="mb-2">
<p class="mbe-2">
<template v-if="s.right === RIGHTS.ADMIN">
<span class="icon is-small">
<Icon icon="lock" />

View File

@ -43,7 +43,7 @@
<table
v-if="sharables.length > 0"
class="table has-actions is-striped is-hoverable is-fullwidth mb-4"
class="table has-actions is-striped is-hoverable is-fullwidth mbe-4"
>
<tbody>
<tr
@ -97,7 +97,7 @@
<div class="select">
<select
v-model="selectedRight[s.id]"
class="me-2"
class="mie-2"
@change="toggleType(s)"
>
<option

View File

@ -46,7 +46,7 @@
<Expandable :open="errorMessage !== ''">
<p
v-if="errorMessage !== ''"
class="pt-3 mt-0 help is-danger"
class="pbs-3 mbs-0 help is-danger"
>
{{ errorMessage }}
</p>

View File

@ -113,7 +113,7 @@
<XButton
v-if="editEnabled"
:disabled="loading"
class="mb-4"
class="mbe-4"
icon="cloud-upload-alt"
variant="secondary"
:shadow="false"

View File

@ -16,9 +16,9 @@
<div class="comments">
<span
v-if="taskCommentService.loading && saving === null && !creating"
class="is-flex is-align-items-center my-4 ms-2"
class="is-flex is-align-items-center my-4 mis-2"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('task.comment.loading') }}
</span>
<div
@ -79,7 +79,7 @@
"
class="is-inline-flex"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('misc.saving') }}
</span>
<span
@ -115,7 +115,7 @@
/>
<Reactions
v-model="c.reactions"
class="mt-2"
class="mbs-2"
entity-kind="comments"
:entity-id="c.id"
:disabled="!canWrite"
@ -153,7 +153,7 @@
v-if="taskCommentService.loading && creating"
class="is-inline-flex"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('task.comment.creating') }}
</span>
</CustomTransition>

View File

@ -10,7 +10,7 @@
v-if="loading && saving"
class="is-small is-inline-flex"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('misc.saving') }}
</span>
<span

View File

@ -46,7 +46,7 @@
v-if="loading && saving"
class="is-inline-flex is-align-items-center"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('misc.saving') }}
</span>
<span
@ -55,7 +55,7 @@
>
<Icon
icon="check"
class="me-2"
class="mie-2"
/>
{{ $t('misc.saved') }}
</span>

View File

@ -74,7 +74,7 @@
v-if="task.assignees.length > 0"
:assignees="task.assignees"
:avatar-size="24"
class="me-1"
class="mie-1"
/>
<ChecklistSummary
:task="task"

View File

@ -23,7 +23,7 @@
v-if="taskRelationService.loading"
class="is-inline-flex"
>
<span class="loader is-inline-block me-2" />
<span class="loader is-inline-block mie-2" />
{{ $t('misc.saving') }}
</span>
<span
@ -80,7 +80,7 @@
</div>
<div
key="field-kind"
class="field has-addons mb-4"
class="field has-addons mbe-4"
>
<div class="control is-expanded">
<div class="select is-fullwidth has-defaults">

View File

@ -1,6 +1,6 @@
<template>
<div class="control repeat-after-input">
<div class="buttons has-addons is-centered mt-2">
<div class="buttons has-addons is-centered mbs-2">
<XButton
variant="secondary"
class="is-small"
@ -23,7 +23,7 @@
{{ $t('task.repeat.every30d') }}
</XButton>
</div>
<div class="is-flex is-align-items-center mb-2">
<div class="is-flex is-align-items-center mbe-2">
<label
for="repeatMode"
class="is-fullwidth"
@ -54,7 +54,7 @@
v-if="task.repeatMode !== TASK_REPEAT_MODES.REPEAT_MODE_MONTH"
class="is-flex"
>
<p class="pe-4">
<p class="pis-4">
{{ $t('task.repeat.each') }}
</p>
<div class="field has-addons is-fullwidth">

View File

@ -18,7 +18,7 @@
<ColorBubble
v-if="!showProjectSeparately && projectColor !== '' && currentProject?.id !== task.projectId"
:color="projectColor"
class="me-1"
class="mie-1"
/>
<div
@ -30,8 +30,8 @@
v-if="showProject && typeof project !== 'undefined'"
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
:to="{ name: 'project.index', params: { projectId: task.projectId } }"
class="task-project me-1"
:class="{'me-2': task.hexColor !== ''}"
class="task-project mie-1"
:class="{'mie-2': task.hexColor !== ''}"
@click.stop
>
{{ project.title }}
@ -40,13 +40,13 @@
<ColorBubble
v-if="task.hexColor !== ''"
:color="getHexColor(task.hexColor)"
class="me-1"
class="mie-1"
/>
<PriorityLabel
:priority="task.priority"
:done="task.done"
class="pe-2"
class="pis-2"
/>
<RouterLink
@ -61,7 +61,7 @@
<Labels
v-if="task.labels.length > 0"
class="labels ms-2 me-1"
class="labels mis-2 mie-1"
:labels="task.labels"
/>
@ -69,7 +69,7 @@
v-if="task.assignees.length > 0"
:assignees="task.assignees"
:avatar-size="25"
class="ms-1"
class="mis-1"
:inline="true"
/>
@ -134,7 +134,7 @@
<ColorBubble
v-if="showProjectSeparately && projectColor !== '' && currentProject?.id !== task.projectId"
:color="projectColor"
class="me-1"
class="mie-1"
/>
<RouterLink

View File

@ -5,7 +5,7 @@
v-if="showProject && typeof project !== 'undefined'"
v-tooltip="$t('task.detail.belongsToProject', {project: project.title})"
class="task-project"
:class="{'me-2': task.hexColor !== ''}"
:class="{'mie-2': task.hexColor !== ''}"
>
{{ project.title }}
</span>
@ -13,7 +13,7 @@
<ColorBubble
v-if="task.hexColor !== ''"
:color="getHexColor(task.hexColor)"
class="me-1"
class="mie-1"
/>
<PriorityLabel
@ -36,7 +36,7 @@
<Labels
v-if="task.labels.length > 0"
class="labels ms-2 me-1"
class="labels mis-2 mie-1"
:labels="task.labels"
/>
@ -44,7 +44,7 @@
v-if="task.assignees.length > 0"
:assignees="task.assignees"
:avatar-size="20"
class="ms-1"
class="mis-1"
:inline="true"
/>

View File

@ -11,3 +11,4 @@
@import "typography";
@import 'helpers';
@import 'navigation';
@import 'logical-spacing';

View File

@ -0,0 +1,40 @@
$bulma-sizes: (
0: 0,
1: 0.25rem,
2: 0.5rem,
3: 0.75rem,
4: 1rem,
5: 1.5rem,
6: 3rem,
);
$types: (
p: padding,
m: margin,
b: border,
);
@each $name, $val in $bulma-sizes {
@each $type, $property in $types {
.#{$type}is-#{$name} {
#{$property}-inline-start: #{$val};
}
.#{$type}ie-#{$name} {
#{$property}-inline-end: #{$val};
}
.#{$type}bs-#{$name} {
#{$property}-block-start: #{$val};
}
.#{$type}be-#{$name} {
#{$property}-block-end: #{$val};
}
}
}
.has-text-start {
text-align: start;
}
.has-text-end {
text-align: end;
}

View File

@ -7,7 +7,7 @@
<Message
v-if="deletionScheduledAt !== null"
variant="danger"
class="mb-4"
class="mbe-4"
>
{{
$t('user.deletion.scheduled', {
@ -26,7 +26,7 @@
<ImportHint v-if="tasksLoaded" />
<div
v-if="projectHistory.length > 0"
class="is-max-width-desktop has-text-start mt-4"
class="is-max-width-desktop has-text-start mbs-4"
>
<h3>{{ $t('home.lastViewed') }}</h3>
<ProjectCardGrid

View File

@ -10,7 +10,7 @@
<Message
v-if="migrationError"
variant="danger"
class="mb-4"
class="mbe-4"
>
{{ migrationError }}
</Message>
@ -62,7 +62,7 @@
</div>
</template>
<div v-else-if="!migrationJustStarted && lastMigrationStartedAt && lastMigrationFinishedAt === null">
<Message class="mb-4">
<Message class="mbe-4">
{{ $t('migrate.migrationInProgress') }}
</Message>
<XButton :to="{name: 'home'}">
@ -92,13 +92,13 @@
<div v-else>
<Message
v-if="migrator.isFileMigrator"
class="mb-4"
class="mbe-4"
>
{{ message }}
</Message>
<Message
v-else
class="mb-4"
class="mbe-4"
>
{{ $t('migrate.migrationStartedWillReciveEmail', {service: migrator.name}) }}
</Message>

View File

@ -8,7 +8,7 @@
>
<div
v-if="uploadBackgroundEnabled"
class="mb-4"
class="mbe-4"
>
<input
ref="backgroundUploadInput"
@ -76,7 +76,7 @@
<XButton
v-if="backgroundSearchResult.length > 0"
:disabled="backgroundService.loading"
class="is-load-more-button mt-4"
class="is-load-more-button mbs-4"
:shadow="false"
variant="secondary"
@click="searchBackgrounds(currentPage + 1)"

View File

@ -19,7 +19,7 @@
<LinkSharing
v-if="linkSharingEnabled"
:project-id="projectId"
class="mt-4"
class="mbs-4"
/>
</CreateEdit>
</template>

View File

@ -132,11 +132,11 @@ async function saveViewPosition(e) {
<ViewEditForm
v-if="showCreateForm"
v-model="newView"
class="mb-4"
class="mbe-4"
/>
<div
v-if="isAdmin"
class="is-flex is-justify-content-end mb-4"
class="is-flex is-justify-content-end mbe-4"
>
<XButton
:loading="projectViewService.loading"
@ -178,7 +178,7 @@ async function saveViewPosition(e) {
<td colspan="3">
<ViewEditForm
v-model="viewToEdit"
class="mb-4"
class="mbe-4"
:loading="projectViewService.loading"
:show-save-buttons="true"
@cancel="viewToEdit = null"
@ -192,7 +192,7 @@ async function saveViewPosition(e) {
<td class="has-text-end actions">
<XButton
v-if="isAdmin"
class="is-danger me-2"
class="is-danger mie-2"
icon="trash-alt"
@click="() => {
viewIdToDelete = v.id

View File

@ -124,7 +124,7 @@ function validateSelectedEvents() {
<XButton
v-if="!(webhooks?.length === 0 || showNewForm)"
icon="plus"
class="mb-4"
class="mbe-4"
@click="showNewForm = true"
>
{{ $t('project.webhooks.create') }}

View File

@ -7,7 +7,7 @@
v-if="authenticateWithPassword"
class="box"
>
<p class="pb-2">
<p class="pbe-2">
{{ $t('sharing.passwordRequired') }}
</p>
<div class="field">
@ -34,7 +34,7 @@
<Message
v-if="errorMessage !== ''"
variant="danger"
class="mt-4"
class="mbs-4"
>
{{ errorMessage }}
</Message>
@ -72,12 +72,13 @@ function useAuth() {
const password = ref('')
const authLinkShare = computed(() => authStore.authLinkShare)
function redirectToProject(projectId: IProject['id']) {
const hash = LINK_SHARE_HASH_PREFIX + route.params.share
const viewId = new URLSearchParams(window.location.search).get('view') || null
const viewId =
new URLSearchParams(window.location.search).get('view') || null
const last = getLastVisitedRoute()
if (last) {
return router.push({
@ -85,8 +86,8 @@ function useAuth() {
hash,
})
}
if(viewId) {
if (viewId) {
return router.push({
name: 'project.view',
params: {

View File

@ -3,7 +3,7 @@
v-cy="'showTasks'"
class="is-max-width-desktop has-text-start"
>
<h3 class="mb-2 title">
<h3 class="mbe-2 title">
{{ pageTitle }}
</h3>
<p
@ -15,7 +15,7 @@
<XButton
variant="primary"
:shadow="false"
class="mb-2"
class="mbe-2"
@click.prevent.stop="toggle()"
>
{{ $t('task.show.select') }}
@ -24,7 +24,7 @@
</DatepickerWithRange>
<FancyCheckbox
:model-value="showNulls"
class="me-2"
class="mie-2"
@update:modelValue="setShowNulls"
>
{{ $t('task.show.noDates') }}
@ -37,7 +37,7 @@
</FancyCheckbox>
</p>
<template v-if="!loading && (!tasks || tasks.length === 0) && showNothingToDo">
<h3 class="has-text-centered mt-6">
<h3 class="has-text-centered mbs-6">
{{ $t('task.show.noTasks') }}
</h3>
<LlamaCool class="llama-cool" />

View File

@ -51,7 +51,7 @@
<ChecklistSummary :task="task" />
<!-- Content and buttons -->
<div class="columns mt-2">
<div class="columns mbs-2">
<!-- Content -->
<div
:class="{'is-two-thirds': canWrite}"
@ -77,7 +77,7 @@
<AssigneeList
v-else
:assignees="task.assignees"
class="mt-2"
class="mbs-2"
/>
</div>
<CustomTransition
@ -352,7 +352,7 @@
<!-- Related Tasks -->
<div
v-if="activeFields.relatedTasks"
class="content details mb-0"
class="content details mbe-0"
>
<h3>
<span class="icon is-grey">
@ -576,7 +576,7 @@
</template>
<template #text>
<p class="tw-text-balance !tw-mb-0">
<p class="tw-text-balance !tw-mbe-0">
{{ $t('task.detail.delete.text1') }}
</p>
<p class="tw-text-balance">

View File

@ -71,7 +71,7 @@
</div>
</form>
<div class="field has-addons mt-4">
<div class="field has-addons mbs-4">
<div class="control is-fullwidth">
<XButton
:loading="teamService.loading"
@ -176,7 +176,7 @@
<XButton
v-if="m.id !== userInfo.id"
:loading="teamMemberService.loading"
class="me-2"
class="mie-2"
@click="() => toggleUserType(m)"
>
{{ m.admin ? $t('team.edit.makeMember') : $t('team.edit.makeAdmin') }}

View File

@ -34,13 +34,13 @@
<XButton
v-focus
:loading="dataExportService.loading"
class="mt-4 me-4"
class="mbs-4 mie-4"
@click="download()"
>
{{ $t('misc.download') }}
</XButton>
<XButton
class="button mt-4"
class="button mbs-4"
:to="{name:'user.settings.data-export'}"
variant="tertary"
>

View File

@ -4,14 +4,14 @@
v-if="confirmedEmailSuccess"
variant="success"
text-align="center"
class="mb-4"
class="mbe-4"
>
{{ $t('user.auth.confirmEmailSuccess') }}
</Message>
<Message
v-if="errorMessage"
variant="danger"
class="mb-4"
class="mbe-4"
>
{{ errorMessage }}
</Message>
@ -100,7 +100,7 @@
<input
v-model="rememberMe"
type="checkbox"
class="me-1"
class="mie-1"
>
{{ $t('user.auth.remember') }}
</label>
@ -115,7 +115,7 @@
</XButton>
<p
v-if="registrationEnabled"
class="mt-2"
class="mbs-2"
>
{{ $t('user.auth.noAccountYet') }}
<RouterLink
@ -130,13 +130,13 @@
<div
v-if="hasOpenIdProviders"
class="mt-4"
class="mbs-4"
>
<XButton
v-for="(p, k) in openidConnect.providers"
:key="k"
variant="secondary"
class="is-fullwidth mt-2"
class="is-fullwidth mbs-2"
@click="redirectToProvider(p)"
>
{{ $t('user.auth.loginWith', {provider: p.name}) }}

View File

@ -9,7 +9,7 @@
<Message
v-if="errorMessageFromQuery"
variant="danger"
class="mt-2"
class="mbs-2"
>
{{ errorMessageFromQuery }}
</Message>

View File

@ -2,20 +2,20 @@
<div>
<Message
v-if="errorMsg"
class="mb-4"
class="mbe-4"
>
{{ errorMsg }}
</Message>
<div
v-if="successMessage"
class="has-text-centered mb-4"
class="has-text-centered mbe-4"
>
<Message variant="success">
{{ successMessage }}
</Message>
<XButton
:to="{ name: 'user.login' }"
class="mt-4"
class="mbs-4"
>
{{ $t('user.auth.login') }}
</XButton>

View File

@ -3,7 +3,7 @@
<Message
v-if="errorMessage !== ''"
variant="danger"
class="mb-4"
class="mbe-4"
>
{{ errorMessage }}
</Message>
@ -82,7 +82,7 @@
<XButton
id="register-submit"
:loading="isLoading"
class="me-2"
class="mie-2"
:disabled="!everythingValid"
@click="submit"
>
@ -92,14 +92,14 @@
<Message
v-if="configStore.demoModeEnabled"
variant="warning"
class="mt-4"
class="mbs-4"
>
{{ $t('demo.title') }}
{{ $t('demo.accountWillBeDeleted') }}<br>
<strong class="is-uppercase">{{ $t('demo.everythingWillBeDeleted') }}</strong>
</Message>
<p class="mt-2">
<p class="mbs-2">
{{ $t('user.auth.alreadyHaveAnAccount') }}
<RouterLink :to="{ name: 'user.login' }">
{{ $t('user.auth.login') }}

View File

@ -3,20 +3,20 @@
<Message
v-if="errorMsg"
variant="danger"
class="mb-4"
class="mbe-4"
>
{{ errorMsg }}
</Message>
<div
v-if="isSuccess"
class="has-text-centered mb-4"
class="has-text-centered mbe-4"
>
<Message variant="success">
{{ $t('user.auth.resetPasswordSuccess') }}
</Message>
<XButton
:to="{ name: 'user.login' }"
class="mt-4"
class="mbs-4"
>
{{ $t('user.auth.login') }}
</XButton>

View File

@ -162,7 +162,7 @@ function toggleGroupPermissionsFromChild(group: string, checked: boolean) {
<Card :title="$t('user.settings.apiTokens.title')">
<Message
v-if="tokenCreatedSuccessMessage !== ''"
class="has-text-centered mb-4"
class="has-text-centered mbe-4"
>
{{ tokenCreatedSuccessMessage }}<br>
{{ $t('user.settings.apiTokens.tokenCreatedNotSeeAgain') }}
@ -290,7 +290,7 @@ function toggleGroupPermissionsFromChild(group: string, checked: boolean) {
<flat-pickr
v-if="newTokenExpiry === 'custom'"
v-model="newTokenExpiryCustom"
class="ms-2"
class="mis-2"
:config="flatPickerConfig"
/>
</div>
@ -303,14 +303,14 @@ function toggleGroupPermissionsFromChild(group: string, checked: boolean) {
<div
v-for="(routes, group) in availableRoutes"
:key="group"
class="mb-2"
class="mbe-2"
>
<template
v-if="Object.keys(routes).length >= 1"
>
<FancyCheckbox
v-model="newTokenPermissionsGroup[group]"
class="me-2 is-capitalized has-text-weight-bold"
class="mie-2 is-capitalized has-text-weight-bold"
@update:modelValue="checked => selectPermissionGroup(group, checked)"
>
{{ formatPermissionTitle(group) }}
@ -323,7 +323,7 @@ function toggleGroupPermissionsFromChild(group: string, checked: boolean) {
>
<FancyCheckbox
v-model="newTokenPermissions[group][route]"
class="ms-4 me-2 is-capitalized"
class="mis-4 mie-2 is-capitalized"
@update:modelValue="checked => toggleGroupPermissionsFromChild(group, checked)"
>
{{ formatPermissionTitle(route) }}
@ -350,7 +350,7 @@ function toggleGroupPermissionsFromChild(group: string, checked: boolean) {
<XButton
v-else
icon="plus"
class="mb-4"
class="mbe-4"
:loading="service.loading"
@click="() => showCreateForm = true"
>

View File

@ -9,7 +9,7 @@
</Message>
<template v-else>
<div class="control mb-4">
<div class="control mbe-4">
<label
v-for="(label, providerId) in AVATAR_PROVIDERS"
:key="providerId"
@ -46,7 +46,7 @@
ref="cropper"
:src="avatarToCrop"
:stencil-props="{aspectRatio: 1}"
class="mb-4 cropper"
class="mbe-4 cropper"
@ready="() => loading = false"
/>
<XButton
@ -61,7 +61,7 @@
<div
v-else
class="mt-2"
class="mbs-2"
>
<XButton
:loading="avatarService.loading || loading"

View File

@ -25,7 +25,7 @@
</div>
</div>
<h5 class="mt-5 mb-4 has-text-weight-bold">
<h5 class="mbs-5 mbe-4 has-text-weight-bold">
{{ $t('user.settings.caldav.tokens') }}
</h5>
@ -72,7 +72,7 @@
<Message
v-if="newToken"
class="mb-4"
class="mbe-4"
>
{{ $t('user.settings.caldav.tokenCreated', {token: newToken.token}) }}<br>
{{ $t('user.settings.caldav.wontSeeItAgain') }}
@ -80,7 +80,7 @@
<XButton
icon="plus"
class="mb-4"
class="mbe-4"
:loading="service.loading"
@click="createToken"
>

View File

@ -2,7 +2,7 @@
<Card :title="$t('user.export.title')">
<Message
v-if="exportInfo"
class="mb-4"
class="mbe-4"
>
<div class="export-message">
<p>
@ -63,7 +63,7 @@
<XButton
:loading="dataExportService.loading"
class="is-fullwidth mt-4"
class="is-fullwidth mbs-4"
@click="requestDataExport()"
>
{{ $t('user.export.request') }}

View File

@ -51,7 +51,7 @@
<XButton
:loading="accountDeleteService.loading"
class="is-fullwidth mt-4"
class="is-fullwidth mbs-4"
@click="cancelDeletion()"
>
{{ $t('user.deletion.scheduledCancelConfirm') }}
@ -101,7 +101,7 @@
<XButton
:loading="accountDeleteService.loading"
class="is-fullwidth mt-4 is-danger"
class="is-fullwidth mbs-4 is-danger"
@click="deleteAccount()"
>
{{ $t('user.deletion.confirm') }}

View File

@ -40,7 +40,7 @@
<XButton
:loading="emailUpdateService.loading"
class="is-fullwidth mt-4"
class="is-fullwidth mbs-4"
@click="updateEmail"
>
{{ $t('misc.save') }}

View File

@ -60,7 +60,7 @@
<XButton
:loading="passwordUpdateService.loading"
class="is-fullwidth mt-4"
class="is-fullwidth mbs-4"
@click="updatePassword"
>
{{ $t('misc.save') }}

View File

@ -83,7 +83,7 @@
</XButton>
<XButton
variant="tertiary"
class="ms-2"
class="mis-2"
@click="totpDisableForm = false"
>
{{ $t('misc.cancel') }}