Bladeren bron

finished

culture-page
Pavle Golubovic 2 jaren geleden
bovenliggende
commit
598518c8ae

+ 1
- 1
frontend/src/App.js Bestand weergeven

@@ -100,7 +100,7 @@ function App() {
<Route exact path="/portfolio" element={<Portfolio />} />
<Route exact path="/process" element={<ProcessPage />} />
<Route exact path="/careers" element={<Careers />}/>
{/* <Route exact path="/culture" element={<Culture />}/> */}
<Route exact path="/culture" element={<Culture />}/>
{/*<Route exact path="/diligentminds" element={<DiligentMinds />}/>
<Route exact path="/eventstimeline" element={<EventsTimeline />}/> */}
<Route exact path="/about" element={<About />}/>

+ 3
- 0
frontend/src/assets/graphics/Culture/BlueHex.svg Bestand weergeven

@@ -0,0 +1,3 @@
<svg width="119" height="115" viewBox="0 0 119 115" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.5292 105.699C30.9977 112.026 38.5865 115.38 46.2734 114.424L83.7221 109.768C91.047 108.858 97.3559 104.168 100.339 97.4167L116.571 60.6866C119.554 53.9351 118.774 46.1131 114.516 40.0839L92.7459 9.25927C88.2773 2.93212 80.6885 -0.421376 73.0017 0.534277L35.5529 5.19002C28.2281 6.10067 21.9191 10.7901 18.9356 17.5415L2.70448 54.2717C-0.278987 61.0231 0.501137 68.8452 4.75926 74.8743L26.5292 105.699Z" fill="#8568BF"/>
</svg>

+ 3
- 0
frontend/src/assets/graphics/Culture/PurpleHex.svg Bestand weergeven

@@ -0,0 +1,3 @@
<svg width="114" height="121" viewBox="0 0 114 121" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M56.9443 118.972C64.2234 121.621 72.3695 120.048 78.1387 114.879L106.245 89.6969C111.743 84.7714 114.25 77.3213 112.851 70.074L105.236 30.646C103.836 23.3986 98.7345 17.4183 91.7982 14.8942L56.3362 1.98951C49.0571 -0.659338 40.911 0.913951 35.1418 6.08284L7.03546 31.2646C1.53796 36.1901 -0.970008 43.6401 0.429684 50.8874L8.04452 90.3155C9.44421 97.5628 14.546 103.543 21.4823 106.067L56.9443 118.972Z" fill="#9A4798"/>
</svg>

+ 3
- 0
frontend/src/assets/graphics/Culture/TriangleYellow.svg Bestand weergeven

@@ -0,0 +1,3 @@
<svg width="106" height="108" viewBox="0 0 106 108" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.53564 48.3499C-0.229004 46.6889 0.00798671 42.6069 2.94627 41.2771L93.336 0.365944C95.8844 -0.787463 98.7993 0.964046 98.9773 3.75562L105.288 102.764C105.493 105.983 102.001 108.108 99.2364 106.448L2.53564 48.3499Z" fill="#FFA463"/>
</svg>

+ 22
- 0
frontend/src/assets/icons/Tick.svg Bestand weergeven

@@ -0,0 +1,22 @@
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d_1302_34243)">
<g clip-path="url(#clip0_1302_34243)">
<circle cx="13" cy="11.5" r="9.375" fill="#8C278F" stroke="#90278F" stroke-width="1.25"/>
</g>
</g>
<path d="M18.5917 7.50822C18.5142 7.43011 18.4221 7.36811 18.3205 7.32581C18.219 7.2835 18.11 7.26172 18 7.26172C17.89 7.26172 17.7811 7.2835 17.6796 7.32581C17.578 7.36811 17.4858 7.43011 17.4084 7.50822L11.2 13.7249L8.59171 11.1082C8.51127 11.0305 8.41632 10.9694 8.31227 10.9284C8.20823 10.8874 8.09713 10.8673 7.98531 10.8692C7.87349 10.8712 7.76315 10.8951 7.66058 10.9397C7.55802 10.9843 7.46524 11.0486 7.38754 11.1291C7.30984 11.2095 7.24875 11.3044 7.20774 11.4085C7.16674 11.5125 7.14663 11.6236 7.14856 11.7354C7.1505 11.8473 7.17444 11.9576 7.21902 12.0602C7.2636 12.1627 7.32794 12.2555 7.40837 12.3332L10.6084 15.5332C10.6858 15.6113 10.778 15.6733 10.8796 15.7156C10.9811 15.7579 11.09 15.7797 11.2 15.7797C11.3101 15.7797 11.419 15.7579 11.5205 15.7156C11.6221 15.6733 11.7142 15.6113 11.7917 15.5332L18.5917 8.73322C18.6763 8.65518 18.7438 8.56047 18.79 8.45506C18.8361 8.34964 18.86 8.2358 18.86 8.12072C18.86 8.00563 18.8361 7.8918 18.79 7.78638C18.7438 7.68096 18.6763 7.58625 18.5917 7.50822Z" fill="white"/>
<defs>
<filter id="filter0_d_1302_34243" x="0.5" y="0.25" width="25" height="25" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="1.25"/>
<feGaussianBlur stdDeviation="1.25"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1302_34243"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1302_34243" result="shape"/>
</filter>
<clipPath id="clip0_1302_34243">
<rect x="3" y="1.5" width="20" height="20" rx="10" fill="white"/>
</clipPath>
</defs>
</svg>

+ 2
- 2
frontend/src/components/blog-micro-components/H2.jsx Bestand weergeven

@@ -1,8 +1,8 @@
import React from 'react'

const H2 = ({data}) => {
const H2 = ({data, styleProps}) => {
return (
<h3 className="h3-heading font-semibold pt-8p pb-16p">{data}</h3>
<h3 className={"h3-heading font-semibold pt-8p pb-16p" + styleProps}>{data}</h3>
)
}


+ 2
- 2
frontend/src/components/blog-micro-components/H3.jsx Bestand weergeven

@@ -1,8 +1,8 @@
import React from 'react'

const H3 = ({data}) => {
const H3 = ({data, styleProps}) => {
return (
<h3 className="n-paragraph-title pb-8p">{data}</h3>
<h3 className={('n-paragraph-title pb-8p') + styleProps}>{data}</h3>
)
}


+ 2
- 2
frontend/src/components/blog-micro-components/Paragraph.jsx Bestand weergeven

@@ -1,8 +1,8 @@
import React from 'react'

const Paragraph = ({data}) => {
const Paragraph = ({data, styleProps}) => {
return (
<p className="paragraph pb-8p">{data}</p>
<p className={'paragraph pb-8p' + styleProps}>{data}</p>
)
}


+ 3
- 3
frontend/src/components/blog-micro-components/Quote.jsx Bestand weergeven

@@ -1,9 +1,9 @@
import React from 'react';

const Quote = ({data}) => {
const Quote = ({data, color, larger}) => {
return (
<blockquote className='p-4 my-4 border-l-4 border-gray-300 bg-gray-50 dark:border-gray-500 dark:bg-gray-800'>
<p className='text-xl italic font-medium leading-relaxed text-gray-900 dark:text-white'>
<blockquote className={('p-4 my-4 border-l-8') + (typeof color !== "undefined" ? " border-dg-primary-900 bg-white dark:border-gray-500 dark:bg-gray-800 text-dg-primary-600" : " border-gray-300 bg-gray-50 dark:border-gray-500 dark:bg-gray-800")}>
<p className={'italic text-xl font-medium leading-relaxed dark:text-white' + (typeof larger !== "undefined" ? " md:text-[32px]" : " md:text-xl")}>
"{data}"
</p>
</blockquote>

+ 34
- 0
frontend/src/components/shared/ActionCard_Array.jsx Bestand weergeven

@@ -0,0 +1,34 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';

const ActionCard_Array = ({ title, text, btn1, btn2, link1, link2 }) => {
const linkTo = useNavigate();

const handleLink = link => {
linkTo(link);
};

console.log(text);
return (
<div className="action-card px-64p py-72p flex flex-col justify-center items-center gap-48p">
<h2 className="heading text-center">{title}</h2>
{text &&
text.length > 0 &&
text.map((item, index) => (
<p key={index} className="block paragraph">
{item.field}
</p>
))}
<div className="flex flex-col-reverse md:flex-row gap-16p md:gap-72p justify-between w-fit">
<button className="btn-secondary" onClick={() => handleLink(link2)}>
{btn2}
</button>
<button className="btn-primary" onClick={() => handleLink(link1)}>
{btn1}
</button>
</div>
</div>
);
};

export default ActionCard_Array;

+ 3
- 2
frontend/src/layout/Wrapper.jsx Bestand weergeven

@@ -4,9 +4,9 @@ import PropTypes from 'prop-types'



const Wrapper = ({bg, padding ,children, hideOverflow}) => {
const Wrapper = ({bg, padding ,children, hideOverflow, gradient}) => {
return (
<div className={"w-full " + (bg ? "bg-baby-blue dark:bg-dg-primary-1600 h-fit" : "")+(padding)+(hideOverflow ? ' overflow-hidden' : '')}>
<div className={"w-full h-fit" + (bg ? "bg-baby-blue dark:bg-dg-primary-1600" : "")+(padding)+(hideOverflow ? ' overflow-hidden' : '') + (gradient ? " bg-gradient-to-r from-[#90278F] to-[#8468BF]" : "")}>
<div className="max-w-custom relative mx-auto px-16p">
{children}
</div>
@@ -16,6 +16,7 @@ const Wrapper = ({bg, padding ,children, hideOverflow}) => {
}
Wrapper.propTypes = {
bg: PropTypes.bool,
gradient: PropTypes.bool,
padding: PropTypes.string,
children: PropTypes.node,
}

+ 166
- 190
frontend/src/pages/Culture.jsx Bestand weergeven

@@ -22,89 +22,63 @@ import PageLayout from '../layout/PageLayout';
import TimelineCard from '../components/TimelineCard';
//import useAnalytics from '../hooks/useAnalytics';
import VideoComponent from '../components/shared/VideoComponent';

// eslint-disable-next-line no-underscore-dangle
const _data = {
heading: {
heading: 'Join Our Team of Diligent Minds',
subheading: 'Careers',
},
life: {
heading: 'A Culture That’s Serious About Work and Fun',
subheading: 'Diligent life',
italic: {
heading: 'Life At diligent',
paragraph:
'From the start, you can expect to be challenged and supported. We provide a encouraged atmosphere with knowledgeable mentors to help you advance in your career. To create an inspiring work life, we collaborate as a team both inside and outside of the office.',
heading2: 'What It Means to Work With Us',
},
cards: [
{
id: 1,
title: 'Shape the Future',
paragraph:
'We collaborate with business leaders and entrepreneurs to disrupt and push their industries forward. From startup ideas to enterprise-level product & software development, we work together as a team to transform our clients’ ideas into reality.',
},
{
id: 2,
title: 'Life-Long Learning',
paragraph:
'We believe that learning is a journey that never ends. With us, you will have the opportunity to continuously learn in an environment surrounded by other highly skilled professionals with decades of experience. Also, there are several chances for you to develop through the use of various technologies, involvement in the product definition process, conference attendance, and more.',
},
{
id: 3,
title: 'A Unique Culture',
paragraph:
'Everyone talks about a work-life balance, we do it - for two reasons. Firstly, we believe in an environment of happy people. Secondly, even if you’re highly productive, the only way to maintain productivity long-term is by taking time for the things that make you happy.',
},
{
id: 4,
title: 'Make the Impossible Better',
paragraph:
"If you have a mindset that is continuously focused on pushing through and beyond your boundaries, conquering a whole new challenge every day in an atmosphere where you constantly learn and improve, this is the place for you. We'd love to learn more about you.",
},
],
},
ActionCard: {
heading: 'Step up Your Career!',
paragraph:
'We are continuously on the lookout for talented people to grow our business.',
primaryBtn: 'Apply',
secondaryBtn: 'About Us',
},
};
import useAnalytics from '../hooks/useAnalytics';
import useDataApi from '../hooks/useDataApi';
import { strapiApiBuilder } from '../utils/strapiApiBuilder';
import ReactHelmet from './../components/shared/ReactHelmet';
import Paragraph from '../components/blog-micro-components/Paragraph';
import { ReactComponent as Tick } from '../assets/icons/Tick.svg';
import Quote from '../components/blog-micro-components/Quote';
import H3 from '../components/blog-micro-components/H3';
import ActionCard_Array from '../components/shared/ActionCard_Array';

import { ReactComponent as PurpleHex } from '../assets/graphics/Culture/PurpleHex.svg';
import { ReactComponent as BlueHex } from '../assets/graphics/Culture/BlueHex.svg';
import { ReactComponent as YellowTriangle } from '../assets/graphics/Culture/TriangleYellow.svg';
import H2 from '../components/blog-micro-components/H2';

const strapiPopulate = [
'Heading',
'HeadingParagraph',
'ParagraphArray',
'Cards',
'Cards.img',
'SecondHeading',
'SecondHeadingParagraph',
'Stats',
'Quote',
'WorkTogether',
'WorkTogether.paragraphs',
'SEO',
'SEO.metaSocial',
'SEO.metaImage',
'SEO.metaSocial.image',
];

const graphicArray = [
<PurpleHex key={0} className="z-0 scale-75 md:scale-1" />,
<YellowTriangle key={1} className="z-0 scale-75 md:scale-1" />,
<BlueHex key={0} className="z-0 scale-75 md:scale-1" />,
];

export default function Culture({ forwardedRef }) {
const [clickedPosition, setClickedPosition] = useState('');
const [cntCareers, setCntCareers] = useState('');
const [isLoaded, setIsLoaded] = useState('');
const [graphics, setGraphics] = useState([]);

const api_url = process.env.REACT_APP_API_URL;

const strapi = strapiApiBuilder('culture-page', strapiPopulate, '');

const [{ data, isLoading, isError }, doFetch] = useDataApi(strapi);

useAnalytics('Culture');

useEffect(() => {
document.title = 'Culture';
}, []);

//useAnalytics();

useEffect(async () => {
var vid = document.getElementById('animation');
vid.playbackRate = 2;
axios
.get(
`${api_url}/api/n-careerspage?populate[0]=heading&populate[1]=info&populate[2]=job.icon&populate[3]=Video`,
)
.then(res => {
setCntCareers(res.data.data.attributes);
setIsLoaded(true);
})
.catch(err => {
console.log(err);
setIsLoaded(false);
});
}, []);
//console.log(data);

if (!isLoaded) {
if (isLoading) {
return (
<div className="z-50 w-full h-screen bg-white dark:bg-dg-primary-1700 dark:text-white flex items-center justify-center text-3xl font-semibold">
<video id="animation" width="540" height="540" autoPlay muted loop>
@@ -117,130 +91,132 @@ export default function Culture({ forwardedRef }) {

return (
<PageLayout>
<div className="bg-white dark:bg-dg-primary-1700 w-full pt-90p overflow-hidden">
{/* Diligent Life */}
<Wrapper padding={' py-90p'}>
<PageTitle
left
heading={_data.life.heading}
subheading={_data.life.subheading}
/>

<div className="my-20p">
<div>
<p className="paragraph">{_data.life.italic.paragraph}</p>
{cntCareers && cntCareers.Video != undefined ? (
<VideoComponent source={cntCareers.Video.data.attributes.url} />
) : null}
</div>
</div>
</Wrapper>

{/* Left-Right Content */}
<Wrapper bg padding={' py-90p'}>
{/* Shape The Future */}
<section
id="challanges_solution"
className="flex flex-col items-center justify-center mt-16"
>
<div className="my-8 flex flex-col md:flex-row justify-center items-center w-full max-w-custom m-auto px-8 xl:px-0">
<div className="w-full md:w-1/2 md:pr-16">
<div>
<h3 className="h3-heading">{_data.life.cards[0].title}</h3>
<p className="text-sm text-dark-gray dark:text-white mt-4">
{_data.life.cards[0].paragraph}
</p>
</div>
</div>
<img
src={Img1}
alt="Case Study main image"
className="text-center w-full md:w-1/2"
/>
</div>
</section>

{/* Shape The Future */}
<section
id="challanges_solution"
className="flex flex-col items-center justify-center mt-16"
>
<div className="my-8 flex flex-col md:flex-row justify-center items-center w-full max-w-custom m-auto px-8 xl:px-0">
<img
src={Img2}
alt="Case Study main image"
className="text-center w-full md:w-1/2"
/>
<div className="w-full md:w-1/2 md:pl-16">
<div>
<h3 className="h3-heading">{_data.life.cards[1].title}</h3>
<p className="text-sm text-dark-gray dark:text-white mt-4">
{_data.life.cards[1].paragraph}
</p>
{/* {data && data.SEO ? <ReactHelmet seo={data.SEO} /> : null} */}
<div className="bg-white dark:bg-dg-primary-1700 w-full pt-32p md:pt-90p overflow-hidden">
{/* Our Philosophy */}
{data && data.Heading && data.HeadingParagraph && (
<Wrapper padding={' py-90p'}>
<PageTitle
left
heading={data?.Heading?.title}
subheading={data?.Heading?.subtitle}
/>
<Paragraph data={data.HeadingParagraph.field} />
</Wrapper>
)}
{/* Ticks */}
{data && data.ParagraphArray && data.ParagraphArray.length > 0 && (
<Wrapper padding={' md:py-32p'}>
<div className="md:px-90p flex flex-col md:grid md:grid-cols-2 gap-8p">
{data.ParagraphArray.map((item, index) => (
<div
key={index}
className="flex flex-row gap-2 justify-start items-center"
>
<Tick />
<h4 className="capitalize font-semibold text-[24px] md:text-[30px] leading-[36px] md:leading-[45px] text-transparent bg-clip-text bg-gradient-to-r from-[#90278F] to-[#8468BF]">{item.field}</h4>
</div>
</div>
))}
</div>
</section>

{/* Shape The Future */}
<section
id="challanges_solution"
className="flex flex-col items-center justify-center mt-16"
>
<div className="my-8 flex flex-col md:flex-row justify-center items-center w-full max-w-custom m-auto px-8 xl:px-0">
<div className="w-full md:w-1/2 md:pr-16">
<div>
<h3 className="h3-heading">{_data.life.cards[2].title}</h3>
<p className="text-sm text-dark-gray dark:text-white mt-4">
{_data.life.cards[2].paragraph}
</p>
</div>
</div>
<img
src={Img3}
alt="Case Study main image"
className="text-center w-full md:w-1/2"
/>
</Wrapper>
)}

{/* Cards */}
{data && data.Cards && (
<Wrapper padding={' py-90p'}>
<div id="values" className="flex flex-col items-center justify-center mt-16">
{data.Cards &&
data.Cards.length > 0 &&
data.Cards.map((item, i) => (
<div
key={i}
className={
'my-8 flex flex-col gap-[32px] md:gap-0 justify-center items-center w-full max-w-custom m-auto px-8 xl:px-0' +
(i % 2 ? ' md:flex-row' : ' md:flex-row-reverse')
}
>
<div className="w-full md:w-1/2 md:pr-16">
<div>
<h3 className="h3-heading">{item.title}</h3>
<p className="text-sm text-dark-gray dark:text-white mt-4">
{item.paragraph}
</p>
</div>
</div>
<img
src={api_url + item.img.data.attributes.url}
alt={item.img.data.attributes.alternativeText}
className="text-center w-full md:w-1/2"
/>
</div>
))}
</div>
</section>

{/* Shape The Future */}
<section
id="challanges_solution"
className="flex flex-col items-center justify-center mt-16"
>
<div className="my-8 flex flex-col md:flex-row justify-center items-center w-full max-w-custom m-auto px-8 xl:px-0">
<img
src={Img4}
alt="Case Study main image"
className="text-center w-full md:w-1/2"
/>
<div className="w-full md:w-1/2 md:pl-16">
<div>
<h3 className="h3-heading">{_data.life.cards[3].title}</h3>
<p className="text-sm text-dark-gray dark:text-white mt-4">
{_data.life.cards[3].paragraph}
</p>
</Wrapper>
)}

{/* Second Title */}
{data && data.Heading && data.HeadingParagraph && (
<Wrapper padding={' py-[32px] md:py-90p'}>
<PageTitle
left
heading={data?.SecondHeading?.title}
subheading={data?.SecondHeading?.subtitle}
/>
<Paragraph data={data.SecondHeadingParagraph.field} />
</Wrapper>
)}

{/* Quote */}
{data && data.SecondHeading && data.SecondHeadingParagraph && (
<Wrapper padding={' py-[16px] md:py-[64px]'}>
<Quote color larger data={data.Quote.field} />
</Wrapper>
)}

{/* Stats */}
{data && data.Stats && data.Stats.length > 0 && (
<Wrapper gradient padding={' py-[64px]'}>
<div className="flex flex-col gap-[64px] px-[16px] md:px-[64px] py-[32px]">
{data.Stats.map((item, index) => (
<div
key={index}
className="flex flex-row gap-[48px] items-center text-white"
>
<div className="relative">
<div className="absolute -left-[36px] -top-[24px] md:-left-8 md:-top-2 z-0">
{graphicArray.length > index
? graphicArray[index]
: graphicArray[index - 3]}
</div>
<H2
data={item.value}
styleProps={
' relative text-white capitalize text-[32px] leading-[38px] md:text-[64px] md:leading-[72px] z-[1000]'
}
/>
</div>
<H2 data={item.title} styleProps={' text-white capitalize text-[18px] md:text-[32px]'} />
</div>
</div>
))}
</div>
</section>
</Wrapper>
</Wrapper>
)}

{/* Action Card */}
<Wrapper>
<div className="my-90p">
<ActionCard
title={_data.ActionCard.heading}
text={_data.ActionCard.paragraph}
btn1={_data.ActionCard.primaryBtn}
btn2={_data.ActionCard.secondaryBtn}
link1={'/contact'}
link2={'/about'}
/>
</div>
</Wrapper>
{data && data.WorkTogether && (
<Wrapper>
<div className="my-90p">
<ActionCard_Array
title={data.WorkTogether.title}
text={data.WorkTogether.paragraphs}
btn1={data.WorkTogether.ButtonPrimary}
btn2={data.WorkTogether.ButtonSecondary}
link1={'/contact'}
link2={'/about'}
/>
</div>
</Wrapper>
)}
</div>
</PageLayout>
);

+ 8
- 7
frontend/src/routes.js Bestand weergeven

@@ -17,6 +17,7 @@ import EventsTimeline from "./pages/EventsTimeline";
import DiligentLife from "./pages/Culture";
import DiligentMinds from "./pages/DiligentMinds";
import Blog from './pages/Blog';
import Culture from "./pages/Culture";
const routes = [
{
path: '/',
@@ -89,13 +90,13 @@ const routes = [
nav:true,
drop: [
// {
// path:'/culture',
// component: <DiligentLife />,
// title: 'Culture',
// exact: true,
// nav:true,
// },
{
path:'/culture',
component: <Culture />,
title: 'Culture',
exact: true,
nav:true,
},
//enable after we add content
// {
// path:"/diligentminds",

Laden…
Annuleren
Opslaan