@erst-vg/vg-design-wrapper 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -45
- package/README.md +2 -2
- package/dist/src/components/VgVideo.vue.d.ts +0 -8
- package/dist/vg-design-wrapper.js +518 -563
- package/dist/vg-design-wrapper.umd.cjs +24 -24
- package/package.json +91 -89
- package/src/assets/icons/abonnementFilled.svg +4 -4
- package/src/assets/icons/abonnementOutline.svg +4 -4
- package/src/assets/icons/accordion.svg +2 -2
- package/src/assets/icons/accordionClose.svg +2 -2
- package/src/assets/icons/accordionCloseOld.svg +6 -6
- package/src/assets/icons/accordionOpen.svg +3 -3
- package/src/assets/icons/accordionOpenOld.svg +6 -6
- package/src/assets/icons/accountCircle.svg +2 -2
- package/src/assets/icons/add.svg +5 -5
- package/src/assets/icons/addBig.svg +5 -5
- package/src/assets/icons/afpublicer.svg +2 -2
- package/src/assets/icons/agenda.svg +3 -3
- package/src/assets/icons/anchorlink.svg +3 -3
- package/src/assets/icons/anchormenuer.svg +3 -3
- package/src/assets/icons/anden.svg +3 -3
- package/src/assets/icons/angleArrowDown.svg +2 -2
- package/src/assets/icons/angleArrowUp.svg +2 -2
- package/src/assets/icons/ansoegninger.svg +6 -6
- package/src/assets/icons/antal-gange.svg +6 -6
- package/src/assets/icons/applikationer.svg +2 -2
- package/src/assets/icons/arrowLeft.svg +2 -2
- package/src/assets/icons/arrowRight.svg +2 -2
- package/src/assets/icons/bell.svg +2 -2
- package/src/assets/icons/bellAlarmFilled.svg +2 -2
- package/src/assets/icons/bellAlarmOutline.svg +2 -2
- package/src/assets/icons/bellOvercrossed.svg +2 -2
- package/src/assets/icons/beskedcenter.svg +2 -2
- package/src/assets/icons/billede.svg +2 -2
- package/src/assets/icons/bogmaerker.svg +2 -2
- package/src/assets/icons/bookmarkFilled.svg +2 -2
- package/src/assets/icons/bookmarkOutline.svg +2 -2
- package/src/assets/icons/breadcrumbArrow.svg +3 -3
- package/src/assets/icons/bred_smal.svg +3 -3
- package/src/assets/icons/cSRDAddDatapunkt.svg +5 -5
- package/src/assets/icons/cSRDAddMultipleDatapunkter.svg +7 -7
- package/src/assets/icons/cSRDLockedDatapunkt.svg +4 -4
- package/src/assets/icons/cSRDRemoveDatapunkt.svg +5 -5
- package/src/assets/icons/cSRDRemoveDatapunktOversigt.svg +4 -4
- package/src/assets/icons/calendar.svg +2 -2
- package/src/assets/icons/calendarOutline.svg +2 -2
- package/src/assets/icons/callToAction.svg +2 -2
- package/src/assets/icons/card.svg +2 -2
- package/src/assets/icons/carouselArrowLeft.svg +2 -2
- package/src/assets/icons/carouselArrowRight.svg +2 -2
- package/src/assets/icons/category.svg +2 -2
- package/src/assets/icons/center.svg +3 -3
- package/src/assets/icons/check.svg +2 -2
- package/src/assets/icons/chevronLeft.svg +2 -2
- package/src/assets/icons/circularArrow.svg +3 -3
- package/src/assets/icons/close.svg +2 -2
- package/src/assets/icons/closeCircleOutline.svg +2 -2
- package/src/assets/icons/closeCirleFilled.svg +2 -2
- package/src/assets/icons/copyLink.svg +2 -2
- package/src/assets/icons/datahub.svg +2 -2
- package/src/assets/icons/deleteOutline.svg +3 -3
- package/src/assets/icons/deltagelsesgange.svg +2 -2
- package/src/assets/icons/dots.svg +4 -4
- package/src/assets/icons/dotsHorizontal.svg +2 -2
- package/src/assets/icons/doubleArrow.svg +2 -2
- package/src/assets/icons/downRightArrow.svg +2 -2
- package/src/assets/icons/download.svg +2 -2
- package/src/assets/icons/draggable.svg +5 -5
- package/src/assets/icons/email.svg +5 -5
- package/src/assets/icons/emner.svg +2 -2
- package/src/assets/icons/en_spalte.svg +3 -3
- package/src/assets/icons/envelopeFilled.svg +2 -2
- package/src/assets/icons/envelopeOutline.svg +4 -4
- package/src/assets/icons/error.svg +2 -2
- package/src/assets/icons/excel.svg +4 -4
- package/src/assets/icons/expandCircleRight.svg +3 -3
- package/src/assets/icons/eyeHide.svg +2 -2
- package/src/assets/icons/file.svg +5 -5
- package/src/assets/icons/filter.svg +2 -2
- package/src/assets/icons/filter2.svg +20 -20
- package/src/assets/icons/fire_spalter.svg +3 -3
- package/src/assets/icons/graph.svg +2 -2
- package/src/assets/icons/helpCircleOutline.svg +5 -5
- package/src/assets/icons/hero.svg +2 -2
- package/src/assets/icons/highlightArrow.svg +3 -3
- package/src/assets/icons/history.svg +2 -2
- package/src/assets/icons/home.svg +5 -5
- package/src/assets/icons/image.svg +5 -5
- package/src/assets/icons/indsaet.svg +2 -2
- package/src/assets/icons/indstillinger.svg +2 -2
- package/src/assets/icons/info.svg +4 -4
- package/src/assets/icons/infobox.svg +2 -2
- package/src/assets/icons/knap.svg +2 -2
- package/src/assets/icons/kontaktformular.svg +2 -2
- package/src/assets/icons/kopi.svg +2 -2
- package/src/assets/icons/leftUpCurvedArrow.svg +2 -2
- package/src/assets/icons/letter.svg +2 -2
- package/src/assets/icons/link.svg +2 -2
- package/src/assets/icons/linkboks.svg +4 -4
- package/src/assets/icons/linkedin.svg +5 -5
- package/src/assets/icons/liste.svg +2 -2
- package/src/assets/icons/listecard.svg +2 -2
- package/src/assets/icons/loading.svg +2 -2
- package/src/assets/icons/location.svg +2 -2
- package/src/assets/icons/lock.svg +6 -6
- package/src/assets/icons/loginbanner.svg +2 -2
- package/src/assets/icons/magnify.svg +2 -2
- package/src/assets/icons/magnifyBig.svg +2 -2
- package/src/assets/icons/map.svg +2 -2
- package/src/assets/icons/menu.svg +2 -2
- package/src/assets/icons/menuDown.svg +2 -2
- package/src/assets/icons/menuUp.svg +2 -2
- package/src/assets/icons/minus.svg +2 -2
- package/src/assets/icons/mitId.svg +3 -3
- package/src/assets/icons/notVerified.svg +2 -2
- package/src/assets/icons/notes.svg +5 -5
- package/src/assets/icons/online.svg +2 -2
- package/src/assets/icons/openInNew.svg +2 -2
- package/src/assets/icons/paere.svg +7 -7
- package/src/assets/icons/paginationChevronLeft.svg +4 -4
- package/src/assets/icons/paginationChevronRight.svg +4 -4
- package/src/assets/icons/paginationFirstPage.svg +4 -4
- package/src/assets/icons/paginationLastPage.svg +4 -4
- package/src/assets/icons/partnergruppe.svg +5 -5
- package/src/assets/icons/pause.svg +2 -2
- package/src/assets/icons/pdf.svg +4 -4
- package/src/assets/icons/pdfDownload.svg +2 -2
- package/src/assets/icons/pencil.svg +2 -2
- package/src/assets/icons/pencilOutline.svg +2 -2
- package/src/assets/icons/people.svg +4 -4
- package/src/assets/icons/phone.svg +5 -5
- package/src/assets/icons/play.svg +4 -4
- package/src/assets/icons/playVideo.svg +4 -4
- package/src/assets/icons/plus.svg +2 -2
- package/src/assets/icons/powerpoint.svg +4 -4
- package/src/assets/icons/praedefineretSoegning.svg +2 -2
- package/src/assets/icons/questionmark.svg +3 -3
- package/src/assets/icons/quote.svg +2 -2
- package/src/assets/icons/redaktion.svg +2 -2
- package/src/assets/icons/remove.svg +2 -2
- package/src/assets/icons/removeRedEyeOutline.svg +2 -2
- package/src/assets/icons/revert.svg +3 -3
- package/src/assets/icons/richtext.svg +2 -2
- package/src/assets/icons/roundCheckmark.svg +2 -2
- package/src/assets/icons/save.svg +2 -2
- package/src/assets/icons/sektionsoverskrift.svg +5 -5
- package/src/assets/icons/smal_bred.svg +3 -3
- package/src/assets/icons/starFilled.svg +2 -2
- package/src/assets/icons/starOutline.svg +2 -2
- package/src/assets/icons/tag.svg +2 -2
- package/src/assets/icons/teaser.svg +3 -3
- package/src/assets/icons/teaserbillede.svg +2 -2
- package/src/assets/icons/tekstgruppe.svg +2 -2
- package/src/assets/icons/time.svg +6 -6
- package/src/assets/icons/to_spalter.svg +3 -3
- package/src/assets/icons/top.svg +3 -3
- package/src/assets/icons/trashCan.svg +2 -2
- package/src/assets/icons/tre_spalter.svg +3 -3
- package/src/assets/icons/udvidedeCardgruppe.svg +2 -2
- package/src/assets/icons/unlock.svg +2 -2
- package/src/assets/icons/verified.svg +2 -2
- package/src/assets/icons/video.svg +2 -2
- package/src/assets/icons/word.svg +10 -10
- package/src/assets/icons/zoom.svg +2 -2
- package/src/components/VgAccordion.vue +97 -97
- package/src/components/VgButton.vue +18 -18
- package/src/components/VgButtons.vue +27 -27
- package/src/components/VgCard.vue +96 -96
- package/src/components/VgCardGroup.vue +18 -18
- package/src/components/VgDesignWrapper.vue +45 -45
- package/src/components/VgIcon.vue +54 -54
- package/src/components/VgKalturaVideo.vue +70 -0
- package/src/components/VgListe.vue +73 -73
- package/src/components/VgListeCard.vue +41 -41
- package/src/components/VgLoginButton.vue +7 -7
- package/src/components/VgPagination.vue +207 -207
- package/src/components/VgVideo.vue +59 -0
- package/src/components/VgVideoToolVideo.vue +70 -0
- package/src/styles/custom/_vgAccordion.scss +39 -39
- package/src/styles/custom/_vgCard.scss +15 -15
- package/src/styles/custom/_vgIcon.scss +3 -3
- package/src/styles/custom/_vgListe.scss +3 -3
- package/src/styles/custom/_vgVideo.scss +86 -0
- package/src/styles/custom/_vgVideoFrame.scss +9 -0
- package/src/styles/utility.scss +2 -2
- package/src/styles/vg/_vg-colors.scss +209 -209
- package/src/styles/vg/accordion/_vg-accordion.scss +140 -142
- package/src/styles/vg/buttons/_vg-buttons.scss +365 -365
- package/src/styles/vg/mixins/_vg-mediaquery-helpers.scss +159 -159
- package/src/styles/vg/pagination/_vg-pagination.scss +69 -69
- package/dist/src/components/VgVimeoVideo.vue.d.ts +0 -39
- package/dist/tests/unit/components/VgVimeoVideo.spec.d.ts +0 -1
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg v-if="custom" class="icon-svg" :focusable="focusable" :aria-hidden="titleTekst === ''">
|
|
3
|
-
<title v-if="title" xmlns="http://www.w3.org/2000/svg">{{ title }}</title>
|
|
4
|
-
<use :xlink:href="`#${icon}`"></use>
|
|
5
|
-
</svg>
|
|
6
|
-
<InlineSvg v-else-if="iconSrc" :src="iconSrc" class="icon icon-svg" :title="titleTekst" :focusable="focusable" :aria-hidden="titleTekst === ''" />
|
|
7
|
-
</template>
|
|
8
|
-
|
|
9
|
-
<script setup lang="ts">
|
|
10
|
-
import { computed, inject } from 'vue';
|
|
11
|
-
import InlineSvg from 'vue-inline-svg';
|
|
12
|
-
|
|
13
|
-
const props = defineProps({
|
|
14
|
-
icon: {
|
|
15
|
-
type: String,
|
|
16
|
-
required: true
|
|
17
|
-
},
|
|
18
|
-
focusable: {
|
|
19
|
-
type: String,
|
|
20
|
-
default: 'false'
|
|
21
|
-
},
|
|
22
|
-
title: {
|
|
23
|
-
type: String,
|
|
24
|
-
default: undefined
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const siteIkoner = inject('siteIkoner');
|
|
29
|
-
|
|
30
|
-
const titleTekst = computed(() => props.title || '');
|
|
31
|
-
|
|
32
|
-
const custom = computed((): boolean => !!iconSrc.value?.includes('<symbol'));
|
|
33
|
-
|
|
34
|
-
const iconSrc = computed(() => {
|
|
35
|
-
let resolved = siteIkoner ? (siteIkoner as { [key: string]: string })[props.icon] : null;
|
|
36
|
-
if (props.icon && !resolved) {
|
|
37
|
-
try {
|
|
38
|
-
const path = new URL(`../assets/icons/${props.icon}.svg`, import.meta.url).href;
|
|
39
|
-
if (path.endsWith('undefined')) {
|
|
40
|
-
throw Error('invalid URL');
|
|
41
|
-
}
|
|
42
|
-
resolved = path;
|
|
43
|
-
} catch {
|
|
44
|
-
// eslint-disable-next-line no-console
|
|
45
|
-
console.warn(`Unable to resolve path for icon: ${props.icon}.svg`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return resolved;
|
|
49
|
-
});
|
|
50
|
-
</script>
|
|
51
|
-
|
|
52
|
-
<style lang="scss" scoped>
|
|
53
|
-
@use '@/styles/custom/_vgIcon.scss';
|
|
54
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<svg v-if="custom" class="icon-svg" :focusable="focusable" :aria-hidden="titleTekst === ''">
|
|
3
|
+
<title v-if="title" xmlns="http://www.w3.org/2000/svg">{{ title }}</title>
|
|
4
|
+
<use :xlink:href="`#${icon}`"></use>
|
|
5
|
+
</svg>
|
|
6
|
+
<InlineSvg v-else-if="iconSrc" :src="iconSrc" class="icon icon-svg" :title="titleTekst" :focusable="focusable" :aria-hidden="titleTekst === ''" />
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script setup lang="ts">
|
|
10
|
+
import { computed, inject } from 'vue';
|
|
11
|
+
import InlineSvg from 'vue-inline-svg';
|
|
12
|
+
|
|
13
|
+
const props = defineProps({
|
|
14
|
+
icon: {
|
|
15
|
+
type: String,
|
|
16
|
+
required: true
|
|
17
|
+
},
|
|
18
|
+
focusable: {
|
|
19
|
+
type: String,
|
|
20
|
+
default: 'false'
|
|
21
|
+
},
|
|
22
|
+
title: {
|
|
23
|
+
type: String,
|
|
24
|
+
default: undefined
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const siteIkoner = inject('siteIkoner');
|
|
29
|
+
|
|
30
|
+
const titleTekst = computed(() => props.title || '');
|
|
31
|
+
|
|
32
|
+
const custom = computed((): boolean => !!iconSrc.value?.includes('<symbol'));
|
|
33
|
+
|
|
34
|
+
const iconSrc = computed(() => {
|
|
35
|
+
let resolved = siteIkoner ? (siteIkoner as { [key: string]: string })[props.icon] : null;
|
|
36
|
+
if (props.icon && !resolved) {
|
|
37
|
+
try {
|
|
38
|
+
const path = new URL(`../assets/icons/${props.icon}.svg`, import.meta.url).href;
|
|
39
|
+
if (path.endsWith('undefined')) {
|
|
40
|
+
throw Error('invalid URL');
|
|
41
|
+
}
|
|
42
|
+
resolved = path;
|
|
43
|
+
} catch {
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.warn(`Unable to resolve path for icon: ${props.icon}.svg`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return resolved;
|
|
49
|
+
});
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<style lang="scss" scoped>
|
|
53
|
+
@use '@/styles/custom/_vgIcon.scss';
|
|
54
|
+
</style>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<iframe
|
|
4
|
+
v-if="playVideo && videoUrl"
|
|
5
|
+
:src="videoUrl"
|
|
6
|
+
:alt="alt"
|
|
7
|
+
class="video-frame"
|
|
8
|
+
title="Kaltura afspiller"
|
|
9
|
+
allow="autoplay"
|
|
10
|
+
allowfullscreen
|
|
11
|
+
webkitallowfullscreen
|
|
12
|
+
mozAllowFullScreen
|
|
13
|
+
data-testid="video-frame"
|
|
14
|
+
/>
|
|
15
|
+
<slot name="preview" :thumbnail-url="thumbnailUrl" />
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<script setup lang="ts">
|
|
20
|
+
import { computed } from 'vue';
|
|
21
|
+
|
|
22
|
+
const props = defineProps({
|
|
23
|
+
src: {
|
|
24
|
+
type: String,
|
|
25
|
+
required: true
|
|
26
|
+
},
|
|
27
|
+
alt: {
|
|
28
|
+
type: String,
|
|
29
|
+
required: true
|
|
30
|
+
},
|
|
31
|
+
playVideo: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
required: true
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const videoUrl = computed(() => {
|
|
38
|
+
let link = props.src;
|
|
39
|
+
const autoPlay = 'flashvars[autoPlay]';
|
|
40
|
+
if (!link.includes(autoPlay)) {
|
|
41
|
+
link = addQuerystring(link, `${autoPlay}=true`);
|
|
42
|
+
}
|
|
43
|
+
return link;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const thumbnailUrl = computed<string>(() => {
|
|
47
|
+
let url = '';
|
|
48
|
+
const groups = props.src.match(/https:\/\/(.*)\/p\/(\d*)\/.*?.*entry_id=([a-zA-Z0-9_]+)(?=&|$)/); // NOSONAR
|
|
49
|
+
if (groups?.length === 4) {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
51
|
+
const [_, domain, partnerId, entryId] = groups;
|
|
52
|
+
url = `https://${domain}/p/${partnerId}/thumbnail/entry_id/${entryId}/width/800/quality/100`;
|
|
53
|
+
}
|
|
54
|
+
return url;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
function addQuerystring(url: string, query: string): string {
|
|
58
|
+
const firstParamPrefix = '?';
|
|
59
|
+
const subsequentParamPrefix = '&';
|
|
60
|
+
if (query.indexOf(firstParamPrefix) === 0 || query.indexOf(subsequentParamPrefix) === 0) {
|
|
61
|
+
query = query.substring(1);
|
|
62
|
+
}
|
|
63
|
+
const qsPrefix = url.indexOf(firstParamPrefix) > 0 ? subsequentParamPrefix : firstParamPrefix;
|
|
64
|
+
return url + qsPrefix + query;
|
|
65
|
+
}
|
|
66
|
+
</script>
|
|
67
|
+
|
|
68
|
+
<style lang="scss" scoped>
|
|
69
|
+
@use '@/styles/custom/_vgVideoFrame.scss';
|
|
70
|
+
</style>
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<div class="udvidet-cardgruppe udvidet-cardgruppe-liste px-0">
|
|
4
|
-
<p>{{ resultsText }}</p>
|
|
5
|
-
<div class="row cardrow">
|
|
6
|
-
<slot />
|
|
7
|
-
</div>
|
|
8
|
-
</div>
|
|
9
|
-
<div v-if="antal > dataSlice.length" class="d-flex justify-content-center">
|
|
10
|
-
<div v-if="useSpinner && pending">
|
|
11
|
-
<slot name="spinner">
|
|
12
|
-
<div class="spinner" />
|
|
13
|
-
</slot>
|
|
14
|
-
</div>
|
|
15
|
-
<button v-else class="button centered-button button-secondary" type="button" data-testid="button-load" @click="onClick">
|
|
16
|
-
{{ $t('content.application.emnelandningside.button.visflere') }}
|
|
17
|
-
</button>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
</template>
|
|
21
|
-
|
|
22
|
-
<script setup lang="ts">
|
|
23
|
-
import { ParamType } from '@/utils/tekstnoegle-util';
|
|
24
|
-
import { computed, inject, nextTick, PropType, ref, watch } from 'vue';
|
|
25
|
-
|
|
26
|
-
const emits = defineEmits(['load-slice']);
|
|
27
|
-
const props = defineProps({
|
|
28
|
-
titel: {
|
|
29
|
-
type: String,
|
|
30
|
-
required: false,
|
|
31
|
-
default: undefined
|
|
32
|
-
},
|
|
33
|
-
antal: {
|
|
34
|
-
type: Number,
|
|
35
|
-
required: true
|
|
36
|
-
},
|
|
37
|
-
useSpinner: {
|
|
38
|
-
type: Boolean,
|
|
39
|
-
default: true
|
|
40
|
-
},
|
|
41
|
-
dataSlice: {
|
|
42
|
-
type: Array as PropType<any>,
|
|
43
|
-
required: true
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const $t: (tekstnoegle: string, params?: ParamType) => string = inject('$t')!;
|
|
48
|
-
|
|
49
|
-
const pending = ref(false);
|
|
50
|
-
|
|
51
|
-
const resultsText = computed(() => $t('content.applikation.cardliste.results.text', [props.dataSlice.length, props.antal ?? 0]));
|
|
52
|
-
|
|
53
|
-
const onClick = () => {
|
|
54
|
-
pending.value = true;
|
|
55
|
-
emits('load-slice');
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
watch(
|
|
59
|
-
() => props.dataSlice,
|
|
60
|
-
async (newDataSlice, oldDataSlice) => {
|
|
61
|
-
if (newDataSlice > oldDataSlice) {
|
|
62
|
-
pending.value = false;
|
|
63
|
-
await nextTick();
|
|
64
|
-
const containerElement = document.querySelector('.applikation-container .udvidet-cardgruppe-liste');
|
|
65
|
-
containerElement?.querySelectorAll<HTMLElement>('.udvidet-cardgruppe-card')[oldDataSlice.length].focus();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
);
|
|
69
|
-
</script>
|
|
70
|
-
|
|
71
|
-
<style lang="scss" scoped>
|
|
72
|
-
@use '@/styles/custom/_vgListe.scss';
|
|
73
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<div class="udvidet-cardgruppe udvidet-cardgruppe-liste px-0">
|
|
4
|
+
<p>{{ resultsText }}</p>
|
|
5
|
+
<div class="row cardrow">
|
|
6
|
+
<slot />
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
<div v-if="antal > dataSlice.length" class="d-flex justify-content-center">
|
|
10
|
+
<div v-if="useSpinner && pending">
|
|
11
|
+
<slot name="spinner">
|
|
12
|
+
<div class="spinner" />
|
|
13
|
+
</slot>
|
|
14
|
+
</div>
|
|
15
|
+
<button v-else class="button centered-button button-secondary" type="button" data-testid="button-load" @click="onClick">
|
|
16
|
+
{{ $t('content.application.emnelandningside.button.visflere') }}
|
|
17
|
+
</button>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<script setup lang="ts">
|
|
23
|
+
import { ParamType } from '@/utils/tekstnoegle-util';
|
|
24
|
+
import { computed, inject, nextTick, PropType, ref, watch } from 'vue';
|
|
25
|
+
|
|
26
|
+
const emits = defineEmits(['load-slice']);
|
|
27
|
+
const props = defineProps({
|
|
28
|
+
titel: {
|
|
29
|
+
type: String,
|
|
30
|
+
required: false,
|
|
31
|
+
default: undefined
|
|
32
|
+
},
|
|
33
|
+
antal: {
|
|
34
|
+
type: Number,
|
|
35
|
+
required: true
|
|
36
|
+
},
|
|
37
|
+
useSpinner: {
|
|
38
|
+
type: Boolean,
|
|
39
|
+
default: true
|
|
40
|
+
},
|
|
41
|
+
dataSlice: {
|
|
42
|
+
type: Array as PropType<any>,
|
|
43
|
+
required: true
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const $t: (tekstnoegle: string, params?: ParamType) => string = inject('$t')!;
|
|
48
|
+
|
|
49
|
+
const pending = ref(false);
|
|
50
|
+
|
|
51
|
+
const resultsText = computed(() => $t('content.applikation.cardliste.results.text', [props.dataSlice.length, props.antal ?? 0]));
|
|
52
|
+
|
|
53
|
+
const onClick = () => {
|
|
54
|
+
pending.value = true;
|
|
55
|
+
emits('load-slice');
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
watch(
|
|
59
|
+
() => props.dataSlice,
|
|
60
|
+
async (newDataSlice, oldDataSlice) => {
|
|
61
|
+
if (newDataSlice > oldDataSlice) {
|
|
62
|
+
pending.value = false;
|
|
63
|
+
await nextTick();
|
|
64
|
+
const containerElement = document.querySelector('.applikation-container .udvidet-cardgruppe-liste');
|
|
65
|
+
containerElement?.querySelectorAll<HTMLElement>('.udvidet-cardgruppe-card')[oldDataSlice.length].focus();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<style lang="scss" scoped>
|
|
72
|
+
@use '@/styles/custom/_vgListe.scss';
|
|
73
|
+
</style>
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="card-container">
|
|
3
|
-
<div class="udvidet-card-container">
|
|
4
|
-
<a role="button" tabindex="0" class="udvidet-cardgruppe-card liste-layout" data-testid="link" :title="titel" :aria-label="titel">
|
|
5
|
-
<div class="text-wrapper">
|
|
6
|
-
<div>
|
|
7
|
-
<div class="text">
|
|
8
|
-
<div v-if="label" class="label-container">
|
|
9
|
-
<p class="h6 m-0 show-spaces break-word" data-testid="label">{{ label }}</p>
|
|
10
|
-
</div>
|
|
11
|
-
<div class="card-titel">
|
|
12
|
-
<h3 class="h4 line-limit mt-0 mb-3 break-word" data-testid="titel">{{ titel }}</h3>
|
|
13
|
-
</div>
|
|
14
|
-
<pre class="mt-0 mb-3 break-word line-limit">
|
|
15
|
-
<slot/>
|
|
16
|
-
</pre>
|
|
17
|
-
</div>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
</a>
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
23
|
-
</template>
|
|
24
|
-
|
|
25
|
-
<script setup lang="ts">
|
|
26
|
-
defineProps({
|
|
27
|
-
label: {
|
|
28
|
-
type: String,
|
|
29
|
-
required: false,
|
|
30
|
-
default: undefined
|
|
31
|
-
},
|
|
32
|
-
titel: {
|
|
33
|
-
type: String,
|
|
34
|
-
required: true
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
</script>
|
|
38
|
-
|
|
39
|
-
<style lang="scss" scoped>
|
|
40
|
-
@use '@/styles/custom/_vgCard.scss';
|
|
41
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="card-container">
|
|
3
|
+
<div class="udvidet-card-container">
|
|
4
|
+
<a role="button" tabindex="0" class="udvidet-cardgruppe-card liste-layout" data-testid="link" :title="titel" :aria-label="titel">
|
|
5
|
+
<div class="text-wrapper">
|
|
6
|
+
<div>
|
|
7
|
+
<div class="text">
|
|
8
|
+
<div v-if="label" class="label-container">
|
|
9
|
+
<p class="h6 m-0 show-spaces break-word" data-testid="label">{{ label }}</p>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="card-titel">
|
|
12
|
+
<h3 class="h4 line-limit mt-0 mb-3 break-word" data-testid="titel">{{ titel }}</h3>
|
|
13
|
+
</div>
|
|
14
|
+
<pre class="mt-0 mb-3 break-word line-limit">
|
|
15
|
+
<slot/>
|
|
16
|
+
</pre>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</a>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script setup lang="ts">
|
|
26
|
+
defineProps({
|
|
27
|
+
label: {
|
|
28
|
+
type: String,
|
|
29
|
+
required: false,
|
|
30
|
+
default: undefined
|
|
31
|
+
},
|
|
32
|
+
titel: {
|
|
33
|
+
type: String,
|
|
34
|
+
required: true
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<style lang="scss" scoped>
|
|
40
|
+
@use '@/styles/custom/_vgCard.scss';
|
|
41
|
+
</style>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<button type="button" class="button mitid-button d-inline-flex align-items-center"><VgIcon icon="mitId" class="mr-4" />Log ind med MitID</button>
|
|
3
|
-
</template>
|
|
4
|
-
|
|
5
|
-
<script setup lang="ts">
|
|
6
|
-
import VgIcon from '@/components/VgIcon.vue';
|
|
7
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<button type="button" class="button mitid-button d-inline-flex align-items-center"><VgIcon icon="mitId" class="mr-4" />Log ind med MitID</button>
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
import VgIcon from '@/components/VgIcon.vue';
|
|
7
|
+
</script>
|