Skip to content

Commit 2382cfe

Browse files
committed
Merge branch 'main' into deploy/production
2 parents 5fae9d4 + d5c33b9 commit 2382cfe

21 files changed

+889
-10
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Bright Future - Build and Deploy
2+
3+
on:
4+
push:
5+
branches:
6+
- 'deploy/production'
7+
paths:
8+
- 'apps/bright-future/**'
9+
10+
jobs:
11+
build-and-deploy:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
- name: Set up QEMU
18+
uses: docker/setup-qemu-action@v3
19+
20+
- name: Set up Docker Buildx
21+
uses: docker/setup-buildx-action@v3
22+
23+
- name: Login to Docker Hub
24+
uses: docker/login-action@v3
25+
with:
26+
username: ${{ secrets.DOCKERHUB_USERNAME }}
27+
password: ${{ secrets.DOCKERHUB_TOKEN }}
28+
29+
- name: Build and push to DockerHub
30+
uses: docker/build-push-action@v5
31+
with:
32+
context: .
33+
push: true
34+
file: ./apps/bright-future/Dockerfile
35+
tags: rjhilgefort/bright-future:latest
36+
37+
- name: Build Monorepo Packages
38+
run: |
39+
npm install
40+
npm run build
41+
42+
- name: Deploy to Portainer
43+
uses: ./packages/portainer-stack-redeploy-action
44+
with:
45+
host: '${{ secrets.PORTAINER_URL }}'
46+
accessToken: '${{ secrets.PORTAINER_ACCESS_TOKEN }}'
47+
stackName: 'bright-future-site'

apps/bright-future/app/about/page.tsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { Metadata } from 'next'
2+
import Image from 'next/image'
3+
4+
export const metadata: Metadata = {
5+
title: 'About Us | Bright Future Preschool',
6+
description:
7+
'Learn about Bright Future Preschool in Erlanger, KY and our approach to early childhood education.',
8+
}
9+
10+
export default function AboutPage() {
11+
return (
12+
<div className="py-16">
13+
<div className="container mx-auto px-4">
14+
<div className="text-center mb-12">
15+
<h1 className="text-4xl md:text-5xl font-bold">
16+
About Bright Future
17+
</h1>
18+
</div>
19+
20+
<div className="flex flex-col lg:flex-row gap-12 items-start max-w-5xl mx-auto">
21+
<div className="w-full lg:w-1/2">
22+
<div className="relative w-full rounded-lg overflow-hidden shadow-lg aspect-[4/3] lg:aspect-square">
23+
<Image
24+
src="/bf-building-2.jpeg"
25+
alt="Bright Future Preschool building"
26+
fill
27+
className="object-cover"
28+
priority
29+
/>
30+
<div className="absolute inset-0 bg-primary/5"></div>
31+
</div>
32+
</div>
33+
34+
<div className="lg:w-1/2 space-y-6">
35+
<h2 className="text-3xl font-semibold">Our Story</h2>
36+
<p className="text-gray-700 leading-relaxed">
37+
Bright Future Preschool was founded with a simple mission: to
38+
provide children with a nurturing environment where they can
39+
learn, grow, and thrive. Located in Erlanger, Kentucky, we&apos;ve
40+
been serving local families with quality childcare and early
41+
education programs since 2010.
42+
</p>
43+
44+
<p className="text-gray-700 leading-relaxed">
45+
We believe that every child deserves a bright future. Our
46+
curriculum is designed to foster cognitive, social, emotional, and
47+
physical development through age-appropriate activities and
48+
play-based learning. Our dedicated staff members are passionate
49+
about early childhood education and committed to providing a safe,
50+
loving, and stimulating environment.
51+
</p>
52+
53+
<p className="text-gray-700 leading-relaxed">
54+
Our spacious, modern facility features well-equipped classrooms, a
55+
secure outdoor playground, and separate areas for different age
56+
groups. We maintain small teacher-to-student ratios to ensure each
57+
child receives the attention they need to explore, discover, and
58+
build confidence.
59+
</p>
60+
</div>
61+
</div>
62+
</div>
63+
</div>
64+
)
65+
}

apps/bright-future/app/globals.css

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
@import 'tailwindcss';
22
@plugin "@tailwindcss/typography";
3-
@plugin "daisyui" {
4-
themes: bumblebee --default;
3+
@plugin "daisyui";
4+
@plugin "daisyui/theme" {
5+
name: 'bumblebee';
6+
default: true;
7+
--color-accent: #2122df;
58
}

apps/bright-future/app/layout.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { GoogleAnalytics } from '@next/third-parties/google'
22
import { Outfit } from 'next/font/google'
3+
import Navbar from '../components/Navbar'
4+
import Footer from '../components/Footer'
35
import './globals.css'
46

57
const inter = Outfit({ subsets: ['latin'] })
@@ -10,9 +12,15 @@ export default function RootLayout({
1012
children: React.ReactNode
1113
}>) {
1214
return (
13-
<html lang="en">
14-
<body className={inter.className}>{children}</body>
15-
<GoogleAnalytics gaId="TODO" />
15+
<html lang="en" data-theme="bumblebee">
16+
<body className={inter.className}>
17+
<div className="flex flex-col min-h-screen">
18+
<Navbar />
19+
<main className="flex-grow">{children}</main>
20+
<Footer />
21+
</div>
22+
<GoogleAnalytics gaId="TODO" />
23+
</body>
1624
</html>
1725
)
1826
}

apps/bright-future/app/page.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
import { Metadata } from 'next'
2+
import Hero from '../components/Hero'
3+
import Features from '../components/Features'
4+
import Programs from '../components/Programs'
5+
import Testimonials from '../components/Testimonials'
6+
import CTA from '../components/CTA'
27

38
export const metadata: Metadata = {
4-
title: 'Bright Future',
5-
description: 'Bright Future',
9+
title: 'Bright Future Preschool | Erlanger, KY',
10+
description:
11+
'Bright Future Preschool in Erlanger, KY provides quality childcare and early childhood education in a loving environment.',
612
}
713

814
export default function Home() {
915
return (
10-
<div className="w-full">
11-
<h1>Bright Future</h1>
12-
</div>
16+
<>
17+
<Hero />
18+
<Features />
19+
<Programs />
20+
<Testimonials />
21+
<CTA />
22+
</>
1323
)
1424
}

apps/bright-future/components/CTA.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { phoneNumberLink } from '../utils/const'
2+
3+
const CTA = () => {
4+
return (
5+
<section className="py-16 bg-primary/10">
6+
<div className="container mx-auto px-4">
7+
<div className="card bg-base-100 shadow-xl">
8+
<div className="card-body text-center md:text-left md:flex md:flex-row md:items-center md:justify-between">
9+
<div className="mb-6 md:mb-0 md:mr-8">
10+
<h2 className="text-3xl font-bold">
11+
Ready to Give Your Child a Bright Future?
12+
</h2>
13+
</div>
14+
<div className="flex flex-col sm:flex-row gap-4">
15+
<a href={phoneNumberLink} className="btn btn-primary">
16+
Call Now!
17+
</a>
18+
<a
19+
href="https://www.google.com/maps/place/Bright+Future+Child+Enrichment/@39.0032551,-84.5853886,857m/data=!3m2!1e3!4b1!4m6!3m5!1s0x8841b8418492cdd7:0xf03a67a4fca9ab77!8m2!3d39.0032551!4d-84.5828083!16s%2Fg%2F1td_cc7g"
20+
target="_blank"
21+
rel="noopener noreferrer"
22+
className="btn btn-outline"
23+
>
24+
Get Directions
25+
</a>
26+
</div>
27+
</div>
28+
</div>
29+
</div>
30+
</section>
31+
)
32+
}
33+
34+
export default CTA
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import { ReactNode } from 'react'
2+
3+
interface FeatureCardProps {
4+
icon: ReactNode
5+
title: string
6+
description: string
7+
}
8+
9+
const FeatureCard = ({ icon, title, description }: FeatureCardProps) => {
10+
return (
11+
<div className="card bg-base-100 shadow-xl">
12+
<div className="card-body items-center text-center">
13+
<div className="text-5xl text-primary mb-4">{icon}</div>
14+
<h3 className="card-title text-xl font-bold">{title}</h3>
15+
<p>{description}</p>
16+
</div>
17+
</div>
18+
)
19+
}
20+
21+
const Features = () => {
22+
const features = [
23+
{
24+
icon: (
25+
<svg
26+
xmlns="http://www.w3.org/2000/svg"
27+
width="1em"
28+
height="1em"
29+
viewBox="0 0 24 24"
30+
fill="none"
31+
stroke="currentColor"
32+
strokeWidth="2"
33+
strokeLinecap="round"
34+
strokeLinejoin="round"
35+
>
36+
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
37+
<circle cx="9" cy="7" r="4"></circle>
38+
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
39+
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
40+
</svg>
41+
),
42+
title: 'Expert Teachers',
43+
description:
44+
'Our qualified educators are passionate about early childhood development and create enriching learning experiences.',
45+
},
46+
{
47+
icon: (
48+
<svg
49+
xmlns="http://www.w3.org/2000/svg"
50+
width="1em"
51+
height="1em"
52+
viewBox="0 0 24 24"
53+
fill="none"
54+
stroke="currentColor"
55+
strokeWidth="2"
56+
strokeLinecap="round"
57+
strokeLinejoin="round"
58+
>
59+
<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path>
60+
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path>
61+
</svg>
62+
),
63+
title: 'Curriculum-Based Learning',
64+
description:
65+
'Age-appropriate activities designed to develop cognitive, social, emotional, and physical skills.',
66+
},
67+
{
68+
icon: (
69+
<svg
70+
xmlns="http://www.w3.org/2000/svg"
71+
width="1em"
72+
height="1em"
73+
viewBox="0 0 24 24"
74+
fill="none"
75+
stroke="currentColor"
76+
strokeWidth="2"
77+
strokeLinecap="round"
78+
strokeLinejoin="round"
79+
>
80+
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
81+
<polyline points="9 22 9 12 15 12 15 22"></polyline>
82+
</svg>
83+
),
84+
title: 'Safe Environment',
85+
description:
86+
'Secure facilities with strict health and safety protocols to provide peace of mind for parents.',
87+
},
88+
{
89+
icon: (
90+
<svg
91+
xmlns="http://www.w3.org/2000/svg"
92+
width="1em"
93+
height="1em"
94+
viewBox="0 0 24 24"
95+
fill="none"
96+
stroke="currentColor"
97+
strokeWidth="2"
98+
strokeLinecap="round"
99+
strokeLinejoin="round"
100+
>
101+
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
102+
<circle cx="12" cy="12" r="3"></circle>
103+
</svg>
104+
),
105+
title: 'Observation & Assessment',
106+
description:
107+
"Regular progress updates and parent-teacher conferences to keep you informed about your child's development.",
108+
},
109+
]
110+
111+
return (
112+
<section className="py-16 bg-base-200">
113+
<div className="container mx-auto px-4">
114+
<div className="text-center mb-12">
115+
<h2 className="text-3xl md:text-4xl font-bold">
116+
Why Choose <span className="text-primary">Bright Future</span>
117+
</h2>
118+
<p className="mt-4 text-lg max-w-2xl mx-auto">
119+
We provide the foundation for lifelong learning in a safe, nurturing
120+
environment where children can explore, discover, and grow.
121+
</p>
122+
</div>
123+
124+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
125+
{features.map((feature, index) => (
126+
<FeatureCard
127+
key={index}
128+
icon={feature.icon}
129+
title={feature.title}
130+
description={feature.description}
131+
/>
132+
))}
133+
</div>
134+
</div>
135+
</section>
136+
)
137+
}
138+
139+
export default Features

0 commit comments

Comments
 (0)