@iqual/nuxt-icms 1.2.1 → 1.2.3

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 (39) hide show
  1. package/components/DesignSystem/Molecules/MediaLightbox.vue +273 -0
  2. package/components/DesignSystem/Molecules/MediaSlider.vue +19 -25
  3. package/components/DesignSystem/README.md +489 -0
  4. package/components/Media/RemoteVideo/index.vue +3 -3
  5. package/components/Node/Icms/Page/index.vue +5 -3
  6. package/components/Paragraph/Card/Layout/index.vue +2 -2
  7. package/components/Paragraph/Contact/index.vue +1 -2
  8. package/components/Paragraph/Downloads/index.vue +1 -2
  9. package/components/Paragraph/FAQ/Layout/index.vue +1 -2
  10. package/components/Paragraph/FlipTeasers/index.vue +2 -2
  11. package/components/Paragraph/Gallery/index.vue +16 -14
  12. package/components/Paragraph/IconText/Layout/index.vue +1 -2
  13. package/components/Paragraph/Table/index.vue +2 -2
  14. package/components/Paragraph/Team/Layout/index.vue +2 -2
  15. package/components/Paragraph/Teasers/index.vue +3 -3
  16. package/components/Paragraph/Timeline/Layout/index.vue +6 -3
  17. package/components/Paragraph/iFrame/index.vue +16 -2
  18. package/components/Section/Footer/index.vue +15 -14
  19. package/components/Section/Header/GlobalMenu.vue +34 -34
  20. package/components/Section/Header/MetaMenu.vue +17 -19
  21. package/components/Section/Header/index.vue +21 -22
  22. package/composables/useGlobalConfig.ts +57 -0
  23. package/composables/useGraphqlCacheability.ts +22 -0
  24. package/composables/useInitData.ts +20 -112
  25. package/composables/useMediaLightbox.ts +114 -0
  26. package/composables/useMenu.ts +66 -0
  27. package/modules/dynamicEntityComponentResolver.ts +0 -20
  28. package/nuxt.config.ts +0 -5
  29. package/package.json +1 -2
  30. package/plugins/graphqlMiddleware.ts +27 -68
  31. package/plugins/initData.ts +105 -0
  32. package/{composables → queries}/query.initData.graphql +2 -8
  33. package/queries/query.loadTranslations.graphql +5 -0
  34. package/types/initData.ts +1 -0
  35. package/components/Section/Header/SearchLink.vue +0 -26
  36. package/composables/useLightbox.ts +0 -81
  37. package/composables/useMainMenuLinks.ts +0 -69
  38. package/composables/useMetaMenuLinks.ts +0 -44
  39. package/types/fslightbox-vue.d.ts +0 -1
@@ -0,0 +1,489 @@
1
+ # ICMS Design System Documentation
2
+
3
+ The ICMS Design System is built following Atomic Design principles with Vue 3, Nuxt 3, TypeScript, and Tailwind CSS. It provides a comprehensive set of reusable components organized into Atoms, Molecules, and Organisms.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Architecture](#architecture)
8
+ - [Technology Stack](#technology-stack)
9
+ - [Component Hierarchy](#component-hierarchy)
10
+ - [Atoms](#atoms)
11
+ - [Molecules](#molecules)
12
+ - [Organisms](#organisms)
13
+ - [Composables](#composables)
14
+ - [Styling Guidelines](#styling-guidelines)
15
+ - [Best Practices](#best-practices)
16
+ - [Usage Examples](#usage-examples)
17
+
18
+ ## Architecture
19
+
20
+ The design system follows **Atomic Design methodology**:
21
+
22
+ - **Atoms**: Basic building blocks (buttons, inputs, containers)
23
+ - **Molecules**: Simple combinations of atoms (cards, forms, navigation items)
24
+ - **Organisms**: Complex components combining molecules and atoms (headers, sections, content blocks)
25
+
26
+ ### File Structure
27
+
28
+ ```
29
+ components/DesignSystem/
30
+ ├── Atoms/ # Basic UI elements
31
+ ├── Molecules/ # Component combinations
32
+ └── Organisms/ # Complex layout components
33
+ ```
34
+
35
+ ## Technology Stack
36
+
37
+ - **Vue 3**: Composition API with `<script setup>` syntax
38
+ - **TypeScript**: Full type safety
39
+ - **Tailwind CSS**: Utility-first styling
40
+ - **Tailwind Variants**: Type-safe component variants
41
+ - **Container Queries**: Responsive design with `@container`
42
+ - **GraphQL**: Type-safe data fetching
43
+ - **Nuxt 3**: Framework with auto-imports
44
+
45
+ ### Key Dependencies
46
+
47
+ ```typescript
48
+ import { tv } from 'tailwind-variants' // Component variants
49
+ import cn from '@iqual/nuxt-icms/composables/useCn' // Class merging
50
+ ```
51
+
52
+ ## Component Hierarchy
53
+
54
+ ### Atoms
55
+
56
+ | Component | Purpose | Key Features |
57
+ |-----------|---------|--------------|
58
+ | `Button.vue` | Interactive elements | Multiple styles, color schemes, link integration |
59
+ | `Caption.vue` | Text captions | Typography variants |
60
+ | `Container.vue` | Layout wrapper | Responsive containers |
61
+ | `GridRow.vue` | Grid layout | CSS Grid implementation |
62
+ | `LinkListItem.vue` | Navigation items | Styled list items |
63
+
64
+ ### Molecules
65
+
66
+ | Component | Purpose | Key Features |
67
+ |-----------|---------|--------------|
68
+ | `ButtonGroup.vue` | Button collections | Grouped button layout |
69
+ | `Card.vue` | Content cards | Media integration, color schemes |
70
+ | `IconText.vue` | Icon + text combinations | Flexible icon positioning |
71
+ | `MediaLightbox.vue` | Media overlay | Carousel, keyboard navigation |
72
+ | `MediaSlider.vue` | Media carousels | Touch/swipe support |
73
+ | `Partnership.vue` | Partner displays | Logo arrangements |
74
+ | `Table.vue` | Data tables | Responsive table layout |
75
+ | `TitleComposition.vue` | Heading combinations | Semantic heading structure |
76
+ | `iFrame.vue` | Embedded content | Responsive iframe wrapper |
77
+
78
+ ### Organisms
79
+
80
+ | Component | Purpose | Key Features |
81
+ |-----------|---------|--------------|
82
+ | `ContentBlock.vue` | Rich content | Flexible content layout |
83
+ | `FlipTeaser.vue` | Interactive cards | Hover/click animations |
84
+ | `LogoElement.vue` | Brand display | Logo arrangements |
85
+ | `Map.vue` | Geographic content | Map integration |
86
+ | `TeamElement.vue` | People showcase | Team member cards |
87
+ | `TeaserCard.vue` | Content previews | Image + text teasers |
88
+ | `Testimonial.vue` | User feedback | Quote formatting |
89
+ | `TimelineElement.vue` | Chronological content | Timeline layout |
90
+ | `TwoColumnTextElement.vue` | Text layout | Multi-column text |
91
+
92
+ ## Atoms
93
+
94
+ ### Button
95
+
96
+ The foundational interactive component with comprehensive styling options.
97
+
98
+ ```vue
99
+ <DesignSystemAtomsButton
100
+ label="Click me"
101
+ subline="Optional subtitle"
102
+ link="/example"
103
+ :target-blank="false"
104
+ style="normal"
105
+ color-scheme="accent"
106
+ text-alignment="center"
107
+ />
108
+ ```
109
+
110
+ **Props:**
111
+ - `label` (string): Button text
112
+ - `subline` (string): Optional subtitle
113
+ - `link` (string): Navigation target
114
+ - `targetBlank` (boolean): Open in new tab
115
+ - `style` (string): `normal`, `focus`, `minimal`
116
+ - `colorScheme` (string): `none`, `dark`, `light`, `accent`
117
+ - `textAlignment` (string): `left`, `center`, `right`
118
+
119
+ **Variants:**
120
+ - **Normal**: Standard button appearance
121
+ - **Focus**: Emphasized styling
122
+ - **Minimal**: Text-only, underlined
123
+
124
+ ### Container
125
+
126
+ Responsive layout wrapper with consistent spacing.
127
+
128
+ ```vue
129
+ <DesignSystemAtomsContainer>
130
+ <p>Content goes here</p>
131
+ </DesignSystemAtomsContainer>
132
+ ```
133
+
134
+ **Features:**
135
+ - Responsive max-width
136
+ - Consistent horizontal padding
137
+ - Container query support
138
+
139
+ ### GridRow
140
+
141
+ CSS Grid implementation for flexible layouts.
142
+
143
+ ```vue
144
+ <DesignSystemAtomsGridRow :columns="3">
145
+ <div>Item 1</div>
146
+ <div>Item 2</div>
147
+ <div>Item 3</div>
148
+ </DesignSystemAtomsGridRow>
149
+ ```
150
+
151
+ ## Molecules
152
+
153
+ ### Card
154
+
155
+ Versatile content container with media support.
156
+
157
+ ```vue
158
+ <DesignSystemMoleculesCard
159
+ title="Card Title"
160
+ title-weight="semibold"
161
+ text="Card description text"
162
+ :image="imageMedia"
163
+ :icon="iconMedia"
164
+ color-scheme="light"
165
+ />
166
+ ```
167
+
168
+ **Props:**
169
+ - `title` (string): Card heading
170
+ - `titleWeight` (string): Font weight
171
+ - `text` (string): Description
172
+ - `image` (MediaFragment): Optional image
173
+ - `icon` (MediaFragment): Optional icon
174
+ - `colorScheme` (string): Color variant
175
+
176
+ **Color Schemes:**
177
+ - `none`: Default background
178
+ - `dark`: Dark theme
179
+ - `light`: Light theme
180
+ - `accent`: Brand colors
181
+
182
+ ### MediaLightbox
183
+
184
+ Advanced media overlay with carousel functionality.
185
+
186
+ ```vue
187
+ <DesignSystemMoleculesMediaLightbox
188
+ :media-objects="mediaArray"
189
+ :current-index="0"
190
+ :is-open="showLightbox"
191
+ @close="showLightbox = false"
192
+ @navigate="handleNavigation"
193
+ />
194
+ ```
195
+
196
+ **Features:**
197
+ - Multi-media support (images, videos, remote videos)
198
+ - Keyboard navigation (arrow keys, escape)
199
+ - Touch/swipe gestures
200
+ - Automatic video controls
201
+ - Loading states
202
+ - Error handling
203
+
204
+ **Props:**
205
+ - `mediaObjects` (MediaFragment[]): Media array
206
+ - `currentIndex` (number): Starting position
207
+ - `isOpen` (boolean): Visibility state
208
+
209
+ **Events:**
210
+ - `close`: Lightbox closed
211
+ - `navigate`: Index changed
212
+
213
+ ### MediaSlider
214
+
215
+ Touch-enabled media carousel for galleries.
216
+
217
+ ```vue
218
+ <DesignSystemMoleculesMediaSlider
219
+ :media-objects="images"
220
+ :current-index="0"
221
+ @click="openLightbox"
222
+ />
223
+ ```
224
+
225
+ **Features:**
226
+ - Touch/swipe support
227
+ - Responsive image sizing
228
+ - Automatic thumbnail generation
229
+ - Click-to-expand integration
230
+
231
+ ## Organisms
232
+
233
+ ### TeaserCard
234
+
235
+ Content preview component with image and text.
236
+
237
+ ```vue
238
+ <DesignSystemOrganismsTeaserCard
239
+ :image="teaserImage"
240
+ pretitle="Category"
241
+ title="Article Title"
242
+ subtitle="Subtitle"
243
+ text="Preview text..."
244
+ :link="'/article/slug'"
245
+ link-label="Read more"
246
+ color-scheme="light"
247
+ />
248
+ ```
249
+
250
+ **Props:**
251
+ - `image` (MediaFragment): Preview image
252
+ - `pretitle` (string): Category/tag
253
+ - `title` (string): Main heading
254
+ - `subtitle` (string): Secondary heading
255
+ - `text` (string): Description
256
+ - `link` (string): Target URL
257
+ - `linkLabel` (string): CTA text
258
+ - `colorScheme` (string): Theme variant
259
+
260
+ ### ContentBlock
261
+
262
+ Flexible content container for rich text and media.
263
+
264
+ ```vue
265
+ <DesignSystemOrganismsContentBlock
266
+ pretitle="Section"
267
+ title="Main Heading"
268
+ title-style="heading-2"
269
+ title-weight="bold"
270
+ subtitle="Subheading"
271
+ text="<p>Rich HTML content...</p>"
272
+ />
273
+ ```
274
+
275
+ **Features:**
276
+ - Semantic heading hierarchy
277
+ - Rich text support
278
+ - Flexible typography scaling
279
+ - Responsive spacing
280
+
281
+ ## Composables
282
+
283
+ The design system includes several composables for enhanced functionality:
284
+
285
+ ### useMediaLightbox
286
+
287
+ Manages lightbox state and media navigation.
288
+
289
+ ```typescript
290
+ const { mediaObjects, openLightbox, closeLightbox } = useMediaLightbox()
291
+ ```
292
+
293
+ ### useCn
294
+
295
+ Utility for merging Tailwind classes.
296
+
297
+ ```typescript
298
+ import cn from '@iqual/nuxt-icms/composables/useCn'
299
+
300
+ const classes = cn('base-class', conditionalClass && 'conditional', props.className)
301
+ ```
302
+
303
+ ### useIsMobile
304
+
305
+ Responsive design helper.
306
+
307
+ ```typescript
308
+ const { isMobile } = useIsMobile()
309
+ ```
310
+
311
+ ## Styling Guidelines
312
+
313
+ ### Color Schemes
314
+
315
+ The system supports four primary color schemes:
316
+
317
+ 1. **None**: Default/transparent backgrounds
318
+ 2. **Dark**: Dark theme with light text
319
+ 3. **Light**: Light backgrounds with dark text
320
+ 4. **Accent**: Brand colors and highlights
321
+
322
+ ### Responsive Design
323
+
324
+ Components use container queries (`@container`) for intrinsic responsiveness:
325
+
326
+ ```css
327
+ @container {
328
+ .component {
329
+ @apply flex-col;
330
+ }
331
+ }
332
+
333
+ @container (min-width: 768px) {
334
+ .component {
335
+ @apply flex-row;
336
+ }
337
+ }
338
+ ```
339
+
340
+ ### Typography
341
+
342
+ Semantic heading structure with utility classes:
343
+
344
+ - `heading-1` through `heading-6`: Semantic levels
345
+ - Font weights: `light`, `normal`, `medium`, `semibold`, `bold`
346
+ - Text alignment: `left`, `center`, `right`
347
+
348
+ ### Spacing
349
+
350
+ Consistent spacing using Tailwind's spacing scale:
351
+
352
+ - Component padding: `p-6`, `p-16` for larger screens
353
+ - Component gaps: `gap-6`, `gap-16`
354
+ - Margin utilities: `mb-2`, `mb-4`, `mt-auto`
355
+
356
+ ## Best Practices
357
+
358
+ ### Component Development
359
+
360
+ 1. **Use TypeScript interfaces** for prop definitions
361
+ 2. **Implement Tailwind Variants** for consistent styling
362
+ 3. **Support container queries** for responsive design
363
+ 4. **Include accessibility attributes** (ARIA labels, semantic HTML)
364
+ 5. **Handle loading and error states** for media components
365
+
366
+ ### Performance
367
+
368
+ 1. **Lazy load media** components when possible
369
+ 2. **Use computed properties** for expensive calculations
370
+ 3. **Implement proper image sizing** with `imageSizes` prop
371
+ 4. **Minimize bundle size** with tree-shaking
372
+
373
+ ### Accessibility
374
+
375
+ 1. **Semantic HTML elements** (`button`, `nav`, `main`, etc.)
376
+ 2. **ARIA labels and roles** for complex components
377
+ 3. **Keyboard navigation** support
378
+ 4. **Focus management** in modals and overlays
379
+ 5. **Screen reader support** with proper text alternatives
380
+
381
+ ### Maintainability
382
+
383
+ 1. **Consistent naming conventions** (`PascalCase` for components)
384
+ 2. **Comprehensive prop documentation** with TypeScript
385
+ 3. **Reusable style variants** with Tailwind Variants
386
+ 4. **Modular component architecture** following Atomic Design
387
+
388
+ ## Usage Examples
389
+
390
+ ### Basic Page Layout
391
+
392
+ ```vue
393
+ <template>
394
+ <DesignSystemAtomsContainer>
395
+ <DesignSystemOrganismsContentBlock
396
+ title="Page Title"
397
+ title-style="heading-1"
398
+ text="<p>Page content...</p>"
399
+ />
400
+
401
+ <DesignSystemAtomsGridRow :columns="3">
402
+ <DesignSystemMoleculesCard
403
+ v-for="item in items"
404
+ :key="item.id"
405
+ :title="item.title"
406
+ :text="item.description"
407
+ :image="item.image"
408
+ color-scheme="light"
409
+ />
410
+ </DesignSystemAtomsGridRow>
411
+ </DesignSystemAtomsContainer>
412
+ </template>
413
+ ```
414
+
415
+ ### Interactive Gallery
416
+
417
+ ```vue
418
+ <template>
419
+ <DesignSystemMoleculesMediaSlider
420
+ :media-objects="galleryImages"
421
+ @click="openLightbox"
422
+ />
423
+
424
+ <DesignSystemMoleculesMediaLightbox
425
+ :media-objects="galleryImages"
426
+ :current-index="currentIndex"
427
+ :is-open="showLightbox"
428
+ @close="showLightbox = false"
429
+ @navigate="currentIndex = $event"
430
+ />
431
+ </template>
432
+
433
+ <script setup>
434
+ const { mediaObjects, openLightbox } = useMediaLightbox()
435
+ const showLightbox = ref(false)
436
+ const currentIndex = ref(0)
437
+
438
+ const handleImageClick = (index: number) => {
439
+ currentIndex.value = index
440
+ showLightbox.value = true
441
+ }
442
+ </script>
443
+ ```
444
+
445
+ ### Button Variations
446
+
447
+ ```vue
448
+ <template>
449
+ <div class="space-y-4">
450
+ <!-- Primary CTA -->
451
+ <DesignSystemAtomsButton
452
+ label="Get Started"
453
+ style="focus"
454
+ color-scheme="accent"
455
+ text-alignment="center"
456
+ />
457
+
458
+ <!-- Secondary action -->
459
+ <DesignSystemAtomsButton
460
+ label="Learn More"
461
+ style="normal"
462
+ color-scheme="light"
463
+ />
464
+
465
+ <!-- Minimal link -->
466
+ <DesignSystemAtomsButton
467
+ label="Skip this step"
468
+ style="minimal"
469
+ color-scheme="none"
470
+ />
471
+ </div>
472
+ </template>
473
+ ```
474
+
475
+ ---
476
+
477
+ ## Contributing
478
+
479
+ When adding new components:
480
+
481
+ 1. Follow Atomic Design principles
482
+ 2. Use TypeScript for all props and events
483
+ 3. Implement Tailwind Variants for styling
484
+ 4. Include comprehensive documentation
485
+ 5. Add usage examples
486
+ 6. Test across different screen sizes
487
+ 7. Ensure accessibility compliance
488
+
489
+ For questions or contributions, refer to the project's main documentation or contact the development team.
@@ -7,19 +7,19 @@
7
7
  :title="media?.title"
8
8
  allow="autoplay; encrypted-media; picture-in-picture"
9
9
  allowfullscreen
10
- class="aspect-video w-full md:px-40 lg:px-0"
10
+ class="aspect-video w-full"
11
11
  :class="elementClass"
12
12
  />
13
13
 
14
14
  <button
15
15
  v-if="!isPlaying"
16
- class="relative flex aspect-video w-full cursor-pointer items-center justify-center md:px-40 lg:px-0"
16
+ class="relative flex aspect-video w-full cursor-pointer items-center justify-center"
17
+ :class="elementClass"
17
18
  @click.prevent="isPlaying = true"
18
19
  >
19
20
  <img
20
21
  :src="thumbnailUrl"
21
22
  class="absolute left-0 top-0 aspect-video size-full object-cover"
22
- :class="elementClass"
23
23
  :alt="thumbnailAlt"
24
24
  />
25
25
 
@@ -1,7 +1,9 @@
1
1
  <template>
2
- <BlokkliProvider v-slot="{ entity }" v-bind="blokkliProps" :entity="props">
3
- <BlokkliField :list="paragraphs" name="field_icms_paragraphs" />
4
- </BlokkliProvider>
2
+ <div>
3
+ <BlokkliProvider v-slot="{ entity }" v-bind="blokkliProps" :entity="props">
4
+ <BlokkliField :list="paragraphs" name="field_icms_paragraphs" />
5
+ </BlokkliProvider>
6
+ </div>
5
7
  </template>
6
8
 
7
9
  <script lang="ts" setup>
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow v-if="pretitle || title">
4
- <div class="col-span-12 md:col-span-8">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -11,7 +11,7 @@
11
11
  :colorScheme="colorScheme"
12
12
  />
13
13
  </div>
14
- <div class="col-span-12 md:col-span-8">
14
+ <div class="col-span-12 md:col-span-9">
15
15
  <DesignSystemOrganismsContentBlock
16
16
  :subtitle="subtitle"
17
17
  :text="text"
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-5">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -12,7 +12,6 @@
12
12
  :colorScheme="colorScheme"
13
13
  />
14
14
  </div>
15
- <div class="col-span-12 md:col-span-7"></div>
16
15
  <div class="col-span-12 md:col-span-5">
17
16
  <DesignSystemOrganismsContentBlock
18
17
  :subtitle="subtitle"
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-5">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -10,7 +10,6 @@
10
10
  :colorScheme="colorScheme"
11
11
  />
12
12
  </div>
13
- <div class="col-span-12 md:col-span-7"></div>
14
13
  <div class="col-span-12 md:col-span-5">
15
14
  <DesignSystemOrganismsContentBlock
16
15
  :media="media"
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :spacing="spacing" :colorScheme="colorScheme">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-5">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -12,7 +12,6 @@
12
12
  :colorScheme="colorScheme"
13
13
  />
14
14
  </div>
15
- <div class="col-span-12 md:col-span-7"></div>
16
15
  <div class="col-span-12 md:col-span-5">
17
16
  <DesignSystemOrganismsContentBlock
18
17
  :subtitle="subtitle"
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-8">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -11,7 +11,7 @@
11
11
  :colorScheme="colorScheme"
12
12
  />
13
13
  </div>
14
- <div class="col-span-12 md:col-span-8">
14
+ <div class="col-span-12 md:col-span-9">
15
15
  <DesignSystemOrganismsContentBlock
16
16
  :subtitle="subtitle"
17
17
  :text="text"
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-8">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -11,7 +11,7 @@
11
11
  :colorScheme="colorScheme"
12
12
  />
13
13
  </div>
14
- <div class="col-span-12 md:col-span-8">
14
+ <div class="col-span-12 md:col-span-9">
15
15
  <DesignSystemOrganismsContentBlock
16
16
  :subtitle="subtitle"
17
17
  :text="text"
@@ -35,12 +35,13 @@
35
35
  mediaClass="size-full cursor-pointer object-cover object-center"
36
36
  />
37
37
  </div>
38
- <FsLightbox
39
- :toggler="toggleLightbox"
40
- :sources="sources"
41
- :slide="currentSlide"
42
- :customAttributes="customAttributes"
38
+ <DesignSystemMoleculesMediaLightbox
39
+ :media-objects="(media?.filter((item): item is MediaFragment => Boolean(item)) || [])"
40
+ :is-open="isOpen"
41
+ :current-index="currentIndex"
43
42
  :captions="captions"
43
+ @close="closeLightbox"
44
+ @update:current-index="setCurrentIndex"
44
45
  />
45
46
  </DesignSystemAtomsGridRow>
46
47
  </DesignSystemAtomsContainer>
@@ -48,20 +49,21 @@
48
49
 
49
50
  <script lang="ts" setup>
50
51
  import type { ParagraphIcmsLayoutGalleryFragment } from '#graphql-operations'
51
- import FsLightbox from 'fslightbox-vue'
52
+ import type { MediaFragment } from '#graphql-operations'
53
+ import { useMediaLightbox } from '@iqual/nuxt-icms/composables/useMediaLightbox'
52
54
 
53
- const { options } = useAttrs().blokkliData
55
+ const { options } = useAttrs().blokkliData as any
54
56
 
55
57
  const props = defineProps<ParagraphIcmsLayoutGalleryFragment>()
56
58
 
57
59
  const {
58
- toggleLightbox,
59
- currentSlide,
60
+ isOpen,
61
+ currentIndex,
60
62
  openLightbox,
61
- sources,
62
- customAttributes,
63
+ closeLightbox,
64
+ setCurrentIndex,
63
65
  captions,
64
- } = useLightbox(props.media)
66
+ } = useMediaLightbox(props.media)
65
67
 
66
68
  const colorScheme = computed(() => {
67
69
  return options.value.colorScheme
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <DesignSystemAtomsContainer :colorScheme="colorScheme" :spacing="spacing">
3
3
  <DesignSystemAtomsGridRow>
4
- <div class="col-span-12 md:col-span-5">
4
+ <div class="col-span-12 md:col-span-12">
5
5
  <DesignSystemOrganismsContentBlock
6
6
  :pretitle="pretitle"
7
7
  :title="title"
@@ -12,7 +12,6 @@
12
12
  :colorScheme="colorScheme"
13
13
  />
14
14
  </div>
15
- <div class="col-span-12 md:col-span-7"></div>
16
15
  <div class="col-span-12 md:col-span-5">
17
16
  <DesignSystemOrganismsContentBlock
18
17
  :subtitle="subtitle"