Compare commits
3 Commits
7abf14e9ae
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 03048b30b1 | |||
| 820a83feef | |||
| fbb210f083 |
1
.env.example
Normal file
1
.env.example
Normal file
@ -0,0 +1 @@
|
|||||||
|
LOCAL_PORT=3000
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -22,3 +22,5 @@ dist-ssr
|
|||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
|
.env
|
||||||
|
|||||||
12
Dockerfile
Normal file
12
Dockerfile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
FROM node:alpine AS build
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json ./
|
||||||
|
RUN npm install
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM nginx:alpine
|
||||||
|
COPY --from=build /app/dist /usr/share/nginx/html
|
||||||
|
COPY --from=build /app/nginx.conf /etc/nginx/conf.d/default.conf
|
||||||
|
EXPOSE 80
|
||||||
|
CMD [ "nginx", "-g", "daemon off;" ]
|
||||||
@ -1,6 +1,8 @@
|
|||||||
# BCDigital Code Challenge
|
# BCDigital Code Challenge
|
||||||
|
|
||||||
My submission to the code challenge from [BCDigial](https://www.bc-digital.ca/)
|
See the website at https://bcdigital-challenge.thingsnstuff.xyz/
|
||||||
|
|
||||||
|
My submission to the code challenge from [BC Digital](https://www.bc-digital.ca/) for the Frontend Developer position
|
||||||
|
|
||||||
Landing page for hypthetical client **Great Music LLM**'s event and employee management software
|
Landing page for hypthetical client **Great Music LLM**'s event and employee management software
|
||||||
|
|
||||||
@ -12,3 +14,4 @@ Landing page for hypthetical client **Great Music LLM**'s event and employee man
|
|||||||
- [`prettier`](https://prettier.io/) code formatting
|
- [`prettier`](https://prettier.io/) code formatting
|
||||||
- [`eslint`](https://eslint.org/) code linting
|
- [`eslint`](https://eslint.org/) code linting
|
||||||
- [`husky`](https://typicode.github.io/husky/) and [`lint-staged`](https://github.com/lint-staged/lint-staged) pre-commit hooks for testing/formatting/linting
|
- [`husky`](https://typicode.github.io/husky/) and [`lint-staged`](https://github.com/lint-staged/lint-staged) pre-commit hooks for testing/formatting/linting
|
||||||
|
- [Docker](https://www.docker.com/) containerization
|
||||||
|
|||||||
6
docker-compose.yml
Normal file
6
docker-compose.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
services:
|
||||||
|
nginx:
|
||||||
|
build: .
|
||||||
|
ports:
|
||||||
|
- "${LOCAL_PORT}:80"
|
||||||
|
restart: always
|
||||||
7
nginx.conf
Normal file
7
nginx.conf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
server {
|
||||||
|
location / {
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html index.htm;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
}
|
||||||
46
src/app.tsx
46
src/app.tsx
@ -20,14 +20,14 @@ export function App() {
|
|||||||
<div className="h-full text-white flex items-center justify-center backdrop-blur-[3px] backdrop-grayscale-50">
|
<div className="h-full text-white flex items-center justify-center backdrop-blur-[3px] backdrop-grayscale-50">
|
||||||
<div className="flex flex-col gap-16 items-center text-center">
|
<div className="flex flex-col gap-16 items-center text-center">
|
||||||
<div className="flex flex-col gap-4 items-center">
|
<div className="flex flex-col gap-4 items-center">
|
||||||
<h2 className="text-4xl font-bold">
|
<h2 className="text-4xl font-bold sm:text-6xl">
|
||||||
<AuroraText>Orchestral</AuroraText> Event Management
|
<AuroraText>Orchestral</AuroraText> Event Management
|
||||||
</h2>
|
</h2>
|
||||||
<TextAnimate
|
<TextAnimate
|
||||||
animation="blurInUp"
|
animation="blurInUp"
|
||||||
by="character"
|
by="character"
|
||||||
as="h3"
|
as="h3"
|
||||||
className="text-xl"
|
className="text-xl sm:text-3xl"
|
||||||
>
|
>
|
||||||
Without The Hassle
|
Without The Hassle
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
@ -36,12 +36,12 @@ export function App() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="relative overflow-hidden py-5 flex flex-col gap-5">
|
<div className="relative overflow-hidden py-5 flex flex-col gap-5 sm:py-10">
|
||||||
<TextAnimate
|
<TextAnimate
|
||||||
animation="blurInUp"
|
animation="blurInUp"
|
||||||
by="character"
|
by="character"
|
||||||
as="h3"
|
as="h3"
|
||||||
className="text-xl font-bold text-center"
|
className="text-xl font-bold text-center sm:text-3xl"
|
||||||
>
|
>
|
||||||
Our Partners
|
Our Partners
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
@ -50,37 +50,37 @@ export function App() {
|
|||||||
<DotPattern className="-z-10" />
|
<DotPattern className="-z-10" />
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-[url(https://cdn.toontrack.com/app/uploads/product/upright-ebx/jpg/upright-ebx-top-mobile.jpg)] bg-cover bg-center text-white">
|
<div className="bg-[url(https://cdn.toontrack.com/app/uploads/product/upright-ebx/jpg/upright-ebx-top-mobile.jpg)] bg-cover bg-center text-white">
|
||||||
<div className="flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] 2xl:px-[500px] backdrop-blur-[5px] backdrop-grayscale-25">
|
<div className="flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] backdrop-blur-[5px] backdrop-grayscale-25 sm:py-10">
|
||||||
<TextAnimate
|
<TextAnimate
|
||||||
animation="blurInUp"
|
animation="blurInUp"
|
||||||
by="character"
|
by="character"
|
||||||
as="h3"
|
as="h3"
|
||||||
className="text-xl font-bold text-center"
|
className="text-xl font-bold text-center sm:text-3xl"
|
||||||
>
|
>
|
||||||
About Us
|
About Us
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
<p>
|
<p className="sm:text-lg">
|
||||||
We are dedicated to simplifying orchestral event management
|
We are dedicated to simplifying orchestral event management
|
||||||
through innovative solutions tailored to the unique needs of
|
through innovative solutions tailored to the unique needs of
|
||||||
orchestras and their audiences.
|
orchestras and their audiences.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p className="sm:text-lg">
|
||||||
Our platform streamlines the planning, coordination, and execution
|
Our platform streamlines the planning, coordination, and execution
|
||||||
of orchestral events, allowing musicians and organizers to focus
|
of orchestral events, allowing musicians and organizers to focus
|
||||||
on what they do best: creating unforgettable musical experiences.
|
on what they do best: creating unforgettable musical experiences.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="relative flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] 2xl:px-[500px] backdrop-blur-[6px]">
|
<div className="relative flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] backdrop-blur-[6px] sm:py-10">
|
||||||
<TextAnimate
|
<TextAnimate
|
||||||
animation="blurInUp"
|
animation="blurInUp"
|
||||||
by="character"
|
by="character"
|
||||||
as="h3"
|
as="h3"
|
||||||
className="text-xl font-bold text-center"
|
className="text-xl font-bold text-center sm:text-3xl"
|
||||||
>
|
>
|
||||||
Events
|
Events
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
<p>
|
<p className="sm:text-lg">
|
||||||
Are you an event organizer looking to host an orchestral
|
Are you an event organizer looking to host an orchestral
|
||||||
performance? Our platform connects you with talented orchestras and
|
performance? Our platform connects you with talented orchestras and
|
||||||
provides the tools you need to plan and execute a successful event.
|
provides the tools you need to plan and execute a successful event.
|
||||||
@ -93,16 +93,16 @@ export function App() {
|
|||||||
<GridPattern strokeDasharray="4 2" className="-z-10" />
|
<GridPattern strokeDasharray="4 2" className="-z-10" />
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-[url(https://images.stockcake.com/public/1/3/a/13a0d24a-a714-43b5-b462-636017c01d60_large/grand-piano-interior-stockcake.jpg)] bg-cover bg-center text-white">
|
<div className="bg-[url(https://images.stockcake.com/public/1/3/a/13a0d24a-a714-43b5-b462-636017c01d60_large/grand-piano-interior-stockcake.jpg)] bg-cover bg-center text-white">
|
||||||
<div className="flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] 2xl:px-[500px] backdrop-blur-[3px] backdrop-grayscale-50">
|
<div className="flex flex-col gap-5 p-6 text-center sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] backdrop-blur-[3px] backdrop-grayscale-50 sm:py-10">
|
||||||
<TextAnimate
|
<TextAnimate
|
||||||
animation="blurInUp"
|
animation="blurInUp"
|
||||||
by="character"
|
by="character"
|
||||||
as="h3"
|
as="h3"
|
||||||
className="text-xl font-bold text-center"
|
className="text-xl font-bold text-center sm:text-3xl"
|
||||||
>
|
>
|
||||||
Employee Management
|
Employee Management
|
||||||
</TextAnimate>
|
</TextAnimate>
|
||||||
<p>
|
<p className="sm:text-lg">
|
||||||
Are you an orchestra looking to manage your musicians and staff
|
Are you an orchestra looking to manage your musicians and staff
|
||||||
more effectively? Our platform offers comprehensive employee
|
more effectively? Our platform offers comprehensive employee
|
||||||
management solutions designed specifically for orchestras.
|
management solutions designed specifically for orchestras.
|
||||||
@ -114,37 +114,39 @@ export function App() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="relative flex flex-col gap-4 p-6 sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] 2xl:px-[500px]">
|
<div className="relative flex flex-col gap-4 p-6 sm:px-[100px] md:px-[200px] lg:px-[300px] xl:px-[400px] sm:py-10 sm:flex-row sm:justify-around">
|
||||||
<h3 className="font-alex-brush text-2xl">Great Music LLM</h3>
|
<h3 className="font-alex-brush text-2xl sm:text-3xl">
|
||||||
|
Great Music LLM
|
||||||
|
</h3>
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<h4 className="font-bold">Services</h4>
|
<h4 className="font-bold text-lg sm:text-xl">Services</h4>
|
||||||
<div className="flex flex-col gap-1">
|
<div className="flex flex-col gap-1">
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
className="text-gray-500 hover:text-gray-600 hover:underline"
|
className="text-gray-500 hover:text-gray-600 hover:underline sm:text-lg"
|
||||||
>
|
>
|
||||||
Events
|
Events
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
className="text-gray-500 hover:text-gray-600 hover:underline"
|
className="text-gray-500 hover:text-gray-600 hover:underline sm:text-lg"
|
||||||
>
|
>
|
||||||
Employee Management
|
Employee Management
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<h4 className="font-bold">Company</h4>
|
<h4 className="font-bold text-lg sm:text-xl">Company</h4>
|
||||||
<div className="flex flex-col gap-1">
|
<div className="flex flex-col gap-1">
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
className="text-gray-500 hover:text-gray-600 hover:underline"
|
className="text-gray-500 hover:text-gray-600 hover:underline sm:text-lg"
|
||||||
>
|
>
|
||||||
Terms & Conditions
|
Terms & Conditions
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
className="text-gray-500 hover:text-gray-600 hover:underline"
|
className="text-gray-500 hover:text-gray-600 hover:underline sm:text-lg"
|
||||||
>
|
>
|
||||||
Privacy Policy
|
Privacy Policy
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@ -122,7 +122,7 @@ export function DotPattern({
|
|||||||
<stop offset="100%" stopColor="currentColor" stopOpacity="0" />
|
<stop offset="100%" stopColor="currentColor" stopOpacity="0" />
|
||||||
</radialGradient>
|
</radialGradient>
|
||||||
</defs>
|
</defs>
|
||||||
{dots.map((dot, index) => (
|
{dots.map((dot) => (
|
||||||
<motion.circle
|
<motion.circle
|
||||||
key={`${dot.x}-${dot.y}`}
|
key={`${dot.x}-${dot.y}`}
|
||||||
cx={dot.x}
|
cx={dot.x}
|
||||||
|
|||||||
@ -46,7 +46,7 @@ export function Marquee({
|
|||||||
<div
|
<div
|
||||||
{...props}
|
{...props}
|
||||||
className={cn(
|
className={cn(
|
||||||
"group flex [gap:var(--gap)] overflow-hidden p-2 [--duration:40s] [--gap:1rem]",
|
"group flex gap-(--gap) overflow-hidden p-2 [--duration:40s] [--gap:1rem]",
|
||||||
{
|
{
|
||||||
"flex-row": !vertical,
|
"flex-row": !vertical,
|
||||||
"flex-col": vertical,
|
"flex-col": vertical,
|
||||||
@ -59,11 +59,11 @@ export function Marquee({
|
|||||||
.map((_, i) => (
|
.map((_, i) => (
|
||||||
<div
|
<div
|
||||||
key={i}
|
key={i}
|
||||||
className={cn("flex shrink-0 justify-around [gap:var(--gap)]", {
|
className={cn("flex shrink-0 justify-around gap-(--gap)", {
|
||||||
"animate-marquee flex-row": !vertical,
|
"animate-marquee flex-row": !vertical,
|
||||||
"animate-marquee-vertical flex-col": vertical,
|
"animate-marquee-vertical flex-col": vertical,
|
||||||
"group-hover:[animation-play-state:paused]": pauseOnHover,
|
"group-hover:paused": pauseOnHover,
|
||||||
"[animation-direction:reverse]": reverse,
|
"direction-[reverse]": reverse,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
Reference in New Issue
Block a user