- Added possibility to follow groups and be notified from new upcoming events - Export list of participants to CSV, `PDF` and `ODS` - Allow to set timezone for an event. The timezone is automatically defined from the address if one is defined. If the event timezone is different than the user's current one, a toggle is shown to switch between the two. - Added initial support for Right To Left languages (such as arabic) and [BiDi](https://en.wikipedia.org/wiki/Bidirectional_text) - Group followers and members get an notification email by default when a group publishes a new event (subject to activity notification settings) - Group admins can now approve or deny new memberships - Build releases in `arm` and `arm64` format in addition to `amd64` - Build Docker images in `arm` and `arm64` format in addition to `amd64` - Added possibility to indicate the event is fully online - Added possibility to search only for online events - Added possibility to search only in past events - Detect event, comments and posts languages automatically. Allows setting language - Allow to change an user's password through the users.modify mix task - Add instance setting so that only the admin can create groups - Add instance setting so that only groups can create events - Added JSON-LD metadata about the event in emails - Added a quick link to email notification settings at the bottom of emails - Allow to access Mobilizon with a specific language directly by using `https://instance.tld/lang` where `lang` is a language supported by Mobilizon - Added organizer actor name (profile or group) in the icalendar export - Add initial support for federation with Gancio - Multiple UI improvements, including post, event and participation cards, discussions and emails. The « My Events » page was also redesigned to allow showing events from your groups. - Various accessibility improvements - Event update notification is send to participants ~30 minutes after the event update, so that successive edits are throttled. - Event, post and comments titles and content now have expose their detected language in HTML, for improved screen reader experience - Delete current actor ID as well from local storage when unlogging - Show a default text for instance contact in default terms text when no instance contact is set - Only show locatecontrol button in leaflet map when we can do geolocation - Disable push column in notification settings when push is not available - Show actual language instead of language code in Users admin view - Empty old & new passwords fields when successful password change - Don't link to the group page from admin when actor is suspended - Warn participants when the event organizer is suspended (and therefore the event cancelled) - Improve metadata on public page - Make sure some event action pages (participate remotely or without an account) don't get indexed by search engines - Only send `Tombstone` element in `Delete` activities, not the whole previous deleted element. - Make sure `Delete` activity are send correctly to everyone - Only add address and tags to event icalendar export if they exist - `master` branch has been renamed to `main` - Mention following groups on the registration page - Add missing group name to activity notifications - Warn while registering and logging when the email contains uppercase characters - Improve json-ld metadata on event live streams - Add "eventAttendanceMode" to JSON-ld schema.org event representation - Improve sending pending participation notifications - Add "formerType" and "delete" attributes on Tombstones ActivityPub objects representation - Improve MyEvents page description text - Support for Elixir < 1.12 and OTP < 22 - Fix tags autocomplete - Fix config onboarding after LDAP initial connexion - Fix events pagination on tags page - Fixed deduplicated files from orphan media being deleted as well - Fix deleting own account - Fix search returning user profiles instead of only groups - Fix federating geo coordinates - Fix an issue with group activity items when moving resources - Fix an issue with Identity Picker - Fix an issue with TagInput - Fix an issue when leaving a group - Fix admin settings edition - Fix an issue when showing public page of suspended group - Removed non existing page (`/about/mobilizon`) from sitemap - Fix action logs containing group suspension events - Fixed group physical address not exposed to ActivityPub - Release front-end files are no longer in duplicate - Only show datetime timezone toggle on event if the timezone offset is different from our own - Fix error when determining audience for Discussion when deleting a comment - Fix a couple of accessibility issues - Limit to acceptable tags when pasting raw HTML into comment fields on front-end - Fixed group map display - Fixed updating group physical address - Allow group members to access group drafts - Improve group refreshment workflow - Fixed date signature generation for federation - Fixed an issue when duplicating a group event from another profile - Fixed event metadata not saved on eventcreation - Use a different pagination parameter for searched events and featured events on search page - Fixed creating group activities when creating events with some fields - Move release package at correct path for CI upload - Fixed event contacts that were not exposed and fetched over federation - Don't sign fetch when fetching actor for a given signature - Some various HTTP signatures issues - Fixed actor AP representation of avatar - Handle errors when fetching actor pictures - Fixed sending group events to followers on Mastodon - Fixed actors avatars and banners being deleted if the same file was also an orphan media - Fix spacing in organizer picker - Increase number of close events and follow group events - Fix accessing user profile in admin section - Set initial values for some EventMetadata elements, fixing submitting them right away with no value - Avoid giving an error page if the apollo futureParticipations query is undefined - Fixed path to exports in production - Fixed padding below truncated title of event cards - Fixed exports that weren't enabled in Docker - Fixed error page when event end date is null - Fixed event language not being allowed to be null - Fixed private messages sent as event replies from Mastodon that were shown publically as public comments. They are now discarded. - Czech - Gaelic - German - Hungarian - Indonesian - Norwegian Nynorsk - Occitan - Persian - Portuguese (Brazil) - Russian - Slovenian - Spanish -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEExMITpfxOHHCvHn8FoGG53eDKB3MFAmGcqEMACgkQoGG53eDK B3NlaA/8DoAi7WtC+//xJn8tRSP04PuTRDi2+9/D9a6gjTsiPXDZdb7LtEHuCg1H PXsHNQOTafUM/T7b7XTGmKOST3Sz2kw4eKJArCyF+NuvCwiO/Iw/v1wev2Mo8vvC eDBbMkfiCnMHcytqheeM9gvGuRyIOfgQ9uPk54snfa9a+SGELR5XDRKhwBlGAs6i nkUPbOB72oCou79HZ6CjyLTG6CoWUVsheuvAEhYw52e5JlWSJb9yOUdnOYUV1sr6 OzLct996Z3IOQX4ToaQ+Re99tOaEyqO98aHsv+Wbz128sku0WrfseKn9zi3PL6cF LYjtZ9+0dwdNi3MfgKoEoWJaMlN3+6WUw/blcVP+6b6Ibn5YV/HkVacke/rGoAry oiEjP4HFKnvT83dTBn+LRcU6MY3MrZsarjUACjcKIwpTiylw9gaqA0i7dPBdW35p Q4c1gIh1Q/aE5OKCxXGLrg6s1SNZ754cAyEVo85UnF8Iu4wiaY++ImvyG8xIoOWf vQuya3LcDT8Gj9KY/LWMrVT8LJ2ij5t8oRMFLIHLlfiWbq05m6QaBIWr5sLjLO/N w2N1//ZHNM3sJNl0bZgc9g4lhcdj52VhOcHLot4fdcg5RTektCK0ky5uTD4WJ3GP keihAR8ZtFLaiAQ+XN6ng3IhrgQcpIdJBLlHzgFBx2rTBy8a0Tw= =jyrf -----END PGP SIGNATURE----- Merge tag '2.0.0' into chapril Please read the [UPGRADE.md](https://framagit.org/framasoft/mobilizon/-/blob/main/UPGRADE.md#upgrading-from-13-to-20) file as well. - Added possibility to follow groups and be notified from new upcoming events - Export list of participants to CSV, `PDF` and `ODS` - Allow to set timezone for an event. The timezone is automatically defined from the address if one is defined. If the event timezone is different than the user's current one, a toggle is shown to switch between the two. - Added initial support for Right To Left languages (such as arabic) and [BiDi](https://en.wikipedia.org/wiki/Bidirectional_text) - Group followers and members get an notification email by default when a group publishes a new event (subject to activity notification settings) - Group admins can now approve or deny new memberships - Build releases in `arm` and `arm64` format in addition to `amd64` - Build Docker images in `arm` and `arm64` format in addition to `amd64` - Added possibility to indicate the event is fully online - Added possibility to search only for online events - Added possibility to search only in past events - Detect event, comments and posts languages automatically. Allows setting language - Allow to change an user's password through the users.modify mix task - Add instance setting so that only the admin can create groups - Add instance setting so that only groups can create events - Added JSON-LD metadata about the event in emails - Added a quick link to email notification settings at the bottom of emails - Allow to access Mobilizon with a specific language directly by using `https://instance.tld/lang` where `lang` is a language supported by Mobilizon - Added organizer actor name (profile or group) in the icalendar export - Add initial support for federation with Gancio - Multiple UI improvements, including post, event and participation cards, discussions and emails. The « My Events » page was also redesigned to allow showing events from your groups. - Various accessibility improvements - Event update notification is send to participants ~30 minutes after the event update, so that successive edits are throttled. - Event, post and comments titles and content now have expose their detected language in HTML, for improved screen reader experience - Delete current actor ID as well from local storage when unlogging - Show a default text for instance contact in default terms text when no instance contact is set - Only show locatecontrol button in leaflet map when we can do geolocation - Disable push column in notification settings when push is not available - Show actual language instead of language code in Users admin view - Empty old & new passwords fields when successful password change - Don't link to the group page from admin when actor is suspended - Warn participants when the event organizer is suspended (and therefore the event cancelled) - Improve metadata on public page - Make sure some event action pages (participate remotely or without an account) don't get indexed by search engines - Only send `Tombstone` element in `Delete` activities, not the whole previous deleted element. - Make sure `Delete` activity are send correctly to everyone - Only add address and tags to event icalendar export if they exist - `master` branch has been renamed to `main` - Mention following groups on the registration page - Add missing group name to activity notifications - Warn while registering and logging when the email contains uppercase characters - Improve json-ld metadata on event live streams - Add "eventAttendanceMode" to JSON-ld schema.org event representation - Improve sending pending participation notifications - Add "formerType" and "delete" attributes on Tombstones ActivityPub objects representation - Improve MyEvents page description text - Support for Elixir < 1.12 and OTP < 22 - Fix tags autocomplete - Fix config onboarding after LDAP initial connexion - Fix events pagination on tags page - Fixed deduplicated files from orphan media being deleted as well - Fix deleting own account - Fix search returning user profiles instead of only groups - Fix federating geo coordinates - Fix an issue with group activity items when moving resources - Fix an issue with Identity Picker - Fix an issue with TagInput - Fix an issue when leaving a group - Fix admin settings edition - Fix an issue when showing public page of suspended group - Removed non existing page (`/about/mobilizon`) from sitemap - Fix action logs containing group suspension events - Fixed group physical address not exposed to ActivityPub - Release front-end files are no longer in duplicate - Only show datetime timezone toggle on event if the timezone offset is different from our own - Fix error when determining audience for Discussion when deleting a comment - Fix a couple of accessibility issues - Limit to acceptable tags when pasting raw HTML into comment fields on front-end - Fixed group map display - Fixed updating group physical address - Allow group members to access group drafts - Improve group refreshment workflow - Fixed date signature generation for federation - Fixed an issue when duplicating a group event from another profile - Fixed event metadata not saved on eventcreation - Use a different pagination parameter for searched events and featured events on search page - Fixed creating group activities when creating events with some fields - Move release package at correct path for CI upload - Fixed event contacts that were not exposed and fetched over federation - Don't sign fetch when fetching actor for a given signature - Some various HTTP signatures issues - Fixed actor AP representation of avatar - Handle errors when fetching actor pictures - Fixed sending group events to followers on Mastodon - Fixed actors avatars and banners being deleted if the same file was also an orphan media - Fix spacing in organizer picker - Increase number of close events and follow group events - Fix accessing user profile in admin section - Set initial values for some EventMetadata elements, fixing submitting them right away with no value - Avoid giving an error page if the apollo futureParticipations query is undefined - Fixed path to exports in production - Fixed padding below truncated title of event cards - Fixed exports that weren't enabled in Docker - Fixed error page when event end date is null - Fixed event language not being allowed to be null - Fixed private messages sent as event replies from Mastodon that were shown publically as public comments. They are now discarded. - Czech - Gaelic - German - Hungarian - Indonesian - Norwegian Nynorsk - Occitan - Persian - Portuguese (Brazil) - Russian - Slovenian - Spanish
411 lines
10 KiB
Vue
Executable File
411 lines
10 KiB
Vue
Executable File
<template>
|
|
<b-navbar
|
|
id="navbar"
|
|
type="is-secondary"
|
|
wrapper-class="container"
|
|
:active.sync="mobileNavbarActive"
|
|
>
|
|
<template slot="brand">
|
|
<b-navbar-item
|
|
tag="router-link"
|
|
:to="{ name: RouteName.HOME }"
|
|
:aria-label="$t('Home')"
|
|
>
|
|
<img
|
|
src="/img/long_logo_chapril_mobilizon.png"
|
|
alt="logo mobilizon"
|
|
style="width: 5em"
|
|
/>
|
|
</b-navbar-item>
|
|
</template>
|
|
<template slot="start">
|
|
<b-navbar-item tag="router-link" :to="{ name: RouteName.SEARCH }">{{
|
|
$t("Explore")
|
|
}}</b-navbar-item>
|
|
<b-navbar-item
|
|
v-if="currentActor.id && currentUser.isLoggedIn"
|
|
tag="router-link"
|
|
:to="{ name: RouteName.MY_EVENTS }"
|
|
>{{ $t("My events") }}</b-navbar-item
|
|
>
|
|
<b-navbar-item
|
|
tag="router-link"
|
|
:to="{ name: RouteName.MY_GROUPS }"
|
|
v-if="
|
|
config &&
|
|
config.features.groups &&
|
|
currentActor.id &&
|
|
currentUser.isLoggedIn
|
|
"
|
|
>{{ $t("My groups") }}</b-navbar-item
|
|
>
|
|
<b-navbar-item
|
|
tag="span"
|
|
v-if="
|
|
config &&
|
|
config.features.eventCreation &&
|
|
currentActor.id &&
|
|
currentUser.isLoggedIn
|
|
"
|
|
>
|
|
<b-button
|
|
v-if="!hideCreateEventsButton"
|
|
tag="router-link"
|
|
:to="{ name: RouteName.CREATE_EVENT }"
|
|
type="is-primary"
|
|
>{{ $t("Create") }}</b-button
|
|
>
|
|
</b-navbar-item>
|
|
<b-navbar-item
|
|
v-if="config && config.features.koenaConnect"
|
|
class="koena"
|
|
tag="a"
|
|
href="https://mediation.koena.net/framasoft/mobilizon/"
|
|
target="_blank"
|
|
rel="noopener external"
|
|
hreflang="fr"
|
|
>
|
|
<img
|
|
src="/img/koena-a11y.svg"
|
|
width="150"
|
|
alt="Contact accessibilité"
|
|
/>
|
|
</b-navbar-item>
|
|
</template>
|
|
<template slot="end">
|
|
<b-navbar-item
|
|
href="https://www.chapril.org"
|
|
:aria-label="'www.chapril.org'"
|
|
>
|
|
<img
|
|
src="/img/pics/logo_chapril_mobilizon.png"
|
|
alt="logo chapril mobilizon"
|
|
/>
|
|
</b-navbar-item>
|
|
<b-navbar-item tag="div">
|
|
<search-field @navbar-search="mobileNavbarActive = false" />
|
|
</b-navbar-item>
|
|
|
|
<b-navbar-dropdown
|
|
v-if="currentActor.id && currentUser.isLoggedIn"
|
|
right
|
|
collapsible
|
|
ref="user-dropdown"
|
|
tabindex="0"
|
|
tag="span"
|
|
@keyup.enter="toggleMenu"
|
|
>
|
|
<template slot="label" v-if="currentActor">
|
|
<div class="identity-wrapper">
|
|
<div>
|
|
<figure class="image is-32x32" v-if="currentActor.avatar">
|
|
<img
|
|
class="is-rounded"
|
|
alt="avatarUrl"
|
|
:src="currentActor.avatar.url"
|
|
/>
|
|
</figure>
|
|
<b-icon v-else icon="account-circle" />
|
|
</div>
|
|
<div class="media-content is-hidden-desktop">
|
|
<span>{{ displayName(currentActor) }}</span>
|
|
<span class="has-text-grey-dark" v-if="currentActor.name"
|
|
>@{{ currentActor.preferredUsername }}</span
|
|
>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<!-- No identities dropdown if no identities -->
|
|
<span v-if="identities.length <= 1" />
|
|
<b-navbar-item
|
|
tag="span"
|
|
v-for="identity in identities"
|
|
v-else
|
|
:active="identity.id === currentActor.id"
|
|
:key="identity.id"
|
|
tabindex="0"
|
|
@click="setIdentity(identity)"
|
|
@keyup.enter="setIdentity(identity)"
|
|
>
|
|
<span>
|
|
<div class="media-left">
|
|
<figure class="image is-32x32" v-if="identity.avatar">
|
|
<img
|
|
class="is-rounded"
|
|
loading="lazy"
|
|
:src="identity.avatar.url"
|
|
alt
|
|
/>
|
|
</figure>
|
|
<b-icon v-else size="is-medium" icon="account-circle" />
|
|
</div>
|
|
|
|
<div class="media-content">
|
|
<span>{{ displayName(identity) }}</span>
|
|
<span class="has-text-grey-dark" v-if="identity.name"
|
|
>@{{ identity.preferredUsername }}</span
|
|
>
|
|
</div>
|
|
</span>
|
|
|
|
<hr class="navbar-divider" role="presentation" />
|
|
</b-navbar-item>
|
|
|
|
<b-navbar-item
|
|
tag="router-link"
|
|
:to="{ name: RouteName.UPDATE_IDENTITY }"
|
|
>{{ $t("My account") }}</b-navbar-item
|
|
>
|
|
<b-navbar-item
|
|
v-if="currentUser.role === ICurrentUserRole.ADMINISTRATOR"
|
|
tag="router-link"
|
|
:to="{ name: RouteName.ADMIN_DASHBOARD }"
|
|
>{{ $t("Administration") }}
|
|
</b-navbar-item>
|
|
|
|
<b-navbar-item
|
|
tag="span"
|
|
tabindex="0"
|
|
@click="logout"
|
|
@keyup.enter="logout"
|
|
>
|
|
<span>{{ $t("Log out") }}</span>
|
|
</b-navbar-item>
|
|
</b-navbar-dropdown>
|
|
|
|
<b-navbar-item v-else tag="div">
|
|
<div class="buttons">
|
|
<router-link
|
|
class="button is-primary"
|
|
v-if="config && config.registrationsOpen"
|
|
:to="{ name: RouteName.REGISTER }"
|
|
>
|
|
<strong>{{ $t("Sign up") }}</strong>
|
|
</router-link>
|
|
|
|
<router-link
|
|
class="button is-light"
|
|
:to="{ name: RouteName.LOGIN }"
|
|
>{{ $t("Log in") }}</router-link
|
|
>
|
|
</div>
|
|
</b-navbar-item>
|
|
</template>
|
|
</b-navbar>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { Component, Ref, Vue, Watch } from "vue-property-decorator";
|
|
import Logo from "@/components/Logo.vue";
|
|
import { GraphQLError } from "graphql";
|
|
import { loadLanguageAsync } from "@/utils/i18n";
|
|
import { ICurrentUserRole } from "@/types/enums";
|
|
import { CURRENT_USER_CLIENT, USER_SETTINGS } from "../graphql/user";
|
|
import { changeIdentity, logout } from "../utils/auth";
|
|
import {
|
|
CURRENT_ACTOR_CLIENT,
|
|
IDENTITIES,
|
|
UPDATE_DEFAULT_ACTOR,
|
|
} from "../graphql/actor";
|
|
import { displayName, IPerson, Person } from "../types/actor";
|
|
import { CONFIG } from "../graphql/config";
|
|
import { IConfig } from "../types/config.model";
|
|
import { ICurrentUser, IUser } from "../types/current-user.model";
|
|
import SearchField from "./SearchField.vue";
|
|
import RouteName from "../router/name";
|
|
|
|
@Component({
|
|
apollo: {
|
|
currentUser: CURRENT_USER_CLIENT,
|
|
currentActor: CURRENT_ACTOR_CLIENT,
|
|
identities: {
|
|
query: IDENTITIES,
|
|
update: ({ identities }) =>
|
|
identities
|
|
? identities.map((identity: IPerson) => new Person(identity))
|
|
: [],
|
|
skip() {
|
|
return this.currentUser.isLoggedIn === false;
|
|
},
|
|
error({ graphQLErrors }) {
|
|
this.handleErrors(graphQLErrors);
|
|
},
|
|
},
|
|
config: CONFIG,
|
|
loggedUser: {
|
|
query: USER_SETTINGS,
|
|
skip() {
|
|
return !this.currentUser || this.currentUser.isLoggedIn === false;
|
|
},
|
|
},
|
|
},
|
|
components: {
|
|
Logo,
|
|
SearchField,
|
|
},
|
|
})
|
|
export default class NavBar extends Vue {
|
|
currentActor!: IPerson;
|
|
|
|
config!: IConfig;
|
|
|
|
currentUser!: ICurrentUser;
|
|
|
|
loggedUser!: IUser;
|
|
|
|
ICurrentUserRole = ICurrentUserRole;
|
|
|
|
identities: IPerson[] = [];
|
|
|
|
RouteName = RouteName;
|
|
|
|
mobileNavbarActive = false;
|
|
|
|
displayName = displayName;
|
|
|
|
@Ref("user-dropdown") userDropDown!: any;
|
|
|
|
toggleMenu(): void {
|
|
console.debug("called toggleMenu");
|
|
this.userDropDown.showMenu();
|
|
}
|
|
|
|
@Watch("currentActor")
|
|
async initializeListOfIdentities(): Promise<void> {
|
|
if (!this.currentUser.isLoggedIn) return;
|
|
const { data } = await this.$apollo.query<{ identities: IPerson[] }>({
|
|
query: IDENTITIES,
|
|
});
|
|
if (data) {
|
|
this.identities = data.identities.map(
|
|
(identity: IPerson) => new Person(identity)
|
|
);
|
|
|
|
// If we don't have any identities, the user has validated their account,
|
|
// is logging for the first time but didn't create an identity somehow
|
|
if (this.identities.length === 0) {
|
|
try {
|
|
await this.$router.push({
|
|
name: RouteName.REGISTER_PROFILE,
|
|
params: {
|
|
email: this.currentUser.email,
|
|
userAlreadyActivated: "true",
|
|
},
|
|
});
|
|
} catch (err) {
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Watch("loggedUser")
|
|
setSavedLanguage(): void {
|
|
if (this.loggedUser?.locale) {
|
|
console.debug("Setting locale from navbar");
|
|
loadLanguageAsync(this.loggedUser.locale);
|
|
}
|
|
}
|
|
|
|
async handleErrors(errors: GraphQLError[]): Promise<void> {
|
|
if (
|
|
errors.length > 0 &&
|
|
errors[0].message ===
|
|
"You need to be logged-in to view your list of identities"
|
|
) {
|
|
await this.logout();
|
|
}
|
|
}
|
|
|
|
async logout(): Promise<void> {
|
|
await logout(this.$apollo.provider.defaultClient);
|
|
this.$buefy.notification.open({
|
|
message: this.$t("You have been disconnected") as string,
|
|
type: "is-success",
|
|
position: "is-bottom-right",
|
|
duration: 5000,
|
|
});
|
|
|
|
if (this.$route.name === RouteName.HOME) return;
|
|
await this.$router.push({ name: RouteName.HOME });
|
|
}
|
|
|
|
async setIdentity(identity: IPerson): Promise<void> {
|
|
await this.$apollo.mutate({
|
|
mutation: UPDATE_DEFAULT_ACTOR,
|
|
variables: {
|
|
preferredUsername: identity.preferredUsername,
|
|
},
|
|
});
|
|
return changeIdentity(this.$apollo.provider.defaultClient, identity);
|
|
}
|
|
|
|
get hideCreateEventsButton(): boolean {
|
|
return !!this.config?.restrictions?.onlyGroupsCanCreateEvents;
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
@use "@/styles/_mixins" as *;
|
|
nav {
|
|
.navbar-item {
|
|
a.button {
|
|
font-weight: bold;
|
|
}
|
|
|
|
svg {
|
|
height: 1.75rem;
|
|
}
|
|
}
|
|
|
|
.navbar-dropdown .navbar-item {
|
|
cursor: pointer;
|
|
|
|
span {
|
|
display: flex;
|
|
}
|
|
|
|
&.is-active {
|
|
background: $secondary;
|
|
}
|
|
|
|
span.icon.is-medium {
|
|
display: flex;
|
|
}
|
|
|
|
img {
|
|
max-height: 2.5em;
|
|
}
|
|
}
|
|
|
|
.navbar-item.has-dropdown a.navbar-link figure {
|
|
@include margin-right(0.75rem);
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
a.navbar-item:focus-within {
|
|
background-color: inherit;
|
|
}
|
|
|
|
.koena {
|
|
padding-top: 0;
|
|
padding-bottom: 0;
|
|
& > img {
|
|
max-height: 4rem;
|
|
padding-top: 0.2rem;
|
|
}
|
|
}
|
|
|
|
.identity-wrapper {
|
|
display: flex;
|
|
|
|
.media-content span {
|
|
display: flex;
|
|
color: $violet-2;
|
|
}
|
|
}
|
|
}
|
|
</style>
|