@yatoday/astro-ui 0.18.2 → 0.18.4

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 (47) hide show
  1. package/components/Analytics/AnalyticsGTM.astro +3 -3
  2. package/components/Analytics/AnalyticsGTMBody.astro +16 -12
  3. package/components/Analytics/AnalyticsGoogle.astro +3 -1
  4. package/components/BreadcrumbsItem/BreadcrumbsItem.astro +8 -1
  5. package/components/Button/types.ts +2 -1
  6. package/components/CallToAction/CallToAction.astro +1 -1
  7. package/components/Card0/Card0.astro +20 -32
  8. package/components/Card1/Card1.astro +11 -19
  9. package/components/Card2/Card2.astro +10 -14
  10. package/components/Card3/Card3.astro +15 -20
  11. package/components/Card4/Card4.astro +6 -2
  12. package/components/Card5/Card5.astro +8 -1
  13. package/components/Card6/Card6.astro +76 -59
  14. package/components/Card7/Card7.astro +27 -18
  15. package/components/CookieConsent/CookieConsent.astro +323 -308
  16. package/components/CopyToClipboard/CopyToClipboard.astro +6 -14
  17. package/components/CopyToClipboard/copy.ts +1 -1
  18. package/components/DarkMode/__tests__/DarkMode.test.ts +8 -8
  19. package/components/Headline/Headline.astro +4 -1
  20. package/components/HeroSection/HeroSection.astro +13 -16
  21. package/components/Image/Image.astro +1 -7
  22. package/components/ImageGallery/ImageGallery.astro +85 -90
  23. package/components/ImageGalleryIkea/ImageGalleryIkea.astro +3 -2
  24. package/components/ImagePreload/ImagePreload.astro +22 -20
  25. package/components/ItemGrid1/ItemGrid1.astro +34 -24
  26. package/components/Metadata/Metadata.astro +1 -5
  27. package/components/PointMap/PointMap.astro +62 -48
  28. package/components/PointMap/types.ts +3 -3
  29. package/components/SEO/SEO.astro +34 -33
  30. package/components/WidgetBrands/WidgetBrands.astro +8 -1
  31. package/components/WidgetContent/WidgetContent.astro +22 -9
  32. package/components/WidgetContent/types.ts +1 -1
  33. package/components/WidgetFeaturesCard/WidgetFeaturesCard.astro +10 -2
  34. package/components/WidgetHeroSlider/WidgetHeroSlider.astro +6 -1
  35. package/components/WidgetNavbarFlyout/WidgetNavbarFlyout.astro +16 -7
  36. package/components/WidgetSwiperPhotoSlider/WidgetSwiperPhotoSlider.astro +18 -7
  37. package/components/WidgetTestimonials/WidgetTestimonials.astro +8 -1
  38. package/components/WidgetWrapper/WidgetWrapper.astro +11 -2
  39. package/index.d.ts +20 -20
  40. package/package.json +11 -9
  41. package/styles/styles.css +303 -160
  42. package/utils/i18n.ts +2 -2
  43. package/utils/images.ts +0 -1
  44. package/utils/slugify.ts +3 -0
  45. package/vendor-config/config.example.yaml +0 -1
  46. package/vendor-config/index.ts +1 -1
  47. package/vendor-config/utils/loadConfig.ts +15 -18
@@ -10,7 +10,7 @@ const { id = 'GTM-XXXXXXX', defer = false } = Astro.props;
10
10
  {/* Google Tag Manager */}
11
11
  <script is:inline define:vars={{ id }}>
12
12
  (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
13
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
13
+ new Date().getTime(),event:'gtm.js'});const f=d.getElementsByTagName(s)[0],
14
14
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
15
15
  'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
16
16
  })(window,document,'script','dataLayer',id);
@@ -23,7 +23,7 @@ const { id = 'GTM-XXXXXXX', defer = false } = Astro.props;
23
23
  {defer && (
24
24
  <script is:inline define:vars={{ id }}>
25
25
  (function() {
26
- var gtmLoaded = false;
26
+ let gtmLoaded = false;
27
27
 
28
28
  function loadGTM() {
29
29
  if (gtmLoaded) return;
@@ -37,7 +37,7 @@ const { id = 'GTM-XXXXXXX', defer = false } = Astro.props;
37
37
 
38
38
  // Load GTM
39
39
  (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
40
- new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
40
+ new Date().getTime(),event:'gtm.js'});const f=d.getElementsByTagName(s)[0],
41
41
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
42
42
  'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
43
43
  })(window,document,'script','dataLayer',id);
@@ -4,15 +4,19 @@ import { ANALYTICS } from 'vendor:config';
4
4
  const gtmId = ANALYTICS?.vendors?.googleTagManager?.id;
5
5
  ---
6
6
 
7
- {gtmId && (
8
- <!-- Google Tag Manager (noscript) -->
9
- <noscript>
10
- <iframe
11
- src={`https://www.googletagmanager.com/ns.html?id=${gtmId}`}
12
- height="0"
13
- width="0"
14
- style="display:none;visibility:hidden"
15
- ></iframe>
16
- </noscript>
17
- <!-- End Google Tag Manager (noscript) -->
18
- )}
7
+ {
8
+ gtmId && (
9
+ <Fragment>
10
+ {/* Google Tag Manager (noscript) */}
11
+ <noscript>
12
+ <iframe
13
+ src={`https://www.googletagmanager.com/ns.html?id=${gtmId}`}
14
+ height="0"
15
+ width="0"
16
+ style="display:none;visibility:hidden"
17
+ />
18
+ </noscript>
19
+ {/* End Google Tag Manager (noscript) */}
20
+ </Fragment>
21
+ )
22
+ }
@@ -86,7 +86,9 @@ const attrs = partytown ? { type: 'text/partytown' } : {};
86
86
  const consent = JSON.parse(data);
87
87
  return consent.status === 'accepted';
88
88
  }
89
- } catch (e) {}
89
+ } catch {
90
+ // Ignore malformed or inaccessible consent data
91
+ }
90
92
  return false;
91
93
  }
92
94
 
@@ -1,7 +1,14 @@
1
1
  ---
2
2
  import type { BreadcrumbsItemProps as Props } from './types';
3
3
 
4
- const { href = '#', label = 'Breadcrumb', currentPage = false, hasIcon = false, class: classNames, position } = Astro.props;
4
+ const {
5
+ href = '#',
6
+ label = 'Breadcrumb',
7
+ currentPage = false,
8
+ hasIcon = false,
9
+ class: classNames,
10
+ position,
11
+ } = Astro.props;
5
12
  ---
6
13
 
7
14
  <li class:list={['item', classNames]} itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
@@ -10,7 +10,8 @@ export type ButtonProps = {
10
10
  icon?: string;
11
11
  class?: string;
12
12
  type?: 'button' | 'submit' | 'reset';
13
- } & Partial<HTMLAttributes<'a'>> & Partial<HTMLAttributes<'button'>>;
13
+ } & Partial<HTMLAttributes<'a'>> &
14
+ Partial<HTMLAttributes<'button'>>;
14
15
 
15
16
  export type SvelteButtonProps = WithElementRef<HTMLButtonAttributes> &
16
17
  WithElementRef<HTMLAnchorAttributes> & {
@@ -51,7 +51,7 @@ const {
51
51
  <Fragment set:html={callToAction} />
52
52
  ) : (
53
53
  <div class="flex w-auto">
54
- <Button {...(callToAction as Object)} class="w-full sm:mb-0" />
54
+ <Button {...(callToAction as object)} class="w-full sm:mb-0" />
55
55
  </div>
56
56
  )}
57
57
  </Fragment>
@@ -1,23 +1,12 @@
1
1
  ---
2
- import type {Card0Props as Props} from './types';
3
- import {twMerge} from 'tailwind-merge';
2
+ import type { Card0Props as Props } from './types';
3
+ import { twMerge } from 'tailwind-merge';
4
4
 
5
- const {
6
- badge,
7
- badgeTopRight,
8
- badgeBottomRight,
9
- badgeBottomLeft,
10
- as = 'article',
11
- classes = {}
12
- } = Astro.props;
5
+ const { badge, badgeTopRight, badgeBottomRight, badgeBottomLeft, as = 'article', classes = {} } = Astro.props;
13
6
 
14
7
  const WrapperTag = as;
15
8
 
16
- const {
17
- container: containerClass = '',
18
- badge: badgeClass = '',
19
- badgeTopRight: badgeTopRightClass = '',
20
- } = classes;
9
+ const { container: containerClass = '', badge: badgeClass = '', badgeTopRight: badgeTopRightClass = '' } = classes;
21
10
  ---
22
11
 
23
12
  <WrapperTag
@@ -27,24 +16,23 @@ const {
27
16
  )}
28
17
  >
29
18
  <!-- Default badge -->
30
- {(Astro.slots.has('badge') || badge) && (
31
- <div class={twMerge('absolute z-10 top-2 left-2', badgeClass)}>
32
- <slot name="badge">
33
- {badge && <span set:html={badge}/>}
34
- </slot>
35
- </div>
36
- )}
19
+ {
20
+ (Astro.slots.has('badge') || badge) && (
21
+ <div class={twMerge('absolute z-10 top-2 left-2', badgeClass)}>
22
+ <slot name="badge">{badge && <span set:html={badge} />}</slot>
23
+ </div>
24
+ )
25
+ }
37
26
 
38
- {(Astro.slots.has('badgeTopRight') || badgeTopRight) && (
39
- <div class={twMerge('absolute z-10 top-2 right-2', badgeTopRightClass)}>
40
- <slot name="badgeTopRight">
41
- {badgeTopRight && <span set:html={badgeTopRight}/>}
42
- </slot>
43
- </div>
44
- )}
45
-
27
+ {
28
+ (Astro.slots.has('badgeTopRight') || badgeTopRight) && (
29
+ <div class={twMerge('absolute z-10 top-2 right-2', badgeTopRightClass)}>
30
+ <slot name="badgeTopRight">{badgeTopRight && <span set:html={badgeTopRight} />}</slot>
31
+ </div>
32
+ )
33
+ }
46
34
 
47
- <slot name="image"/>
35
+ <slot name="image" />
48
36
 
49
- <slot/>
37
+ <slot />
50
38
  </WrapperTag>
@@ -85,18 +85,14 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
85
85
  {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
86
86
  <Fragment slot="badgeBottomRight">
87
87
  <div class={twMerge('', classes?.badgeBottomRight)}>
88
- <slot name="badgeBottomRight">
89
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
90
- </slot>
88
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
91
89
  </div>
92
90
  </Fragment>
93
91
  )}
94
92
  {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
95
93
  <Fragment slot="badgeBottomLeft">
96
94
  <div class={twMerge('', classes?.badgeBottomLeft)}>
97
- <slot name="badgeBottomLeft">
98
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
99
- </slot>
95
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
100
96
  </div>
101
97
  </Fragment>
102
98
  )}
@@ -121,18 +117,14 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
121
117
  {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
122
118
  <Fragment slot="badgeBottomRight">
123
119
  <div class={twMerge('', classes?.badgeBottomRight)}>
124
- <slot name="badgeBottomRight">
125
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
126
- </slot>
120
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
127
121
  </div>
128
122
  </Fragment>
129
123
  )}
130
124
  {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
131
125
  <Fragment slot="badgeBottomLeft">
132
126
  <div class={twMerge('', classes?.badgeBottomLeft)}>
133
- <slot name="badgeBottomLeft">
134
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
135
- </slot>
127
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
136
128
  </div>
137
129
  </Fragment>
138
130
  )}
@@ -156,11 +148,11 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
156
148
  <div class={twMerge('px-6 space-y-6')}>
157
149
  <!-- Title & Description -->
158
150
  <div>
159
- {title && (
160
- <WrapperHeaderTag class={twMerge('text-base/5 md:text-xl font-bold', titleClass)}>
161
- {title}
162
- </WrapperHeaderTag>
163
- )}
151
+ {
152
+ title && (
153
+ <WrapperHeaderTag class={twMerge('text-base/5 md:text-xl font-bold', titleClass)}>{title}</WrapperHeaderTag>
154
+ )
155
+ }
164
156
 
165
157
  <div class={twMerge(title ? 'mt-1' : '', descriptionClass)}>
166
158
  <slot />
@@ -203,7 +195,7 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
203
195
  <div class={cn('flex gap-2', actionClass)}>
204
196
  {callToAction.map((action) => (
205
197
  <Fragment>
206
- {typeof action === 'string' ? <Fragment set:html={action} /> : <Button {...(action as any || {})} />}
198
+ {typeof action === 'string' ? <Fragment set:html={action} /> : <Button {...((action as any) || {})} />}
207
199
  </Fragment>
208
200
  ))}
209
201
  </div>
@@ -213,7 +205,7 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
213
205
  <Fragment set:html={callToAction} />
214
206
  ) : (
215
207
  <div class={cn('', actionClass)}>
216
- <Button {...(callToAction as Object)} />
208
+ <Button {...(callToAction as object)} />
217
209
  </div>
218
210
  )}
219
211
  </Fragment>
@@ -77,18 +77,14 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
77
77
  {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
78
78
  <Fragment slot="badgeBottomRight">
79
79
  <div class={twMerge('', classes?.badgeBottomRight)}>
80
- <slot name="badgeBottomRight">
81
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
82
- </slot>
80
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
83
81
  </div>
84
82
  </Fragment>
85
83
  )}
86
84
  {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
87
85
  <Fragment slot="badgeBottomLeft">
88
86
  <div class={twMerge('', classes?.badgeBottomLeft)}>
89
- <slot name="badgeBottomLeft">
90
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
91
- </slot>
87
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
92
88
  </div>
93
89
  </Fragment>
94
90
  )}
@@ -118,19 +114,19 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
118
114
  <!-- Content -->
119
115
  <div class={twMerge('px-6 space-y-6')}>
120
116
  <div>
121
- {title && (
122
- <WrapperHeaderTag class={twMerge('text-xl font-bold', titleClass)}>
123
- {
124
- url || callToAction?.href ? (
117
+ {
118
+ title && (
119
+ <WrapperHeaderTag class={twMerge('text-xl font-bold', titleClass)}>
120
+ {url || callToAction?.href ? (
125
121
  <a href={url || callToAction?.href || '/'} class="after:content-[''] after:inset-0 after:absolute">
126
122
  {title}
127
123
  </a>
128
124
  ) : (
129
125
  title
130
- )
131
- }
132
- </WrapperHeaderTag>
133
- )}
126
+ )}
127
+ </WrapperHeaderTag>
128
+ )
129
+ }
134
130
 
135
131
  <div class={twMerge(title ? 'mt-2' : '', contentClass)}>
136
132
  <slot />
@@ -63,7 +63,10 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
63
63
  {
64
64
  image && (
65
65
  <div
66
- class={twMerge('relative w-full aspect-square overflow-hidden rounded-lg bg-gray-400 dark:bg-zinc-700', imageClass)}
66
+ class={twMerge(
67
+ 'relative w-full aspect-square overflow-hidden rounded-lg bg-gray-400 dark:bg-zinc-700',
68
+ imageClass
69
+ )}
67
70
  >
68
71
  {urlForImage ? (
69
72
  <a href={urlForImage} class="group block w-full h-full">
@@ -83,18 +86,14 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
83
86
  {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
84
87
  <Fragment slot="badgeBottomRight">
85
88
  <div class={twMerge('', classes?.badgeBottomRight)}>
86
- <slot name="badgeBottomRight">
87
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
88
- </slot>
89
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
89
90
  </div>
90
91
  </Fragment>
91
92
  )}
92
93
  {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
93
94
  <Fragment slot="badgeBottomLeft">
94
95
  <div class={twMerge('', classes?.badgeBottomLeft)}>
95
- <slot name="badgeBottomLeft">
96
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
97
- </slot>
96
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
98
97
  </div>
99
98
  </Fragment>
100
99
  )}
@@ -119,18 +118,14 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
119
118
  {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
120
119
  <Fragment slot="badgeBottomRight">
121
120
  <div class={twMerge('', classes?.badgeBottomRight)}>
122
- <slot name="badgeBottomRight">
123
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
124
- </slot>
121
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
125
122
  </div>
126
123
  </Fragment>
127
124
  )}
128
125
  {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
129
126
  <Fragment slot="badgeBottomLeft">
130
127
  <div class={twMerge('', classes?.badgeBottomLeft)}>
131
- <slot name="badgeBottomLeft">
132
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
133
- </slot>
128
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
134
129
  </div>
135
130
  </Fragment>
136
131
  )}
@@ -145,11 +140,7 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
145
140
 
146
141
  <div class="flex items-start gap-2">
147
142
  <div>
148
- {title && (
149
- <WrapperHeaderTag class={cn('text-lg md:text-xl font-bold', titleClass)}>
150
- {title}
151
- </WrapperHeaderTag>
152
- )}
143
+ {title && <WrapperHeaderTag class={cn('text-lg md:text-xl font-bold', titleClass)}>{title}</WrapperHeaderTag>}
153
144
 
154
145
  <div class={cn(title ? 'mt-2' : '', 'text-sm md:text-base leading-5 md:leading-6', descriptionClass)}>
155
146
  <slot />
@@ -166,7 +157,11 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
166
157
  <div class={cn('flex gap-2', actionClass)}>
167
158
  {callToAction.map((action) => (
168
159
  <Fragment>
169
- {typeof action === 'string' ? <Fragment set:html={action} /> : <Button {...(action as any || {})} />}
160
+ {typeof action === 'string' ? (
161
+ <Fragment set:html={action} />
162
+ ) : (
163
+ <Button {...((action as any) || {})} />
164
+ )}
170
165
  </Fragment>
171
166
  ))}
172
167
  </div>
@@ -176,7 +171,7 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
176
171
  <Fragment set:html={callToAction} />
177
172
  ) : (
178
173
  <div class={cn('', actionClass)}>
179
- <Button {...(callToAction as Object)} />
174
+ <Button {...(callToAction as object)} />
180
175
  </div>
181
176
  )}
182
177
  </Fragment>
@@ -61,7 +61,11 @@ const {
61
61
  <div class={cn('flex gap-2', actionClass)}>
62
62
  {callToAction.map((action) => (
63
63
  <Fragment>
64
- {typeof action === 'string' ? <Fragment set:html={action} /> : <Button {...(action as any || {})} />}
64
+ {typeof action === 'string' ? (
65
+ <Fragment set:html={action} />
66
+ ) : (
67
+ <Button {...((action as any) || {})} />
68
+ )}
65
69
  </Fragment>
66
70
  ))}
67
71
  </div>
@@ -71,7 +75,7 @@ const {
71
75
  <Fragment set:html={callToAction} />
72
76
  ) : (
73
77
  <div class={cn('', actionClass)}>
74
- <Button {...(callToAction as Object)} />
78
+ <Button {...(callToAction as object)} />
75
79
  </div>
76
80
  )}
77
81
  </Fragment>
@@ -93,6 +93,13 @@ const {
93
93
  </div>
94
94
  </div>
95
95
 
96
- {callToAction && (typeof callToAction === 'string' ? <Fragment set:html={callToAction} /> : <Button {...(callToAction as any)} />)}
96
+ {
97
+ callToAction &&
98
+ (typeof callToAction === 'string' ? (
99
+ <Fragment set:html={callToAction} />
100
+ ) : (
101
+ <Button {...(callToAction as any)} />
102
+ ))
103
+ }
97
104
  </div>
98
105
  </Card0>
@@ -1,10 +1,10 @@
1
1
  ---
2
- import type {Card6Props as Props} from './types';
3
- import {Icon} from "astro-icon/components";
4
- import {twMerge} from 'tailwind-merge';
2
+ import type { Card6Props as Props } from './types';
3
+ import { Icon } from 'astro-icon/components';
4
+ import { twMerge } from 'tailwind-merge';
5
5
  import Card0 from '../Card0/Card0.astro';
6
6
  import ImageGallery from '../ImageGallery/ImageGallery.astro';
7
- import {cn} from '../../utils';
7
+ import { cn } from '../../utils';
8
8
 
9
9
  const {
10
10
  title = await Astro.slots.render('title'),
@@ -20,7 +20,7 @@ const {
20
20
  badgeBottomLeft = await Astro.slots.render('badgeBottomLeft'),
21
21
  widths = [800, 1600],
22
22
  size = 800,
23
- sizes = '(max-width: 1600px) 800px, 1600px'
23
+ sizes = '(max-width: 1600px) 800px, 1600px',
24
24
  } = Astro.props;
25
25
 
26
26
  const WrapperHeaderTag = asHeader;
@@ -59,60 +59,75 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
59
59
  badgeBottomRight={badgeBottomRight}
60
60
  badgeBottomLeft={badgeBottomLeft}
61
61
  classes={{
62
- container: cn('relative h-full bg-gray-200 dark:bg-zinc-700 border-transparent text-inherit justify-start py-0 @container', containerClass),
62
+ container: cn(
63
+ 'relative h-full bg-gray-200 dark:bg-zinc-700 border-transparent text-inherit justify-start py-0 @container',
64
+ containerClass
65
+ ),
63
66
  badge: badgeClass,
64
67
  badgeTopRight: classes?.badgeTopRight,
65
68
  }}
66
69
  >
67
70
  <!-- Content & link -->
68
- <LinkWrapperTag href={urlForImage} class={cn("flex flex-col gap-y-2 absolute top-0 right-0 bottom-0 left-0 z-10", image ? 'justify-end' : 'justify-center')}>
69
- <div class={cn("p-6 @2xl:p-10 pt-8 @2xl:pt-12", contentClass, !image && 'bg-transparent')}>
70
- {badge && (
71
- <div class="" set:html={badge}></div>)}
71
+ <LinkWrapperTag
72
+ href={urlForImage}
73
+ class={cn(
74
+ 'flex flex-col gap-y-2 absolute top-0 right-0 bottom-0 left-0 z-10',
75
+ image ? 'justify-end' : 'justify-center'
76
+ )}
77
+ >
78
+ <div class={cn('p-6 @2xl:p-10 pt-8 @2xl:pt-12', contentClass, !image && 'bg-transparent')}>
79
+ {badge && <div class="" set:html={badge} />}
72
80
 
73
- {(Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
74
- <div class={twMerge('absolute z-10 bottom-2 right-2', classes?.badgeBottomRight)}>
75
- <slot name="badgeBottomRight">
76
- {badgeBottomRight && <span set:html={badgeBottomRight}/>}
77
- </slot>
78
- </div>
79
- )}
81
+ {
82
+ (Astro.slots.has('badgeBottomRight') || badgeBottomRight) && (
83
+ <div class={twMerge('absolute z-10 bottom-2 right-2', classes?.badgeBottomRight)}>
84
+ <slot name="badgeBottomRight">{badgeBottomRight && <span set:html={badgeBottomRight} />}</slot>
85
+ </div>
86
+ )
87
+ }
80
88
 
81
- {(Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
82
- <div class={twMerge('absolute z-10 bottom-2 left-2', classes?.badgeBottomLeft)}>
83
- <slot name="badgeBottomLeft">
84
- {badgeBottomLeft && <span set:html={badgeBottomLeft}/>}
85
- </slot>
86
- </div>
87
- )}
89
+ {
90
+ (Astro.slots.has('badgeBottomLeft') || badgeBottomLeft) && (
91
+ <div class={twMerge('absolute z-10 bottom-2 left-2', classes?.badgeBottomLeft)}>
92
+ <slot name="badgeBottomLeft">{badgeBottomLeft && <span set:html={badgeBottomLeft} />}</slot>
93
+ </div>
94
+ )
95
+ }
88
96
 
89
- {title && (
90
- <WrapperHeaderTag
91
- class={cn('font-bold text-lg @lg:text-xl @2xl:text-2xl ', urlForImage && 'group-hover:underline', titleClass)}>
92
- {title}
93
- </WrapperHeaderTag>
94
- )}
97
+ {
98
+ title && (
99
+ <WrapperHeaderTag
100
+ class={cn(
101
+ 'font-bold text-lg @lg:text-xl @2xl:text-2xl ',
102
+ urlForImage && 'group-hover:underline',
103
+ titleClass
104
+ )}
105
+ >
106
+ {title}
107
+ </WrapperHeaderTag>
108
+ )
109
+ }
95
110
 
96
111
  <div class={cn('text-sm @lg:text-base @2xl:text-lg', title ? 'mt-2' : '', descriptionClass)}>
97
- <slot/>
112
+ <slot />
98
113
  {description}
99
114
  </div>
100
115
 
101
- {urlForImage && (
102
- <div class="size-6 overflow-hidden mt-4 ">
103
- <div
104
- class="grid grid-cols-2 w-12 gap-2 duration-400 transition-transform -translate-x-7 group-hover:translate-x-0">
105
- <Icon name="tabler:arrow-right" class="size-6"/>
106
- <Icon name="tabler:arrow-right" class="size-6"/>
116
+ {
117
+ urlForImage && (
118
+ <div class="size-6 overflow-hidden mt-4 ">
119
+ <div class="grid grid-cols-2 w-12 gap-2 duration-400 transition-transform -translate-x-7 group-hover:translate-x-0">
120
+ <Icon name="tabler:arrow-right" class="size-6" />
121
+ <Icon name="tabler:arrow-right" class="size-6" />
122
+ </div>
107
123
  </div>
108
- </div>
109
- )}
124
+ )
125
+ }
110
126
  </div>
111
127
  </LinkWrapperTag>
112
128
 
113
129
  <!-- Image -->
114
130
  <div class="relative flex w-full h-full overflow-hidden">
115
-
116
131
  <!--
117
132
  16/9: pb-[56%]
118
133
  4/3: pb-[75%]
@@ -122,25 +137,27 @@ const isHtmlImage = typeof image === 'string' && !Array.isArray(image);
122
137
  3/4: pb-[133%]
123
138
  9/16: pb-[177%]
124
139
  -->
125
- <div class={cn("relative w-full h-auto min-h-full", aspectClass)}>
126
- {image && (
127
- <div class="absolute inset-0">
128
- {isHtmlImage ? (
129
- <Fragment set:html={image}/>
130
- ) : (
131
- <ImageGallery
132
- image={image}
133
- imageClass={cn('absolute left-0 top-0 p-0', imageClass)}
134
- imageLayout={imageLayout}
135
- widths={widths}
136
- width={size}
137
- height={size}
138
- sizes={sizes}
139
- hoverEffect={false}
140
- />
141
- )}
142
- </div>
143
- )}
140
+ <div class={cn('relative w-full h-auto min-h-full', aspectClass)}>
141
+ {
142
+ image && (
143
+ <div class="absolute inset-0">
144
+ {isHtmlImage ? (
145
+ <Fragment set:html={image} />
146
+ ) : (
147
+ <ImageGallery
148
+ image={image}
149
+ imageClass={cn('absolute left-0 top-0 p-0', imageClass)}
150
+ imageLayout={imageLayout}
151
+ widths={widths}
152
+ width={size}
153
+ height={size}
154
+ sizes={sizes}
155
+ hoverEffect={false}
156
+ />
157
+ )}
158
+ </div>
159
+ )
160
+ }
144
161
  </div>
145
162
  </div>
146
163
  </Card0>