whitney0507 commited on
Commit
46fb3f4
·
verified ·
1 Parent(s): 933b9a7

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +232 -0
  2. ui.css +516 -0
app.py ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import requests
4
+ import os
5
+ # Import CSS and URL File
6
+ css_file_path = os.path.join(os.path.dirname(__file__), "ui.css")
7
+ with open(css_file_path,"r") as f:
8
+ custom_css = f.read()
9
+ # HTML Design
10
+ html_welcome_page = """
11
+ <div class="container">
12
+ <div class="inner-container">
13
+ <h1 class="title-text">Welcome to RemoveWeed Weed Detection System</h1>
14
+ <img src="https://i.ibb.co/fY1nk315/image-2.png" alt="RemoveWeed Logo" class="logo-container"/>
15
+ <p class="description-text">
16
+ Project Aim: This system is designed to optimize rice planting schedules with broad-leaved weed detection using machine learning.
17
+ </p>
18
+ <p class="description-text">
19
+ Designed by: Whitney Lim Wan Yee (TP068221)
20
+ </p>
21
+ </div>
22
+ </div>
23
+ """
24
+ html_system_page ="""
25
+ <div class="container">
26
+ <img src="https://i.ibb.co/KxMMTmxG/Screenshot-2025-03-28-224907.png" alt="RemoveWeed Logo" class="logo-container-system"/>
27
+ <h1 class="system-page-title">RemoveWeed System Overview</h1>
28
+ <p class="system-page-description">
29
+ This system is designed to help farmers detect broad-leaved weeds in rice fields using machine learning techniques.
30
+ The aim is to optimize rice planting schedules and improve crop yield.
31
+ </p>
32
+ </div>
33
+ """
34
+ html_project_description = """
35
+ <div class="project-container">
36
+ <h1 class="project-title">- 🌿 About Project 🌿 -</h1>
37
+
38
+ <div class="upper-content">
39
+ <div class="left-upper-column">
40
+ <div class="chart">
41
+ <img src="https://i.ibb.co/j9Ch3xnC/1312103.png" alt="Agricultural consumption of herbicides worldwide from 1990 to 2022" class="chart-image">
42
+ <p class="chart-caption">Resource: Statista (2024) - Agricultural consumption of herbicides worldwide from 1990 to 2022 (in 1,000 metric tons)</p>
43
+ </div>
44
+ </div>
45
+ <div class="right-upper-column">
46
+ <div class="herbicide-description">
47
+ <h2 class="herbicide-title">Herbicide Use Soars: A Shocking Yearly Increase!</h2>
48
+ <p class="herbicide-text">
49
+ Statista (2024) revealed that global herbicide consumption has reached <span class="bold-red">1.94 million</span> metric tons. To control dock weed in farming fields, the application of herbicides can cause <span class="bold-red">delays</span> in rice planting schedules ranging from <span class="bold-red">7 to 30 days</span>.
50
+ </p>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="middle-content">
56
+ <div class="left-middle-column">
57
+ <div class="objective-description">
58
+ <h2 class="objective-title">Why Choose RemoveWeed?</h2>
59
+ <p class="objective-text">
60
+ RemoveWeed is a system designed to detect broad-leaved dock weed in paddy fields. It uses object detection like <span class="bold-red">Single Shot Detection (SSD)</span> model, along with instance segmentation models like <span class="bold-red">U-Net</span> and <span class="bold-red">Fully Convolutional Neural Network (FCNN</span>, to predict the presence of dock weed.
61
+ </p>
62
+ </div>
63
+ </div>
64
+ <div class="right-middle-column">
65
+ <div class="carousel-wrapper">
66
+ <div class="carousel-container">
67
+ <p class="carousel-title">Broad-leaved Dock Weed in Paddy Field</p>
68
+ <div class="carousel">
69
+ <div class="image-one"></div>
70
+ <div class="image-two"></div>
71
+ <div class="image-three"></div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ <div class="bottom-content">
79
+ <div class="left-bottom-column">
80
+ <div class="Proceed-To-Detection">
81
+ <img src="https://i.ibb.co/Txb9LFf5/agriculture-tan.jpg" alt="Model Training" class="model-image">
82
+ </div>
83
+ </div>
84
+ <div class="right-bottom-column">
85
+ <div class="benefits-description">
86
+ <h2 class="benefits-title">Potential Benefits</h2>
87
+ <ul class="benefits-list">
88
+ <li>Cost Savings 💰</li>
89
+ <li>Reduce Labor and Manual Monitoring Cost 💹</li>
90
+ <li>Increase Profitability by Rice Planting Scheduling Advice 📈</li>
91
+ <li>Provide Sustainable Practices in Agriculture 🧑‍🌾</li>
92
+ <li>Reduce Herbicide Pollution ☢️</li>
93
+ </ul>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ """
99
+ html_author_review_page = """
100
+ <div class="author-section">
101
+ <h1 class="author-title">- Project Owner Introduction -</h1>
102
+
103
+ <div class="author-content">
104
+ <div class="author-image-container">
105
+ <img src="https://i.ibb.co/4RZW1Pq4/Wanyu.jpg" alt="Whitney Lim Wan Yee" class="author-image">
106
+ </div>
107
+
108
+ <div class="author-bio">
109
+ <p class="author-text">
110
+ Whitney Lim Wan Yee is a student at Asia Pacific University (APU), pursuing Year 3 Computer Science specialization in Data Analytics. She is passionate about machine learning and its applications in agriculture.
111
+ </p>
112
+
113
+ <div class="social-links">
114
+ <a href="https://www.linkedin.com/in/whitneylimwanyee/" target="_blank" class="social-link">
115
+ <img src="https://images.rawpixel.com/image_png_800/czNmcy1wcml2YXRlL3Jhd3BpeGVsX2ltYWdlcy93ZWJzaXRlX2NvbnRlbnQvbHIvdjk4Mi1kMy0xMC5wbmc.png" alt="LinkedIn" class="social-icon">
116
+ <span>LinkedIn Profile</span>
117
+ </a>
118
+
119
+ <a href="https://www.kaggle.com/whitneylimwanyee" target="_blank" class="social-link">
120
+ <img src="https://cdn4.iconfinder.com/data/icons/logos-and-brands/512/189_Kaggle_logo_logos-512.png" alt="Kaggle" class="social-icon">
121
+ <span>Kaggle Profile</span>
122
+ </a>
123
+
124
+ <button onclick="window.location.href='mailto:whitneylim0719@gmail.com'" class="social-link">
125
+ <img src="https://static.vecteezy.com/system/resources/previews/016/716/465/non_2x/gmail-icon-free-png.png" alt="Email" class="social-icon">
126
+ <span>Email Me</span>
127
+ </button>
128
+ <a href="https://drive.google.com/file/d/1SvbvzLpFQJjzX6_VPGS3NddzK0ksXE8r/view" target="_blank" class="social-link">
129
+ <img src="https://cdn-icons-png.flaticon.com/512/8347/8347432.png" alt="Kaggle" class="social-icon">
130
+ <span>My Resume</span>
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ """
137
+
138
+
139
+ js_func = """
140
+ function refresh() {
141
+ const url = new URL(window.location);
142
+
143
+ if (url.searchParams.get('__theme') !== 'light') {
144
+ url.searchParams.set('__theme', 'light');
145
+ window.location.href = url.href;
146
+ }
147
+ }
148
+ """
149
+
150
+ with gr.Blocks(css=custom_css,js=js_func) as demo:
151
+ # State to track current page
152
+ page = gr.State(value="welcome")
153
+
154
+ # Welcome page container
155
+ with gr.Group(visible=True, elem_classes="gradio-container") as welcome_page:
156
+ gr.HTML(html_welcome_page) # Insert HTML structure
157
+ start_trial_button = gr.Button("Start Trial", variant="primary", elem_classes="trial-button")
158
+
159
+ # System description page container (initially hidden)
160
+ with gr.Group(visible=False) as system_page:
161
+ gr.HTML(html_system_page)
162
+ tabs = gr.Tabs()
163
+ with tabs:
164
+ with gr.TabItem("Project Description"):
165
+ tab_state = gr.State(value=0)
166
+ gr.HTML(html_project_description)
167
+ with gr.TabItem("Model Playground"):
168
+ gr.Markdown("""
169
+ ### Model Playground:
170
+ This section allows users to interact with the model and test its capabilities.
171
+ """)
172
+ radio = gr.Radio(choices=["Model 1", "Model 2","Model 3","Model 4","Model 5"], label="Select Model", elem_classes="model-selection")
173
+ img_input = gr.Image(type="numpy", label="Upload Image", elem_classes="image-input")
174
+ upload_image_button = gr.Button("Upload Image", variant="primary", elem_classes="upload-button")
175
+ img_output = gr.Image(label="Predicted Image", elem_classes="image-output")
176
+ with gr.TabItem("Open Source API Link"):
177
+ gr.Markdown("""
178
+ ### Open Source API Link:
179
+ This section provides access to the open-source API for the weed detection model.
180
+ """)
181
+ gr.Markdown("### API Documentation:")
182
+ with gr.TabItem("Contact and Review"):
183
+ gr.HTML(html_author_review_page)
184
+ back_button = gr.Button("Back", variant="secondary",elem_classes="back-button")
185
+
186
+
187
+ # Navigation functions
188
+ def go_to_system_page():
189
+ print("Going to system page")
190
+ return gr.update(visible=False), gr.update(visible=True)
191
+
192
+ def go_to_welcome_page():
193
+ print("Going to welcome page")
194
+ return gr.update(visible=True), gr.update(visible=False)
195
+
196
+ def process_image(input_img):
197
+ # Convert image to float for processing
198
+ input_img = input_img.astype(np.float32)
199
+ # Normalize image
200
+ input_img /= 255.0
201
+ print(input_img.shape)
202
+ return input_img
203
+ def choose_model(choice):
204
+ if choice == "Model 1":
205
+ return "You have selected Model 1"
206
+ elif choice == "Model 2":
207
+ return "You have selected Model 2"
208
+ else:
209
+ return "Invalid selection"
210
+
211
+
212
+ # Connect buttons to navigation functions
213
+ start_trial_button.click(
214
+ fn=go_to_system_page,
215
+ inputs=None, # Pass the current page state
216
+ outputs=[welcome_page, system_page]
217
+ )
218
+
219
+ back_button.click(
220
+ fn=go_to_welcome_page,
221
+ inputs=None, # Pass the current page state
222
+ outputs=[welcome_page, system_page]
223
+ )
224
+ upload_image_button.click(
225
+ fn=process_image,
226
+ inputs=img_input,
227
+ outputs=img_output
228
+ )
229
+
230
+
231
+
232
+ demo.launch(share=True)
ui.css ADDED
@@ -0,0 +1,516 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Gradio container - Solid background color */
2
+ @import url('https://fonts.googleapis.com/css2?family=Jacques+Francois&display=swap');
3
+ .gradio-container {
4
+ background-image: url('https://i.ibb.co/KxBn0Yt5/Bottom-Grass-Image.png') !important;
5
+ background-size: cover !important;
6
+ background-position: center!important;
7
+ background-repeat: no-repeat !important;
8
+ padding: 60px !important;
9
+ align-items: center;
10
+ text-align: center !important;
11
+
12
+ }
13
+ .gradio-container, .gr-block, .gr-panel, .gr-box {
14
+ border: none !important;
15
+ box-shadow: none !important; /* Remove any shadow effect */
16
+ color:#000 !important; /* Ensure text is visible */
17
+ }
18
+
19
+ /* Ensure inside container has a solid dark background */
20
+ .inner-container {
21
+ background-color: #0B0F19;
22
+ padding: 10px;
23
+ border-radius: 15px;
24
+ border: 5px solid rgb(20, 18, 18);
25
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
26
+ max-width: 800px;
27
+ text-align: center;
28
+ display: flex;
29
+ flex-direction: column;
30
+ align-items: center;
31
+ }
32
+
33
+
34
+ /* Title and description - ensure visibility */
35
+ .title-text{
36
+ background-color: transparent !important;
37
+ color: #fff !important;
38
+ text-align: center !important;
39
+ }
40
+ .h1, h1 {
41
+ font-size: 40px !important;
42
+ font-family:'Jacques Francois', serif;
43
+ margin: 10px 0 !important;
44
+ }
45
+ .description-text{
46
+ font-size: 20px !important;
47
+ font-family:'Jacques Francois', serif;
48
+ margin: 10px 0 !important;
49
+ background-color: transparent !important;
50
+ color: #fff !important;
51
+ text-align: center !important;
52
+ }
53
+ .jacques-francois-regular {
54
+ font-family: "Jacques Francois", serif;
55
+ font-weight: 400;
56
+ font-style: normal;
57
+ }
58
+
59
+
60
+ /* Logo styling */
61
+ .logo-container {
62
+ background-color: #0B0F19 !important; /* Background color for the logo container */
63
+ margin: 10px 0 !important;
64
+ padding: 30px !important; /* Adjust padding if necessary */
65
+ display: flex;
66
+ justify-content: center;
67
+ align-items: center;
68
+ height:120px !important;
69
+ width: 400px !important;
70
+ }
71
+
72
+ /* Optional: Add some padding around the logo image */
73
+ .logo-container img {
74
+ object-fit: contain !important; /* Ensure image scales properly */
75
+ max-height: 100% !important; /* Make sure the image fits the container */
76
+ }
77
+ .logo-container-system {
78
+ background-color: #E4E4E7 !important; /* Background color for the logo container */
79
+ margin: 10px 10px !important;
80
+ text-align: left !important;
81
+ height: 80px !important;
82
+ width: 200px !important;
83
+ }
84
+
85
+ /* Optional: Add some padding around the logo image */
86
+ .logo-container-system img {
87
+ display: inline-block;
88
+ vertical-align: middle;
89
+ }
90
+
91
+ /* Button styling */
92
+ .trial-button {
93
+ background-color: #E67E22 !important;
94
+ color: white !important;
95
+ border: none !important;
96
+ border-radius: 15px !important;
97
+ padding: 10px 30px !important;
98
+ font-size: 16px !important;
99
+ /* Make it center so margin has to be auto*/
100
+ margin: 20px auto !important;
101
+ cursor: pointer !important;
102
+ max-width: 200px !important; /* Limit the button width */
103
+ text-align: center !important;
104
+ display: flex !important;
105
+ justify-content: center !important;
106
+ }
107
+
108
+
109
+
110
+ .back-button {
111
+ margin-top: 20px !important;
112
+ margin: 20px auto !important;
113
+ padding: 10px 30px !important;
114
+ font-size: 16px !important;
115
+ border-radius: 15px !important;
116
+ background-color: #E67E22 !important;
117
+ color: white !important;
118
+ border: none !important;
119
+ cursor: pointer !important;
120
+ max-width: 200px !important;
121
+ }
122
+ .system-page-description{
123
+ font-size: 20px !important;
124
+ color: #000000 !important;
125
+ text-align: center !important;
126
+ margin: 40px 40px!important;
127
+ /* padding: 40px 40px!important; */
128
+ background-color: transparent !important;
129
+ }
130
+
131
+
132
+
133
+
134
+ .project-container {
135
+ display: flex;
136
+ flex-direction: column;
137
+ width: 100%;
138
+ max-width: 1200px;
139
+ margin: 0 auto;
140
+ padding: 20px;
141
+ }
142
+
143
+ .project-container .project-title {
144
+ text-align: center;
145
+ font-size: 30px !important;
146
+ margin: 0 auto;
147
+ }
148
+
149
+ .upper-content {
150
+ display: flex;
151
+ flex-direction: row;
152
+ gap: 30px;
153
+ padding-top: 20px;
154
+ }
155
+
156
+ .left-upper-column {
157
+ flex: 1;
158
+ display: flex;
159
+ flex-direction: column;
160
+ }
161
+
162
+ .right-upper-column {
163
+ flex: 1;
164
+ display: flex;
165
+ flex-direction: column;
166
+ justify-content: center;
167
+ }
168
+
169
+ .chart {
170
+ font-family: 'Jacques Francois', serif;
171
+ width: 100%;
172
+ background-color: white;
173
+ border-radius: 10px;
174
+ padding: 10px;
175
+ }
176
+
177
+ .chart-image {
178
+ width: 100%;
179
+ height: auto;
180
+ }
181
+
182
+ .chart-caption {
183
+ text-align: center;
184
+ font-size: 12px;
185
+ margin-top: 10px;
186
+ color: #333;
187
+ }
188
+
189
+ .herbicide-description {
190
+ padding: 20px 0;
191
+ font-size: 20px;
192
+ text-align: justify;
193
+ }
194
+
195
+ .herbicide-title {
196
+ margin-top: -40px;
197
+ margin-bottom: 20px;
198
+ font-size: 50px;
199
+ text-align: center;
200
+ }
201
+ span.bold-red{
202
+ font-family: 'Jacques Francois', serif;
203
+ font-size: 20px;
204
+ color:red;
205
+ font-weight: bold;
206
+ }
207
+
208
+
209
+ .middle-content {
210
+ display: flex;
211
+ flex-direction: row;
212
+ gap: 30px;
213
+ padding-top: 20px;
214
+ }
215
+
216
+ .left-middle-column {
217
+ flex: 1;
218
+ display: flex;
219
+ flex-direction: column;
220
+
221
+ }
222
+
223
+ .right-middle-column {
224
+ flex: 1;
225
+ display: flex;
226
+ flex-direction: column;
227
+ justify-content: center;
228
+ align-items: center;
229
+ }
230
+
231
+ .objective-description {
232
+ padding: 20px;
233
+
234
+ }
235
+
236
+ .objective-title {
237
+ font-size: clamp(30px, 5vw, 50px); /* Responsive font size */
238
+ white-space: nowrap;
239
+ margin-bottom: 20px;
240
+ text-align: left;
241
+ }
242
+
243
+ .objective-text {
244
+ font-size: 20px;
245
+ line-height: 1.6;
246
+ text-align: justify;
247
+ color: #333;
248
+ }
249
+
250
+ :root {
251
+ --size-width: 400px;
252
+ --size-height: 250px;
253
+ }
254
+
255
+ .carousel-wrapper {
256
+ width: calc(var(--size-width) * 1.3);
257
+ height: calc(var(--size-height) * 1.4);
258
+ display: flex;
259
+ justify-content: center;
260
+ align-items: center;
261
+ box-shadow: 5px 5px 25px 0px rgba(46, 61, 73, 0.2);
262
+ border-radius: 15px;
263
+ }
264
+
265
+ .carousel-container {
266
+ width: var(--size-width);
267
+ height: var(--size-height);
268
+ overflow: hidden;
269
+ margin: 0 auto;
270
+ font-size: 16px;
271
+ font-weight:bold;
272
+ font-family: 'Jacques Francois', serif;
273
+ }
274
+
275
+ .carousel {
276
+ display: flex;
277
+ width: calc(var(--size-width) * 3);
278
+ animation: sliding 6s infinite;
279
+ }
280
+
281
+
282
+ .carousel div {
283
+ width: var(--size-width);
284
+ height: var(--size-height);
285
+ background-size: cover;
286
+ background-position: center;
287
+ }
288
+
289
+ .carousel:hover {
290
+ animation-play-state: paused;
291
+ }
292
+
293
+ .image-one {
294
+ background-image: url("https://i.ibb.co/0jpWh4CD/Dock-Weed-1.jpg");
295
+ }
296
+
297
+ .image-two {
298
+ background-image: url("https://i.ibb.co/1f7zdPMk/Dock-Weed-2.jpg");
299
+ }
300
+
301
+ .image-three {
302
+ background-image: url("https://i.ibb.co/4Z1YffPd/Dock-Weed-3.jpg");
303
+ }
304
+
305
+ @keyframes sliding {
306
+ 30% {
307
+ transform: translateX(0);
308
+ }
309
+ 35% {
310
+ transform: translateX(calc(var(--size-width) * -1));
311
+ }
312
+ 65% {
313
+ transform: translateX(calc(var(--size-width) * -1));
314
+ }
315
+ 70% {
316
+ transform: translateX(calc(var(--size-width) * -2));
317
+ }
318
+ 98% {
319
+ transform: translateX(calc(var(--size-width) * -2));
320
+ }
321
+ 100% {
322
+ transform: translateX(0);
323
+ }
324
+ }
325
+
326
+ @media screen and (max-width: 768px) {
327
+ :root {
328
+ --size-width: 240px;
329
+ --size-height: 150px;
330
+ }
331
+ }
332
+ .bottom-content {
333
+ display: flex;
334
+ flex-direction: row;
335
+ gap: 30px;
336
+ padding: 20px 0;
337
+ background-image: url('path-to-your-green-background.jpg');
338
+ background-size: cover;
339
+ background-position: center;
340
+ color: white;
341
+ border-radius: 10px;
342
+ margin-top: 10px;
343
+ }
344
+
345
+ .left-bottom-column {
346
+ flex: 1;
347
+ display: flex;
348
+ flex-direction: column;
349
+ padding: 20px;
350
+ }
351
+
352
+ .right-bottom-column {
353
+ flex: 1;
354
+ display: flex;
355
+ flex-direction: column;
356
+ justify-content: center;
357
+ align-items: center;
358
+ padding: 20px;
359
+ }
360
+
361
+ .benefits-description {
362
+ width: 600px;
363
+ height: 300px;
364
+ text-align: left;
365
+ background-color: white;
366
+ border: 10px;
367
+ border-radius: 20px;
368
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
369
+
370
+
371
+ }
372
+
373
+ .benefits-title {
374
+ font-size: clamp(30px, 5vw, 50px);
375
+ text-align: center;
376
+ margin-bottom: 20px;
377
+ font-weight: bold;
378
+ }
379
+
380
+ .benefits-text {
381
+ font-size: 18px;
382
+ line-height: 1.8;
383
+ text-align: left;
384
+ padding-left: 20px;
385
+ }
386
+
387
+ .benefits-text br {
388
+ margin-bottom: 10px;
389
+ }
390
+
391
+ .model-image {
392
+ margin: 20px auto;
393
+ width: 100%;
394
+ height: auto;
395
+ max-width: 400px; /* Limit the image width */
396
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
397
+ background-color: #fff;
398
+ }
399
+
400
+
401
+ /* For bullet points, you can use this instead of <br> */
402
+ .benefits-list {
403
+ list-style-type: disc;
404
+ padding-left: 40px;
405
+ }
406
+
407
+ .benefits-list li {
408
+ margin-bottom: 10px;
409
+ font-size: 18px;
410
+ font-weight: bold;
411
+ }
412
+ .author-section {
413
+ max-width: 1200px;
414
+ margin: 0 auto;
415
+ padding: 30px 20px;
416
+ font-family: 'Jacques Francois', serif;
417
+ }
418
+
419
+ .author-title {
420
+ text-align: center;
421
+ font-size: 40px;
422
+ margin-bottom: 40px;
423
+ }
424
+
425
+ .author-content {
426
+ display: flex;
427
+ flex-direction: row;
428
+ gap: 40px;
429
+ align-items: center;
430
+ }
431
+
432
+ .author-image-container {
433
+ flex: 0 0 200px;
434
+ }
435
+
436
+ .author-image {
437
+ width: 100%;
438
+ border-radius: 10px;
439
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
440
+ }
441
+
442
+ .author-bio {
443
+ flex: 1;
444
+ }
445
+
446
+ .author-text {
447
+ font-size: 18px;
448
+ line-height: 1.6;
449
+ margin-bottom: 30px;
450
+ text-align: justify;
451
+ }
452
+
453
+ .social-links {
454
+ display: flex;
455
+ gap: 20px;
456
+ margin-top: 20px;
457
+ }
458
+
459
+ .social-link {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 8px;
463
+ text-decoration: none;
464
+ color: #2a6a39;
465
+ font-weight: bold;
466
+ padding: 10px 15px;
467
+ border-radius: 5px;
468
+ background-color: #f5f5f5;
469
+ transition: all 0.3s ease;
470
+ }
471
+
472
+ .social-link:hover {
473
+ background-color: #e0e0e0;
474
+ transform: translateY(-2px);
475
+ }
476
+
477
+ .social-icon {
478
+ width: 24px;
479
+ height: 24px;
480
+ }
481
+
482
+
483
+
484
+
485
+
486
+
487
+ @media (max-width: 1200px) {
488
+ .upper-content {
489
+ flex-direction: column;
490
+ }
491
+ .middle-content {
492
+ flex-direction: column; /* This would stack elements on small screens */
493
+ }
494
+ .bottom-content {
495
+ flex-direction: column;
496
+ }
497
+ .author-content {
498
+ flex-direction: column;
499
+ text-align: center;
500
+ }
501
+
502
+ .author-image-container {
503
+ max-width: 150px;
504
+ margin: 0 auto;
505
+ }
506
+
507
+ .social-links {
508
+ flex-direction: column;
509
+ align-items: center;
510
+ }
511
+
512
+ .social-link {
513
+ width: 80%;
514
+ justify-content: center;
515
+ }
516
+ }