Bläddra i källkod

initial commit

master
Yusmardianto 4 år sedan
incheckning
cec647f2e5
94 ändrade filer med 9226 tillägg och 0 borttagningar
  1. +5
    -0
      .firebaserc
  2. +27
    -0
      .gitignore
  3. +30
    -0
      README.md
  4. +14
    -0
      app.json
  5. +10
    -0
      firebase.json
  6. +5
    -0
      jsconfig.json
  7. +4
    -0
      netlify.toml
  8. +12
    -0
      next-sitemap.js
  9. +8
    -0
      next.config.js
  10. +36
    -0
      package.json
  11. Binär
      public/favicon.ico
  12. +2
    -0
      public/robots.txt
  13. +6
    -0
      public/sitemap.xml
  14. +24
    -0
      src/analytics/index.js
  15. Binär
      src/assets/images/White.png
  16. Binär
      src/assets/images/banner-illustration.png
  17. Binär
      src/assets/images/blog/1.png
  18. Binär
      src/assets/images/blog/2.png
  19. Binär
      src/assets/images/blog/3.png
  20. Binär
      src/assets/images/blog/4.png
  21. Binär
      src/assets/images/icons/arrow-right.png
  22. Binär
      src/assets/images/icons/close.png
  23. Binär
      src/assets/images/icons/core1.png
  24. Binär
      src/assets/images/icons/core2.png
  25. Binär
      src/assets/images/icons/core3.png
  26. Binär
      src/assets/images/icons/core4.png
  27. Binär
      src/assets/images/icons/core5.png
  28. Binär
      src/assets/images/icons/dribbble.png
  29. Binär
      src/assets/images/icons/facebook.png
  30. Binär
      src/assets/images/icons/github.png
  31. Binär
      src/assets/images/icons/quote.png
  32. Binär
      src/assets/images/icons/service1.png
  33. Binär
      src/assets/images/icons/service2.png
  34. Binär
      src/assets/images/icons/service3.png
  35. Binär
      src/assets/images/icons/service4.png
  36. Binär
      src/assets/images/icons/service5.png
  37. Binär
      src/assets/images/icons/service6.png
  38. Binär
      src/assets/images/icons/service7.png
  39. Binär
      src/assets/images/icons/service8.png
  40. Binär
      src/assets/images/icons/service9.png
  41. Binär
      src/assets/images/icons/twitter.png
  42. Binär
      src/assets/images/logo.png
  43. Binär
      src/assets/images/logos/dribbble.png
  44. Binär
      src/assets/images/logos/google.png
  45. Binär
      src/assets/images/logos/hino.png
  46. Binär
      src/assets/images/logos/honda.png
  47. Binär
      src/assets/images/logos/mercedes.png
  48. Binär
      src/assets/images/logos/microsoft.png
  49. Binär
      src/assets/images/logos/paypal.png
  50. Binär
      src/assets/images/logos/suzuki.png
  51. Binär
      src/assets/images/logos/uber.png
  52. Binär
      src/assets/images/logos/yamaha.png
  53. Binär
      src/assets/images/subscribe-bg.png
  54. Binär
      src/assets/images/tab-illustration-1.png
  55. Binär
      src/assets/images/team/member1.png
  56. Binär
      src/assets/images/team/member2.png
  57. Binär
      src/assets/images/team/member3.png
  58. Binär
      src/assets/images/team/member4.png
  59. Binär
      src/assets/images/welcome.png
  60. +107
    -0
      src/components/cards/blog-post.js
  61. +53
    -0
      src/components/cards/service.js
  62. +70
    -0
      src/components/cards/team-member.js
  63. +64
    -0
      src/components/checkbox.js
  64. +55
    -0
      src/components/drawer.js
  65. +138
    -0
      src/components/footer/footer.data.js
  66. +102
    -0
      src/components/footer/footer.js
  67. +51
    -0
      src/components/footer/widget.js
  68. +26
    -0
      src/components/header/header.data.js
  69. +117
    -0
      src/components/header/header.js
  70. +142
    -0
      src/components/header/navbar-drawer.js
  71. +119
    -0
      src/components/icons/logo.js
  72. +6
    -0
      src/components/image.js
  73. +26
    -0
      src/components/input.js
  74. +27
    -0
      src/components/layout.js
  75. +61
    -0
      src/components/link.js
  76. +24
    -0
      src/components/logo.js
  77. +43
    -0
      src/components/section-heading.js
  78. +58
    -0
      src/components/seo.js
  79. +3
    -0
      src/contexts/drawer/drawer-context.js
  80. +25
    -0
      src/contexts/drawer/drawer-provider.js
  81. +16
    -0
      src/pages/_app.js
  82. +27
    -0
      src/pages/_document.js
  83. +32
    -0
      src/pages/index.js
  84. +87
    -0
      src/sections/blog.js
  85. +124
    -0
      src/sections/business-partner.js
  86. +88
    -0
      src/sections/core-value.js
  87. +79
    -0
      src/sections/home.js
  88. +322
    -0
      src/sections/our-team.js
  89. +74
    -0
      src/sections/services.js
  90. +143
    -0
      src/sections/subscribe-us.js
  91. +191
    -0
      src/sections/why-us.js
  92. +339
    -0
      src/theme/index.js
  93. +7
    -0
      vercel.json
  94. +6197
    -0
      yarn.lock

+ 5
- 0
.firebaserc Visa fil

@@ -0,0 +1,5 @@
{
"projects": {
"default": "<your_project_name>"
}
}

+ 27
- 0
.gitignore Visa fil

@@ -0,0 +1,27 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
.env*

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

.vercel

+ 30
- 0
README.md Visa fil

@@ -0,0 +1,30 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/zeit/next.js/tree/canary/packages/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/zeit/next.js/) - your feedback and contributions are welcome!

## Deploy on ZEIT Now

The easiest way to deploy your Next.js app is to use the [ZEIT Now Platform](https://zeit.co/) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

+ 14
- 0
app.json Visa fil

@@ -0,0 +1,14 @@
{
"name": "001-landing-next",
"description": "",
"formation": {
"web": {
"quantity": 1
}
},
"buildpacks": [
{
"url": "heroku/nodejs"
}
]
}

+ 10
- 0
firebase.json Visa fil

@@ -0,0 +1,10 @@
{
"hosting": {
"public": "out",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
}

+ 5
- 0
jsconfig.json Visa fil

@@ -0,0 +1,5 @@
{
"compilerOptions": {
"baseUrl": "src"
}
}

+ 4
- 0
netlify.toml Visa fil

@@ -0,0 +1,4 @@
# netlify.toml
[build]
command = "next build && next export"
publish = "out"

+ 12
- 0
next-sitemap.js Visa fil

@@ -0,0 +1,12 @@
module.exports = {
siteUrl: 'https://startup-agency.vercel.app',
generateRobotsTxt: true,
// optional
// robotsTxtOptions: {
// additionalSitemaps: [
// 'https://example.com/my-custom-sitemap-1.xml',
// 'https://example.com/my-custom-sitemap-2.xml',
// 'https://example.com/my-custom-sitemap-3.xml',
// ],
// },
};

+ 8
- 0
next.config.js Visa fil

@@ -0,0 +1,8 @@
const withPlugins = require('next-compose-plugins');
const optimizedImages = require('next-optimized-images');

const nextConfiguration = {
target: 'serverless', //will output independent pages that don't require a monolithic server. It's only compatible with next start or Serverless deployment platforms (like ZEIT Now) — you cannot use the custom server API.
};

module.exports = withPlugins([optimizedImages], nextConfiguration);

+ 36
- 0
package.json Visa fil

@@ -0,0 +1,36 @@
{
"name": "@landing/013-next",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"serve": "next start",
"export": "next export",
"postbuild": "next-sitemap"
},
"dependencies": {
"@material-ui/core": "^4.11.3",
"next": "^10.0.5",
"next-compose-plugins": "^2.2.1",
"next-optimized-images": "^2.6.2",
"polished": "^4.0.5",
"rc-drawer": "^4.2.1",
"rc-tabs": "^11.7.3",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-ga": "^3.3.0",
"react-icons": "^4.1.0",
"react-masonry-component": "^6.2.1",
"react-scroll": "^1.8.1",
"react-stickynode": "^3.0.4",
"swiper": "^6.4.5",
"theme-ui": "^0.3.5"
},
"devDependencies": {
"imagemin-mozjpeg": "^9.0.0",
"imagemin-optipng": "^8.0.0",
"imagemin-svgo": "^8.0.0",
"next-sitemap": "^1.4.5"
}
}

Binär
public/favicon.ico Visa fil

Före Efter

+ 2
- 0
public/robots.txt Visa fil

@@ -0,0 +1,2 @@
User-agent: *
Sitemap: https://example.io/sitemap.xml

+ 6
- 0
public/sitemap.xml Visa fil

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://leerob.iosrc//index</loc>
</url>
</urlset>

+ 24
- 0
src/analytics/index.js Visa fil

@@ -0,0 +1,24 @@
import ReactGA from 'react-ga';

export const initGA = () => {
console.log('GA init');
ReactGA.initialize('UA-xxxxxxxxx-1');
};

export const logPageView = () => {
console.log(`Logging pageview for ${window.location.pathname}`);
ReactGA.set({ page: window.location.pathname });
ReactGA.pageview(window.location.pathname);
};

export const logEvent = (category = '', action = '') => {
if (category && action) {
ReactGA.event({ category, action });
}
};

export const logException = (description = '', fatal = false) => {
if (description) {
ReactGA.exception({ description, fatal });
}
};

Binär
src/assets/images/White.png Visa fil

Före Efter
Bredd: 4619  |  Höjd: 994  |  Storlek: 165 KiB

Binär
src/assets/images/banner-illustration.png Visa fil

Före Efter
Bredd: 1084  |  Höjd: 563  |  Storlek: 47 KiB

Binär
src/assets/images/blog/1.png Visa fil

Före Efter
Bredd: 376  |  Höjd: 270  |  Storlek: 45 KiB

Binär
src/assets/images/blog/2.png Visa fil

Före Efter
Bredd: 376  |  Höjd: 170  |  Storlek: 36 KiB

Binär
src/assets/images/blog/3.png Visa fil

Före Efter
Bredd: 376  |  Höjd: 230  |  Storlek: 34 KiB

Binär
src/assets/images/blog/4.png Visa fil

Före Efter
Bredd: 376  |  Höjd: 230  |  Storlek: 31 KiB

Binär
src/assets/images/icons/arrow-right.png Visa fil

Före Efter
Bredd: 14  |  Höjd: 18  |  Storlek: 336 B

Binär
src/assets/images/icons/close.png Visa fil

Före Efter
Bredd: 15  |  Höjd: 15  |  Storlek: 306 B

Binär
src/assets/images/icons/core1.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.9 KiB

Binär
src/assets/images/icons/core2.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.9 KiB

Binär
src/assets/images/icons/core3.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 3.0 KiB

Binär
src/assets/images/icons/core4.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 3.1 KiB

Binär
src/assets/images/icons/core5.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.1 KiB

Binär
src/assets/images/icons/dribbble.png Visa fil

Före Efter
Bredd: 20  |  Höjd: 21  |  Storlek: 913 B

Binär
src/assets/images/icons/facebook.png Visa fil

Före Efter
Bredd: 20  |  Höjd: 20  |  Storlek: 606 B

Binär
src/assets/images/icons/github.png Visa fil

Före Efter
Bredd: 20  |  Höjd: 21  |  Storlek: 648 B

Binär
src/assets/images/icons/quote.png Visa fil

Före Efter
Bredd: 128  |  Höjd: 43  |  Storlek: 545 B

Binär
src/assets/images/icons/service1.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.9 KiB

Binär
src/assets/images/icons/service2.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.0 KiB

Binär
src/assets/images/icons/service3.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.7 KiB

Binär
src/assets/images/icons/service4.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.3 KiB

Binär
src/assets/images/icons/service5.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.4 KiB

Binär
src/assets/images/icons/service6.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.6 KiB

Binär
src/assets/images/icons/service7.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.9 KiB

Binär
src/assets/images/icons/service8.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 2.0 KiB

Binär
src/assets/images/icons/service9.png Visa fil

Före Efter
Bredd: 88  |  Höjd: 88  |  Storlek: 1.5 KiB

Binär
src/assets/images/icons/twitter.png Visa fil

Före Efter
Bredd: 20  |  Höjd: 17  |  Storlek: 532 B

Binär
src/assets/images/logo.png Visa fil

Före Efter
Bredd: 182  |  Höjd: 37  |  Storlek: 2.0 KiB

Binär
src/assets/images/logos/dribbble.png Visa fil

Före Efter
Bredd: 150  |  Höjd: 37  |  Storlek: 4.2 KiB

Binär
src/assets/images/logos/google.png Visa fil

Före Efter
Bredd: 130  |  Höjd: 45  |  Storlek: 5.7 KiB

Binär
src/assets/images/logos/hino.png Visa fil

Före Efter
Bredd: 2496  |  Höjd: 2655  |  Storlek: 586 KiB

Binär
src/assets/images/logos/honda.png Visa fil

Före Efter
Bredd: 6250  |  Höjd: 4568  |  Storlek: 489 KiB

Binär
src/assets/images/logos/mercedes.png Visa fil

Före Efter
Bredd: 2942  |  Höjd: 745  |  Storlek: 366 KiB

Binär
src/assets/images/logos/microsoft.png Visa fil

Före Efter
Bredd: 150  |  Höjd: 46  |  Storlek: 3.6 KiB

Binär
src/assets/images/logos/paypal.png Visa fil

Före Efter
Bredd: 150  |  Höjd: 48  |  Storlek: 5.9 KiB

Binär
src/assets/images/logos/suzuki.png Visa fil

Före Efter
Bredd: 2216  |  Höjd: 1128  |  Storlek: 331 KiB

Binär
src/assets/images/logos/uber.png Visa fil

Före Efter
Bredd: 100  |  Höjd: 21  |  Storlek: 1.2 KiB

Binär
src/assets/images/logos/yamaha.png Visa fil

Före Efter
Bredd: 4884  |  Höjd: 1010  |  Storlek: 186 KiB

Binär
src/assets/images/subscribe-bg.png Visa fil

Före Efter
Bredd: 1920  |  Höjd: 380  |  Storlek: 15 KiB

Binär
src/assets/images/tab-illustration-1.png Visa fil

Före Efter
Bredd: 581  |  Höjd: 587  |  Storlek: 32 KiB

Binär
src/assets/images/team/member1.png Visa fil

Före Efter
Bredd: 380  |  Höjd: 420  |  Storlek: 10 KiB

Binär
src/assets/images/team/member2.png Visa fil

Före Efter
Bredd: 380  |  Höjd: 420  |  Storlek: 11 KiB

Binär
src/assets/images/team/member3.png Visa fil

Före Efter
Bredd: 380  |  Höjd: 420  |  Storlek: 10 KiB

Binär
src/assets/images/team/member4.png Visa fil

Före Efter
Bredd: 380  |  Höjd: 420  |  Storlek: 11 KiB

Binär
src/assets/images/welcome.png Visa fil

Före Efter
Bredd: 1208  |  Höjd: 586  |  Storlek: 93 KiB

+ 107
- 0
src/components/cards/blog-post.js Visa fil

@@ -0,0 +1,107 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Flex, Image, Heading, Text } from 'theme-ui';
import { rgba } from 'polished';
import { Link } from 'components/link';

const BlogPost = ({ post }) => {
return (
<Box
as="article"
sx={styles.post}
className={`${post?.showDescription ? '' : 'no-description'} ${
!!post?.thumbnail ? '' : 'no-thumbnail'
}`}
>
{!!post?.thumbnail && (
<Flex as="figure" sx={styles.thumbnail}>
<Image src={post?.thumbnail} alt="post title" />
</Flex>
)}

<Box className="content">
<Heading as="h3" sx={styles.title}>
<Link path={post?.slug}>{post?.title}</Link>
</Heading>
{post?.showDescription && (
<Text as="p" sx={styles.description}>
{post?.description}
</Text>
)}
</Box>
</Box>
);
};

export default BlogPost;

const styles = {
post: {
m: ['0 0 30px', null, null, '0 15px 30px'],
width: ['100%', null, null, 'calc(50% - 30px)', 'calc(33.33% - 30px)'],
':last-child': {
mb: 0,
},
'&.no-thumbnail': {
'.content': {
backgroundColor: '#FBF5F1',
padding: '25px 25px 35px',
borderRadius: 5,
},
},
'&.no-description:not(.no-thumbnail)': {
figure: {
mb: 0,
},
'.content': {
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0,
display: 'flex',
alignItems: 'flex-end',
p: '0 11px 20px 20px',
zIndex: 0,
':before': {
background:
'linear-gradient(180.06deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.71) 99.95%)',
borderRadius: 5,
content: `''`,
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0,
zIndex: -1,
opacity: 0.9,
},
'h3 a': {
color: 'white',
textDecoration: 'none',
},
},
},
},
thumbnail: {
mb: [4],
img: {
borderRadius: 5,
},
},
title: {
fontWeight: 700,
fontSize: [2, null, null, 3, null, 4],
lineHeight: [1.5, null, null, null, null, 1.76],
letterSpacing: '-0.2px',
a: {
color: 'heading',
textDecoration: 'none',
},
},
description: {
color: rgba('#0F2137', 0.6),
lineHeight: 1.88,
mt: [2],
},
};

+ 53
- 0
src/components/cards/service.js Visa fil

@@ -0,0 +1,53 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Image, Text, Heading } from 'theme-ui';
import { LearnMore } from 'components/link';

const Service = ({ item }) => {
return (
<Box sx={styles.serviceItem}>
<Box as="figure" sx={styles.figure}>
<Image src={item?.icon} alt="icon" />
</Box>
<Box sx={styles.content}>
<Heading as="h3">{item?.title}</Heading>
<Text as="p">{item?.description}</Text>
{item?.moreLink && <LearnMore path={item?.moreLink} />}
</Box>
</Box>
);
};

export default Service;

const styles = {
serviceItem: {
display: [null, null, null, null, null, 'flex'],
textAlign: ['center', null, null, null, null, 'left'],
},
figure: {
minWidth: [88, null, null, null, null, 70, 88],
mr: [null, null, null, null, null, 30],
mb: [2, null, null, null, null, 0],
img: {
maxWidth: [42, null, null, 60, 70, '100%'],
},
},
content: {
h3: {
color: 'heading',
fontWeight: 700,
fontFamily: 'body',
fontSize: [2, null, null, 17, 3],
lineHeight: [1.68],
},
p: {
fontSize: [1, null, null, null, 2],
lineHeight: [1.88],
mt: [2],
},
a: {
mt: [2, null, null, 3],
},
},
};

+ 70
- 0
src/components/cards/team-member.js Visa fil

@@ -0,0 +1,70 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Flex, Box, Image, Text, Heading, Link } from 'theme-ui';
import { FaTwitter, FaGithub, FaDribbble } from 'react-icons/fa';

const TeamMember = ({ member }) => {
return (
<Box sx={styles.section}>
<Flex as="figure" sx={styles.avatar}>
<Image src={member?.avatar} alt={member?.name} />
</Flex>
<Box sx={styles.about}>
<Heading as="h3">{member?.name}</Heading>
<Text as="p">{member?.designation}</Text>
<Box sx={styles.socialLinks}>
{member?.socialLinks?.map((social, index) => (
<Link href={social?.link} key={index}>
{social?.name === 'twitter' && (
<FaTwitter size="18px" color="#55ACEE" />
)}
{social?.name === 'github' && (
<FaGithub size="18px" color="#161614" />
)}
{social?.name === 'dribbble' && (
<FaDribbble
size="18px"
color="#B2215A"
style={{ backgroundColor: '#E74D89', borderRadius: 20 }}
/>
)}
</Link>
))}
</Box>
</Box>
</Box>
);
};

export default TeamMember;

const styles = {
avatar: {
alignItems: 'center',
justifyContent: 'center',
},
about: {
mt: [4],
textAlign: ['center', null, null, 'left'],
h3: {
color: 'heading',
fontFamily: 'body',
fontSize: [3, null, 17, null, 4],
},
p: {
color: '#7589A1',
letterSpacing: '-0.2px',
mt: [2],
},
},
socialLinks: {
display: 'flex',
alignItems: 'center',
justifyContent: ['center', null, null, 'left'],
mt: [3],
a: {
display: 'inline-flex',
mr: [2],
},
},
};

+ 64
- 0
src/components/checkbox.js Visa fil

@@ -0,0 +1,64 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import React from 'react';
import { RiCheckboxBlankFill, RiCheckboxFill } from 'react-icons/ri';
import { jsx, Flex } from 'theme-ui';
import { rgba } from 'polished';

const Checkbox = ({ id, label, onClick, checked, onChange, sx, ...props }) => {
return (
<Flex sx={styles.checkbox} className={checked ? 'checked' : ''}>
{checked ? (
<RiCheckboxFill size="24px" />
) : (
<RiCheckboxBlankFill size="24px" />
)}
<input
id={id}
type="checkbox"
checked={checked ?? checked}
onChange={onChange}
{...props}
/>
{label && <label htmlFor={id}>{label}</label>}
</Flex>
);
};

export default React.memo(Checkbox);

const styles = {
checkbox: {
// backgroundColor: '#EFF3F7',
position: 'relative',
borderRadius: '4px',
alignItems: 'center',
svg: {
position: 'absolute',
borderRadius: 4,
left: 0,
top: '-5px',
path: {
color: '#EFF3F7',
},
},
input: {
position: 'absolute',
opacity: 0,
visibility: 'hidden',
},
label: {
cursor: 'pointer',
fontSize: '14px',
lineHeight: 1,
color: rgba('#9095AD', 0.9),
paddingLeft: 30,
zIndex: 10,
},
'&.checked': {
'svg path': {
color: 'secondary',
},
},
},
};

+ 55
- 0
src/components/drawer.js Visa fil

@@ -0,0 +1,55 @@
import React, { Fragment } from 'react';
import { Box } from 'theme-ui';
import RcDrawer from 'rc-drawer';

const Drawer = ({
className,
children,
closeButton,
closeButtonStyle,
drawerHandler,
toggleHandler,
open,
width,
placement,
drawerStyle,
closeBtnStyle,
...props
}) => {
return (
<Fragment>
<RcDrawer
open={open}
onClose={toggleHandler}
className={`drawer ${className ? className : ''}`.trim()}
width={width}
placement={placement}
handler={false}
level={null}
duration="0.4s"
{...props}
>
{closeButton && (
<Box as="div" onClick={toggleHandler} sx={closeBtnStyle}>
{closeButton}
</Box>
)}
<Box sx={drawerStyle}>{children}</Box>
</RcDrawer>
<Box
className="drawer__handler"
style={{ display: 'inline-block' }}
onClick={toggleHandler}
>
{drawerHandler}
</Box>
</Fragment>
);
};

Drawer.defaultProps = {
width: '320px',
placement: 'left',
};

export default Drawer;

+ 138
- 0
src/components/footer/footer.data.js Visa fil

@@ -0,0 +1,138 @@
import facebook from 'assets/images/icons/facebook.png';
import twitter from 'assets/images/icons/twitter.png';
import github from 'assets/images/icons/github.png';
import dribbble from 'assets/images/icons/dribbble.png';

export const menuItems = [
{
id: 2,
title: 'About Us',
items: [
{
path: '#!',
label: 'Home',
},
{
path: '#!',
label: 'Thamrin Founder',
},
{
path: '#!',
label: 'Why Us',
},
{
path: '#!',
label: 'Blog',
},
],
},
{
id: 3,
title: 'Our Business Partner',
items: [
{
path: '#!',
label: 'Thamrin Brothers',
},
{
path: '#!',
label: 'Nusa Sarana Citra Bakti',
},
{
path: '#!',
label: 'Citra Lestari Mobilindo',
},
{
path: '#!',
label: 'Citra Thamrin Motor',
},
{
path: '#!',
label: 'Thamrin Citra Abadi',
},
{
path: '#!',
label: 'Musi Lestari Indo Makmur',
},
{
path: '#!',
label: 'Musi Indah Makmur',
},
],
},
{
id: 4,
title: 'Our Business Partner',
items: [
{
path: '#!',
label: 'BPR Berkat Sejati',
},
{
path: '#!',
label: 'Citra Nusa Bakti',
},
{
path: '#!',
label: 'Regis Institut',
},
{
path: '#!',
label: 'Citra Mandiri Asih Sejati',
},
{
path: '#!',
label: 'Thamrin Homes',
},
],
},
{
id: 5,
title: 'Connect',
items: [
{
path: '#!',
icon: facebook,
label: 'Facebook',
},
{
path: '#!',
icon: twitter,
label: 'Twitter',
},
{
path: '#!',
icon: github,
label: 'Github',
},
{
path: '#!',
icon: dribbble,
label: 'Dribbble',
},
],
},
];

export const footerNav = [
{
path: '#!',
label: 'Home',
},
{
path: '#!',
label: 'Advertise',
},
{
path: '#!',
label: 'Supports',
},
{
path: '#!',
label: 'Marketing',
},
{
path: '#!',
label: 'FAQ',
},
];

+ 102
- 0
src/components/footer/footer.js Visa fil

@@ -0,0 +1,102 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Text, Container } from 'theme-ui';
import Logo from 'components/logo';
import { Link } from 'components/link';
import Widget from './widget';
import { menuItems } from './footer.data';
import { rgba } from 'polished';

export default function Footer() {
return (
<Box as="footer" sx={styles.footer}>
<Container>
<Box sx={styles.footerTopInner}>
<Box sx={styles.about}>
<Box sx={styles.logo}>
<Logo />
</Box>
<Box sx={styles.terms}>
<Link path="#!">Terms of use</Link>
<Text as="span">|</Text>
<Link path="#!">Privacy</Link>
</Box>
<Text as="p" sx={styles.copyright}>
Copyright by {new Date().getFullYear()} Thamrin Group
</Text>
</Box>
{menuItems.map(({ id, title, items }) => (
<Widget key={id} title={title} items={items} />
))}
</Box>
</Container>
</Box>
);
}

const styles = {
footer: {
pt: [8],
pb: [8],
},
footerTopInner: {
gap: [30, null, 50, '20px 50px', 17, 50],
display: ['grid'],
gridTemplateColumns: [
'repeat(2, 1fr)',
null,
null,
'repeat(4, 1fr)',
'repeat(5, 1fr)',
],
},
footerInner: {
borderTop: `1px solid #D9E0E7`,
display: ['block', null, 'flex'],
alignItems: 'center',
justifyContent: 'space-between',
padding: '35px 0 40px',
},
about: {
display: [null, null, null, 'grid', 'block'],
gridTemplateColumns: '205px 1fr 1fr',
alignItems: ['center'],
gridRow: ['3/4', null, '1/1', '3/4', 'unset'],
gridColumn: ['1/3', null, '1/2', '1/5', 'unset'],
},
logo: {
display: ['flex'],
justifyContent: ['center', null, null, 'unset'],
gridColumn: '1/2',
},
terms: {
display: ['flex'],
gridColumn: '3/4',
alignItems: ['center', null, null, null, 'flex-start', 'center'],
flexDirection: ['row', null, null, null, 'column', 'row'],
justifyContent: [
'center',
null,
'flex-start',
'center',
null,
'flex-start',
],
mt: [4, null, null, 0, 4],
a: {
color: 'heading',
},
span: {
display: ['inline-flex', null, null, null, 'none', 'inline-flex'],
m: ['0 10px'],
},
},
copyright: {
color: rgba('#0F2137', 0.6),
fontSize: ['14px'],
mt: [3, null, null, -31, 3],
mr: [null, null, null, 'auto', 'unset'],
gridColumn: '2/3',
textAlign: ['center', null, 'left', 'center', 'left'],
},
};

+ 51
- 0
src/components/footer/widget.js Visa fil

@@ -0,0 +1,51 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Heading, Image } from 'theme-ui';
import { Link } from 'components/link';
import { rgba } from 'polished';

const Widget = ({ title, items }) => {
return (
<Box sx={styles.footerWidget}>
<Heading as="h4">{title}</Heading>
<ul>
{items.map(({ path, label, icon }, i) => (
<li key={i}>
{icon && <Image src={icon} alt={label} />}
<Link path={path} key={i} label={label} variant="footer" />
</li>
))}
</ul>
</Box>
);
};

export default Widget;

const styles = {
footerWidget: {
h4: {
color: 'heading',
fontFamily: 'body',
fontSize: '18px',
fontWeight: 500,
lineHeight: 1.68,
letterSpacing: 'heading',
},
ul: {
listStyle: 'none',
margin: '28px 0 0',
padding: 0,
li: {
display: 'flex',
alignItems: 'center',
img: {
mr: '15px',
},
},
a: {
color: rgba('#02073E', 0.8),
},
},
},
};

+ 26
- 0
src/components/header/header.data.js Visa fil

@@ -0,0 +1,26 @@
export default [
{
path: 'home',
label: 'Home',
},
{
path: 'testimonials',
label: 'Business Partner',
},
{
path: 'team',
label: 'Team',
},
{
path: 'why-us',
label: 'Why Us',
},
{
path: 'blog',
label: 'Blog',
},
{
path: '',
label: '',
},
];

+ 117
- 0
src/components/header/header.js Visa fil

@@ -0,0 +1,117 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container, Button } from 'theme-ui';
import Sticky from 'react-stickynode';
import Logo from 'components/logo';
import { NavLink } from 'components/link';
import { DrawerProvider } from 'contexts/drawer/drawer-provider';
import NavbarDrawer from './navbar-drawer';
import menuItems from './header.data';
import Image from 'assets/images/White.png'
export default function Header() {
return (
<DrawerProvider>
<Box sx={styles.headerWrapper}>
<Sticky enabled={true} top={0} activeClass="is-sticky" innerZ={100}>
<Box as="header" sx={styles.header}>
<Container>
<Box sx={styles.headerInner}>
<Logo sx={styles.logo} />
{/* <Image src={Image} /> */}
<Box as="nav" sx={styles.navbar} className="navbar">
<Box as="ul" sx={styles.navList}>
{menuItems.map(({ path, label }, i) => (
<li key={i}>
<NavLink path={path} label={label} />
</li>
))}
</Box>
</Box>
<NavbarDrawer />
</Box>
</Container>
</Box>
</Sticky>
</Box>
</DrawerProvider>
);
}

const styles = {
headerWrapper: {
backgroundColor: 'transparent',
'.is-sticky': {
header: {
backgroundColor: 'white',
boxShadow: '0 6px 13px rgba(38,78,118,0.1)',
paddingTop: '15px',
paddingBottom: '15px',
},
},
},
header: {
position: 'fixed',
left: 0,
right: 0,
py: 4,
transition: 'all 0.3s ease-in-out 0s',
'&.is-mobile-menu': {
backgroundColor: 'white',
},
},
headerInner: {
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
},
logo: {
mr: [null, null, null, null, 6, 12],
},
navbar: {
display: ['none', null, null, null, 'flex'],
alignItems: 'center',
flexGrow: 1,
// justifyContent: 'center',
},
navList: {
display: ['flex'],
listStyle: 'none',
// marginLeft: 'auto',
flexGrow: 1,
p: 0,
'li:last-child': {
ml: ['auto'],
},
'.nav-item': {
cursor: 'pointer',
fontWeight: 400,
padding: 0,
margin: [0, 0, 0, 0, '0 20px'],
},
'.active': {
color: 'primary',
},
},
getStartedDesktop: {
color: 'primary',
display: ['none', 'none', 'none', 'none', 'flex'],
},
getStartedMobile: {
color: 'primary',
fontSize: [1],
minHeight: 30,
m: ['0 15px 0 auto'],
padding: '0 11px',
display: ['flex', null, null, null, 'none'],
},
closeButton: {
height: '32px',
padding: '4px',
minHeight: 'auto',
width: '32px',
ml: '3px',
path: {
stroke: 'text',
},
},
};

+ 142
- 0
src/components/header/navbar-drawer.js Visa fil

@@ -0,0 +1,142 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { IoMdMenu } from 'react-icons/io';
import React, { useContext } from 'react';
import { jsx, Box, Image } from 'theme-ui';
import { Link } from 'react-scroll';
import { DrawerContext } from 'contexts/drawer/drawer-context';
import Drawer from 'components/drawer';
import Logo from 'components/logo';
import menuItems from './header.data';
import close from 'assets/images/icons/close.png';

const DrawerNav = () => {
const { state, dispatch } = useContext(DrawerContext);

// Toggle drawer
const toggleHandler = React.useCallback(() => {
dispatch({
type: 'TOGGLE',
});
}, [dispatch]);

return (
<Drawer
width="340px"
placement="right"
drawerHandler={
<Box sx={styles.handler}>
<IoMdMenu size="26px" />
</Box>
}
open={state?.isOpen}
toggleHandler={toggleHandler}
closeButton={
<button sx={styles.closeButton}>
<Image src={close} alt="close" />
</button>
}
maskStyle={styles.mask}
drawerStyle={styles.drawer}
closeBtnStyle={styles.close}
>
<Box sx={styles.wrapper}>
<Logo sx={styles.logo} />
<Box as="ul" sx={styles.navbar}>
{menuItems.map(({ path, label }, i) => (
<Box as="li" key={i}>
<Link
activeClass="active"
to={path}
spy={true}
smooth={true}
offset={-70}
duration={500}
>
{label}
</Link>
</Box>
))}
</Box>
</Box>
</Drawer>
);
};
export default DrawerNav;

const styles = {
handler: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: '0',
width: '26px',
cursor: 'pointer',
'@media screen and (min-width: 1024px)': {
display: 'none',
},
},
drawer: {
backgroundColor: 'white',
width: '100%',
height: '100%',
outline: 0,
},
mask: {
opacity: 0.2,
},
close: {
position: 'absolute',
top: 35,
right: 30,
zIndex: '1',
},
closeButton: {
alignItems: 'center',
backgroundColor: 'transparent',
border: 0,
cursor: 'pointer',
display: 'flex',
p: 0,
},
wrapper: {
height: '100%',
paddingTop: 30,
width: '100%',
},
logo: {
ml: 30,
mb: 45,
},
navbar: {
listStyle: 'none',
m: 0,
p: 0,
'li > a': {
backgroundColor: 'transparent',
color: 'heading',
display: 'flex',
alignItems: 'center',
minHeight: 44,
paddingLeft: 30,
position: 'relative',
transition: 'all 0.3s ease-in-out 0s',
'::before': {
backgroundColor: 'transparent',
content: `''`,
position: 'absolute',
height: '100%',
left: 0,
top: 0,
width: 2,
transition: 'all 0.3s ease-in-out 0s',
},
},
'.active': {
backgroundColor: '#F8F8F8',
'::before': {
backgroundColor: 'primary',
},
},
},
};

+ 119
- 0
src/components/icons/logo.js Visa fil

@@ -0,0 +1,119 @@
import React from 'react';

const Logo = ({ white, ...props }) => {
return (
<svg viewBox="0 0 185.92 36.62" width={185.92} height={36.62} {...props}>
<defs>
<linearGradient
id="prefix__b"
x1={16.08}
y1={-16.52}
x2={10.26}
y2={20.44}
gradientUnits="userSpaceOnUse"
>
<stop offset={0} stopColor="#0096d9" />
<stop offset={1} stopColor="#00c198" />
</linearGradient>
<linearGradient
id="prefix__c"
x1={8.95}
y1={13.48}
x2={18.28}
y2={32.02}
gradientUnits="userSpaceOnUse"
>
<stop offset={0} stopColor="#002dd9" />
<stop offset={1} stopColor="#00b2ab" />
</linearGradient>
<linearGradient
id="prefix__a"
x1={23.33}
y1={-3.39}
x2={5.66}
y2={37.65}
gradientUnits="userSpaceOnUse"
>
<stop offset={0} stopColor="#3482c0" />
<stop offset={0.45} stopColor="#96bede" />
<stop offset={0.83} stopColor="#e1edf6" />
<stop offset={1} stopColor="#fff" />
</linearGradient>
<linearGradient
id="prefix__d"
x1={21.64}
y1={1.42}
x2={6.63}
y2={30.44}
xlinkHref="#prefix__a"
/>
<linearGradient
id="prefix__e"
x1={25.15}
y1={3.24}
x2={10.14}
y2={32.25}
gradientUnits="userSpaceOnUse"
>
<stop offset={0} stopColor="#569fa1" />
<stop offset={0.36} stopColor="#97c4c5" />
<stop offset={0.8} stopColor="#e2eeef" />
<stop offset={1} stopColor="#fff" />
</linearGradient>
<radialGradient
id="prefix__f"
cx={21.16}
cy={32.05}
r={27.25}
gradientUnits="userSpaceOnUse"
>
<stop offset={0} stopColor="#ff0" />
<stop offset={1} />
</radialGradient>
</defs>
<g data-name="Layer 2">
<g data-name="Layer 1">
<path
d="M39.64 22.9h2.85a1.86 1.86 0 00.9 1.4 3.67 3.67 0 002 .53 3.33 3.33 0 001.9-.5A1.5 1.5 0 0048 23a1.32 1.32 0 00-.54-1.1 4.91 4.91 0 00-1.83-.71l-1.84-.4Q40 20 40 16.9a3.81 3.81 0 011.5-3.13 6.14 6.14 0 013.89-1.19 6.07 6.07 0 013.89 1.16 3.86 3.86 0 011.5 3.08H48a1.77 1.77 0 00-.79-1.4 3 3 0 00-1.82-.52 3 3 0 00-1.77.48 1.49 1.49 0 00-.66 1.26 1.25 1.25 0 00.53 1.05 5.29 5.29 0 001.77.68l1.71.36A6.18 6.18 0 0150 20.14a3.42 3.42 0 011 2.56 3.93 3.93 0 01-1.55 3.3 6.63 6.63 0 01-4.17 1.2 6.65 6.65 0 01-4.06-1.2 3.9 3.9 0 01-1.58-3.1zM53.33 14h2.85v2.42h1.93v2.18h-1.93v5c0 .78.41 1.18 1.23 1.18a4.44 4.44 0 00.69-.05v2.1a6.12 6.12 0 01-1.36.11 4.1 4.1 0 01-2.63-.66 2.74 2.74 0 01-.78-2.2V18.6h-1.48v-2.15h1.48zm10.29 11a2.39 2.39 0 001.6-.55 1.74 1.74 0 00.66-1.39v-.76l-2.2.13a2.3 2.3 0 00-1.24.4 1.09 1.09 0 00-.43.9 1.1 1.1 0 00.44.93 1.83 1.83 0 001.17.34zm-.94 2.06a3.6 3.6 0 01-2.51-.89 2.92 2.92 0 01-1-2.28 2.68 2.68 0 011-2.24 5.43 5.43 0 013-.93l2.63-.15v-.7a1.4 1.4 0 00-.47-1.13 1.91 1.91 0 00-1.28-.41 2.2 2.2 0 00-1.28.35 1.44 1.44 0 00-.6.95h-2.53A3.21 3.21 0 0161 17.17a5.31 5.31 0 013.29-1 5.05 5.05 0 013.23 1 3.09 3.09 0 011.21 2.54v7.2h-2.8v-1.6h-.06a3.08 3.08 0 01-1.3 1.3 3.89 3.89 0 01-1.89.47zm7.85-.16V16.45h2.76v1.88h.06a2.86 2.86 0 01.91-1.52 2.43 2.43 0 011.58-.53 2.88 2.88 0 01.81.11v2.51a2.79 2.79 0 00-1-.17 2.16 2.16 0 00-1.64.62 2.39 2.39 0 00-.59 1.72v5.85zm8-12.89h2.85v2.42h1.94v2.17h-1.89v5c0 .78.41 1.18 1.23 1.18a4.68 4.68 0 00.7-.05v2.1A6.24 6.24 0 0182 27a4.15 4.15 0 01-2.64-.66 2.74 2.74 0 01-.78-2.2V18.6h-1.47v-2.15h1.47zm16 2.42v10.49h-2.69V25h-.06a3.07 3.07 0 01-3.13 2.08 3.71 3.71 0 01-2.75-1 4 4 0 01-1-2.87v-6.76h2.85v6.15a2.28 2.28 0 00.5 1.59 1.86 1.86 0 001.45.55 1.9 1.9 0 001.51-.63 2.4 2.4 0 00.55-1.67v-6zm8-.17a3.79 3.79 0 013.14 1.44 6.14 6.14 0 011.15 4 6.33 6.33 0 01-1.13 4 4.1 4.1 0 01-5.09.92 3.15 3.15 0 01-1.27-1.41h-.03v5.17h-2.85V16.45h2.81v1.82h.06a3.35 3.35 0 011.27-1.46 3.7 3.7 0 011.97-.53zm-1 8.51a2 2 0 001.77-.77 3.71 3.71 0 00.63-2.27 3.67 3.67 0 00-.63-2.26 2 2 0 00-1.69-.85 2 2 0 00-1.68.86 3.6 3.6 0 00-.64 2.25 3.73 3.73 0 00.63 2.27 2 2 0 001.69.79zm22.07-.32v2.45h-9.11V12.82h3v11.65zm5.55.55a2.39 2.39 0 001.6-.55 1.74 1.74 0 00.66-1.39v-.76l-2.2.13a2.3 2.3 0 00-1.24.4 1.09 1.09 0 00-.43.9 1.1 1.1 0 00.44.93 1.83 1.83 0 001.25.34zm-.94 2.06a3.59 3.59 0 01-2.51-.89 2.92 2.92 0 01-1-2.28 2.68 2.68 0 011-2.24 5.43 5.43 0 013-.93l2.63-.15v-.7a1.43 1.43 0 00-.47-1.13 1.91 1.91 0 00-1.28-.41 2.18 2.18 0 00-1.28.35 1.44 1.44 0 00-.6.95h-2.61a3.21 3.21 0 011.32-2.48 5.31 5.31 0 013.29-1 5.07 5.07 0 013.23 1 3.09 3.09 0 011.21 2.54v7.2h-2.76v-1.58h-.06a3.08 3.08 0 01-1.3 1.3 3.89 3.89 0 01-1.73.47zm7.85-.16V16.45h2.76v1.86h.18a3.26 3.26 0 011.25-1.52 3.6 3.6 0 012-.54 3.46 3.46 0 012.68 1 4.12 4.12 0 011 2.88v6.75H143v-6.12a2.31 2.31 0 00-.49-1.59 1.83 1.83 0 00-1.44-.55 2 2 0 00-1.52.63 2.39 2.39 0 00-.57 1.66v6zm15.41.16a3.75 3.75 0 01-3.11-1.45 6.21 6.21 0 01-1.15-4 6.11 6.11 0 011.15-3.93 3.79 3.79 0 013.13-1.45 3.53 3.53 0 012 .54 3.17 3.17 0 011.25 1.42v-5.37h2.86v14.1h-2.82v-1.8h-.05a3.09 3.09 0 01-1.26 1.42 3.67 3.67 0 01-1.92.54zm1-8.51a2 2 0 00-1.7.84 3.75 3.75 0 00-.61 2.27 3.76 3.76 0 00.61 2.28 2.15 2.15 0 003.39 0 3.72 3.72 0 00.63-2.28 3.67 3.67 0 00-.63-2.26 2 2 0 00-1.64-.83zm7.11 8.35V16.45h2.85v10.47zm2.51-12.05a1.52 1.52 0 01-1.09.42 1.49 1.49 0 01-1.08-.42 1.44 1.44 0 01-.44-1 1.38 1.38 0 01.44-1 1.46 1.46 0 011.08-.43 1.49 1.49 0 011.09.43 1.38 1.38 0 01.44 1 1.44 1.44 0 01-.39 1.02zm2.24 12.05V16.45h2.76v1.86h.06a3.26 3.26 0 011.25-1.52 3.6 3.6 0 012-.54 3.44 3.44 0 012.68 1 4.07 4.07 0 01.95 2.88v6.75h-2.85v-6.12a2.31 2.31 0 00-.49-1.59 1.79 1.79 0 00-1.43-.55 2 2 0 00-1.53.63 2.43 2.43 0 00-.56 1.66v6zm16.36-2.23a2.05 2.05 0 001.7-.8 3.48 3.48 0 00.64-2.23 3.6 3.6 0 00-.64-2.25 2 2 0 00-1.7-.84 2 2 0 00-1.68.84 3.69 3.69 0 00-.61 2.25 3.6 3.6 0 00.61 2.23 2 2 0 001.73.82zm-.05 6.17a5.84 5.84 0 01-3.36-.9 3.19 3.19 0 01-1.48-2.3h2.79a1.54 1.54 0 00.74.88 2.8 2.8 0 001.39.34 2.41 2.41 0 001.69-.56 1.85 1.85 0 00.61-1.47V25H183a3 3 0 01-1.24 1.37 3.89 3.89 0 01-2 .51 3.8 3.8 0 01-3.09-1.41 5.88 5.88 0 01-1.15-3.84 6.06 6.06 0 011.15-3.92 3.82 3.82 0 013.14-1.44 3.59 3.59 0 012 .54 3.37 3.37 0 011.27 1.45v-1.81h2.82v10.32a3.58 3.58 0 01-1.44 3 6 6 0 01-3.77 1.09z"
fill={white ? 'white' : '#0f2137'}
/>
<path
d="M19.8.53A15.73 15.73 0 004.65 26.89L22.17 9.37A5.29 5.29 0 0019.8.53z"
fill="url(#prefix__b)"
/>
<path
d="M6.65 36.09A15.73 15.73 0 0021.81 9.73L4.29 27.25a5.28 5.28 0 002.36 8.84z"
fill="url(#prefix__c)"
/>
<path
d="M21.81 9.73L4.29 27.25a5.28 5.28 0 002.36 8.84 15.72 15.72 0 005.75.44c-7.68-7.39 9.41-26.8 9.41-26.8z"
style={{
mixBlendMode: 'multiply',
}}
fill="url(#prefix__a)"
/>
<g
style={{
mixBlendMode: 'multiply',
}}
>
<path
d="M6.33 36c-2.49-7.7 12.45-23.21 15.09-25.87L4.29 27.25A5.28 5.28 0 006.33 36z"
fill="url(#prefix__d)"
/>
<path d="M21.75 9.79l.06-.06z" fill="url(#prefix__e)" />
</g>
<path
d="M23.45 7.29L4.64 26.88 22.17 9.37a5.14 5.14 0 001.28-2.08z"
style={{
mixBlendMode: 'screen',
}}
fill="url(#prefix__f)"
/>
</g>
</g>
</svg>
);
};

export default Logo;

+ 6
- 0
src/components/image.js Visa fil

@@ -0,0 +1,6 @@
import React from 'react';
import { Image as Img } from 'theme-ui';

export default function Image({ src, ...rest }) {
return <Img src={src} {...rest} />;
}

+ 26
- 0
src/components/input.js Visa fil

@@ -0,0 +1,26 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Input as InputField } from 'theme-ui';
import { rgba } from 'polished';

const Input = ({ ...props }) => {
return <InputField sx={styles.input} {...props} />;
};

export default Input;

const styles = {
input: {
backgroundColor: '#EFF3F7',
borderRadius: '5px',
fontFamily: 'body',
flexGrow: 1,
p: ['0 24px'],
height: 'auto',
minHeight: '60px',
width: 'auto',
'::placeholder': {
color: rgba('#02073E', 0.4),
},
},
};

+ 27
- 0
src/components/layout.js Visa fil

@@ -0,0 +1,27 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Flex } from 'theme-ui';
import React from 'react';
import Header from './header/header';
import Footer from './footer/footer';
export default function Layout({ children }) {
return (
<Flex
sx={{
minHeight: '100vh',
flexDirection: 'column',
justifyContent: 'space-between',
}}
>
<Header />
<main
sx={{
variant: 'layout.main',
}}
>
{children}
</main>
<Footer />
</Flex>
);
}

+ 61
- 0
src/components/link.js Visa fil

@@ -0,0 +1,61 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import NextLink from 'next/link';
import { jsx, Link as A } from 'theme-ui';
import { Link as MenuLink } from 'react-scroll';
import { HiOutlineChevronRight } from 'react-icons/hi';

export function NavLink({ path, label, children, ...rest }) {
return (
<MenuLink
to={path}
spy={true}
offset={-70}
smooth={true}
duration={500}
className="nav-item"
activeClass="active"
{...rest}
>
{label}
</MenuLink>
);
}

export function Link({ path, label, children, ...rest }) {
return (
<NextLink href={path}>
<A {...rest}>{children ? children : label}</A>
</NextLink>
);
}

export function LearnMore({ path, label, children, ...rest }) {
return (
<NextLink href={path}>
<A sx={styles.learnMore} {...rest}>
{label ?? 'Learn More'} <HiOutlineChevronRight />
</A>
</NextLink>
);
}

const styles = {
learnMore: {
color: 'link',
cursor: 'pointer',
fontSize: [1, 1, 1, 2],
fontWeight: 500,
display: 'inline-flex',
alignItems: 'center',
svg: {
transition: 'margin-left 0.3s ease-in-out 0s',
ml: '3px',
},
':hover': {
svg: {
ml: '5px',
},
},
},
};

+ 24
- 0
src/components/logo.js Visa fil

@@ -0,0 +1,24 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx } from 'theme-ui';
import { Link } from 'components/link';
import LogoSvg from 'components/icons/logo';

export default function Logo({ isSticky, footer, ...props }) {
return (
<Link path="/" sx={styles.logo} {...props}>
<LogoSvg />
</Link>
);
}
const styles = {
logo: {
alignItems: 'center',
cursor: 'pointer',
display: 'inline-flex',
svg: {
height: 'auto',
width: [128, null, '100%'],
},
},
};

+ 43
- 0
src/components/section-heading.js Visa fil

@@ -0,0 +1,43 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Heading, Text } from 'theme-ui';

const SectionHeading = ({ title, description, ...props }) => {
return (
<Box sx={styles.heading} {...props}>
<Heading sx={styles.title}>{title}</Heading>
<Text as="p" sx={styles.description}>
{description}
</Text>
</Box>
);
};

export default SectionHeading;

const styles = {
heading: {
textAlign: 'center',
maxWidth: 660,
margin: ['0 auto 60px'],
},
title: {
fontFamily: 'heading',
fontWeight: 700,
fontSize: [5, null, null, 26, null, 30, 9],
lineHeight: [1.33, 1.33, 1.48],
letterSpacing: ['-0.5px', null, null, null, null, null, '-1px'],
img: {
ml: ['15px'],
position: 'relative',
top: '8px',
},
},
description: {
color: 'heading',
fontSize: [1, null, null, 2],
lineHeight: [1.58, 1.58, 1.58, 2.2],
maxWidth: ['none', 'none', 'none', 'none', 490],
margin: '15px auto 0',
},
};

+ 58
- 0
src/components/seo.js Visa fil

@@ -0,0 +1,58 @@
import React from 'react';
import Head from 'next/head';

export default function SEO({
description = 'startup landing descriptions',
author = 'RedQ, Inc',
meta,
title = 'startup landing title',
}) {
const metaData = [
{
name: `description`,
content: description,
},
{
property: `og:title`,
content: title,
},
{
property: `og:description`,
content: description,
},
{
property: `og:type`,
content: `website`,
},
{
name: `twitter:card`,
content: `summary`,
},
{
name: `twitter:creator`,
content: author,
},
{
name: `twitter:title`,
content: title,
},
{
name: `twitter:description`,
content: description,
},
].concat(meta);
return (
<Head>
<title>{title}</title>
{metaData.map(({ name, content }, i) => (
<meta key={i} name={name} content={content} />
))}
</Head>
);
}

SEO.defaultProps = {
lang: `en`,
meta: [],
description: ``,
};

+ 3
- 0
src/contexts/drawer/drawer-context.js Visa fil

@@ -0,0 +1,3 @@
import { createContext } from 'react';

export const DrawerContext = createContext({});

+ 25
- 0
src/contexts/drawer/drawer-provider.js Visa fil

@@ -0,0 +1,25 @@
import React, { useReducer } from 'react';
import { DrawerContext } from './drawer-context';
const initialState = {
isOpen: false,
};

function reducer(state, action) {
switch (action.type) {
case 'TOGGLE':
return {
...state,
isOpen: !state.isOpen,
};
default:
return state;
}
}
export const DrawerProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<DrawerContext.Provider value={{ state, dispatch }}>
{children}
</DrawerContext.Provider>
);
};

+ 16
- 0
src/pages/_app.js Visa fil

@@ -0,0 +1,16 @@
import { useEffect } from 'react';
import Router from 'next/router';
import { initGA, logPageView } from 'analytics';
import 'rc-tabs/assets/index.css';
import 'swiper/swiper-bundle.min.css';
import 'rc-drawer/assets/index.css';

export default function CustomApp({ Component, pageProps }) {
useEffect(() => {
initGA();
logPageView();
Router.events.on('routeChangeComplete', logPageView);
}, []);

return <Component {...pageProps} />;
}

+ 27
- 0
src/pages/_document.js Visa fil

@@ -0,0 +1,27 @@
import Document, { Html, Head, Main, NextScript } from 'next/document';

class CustomDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx);
return { ...initialProps };
}

render() {
return (
<Html lang="en-US">
<Head>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=B612:ital,wght@0,400;0,700;1,400;1,700&family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap"
/>
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}

export default CustomDocument;

+ 32
- 0
src/pages/index.js Visa fil

@@ -0,0 +1,32 @@
import { ThemeProvider } from 'theme-ui';
import theme from 'theme';
import SEO from 'components/seo';
import Layout from 'components/layout';
import Banner from 'sections/home';
import Services from 'sections/services';
import Testimonials from 'sections/business-partner';
import OurTeam from 'sections/our-team';
import OtherServices from 'sections/core-value';
import WhyUs from 'sections/why-us';
import SubscribeUs from 'sections/subscribe-us';
import Blog from 'sections/blog';

export default function IndexPage() {
return (
<ThemeProvider theme={theme}>
<Layout>
<SEO
title="Thamrin Group"
/>
<Banner />
<OtherServices />
<Testimonials />
{/* <Services /> */}
<OurTeam />
<WhyUs />
<Blog />
{/* <SubscribeUs /> */}
</Layout>
</ThemeProvider>
);
}

+ 87
- 0
src/sections/blog.js Visa fil

@@ -0,0 +1,87 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container } from 'theme-ui';
import Masonry from 'react-masonry-component';
import SectionHeading from 'components/section-heading';
import BlogPost from 'components/cards/blog-post';
import thumb1 from 'assets/images/blog/1.png';
import thumb2 from 'assets/images/blog/2.png';
import thumb3 from 'assets/images/blog/3.png';
import thumb4 from 'assets/images/blog/4.png';

const data = [
{
id: 1,
slug: '#how-to',
thumbnail: thumb1,
showDescription: true,
title: `How to work with prototype design with adobe xd featuring tools`,
description: `The 2019 Innovation by Design Awards honor the designers and businesses solving the problems of today and tomorrow. It is one of the most sought-after design`,
},
{
id: 2,
slug: '#how-to',
thumbnail: null,
showDescription: false,
title: `Anti bias receives honorable gift mention at Fast Company’s most Innovation by Design Awards`,
description: `The 2019 Innovation by Design Awards honor the designers and businesses solving the problems of today and tomorrow. It is one of the most sought-after design`,
},
{
id: 3,
slug: '#how-to',
thumbnail: thumb3,
showDescription: false,
title: `Multiple task wireframing with team management perform better`,
description: `The 2019 Innovation by Design Awards honor the designers and businesses solving the problems of today and tomorrow. It is one of the most sought-after design`,
},
{
id: 4,
slug: '#how-to',
thumbnail: thumb2,
showDescription: true,
title: `Multiple art board prototype with Figma`,
description: `Beyond launched anti bias, a Chrome extension that replaces LinkedIn profile photos`,
},
{
id: 5,
slug: '#how-to',
thumbnail: thumb4,
showDescription: false,
title: `Team presentation with latest user interface & experience reach more`,
description: `The 2019 Innovation by Design Awards honor the designers and businesses solving the problems of today and tomorrow. It is one of the most sought-after design`,
},
];

const masonryOptions = { originTop: true };

const Blog = () => {
return (
<Box as="section" id="blog" sx={styles.section}>
<Container>
<SectionHeading
sx={styles.heading}
title="Popular blog post we update everyday"
description="Focus only on the meaning, we take care of the design. As soon as the meeting end you can export in one click."
/>
<Masonry options={masonryOptions} sx={styles.postContainer}>
{data?.map((post) => (
<BlogPost key={post.id} post={post} />
))}
</Masonry>
</Container>
</Box>
);
};

export default Blog;

const styles = {
section: {
pt: [8, null, null, 9, null, 11],
pb: [8, null, null, 9, null, 11],
position: 'relative',
},
heading: {
mb: [6, 6, 7, 11],
},
};

+ 124
- 0
src/sections/business-partner.js Visa fil

@@ -0,0 +1,124 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container, Image, Text } from 'theme-ui';
import SectionHeading from 'components/section-heading';
import Tabs, { TabPane } from 'rc-tabs';
import { rgba } from 'polished';
import quote from 'assets/images/icons/quote.png';
import yamaha from 'assets/images/logos/yamaha.png';
import suzuki from 'assets/images/logos/suzuki.png';
import hino from 'assets/images/logos/hino.png';
import mercedes from 'assets/images/logos/mercedes.png';
import dribbble from 'assets/images/logos/dribbble.png';
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardActionArea from '@material-ui/core/CardActionArea';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import Paper from '@material-ui/core/Paper';
import Grid from '@material-ui/core/Grid';

const useStyles = makeStyles({
root: {
maxWidth: 600,
flexGrow: 1,
},
});

const Testimonials = () => {
const classes = useStyles();
return (
<Box as="section" id="testimonials" sx={styles.section}>
<Container>
<SectionHeading
sx={styles.heading}
title="Our Business Partner"
/>
</Container>
</Box>
);
};

export default Testimonials;
const styles = {
section: {
backgroundColor: rgba('#FFF5ED', 0.5),
pt: [7, null, null, 9, null, 10, 11],
pb: [9, null, null, 10, 11],
},
tabs: {
border: 0,
flexDirection: ['column-reverse', null, null, null, null, 'column'],
'.rc-tabs-nav': {
mt: [8, null, null, 9, 11],
},
'.rc-tabs-nav-wrap': {
borderTop: `1px solid ${rgba('#01070D', 0.1)}`,
justifyContent: 'center',
},
'.rc-tabs-tab': {
backgroundColor: 'transparent',
// m: ['0 45px'],
},
'.rc-tabs-tab-btn': {
display: 'flex',
alignItems: 'center',
lineHeight: 1,
outline: 0,
img: {
outline: 0,
maxWidth: [50, 65, null, 110, '80%', '100%'],
m: ['0 auto'],
},
},
'.rc-tabs-nav-list': {
flexGrow: 1,
justifyContent: 'space-evenly',
pt: [4, null, null, 7, 9],
},
'.rc-tabs-tabpane': {
outline: 0,
blockquote: {
fontFamily: 'heading',
fontWeight: 400,
fontSize: [2, null, null, 3, 4, 6],
lineHeight: [1.87, null, null, 2.08],
position: 'relative',
maxWidth: 846,
margin: '0px auto',
pt: ['12px', null, null, '17px', '13px'],
pl: [35, 35, 35, 10, 11],
':before': {
background: `url(${quote}) no-repeat`,
content: `''`,
position: 'absolute',
width: 128,
height: 43,
left: ['-31px', null, null, '-16px', '-7px', 0],
top: ['1px', '1px', '1px', 0],
backgroundSize: ['75%', null, null, '100%'],
},
},
span: {
color: '#7E8896',
fontFamily: 'body',
display: 'flex',
fontWeight: 500,
fontSize: [0, 1, 1, 2],
lineHeight: 2.5,
mt: [1, null, null, 3],
},
},
'.rc-tabs-ink-bar': {
top: 0,
height: 2,
backgroundColor: '#A17857',
borderRadius: 5,
},
},
};

+ 88
- 0
src/sections/core-value.js Visa fil

@@ -0,0 +1,88 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container } from 'theme-ui';
import SectionHeading from 'components/section-heading';
import Service from 'components/cards/service';
import core1 from 'assets/images/icons/core1.png';
import core2 from 'assets/images/icons/core2.png';
import core3 from 'assets/images/icons/core3.png';
import core4 from 'assets/images/icons/core4.png';
import core5 from 'assets/images/icons/core5.png';

const data = [
{
id: 1,
icon: core1,
title: 'INTEGRITY',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 2,
icon: core2,
title: 'CUSTOMER FOCUS',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 3,
icon: core3,
title: 'COMMUNICATION',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 4,
icon: core4,
title: 'CONTINUOUS IMPROVEMENT',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 6,
icon: core5,
title: 'TEAMWORK',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
];

const OtherServices = () => {
return (
<Box as="section" sx={styles.section}>
<Container>
<SectionHeading
sx={styles.heading}
title="Core Value Thamrin Group"
/>
<Box sx={styles.contentWrapper}>
{data?.map((item) => (
<Service key={item.id} item={item} />
))}
</Box>
</Container>
</Box>
);
};
export default OtherServices;

const styles = {
section: {
backgroundColor: '#F9FAFC',
pt: [9, 9, 9, 11],
pb: [9, 9, 9, 12, 12, 14],
},
heading: {
mb: [6, null, null, 8, 9, null, 13],
p: {
maxWidth: 500,
margin: '10px auto 0',
},
},
contentWrapper: {
gap: ['30px 30px', '30px 30px', '30px 30px', '80px 30px'],
display: 'grid',
justifyContent: ['center', 'center', 'center', 'unset'],
gridTemplateColumns: [
'repeat(1, 285px)',
'repeat(1, 325px)',
'repeat(1, 285px)',
'repeat(3, 1fr)',
],
},
};

+ 79
- 0
src/sections/home.js Visa fil

@@ -0,0 +1,79 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container, Button, Image } from 'theme-ui';
import { rgba } from 'polished';
import SectionHeading from 'components/section-heading';
import illustration from 'assets/images/welcome.png';

const Banner = () => {
return (
<Box as="section" id="home" sx={styles.section}>
<Container style={{width:"1700px"}}>
<Box sx={styles.contentWrapper}>
<SectionHeading
sx={styles.heading}
title="Selamat Datang di Thamrin Group"
/>
<Box as="figure" sx={styles.illustration}>
<Image src={illustration} alt="illustration"/>
</Box>
</Box>
</Container>
</Box>
);
};

export default Banner;

const styles = {
section: {
position: 'relative',
pt: [105, null, null, 140, 15, null, 170],
pb: [8, null, null, 0],
zIndex: 0,
':before': {
backgroundColor: rgba('#FFF5ED', 0.5),
content: ['none', null, null, `''`],
position: 'absolute',
left: 0,
right: 0,
bottom: 0,
height: 72,
zIndex: -1,
},
},
contentWrapper: {
display: 'flex',
alignItems: 'center',
flexDirection: 'column',
justifyContent: 'flex-end',
},
heading: {
mb: [30],
maxWidth: [null, null, null, 500, 560, 730],
h2: {
fontSize: [8, null, null, 8, 9, 10, 11],
lineHeight: [1.57],
},
p: {
fontSize: [1, null, null, 3],
lineHeight: [1.87, null, null, 2.33],
},
},
illustration: {
display: ['block', null, null, 'flex'],
position: 'relative',
img: {
display: ['none', null, null, 'block'],
maxWidth: ['90%'],
m: ['0 auto'],
},
},
buttonWrapper: {
textAlign: ['center'],
position: ['static', null, null, 'absolute'],
left: '50%',
top: 0,
transform: ['unset', null, null, 'translateX(-50%)'],
},
};

+ 322
- 0
src/sections/our-team.js Visa fil

@@ -0,0 +1,322 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { useRef, useState, useEffect } from 'react';
import { jsx, Box, Container, Image } from 'theme-ui';
import SwiperCore, { Navigation, Pagination } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/react';
import SectionHeading from 'components/section-heading';
import TeamMember from 'components/cards/team-member';

import avatar1 from 'assets/images/team/member1.png';
import avatar2 from 'assets/images/team/member2.png';
import avatar3 from 'assets/images/team/member3.png';
import avatar4 from 'assets/images/team/member4.png';
import arrowRight from 'assets/images/icons/arrow-right.png';

SwiperCore.use([Navigation, Pagination]);

const data = [
{
id: 1,
avatar: avatar1,
name: 'Emmalee Mclain',
designation: 'Product Designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
{
id: 2,
avatar: avatar2,
name: 'Daisy Morgan',
designation: 'Lead developer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
{
id: 3,
avatar: avatar3,
name: 'Ariyanna Hicks',
designation: 'Experience Designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
],
},
{
id: 4,
avatar: avatar4,
name: 'Yamilet Hooker',
designation: 'User interface designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
{
id: 5,
avatar: avatar1,
name: 'Emmalee Mclain',
designation: 'Product Designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
{
id: 6,
avatar: avatar2,
name: 'Daisy Morgan',
designation: 'Lead developer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
{
id: 7,
avatar: avatar3,
name: 'Ariyanna Hicks',
designation: 'Experience Designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
],
},
{
id: 8,
avatar: avatar4,
name: 'Yamilet Hooker',
designation: 'User interface designer',
socialLinks: [
{
name: 'twitter',
link: 'http://twitter.com',
},
{
name: 'github',
link: 'http://github.com',
},
{
name: 'dribbble',
link: 'http://dribbble.com',
},
],
},
];

const OurTeam = () => {
const swiperRef = useRef(null);
const containerRef = useRef(null);
const [currentIndex, setCurrentIndex] = useState(0);
const [containerOffset, setContainerOffset] = useState({
left: null,
top: null,
});

const isEnd = swiperRef?.current?.swiper?.isEnd;

const handlePrev = () => {
swiperRef?.current?.swiper?.slidePrev();
setInterval(() => {
setCurrentIndex(swiperRef?.current?.swiper?.activeIndex);
}, 100);

clearInterval();
};
const handleNext = () => {
swiperRef?.current?.swiper?.slideNext();
setInterval(() => {
setCurrentIndex(swiperRef?.current?.swiper?.activeIndex);
}, 100);

clearInterval();
};

useEffect(() => {
setContainerOffset({
left: containerRef.current.offsetLeft,
top: containerRef.current.offsetTop,
});
}, [containerRef]);

const breakpoints = {
0: {
slidesPerView: 1,
spaceBetween: 0,
},
768: {
slidesPerView: 3,
spaceBetween: 30,
},
1024: {
slidesPerView: 4,
spaceBetween: 30,
},
1601: {
slidesPerView: 5,
spaceBetween: 30,
},
};

return (
<Box as="section" id="team" sx={styles.section}>
<Container ref={containerRef}>
<SectionHeading
sx={styles.heading}
title="Thamrin Group Founder"
// description="Build an incredible workplace and grow your business with Gusto’s all-in-one platform with amazing contents."
/>
</Container>
<Box
sx={{
ml: currentIndex === 0 ? containerOffset?.left : 0,
...styles.teamWrapper,
}}
>
{currentIndex !== 0 && (
<button
onClick={handlePrev}
className="swiper-arrow swiper-arrow-left"
>
<Image src={arrowRight} alt="arrow left" />
</button>
)}
{!isEnd && (
<button
className="swiper-arrow swiper-arrow-right"
onClick={handleNext}
>
<Image src={arrowRight} alt="arrow right" />
</button>
)}

<Swiper
ref={swiperRef}
spaceBetween={30}
watchSlidesVisibility={true}
slidesPerView={5}
breakpoints={breakpoints}
>
{data?.map((item) => (
<SwiperSlide key={item.id}>
<TeamMember member={item} />
</SwiperSlide>
))}
</Swiper>
</Box>
</Box>
);
};

export default OurTeam;

const styles = {
section: {
pt: [11],
pb: [11, null, null, 12, null, 14],
},
heading: {
p: {
maxWidth: 500,
m: '10px auto 0',
},
},
teamWrapper: {
position: 'relative',
pl: [6],
pr: [6, null, null, 0],
transition: '0.3s ease-in-out 0s',
'.swiper-arrow': {
backgroundColor: '#fff',
border: 0,
cursor: 'pointer',
padding: 0,
display: 'flex',
width: [30, null, null, null, 40, 60],
height: [30, null, null, null, 40, 60],
alignItems: 'center',
justifyContent: 'center',
boxShadow: '0px 7px 14px rgba(25, 60, 101, 0.06)',
borderRadius: '50%',
position: 'absolute',
zIndex: 2,
top: 'calc(50% - 40px)',
transform: 'translateY(-50%)',
outline: 0,
img: {
maxWidth: [8, 10, null, null, '100%'],
},
},
'.swiper-arrow-left': {
left: [3, null, null, null, 20, 50],
img: {
transform: 'rotate(180deg)',
marginLeft: '-4px',
},
},
'.swiper-arrow-right': {
right: [3, null, null, null, 20, 50],
img: {
marginRight: '-4px',
},
},
},
};

+ 74
- 0
src/sections/services.js Visa fil

@@ -0,0 +1,74 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container } from 'theme-ui';
import { rgba } from 'polished';
import SectionHeading from 'components/section-heading';
import Service from 'components/cards/service';
import icon1 from 'assets/images/icons/service1.png';
import icon2 from 'assets/images/icons/service2.png';
import icon3 from 'assets/images/icons/service3.png';

const data = [
{
id: 1,
icon: icon1,
title: 'Marketing & advertising',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 3,
icon: icon2,
title: 'Ultimate development',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
{
id: 4,
icon: icon3,
title: 'Business Enterprise',
description: `Get your info tests delivered at home collect a sample from the your progress tests.`,
},
];

const Services = () => {
return (
<Box as="section" id="services" sx={styles.section}>
<Container>
<SectionHeading
sx={styles.heading}
title="Grow your startup with our Service"
description="Build an incredible workplace and grow your business with Gusto’s all-in-one platform with amazing contents."
/>
<Box sx={styles.contentWrapper}>
{data?.map((item) => (
<Service key={item.id} item={item} />
))}
</Box>
</Container>
</Box>
);
};

export default Services;

const styles = {
section: {
backgroundColor: rgba('#FFF5ED', 0.5),
pt: [11, 11, 11, 12, 12, 12, 14],
pb: [7, 7, 7, 9, 9, 10, 11],
},
heading: {
maxWidth: [null, null, null, 455, 660],
mb: [6, null, null, 8, null, 9, 13],
},
contentWrapper: {
gap: 30,
display: 'grid',
justifyContent: ['center', null, null, 'unset'],
gridTemplateColumns: [
'repeat(1, 285px)',
'repeat(1, 325px)',
'repeat(1, 285px)',
'repeat(3, 1fr)',
],
},
};

+ 143
- 0
src/sections/subscribe-us.js Visa fil

@@ -0,0 +1,143 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { useState, useCallback } from 'react';
import { jsx, Box, Container, Button, Flex, Checkbox, Label } from 'theme-ui';
import { rgba } from 'polished';
import SectionHeading from 'components/section-heading';
import Input from 'components/input';
import illustration from 'assets/images/subscribe-bg.png';

const SubscribeUs = () => {
const [checked, setChecked] = useState(false);

const handleSubmit = (e) => {
e.preventDefault();
console.log('submitted.');
};

const handleCheckbox = useCallback(() => {
setChecked(!checked);
}, [checked]);

return (
<Box as="section" sx={styles.section} variant="section.subscribe">
<Container>
<Box sx={styles.contentWrapper}>
<SectionHeading
sx={styles.heading}
title="Like our service? Subscribe us"
description="We have more than thousand of creative entrepreneurs and stat joining our business"
/>
<Box as="form" sx={styles.subscribe} onSubmit={handleSubmit}>
<Flex sx={styles.inputGroup}>
<Label htmlFor="email" variant="styles.srOnly">
Email
</Label>
<Input
id="email"
type="email"
className="email-input"
placeholder="Enter Email address"
/>
<Button variant="secondary">Subscribe</Button>
</Flex>
<Box sx={styles.checkbox}>
<Label htmlFor="no_spam" className={checked ? 'checked' : ''}>
<Checkbox
id="no_spam"
onChange={handleCheckbox}
defaultChecked={checked}
/>
Don’t provide any promotional message.
</Label>
{/* <Checkbox
id="no_spam"
checked={checked}
onChange={handleCheckbox}
label="Don’t provide any promotional message."
/> */}
</Box>
</Box>
</Box>
</Container>
</Box>
);
};

export default SubscribeUs;

const styles = {
section: {
background: [
'none',
null,
null,
`#F8F0EA url(${illustration}) no-repeat center bottom / contain`,
],
pt: [8, null, null, null, 10],
pb: [8, null, null, 9, 11],
},
contentWrapper: {
backgroundColor: '#fff',
borderRadius: 15,
p: [null, null, null, '40px 110px 50px', '50px 50px', '40px'],
gap: '50px',
display: ['block', null, 'grid', 'block', 'grid'],
alignItems: 'center',
gridTemplateColumns: ['repeat(2, 1fr)'],
},
heading: {
textAlign: ['center', null, 'left', 'center', 'left'],
mb: ['30px', null, null, null, 0],
ml: 0,
h2: {
fontSize: [6, null, null, null, null, 8, 9],
},
p: {
lineHeight: 1.87,
marginTop: 1,
ml: ['auto', null, null, null, 0],
mr: ['auto', null, null, null, 0],
maxWidth: 420,
},
},
subscribe: {
'.email-input': {
mr: [0, null, null, '15px'],
minHeight: ['50px', '50px', '60px'],
},
button: {
minHeight: ['50px', '50px', '60px'],
fontSize: ['14px', '14px', '16px'],
mt: ['15px', null, null, 0],
},
},
inputGroup: {
flexDirection: ['column', null, null, 'row'],
},
checkbox: {
mt: ['24px'],
label: {
display: 'flex',
alignItems: 'center',
cursor: 'pointer',
fontSize: '14px',
fontWeight: 400,
lineHeight: 1.14,
color: rgba('#9095AD', 0.9),
zIndex: 10,
svg: {
path: {
fill: '#EFF3F7',
},
},
'&.checked': {
svg: {
path: {
fill: 'primary',
},
},
},
},
},
};

+ 191
- 0
src/sections/why-us.js Visa fil

@@ -0,0 +1,191 @@
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx, Box, Container, Heading, Text, Image } from 'theme-ui';
import Tabs, { TabPane } from 'rc-tabs';
import { RiCheckboxCircleFill } from 'react-icons/ri';
import { rgba } from 'polished';
import { LearnMore } from 'components/link';
import tabImage1 from 'assets/images/tab-illustration-1.png';

const data = [
{
id: 1,
tabTitle: 'Why you choose our service?',
title: `We will turn your idea in the successful business model framework`,
description: `Get your tests delivered at let home collect sample from the victory of the managements that supplies best design system guidelines ever.`,
moreLink: '#explore-more',
image: tabImage1,
list: [
'Medical and vision',
'Life insurance',
'HSAs and FSAs',
'Commuter benefits',
],
},
{
id: 2,
tabTitle: 'What’s our business promise?',
title: `We will turn your idea in the successful business model framework`,
description: `Get your tests delivered at let home collect sample from the victory of the managements that supplies best design system guidelines ever.`,
moreLink: '#explore-more',
image: tabImage1,
list: [
'Medical and vision',
'Life insurance',
'HSAs and FSAs',
'Commuter benefits',
],
},
{
id: 3,
tabTitle: 'What’s our role model plan?',
title: `We will turn your idea in the successful business model framework`,
description: `Get your tests delivered at let home collect sample from the victory of the managements that supplies best design system guidelines ever.`,
moreLink: '#explore-more',
image: tabImage1,
list: [
'Medical and vision',
'Life insurance',
'HSAs and FSAs',
'Commuter benefits',
],
},
];

const WhyUs = () => {
return (
<Box as="section" id="why-us" sx={styles.section}>
<Container>
<Tabs sx={styles.tabs} animated={{ tabPane: true }}>
{data?.map((item) => (
<TabPane
key={item.id}
tab={<Heading as="h4">{item.tabTitle}</Heading>}
>
<Box>
<Heading>{item.title}</Heading>
<Text as="p" sx={styles.description}>
{item.description}
</Text>
<Box sx={styles.list}>
{item.list.map((item, i) => (
<Box key={i} className="list-item">
<RiCheckboxCircleFill
color="#3FDBB1"
size="20px"
sx={{ mr: 2 }}
/>
<span>{item}</span>
</Box>
))}
</Box>
<Box sx={styles.learnMore}>
<LearnMore path={item.moreLink} label="Explore more" />
</Box>
</Box>
<Box sx={styles.illustration}>
<Image src={item.image} alt="illustration" />
</Box>
</TabPane>
))}
</Tabs>
</Container>
</Box>
);
};

export default WhyUs;

const styles = {
section: {
pt: [11, null, null, 12],
pb: [8, null, null, 9, null, 11],
},
tabs: {
border: 0,
'.rc-tabs-nav': {
mb: [8, null, null, 9, 10, 9, 12],
},
'.rc-tabs-nav-wrap': {
borderBottom: `1px solid ${rgba('#01070D', 0.1)}`,
justifyContent: 'center',
},
'.rc-tabs-nav-list': {
flexGrow: 1,
justifyContent: 'space-evenly',
pb: [3, null, null, 5, null, 6],
},
'.rc-tabs-tab-btn': {
outline: 0,
alignItems: 'center',
img: {
outline: 0,
},
},
'.rc-tabs-tab': {
backgroundColor: 'transparent',
// m: ['0 45px'],
h4: {
fontFamily: 'body',
fontSize: [0, null, null, 17, null, null, 4],
fontWeight: 700,
lineHeight: 1.5,
textAlign: ['center', null, null, null, 'left'],
whiteSpace: ['break-spaces', null, null, null, 'unset'],
},
},
'.rc-tabs-tabpane': {
display: ['flex', null, null, 'grid'],
flexDirection: ['column-reverse', null, null, 'unset'],
alignItems: 'center',
justifyContent: 'center',
gridTemplateColumns: [null, null, null, '0.9fr 1.1fr'],
outline: 0,
gap: [5, null, null, 11],
h2: {
color: 'heading',
fontSize: [24, null, null, 6, 26, 8, 40],
fontWeight: 700,
lineHeight: [1.45, null, null, 1.5],
letterSpacing: [null, null, null, '0.5px', null, '-1px'],
textAlign: ['center', null, null, 'left'],
},
p: {
color: 'textSecondary',
fontSize: [1, null, null, 2, 17],
lineHeight: [1.87, null, null, 2, 2.48],
textAlign: ['center', null, null, 'left'],
mt: [4],
},
'.list-item': {
fontSize: [0, null, null, 1, 2],
fontWeight: 500,
lineHeight: [2.8],
display: 'flex',
alignItems: 'center',
},
},
},
list: {
mt: [5],
display: 'grid',
justifyContent: ['center', null, null, 'unset'],
gridTemplateColumns: ['repeat(2, 164px)', null, null, 'repeat(2, 180px)'],
},
learnMore: {
mt: [4],
textAlign: ['center', null, null, 'left'],
a: {
fontSize: [null, null, null, 1, 2],
},
},
illustration: {
display: ['flex'],
alignItems: 'center',
justifyContent: 'center',
textAlign: [null, null, null, null, null, 'center'],
img: {
maxWidth: ['65%', null, null, '100%', null, '90%', '100%'],
},
},
};

+ 339
- 0
src/theme/index.js Visa fil

@@ -0,0 +1,339 @@
export default {
// example colors with dark mode
colors: {
text: '#343D48', // body color and primary color
textSecondary: '#02073E', // secondary body color
heading: '#0F2137', // primary heading color
headingSecondary: '#343D48', // heading color
background: '#FFFFFF', // body background color
backgroundSecondary: '#F9FBFD', // secondary background color
borderColor: '#F3F4F5', // border color
primary: '#0A8080', // primary button and link color
secondary: '#DB4A87', // secondary color - can be used for hover states
muted: '#7B8188', // muted color
accent: '#609', // a contrast color for emphasizing UI
dark: '#10132D',
link: '#4F96FF', // default link color

// highlight a background color for highlighting text
modes: {
dark: {
text: '#fff',
background: '#000',
primary: '#0cf',
secondary: '#09c',
muted: '#111',
},
},
},
fonts: {
body: 'DM Sans',
// body:
// 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif',
heading: 'B612, sans-serif',
monospace: 'Menlo, monospace',
},
fontSizes: [
12, // 0
14, // 1
16, // 2
18, // 3
20, // 4
22, // 5
24, // 6
28, // 7
32, // 8
36, // 9
42, // 10
48, // 11
52, // 12
64, //13
],
fontWeights: {
body: 'normal',
// body: 400,
heading: 500,
// heading: 700,
bold: 700,
},
lineHeights: {
body: 1.5,
// body: 1.5,
heading: 1.25,
// heading: 1.125,
},
letterSpacings: {
body: 'normal',
caps: '0.2em',
heading: '-0.5px',
},
space: [
0, //0
5, //1
10, //2
15, //3
20, //4
25, //5
30, //6
40, //7
50, //8
60, //9
70, //10
80, //11
100, //12
120, //13
130, //14
150, //15
],
sizes: {},
breakpoints: [
'480px',
'640px',
'768px',
'1024px',
'1200px',
'1367px',
'1440px',
'1600px',
],
// variants can use custom, user-defined names
layout: {
container: {
maxWidth: ['100%', null, null, null, '970px', '1140px', '1260px'],
paddingLeft: [3, 6],
paddingRight: [3, 6],
m: '0 auto',
},
toolbar: {
display: 'flex',
alignItems: 'center',
// justifyContent: 'space-between',
},
main: {},
footer: {},
},
section: {
banner: {},
},
text: {
heading: {
fontFamily: 'heading',
lineHeight: 'heading',
fontWeight: 'heading',
},
heroTitle: {
fontSize: [4, null, null, 5, null, 5, 6],
fontWeight: 700,
letterSpacing: 'heading',
lineHeight: [1.4, null, null, null, null, null, 1.57],
},
},
links: {
bold: {
fontWeight: 'bold',
},
logo: {
display: 'inline-flex',
},
learnMore: {
display: 'inline-flex',
alignItems: 'center',
textDecoration: 'none',
fontWeight: 700,
color: 'primary',
},
nav: {
display: ['none', null, 'inline-flex'],
p: 2,
},
footer: {
display: 'flex',
px: 0,
color: 'inherit',
textDecoration: 'none',
fontSize: '14px',
lineHeight: 2.5,
},
},
images: {
avatar: {
width: 48,
height: 48,
borderRadius: 99999,
},
},
// variants for buttons
buttons: {
menu: {
display: ['block', null, null, null, 'none'],
svg: {
width: '32px',
},
},
default: {
backgroundColor: 'transparent',
fontFamily: 'body',
fontWeight: 'bold',
borderRadius: '5px',
cursor: 'pointer',
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
transition: '0.3s ease-in-out 0s',
whiteSpace: 'nowrap',
},
primary: {
variant: 'buttons.default',
color: 'white',
bg: 'primary',
minHeight: ['50px', null, null, null, null, '60px'],
padding: ['0 25px', null, null, '0 30px'],
'&:hover': {
bg: 'dark',
},
},
primaryMd: {
variant: 'buttons.primary',
minHeight: '50px',
px: '25px',
},
secondary: {
variant: 'buttons.primary',
color: 'white',
bg: 'secondary',
},
muted: {
variant: 'buttons.default',
backgroundColor: '#EDF0F2',
color: 'text',
':hover': {
backgroundColor: 'primary',
color: '#fff',
},
},
white: {
variant: 'buttons.default',
backgroundColor: 'white',
color: '#020718',
},
text: {
variant: 'buttons.default',
color: 'text',
},
},
cards: {
primary: {
padding: 2,
borderRadius: 4,
// boxShadow: '0 0 4px 1px rgba(0, 0, 0, 0.5)',
},
offer: {
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignItems: 'center',
flex: ['1 1 calc(50% - 16px)', '1 1 20%'],
minHeight: 130,
m: 2,
background: '#FFFFFF',
border: '1px solid #EDEFF6',
borderRadius: 5,
},
featureCard: {
display: 'flex',
alignItems: ['center', 'flex-start'],
flexDirection: ['column', 'row'],
p: [0, 3],
},
},
forms: {
label: {
fontSize: 1,
fontWeight: 'bold',
},
input: {
borderRadius: 8,
borderColor: 'borderColor',
height: 60,
'&:focus': {
borderColor: 'primary',
boxShadow: (t) => `0 0 0 2px ${t.colors.primary}`,
outline: 'none',
},
},
},

badges: {
primary: {
color: 'background',
bg: '#28A5FF',
borderRadius: 30,
p: '3px 11px',
fontSize: 1,
letterSpacing: '-0.5px',
},
outline: {
color: 'primary',
bg: 'transparent',
boxShadow: 'inset 0 0 0 1px',
},
},

styles: {
// To add base, top-level styles to the <body> element, use theme.styles.root.
root: {
fontFamily: 'body',
lineHeight: 'body',
fontWeight: 'body',
},
// h1-h6 Heading styles
h1: {
// fontFamily: 'none',
// variant: 'text.heading',
// fontSize: 6,
},
h2: {
// fontFamily: 'none',
// variant: 'text.heading',
// fontSize: 5,
},
h3: {
variant: 'text.heading',
fontSize: 4,
},
h4: {
variant: 'text.heading',
fontSize: 3,
},
h5: {
variant: 'text.heading',
fontSize: 2,
},
h6: {
variant: 'text.heading',
fontSize: 1,
},
// Divider styles
hr: {
border: 0,
borderBottom: '1px solid',
borderColor: '#D9E0E7',
},
// also you can use other HTML elements style here
ul: {
listStyle: 'none',
},
srOnly: {
border: '0 !important',
clip: 'rect(1px, 1px, 1px, 1px) !important',
clipPath: 'inset(50%) !important',
height: '1px !important',
margin: '-1px !important',
overflow: 'hidden !important',
padding: '0 !important',
position: 'absolute !important',
width: '1px !important',
whiteSpace: 'nowrap !important',
},
},
};

+ 7
- 0
vercel.json Visa fil

@@ -0,0 +1,7 @@
{
"build": {
"env": {

}
}
}

+ 6197
- 0
yarn.lock
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


Laddar…
Avbryt
Spara