@hellobetterdigitalnz/selwynui 0.0.1-5 → 0.0.1-7

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 (34) hide show
  1. package/package.json +2 -1
  2. package/src/Components/DataDisplay/DetailsCard/DetailsCard.stories.tsx +7 -3
  3. package/src/Components/DataDisplay/DetailsCard/DetailsCard.tsx +10 -38
  4. package/src/Components/DataDisplay/DetailsCard/DetailsCardProps.tsx +7 -1
  5. package/src/Components/DataDisplay/DetailsCard/detailsCard.module.scss +10 -10
  6. package/src/Components/DataDisplay/ImageContent/ImageContent.stories.tsx +33 -2
  7. package/src/Components/DataDisplay/ImageContent/ImageContent.tsx +62 -30
  8. package/src/Components/DataDisplay/ImageContent/ImageContentProps.tsx +2 -1
  9. package/src/Components/DataDisplay/ImageContent/imageContent.module.scss +116 -56
  10. package/src/Components/DataDisplay/Pathway/Pathway.stories.tsx +50 -13
  11. package/src/Components/DataDisplay/Pathway/Pathway.tsx +15 -4
  12. package/src/Components/DataDisplay/index.ts +0 -1
  13. package/src/Components/DataDisplay/slider.scss +2 -0
  14. package/src/Components/Layout/Footer/Footer.stories.tsx +1 -1
  15. package/src/Components/Layout/Header/Header.stories.tsx +34 -7
  16. package/src/Components/Layout/Header/HeaderRightItem.tsx +2 -2
  17. package/src/Components/Layout/Header/MobileNavigation/MobileNavigation.tsx +25 -0
  18. package/src/Components/Layout/Header/MobileNavigation/MobileNavigationItem.tsx +17 -0
  19. package/src/Components/Layout/Header/MobileNavigation/MobileNavigationItemProps.tsx +5 -0
  20. package/src/Components/Layout/Header/MobileNavigation/MobileNavigationProps.tsx +8 -0
  21. package/src/Components/Layout/Header/MobileNavigation/MobileSubNavigation/MobileSubNavigation.tsx +21 -0
  22. package/src/Components/Layout/Header/MobileNavigation/MobileSubNavigation/MobileSubNavigationItem.tsx +17 -0
  23. package/src/Components/Layout/Header/MobileNavigation/MobileSubNavigation/MobileSubNavigationItemProps.tsx +5 -0
  24. package/src/Components/Layout/Header/MobileNavigation/MobileSubNavigation/MobileSubNavigationProps.tsx +9 -0
  25. package/src/Components/Layout/Header/MobileNavigation/MobileWhatuOverlay.tsx +18 -0
  26. package/src/Components/Layout/Header/MobileNavigation/mobileNavigation.module.scss +62 -0
  27. package/src/Components/Layout/Header/header.module.scss +16 -2
  28. package/src/Components/Layout/Header/header.scss +15 -0
  29. package/src/Components/Layout/HeroBanner/HeroBanner.tsx +10 -0
  30. package/src/Components/Layout/HeroBanner/HeroBannerProps.tsx +1 -1
  31. package/src/Components/Layout/HeroBanner/heroBanner.module.scss +48 -13
  32. package/src/Components/Layout/index.ts +0 -1
  33. package/src/Components/Shared/Container/container.module.scss +3 -3
  34. package/src/Components/index.ts +5 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hellobetterdigitalnz/selwynui",
3
- "version": "0.0.1-5",
3
+ "version": "0.0.1-7",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.es.js",
@@ -29,6 +29,7 @@
29
29
  "react-dom": "^19.2.0",
30
30
  "react-icons": "^5.5.0",
31
31
  "sass": "^1.94.1",
32
+ "slick-carousel": "^1.8.1",
32
33
  "vite-plugin-dts": "^4.5.4"
33
34
  },
34
35
  "peerDependencies": {
@@ -13,11 +13,15 @@ type Story = StoryObj<typeof DetailsCard>
13
13
 
14
14
  export const live: Story = {
15
15
  args: {
16
- date: "6 Nov 2025",
17
- title: "This is a card title that is quite long and probably wraps over a few lines",
16
+ title: "Listing Name",
18
17
  image:"./img/card-one.png",
19
- link: '#',
18
+ link: {
19
+ title: 'Learn more',
20
+ href: '/',
21
+ target: '',
22
+ },
20
23
  variation: 'short'
24
+
21
25
  },
22
26
  };
23
27
 
@@ -11,11 +11,14 @@ const DetailsCard = (props: DetailsCardProps) => {
11
11
  image = '',
12
12
  variation= 'long',
13
13
  link = '',
14
- category = 'all'
14
+ category = 'all',
15
+ pillar = 'visit'
15
16
  } = props;
16
17
 
17
18
  const classes = [
18
19
  styles.detailsCard,
20
+ `${pillar}--light`,
21
+ "visit",
19
22
  "detailsCard",
20
23
  ];
21
24
 
@@ -24,11 +27,10 @@ const DetailsCard = (props: DetailsCardProps) => {
24
27
  }
25
28
 
26
29
 
27
- return <>
28
- {link ? <div className={cx(classes)} id={category}>
29
- <a href={link} className={`${styles.cardWrap} ${styles.detailsCardWithLink}`}>
30
+ return <div className={cx(classes)} id={category}>
31
+ <a href={link.href} target={link.target} rel={link.rel} className={`${styles.cardWrap} ${styles.detailsCardWithLink}`}>
30
32
  {image && <div className={styles.cardImage}>
31
- <img src={image} />
33
+ <img src={image} alt={title} />
32
34
  </div>}
33
35
 
34
36
  <div className={styles.cardContent}>
@@ -43,45 +45,15 @@ const DetailsCard = (props: DetailsCardProps) => {
43
45
  {description}
44
46
  </div>}
45
47
  </div>
46
- {link && <div className={styles.cardLink}>
47
- Learn more
48
+ {link.title && <div className={styles.cardLink}>
49
+ {link.title}
48
50
  <span>
49
51
  <ArrowRight />
50
52
  </span>
51
53
  </div>}
52
54
  </div>
53
55
  </a>
54
- </div> : <div className={cx(classes)} id={category}>
55
- <div className={styles.cardWrap}>
56
- {image && <div className={styles.cardImage}>
57
- <img src={image} />
58
- </div>}
59
-
60
- <div className={styles.cardContent}>
61
- <div className={styles.cardBody}>
62
- {date && <div className={styles.cardDate}>
63
- <p>{date}</p>
64
- </div>}
65
- {title && <div className={`${styles.cardTitle} typography`}>
66
- <h6>{title}</h6>
67
- </div>}
68
- {description && <div className={`${styles.cardDesc} typography`}>
69
- {description}
70
- </div>}
71
- </div>
72
- {link && <div className={styles.cardLink}>
73
- <a href={link}>
74
- Learn more
75
- <span>
76
- <ArrowRight />
77
- </span>
78
- </a>
79
- </div>}
80
- </div>
81
- </div>
82
- </div>}
83
-
84
- </>
56
+ </div>
85
57
  }
86
58
 
87
59
  export default DetailsCard;
@@ -3,7 +3,13 @@ interface DetailsCardProps {
3
3
  title?:string,
4
4
  description?:string,
5
5
  date?: string,
6
- link?:string,
6
+ link?: {
7
+ title?: string;
8
+ href?: string;
9
+ target?: "_blank" | "_self" | "_parent" | "_top";
10
+ rel?: string;
11
+ };
12
+ pillar?: 'visit' | 'live' | 'business' | 'participate' | 'taste'
7
13
  image?:string,
8
14
  variation?: "long" | "short";
9
15
  category?: 'all' | 'adventure' | 'ski' | 'nature',
@@ -9,16 +9,20 @@
9
9
  min-height: 274px;
10
10
  }
11
11
 
12
+ &:hover {
13
+ background-color: var(--pathway-card-hover-bg);
14
+ border:1px solid var(--pathway-card-hover-text);
15
+
16
+ .cardContent {
17
+ color: var(--pathway-card-hover-text);
18
+ }
19
+
20
+ }
21
+
12
22
  }
13
23
 
14
24
  .detailsCardWithLink {
15
25
  color: var(--pathway-card-text);
16
- transition: all ease 0.3s;
17
-
18
- &:hover {
19
- background-color: var(--pathway-card-hover-bg);
20
- color: var(--pathway-card-hover-text);
21
- }
22
26
  }
23
27
 
24
28
  .cardImage {
@@ -58,10 +62,6 @@
58
62
  .detailsCardShort & {
59
63
  min-height: 274px;
60
64
  }
61
-
62
- &:hover {
63
- border-radius: 12px;
64
- }
65
65
  }
66
66
 
67
67
  .cardContent {
@@ -78,6 +78,33 @@ const ImageContentMaskedTemplate: Story = {
78
78
  }
79
79
  }
80
80
 
81
+ const ImageContentFluidTemplate : Story = {
82
+ render: () => {
83
+
84
+ return (
85
+ <>
86
+ <ElementHolder
87
+ paddingTop={'none'}
88
+ paddingBottom={'none'}
89
+ pillar={'taste'}
90
+ level={'primary'}
91
+ >
92
+ <ImageContent
93
+ rendition={'fluid'}
94
+ pillar={'live'}
95
+ imageSrc={'https://images.pexels.com/photos/1563356/pexels-photo-1563356.jpeg'}
96
+ title={'Lorem'}
97
+ boldTitle={'ipsum dolor'}
98
+ displayFullLogo={false}
99
+ content={'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat'}
100
+ action={<Button style={'solid'} pillar={'taste'} level={"secondary"} label={'LOREM IPSUM'}/>}
101
+ />
102
+ </ElementHolder>
103
+ </>
104
+ )
105
+ }
106
+ }
107
+
81
108
  const ImageContentFullTemplate: Story = {
82
109
  render: () => {
83
110
 
@@ -111,8 +138,8 @@ const ImageContentFullTemplate: Story = {
111
138
  label:'What are you doing'
112
139
  }
113
140
  ]}
114
- imageBorder={'top'}
115
- alignment={'left'}
141
+ imageBorder={'top-right'}
142
+ alignment={'right'}
116
143
  imageSrc={'https://images.pexels.com/photos/1563356/pexels-photo-1563356.jpeg'}
117
144
  />
118
145
  </ElementHolder>
@@ -162,4 +189,8 @@ export const ImageContentMaskedComponent = {
162
189
 
163
190
  export const ImageContentFullTemplateComponent ={
164
191
  ...ImageContentFullTemplate
192
+ }
193
+
194
+ export const ImageContentFluidTemplateComponent ={
195
+ ...ImageContentFluidTemplate
165
196
  }
@@ -10,7 +10,6 @@ const ImageContent = (props: ImageContentProps) => {
10
10
  const {
11
11
  pillar,
12
12
  displayFullLogo = false,
13
- displayIconWithTitle = false,
14
13
  title,
15
14
  boldTitle,
16
15
  content,
@@ -18,34 +17,33 @@ const ImageContent = (props: ImageContentProps) => {
18
17
  images,
19
18
  imageSrc,
20
19
  alignment = "right",
21
- imageBorder = "bottom",
20
+ imageBorder = "top-right",
22
21
  rendition = "contained",
23
22
  list,
24
23
  } = props;
25
24
 
25
+ const pillarLogo = (
26
+ <div className={`${styles.pillarlogo} ${!displayFullLogo ? styles.pillarlogoFull : ''}`}>
27
+ <PillarLogo brandPillar={pillar} brandFullLogo={displayFullLogo}/>
28
+ {!displayFullLogo && <p>
29
+ {pillar === "main" && "Visit"}
30
+ {pillar === "live" && "Live"}
31
+ {pillar === "visit" && "Vist"}
32
+ {pillar === "taste" && "Taste"}
33
+ {pillar === "business" && "Business"}
34
+ {pillar === "participate" && "Participate"}
35
+ </p>}
36
+ </div>
37
+ )
38
+
26
39
 
27
40
  if (rendition === 'full'){
28
- return <div className={`${styles.imageContent} ${styles.imageContentFull} ${styles[alignment]} ${styles[imageBorder]} `}>
41
+ return <div className={`${styles.imageContent} ${styles.imageContentFull} ${styles[imageBorder]} `}>
29
42
  <Container>
30
43
  <div className={styles.imageContentWrapper}>
31
- <div className={styles.imageWrapper}>
32
- <div className={styles.imageHolder}>
33
- {imageSrc && <img src={imageSrc}/>}
34
- </div>
35
- </div>
36
44
  <div className={styles.content}>
37
45
  <div className={styles.contentWrapper}>
38
- <div className={styles.pillarlogo}>
39
- <PillarLogo brandPillar={pillar} brandFullLogo={displayFullLogo}/>
40
- {!displayFullLogo && <p>
41
- {pillar === "main" && "Visit"}
42
- {pillar === "live" && "Live"}
43
- {pillar === "visit" && "Vist"}
44
- {pillar === "taste" && "Taste"}
45
- {pillar === "business" && "Business"}
46
- {pillar === "participate" && "Participate"}
47
- </p>}
48
- </div>
46
+ {pillarLogo}
49
47
  <div className={styles.title}>
50
48
  <h3>
51
49
  {title}
@@ -73,6 +71,11 @@ const ImageContent = (props: ImageContentProps) => {
73
71
  </div>}
74
72
  </div>
75
73
  </div>
74
+ <div className={styles.imageWrapper}>
75
+ <div className={styles.imageHolder}>
76
+ {imageSrc && <img src={imageSrc}/>}
77
+ </div>
78
+ </div>
76
79
  </div>
77
80
  </Container>
78
81
  <div className={styles.svgBackgroundPillar}>
@@ -81,6 +84,45 @@ const ImageContent = (props: ImageContentProps) => {
81
84
  </div>
82
85
  }
83
86
 
87
+ if(rendition === "fluid"){
88
+ return <div className={`${styles.imageContent} ${styles.imageContentFluid} ${styles[alignment]}`}>
89
+ <Container>
90
+ <div className={styles.imageContentWrapper}>
91
+ <div className={styles.imageWrapper}>
92
+ <div className={styles.imageHolder}>
93
+ {imageSrc && <img src={imageSrc}/>}
94
+ <div className={styles.clipPath}>
95
+ <svg xmlns="http://www.w3.org/2000/svg" width="362" height="725" viewBox="0 0 362 725" fill="none">
96
+ <path d="M0 0C0 296.003 141.877 559.012 361.463 725H0V0Z" fill="currentColor"/>
97
+ </svg>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ <div className={styles.content}>
102
+ <div className={styles.contentWrapper}>
103
+ {pillarLogo}
104
+ <div className={styles.title}>
105
+ <h3>
106
+ {title}
107
+ {boldTitle && (<>
108
+ <br/>
109
+ <span>{boldTitle}</span>
110
+ </>)}
111
+ </h3>
112
+ </div>
113
+ <div className={styles.desc}>
114
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
115
+ </div>
116
+ {action && <div className={styles.action}>
117
+ {action}
118
+ </div>}
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </Container>
123
+ </div>
124
+ }
125
+
84
126
  if (rendition === 'masked'){
85
127
  return (
86
128
  <div className={`${styles.imageContent} ${styles.maskedImageContent} ${styles[alignment]}`}>
@@ -95,17 +137,7 @@ const ImageContent = (props: ImageContentProps) => {
95
137
  {/* CONTENT */}
96
138
  <div className={styles.content}>
97
139
  <div className={styles.contentWrapper}>
98
- <div className={`${styles.pillarlogo} ${!displayFullLogo ? styles.pillarlogoFull : ''}`}>
99
- <PillarLogo brandPillar={pillar} brandFullLogo={displayFullLogo}/>
100
- {!displayFullLogo && <p>
101
- {pillar === "main" && "Visit"}
102
- {pillar === "live" && "Live"}
103
- {pillar === "visit" && "Vist"}
104
- {pillar === "taste" && "Taste"}
105
- {pillar === "business" && "Business"}
106
- {pillar === "participate" && "Participate"}
107
- </p>}
108
- </div>
140
+ {pillarLogo}
109
141
  <div className={styles.title}>
110
142
  <h4>{title}</h4>
111
143
  </div>
@@ -10,6 +10,7 @@ export type PillarType =
10
10
 
11
11
  export type RenditionType =
12
12
  | "full"
13
+ | "fluid"
13
14
  | "contained"
14
15
  | "masked";
15
16
 
@@ -34,7 +35,7 @@ export interface ImageContentProps {
34
35
  images?: ImageSet;
35
36
  imageSrc?:string;
36
37
  alignment?: 'left' | 'right';
37
- imageBorder?: 'top' | 'bottom'
38
+ imageBorder?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'
38
39
  rendition?: RenditionType;
39
40
  list?: Item[];
40
41
  }
@@ -157,6 +157,7 @@
157
157
  // full image
158
158
  &.imageContentFull{
159
159
  position: relative;
160
+ overflow: hidden;
160
161
 
161
162
  .svgBackgroundPillar{
162
163
  position: absolute;
@@ -174,71 +175,51 @@
174
175
  }
175
176
  }
176
177
 
177
- &.top{
178
- &.left{
179
- .imageHolder {
180
- border-radius: 0px 500px 0px 0px;
181
- }
182
- }
178
+ &.top-left{
179
+ .imageHolder{
180
+ border-radius: 200px 0 0 0;
181
+ }
182
+ }
183
183
 
184
- &.right{
185
- .imageHolder {
186
- border-radius: 500px 0px 0px;
187
- }
184
+ &.top-right{
185
+ .imageHolder{
186
+ border-radius: 0 200px 0 0;
188
187
  }
189
188
  }
190
189
 
191
- &.bottom{
192
- &.left{
193
- .imageHolder {
194
- border-radius: 0px 0px 500px 0px;
195
- }
196
- }
197
-
198
- &.right{
199
- .imageHolder {
200
- border-radius: 0px 0px 0px 500px;
201
- }
190
+ &.bottom-right{
191
+ .imageHolder{
192
+ border-radius: 0 0 200px 0;
202
193
  }
203
194
  }
204
195
 
205
- &.left{
206
- .imageContentWrapper {
207
- flex-direction: row;
208
- }
209
-
210
- .imageHolder {
211
- height: 100%;
212
- position: absolute;
213
- width: calc(50vw + 10px);
214
- right: 0;
215
- left: unset;
216
- }
217
-
218
- .content{
219
- padding-left: 0;
220
- padding-right: 0;
196
+ &.bottom-left{
197
+ .imageHolder{
198
+ border-radius: 0 0 0 200px;
221
199
  }
222
-
223
200
  }
224
201
 
225
202
  .imageContentWrapper{
226
203
  margin: 0px;
227
- min-height: 935px;
228
204
  }
229
205
 
230
206
  .imageWrapper{
231
207
  position: relative;
232
208
  padding: 0px;
209
+ //width: 100%;
210
+ z-index: 1;
211
+ margin-top: 0;
212
+ width: calc(100% + 32px);
213
+ margin-left: -16px;
214
+ margin-right: -15px;
233
215
  }
234
216
 
235
217
  .imageHolder {
236
218
  padding: 0;
237
219
  height: 100%;
238
- position: absolute;
239
- width: calc(50vw - 10px);
240
- left: 0;
241
- overflow: hidden;
220
+ width: 100%;
221
+ min-width: 50vw;
222
+ min-height: 380px;
242
223
 
243
224
 
244
225
  &::before {
@@ -254,8 +235,9 @@
254
235
  }
255
236
 
256
237
  .content{
257
- padding: 0;
258
- padding-right: 198px;
238
+ padding-top: 32px;
239
+ padding-bottom: 32px;
240
+ padding-right: 0px;
259
241
 
260
242
  .desc{
261
243
  }
@@ -290,7 +272,65 @@
290
272
 
291
273
  }
292
274
 
293
- @media screen and (min-width: 992px){
275
+ //Fluid
276
+ &.imageContentFluid{
277
+ overflow-x: hidden;
278
+
279
+ .pillarlogo{
280
+ display: flex;
281
+ margin-bottom: 48px;
282
+ align-items: center;
283
+
284
+ p{
285
+ margin-left: 16px;
286
+ font-size: 18px;
287
+ font-style: normal;
288
+ font-weight: 700;
289
+ line-height: 140%;
290
+ }
291
+
292
+ &.pillarlogoFull{
293
+ svg{
294
+ width: 32px;
295
+ height: 32px;
296
+ }
297
+ }
298
+ svg{
299
+ width: 160px;
300
+ height: 54px;
301
+ }
302
+
303
+ }
304
+
305
+ .imageContentWrapper{
306
+ min-height: 725px;
307
+ }
308
+
309
+ .imageHolder{
310
+ min-width: 50vw;
311
+ border-radius: 0;
312
+ width: calc(100% + 32px);
313
+ margin-left: -16px;
314
+ margin-right: -16px;
315
+ position: relative;
316
+
317
+ .clipPath{
318
+ position: absolute;
319
+ top: 0;
320
+ bottom: 0;
321
+ color: var(--color-block-bg);
322
+ }
323
+
324
+ }
325
+
326
+ .content{
327
+ padding-top: 32px;
328
+ padding-bottom: 32px;
329
+ }
330
+
331
+ }
332
+
333
+ @media screen and (min-width: 1200px){
294
334
 
295
335
  &Wrapper{
296
336
  margin: 0 -52px;
@@ -353,23 +393,43 @@
353
393
  margin-bottom: 48px;
354
394
  }
355
395
 
356
- &.left{
396
+ &.top-left{
397
+ .imageHolder{
398
+ border-radius: 500px 0 0 0;
399
+ }
400
+ }
357
401
 
358
- .imageHolder {
359
- height: 100%;
360
- position: absolute;
361
- width: calc(50vw + 10px);
362
- right: 0;
363
- left: unset;
402
+ &.top-right{
403
+ .imageHolder{
404
+ border-radius: 0 500px 0 0;
364
405
  }
406
+ }
365
407
 
366
- .content{
367
- padding-left: 198px;
368
- padding-right: 0;
408
+ &.bottom-right{
409
+ .imageHolder{
410
+ border-radius: 0 0 500px 0;
369
411
  }
412
+ }
370
413
 
414
+ &.bottom-left{
415
+ .imageHolder{
416
+ border-radius: 0 0 0 500px;
417
+ }
371
418
  }
372
419
 
420
+ .imageContentWrapper{
421
+ margin: 0px;
422
+ min-height: 935px;
423
+ }
424
+
425
+ .imageWrapper{
426
+ width: 50%;
427
+ }
428
+
429
+ .content{
430
+ padding-right: 198px;
431
+ }
432
+
373
433
  }
374
434
 
375
435
  }
@@ -1,27 +1,64 @@
1
+ import React from 'react'
1
2
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
3
  import Pathway from './Pathway';
3
- import { FaArrowRight } from "react-icons/fa";
4
+ import {ElementHolder} from "../../Shared";
4
5
 
5
6
  const meta : Meta<typeof Pathway> = {
6
7
  title: "Form / Pathway",
7
8
  component: Pathway,
8
-
9
9
  }
10
10
 
11
11
  export default meta;
12
12
  type Story = StoryObj<typeof Pathway>
13
13
 
14
- export const grid: Story = {
15
- args: {
16
- title: "This is a card title that is quite long and probably wraps over a few lines",
17
- link: '#',
18
- filters: ["all", "adventure", "ski", "nature", "city"],
19
- cards: [
20
- { title: "Ballooning Canterbury", link: "#", image: "./img/card-one.png", category: "adventure" },
14
+ const GridTemplate: Story = {
15
+ render : () =>{
16
+
17
+ return <ElementHolder paddingTop={'md'} paddingBottom={"md"}>
18
+ <Pathway
19
+ title={'Food and drink'}
20
+ description={'Find the ideal event venues in Selwyn, where beautiful landscapes blend with top-notch facilities. '}
21
+ variation={'grid'}
22
+ filters={["all", "adventure", "ski", "nature", "city"]}
23
+ cards={
24
+ [
25
+ { title: "Ballooning Canterbury", link: "#", image: "./img/card-one.png", category: "adventure", pillar: "live" },
26
+ { title: "Ski Resort", link: "#", image: "./img/card-two.png", category: "ski" },
27
+ { title: "Nature Walk", link: "#", image: "./img/card-three.png", category: "nature" },
28
+ { title: "City Tour", link: "#", image: "./img/card-four.png" }
29
+ ]
30
+ }
31
+ />
32
+ </ElementHolder>
33
+ }
34
+ };
35
+
36
+ const CarouselTemplate: Story = {
37
+ render : () =>{
38
+
39
+ return <ElementHolder paddingTop={'md'} paddingBottom={"md"}>
40
+ <Pathway
41
+ title={'Food and drink'}
42
+ description={'Find the ideal event venues in Selwyn, where beautiful landscapes blend with top-notch facilities. '}
43
+ variation={'carousel'}
44
+ cards={
45
+ [
46
+ { title: "Ballooning Canterbury", link: "#", image: "./img/card-one.png", category: "adventure", pillar: "live" },
21
47
  { title: "Ski Resort", link: "#", image: "./img/card-two.png", category: "ski" },
22
48
  { title: "Nature Walk", link: "#", image: "./img/card-three.png", category: "nature" },
23
- { title: "City Tour", link: "#", image: "./img/card-four.png" }
24
- ]
25
-
26
- },
49
+ { title: "City Tour", link: "#", image: "./img/card-four.png" }
50
+ ]
51
+ }
52
+ />
53
+ </ElementHolder>
54
+ }
27
55
  };
56
+
57
+
58
+ export const GridView = {
59
+ ...GridTemplate,
60
+ }
61
+
62
+ export const CarouselView = {
63
+ ...CarouselTemplate,
64
+ }
@@ -2,7 +2,6 @@ import cx from "classnames";
2
2
  import PathwayProps from './PathwayProps';
3
3
  import styles from "./pathway.module.scss";
4
4
  import cslx from "clsx";
5
- import ElementHolder from "../../Shared/ElementHolder/ElementHolder";
6
5
  import Container from "../../Shared/Container/Container";
7
6
  import DetailsCard from "../DetailsCard/DetailsCard";
8
7
  import { CaretDown } from "../../Icons";
@@ -29,10 +28,22 @@ const Pathway = (props:PathwayProps) => {
29
28
  const classes = [styles.pathway, "pathway", variation === "carousel" && styles.pathwayCarousel];
30
29
 
31
30
  return (
32
- <ElementHolder paddingTop="none" level="light">
31
+ <div>
33
32
  <Container>
34
33
  {variation === "carousel" ? (
35
- <div className={cx(classes)}>{/* TODO */}</div>
34
+ <div className={cx(classes)}>
35
+ <div className={styles.contentWrapper}>
36
+ <div className={styles.content}>
37
+ <div className={styles.pathwayTitle}><h3>{title}</h3></div>
38
+ <div className={styles.pathwayDescription}><p>{description}</p></div>
39
+ </div>
40
+ <div className={styles.silderNav}>
41
+ </div>
42
+ </div>
43
+ {/*<div className={styles.}>*/}
44
+
45
+ {/*</div>*/}
46
+ </div>
36
47
  ) : (
37
48
  <div className={cslx(classes)}>
38
49
  <div className={styles.pathwayTitle}><h3>{title}</h3></div>
@@ -76,7 +87,7 @@ const Pathway = (props:PathwayProps) => {
76
87
  </div>
77
88
  )}
78
89
  </Container>
79
- </ElementHolder>
90
+ </div>
80
91
  );
81
92
  };
82
93
 
@@ -19,6 +19,5 @@ export { default as PromoBannerBlock } from './PromoBannerBlock/PromoBannerBlock
19
19
  export type { default as PromoBannerBlockProps } from './PromoBannerBlock/PromoBannerBlockProps';
20
20
 
21
21
  //ImageContent
22
-
23
22
  export {default as ImageContent} from './ImageContent/ImageContent'
24
23
  export type {default as ImageContentProps} from './ImageContent/ImageContentProps'
@@ -0,0 +1,2 @@
1
+ @import "../../../node_modules/slick-carousel/slick/slick.css";
2
+ @import "../../../node_modules/slick-carousel/slick/slick-theme.css";
@@ -161,7 +161,7 @@ const FooterTemplate: Story = {
161
161
  </FooterBottom>
162
162
  );
163
163
 
164
- return (
164
+ return (
165
165
  <Footer
166
166
  logo='img\waikirikiri-full-logo.svg'
167
167
  footerTop={footerTop}
@@ -5,6 +5,10 @@ import HeaderRight from "./HeaderRight";
5
5
  import HeaderRightItem from "./HeaderRightItem";
6
6
  import MagnifyingGlass from "./MagnifyingGlass/MagnifyingGlass";
7
7
  import MegaMenu from "./MegaMenu/MegaMenu";
8
+ import {List} from "../../Icons";
9
+ import "./header.scss"
10
+ import MobileNavigation from "./MobileNavigation/MobileNavigation";
11
+ import MobileNavigationItem from "./MobileNavigation/MobileNavigationItem";
8
12
 
9
13
 
10
14
  const meta: Meta = {
@@ -28,7 +32,7 @@ const logo = (
28
32
 
29
33
  const logoSmall = (
30
34
  <a href={"/"}>
31
- <img src={'/img/waikirikiri-full-logo.svg'} width={110} height={45} alt={'Hello Better'}/>
35
+ <img src={'/img/waikirikiri-full-logo.svg'} width={110} height={34} alt={'Hello Better'}/>
32
36
  </a>
33
37
  );
34
38
 
@@ -39,25 +43,48 @@ const HeaderTemplate: Story = {
39
43
  // @ts-ignore
40
44
  return <Header logo={logo} logoSmall={logoSmall}>
41
45
  <HeaderRight>
42
- <HeaderRightItem menuDropdown={<MegaMenu pillar={'live'}/>}>
46
+ <HeaderRightItem extraClass={'desktop-item'} menuDropdown={<MegaMenu pillar={'live'}/>}>
43
47
  Participate
44
48
  </HeaderRightItem>
45
- <HeaderRightItem>
49
+ <HeaderRightItem extraClass={'desktop-item'}>
46
50
  Business
47
51
  </HeaderRightItem>
48
- <HeaderRightItem>
52
+ <HeaderRightItem extraClass={'desktop-item'}>
49
53
  Live
50
54
  </HeaderRightItem>
51
- <HeaderRightItem>
55
+ <HeaderRightItem extraClass={'desktop-item'}>
52
56
  Visit
53
57
  </HeaderRightItem>
54
- <HeaderRightItem>
58
+ <HeaderRightItem extraClass={'desktop-item'}>
55
59
  Taste
56
60
  </HeaderRightItem>
57
- <HeaderRightItem>
61
+ <HeaderRightItem extraClass={'desktop-item'}>
58
62
  <MagnifyingGlass/>
59
63
  </HeaderRightItem>
64
+ <HeaderRightItem extraClass={'mobile-item'}>
65
+ <List/>
66
+ </HeaderRightItem>
60
67
  </HeaderRight>
68
+ <MobileNavigation>
69
+ <li>
70
+ <MobileNavigationItem label={'Attractions'}/>
71
+ </li>
72
+ <li>
73
+ <MobileNavigationItem label={'Eateries'}/>
74
+ </li>
75
+ <li>
76
+ <MobileNavigationItem label={'Accommodation'}/>
77
+ </li>
78
+ <li>
79
+ <MobileNavigationItem label={'Why visit Selwyn'}/>
80
+ </li>
81
+ <li>
82
+ <MobileNavigationItem label={'Events'}/>
83
+ </li>
84
+ <li>
85
+ <MobileNavigationItem label={'Venues'}/>
86
+ </li>
87
+ </MobileNavigation>
61
88
  </Header>
62
89
  },
63
90
  };
@@ -3,8 +3,8 @@ import HeaderRightItemProps from "./HeaderRightItemProps.tsx";
3
3
 
4
4
  const HeaderRightItem = (props : HeaderRightItemProps) =>{
5
5
  const { href , target, children, extraClass, icon, menuDropdown, active } = props
6
- return <div className={`${styles.headerBottomItemHolder} ${active && styles.active}`}>
7
- <a href={href} target={target} className={`${styles.headerBottomItem} ${extraClass}`}>
6
+ return <div className={`${styles.headerBottomItemHolder} ${extraClass} ${active && styles.active}`}>
7
+ <a href={href} target={target} className={`${styles.headerBottomItem} headerBottomItem`}>
8
8
  {icon && <div className={styles.icon}>
9
9
  {icon}
10
10
  </div>}
@@ -0,0 +1,25 @@
1
+ import MobileNavigationProps from "./MobileNavigationProps.tsx";
2
+ import styles from './mobileNavigation.module.scss'
3
+ import {Container} from "../../../Shared";
4
+ import MobileWhatuOverlay from "./MobileWhatuOverlay.tsx";
5
+
6
+ const MobileNavigation = (props : MobileNavigationProps) => {
7
+
8
+ const {
9
+ children,
10
+ extraClass
11
+ } = props
12
+
13
+ return <div className={`${styles.mobileNavigation} ${extraClass} mobileNavigation`}>
14
+ <Container>
15
+ <ul className={`${styles.mobileNavigationWrapper} mobileNavigationWrapper`}>
16
+ {children}
17
+ </ul>
18
+ </Container>
19
+ <div className={styles.svg}>
20
+ <MobileWhatuOverlay/>
21
+ </div>
22
+ </div>
23
+ }
24
+
25
+ export default MobileNavigation;
@@ -0,0 +1,17 @@
1
+ import styles from './mobileNavigation.module.scss'
2
+ import MobileNavigationItemProps from "./MobileNavigationItemProps.tsx";
3
+ import ArrowRight from "../../../Icons/Arrows/ArrowRight/ArrowRight.tsx";
4
+
5
+ const MobileNavigationItem = (props : MobileNavigationItemProps) => {
6
+
7
+ const {label} = props
8
+
9
+ return <div className={styles.mobileNavItem}>
10
+ <div className={styles.mobileNavItemWrapper}>
11
+ <h6>{label}</h6>
12
+ <ArrowRight type={'light'}/>
13
+ </div>
14
+ </div>
15
+ }
16
+
17
+ export default MobileNavigationItem;
@@ -0,0 +1,5 @@
1
+ interface MobileNavigationItemProps {
2
+ label?: string;
3
+ }
4
+
5
+ export default MobileNavigationItemProps;
@@ -0,0 +1,8 @@
1
+ import {ReactNode} from "react";
2
+
3
+ interface MobileNavigationProps {
4
+ children?:ReactNode;
5
+ extraClass?:string;
6
+ }
7
+
8
+ export default MobileNavigationProps
@@ -0,0 +1,21 @@
1
+ import MobileSubNavigationProps from "./MobileSubNavigationProps.tsx";
2
+ import styles from '../mobileNavigation.module.scss'
3
+ import {Container} from "../../../Shared";
4
+
5
+ const MobileSubNavigation = (props : MobileSubNavigationProps) => {
6
+
7
+ const {
8
+ children,
9
+ extraClass
10
+ } = props
11
+
12
+ return <div className={`${styles.MobileSubNavigation} ${extraClass} MobileSubNavigation`}>
13
+ <Container>
14
+ <ul className={`${styles.MobileSubNavigationWrapper} MobileSubNavigationWrapper`}>
15
+ {children}
16
+ </ul>
17
+ </Container>
18
+ </div>
19
+ }
20
+
21
+ export default MobileSubNavigation;
@@ -0,0 +1,17 @@
1
+ import styles from '././mobileNavigation.module.scss'
2
+ import MobileNavigationItemProps from "./MobileNavigationItemProps.tsx";
3
+ import ArrowRight from "../../../Icons/Arrows/ArrowRight/ArrowRight.tsx";
4
+
5
+ const MobileNavigationItem = (props : MobileNavigationItemProps) => {
6
+
7
+ const {label} = props
8
+
9
+ return <div className={styles.mobileNavItem}>
10
+ <div className={styles.mobileNavItemWrapper}>
11
+ <h6>{label}</h6>
12
+ <ArrowRight type={'light'}/>
13
+ </div>
14
+ </div>
15
+ }
16
+
17
+ export default MobileNavigationItem;
@@ -0,0 +1,5 @@
1
+ interface MobileNavigationItemProps {
2
+ label?: string;
3
+ }
4
+
5
+ export default MobileNavigationItemProps;
@@ -0,0 +1,9 @@
1
+ import {ReactNode} from "react";
2
+
3
+ interface MobileSubNavigationProps {
4
+ children?:ReactNode;
5
+ extraClass?:string;
6
+ pillar?: 'visit' | 'live' | 'business' | 'participate' | 'taste'
7
+ }
8
+
9
+ export default MobileSubNavigationProps;
@@ -0,0 +1,18 @@
1
+ const MobileWhatuOverlay = () =>{
2
+ return <svg xmlns="http://www.w3.org/2000/svg" width="741" height="340" viewBox="0 0 741 340" fill="none">
3
+ <g opacity="0.1">
4
+ <path opacity="0.5" d="M0 113.209C68.1991 113.209 123.5 163.901 123.5 226.417H0V113.209Z" fill="currentColor"/>
5
+ <path opacity="0.25" d="M247 113.209C178.801 113.209 123.5 163.901 123.5 226.417H247V113.209Z" fill="currentColor"/>
6
+ <path opacity="0.5" d="M741 226.417C672.801 226.417 617.5 175.725 617.5 113.209H741V226.417Z" fill="currentColor"/>
7
+ <path opacity="0.75" d="M123.5 226.416C191.699 226.416 247 277.109 247 339.624H123.5V226.416Z" fill="currentColor"/>
8
+ <path opacity="0.5" d="M247 339.624C315.199 339.624 370.5 288.932 370.5 226.416H247V339.624Z" fill="currentColor"/>
9
+ <path opacity="0.25" d="M494 339.625C425.801 339.625 370.5 288.932 370.5 226.417H494V339.625Z" fill="currentColor"/>
10
+ <path opacity="0.75" d="M617.5 226.417C549.301 226.417 494 277.109 494 339.625H617.5V226.417Z" fill="currentColor"/>
11
+ <path opacity="0.25" d="M494 0.000656128C562.199 0.000656128 617.5 50.6932 617.5 113.209H494V0.000656128Z" fill="currentColor"/>
12
+ <path opacity="0.5" d="M370.5 226.417C438.699 226.417 494 175.725 494 113.209H370.5V226.417Z" fill="currentColor"/>
13
+ <path opacity="0.75" d="M247 113.208C315.199 113.208 370.5 62.5158 370.5 0H247V113.208Z" fill="currentColor"/>
14
+ </g>
15
+ </svg>
16
+ }
17
+
18
+ export default MobileWhatuOverlay
@@ -0,0 +1,62 @@
1
+ .mobileNavigation{
2
+ position: absolute;
3
+ top: 61px;
4
+ right: 0;
5
+ left: 0;
6
+ height: calc(100vh - 59px);
7
+ background: var(--header-bg);
8
+ border-radius: 0 0 200px 0;
9
+ overflow-x: hidden;
10
+
11
+ .mobileNavigationWrapper{
12
+ padding-top: 48px;
13
+ list-style: none;
14
+ }
15
+
16
+ .mobileNavItemWrapper{
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ cursor: pointer;
21
+ color: var(--header-color);
22
+ transition: all 0.3s ease-in-out;
23
+
24
+ svg {
25
+ margin-left: 16px;
26
+ transition: transform 0.3s ease-in-out;
27
+ }
28
+
29
+ &:hover {
30
+ svg {
31
+ animation: wiggle 0.6s ease-in-out infinite;
32
+ }
33
+ }
34
+
35
+ h6{
36
+ font-size: var(--font-size-h6);
37
+ line-height: var(--line-height-h6);
38
+ font-weight: var(--font-weight-h6);
39
+ }
40
+
41
+ }
42
+
43
+ }
44
+
45
+ .svg{
46
+ position: absolute;
47
+ left: 0;
48
+ bottom: 0;
49
+ right: 0;
50
+ color: var(--header-color);
51
+
52
+ svg{
53
+ width: 100%;
54
+ }
55
+
56
+ }
57
+
58
+ @keyframes wiggle {
59
+ 0%, 100% { transform: translateX(0); }
60
+ 25% { transform: translateX(-4px); }
61
+ 75% { transform: translateX(4px); }
62
+ }
@@ -1,11 +1,13 @@
1
1
  .header{
2
2
  background: var(--header-bg);
3
+ backdrop-filter: blur(10px);
4
+ border-bottom: 1px solid var(--color-taste);
3
5
 
4
6
  .headerWrapper{
5
7
  display: flex;
6
8
  align-items: flex-end;
7
9
  justify-content: space-between;
8
- min-height: 96px;
10
+ min-height: 60px;
9
11
  }
10
12
 
11
13
  .headerLogo{
@@ -32,7 +34,7 @@
32
34
  }
33
35
 
34
36
  .headerBottomItemHolder{
35
- padding: 0 12px 30px 12px;
37
+ padding: 0 12px 12px 12px;
36
38
  transition: all 0.3s ease-in;
37
39
 
38
40
  a{
@@ -90,6 +92,7 @@
90
92
 
91
93
 
92
94
  @media screen and (min-width: 1648px) {
95
+
93
96
  .headerRightWrapper{
94
97
  display: flex;
95
98
  align-items: center;
@@ -103,6 +106,11 @@
103
106
 
104
107
 
105
108
  @media screen and (min-width: 992px) {
109
+
110
+ .headerWrapper{
111
+ min-height: 96px;
112
+ }
113
+
106
114
  .logo {
107
115
  display: block;
108
116
  }
@@ -110,6 +118,12 @@
110
118
  .logoSmall {
111
119
  display: none;
112
120
  }
121
+
122
+
123
+ .headerBottomItemHolder {
124
+ padding-bottom:30px ;
125
+ }
126
+
113
127
  }
114
128
 
115
129
  }
@@ -0,0 +1,15 @@
1
+ .desktop-item{
2
+ display: none !important;
3
+
4
+ @media screen and (min-width: 992px) {
5
+ display: flex !important;
6
+ }
7
+ }
8
+
9
+ .mobileNavigation{
10
+ .mobileNavigationWrapper{
11
+ li{
12
+ padding: 16px;
13
+ }
14
+ }
15
+ }
@@ -24,6 +24,11 @@ const HeroBanner = (props : HeroBannerProps) => {
24
24
  </div>
25
25
  <div className={styles.heroImg}>
26
26
  <img src={backgroundImg} alt="hero banner" />
27
+ <div className={styles.clipPath}>
28
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 911 725" fill="none">
29
+ <path d="M911 0C470.407 -4.11029e-07 102.958 311.255 18.3389 725H0V0H911Z" fill="currentColor"/>
30
+ </svg>
31
+ </div>
27
32
  </div>
28
33
  </div>
29
34
  </Container>
@@ -46,6 +51,11 @@ const HeroBanner = (props : HeroBannerProps) => {
46
51
  </div>
47
52
  <div className={styles.heroImg}>
48
53
  <img src={backgroundImg} alt="hero banner" />
54
+ <div className={styles.clipPath}>
55
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 911 600" fill="none">
56
+ <path d="M911 0C516.03 -3.68467e-07 179.841 250.132 53.4912 600H0V0H911Z" fill="currentColor"/>
57
+ </svg>
58
+ </div>
49
59
  </div>
50
60
  </div>
51
61
  </Container>
@@ -4,7 +4,7 @@ interface HeroBannerProps {
4
4
  boldTitle?:string
5
5
  description?:string
6
6
  backgroundImg?:string
7
- pillar?: 'visit' | 'live' | 'business' | 'participate'
7
+ pillar?: 'visit' | 'live' | 'business' | 'participate' | 'taste'
8
8
  }
9
9
 
10
10
  export default HeroBannerProps;
@@ -59,6 +59,7 @@
59
59
 
60
60
  &Medium{
61
61
  position: relative;
62
+ overflow-x: hidden;
62
63
 
63
64
  .heroWrapper{
64
65
  display: flex;
@@ -70,7 +71,7 @@
70
71
  flex-direction: column;
71
72
  justify-content: center;
72
73
  width: 100%;
73
- padding: 72px 0 32px 0;
74
+ padding: 20px 0 20px 0;
74
75
  color: var(--color-text);
75
76
 
76
77
  h1{
@@ -95,23 +96,41 @@
95
96
 
96
97
  }
97
98
 
98
- .heroImg{
99
- border-radius: 500px 0 0 0;
99
+ .heroImg {
100
100
  overflow: hidden;
101
- width: calc(100% + 28px);
102
- margin-left: -14px;
103
- margin-right: -14px;
101
+ width: calc(100% + 32px);
102
+ margin-left: -16px;
103
+ margin-right: -16px;
104
+ position: relative;
104
105
 
105
- img{
106
+ img {
106
107
  height: 100%;
107
108
  width: 100%;
108
109
  object-fit: cover;
109
110
  object-position: center;
110
111
  min-height: 360px;
112
+ display: block;
113
+ }
114
+
115
+ .clipPath {
116
+ position: absolute;
117
+ top: 0;
118
+ left: 0;
119
+ bottom: 0;
120
+ //width: 100%;
121
+ height: 100%;
122
+ color: var(--color-block-bg);
123
+ pointer-events: none;
124
+
125
+ svg{
126
+ height: 100%;
127
+ }
128
+
111
129
  }
112
130
  }
113
131
 
114
132
 
133
+
115
134
  }
116
135
  }
117
136
 
@@ -120,7 +139,7 @@
120
139
 
121
140
  .heroWrapper{
122
141
  display: flex;
123
- min-height: 50vh;
142
+ min-height: 600px;
124
143
  flex-wrap: wrap;
125
144
 
126
145
  .content{
@@ -154,11 +173,11 @@
154
173
  }
155
174
 
156
175
  .heroImg{
157
- border-radius: 500px 0 0 0;
158
176
  overflow: hidden;
159
- width: calc(100% + 28px);
160
- margin-left: -14px;
161
- margin-right: -14px;
177
+ width: calc(100% + 32px);
178
+ margin-left: -16px;
179
+ margin-right: -16px;
180
+ position: relative;
162
181
 
163
182
  img{
164
183
  width: 100%;
@@ -167,6 +186,22 @@
167
186
  object-position: center;
168
187
  }
169
188
 
189
+ .clipPath {
190
+ position: absolute;
191
+ top: 0;
192
+ left: 0;
193
+ bottom: 0;
194
+ width: 100%;
195
+ //height: 100%;
196
+ color: var(--color-block-bg);
197
+ pointer-events: none;
198
+
199
+ svg{
200
+ height: 100%;
201
+ }
202
+
203
+ }
204
+
170
205
 
171
206
  }
172
207
 
@@ -180,7 +215,7 @@
180
215
 
181
216
  .content {
182
217
  width: 50%;
183
- padding: 120px 0;
218
+ padding: 60px 0;
184
219
 
185
220
  p{
186
221
  margin-top: 90px;
@@ -27,6 +27,5 @@ export { default as HeroBanner } from './HeroBanner/HeroBanner';
27
27
  export type { default as HeroBannerProps } from './HeroBanner/HeroBannerProps';
28
28
 
29
29
  // Megamenu
30
-
31
30
  export { default as MegaMenu} from './Header/MegaMenu/MegaMenu.tsx'
32
31
  export type { default as MegaMenuProps } from './Header/MegaMenu/MegaMenuProps.tsx'
@@ -1,13 +1,13 @@
1
1
  .container {
2
- padding: 0px 14px 0 14px;
2
+ padding: 0px 16px 0 16px;
3
3
  margin: 0px auto;
4
4
 
5
5
  &.default{
6
- max-width: 1428px;
6
+ max-width: 1432px;
7
7
  }
8
8
 
9
9
  @media screen and (min-width: 1748px) {
10
- padding: 0px 14px 0 14px;
10
+ padding: 0px 16px 0 16px;
11
11
  }
12
12
 
13
13
  }
@@ -0,0 +1,5 @@
1
+ export * from './DataDisplay'
2
+ export * from './Form'
3
+ export * from './Icons'
4
+ export * from './Layout'
5
+ export * from './Shared'