mirror of
				https://gitlab.com/PronounsPage/PronounsPage.git
				synced 2025-11-03 19:06:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
    <span
 | 
						|
        v-if="flag"
 | 
						|
        :class="['logo-wrapper rounded-circle d-inline-flex justify-content-center align-items-center', forceShowFlag || forceShowFlagDyn ? 'logo-flag-forced' : '', flagName ? 'logo-has-flag' : '']"
 | 
						|
        :style="flagName ? `--flag: url('/flags/${flagName}.png')` : ''"
 | 
						|
        @transitionend="resetFlagIfNotOverwritten"
 | 
						|
    >
 | 
						|
        <span class="logo" v-html="svg"></span>
 | 
						|
    </span>
 | 
						|
    <span v-else class="logo" v-html="svg"></span>
 | 
						|
</template>
 | 
						|
 | 
						|
<script lang="ts">
 | 
						|
import Vue from 'vue';
 | 
						|
import { Day } from '../src/calendar/helpers.js';
 | 
						|
import { calendar } from '../src/calendar/calendar.js';
 | 
						|
import { ImmutableArray } from '../src/helpers.ts';
 | 
						|
 | 
						|
interface Data {
 | 
						|
    svg: string;
 | 
						|
    flagName: string | null;
 | 
						|
    d: Day | null;
 | 
						|
    forceShowFlagDyn: boolean;
 | 
						|
}
 | 
						|
 | 
						|
export default Vue.extend({
 | 
						|
    props: {
 | 
						|
        flag: { type: Boolean },
 | 
						|
        forceShowFlag: { type: Boolean },
 | 
						|
        day: { default: () => Day.today(), type: Day },
 | 
						|
    },
 | 
						|
    data(): Data {
 | 
						|
        return {
 | 
						|
            svg: process.env.LOGO!,
 | 
						|
            flagName: null,
 | 
						|
            d: this.day,
 | 
						|
            forceShowFlagDyn: false,
 | 
						|
        };
 | 
						|
    },
 | 
						|
    mounted() {
 | 
						|
        this.flagName = this.selectFlag();
 | 
						|
        this.$eventHub.$on('calendar-select', (d: Day | null) => {
 | 
						|
            this.forceShowFlagDyn = !!d;
 | 
						|
            this.d = d;
 | 
						|
            // changing the flag is deferred until the transition has finished so that it does not suddenly change
 | 
						|
            if (d !== null) {
 | 
						|
                this.flagName = this.selectFlag();
 | 
						|
            }
 | 
						|
        });
 | 
						|
    },
 | 
						|
    methods: {
 | 
						|
        selectFlag(): string | null {
 | 
						|
            const events = calendar.getCurrentYear().eventsByDate[(this.d || this.day).toString()];
 | 
						|
            if (!events) {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
            return new ImmutableArray(...events)
 | 
						|
                .filter((e) => e.flag && !e.flag.startsWith('_'))
 | 
						|
                .sorted((a, b) => b.level - a.level)
 | 
						|
                .groupBy((e) => e.level)
 | 
						|
                .indexOrFallback(0, ['0', new ImmutableArray()])[1]
 | 
						|
                .map((e) => e.flag)
 | 
						|
                .randomElement();
 | 
						|
        },
 | 
						|
        resetFlagIfNotOverwritten(): void {
 | 
						|
            if (this.d === null) {
 | 
						|
                this.flagName = this.selectFlag();
 | 
						|
            }
 | 
						|
        },
 | 
						|
    },
 | 
						|
});
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss">
 | 
						|
    .logo-wrapper {
 | 
						|
        width: 1.3em;
 | 
						|
        height: 1.3em;
 | 
						|
        position: relative;
 | 
						|
        overflow: hidden;
 | 
						|
        &:before {
 | 
						|
            content: ' ';
 | 
						|
            display: block;
 | 
						|
            position: absolute;
 | 
						|
            left: 0;
 | 
						|
            top: 0;
 | 
						|
            width: 100%;
 | 
						|
            height: 100%;
 | 
						|
            background-image: var(--flag);
 | 
						|
            background-position: center;
 | 
						|
            background-size: cover;
 | 
						|
            background-repeat: no-repeat;
 | 
						|
            z-index: -5;
 | 
						|
 | 
						|
            opacity: 0;
 | 
						|
            transition: all .25s ease-in-out;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    .logo {
 | 
						|
        height: 1em;
 | 
						|
        width: 1em;
 | 
						|
        display: inline-block;
 | 
						|
        vertical-align: middle;
 | 
						|
        svg {
 | 
						|
            vertical-align: baseline !important;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    .logo-wrapper.logo-flag-forced.logo-has-flag, a:hover .logo-wrapper.logo-has-flag {
 | 
						|
        svg path {
 | 
						|
            stroke: white;
 | 
						|
            stroke-width: 10;
 | 
						|
        }
 | 
						|
        &:before {
 | 
						|
            opacity: 1;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    body[data-theme="dark"] {
 | 
						|
        .logo-wrapper.logo-flag-forced.logo-has-flag, a:hover .logo-wrapper.logo-has-flag {
 | 
						|
            svg path {
 | 
						|
                stroke: black;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
</style>
 |