@rileybathurst/paddle 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -2
- package/src/App.tsx +0 -1
- package/src/PaddleComposition.tsx +54 -0
- package/src/PaddleTime.tsx +73 -0
- package/src/index.tsx +3 -1
- package/src/stories/BookNow.stories.tsx +19 -0
- package/src/stories/BookNow.tsx +29 -0
- package/src/stories/BrandList.stories.tsx +19 -0
- package/src/stories/BrandList.tsx +19 -0
- package/src/stories/Button.stories.tsx +1 -0
- package/src/stories/Card.stories.tsx +19 -0
- package/src/stories/Card.tsx +43 -0
- package/src/stories/Colors.stories.tsx +1 -0
- package/src/stories/Colors.tsx +24 -2
- package/src/stories/Composition.stories.tsx +19 -0
- package/src/stories/Composition.tsx +21 -0
- package/src/stories/Deal.tsx +31 -0
- package/src/stories/Deck.stories.tsx +19 -0
- package/src/stories/Deck.tsx +22 -0
- package/src/stories/Eyebrow.stories.tsx +19 -0
- package/src/stories/Eyebrow.tsx +21 -0
- package/src/stories/Footer.stories.tsx +19 -0
- package/src/stories/Footer.tsx +112 -0
- package/src/stories/Header.stories.ts +7 -7
- package/src/stories/Header.tsx +23 -54
- package/src/stories/Language.stories.tsx +19 -0
- package/src/stories/Language.tsx +22 -0
- package/src/stories/Links.stories.tsx +19 -0
- package/src/stories/Links.tsx +25 -0
- package/src/stories/Location.stories.tsx +19 -0
- package/src/stories/Location.tsx +54 -0
- package/src/stories/LocationDeck.stories.tsx +19 -0
- package/src/stories/LocationDeck.tsx +42 -0
- package/src/stories/Logo.stories.tsx +19 -0
- package/src/stories/Logo.tsx +60 -0
- package/src/stories/Page.stories.ts +6 -15
- package/src/stories/Page.tsx +114 -63
- package/src/stories/Pricing.stories.tsx +19 -0
- package/src/stories/Pricing.tsx +74 -0
- package/src/stories/Ticket.stories.tsx +19 -0
- package/src/stories/Ticket.tsx +55 -0
- package/src/stories/TopBar.stories.tsx +19 -0
- package/src/stories/TopBar.tsx +19 -0
- package/src/stories/Typography.stories.tsx +19 -0
- package/src/stories/Typography.tsx +39 -0
- package/src/stories/Widths.stories.tsx +19 -0
- package/src/stories/Widths.tsx +67 -0
- package/src/styles/a11y.css +10 -0
- package/src/styles/app.css +6 -0
- package/src/styles/color.css +18 -0
- package/src/styles/layout.css +99 -0
- package/src/styles/links.css +33 -0
- package/src/styles/media.css +53 -0
- package/src/styles/typography.css +238 -0
- package/src/App.css +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rileybathurst/paddle",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.15",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite",
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
"build-storybook": "storybook build"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"color-cards": "^1.0.
|
|
15
|
+
"color-cards": "^1.0.14",
|
|
16
16
|
"react": "^18.2.0",
|
|
17
|
+
"react-aria-components": "^1.2.1",
|
|
17
18
|
"react-dom": "^18.2.0"
|
|
18
19
|
},
|
|
19
20
|
"devDependencies": {
|
|
20
21
|
"@chromatic-com/storybook": "^1.3.4",
|
|
22
|
+
"@faker-js/faker": "^8.4.1",
|
|
21
23
|
"@storybook/addon-essentials": "^8.0.10",
|
|
22
24
|
"@storybook/addon-interactions": "^8.0.10",
|
|
23
25
|
"@storybook/addon-links": "^8.0.10",
|
package/src/App.tsx
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { faker } from '@faker-js/faker';
|
|
3
|
+
// import { GatsbyImage } from "gatsby-plugin-image"
|
|
4
|
+
|
|
5
|
+
// import WaterTexture from "../images/watertexture";
|
|
6
|
+
// import Kayaker from "../images/kayaker";
|
|
7
|
+
// import Supper from "../images/supper";
|
|
8
|
+
// import { useStrapiTextures } from "../hooks/use-strapi-textures"
|
|
9
|
+
|
|
10
|
+
/* // TODO: rename
|
|
11
|
+
interface TopThreeTypes {
|
|
12
|
+
className: string;
|
|
13
|
+
}
|
|
14
|
+
function TopThree({ className }: TopThreeTypes) {
|
|
15
|
+
|
|
16
|
+
// const { query } = useStrapiTextures()
|
|
17
|
+
// console.log(query.baseone);
|
|
18
|
+
|
|
19
|
+
return <GatsbyImage
|
|
20
|
+
image={useStrapiTextures().topthree.image.localFile.childImageSharp.gatsbyImageData}
|
|
21
|
+
alt="deepwater texture"
|
|
22
|
+
className={`texture-slice crops ${props.className}`}
|
|
23
|
+
objectFit="contain"
|
|
24
|
+
/>
|
|
25
|
+
|
|
26
|
+
// ! Testing
|
|
27
|
+
return null;
|
|
28
|
+
} */
|
|
29
|
+
|
|
30
|
+
interface CompositionTypes {
|
|
31
|
+
sport?: string;
|
|
32
|
+
}
|
|
33
|
+
const PaddleComposition = ({ sport }: CompositionTypes) => {
|
|
34
|
+
return (
|
|
35
|
+
<div className="composition">
|
|
36
|
+
{/* <WaterTexture className="texture-1" /> */}
|
|
37
|
+
<img
|
|
38
|
+
src={faker.image.urlPlaceholder()}
|
|
39
|
+
alt={faker.location.city()}
|
|
40
|
+
className="texture-1"
|
|
41
|
+
/>
|
|
42
|
+
<img
|
|
43
|
+
src={faker.image.urlPlaceholder()}
|
|
44
|
+
alt={faker.location.city()}
|
|
45
|
+
className="texture-2 img-wrapped"
|
|
46
|
+
/>
|
|
47
|
+
{/* <TopThree className="texture-2 img__wrapped" /> */}
|
|
48
|
+
{/* {sport === 'paddleboard' ? <Supper className="paddler" /> : <Kayaker className="paddler" />} */}
|
|
49
|
+
{faker.datatype.boolean() ? <>Supper</> : <>Kayaker</>}
|
|
50
|
+
</div >
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export default PaddleComposition
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// import * as React from "react"
|
|
2
|
+
|
|
3
|
+
interface TimeTypes {
|
|
4
|
+
start?: string | null;
|
|
5
|
+
finish?: string | null;
|
|
6
|
+
duration?: number | null;
|
|
7
|
+
timeframe?: string | null;
|
|
8
|
+
}
|
|
9
|
+
export const PaddleTime = ({ start, finish, duration, timeframe }: TimeTypes) => {
|
|
10
|
+
|
|
11
|
+
// TODO: sunset is a whole thing
|
|
12
|
+
|
|
13
|
+
const hairSpace = String.fromCharCode(0x200A);
|
|
14
|
+
|
|
15
|
+
if (timeframe) {
|
|
16
|
+
return {
|
|
17
|
+
key: timeframe,
|
|
18
|
+
unit: 'timeframe'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (start && finish) {
|
|
23
|
+
|
|
24
|
+
const startHours = start.split(':')[0];
|
|
25
|
+
let startHoursInt: number = Number.parseInt(startHours);
|
|
26
|
+
const startMins = start.split(':')[1];
|
|
27
|
+
const startMinsInt: number = Number.parseInt(startMins);
|
|
28
|
+
const startAmpm = startHoursInt >= 12 ? 'pm' : 'am';
|
|
29
|
+
|
|
30
|
+
if (startHoursInt > 12) {
|
|
31
|
+
startHoursInt = startHoursInt - 12;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const finishHours = finish.split(':')[0];
|
|
35
|
+
let finishHoursInt: number = Number.parseInt(finishHours);
|
|
36
|
+
const finishMins = finish.split(':')[1];
|
|
37
|
+
const finishMinsInt: number = Number.parseInt(finishMins);
|
|
38
|
+
const finishAmpm = finishHoursInt >= 12 ? 'pm' : 'am';
|
|
39
|
+
|
|
40
|
+
if (finishHoursInt > 12) {
|
|
41
|
+
finishHoursInt = finishHoursInt - 12;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
key: `${startHoursInt}${startMinsInt > 0 ? `:${startMinsInt}:${hairSpace}` : ''}${hairSpace}${startAmpm}
|
|
46
|
+
-
|
|
47
|
+
${finishHoursInt}${finishMinsInt > 0 ? `:${finishMinsInt}${hairSpace}` : ''}${hairSpace}${finishAmpm}`,
|
|
48
|
+
unit: "time"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (duration) {
|
|
53
|
+
if (duration > 90) {
|
|
54
|
+
const hours = Math.floor(duration / 60);
|
|
55
|
+
const mins = duration % 60;
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
key: `${hours}${hairSpace}hrs ${mins > 0 ? `${mins}${hairSpace}mins` : ''}`,
|
|
59
|
+
unit: "duration"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
key: `${duration}${hairSpace}mins`,
|
|
65
|
+
unit: "duration"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
key: null,
|
|
71
|
+
unit: null
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/index.tsx
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { BookNow } from './BookNow';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: BookNow,
|
|
8
|
+
title: 'Atoms/BookNow',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof BookNow>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { faker } from '@faker-js/faker';
|
|
4
|
+
|
|
5
|
+
interface BookNowProps {
|
|
6
|
+
primary?: boolean;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const BookNow = ({
|
|
11
|
+
primary = false,
|
|
12
|
+
...props
|
|
13
|
+
}: BookNowProps) => {
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<main
|
|
17
|
+
{...props}
|
|
18
|
+
>
|
|
19
|
+
<a
|
|
20
|
+
href={faker.location.city()}
|
|
21
|
+
rel="noopener noreferrer"
|
|
22
|
+
className="book-now"
|
|
23
|
+
title={`Book now with ${faker.location.city()} kayak and paddleboard`}
|
|
24
|
+
>
|
|
25
|
+
BOOK NOW
|
|
26
|
+
</a>
|
|
27
|
+
</main>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { BrandList } from './BrandList';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: BrandList,
|
|
8
|
+
title: 'Molecules/BrandList',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof BrandList>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Link } from 'react-aria-components';
|
|
4
|
+
import { faker } from '@faker-js/faker';
|
|
5
|
+
|
|
6
|
+
export const BrandList = () => {
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
// <ul className='brand_list'>
|
|
10
|
+
<li key='kayak test brand'>
|
|
11
|
+
{/* // ? why test */}
|
|
12
|
+
<Link href={faker.location.city()}>
|
|
13
|
+
<svg viewBox="0 0 201.9 202.6" xmlns="http://www.w3.org/2000/svg"><title>boardworks </title><path d="m201.9 96.5c-67.3 0-134 0-200.6 0 4.6-5.2 7.5-11.6 16.6-11.5 23.7.3 47.3-1.6 70.3-8 8.6-2.4 16.8-6.2 24.7-10.4 5.6-3 10.4-7.8 9.7-15.1-.7-7.4-6.2-11.2-12.4-13.7-16.7-6.6-33-4.3-48.9 2.8-3.1 1.4-6.1 3.1-9.1 4.6-.3-.4-.6-.8-1-1.1 3.5-3.2 7.1-6.3 10.4-9.6 9.7-9.6 19.3-19.3 29-29 7.2-7.1 13.7-7.4 20.8-.3 29.9 29.7 59.6 59.6 89.4 89.5.4.3.5.7 1.1 1.8z" /><path d="m0 106.4h17.2c12.5 0 25 .2 37.5-.1 7.3-.2 13.3 2.4 17.3 8.1 4.1 5.9 7.5 12.5 10.7 19 3.9 8.1 6.9 16.6 11.1 24.5 6.6 12.6 15.4 23.4 29.3 28.5-4.1 4.3-7.9 8.7-12.2 12.5-5.1 4.5-11.2 4.9-17.1 1.1-3.4-2.2-6.5-5.1-9.5-8.1-26.9-27-53.8-54.1-80.7-81.1-1-1.2-2-2.5-3.6-4.4z" /><path d="m81.8 106.5h49.2c-6.6 10.2-8.8 20.8-4.1 31.9 4.8 11.3 13.8 17.1 27 18.2-7 6.9-13.4 13.4-19.9 19.6-.8.8-3 1.1-4.1.6-5.4-2.8-11.8-4.8-15.5-9.1-6.3-7.4-11.4-15.9-15.8-24.6-6.2-11.9-11.2-24.3-16.8-36.6z" /><path d="m202.5 106.4c-1.6 1.9-2.4 3-3.4 4.1-8.4 8.5-16.5 17.4-25.5 25.4-4.3 3.8-9.9 6.7-15.4 8.7-6.8 2.5-13.3.3-18.1-5.2-4.7-5.3-6.2-11.7-4.1-18.6 2.8-9 10.1-14.3 19.4-14.3 15.3-.1 30.6-.1 47.1-.1z" /></svg>
|
|
14
|
+
{faker.location.city()}
|
|
15
|
+
</Link>
|
|
16
|
+
</li>
|
|
17
|
+
// </ul>
|
|
18
|
+
);
|
|
19
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { Card } from './Card';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: Card,
|
|
8
|
+
title: 'Molecules/Card',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof Card>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// TODO: faker with an internet connection
|
|
2
|
+
// this is the Name.tsx file
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Link } from 'react-aria-components';
|
|
5
|
+
import { faker } from '@faker-js/faker';
|
|
6
|
+
import { BookNow } from './BookNow';
|
|
7
|
+
|
|
8
|
+
export const Card = () => {
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<div className='deck'>
|
|
12
|
+
<Link href="#" className="card">
|
|
13
|
+
{/* <img
|
|
14
|
+
src='https://tahoe-city-kayak.s3.us-west-1.amazonaws.com/textures/jason-leung-Oc81QL8Crtg-unsplash-hd.webp'
|
|
15
|
+
alt=""
|
|
16
|
+
className='card__placeholder'
|
|
17
|
+
/> */}
|
|
18
|
+
<h4 className="card__title">
|
|
19
|
+
{faker.location.city()}
|
|
20
|
+
</h4>
|
|
21
|
+
|
|
22
|
+
<div className="card__specs">
|
|
23
|
+
<h4>
|
|
24
|
+
{/* <time>
|
|
25
|
+
18:30 - 20:30
|
|
26
|
+
</time> */}
|
|
27
|
+
</h4>
|
|
28
|
+
<h4>
|
|
29
|
+
{/* // ? does this need capitalization */}
|
|
30
|
+
{faker.helpers.arrayElement(['easy', 'medium', 'hard'])} <span className="card__span">Fitness</span>
|
|
31
|
+
</h4>
|
|
32
|
+
</div>
|
|
33
|
+
<hr />
|
|
34
|
+
<p>{faker.lorem.lines(2)}</p>
|
|
35
|
+
<hr />
|
|
36
|
+
<div className="card__details">
|
|
37
|
+
<h5>${faker.number.int(100)}</h5>
|
|
38
|
+
<BookNow />
|
|
39
|
+
</div>
|
|
40
|
+
</Link>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
};
|
package/src/stories/Colors.tsx
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
// this is the Name.tsx file
|
|
2
2
|
import React from 'react';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
function ColorCards({ color, variables }) {
|
|
5
|
+
return (
|
|
6
|
+
<div>
|
|
7
|
+
<h2>{color}</h2>
|
|
8
|
+
{variables.map((variable) => (
|
|
9
|
+
<div
|
|
10
|
+
key={variable}
|
|
11
|
+
style={{
|
|
12
|
+
backgroundColor: `var(--${color}-${variable})`,
|
|
13
|
+
padding: '1rem',
|
|
14
|
+
margin: '1rem',
|
|
15
|
+
borderRadius: '0.5rem',
|
|
16
|
+
color: 'white',
|
|
17
|
+
textAlign: 'center',
|
|
18
|
+
}}
|
|
19
|
+
>
|
|
20
|
+
{`--${color}-${variable}`}
|
|
21
|
+
</div>
|
|
22
|
+
))}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
4
26
|
|
|
5
27
|
interface ColorsProps {
|
|
6
28
|
primary?: boolean;
|
|
@@ -18,7 +40,7 @@ export const Colors = ({
|
|
|
18
40
|
>
|
|
19
41
|
{primary ? 'primary' : 'secondary'}
|
|
20
42
|
<ColorCards
|
|
21
|
-
color="
|
|
43
|
+
color="navy"
|
|
22
44
|
variables={[100, 200]}
|
|
23
45
|
/>
|
|
24
46
|
</main>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { Composition } from './Composition';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: Composition,
|
|
8
|
+
title: 'Molecules/Composition',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof Composition>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
interface CompositionProps {
|
|
5
|
+
primary?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const Composition = ({
|
|
10
|
+
primary = false,
|
|
11
|
+
...props
|
|
12
|
+
}: CompositionProps) => {
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<div className="composition">
|
|
16
|
+
{/* <WaterTexture className="texture-1" /> */}
|
|
17
|
+
{/* <TopThree className="texture-2 img__wrapped" /> */}
|
|
18
|
+
{/* {sport === 'paddleboard' ? <Supper className="paddler" /> : <Kayaker className="paddler" />} */}
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// havent figured out how to get this in yet
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { faker } from '@faker-js/faker';
|
|
5
|
+
|
|
6
|
+
export const Deal = () => {
|
|
7
|
+
const roll = faker.number.int(10);
|
|
8
|
+
if (roll < 1) {
|
|
9
|
+
return (
|
|
10
|
+
<h1>There are no cards available</h1>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// <Ticket key={i} />
|
|
15
|
+
const content = [];
|
|
16
|
+
for (let i = 0; i < roll; i++) {
|
|
17
|
+
content.push(
|
|
18
|
+
{ i }
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
console.log(content);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<>
|
|
26
|
+
{content.map((piece) => (
|
|
27
|
+
piece.i
|
|
28
|
+
))}
|
|
29
|
+
</>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { Deck } from './Deck';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: Deck,
|
|
8
|
+
title: 'Organisms/Deck',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof Deck>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Ticket } from './Ticket';
|
|
4
|
+
|
|
5
|
+
interface DeckProps {
|
|
6
|
+
primary?: boolean;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const Deck = ({
|
|
11
|
+
primary = false,
|
|
12
|
+
...props
|
|
13
|
+
}: DeckProps) => {
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className='deck'>
|
|
17
|
+
{/* // TODO: deal */}
|
|
18
|
+
<Ticket />
|
|
19
|
+
<Ticket />
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { Eyebrow } from './Eyebrow';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: Eyebrow,
|
|
8
|
+
title: 'Atoms/Eyebrow',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof Eyebrow>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
interface EyebrowProps {
|
|
5
|
+
primary?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const Eyebrow = ({
|
|
10
|
+
primary = false,
|
|
11
|
+
...props
|
|
12
|
+
}: EyebrowProps) => {
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<hgroup className='eyebrow crest'>
|
|
16
|
+
{/* // TODO: fix the metaphor */}
|
|
17
|
+
<p className='eyebrow brow'>Eyebrow</p>
|
|
18
|
+
<h3 className='supra'>Supra</h3>
|
|
19
|
+
</hgroup>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// this is the Name.stories.tsx file
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { fn } from '@storybook/test';
|
|
4
|
+
import { Footer } from './Footer';
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
component: Footer,
|
|
8
|
+
title: 'Organisms/Footer',
|
|
9
|
+
args: { onClick: fn() },
|
|
10
|
+
} satisfies Meta<typeof Footer>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Primary: Story = {
|
|
16
|
+
args: {
|
|
17
|
+
primary: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// this is the Name.tsx file
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Link } from 'react-aria-components';
|
|
4
|
+
import { faker } from '@faker-js/faker';
|
|
5
|
+
|
|
6
|
+
import { Pricing } from './Pricing';
|
|
7
|
+
import { LocationDeck } from './LocationDeck';
|
|
8
|
+
|
|
9
|
+
function Deal() {
|
|
10
|
+
|
|
11
|
+
const roll = faker.number.int(10);
|
|
12
|
+
|
|
13
|
+
if (roll < 1) {
|
|
14
|
+
return (
|
|
15
|
+
<h1>double zero</h1>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const content = [];
|
|
20
|
+
for (let i = 0; i < roll; i++) {
|
|
21
|
+
content.push(
|
|
22
|
+
<li key={faker.location.city()}>
|
|
23
|
+
<a href={faker.location.city()}
|
|
24
|
+
target="_blank"
|
|
25
|
+
rel='noopener noreferrer'
|
|
26
|
+
>
|
|
27
|
+
{faker.location.city()} Kayak & Paddleboard
|
|
28
|
+
</a>
|
|
29
|
+
</li>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface FooterProps {
|
|
37
|
+
primary?: boolean;
|
|
38
|
+
onClick?: () => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const Footer = ({
|
|
42
|
+
primary = false,
|
|
43
|
+
...props
|
|
44
|
+
}: FooterProps) => {
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<footer>
|
|
48
|
+
<section>
|
|
49
|
+
<h3 className='sr-only'>
|
|
50
|
+
<Link href="/">{faker.company.name()}</Link>
|
|
51
|
+
</h3>
|
|
52
|
+
<Link href="/" className="logo-link">
|
|
53
|
+
{/* // TODO: */}
|
|
54
|
+
{/* <Logo /> */}
|
|
55
|
+
</Link>
|
|
56
|
+
<p>© {new Date().getFullYear()}</p>
|
|
57
|
+
<hr />
|
|
58
|
+
<nav>
|
|
59
|
+
{/* <MenuList /> */}
|
|
60
|
+
</nav>
|
|
61
|
+
<hr />
|
|
62
|
+
<div className="footer__contact">
|
|
63
|
+
{/* <Phone /> */}
|
|
64
|
+
<a
|
|
65
|
+
href={`mailto:${faker.internet.email()}`}
|
|
66
|
+
rel="norel norefferer"
|
|
67
|
+
className="button"
|
|
68
|
+
>
|
|
69
|
+
{faker.internet.email()}
|
|
70
|
+
</a>
|
|
71
|
+
<div className="social">
|
|
72
|
+
{/* {useSiteMetadata().social?.facebook ?? */}
|
|
73
|
+
<a
|
|
74
|
+
href={faker.location.city()}
|
|
75
|
+
target='_blank' rel='noopener noreferrer'
|
|
76
|
+
aria-label={`${faker.location.city()} facebook`}
|
|
77
|
+
>
|
|
78
|
+
{/* <FacebookIcon /> */}
|
|
79
|
+
</a>
|
|
80
|
+
{/* } */}
|
|
81
|
+
{/* {useSiteMetadata().social?.instagram ?? */}
|
|
82
|
+
<a href={faker.location.city()}
|
|
83
|
+
target='_blank'
|
|
84
|
+
rel='noopener noreferrer'
|
|
85
|
+
aria-label={`${faker.location.city()} instagram`}
|
|
86
|
+
>
|
|
87
|
+
{/* <InstagramIcon /> */}
|
|
88
|
+
</a>
|
|
89
|
+
{/* } */}
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<hr />
|
|
93
|
+
<div className="footer__locations">
|
|
94
|
+
<h3>Our Partner Locations</h3>
|
|
95
|
+
<ul>
|
|
96
|
+
<Deal />
|
|
97
|
+
</ul>
|
|
98
|
+
</div>
|
|
99
|
+
</section>
|
|
100
|
+
<section>
|
|
101
|
+
<Pricing book={false} />
|
|
102
|
+
<hr />
|
|
103
|
+
|
|
104
|
+
<LocationDeck
|
|
105
|
+
// locations={data.allStrapiLocation}
|
|
106
|
+
background={false}
|
|
107
|
+
/>
|
|
108
|
+
</section>
|
|
109
|
+
|
|
110
|
+
</footer >
|
|
111
|
+
);
|
|
112
|
+
};
|