@iqual/nuxt-icms 1.0.13 → 1.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.
Files changed (40) hide show
  1. package/components/Blokkli/Timeline/Element/icms_timeline_element.svg +7 -0
  2. package/components/Blokkli/Timeline/Element/icon.svg +7 -0
  3. package/components/Blokkli/Timeline/Element/index.vue +14 -0
  4. package/components/Blokkli/Timeline/Layout/icms_layout_timeline.svg +16 -0
  5. package/components/Blokkli/Timeline/Layout/icon.svg +16 -0
  6. package/components/Blokkli/Timeline/Layout/index.vue +14 -0
  7. package/components/Blokkli/iFrame/icon-blokkli-option-large-spacing-bottom.svg +1 -0
  8. package/components/Blokkli/iFrame/icon-blokkli-option-large-spacing-top.svg +1 -0
  9. package/components/Blokkli/iFrame/icon-blokkli-option-no-spacing.svg +1 -0
  10. package/components/Blokkli/iFrame/icon-blokkli-option-small-spacing-bottom.svg +1 -0
  11. package/components/Blokkli/iFrame/icon-blokkli-option-small-spacing-top.svg +1 -0
  12. package/components/Blokkli/iFrame/{Layout/index.vue → index.vue} +2 -6
  13. package/components/DesignSystem/Organisms/TimelineElement.vue +92 -0
  14. package/components/Media/Image/index.vue +1 -1
  15. package/components/Media/RemoteVideo/index.vue +18 -11
  16. package/components/Media/Video/index.vue +6 -4
  17. package/components/Paragraph/Media/index.vue +13 -8
  18. package/components/Paragraph/Timeline/Element/fragment.graphql +16 -0
  19. package/components/Paragraph/Timeline/Element/index.vue +31 -0
  20. package/components/Paragraph/Timeline/Layout/fragment.graphql +14 -0
  21. package/components/Paragraph/Timeline/Layout/index.vue +325 -0
  22. package/components/Paragraph/iFrame/{Layout/fragment.graphql → fragment.graphql} +2 -6
  23. package/components/Paragraph/iFrame/index.vue +56 -0
  24. package/nuxt.config.ts +17 -10
  25. package/package.json +1 -1
  26. package/server/graphqlMiddleware.serverOptions.ts +3 -3
  27. package/tests/pages.spec.ts +101 -0
  28. package/vitest.config.mts +2 -2
  29. package/components/Blokkli/iFrame/Element/icon.svg +0 -5
  30. package/components/Blokkli/iFrame/Element/index.vue +0 -14
  31. package/components/Paragraph/iFrame/Element/fragment.graphql +0 -9
  32. package/components/Paragraph/iFrame/Element/index.vue +0 -16
  33. package/components/Paragraph/iFrame/Layout/index.vue +0 -161
  34. package/pages/__tests__/index.ts +0 -77
  35. /package/components/Blokkli/{iFrame → Timeline}/Layout/icon-blokkli-option-large-spacing-bottom.svg +0 -0
  36. /package/components/Blokkli/{iFrame → Timeline}/Layout/icon-blokkli-option-large-spacing-top.svg +0 -0
  37. /package/components/Blokkli/{iFrame → Timeline}/Layout/icon-blokkli-option-no-spacing.svg +0 -0
  38. /package/components/Blokkli/{iFrame → Timeline}/Layout/icon-blokkli-option-small-spacing-bottom.svg +0 -0
  39. /package/components/Blokkli/{iFrame → Timeline}/Layout/icon-blokkli-option-small-spacing-top.svg +0 -0
  40. /package/components/Blokkli/iFrame/{Layout/icon.svg → icon.svg} +0 -0
@@ -0,0 +1,7 @@
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M9 8L9 22" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
3
+ <circle cx="9" cy="11" r="1" fill="black"/>
4
+ <circle cx="9" cy="19" r="1" fill="black"/>
5
+ <rect x="12.25" y="9.25" width="9.5" height="3.5" rx="1.15" stroke="black" stroke-width="1.5"/>
6
+ <rect x="12.25" y="17.25" width="9.5" height="3.5" rx="1.15" stroke="black" stroke-width="1.5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M9 8L9 22" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
3
+ <circle cx="9" cy="11" r="1" fill="none"/>
4
+ <circle cx="9" cy="19" r="1" fill="none"/>
5
+ <rect x="12.25" y="9.25" width="9.5" height="3.5" rx="1.15" stroke="currentColor" stroke-width="1.5" fill="none"/>
6
+ <rect x="12.25" y="17.25" width="9.5" height="3.5" rx="1.15" stroke="currentColor" stroke-width="1.5" fill="none"/>
7
+ </svg>
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <ParagraphTimelineElement v-bind="props" :blokkliData="blokkliData" />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import type { ParagraphIcmsTimelineElementFragment } from '#graphql-operations'
7
+
8
+ const props = defineProps<ParagraphIcmsTimelineElementFragment>()
9
+
10
+ const blokkliData = defineBlokkli({
11
+ bundle: 'icms_timeline_element',
12
+ globalOptions: ['reverseColumns'],
13
+ })
14
+ </script>
@@ -0,0 +1,16 @@
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_286_20)">
3
+ <rect x="0.75" y="4.75" width="24.5" height="24.5" rx="1.25" stroke="black" stroke-width="1.5" stroke-linejoin="round"/>
4
+ <path d="M26 27H27C28.1046 27 29 26.1046 29 25V3C29 1.89543 28.1046 1 27 1H5C3.89543 1 3 1.89543 3 3V4" stroke="black" stroke-width="1.5" stroke-linejoin="round"/>
5
+ <path d="M7 10L7 24" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
6
+ <circle cx="7" cy="13" r="1" fill="black"/>
7
+ <circle cx="7" cy="21" r="1" fill="black"/>
8
+ <rect x="10.25" y="11.25" width="9.5" height="3.5" rx="1.15" stroke="black" stroke-width="1.5"/>
9
+ <rect x="10.25" y="19.25" width="9.5" height="3.5" rx="1.15" stroke="black" stroke-width="1.5"/>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_286_20">
13
+ <rect width="30" height="30" fill="white"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_286_20)">
3
+ <rect x="0.75" y="4.75" width="24.5" height="24.5" rx="1.25" stroke="currentColor" fill="none" stroke-width="1.5" stroke-linejoin="round"/>
4
+ <path d="M26 27H27C28.1046 27 29 26.1046 29 25V3C29 1.89543 28.1046 1 27 1H5C3.89543 1 3 1.89543 3 3V4" stroke="currentColor" fill="none" stroke-width="1.5" stroke-linejoin="round"/>
5
+ <path d="M7 10L7 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
6
+ <circle cx="7" cy="13" r="1" fill="none"/>
7
+ <circle cx="7" cy="21" r="1" fill="none"/>
8
+ <rect x="10.25" y="11.25" width="9.5" height="3.5" rx="1.15" stroke="currentColor" fill="none" stroke-width="1.5"/>
9
+ <rect x="10.25" y="19.25" width="9.5" height="3.5" rx="1.15" stroke="currentColor" fill="none" stroke-width="1.5"/>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_286_20">
13
+ <rect width="30" height="30" fill="none"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <ParagraphTimelineLayout v-bind="props" :blokkliData="blokkliData" />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import type { ParagraphIcmsLayoutTimelineFragment } from '#graphql-operations'
7
+
8
+ const props = defineProps<ParagraphIcmsLayoutTimelineFragment>()
9
+
10
+ const blokkliData = defineBlokkli({
11
+ bundle: 'icms_layout_timeline',
12
+ globalOptions: ['spacingBottom', 'spacingTop', 'colorScheme'],
13
+ })
14
+ </script>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.49 12.87H5.51c-.28 0-.51-.23-.51-.51v-.99c0-.28.23-.51.51-.51H18.5c.28 0 .51.23.51.51v.99c0 .28-.23.51-.51.51Z" class="bk-option-icon-fill-strong" style="fill-rule:evenodd;stroke-width:0"/><rect width="20.01" height="5.95" x="2" y="14.29" class="bk-option-icon-fill-strong" rx=".53" ry=".53" style="stroke-width:0"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.49 12.87H5.51c-.28 0-.51-.23-.51-.51v-.99c0-.28.23-.51.51-.51H18.5c.28 0 .51.23.51.51v.99c0 .28-.23.51-.51.51Z" class="bk-option-icon-fill-strong" style="fill-rule:evenodd;stroke-width:0"/><rect width="20.01" height="5.95" x="2" y="3.5" class="bk-option-icon-fill-strong" rx=".53" ry=".53" style="stroke-width:0"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.49 12.87H5.51c-.28 0-.51-.23-.51-.51v-.99c0-.28.23-.51.51-.51H18.5c.28 0 .51.23.51.51v.99c0 .28-.23.51-.51.51Z" class="bk-option-icon-fill-strong" style="fill-rule:evenodd;stroke-width:0"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.49 12.87H5.51c-.28 0-.51-.23-.51-.51v-.99c0-.28.23-.51.51-.51H18.5c.28 0 .51.23.51.51v.99c0 .28-.23.51-.51.51Z" class="bk-option-icon-fill-strong" style="fill-rule:evenodd;stroke-width:0"/><rect width="20.01" height="3.53" x="2" y="14.29" class="bk-option-icon-fill-strong" rx=".52" ry=".52" style="stroke-width:0"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.49 12.87H5.51c-.28 0-.51-.23-.51-.51v-.99c0-.28.23-.51.51-.51H18.5c.28 0 .51.23.51.51v.99c0 .28-.23.51-.51.51Z" class="bk-option-icon-fill-strong" style="fill-rule:evenodd;stroke-width:0"/><rect width="20.01" height="3.53" x="2" y="5.92" class="bk-option-icon-fill-strong" rx=".52" ry=".52" style="stroke-width:0"/></svg>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <ParagraphIFrameLayout v-bind="props" :blokkliData="blokkliData" />
2
+ <ParagraphIFrame v-bind="props" :blokkliData="blokkliData" />
3
3
  </template>
4
4
 
5
5
  <script lang="ts" setup>
@@ -9,10 +9,6 @@ const props = defineProps<ParagraphIcmsLayoutIframeFragment>()
9
9
 
10
10
  const blokkliData = defineBlokkli({
11
11
  bundle: 'icms_layout_iframe',
12
- globalOptions: [
13
- 'spacingBottom',
14
- 'spacingTop',
15
- ],
12
+ globalOptions: ['textWidth', 'spacingBottom', 'spacingTop', 'colorScheme'],
16
13
  })
17
-
18
14
  </script>
@@ -0,0 +1,92 @@
1
+ <template>
2
+ <DesignSystemAtomsGridRow
3
+ class="flex w-full shrink-0 flex-col-reverse justify-end p-0 lg:grid lg:scroll-mt-32"
4
+ data-timeline-element
5
+ >
6
+ <!-- Text column -->
7
+ <div :class="textColumnClasses">
8
+ <DesignSystemOrganismsContentBlock
9
+ :pretitle="pretitle"
10
+ :title="title"
11
+ :titleStyle="titleStyle"
12
+ :titleWeight="titleWeight"
13
+ titleClass="mb-2"
14
+ :subtitle="subtitle"
15
+ subtitleClass="font-semibold"
16
+ :text="text"
17
+ :colorScheme="colorScheme"
18
+ :hasDecorativeLine="false"
19
+ />
20
+ <BlokkliField
21
+ name="field_icms_buttons"
22
+ :list="buttons"
23
+ class="mt-6 flex flex-wrap gap-6"
24
+ :class="[{ droptarget: isEditing }]"
25
+ />
26
+ </div>
27
+
28
+ <!-- Media column -->
29
+ <div :class="mediaColumnClasses">
30
+ <DesignSystemMoleculesMediaSlider
31
+ v-if="media"
32
+ :media="media"
33
+ :colorScheme="colorScheme"
34
+ sliderClass="my-0"
35
+ imageSizes="xs:750px sm:750px md:750px lg:750px"
36
+ mediaClass="my-0 w-full rounded-lg overflow-hidden"
37
+ />
38
+ </div>
39
+ </DesignSystemAtomsGridRow>
40
+ </template>
41
+
42
+ <script lang="ts" setup>
43
+ import type { MediaFragment } from '#graphql-operations'
44
+ const props = defineProps<{
45
+ pretitle?: string
46
+ title?: string
47
+ titleStyle?: string
48
+ titleWeight?: string
49
+ subtitle?: string
50
+ text?: string
51
+ media?: (MediaFragment | null)[] | undefined
52
+ buttons?: Array<object>
53
+ colorScheme?: string
54
+ hasDecorativeLine?: boolean
55
+ reverseColumns?: boolean
56
+ isEditing?: boolean
57
+ }>()
58
+
59
+ const reverseColumns = ref(false)
60
+
61
+ watch(
62
+ () => props.reverseColumns,
63
+ (newVal) => {
64
+ reverseColumns.value = Boolean(Number(newVal))
65
+ },
66
+ { immediate: true },
67
+ )
68
+
69
+ const textColumnClasses = computed(() => {
70
+ const classList = ['col-span-12', 'lg:col-span-5']
71
+
72
+ if (reverseColumns.value) {
73
+ classList.push('lg:order-last', 'lg:col-start-8')
74
+ } else {
75
+ classList.push('lg:order-first', 'lg:col-start-1')
76
+ }
77
+
78
+ return classList.join(' ')
79
+ })
80
+
81
+ const mediaColumnClasses = computed(() => {
82
+ const classList = ['col-span-12', 'lg:col-span-5']
83
+
84
+ if (reverseColumns.value) {
85
+ classList.push('lg:order-first', 'lg:col-start-1')
86
+ } else {
87
+ classList.push('lg:order-last', 'lg:col-start-8')
88
+ }
89
+
90
+ return classList.join(' ')
91
+ })
92
+ </script>
@@ -46,7 +46,7 @@ const props = withDefaults(
46
46
  }>(),
47
47
  {
48
48
  imageLoading: 'lazy',
49
- figcaptionClass: 'pt-1 text-center',
49
+ figcaptionClass: 'mt-2 italic text-center',
50
50
  elementClass: 'size-full object-cover object-center',
51
51
  },
52
52
  )
@@ -18,7 +18,7 @@
18
18
  >
19
19
  <img
20
20
  :src="thumbnailUrl"
21
- class="absolute left-0 top-0 size-full object-cover aspect-video"
21
+ class="absolute left-0 top-0 aspect-video size-full object-cover"
22
22
  :class="elementClass"
23
23
  :alt="thumbnailAlt"
24
24
  />
@@ -26,9 +26,11 @@
26
26
  <SpriteSymbol name="play" class="z-10 size-[75px]" />
27
27
  </button>
28
28
 
29
- <figcaption v-if="showCaption && media?.caption"
30
- v-text="media?.caption"
31
- :class="figcaptionClass" />
29
+ <figcaption
30
+ v-if="showCaption && media?.caption"
31
+ v-text="media?.caption"
32
+ :class="figcaptionClass"
33
+ />
32
34
  </figure>
33
35
  </VuepalRemoteVideo>
34
36
  </template>
@@ -36,13 +38,18 @@
36
38
  <script lang="ts" setup>
37
39
  import type { MediaRemoteVideoFragment } from '#graphql-operations'
38
40
 
39
- const props = defineProps<{
40
- media: MediaRemoteVideoFragment
41
- mediaClass?: string
42
- elementClass?: string
43
- showCaption?: boolean
44
- figcaptionClass?: string
45
- }>()
41
+ const props = withDefaults(
42
+ defineProps<{
43
+ media: MediaRemoteVideoFragment
44
+ mediaClass?: string
45
+ elementClass?: string
46
+ showCaption?: boolean
47
+ figcaptionClass?: string
48
+ }>(),
49
+ {
50
+ figcaptionClass: 'mt-2 italic text-center',
51
+ },
52
+ )
46
53
 
47
54
  const isPlaying = ref(false)
48
55
 
@@ -12,14 +12,15 @@
12
12
  <source v-if="media?.url?.path" :src="media.url.path" type="video/mp4" />
13
13
  Your browser does not support the video tag.
14
14
  </video>
15
- <figcaption v-if="showCaption && media?.caption"
16
- v-text="media?.caption"
17
- :class="figcaptionClass" />
15
+ <figcaption
16
+ v-if="showCaption && media?.caption"
17
+ v-text="media?.caption"
18
+ :class="figcaptionClass"
19
+ />
18
20
  </figure>
19
21
  </template>
20
22
 
21
23
  <script lang="ts" setup>
22
-
23
24
  import type { MediaVideoFragment } from '#graphql-operations'
24
25
 
25
26
  withDefaults(
@@ -39,6 +40,7 @@ withDefaults(
39
40
  videoMuted: true,
40
41
  videoAutoplay: true,
41
42
  videoLoop: false,
43
+ figcaptionClass: 'mt-2 italic text-center',
42
44
  },
43
45
  )
44
46
  </script>
@@ -3,13 +3,20 @@
3
3
  <div :class="rowClassList">
4
4
  <div :class="columnClassList">
5
5
  <DesignSystemMoleculesMediaSlider
6
- v-if="media && media.length"
6
+ v-if="media && media.length > 1"
7
7
  :media="media"
8
8
  :colorScheme="colorScheme"
9
- :showCaption="true"
9
+ showCaption
10
10
  :sliderClass="mediaSliderClassList"
11
11
  :elementClass="mediaElementClassList"
12
-
12
+ />
13
+
14
+ <Media
15
+ v-else-if="media && media.length === 1 && media[0]"
16
+ :media="media[0]"
17
+ imageSizes="xs:100vw sm:100vw md:100vw lg:1284px"
18
+ elementClass="rounded-lg"
19
+ showCaption
13
20
  />
14
21
  </div>
15
22
  </div>
@@ -17,14 +24,14 @@
17
24
  </template>
18
25
 
19
26
  <script lang="ts" setup>
20
- import type { ParagraphIcmsLayoutTextMediaFragment } from '#graphql-operations'
27
+ import type { ParagraphIcmsLayoutMediaFragment } from '#graphql-operations'
21
28
 
22
- defineProps<ParagraphIcmsLayoutTextMediaFragment>()
29
+ defineProps<ParagraphIcmsLayoutMediaFragment>()
23
30
 
24
31
  const { options, isEditing } = useAttrs().blokkliData
25
32
 
26
33
  const mediaSliderClassList = computed(() => {
27
- const classList = []
34
+ const classList = ['my-0']
28
35
  if (options.value.width !== 'full') {
29
36
  classList.push('rounded-lg overflow-hidden')
30
37
  }
@@ -58,7 +65,6 @@ const rowClassList = computed(() => {
58
65
  })
59
66
 
60
67
  const imageSizes = computed(() => {
61
-
62
68
  if (options.value.width === 'full') {
63
69
  return 'xs:100vw sm:100vw md:100vw lg:100vw'
64
70
  }
@@ -79,5 +85,4 @@ const columnClassList = computed(() => {
79
85
 
80
86
  return classList
81
87
  })
82
-
83
88
  </script>
@@ -0,0 +1,16 @@
1
+ fragment paragraphIcmsTimelineElement on ParagraphIcmsTimelineElement {
2
+ pretitle: fieldIcmsPretitle
3
+ title: fieldIcmsTitle
4
+ titleStyle: fieldIcmsTitleStyle
5
+ subtitle: fieldIcmsSubtitle
6
+ text: fieldIcmsText
7
+ buttons: fieldIcmsButtons {
8
+ ...paragraphsFieldItem
9
+ props {
10
+ ...paragraphIcmsButtonElement
11
+ }
12
+ }
13
+ media: fieldIcmsMediaElements {
14
+ ...media
15
+ }
16
+ }
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <DesignSystemOrganismsTimelineElement
3
+ :pretitle="pretitle"
4
+ :title="title"
5
+ :title-style="titleStyle"
6
+ :title-weight="titleWeight"
7
+ :subtitle="subtitle"
8
+ :text="text"
9
+ :media="media"
10
+ :buttons="buttons"
11
+ :color-scheme="colorScheme"
12
+ :has-decorative-line="false"
13
+ :reverse-columns="reverseColumns"
14
+ :is-editing="isEditing"
15
+ />
16
+ </template>
17
+
18
+ <script lang="ts" setup>
19
+ import type { ParagraphIcmsTimelineElementFragment } from '#graphql-operations'
20
+
21
+ defineProps<ParagraphIcmsTimelineElementFragment>()
22
+
23
+ const { options, isEditing } = useAttrs().blokkliData
24
+
25
+ const reverseColumns = computed(() => {
26
+ return options.value.reverseColumns
27
+ })
28
+
29
+ const colorScheme = inject<string>('colorScheme')
30
+ const titleWeight = inject<string>('titleWeight')
31
+ </script>
@@ -0,0 +1,14 @@
1
+ fragment paragraphIcmsLayoutTimeline on ParagraphIcmsLayoutTimeline {
2
+ pretitle: fieldIcmsPretitle
3
+ title: fieldIcmsTitle
4
+ titleStyle: fieldIcmsTitleStyle
5
+ titleWeight: fieldIcmsTitleWeight
6
+ subtitle: fieldIcmsSubtitle
7
+ text: fieldIcmsText
8
+ timelineElements: fieldIcmsTimelineElements {
9
+ ...paragraphsFieldItem
10
+ props {
11
+ ...paragraphIcmsTimelineElement
12
+ }
13
+ }
14
+ }