Skip to content
Snippets Groups Projects
Header.vue 5.86 KiB
Newer Older
<!-- eslint-disable -->
<template>
    <span class="dict-label" tabindex="0">{{dict_label}}</span>
    <h2 class="article_header" tabindex="0">{{header_text}}</h2>
    <h2 class="secondary_header" v-if="secondary_header_text.length" tabindex="0">{{secondary_header_text}}</h2>
      <span class="header_group_list" v-if="group_list.length" tabindex="0">{{group_list}}</span>
Ole Voldsæter's avatar
Ole Voldsæter committed
      <details :title="inflect_tooltip" @toggle="toggle()" v-if="inflected" :class="$vuetify.breakpoint.name">
        <summary :class="dictionary" onclick="this.blur()" tabindex="0">bøying</summary>
        <div class="inflection-canvas">
          <inflectionTable :lemmaList="lemmas_with_word_class_and_lang" :mq="$vuetify.breakpoint.name" />
</template>

<script>
  /* eslint-disable */
Ole Voldsæter's avatar
Ole Voldsæter committed
import helpers from '../utils/helpers.js'

import inflectionTable from 'inflection-table'

export default {
  name: 'Header',
  props: {
    lemmas: Array,
  },
  computed: {
    header_text: function() {
      return this.lemmas.map(lemma => lemma.lemma).join(', ')
    },
Ole Voldsæter's avatar
Ole Voldsæter committed
    secondary_header_text: function() {
      let a_forms = []
      this.lemmas.forEach((lemma, i) => {
        if (lemma.paradigm_info[0] && lemma.paradigm_info[0].inflection_group == 'VERB') {
          let inf2 = lemma.paradigm_info[0].inflection[1] && lemma.paradigm_info[0].inflection[1].word_form
          if (inf2 && inf2.length) {
            a_forms.push(inf2)
          }
        }
      });
      return a_forms.join(', ')
    },
Ole Voldsæter's avatar
Ole Voldsæter committed
    inflect_tooltip: function() {
      return this.dictionary == 'bob' ? 'Klikk for å se bøyinger' : 'Klikk for å sjå bøyingar'
    },
Ole Voldsæter's avatar
Ole Voldsæter committed
    dict_label: function() {
      return {
        'bob': 'bokmålsordboka',
        'nob': 'nynorskordboka'
      }[this.dictionary] || ''
Ole Voldsæter's avatar
Ole Voldsæter committed
    },
    group_list: function() {
      return helpers.group_list(this.lemmas, this.dictionary)
    },
    inflection_groups_by_lemma: function() {
      let components = Object.keys(this.$options.components)
      return this.lemmas.map(
        function(lemma_){
          let inflection_groups = lemma_.paradigm_info.reduce((acc, std) =>  Object.assign(acc, {[std.inflection_group]: []}), {})
          lemma_.paradigm_info.forEach(std => inflection_groups[std.inflection_group].push(std))
          return {
            lemma: lemma_.lemma,
Ole Voldsæter's avatar
Ole Voldsæter committed
            inflection_groups: Object.fromEntries(Object.entries(inflection_groups).filter(e => components.includes(e[0].replace('/', '_'))))
    },
    lemmas_with_word_class_and_lang: function() {
      return this.lemmas.map(lemma => Object.assign({language: this.dictionary == 'bob' ? 'nob' : 'nno',
                                                     word_class: lemma.paradigm_info[0].inflection_group.split('_')[0]}, lemma))
Ole Voldsæter's avatar
Ole Voldsæter committed
    },
    inflected: function() {
      return this.lemmas.reduce((acc, lemma) => acc += lemma.paradigm_info.reduce((acc2, digm) => acc2 += digm.inflection.length, 0), 0) > 0
    }
  },
  components: {
  },
  data: function() {
    return {
      inflect_reported: false
    }
  },
  methods: {
    toggle: function() {
      if (! this.inflect_reported) {
        this.$plausible.trackEvent('open inflection', {props: {article: `/${this.dictionary}/${this.article_id}/${this.lemmas[0].lemma}`}})
      }
      this.inflect_reported = true
    }
Ole Voldsæter's avatar
Ole Voldsæter committed
<style>

Ole Voldsæter's avatar
Ole Voldsæter committed

Ole Voldsæter's avatar
Ole Voldsæter committed
summary {
  width: 30em;
Ole Voldsæter's avatar
Ole Voldsæter committed
  padding-top: 4px;
  padding-bottom: 0px;
  font-family: Inria Serif;
Ole Voldsæter's avatar
Ole Voldsæter committed
}

Ole Voldsæter's avatar
Ole Voldsæter committed
article h2.secondary_header {
  padding-top: 0px;
  padding-bottom: 4px;
}

.word-classification {
  text-decoration: underline dashed;
}

Ole Voldsæter's avatar
Ole Voldsæter committed
.dict-label {
Ole Voldsæter's avatar
Ole Voldsæter committed
  color: var(--v-primary-base)  ;
Ole Voldsæter's avatar
Ole Voldsæter committed
  padding-left: 5px;
  position: absolute;
  top: 0px;
Ole Voldsæter's avatar
Ole Voldsæter committed
  font-variant-caps: all-small-caps;
details {
  margin-top: 10px;
  position: relative;
  max-width: 130px;
  border: solid 2px var(--v-primary-base);
  border-radius: 30px;
  padding-top: 6px;
  padding-bottom: 6px;
  padding-right: 10px;
  color: var(--v-primary-base);
  background-color: #ffffff;
details[open] > summary {
  box-shadow: 5px 5px 0px var(--v-primary-base)
}

details > summary:after {
  content: "⌄";
  font-weight: bold;
  position: absolute;
  right: 0;
  top: 1px;
  margin-right: 3px;
}

details > summary.bob:before {
  content: "Se ";
}

details > summary.nob:before {
  content: "Sjå ";
}

details[open] > summary.bob:before, details[open] > summary.nob:before {
  content: "Skjul  ";
}

details[open] > summary:after {
  content: "⌃";
  font-weight: bold;
  position: absolute;
  right: 0;
  top: 8px;
  margin-right: 3px;
}

@keyframes open {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

details[open] summary ~ * {
  animation: open 0.3s ease-in-out;
.inflection-canvas {
  /*position: absolute;*/
  /*max-width: 100vw;*/
  padding-top: 10px;
details > summary::-webkit-details-marker {
  display: none;
.infl-wrapper {
  background-color: #ffffff;
  border: solid 1px;
  color: var(--v-primary-base);
Henrik Askjer's avatar
Henrik Askjer committed
  border-color: var(--v-border-base);
  border-radius: 10px;
  padding: 10px;
  width: min-content;
.context {
  color: var(--v-primary-lighten4) !important;
}
table {
  border-collapse: collapse;
Henrik Askjer's avatar
Henrik Askjer committed
  border-color: var(--v-primary-base);
th, td {
  border: solid 1px;
  padding: 5px;
}

Henrik Askjer's avatar
Henrik Askjer committed
  background-color: var(--v-tertiary-darken1);
  color: var(--v-primary-darken1);
}

.infl-label {
    text-align: center;
    vertical-align: top;
}

article:not(.righ_hand_column) .inflection-canvas {

td.hilite {
    background-color: var(--v-tertiary-base)
}

</style>