Anupriya
commited on
Commit
·
6f70a09
1
Parent(s):
50fc34c
Added Logo text and CSS
Browse files- src/app/chat/chat.component.css +6 -268
- src/app/chat/chat.component.html +2 -1
- src/app/findword/findword.component.css +18 -7
- src/app/findword/findword.component.html +2 -1
- src/app/generate-questions/generate-questions.component.css +4 -0
- src/app/generate-questions/generate-questions.component.html +2 -1
- src/app/listen/listen.component.css +4 -71
- src/app/listen/listen.component.html +2 -79
- src/app/reading/reading.component.css +7 -114
- src/app/reading/reading.component.html +10 -15
- src/app/reading/reading.component.ts +22 -3
- src/app/vocabulary-builder/vocabulary-builder.component.css +1 -1
- src/app/vocabulary-builder/vocabulary-builder.component.html +28 -11
- src/app/vocabulary-builder/vocabulary-builder.component.ts +28 -14
- src/app/writing/writing.component.css +4 -0
- src/app/writing/writing.component.html +2 -1
- src/styles.css +33 -0
src/app/chat/chat.component.css
CHANGED
|
@@ -33,6 +33,10 @@ h1 {
|
|
| 33 |
font-size: 3vw;
|
| 34 |
color: white;
|
| 35 |
font-family: Super Cartoon;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
}
|
| 37 |
|
| 38 |
@font-face {
|
|
@@ -85,156 +89,6 @@ h1 {
|
|
| 85 |
flex-shrink: 0; /* Prevent shrinking */
|
| 86 |
}
|
| 87 |
|
| 88 |
-
/* Wrapper for Message and Profile Picture */
|
| 89 |
-
/*.message-wrapper {
|
| 90 |
-
display: flex;
|
| 91 |
-
align-items: flex-start;
|
| 92 |
-
gap: 1vw;*/ /* Space between profile picture and message */
|
| 93 |
-
/*margin-bottom: 1.5vw;
|
| 94 |
-
}
|
| 95 |
-
|
| 96 |
-
.message-wrapper.user {
|
| 97 |
-
flex-direction: row-reverse;*/ /* User messages on the right */
|
| 98 |
-
/*text-align: right;
|
| 99 |
-
}*/
|
| 100 |
-
|
| 101 |
-
/* Profile Picture Styling */
|
| 102 |
-
/*.profile-pic {
|
| 103 |
-
flex-shrink: 0;
|
| 104 |
-
width: 4vw;*/ /* Responsive profile picture size */
|
| 105 |
-
/*height: 4vw;
|
| 106 |
-
border-radius: 50%;
|
| 107 |
-
overflow: hidden;
|
| 108 |
-
background-color: #ddd;*/ /* Fallback color */
|
| 109 |
-
/*}
|
| 110 |
-
|
| 111 |
-
.profile-pic img {
|
| 112 |
-
width: 100%;
|
| 113 |
-
height: 100%;
|
| 114 |
-
object-fit: cover;*/ /* Ensure image fits nicely */
|
| 115 |
-
/*}*/
|
| 116 |
-
|
| 117 |
-
/* Message Styles */
|
| 118 |
-
/*.message {
|
| 119 |
-
max-width: 50vw;*/ /* Adjust message width for smaller screens */
|
| 120 |
-
/*padding: 1vw 2vw;
|
| 121 |
-
border-radius: 2vw;
|
| 122 |
-
font-size: 1.2vw;
|
| 123 |
-
line-height: 1.5;
|
| 124 |
-
box-shadow: 0 0.3vw 0.8vw rgba(0, 0, 0, 0.1);
|
| 125 |
-
animation: fadeIn 0.5s ease;
|
| 126 |
-
}
|
| 127 |
-
|
| 128 |
-
.message-content {
|
| 129 |
-
text-align: justify;
|
| 130 |
-
}*/
|
| 131 |
-
|
| 132 |
-
/* User and AI Message Colors */
|
| 133 |
-
/*.user .message {
|
| 134 |
-
align-self: flex-end;
|
| 135 |
-
background: #2b6296;
|
| 136 |
-
color: white;
|
| 137 |
-
}
|
| 138 |
-
|
| 139 |
-
.ai .message {
|
| 140 |
-
align-self: flex-start;*/
|
| 141 |
-
/* background: #a855f7;*/
|
| 142 |
-
/* background: #404d95f7;*/
|
| 143 |
-
/*background: #2b6296;
|
| 144 |
-
color: white;
|
| 145 |
-
}*/
|
| 146 |
-
|
| 147 |
-
/* Timestamp Styling */
|
| 148 |
-
/*.message-timestamp {
|
| 149 |
-
font-size: 1vw;
|
| 150 |
-
color: rgba(255, 255, 255, 0.8);
|
| 151 |
-
margin-top: 0.5vw;
|
| 152 |
-
display: block;
|
| 153 |
-
text-align: right;
|
| 154 |
-
}*/
|
| 155 |
-
|
| 156 |
-
/*.typing-indicator {
|
| 157 |
-
font-style: italic;
|
| 158 |
-
color: #888;
|
| 159 |
-
font-size: 1.2vw;
|
| 160 |
-
text-align: left;
|
| 161 |
-
margin: 1vw 0;
|
| 162 |
-
display: flex;
|
| 163 |
-
align-items: center;
|
| 164 |
-
}*/
|
| 165 |
-
|
| 166 |
-
/*.typing-indicator::after {
|
| 167 |
-
content: "⠿";
|
| 168 |
-
display: inline-block;
|
| 169 |
-
font-size: 1.5vw;
|
| 170 |
-
color: #888;
|
| 171 |
-
animation: typing-animation 1s infinite;
|
| 172 |
-
}
|
| 173 |
-
|
| 174 |
-
@keyframes typing-animation {
|
| 175 |
-
0% {
|
| 176 |
-
opacity: 0.2;
|
| 177 |
-
}
|
| 178 |
-
|
| 179 |
-
50% {
|
| 180 |
-
opacity: 1;
|
| 181 |
-
}
|
| 182 |
-
|
| 183 |
-
100% {
|
| 184 |
-
opacity: 0.2;
|
| 185 |
-
}
|
| 186 |
-
}*/
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
/* General Flexbox Adjustments */
|
| 191 |
-
/*.chat-box {
|
| 192 |
-
padding: 2vw;
|
| 193 |
-
display: flex;
|
| 194 |
-
flex: 1;
|
| 195 |
-
flex-direction: column;
|
| 196 |
-
gap: 1vw;*/ /* Adjust spacing between messages */
|
| 197 |
-
/*background-color: #f9fafb;*/ /* Light background */
|
| 198 |
-
/*overflow-y: auto;
|
| 199 |
-
height: 80vh;*/ /* Maintain height of the chat box */
|
| 200 |
-
/*}*/
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
/*.chat-box {
|
| 204 |
-
display: flex;
|
| 205 |
-
flex-direction: column;
|
| 206 |
-
gap: 1vw;
|
| 207 |
-
overflow-y: auto;
|
| 208 |
-
height: calc(100vh - 120px);
|
| 209 |
-
padding: 2vw;*/
|
| 210 |
-
/*background-color: rgb(35 34 32 / 45%);*/
|
| 211 |
-
/* background-color: rgb(35 34 32 / 23%);*/
|
| 212 |
-
/*background-color: rgb(35 34 32 / 43%);
|
| 213 |
-
}*/
|
| 214 |
-
|
| 215 |
-
/*.chat-box {
|
| 216 |
-
display: flex;
|
| 217 |
-
flex-direction: column;
|
| 218 |
-
gap: 1vw;
|
| 219 |
-
overflow-y: auto;*/ /* ✅ Enables scrolling */
|
| 220 |
-
/*height: calc(100vh - 120px);
|
| 221 |
-
padding: 2vw;
|
| 222 |
-
background-color: rgba(35, 34, 32, 0.43);
|
| 223 |
-
scroll-behavior: smooth;*/ /* ✅ Smooth scrolling */
|
| 224 |
-
/*}*/
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
/*.chat-box {
|
| 229 |
-
display: flex;
|
| 230 |
-
flex-direction: column;
|
| 231 |
-
overflow-y: auto;*/ /* ✅ Enables scrolling */
|
| 232 |
-
/*height: calc(100vh - 120px);
|
| 233 |
-
padding: 2vw;
|
| 234 |
-
background-color: rgba(35, 34, 32, 0.43);
|
| 235 |
-
scroll-behavior: smooth;*/ /* ✅ Smooth scrolling */
|
| 236 |
-
/*}*/
|
| 237 |
-
|
| 238 |
|
| 239 |
.chat-box {
|
| 240 |
display: flex;
|
|
@@ -250,28 +104,6 @@ h1 {
|
|
| 250 |
|
| 251 |
|
| 252 |
|
| 253 |
-
/*.chat-box {
|
| 254 |
-
display: flex;
|
| 255 |
-
flex-direction: column;
|
| 256 |
-
overflow-y: auto;
|
| 257 |
-
height: calc(100vh - 180px);*/ /* Adjust height to create space */
|
| 258 |
-
/*padding: 2vw;
|
| 259 |
-
background-color: rgba(35, 34, 32, 0.43);
|
| 260 |
-
scroll-behavior: smooth;
|
| 261 |
-
flex-grow: 1;
|
| 262 |
-
overflow-y: auto;
|
| 263 |
-
padding-bottom: 90px;*/ /* ✅ Creates gap between chat and input field */
|
| 264 |
-
/*}*/
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
/*
|
| 269 |
-
.message-wrapper {
|
| 270 |
-
display: flex;
|
| 271 |
-
align-items: flex-start;
|
| 272 |
-
margin-bottom: 1.5vw;
|
| 273 |
-
}
|
| 274 |
-
*/
|
| 275 |
|
| 276 |
|
| 277 |
|
|
@@ -293,25 +125,6 @@ h1 {
|
|
| 293 |
|
| 294 |
|
| 295 |
|
| 296 |
-
/*.input-box textarea {
|
| 297 |
-
flex: 1;
|
| 298 |
-
height: auto;*/ /* Automatically adjust height */
|
| 299 |
-
/*max-height: 80px;*/ /* Limit the maximum height */
|
| 300 |
-
/*overflow-y: auto;*/ /* Allow scrolling if needed */
|
| 301 |
-
/*resize: none;*/ /* Disable manual resizing */
|
| 302 |
-
/*padding: 8px;*/ /* Adjust padding for proper alignment */
|
| 303 |
-
/*font-size: 1rem;*/ /* Font size for input text */
|
| 304 |
-
/*line-height: 1.2;*/ /* Adjust line height for vertical centering */
|
| 305 |
-
/* border: 1px solid rgba(255, 255, 255, 0.13);*/
|
| 306 |
-
/*border: 1px solid rgb(93 145 195);
|
| 307 |
-
border-radius: 8px;*/ /* Smaller border radius */
|
| 308 |
-
/*background: rgba(255, 255, 255, 0.04);
|
| 309 |
-
color: white;
|
| 310 |
-
outline: none;
|
| 311 |
-
transition: border-color 0.3s ease, box-shadow 0.3s ease;
|
| 312 |
-
width: 100%;
|
| 313 |
-
box-sizing: border-box;
|
| 314 |
-
}*/
|
| 315 |
|
| 316 |
.input-box textarea {
|
| 317 |
flex: 1;
|
|
@@ -355,15 +168,7 @@ h1 {
|
|
| 355 |
|
| 356 |
|
| 357 |
|
| 358 |
-
|
| 359 |
-
font-size: 1rem;*/ /* Smaller font size */
|
| 360 |
-
/*padding: 6px 12px;*/ /* Smaller button padding */
|
| 361 |
-
/*border-radius: 8px;*/ /* Match text area border radius */
|
| 362 |
-
/*background: #a855f7;
|
| 363 |
-
color: white;
|
| 364 |
-
cursor: pointer;
|
| 365 |
-
transition: all 0.3s ease;
|
| 366 |
-
}*/
|
| 367 |
|
| 368 |
.input-box button {
|
| 369 |
width: 55px; /* Fixed button size */
|
|
@@ -574,21 +379,7 @@ h1 {
|
|
| 574 |
}
|
| 575 |
}
|
| 576 |
|
| 577 |
-
|
| 578 |
-
/*.error-box {
|
| 579 |
-
position: fixed;
|
| 580 |
-
top: 60%;
|
| 581 |
-
left: 50%;
|
| 582 |
-
transform: translate(-50%, -50%);
|
| 583 |
-
background: rgba(255, 0, 0, 0.8);
|
| 584 |
-
color: white;
|
| 585 |
-
padding: 12px 20px;
|
| 586 |
-
border-radius: 8px;
|
| 587 |
-
font-size: 14px;
|
| 588 |
-
text-align: center;
|
| 589 |
-
z-index: 1000;
|
| 590 |
-
animation: fadeIn 0.3s ease-in-out;
|
| 591 |
-
}*/
|
| 592 |
|
| 593 |
.error-text {
|
| 594 |
color: black;
|
|
@@ -732,37 +523,6 @@ h1 {
|
|
| 732 |
|
| 733 |
|
| 734 |
|
| 735 |
-
/*
|
| 736 |
-
Oviya - Hardcoded*/
|
| 737 |
-
/*.hardcoded-questions {
|
| 738 |
-
position: absolute;
|
| 739 |
-
background: white;
|
| 740 |
-
border: 1px solid #ccc;
|
| 741 |
-
border-radius: 5px;
|
| 742 |
-
padding: 10px;
|
| 743 |
-
width: 90%;
|
| 744 |
-
max-width: 400px;
|
| 745 |
-
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
|
| 746 |
-
margin-top: 5px;
|
| 747 |
-
z-index: 1000;
|
| 748 |
-
}
|
| 749 |
-
|
| 750 |
-
.hardcoded-questions ul {
|
| 751 |
-
list-style: none;
|
| 752 |
-
padding: 0;
|
| 753 |
-
margin: 0;
|
| 754 |
-
}
|
| 755 |
-
|
| 756 |
-
.hardcoded-questions li {
|
| 757 |
-
padding: 8px;
|
| 758 |
-
cursor: pointer;
|
| 759 |
-
transition: background 0.3s;
|
| 760 |
-
}
|
| 761 |
-
|
| 762 |
-
.hardcoded-questions li:hover {
|
| 763 |
-
background: #f0f0f0;
|
| 764 |
-
}*/
|
| 765 |
-
|
| 766 |
|
| 767 |
/* Container for hardcoded questions - Aligned left above the text field */
|
| 768 |
.hardcoded-questions-container {
|
|
@@ -814,17 +574,6 @@ Oviya - Hardcoded*/
|
|
| 814 |
}
|
| 815 |
|
| 816 |
|
| 817 |
-
/*.paragraph-block {
|
| 818 |
-
background: #2b6296;
|
| 819 |
-
color: white;
|
| 820 |
-
padding: 1vw;
|
| 821 |
-
border-radius: 1vw;
|
| 822 |
-
margin-bottom: 0.3vw;*/ /* Reduce space between paragraphs */
|
| 823 |
-
/*box-shadow: 0 0.3vw 0.8vw rgba(0, 0, 0, 0.1);
|
| 824 |
-
line-height: 1.5;
|
| 825 |
-
max-width: 48vw;
|
| 826 |
-
}*/
|
| 827 |
-
|
| 828 |
|
| 829 |
|
| 830 |
/* Message wrapper for each chat bubble */
|
|
@@ -861,17 +610,6 @@ Oviya - Hardcoded*/
|
|
| 861 |
object-fit: cover;
|
| 862 |
}
|
| 863 |
|
| 864 |
-
/* Individual Message Styling */
|
| 865 |
-
/*.message {
|
| 866 |
-
max-width: 50vw;
|
| 867 |
-
padding: 1vw 2vw;
|
| 868 |
-
border-radius: 2vw;
|
| 869 |
-
font-size: 1.2vw;
|
| 870 |
-
line-height: 1.5;
|
| 871 |
-
box-shadow: 0 0.3vw 0.8vw rgba(0, 0, 0, 0.1);
|
| 872 |
-
background: #2b6296;
|
| 873 |
-
color: white;
|
| 874 |
-
}*/
|
| 875 |
|
| 876 |
/* Separate paragraph blocks */
|
| 877 |
.ai .message {
|
|
|
|
| 33 |
font-size: 3vw;
|
| 34 |
color: white;
|
| 35 |
font-family: Super Cartoon;
|
| 36 |
+
position: absolute;
|
| 37 |
+
top: 50%;
|
| 38 |
+
left: 50%;
|
| 39 |
+
transform: translate(-50%, -50%);
|
| 40 |
}
|
| 41 |
|
| 42 |
@font-face {
|
|
|
|
| 89 |
flex-shrink: 0; /* Prevent shrinking */
|
| 90 |
}
|
| 91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
.chat-box {
|
| 94 |
display: flex;
|
|
|
|
| 104 |
|
| 105 |
|
| 106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
|
| 108 |
|
| 109 |
|
|
|
|
| 125 |
|
| 126 |
|
| 127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
.input-box textarea {
|
| 130 |
flex: 1;
|
|
|
|
| 168 |
|
| 169 |
|
| 170 |
|
| 171 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
.input-box button {
|
| 174 |
width: 55px; /* Fixed button size */
|
|
|
|
| 379 |
}
|
| 380 |
}
|
| 381 |
|
| 382 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 383 |
|
| 384 |
.error-text {
|
| 385 |
color: black;
|
|
|
|
| 523 |
|
| 524 |
|
| 525 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 526 |
|
| 527 |
/* Container for hardcoded questions - Aligned left above the text field */
|
| 528 |
.hardcoded-questions-container {
|
|
|
|
| 574 |
}
|
| 575 |
|
| 576 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 577 |
|
| 578 |
|
| 579 |
/* Message wrapper for each chat bubble */
|
|
|
|
| 610 |
object-fit: cover;
|
| 611 |
}
|
| 612 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 613 |
|
| 614 |
/* Separate paragraph blocks */
|
| 615 |
.ai .message {
|
src/app/chat/chat.component.html
CHANGED
|
@@ -4,9 +4,10 @@
|
|
| 4 |
<div class="chat-container">
|
| 5 |
<div class="header-container">
|
| 6 |
<div class="logo">
|
| 7 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 8 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 9 |
</a>
|
|
|
|
| 10 |
</div>
|
| 11 |
<div class="header-title">
|
| 12 |
<h1>Grammar Chat</h1>
|
|
|
|
| 4 |
<div class="chat-container">
|
| 5 |
<div class="header-container">
|
| 6 |
<div class="logo">
|
| 7 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 8 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 9 |
</a>
|
| 10 |
+
<span class="product-name">Py-Learn</span>
|
| 11 |
</div>
|
| 12 |
<div class="header-title">
|
| 13 |
<h1>Grammar Chat</h1>
|
src/app/findword/findword.component.css
CHANGED
|
@@ -30,15 +30,17 @@ body {
|
|
| 30 |
}
|
| 31 |
|
| 32 |
|
| 33 |
-
.header-title {
|
| 34 |
-
font-size: 2.6vw;
|
| 35 |
-
font-family: Super Cartoon;
|
| 36 |
-
color: #009688;
|
| 37 |
font-size: 3vw;
|
| 38 |
color: #fff;
|
| 39 |
margin: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
}
|
| 41 |
|
|
|
|
| 42 |
.home-btn img {
|
| 43 |
width: 5vw;
|
| 44 |
}
|
|
@@ -1053,8 +1055,8 @@ h2 {
|
|
| 1053 |
|
| 1054 |
|
| 1055 |
.close-btn1 {
|
| 1056 |
-
background-color: #
|
| 1057 |
-
color:
|
| 1058 |
border: none;
|
| 1059 |
padding: 0.4vw 0.9vw;
|
| 1060 |
border-radius: 50%;
|
|
@@ -1065,10 +1067,19 @@ h2 {
|
|
| 1065 |
right: -3.5vw;
|
| 1066 |
position: absolute;
|
| 1067 |
height: 3vw;
|
| 1068 |
-
font-size:
|
| 1069 |
font-weight: bold;
|
| 1070 |
}
|
| 1071 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1072 |
|
| 1073 |
/* Clean, static image at the left side (no blur, no animation) */
|
| 1074 |
.left-illustration {
|
|
|
|
| 30 |
}
|
| 31 |
|
| 32 |
|
| 33 |
+
.header-title h1 {
|
|
|
|
|
|
|
|
|
|
| 34 |
font-size: 3vw;
|
| 35 |
color: #fff;
|
| 36 |
margin: 0;
|
| 37 |
+
position: absolute;
|
| 38 |
+
top: 50%;
|
| 39 |
+
left: 50%;
|
| 40 |
+
transform: translate(-50%, -50%);
|
| 41 |
}
|
| 42 |
|
| 43 |
+
|
| 44 |
.home-btn img {
|
| 45 |
width: 5vw;
|
| 46 |
}
|
|
|
|
| 1055 |
|
| 1056 |
|
| 1057 |
.close-btn1 {
|
| 1058 |
+
background-color: #009688;
|
| 1059 |
+
color: black;
|
| 1060 |
border: none;
|
| 1061 |
padding: 0.4vw 0.9vw;
|
| 1062 |
border-radius: 50%;
|
|
|
|
| 1067 |
right: -3.5vw;
|
| 1068 |
position: absolute;
|
| 1069 |
height: 3vw;
|
| 1070 |
+
font-size: 1.3vw;
|
| 1071 |
font-weight: bold;
|
| 1072 |
}
|
| 1073 |
|
| 1074 |
+
.close-btn1:hover {
|
| 1075 |
+
transform: scale(1.06);
|
| 1076 |
+
box-shadow: 0 6px 14px rgba(0,0,0,.22);
|
| 1077 |
+
background: #f7fafc;
|
| 1078 |
+
}
|
| 1079 |
+
|
| 1080 |
+
.close-btn1:active {
|
| 1081 |
+
transform: scale(0.98);
|
| 1082 |
+
}
|
| 1083 |
|
| 1084 |
/* Clean, static image at the left side (no blur, no animation) */
|
| 1085 |
.left-illustration {
|
src/app/findword/findword.component.html
CHANGED
|
@@ -1,9 +1,10 @@
|
|
| 1 |
<div class="full-container">
|
| 2 |
<div class="header-container">
|
| 3 |
<div class="logo">
|
| 4 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 5 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 6 |
</a>
|
|
|
|
| 7 |
</div>
|
| 8 |
<div class="header-title">
|
| 9 |
<h1>Find the Word</h1>
|
|
|
|
| 1 |
<div class="full-container">
|
| 2 |
<div class="header-container">
|
| 3 |
<div class="logo">
|
| 4 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 5 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 6 |
</a>
|
| 7 |
+
<span class="product-name">Py-Learn</span>
|
| 8 |
</div>
|
| 9 |
<div class="header-title">
|
| 10 |
<h1>Find the Word</h1>
|
src/app/generate-questions/generate-questions.component.css
CHANGED
|
@@ -45,6 +45,10 @@ body {
|
|
| 45 |
font-size: 3vw;
|
| 46 |
color: #fff;
|
| 47 |
margin: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
}
|
| 49 |
|
| 50 |
.home-btn img {
|
|
|
|
| 45 |
font-size: 3vw;
|
| 46 |
color: #fff;
|
| 47 |
margin: 0;
|
| 48 |
+
position: absolute;
|
| 49 |
+
top: 50%;
|
| 50 |
+
left: 50%;
|
| 51 |
+
transform: translate(-50%, -50%);
|
| 52 |
}
|
| 53 |
|
| 54 |
.home-btn img {
|
src/app/generate-questions/generate-questions.component.html
CHANGED
|
@@ -8,9 +8,10 @@
|
|
| 8 |
<div class="header-container">
|
| 9 |
<!-- Logo Section -->
|
| 10 |
<div class="logo">
|
| 11 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 12 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 13 |
</a>
|
|
|
|
| 14 |
</div>
|
| 15 |
|
| 16 |
<!-- Title Section -->
|
|
|
|
| 8 |
<div class="header-container">
|
| 9 |
<!-- Logo Section -->
|
| 10 |
<div class="logo">
|
| 11 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 12 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 13 |
</a>
|
| 14 |
+
<span class="product-name">Py-Learn</span>
|
| 15 |
</div>
|
| 16 |
|
| 17 |
<!-- Title Section -->
|
src/app/listen/listen.component.css
CHANGED
|
@@ -41,6 +41,10 @@ body, html {
|
|
| 41 |
font-size: 3vw;
|
| 42 |
color: #fff;
|
| 43 |
margin: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
}
|
| 45 |
|
| 46 |
.home-btn img {
|
|
@@ -71,77 +75,6 @@ img {
|
|
| 71 |
|
| 72 |
|
| 73 |
|
| 74 |
-
/* Main Container Layout */
|
| 75 |
-
/*.main-container {
|
| 76 |
-
display: flex;
|
| 77 |
-
justify-content: space-between;
|
| 78 |
-
align-items: flex-start;
|
| 79 |
-
padding: 4vw;
|
| 80 |
-
gap: 2vw;
|
| 81 |
-
background-color: #fff;
|
| 82 |
-
border: 10px solid #009688;*/ /* ✅ Add this line for border */
|
| 83 |
-
/*border-radius: 1vw;
|
| 84 |
-
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.5);
|
| 85 |
-
margin: 2vw auto;
|
| 86 |
-
max-width: 90%;*/
|
| 87 |
-
/* ✅ Inside shadow */
|
| 88 |
-
/*box-shadow: inset 0 0 10px rgba(0, 150, 136, 0.5),*/ /* inner glow */
|
| 89 |
-
/*0 0.4vw 0.8vw rgba(0, 0, 0, 0.2);*/ /* existing outer shadow */
|
| 90 |
-
/*}
|
| 91 |
-
|
| 92 |
-
.left-content {
|
| 93 |
-
flex: 1;
|
| 94 |
-
max-width: 40%;
|
| 95 |
-
text-align: left;
|
| 96 |
-
}
|
| 97 |
-
|
| 98 |
-
.left-content h2 {
|
| 99 |
-
font-size: 2.5vw;
|
| 100 |
-
font-weight: bold;
|
| 101 |
-
color: #006780;
|
| 102 |
-
margin-bottom: 20px;
|
| 103 |
-
}
|
| 104 |
-
|
| 105 |
-
.left-content p {
|
| 106 |
-
font-size: 1.4vw;
|
| 107 |
-
margin-bottom: 2vw;
|
| 108 |
-
text-align: justify;
|
| 109 |
-
}
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
.video-upload-container {
|
| 113 |
-
display: flex;
|
| 114 |
-
flex-direction: column;
|
| 115 |
-
align-items: center;
|
| 116 |
-
max-width: 50%;
|
| 117 |
-
}
|
| 118 |
-
|
| 119 |
-
.video-preview-container {
|
| 120 |
-
margin-bottom: 1.5vw;
|
| 121 |
-
}
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
.video-preview-container video {
|
| 126 |
-
width: 50vw;
|
| 127 |
-
max-height: 40vh;
|
| 128 |
-
border-radius: 0.5vw;
|
| 129 |
-
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.2);
|
| 130 |
-
transition: all 0.5s ease-in-out;
|
| 131 |
-
margin-top: 2vw;
|
| 132 |
-
}
|
| 133 |
-
|
| 134 |
-
.video-upload-input {
|
| 135 |
-
display: none;
|
| 136 |
-
}
|
| 137 |
-
|
| 138 |
-
.video-placeholder {
|
| 139 |
-
width: 92%;
|
| 140 |
-
max-width: 36vw;
|
| 141 |
-
border-radius: 1vw;
|
| 142 |
-
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.2);
|
| 143 |
-
object-fit: contain;
|
| 144 |
-
}*/
|
| 145 |
|
| 146 |
/* Listen Card Style */
|
| 147 |
.listen-card1 {
|
|
|
|
| 41 |
font-size: 3vw;
|
| 42 |
color: #fff;
|
| 43 |
margin: 0;
|
| 44 |
+
position: absolute;
|
| 45 |
+
top: 50%;
|
| 46 |
+
left: 50%;
|
| 47 |
+
transform: translate(-50%, -50%);
|
| 48 |
}
|
| 49 |
|
| 50 |
.home-btn img {
|
|
|
|
| 75 |
|
| 76 |
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
|
| 79 |
/* Listen Card Style */
|
| 80 |
.listen-card1 {
|
src/app/listen/listen.component.html
CHANGED
|
@@ -6,9 +6,10 @@
|
|
| 6 |
<!-- Header Section -->
|
| 7 |
<div class="header-container">
|
| 8 |
<div class="logo">
|
| 9 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 10 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 11 |
</a>
|
|
|
|
| 12 |
</div>
|
| 13 |
<div class="header-title">
|
| 14 |
<h1>Listen</h1>
|
|
@@ -23,73 +24,6 @@
|
|
| 23 |
<!-- Background image (optional) -->
|
| 24 |
<img src="assets/images/listen.png" alt="Chat Background" class="grammar-bg" />
|
| 25 |
|
| 26 |
-
<!-- Main Container Layout -->
|
| 27 |
-
<!--<div class="main-container " *ngIf="questions.length === 0">-->
|
| 28 |
-
<!-- Left Section: Exercise Description -->
|
| 29 |
-
<!--<div class="left-content">
|
| 30 |
-
<h2>Welcome to the Listening Exercise</h2>
|
| 31 |
-
<p>
|
| 32 |
-
This listening exercise helps students improve their English listening skills.
|
| 33 |
-
Please upload your video and watch it fully. After the video is completed, the <strong>Generate Questions</strong> button will be enabled.
|
| 34 |
-
Answer questions to practice and strengthen understanding and memory.
|
| 35 |
-
</p>
|
| 36 |
-
|
| 37 |
-
<button class="generate-btn"
|
| 38 |
-
[disabled]="!isGenerateEnabled"
|
| 39 |
-
(click)="generateQuestions()">
|
| 40 |
-
Generate Questions
|
| 41 |
-
</button>
|
| 42 |
-
</div>-->
|
| 43 |
-
<!-- Right Section: Video or Image + Upload -->
|
| 44 |
-
<!--<div class="video-upload-container">-->
|
| 45 |
-
<!-- Show placeholder image until video is uploaded -->
|
| 46 |
-
<!--<div class="video-preview-container" *ngIf="!videoUrl">
|
| 47 |
-
<img src="assets/images/listen/listen3.png"
|
| 48 |
-
alt="Upload a video"
|
| 49 |
-
class="video-placeholder" />
|
| 50 |
-
</div>-->
|
| 51 |
-
<!-- Show video player after upload -->
|
| 52 |
-
<!--<div class="video-preview-container" *ngIf="videoUrl">
|
| 53 |
-
<video id="videoPreview"
|
| 54 |
-
controls
|
| 55 |
-
(ended)="onVideoEnded()"
|
| 56 |
-
controlsList="nodownload"
|
| 57 |
-
(error)="onVideoError()">
|
| 58 |
-
<source [src]="videoUrl" [type]="getVideoMimeType(videoUrl)" />
|
| 59 |
-
Your browser does not support the video tag.
|
| 60 |
-
</video>
|
| 61 |
-
</div>-->
|
| 62 |
-
<!-- Upload Button below image/video -->
|
| 63 |
-
<!--<input #uploadInput
|
| 64 |
-
type="file"
|
| 65 |
-
accept="video/mp4"
|
| 66 |
-
(change)="onFileSelected($event)"
|
| 67 |
-
class="video-upload-input" />
|
| 68 |
-
|
| 69 |
-
<div class="button-group">
|
| 70 |
-
<button *ngIf="videoUrl"
|
| 71 |
-
class="upload-btn"
|
| 72 |
-
(click)="toggleVideoPlayPause()">
|
| 73 |
-
{{ isVideoPlaying ? 'Pause' : 'Play' }}
|
| 74 |
-
</button>
|
| 75 |
-
|
| 76 |
-
<button class="replace-btn"
|
| 77 |
-
(click)="stopVideoIfPlaying(); uploadInput.click()"
|
| 78 |
-
[disabled]="isReplaceDisabled">
|
| 79 |
-
{{ uploadSuccess ? 'Replace Video' : 'Upload Video' }}
|
| 80 |
-
</button>
|
| 81 |
-
|
| 82 |
-
<button *ngIf="videoUrl && isReplaceDisabled"
|
| 83 |
-
class="reset-btn"
|
| 84 |
-
(click)="goToListen()">
|
| 85 |
-
Reset
|
| 86 |
-
</button>
|
| 87 |
-
|
| 88 |
-
</div>
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
</div>
|
| 92 |
-
</div>-->
|
| 93 |
<!-- Card Layout for Listen Exercise -->
|
| 94 |
<div class="listen-card1" *ngIf="questions.length === 0">
|
| 95 |
<!-- Left Section: Description -->
|
|
@@ -163,13 +97,6 @@
|
|
| 163 |
|
| 164 |
|
| 165 |
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
<div *ngIf="questions.length > 0" class="question-navigation">
|
| 174 |
|
| 175 |
<div class="question-block">
|
|
@@ -214,10 +141,6 @@
|
|
| 214 |
◀ Previous
|
| 215 |
</button>
|
| 216 |
|
| 217 |
-
<!--<div *ngIf="validated">
|
| 218 |
-
<span *ngIf="selectedAnswers[currentQuestionIndex] === 'correct'" class="correct-label">✅ Correct!</span>
|
| 219 |
-
<span *ngIf="selectedAnswers[currentQuestionIndex] === 'incorrect'" class="incorrect-label">❌ Incorrect!</span>
|
| 220 |
-
</div>-->
|
| 221 |
<!-- Right Side Buttons -->
|
| 222 |
<div class="right-buttons">
|
| 223 |
<!-- Submit (before validation) -->
|
|
|
|
| 6 |
<!-- Header Section -->
|
| 7 |
<div class="header-container">
|
| 8 |
<div class="logo">
|
| 9 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 10 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 11 |
</a>
|
| 12 |
+
<span class="product-name">Py-Learn</span>
|
| 13 |
</div>
|
| 14 |
<div class="header-title">
|
| 15 |
<h1>Listen</h1>
|
|
|
|
| 24 |
<!-- Background image (optional) -->
|
| 25 |
<img src="assets/images/listen.png" alt="Chat Background" class="grammar-bg" />
|
| 26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
<!-- Card Layout for Listen Exercise -->
|
| 28 |
<div class="listen-card1" *ngIf="questions.length === 0">
|
| 29 |
<!-- Left Section: Description -->
|
|
|
|
| 97 |
|
| 98 |
|
| 99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
<div *ngIf="questions.length > 0" class="question-navigation">
|
| 101 |
|
| 102 |
<div class="question-block">
|
|
|
|
| 141 |
◀ Previous
|
| 142 |
</button>
|
| 143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
<!-- Right Side Buttons -->
|
| 145 |
<div class="right-buttons">
|
| 146 |
<!-- Submit (before validation) -->
|
src/app/reading/reading.component.css
CHANGED
|
@@ -37,7 +37,11 @@
|
|
| 37 |
.header-title h1 {
|
| 38 |
font-size: 3vw;
|
| 39 |
color: #fff;
|
| 40 |
-
margin: 0
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
}
|
| 42 |
|
| 43 |
.home-btn img {
|
|
@@ -63,7 +67,7 @@
|
|
| 63 |
|
| 64 |
.main-container {
|
| 65 |
width: 85%;
|
| 66 |
-
margin:
|
| 67 |
border: 9px solid #009688;
|
| 68 |
border-radius: 1.5vw;
|
| 69 |
background: #fff;
|
|
@@ -72,11 +76,7 @@
|
|
| 72 |
height: 76vh
|
| 73 |
}
|
| 74 |
|
| 75 |
-
|
| 76 |
-
/*.main-container {
|
| 77 |
-
width: 94%;*/ /* was 85% */
|
| 78 |
-
/*padding: 1.5vw;*/ /* slightly tighter */
|
| 79 |
-
/*}*/
|
| 80 |
|
| 81 |
/* ===== Intro split (match reference, minimal side margins) ===== */
|
| 82 |
.intro-section.split {
|
|
@@ -325,17 +325,6 @@
|
|
| 325 |
:root {
|
| 326 |
--passage-font: 21px;
|
| 327 |
}
|
| 328 |
-
/* used by A−/A+ */
|
| 329 |
-
|
| 330 |
-
/* ---- Reading card ---- */
|
| 331 |
-
/*.reading-card {
|
| 332 |
-
width: 100%;
|
| 333 |
-
border-radius: 18px;
|
| 334 |
-
padding: 16px 16px 14px;
|
| 335 |
-
background: linear-gradient(#ffffff, #ffffff) padding-box, linear-gradient(135deg, #0aa19a, #6fd0cd) border-box;*/ /* teal gradient stroke */
|
| 336 |
-
/*border: 1px solid transparent;
|
| 337 |
-
box-shadow: 0 14px 32px rgba(0,0,0,.08);
|
| 338 |
-
}*/
|
| 339 |
|
| 340 |
/* Header */
|
| 341 |
.reading-head {
|
|
@@ -416,19 +405,6 @@
|
|
| 416 |
color: black;
|
| 417 |
}
|
| 418 |
|
| 419 |
-
/* .icon-btn1:active {
|
| 420 |
-
transform: translateY(1px);
|
| 421 |
-
}
|
| 422 |
-
|
| 423 |
-
.icon-btn1.active {
|
| 424 |
-
border-color: #95d0c9;
|
| 425 |
-
background: #eefaf8;
|
| 426 |
-
}
|
| 427 |
-
|
| 428 |
-
.icon-btn1.danger {
|
| 429 |
-
color: #b1241a;
|
| 430 |
-
}
|
| 431 |
-
*/
|
| 432 |
/* Meta chips */
|
| 433 |
.reading-meta {
|
| 434 |
display: flex;
|
|
@@ -819,28 +795,7 @@
|
|
| 819 |
.reset-btn:hover {
|
| 820 |
box-shadow: 0 12px 24px rgba(229,72,59,.25);
|
| 821 |
}
|
| 822 |
-
/*
|
| 823 |
-
.popup-overlay {
|
| 824 |
-
position: fixed;
|
| 825 |
-
top: 0;
|
| 826 |
-
left: 0;
|
| 827 |
-
width: 100%;
|
| 828 |
-
height: 100%;
|
| 829 |
-
background: rgba(0,0,0,.5);
|
| 830 |
-
display: flex;
|
| 831 |
-
justify-content: center;
|
| 832 |
-
align-items: center
|
| 833 |
-
}
|
| 834 |
|
| 835 |
-
.popup-content {
|
| 836 |
-
background: #fff;
|
| 837 |
-
padding: 2vw;
|
| 838 |
-
border-radius: 1vw;
|
| 839 |
-
box-shadow: 0 .5vw 1.5vw rgba(0,0,0,.1);
|
| 840 |
-
width: 40%;
|
| 841 |
-
text-align: center
|
| 842 |
-
}
|
| 843 |
-
*/
|
| 844 |
|
| 845 |
|
| 846 |
/* Loader Overlay */
|
|
@@ -902,69 +857,7 @@
|
|
| 902 |
}
|
| 903 |
|
| 904 |
|
| 905 |
-
/* reusable icon button base */
|
| 906 |
-
/*.icon-btn {
|
| 907 |
-
width: var(--icon-btn, 36px);
|
| 908 |
-
height: var(--icon-btn, 36px);
|
| 909 |
-
display: grid;
|
| 910 |
-
place-items: center;
|
| 911 |
-
border-radius: 10px;
|
| 912 |
-
border: 1px solid #cfe2e0;
|
| 913 |
-
background: #fff;
|
| 914 |
-
color: #006780;*/ /* text color if any */
|
| 915 |
-
/*cursor: pointer;
|
| 916 |
-
transition: box-shadow .15s, transform .05s, background .15s, border-color .15s;
|
| 917 |
-
}*/
|
| 918 |
-
|
| 919 |
-
/* back button specifics */
|
| 920 |
-
/*.icon-btn.back .icon-img {
|
| 921 |
-
width: var(--icon-size, 18px);
|
| 922 |
-
height: var(--icon-size, 18px);
|
| 923 |
-
object-fit: contain;
|
| 924 |
-
display: block;
|
| 925 |
-
transition: transform .12s, opacity .12s;
|
| 926 |
-
}*/
|
| 927 |
-
|
| 928 |
-
/* states */
|
| 929 |
-
/*.icon-btn.back:hover {
|
| 930 |
-
background: #f7fcfb;
|
| 931 |
-
box-shadow: 0 8px 18px rgba(0,0,0,.08);
|
| 932 |
-
border-color: #b9d6d3;
|
| 933 |
-
}
|
| 934 |
-
|
| 935 |
-
.icon-btn.back:hover .icon-img {
|
| 936 |
-
transform: translateX(-1px);*/ /* subtle nudge left */
|
| 937 |
-
/*}
|
| 938 |
|
| 939 |
-
.icon-btn.back:active {
|
| 940 |
-
transform: translateY(1px);
|
| 941 |
-
}
|
| 942 |
-
|
| 943 |
-
.icon-btn.back:disabled {
|
| 944 |
-
opacity: .5;
|
| 945 |
-
pointer-events: none;
|
| 946 |
-
}*/
|
| 947 |
-
|
| 948 |
-
/* optional: bigger/smaller controls via CSS variables */
|
| 949 |
-
/*:root {
|
| 950 |
-
--icon-btn: 36px;*/ /* button size */
|
| 951 |
-
/*--icon-size: 18px;*/ /* arrow size */
|
| 952 |
-
/*}*/
|
| 953 |
-
|
| 954 |
-
/* If you need a dark-on-teal variant inside colored headers: */
|
| 955 |
-
/*.header-on-teal .icon-btn.back {
|
| 956 |
-
background: #007e74;
|
| 957 |
-
border-color: #00756c;
|
| 958 |
-
}
|
| 959 |
-
|
| 960 |
-
.header-on-teal .icon-btn.back:hover {
|
| 961 |
-
background: #0a8a80;
|
| 962 |
-
}
|
| 963 |
-
|
| 964 |
-
.header-on-teal .icon-btn.back .icon-img {
|
| 965 |
-
filter: brightness(0) invert(1);*/ /* make white */
|
| 966 |
-
/*}*/
|
| 967 |
-
/* Overlay */
|
| 968 |
.popup-overlay {
|
| 969 |
position: fixed;
|
| 970 |
top: 0;
|
|
|
|
| 37 |
.header-title h1 {
|
| 38 |
font-size: 3vw;
|
| 39 |
color: #fff;
|
| 40 |
+
margin: 0;
|
| 41 |
+
position: absolute;
|
| 42 |
+
top: 50%;
|
| 43 |
+
left: 50%;
|
| 44 |
+
transform: translate(-50%, -50%);
|
| 45 |
}
|
| 46 |
|
| 47 |
.home-btn img {
|
|
|
|
| 67 |
|
| 68 |
.main-container {
|
| 69 |
width: 85%;
|
| 70 |
+
margin: 5vh auto;
|
| 71 |
border: 9px solid #009688;
|
| 72 |
border-radius: 1.5vw;
|
| 73 |
background: #fff;
|
|
|
|
| 76 |
height: 76vh
|
| 77 |
}
|
| 78 |
|
| 79 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
/* ===== Intro split (match reference, minimal side margins) ===== */
|
| 82 |
.intro-section.split {
|
|
|
|
| 325 |
:root {
|
| 326 |
--passage-font: 21px;
|
| 327 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 328 |
|
| 329 |
/* Header */
|
| 330 |
.reading-head {
|
|
|
|
| 405 |
color: black;
|
| 406 |
}
|
| 407 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 408 |
/* Meta chips */
|
| 409 |
.reading-meta {
|
| 410 |
display: flex;
|
|
|
|
| 795 |
.reset-btn:hover {
|
| 796 |
box-shadow: 0 12px 24px rgba(229,72,59,.25);
|
| 797 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 798 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 799 |
|
| 800 |
|
| 801 |
/* Loader Overlay */
|
|
|
|
| 857 |
}
|
| 858 |
|
| 859 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 860 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 861 |
.popup-overlay {
|
| 862 |
position: fixed;
|
| 863 |
top: 0;
|
src/app/reading/reading.component.html
CHANGED
|
@@ -2,9 +2,10 @@
|
|
| 2 |
<!-- Header -->
|
| 3 |
<div class="header-container">
|
| 4 |
<div class="logo">
|
| 5 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 6 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 7 |
</a>
|
|
|
|
| 8 |
</div>
|
| 9 |
|
| 10 |
<div class="header-title">
|
|
@@ -278,24 +279,18 @@
|
|
| 278 |
|
| 279 |
|
| 280 |
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
aria-live="polite"
|
| 285 |
-
aria-modal="true"
|
| 286 |
-
role="dialog">
|
| 287 |
<div class="congrats-card">
|
| 288 |
<div class="score-badge" aria-label="Your score">
|
| 289 |
-
Your Score:
|
| 290 |
-
<span class="score">{{ scoreCorrect }}</span>
|
| 291 |
-
<span class="sep">/</span>
|
| 292 |
-
<span class="total">{{ scoreTotal }}</span>
|
| 293 |
</div>
|
| 294 |
-
|
| 295 |
-
<
|
| 296 |
-
<p>You have completed all questions.</p>
|
| 297 |
|
| 298 |
<button class="start-over-btn" (click)="startOver()">Start Over</button>
|
| 299 |
</div>
|
| 300 |
-
|
| 301 |
</div>
|
|
|
|
|
|
|
|
|
| 2 |
<!-- Header -->
|
| 3 |
<div class="header-container">
|
| 4 |
<div class="logo">
|
| 5 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 6 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 7 |
</a>
|
| 8 |
+
<span class="product-name">Py-Learn</span>
|
| 9 |
</div>
|
| 10 |
|
| 11 |
<div class="header-title">
|
|
|
|
| 279 |
|
| 280 |
|
| 281 |
|
| 282 |
+
|
| 283 |
+
<!-- Congratulations overlay -->
|
| 284 |
+
<div class="congrats-overlay" *ngIf="showCongrats" aria-live="polite" aria-modal="true" role="dialog">
|
|
|
|
|
|
|
|
|
|
| 285 |
<div class="congrats-card">
|
| 286 |
<div class="score-badge" aria-label="Your score">
|
| 287 |
+
Your Score: <span class="score">{{ scoreCorrect }}</span> / <span class="total">{{ scoreTotal }}</span>
|
|
|
|
|
|
|
|
|
|
| 288 |
</div>
|
| 289 |
+
<h2>{{ congratsTitle }}</h2> <!-- Display the dynamic title -->
|
| 290 |
+
<p>{{ congratsMessage }}</p> <!-- Display the dynamic message -->
|
|
|
|
| 291 |
|
| 292 |
<button class="start-over-btn" (click)="startOver()">Start Over</button>
|
| 293 |
</div>
|
|
|
|
| 294 |
</div>
|
| 295 |
+
|
| 296 |
+
</div>
|
src/app/reading/reading.component.ts
CHANGED
|
@@ -476,10 +476,14 @@ export class ReadingComponent {
|
|
| 476 |
// add inside the component class
|
| 477 |
showCongrats = false;
|
| 478 |
scoreCorrect = 0;
|
| 479 |
-
|
| 480 |
private confettiInterval: any = null;
|
| 481 |
|
| 482 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 483 |
scheduleCongratsIfLast(): void {
|
| 484 |
// must be last question AND already marked as checked
|
| 485 |
const isLast = this.currentQuestionIndex === this.questions.length - 1;
|
|
@@ -491,11 +495,26 @@ export class ReadingComponent {
|
|
| 491 |
const { correct, total } = this.computeScore();
|
| 492 |
this.scoreCorrect = correct;
|
| 493 |
this.scoreTotal = total;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 494 |
this.showCongrats = true;
|
| 495 |
-
this.triggerConfetti();
|
| 496 |
}, 800);
|
| 497 |
}
|
| 498 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 499 |
/** Compute score without altering validation code. */
|
| 500 |
private computeScore(): { correct: number; total: number } {
|
| 501 |
let correct = 0;
|
|
|
|
| 476 |
// add inside the component class
|
| 477 |
showCongrats = false;
|
| 478 |
scoreCorrect = 0;
|
| 479 |
+
|
| 480 |
private confettiInterval: any = null;
|
| 481 |
|
| 482 |
+
// scoreCorrect: number = 0; // Correct answers
|
| 483 |
+
scoreTotal: number = 3; // Total number of questions
|
| 484 |
+
congratsTitle: string = '';
|
| 485 |
+
congratsMessage: string = '';
|
| 486 |
+
|
| 487 |
scheduleCongratsIfLast(): void {
|
| 488 |
// must be last question AND already marked as checked
|
| 489 |
const isLast = this.currentQuestionIndex === this.questions.length - 1;
|
|
|
|
| 495 |
const { correct, total } = this.computeScore();
|
| 496 |
this.scoreCorrect = correct;
|
| 497 |
this.scoreTotal = total;
|
| 498 |
+
|
| 499 |
+
// Determine message based on score
|
| 500 |
+
if (this.scoreCorrect === this.scoreTotal) {
|
| 501 |
+
this.showCongratsMessage("🎉 Congratulations 🎉", "You have completed all questions with a perfect score!");
|
| 502 |
+
} else if (this.scoreCorrect > 0) {
|
| 503 |
+
this.showCongratsMessage("Good Job!", "You did well, but there is room for improvement.");
|
| 504 |
+
} else {
|
| 505 |
+
this.showCongratsMessage("Keep Trying!", "Don't give up, try again!");
|
| 506 |
+
}
|
| 507 |
+
|
| 508 |
this.showCongrats = true;
|
| 509 |
+
this.triggerConfetti(); // Assuming this is a method that triggers confetti animation.
|
| 510 |
}, 800);
|
| 511 |
}
|
| 512 |
|
| 513 |
+
// Helper function to show the appropriate congratulatory message
|
| 514 |
+
showCongratsMessage(title: string, message: string) {
|
| 515 |
+
this.congratsTitle = title;
|
| 516 |
+
this.congratsMessage = message;
|
| 517 |
+
}
|
| 518 |
/** Compute score without altering validation code. */
|
| 519 |
private computeScore(): { correct: number; total: number } {
|
| 520 |
let correct = 0;
|
src/app/vocabulary-builder/vocabulary-builder.component.css
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
|
| 2 |
margin-top: 1rem;
|
| 3 |
padding: 1rem;
|
| 4 |
background-color: #f0f4f8;
|
| 5 |
border-radius: 8px;
|
| 6 |
border: 1px solid #cdd5df;
|
| 7 |
display: flex;
|
| 8 |
justify-content: space-between;
|
| 9 |
align-items: center;
|
| 10 |
padding: 0vw 2vw;
|
| 11 |
background-color: #009688;
|
| 12 |
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* Soft shadow */
|
| 13 |
width: 100%;
|
| 14 |
position: sticky;
|
| 15 |
top: 0;
|
| 16 |
max-width: 5vw;
|
| 17 |
height: auto;
|
| 18 |
background: #fff;
|
| 19 |
border-radius: 1vw;
|
| 20 |
margin: 0.5vw;
|
| 21 |
text-align: center;
|
| 22 |
flex: 1;
|
| 23 |
.header-title h1 {
|
| 24 |
font-size: 3vw;
|
| 25 |
color: #fff;
|
| 26 |
margin: 0;
|
| 27 |
}
|
| 28 |
width: 5vw;
|
| 29 |
.home-btn img:hover {
|
| 30 |
transform: scale(1.1);
|
| 31 |
}
|
| 32 |
background-image: url(/assets/images/grammar-bg.png);
|
| 33 |
background-size: auto;
|
| 34 |
background-position: center;
|
| 35 |
background-attachment: fixed;
|
| 36 |
width: 100%;
|
| 37 |
height: 100%;
|
| 38 |
position: absolute;
|
| 39 |
top: 10%;
|
| 40 |
left: 0;
|
| 41 |
width: 100%;
|
| 42 |
height: auto;
|
| 43 |
max-height: calc(100vh - 100px);
|
| 44 |
object-fit: fill;
|
| 45 |
z-index: -1;
|
| 46 |
opacity: 0.2;
|
| 47 |
background: rgba(255, 255, 255, 0.9);
|
| 48 |
width: 80vw;
|
| 49 |
position: absolute;
|
| 50 |
top: 50%;
|
| 51 |
left: 50%;
|
| 52 |
transform: translate(-50%, -50%);
|
| 53 |
height: 66vh;
|
| 54 |
display: flex;
|
| 55 |
justify-content: space-between;
|
| 56 |
align-items: flex-start;
|
| 57 |
padding: 4vw;
|
| 58 |
gap: 2vw;
|
| 59 |
background-color: #fff;
|
| 60 |
border: 10px solid #009688;
|
| 61 |
border-radius: 1vw;
|
| 62 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 63 |
margin: 2vw auto;
|
| 64 |
max-width: 90%;
|
| 65 |
display: flex;
|
| 66 |
align-items: center;
|
| 67 |
gap: 4vw;
|
| 68 |
width: 50%;
|
| 69 |
font-size: 2.5vw;
|
| 70 |
font-weight: 800;
|
| 71 |
color: #006780;
|
| 72 |
margin-bottom: 20px;
|
| 73 |
width: 100%;
|
| 74 |
height: auto;
|
| 75 |
border-radius: 10px;
|
| 76 |
width: 66%;
|
| 77 |
.description-container p {
|
| 78 |
font-size: 1.4vw;
|
| 79 |
margin-bottom: 30px;
|
| 80 |
text-align: justify;
|
| 81 |
}
|
| 82 |
position: relative;
|
| 83 |
border-radius: 0.5vw;
|
| 84 |
font-size: 1.5vw;
|
| 85 |
transition: background-color 0.3s;
|
| 86 |
width: auto;
|
| 87 |
font-weight: bold;
|
| 88 |
background-color: #006780;
|
| 89 |
border: none;
|
| 90 |
color: white;
|
| 91 |
padding: 15px 32px;
|
| 92 |
text-align: center;
|
| 93 |
text-decoration: none;
|
| 94 |
display: inline-flex;
|
| 95 |
align-items: center;
|
| 96 |
justify-content: center;
|
| 97 |
position: relative;
|
| 98 |
min-width: 5vw;
|
| 99 |
height: 2.9vw;
|
| 100 |
margin-top: 1.5vw;
|
| 101 |
.submit-button:hover {
|
| 102 |
background-color: #bdc3c7;
|
| 103 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 104 |
}
|
| 105 |
.submit-button:disabled {
|
| 106 |
background-color: #ccc;
|
| 107 |
cursor: not-allowed;
|
| 108 |
}
|
| 109 |
background: rgba(255, 255, 255, 0.9);
|
| 110 |
padding: 2vw;
|
| 111 |
border-radius: 1vw;
|
| 112 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 113 |
width: 80vw;
|
| 114 |
position: absolute;
|
| 115 |
top: 54%;
|
| 116 |
left: 50%;
|
| 117 |
transform: translate(-50%, -50%);
|
| 118 |
height: 70vh;
|
| 119 |
border: 10px solid #009688;
|
| 120 |
background-color: #fff;
|
| 121 |
.card2 .content-container {
|
| 122 |
display: flex;
|
| 123 |
justify-content: space-around;
|
| 124 |
align-items: center;
|
| 125 |
height: 100%;
|
| 126 |
}
|
| 127 |
max-width: 100%;
|
| 128 |
height: auto;
|
| 129 |
|
| 130 |
display: flex;
|
| 131 |
flex-direction: column;
|
| 132 |
align-items: center;
|
| 133 |
justify-content: center;
|
| 134 |
text-align: center;
|
| 135 |
width: 50%;
|
| 136 |
.word-container h2 {
|
| 137 |
font-size: 2.5rem;
|
| 138 |
font-weight: bold;
|
| 139 |
color: #333;
|
| 140 |
margin-top: 2.7vw;
|
| 141 |
}
|
| 142 |
width: 45%;
|
| 143 |
text-align: center;
|
| 144 |
padding: 20px;
|
| 145 |
background: rgba(255, 255, 255, 0.7);
|
| 146 |
border-radius: 10px;
|
| 147 |
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);
|
| 148 |
margin-right: 4vw;
|
| 149 |
font-size: 1.2vw;
|
| 150 |
margin-bottom: 20px;
|
| 151 |
font-weight: 700;
|
| 152 |
display: flex;
|
| 153 |
flex-direction: column;
|
| 154 |
align-items: center;
|
| 155 |
background-color: #ccc;
|
| 156 |
color: white;
|
| 157 |
padding: 12px 24px;
|
| 158 |
border-radius: 5px;
|
| 159 |
cursor: pointer;
|
| 160 |
font-size: 1.2rem;
|
| 161 |
margin: 10px;
|
| 162 |
width: 80%;
|
| 163 |
transition: background-color 0.3s ease;
|
| 164 |
background-color: #ffffff;
|
| 165 |
color: #333;
|
| 166 |
border: 2px solid #000000;
|
| 167 |
font-size: 1.1vw;
|
| 168 |
border-radius: 3vw;
|
| 169 |
transition: all 0.3s ease;
|
| 170 |
font-weight: 600;
|
| 171 |
display: flex;
|
| 172 |
align-items: center;
|
| 173 |
justify-content: center;
|
| 174 |
box-shadow: -1px 1vw 0.5vw rgb(0 0 0 / 13%);
|
| 175 |
height: 100%;
|
| 176 |
text-align: center;
|
| 177 |
white-space: normal;
|
| 178 |
word-break: break-word;
|
| 179 |
width: 21vw;
|
| 180 |
.option-btn.selected {
|
| 181 |
background-color: #e1f5fe !important;
|
| 182 |
border-color: #0277bd !important;
|
| 183 |
color: #01579b !important;
|
| 184 |
font-weight: 600;
|
| 185 |
}
|
| 186 |
.option-btn:hover {
|
| 187 |
background-color: #e1f5fe !important;
|
| 188 |
border-color: #0277bd !important;
|
| 189 |
color: #01579b !important;
|
| 190 |
font-weight: 600;
|
| 191 |
}
|
| 192 |
.option-btn.disabled {
|
| 193 |
cursor: not-allowed !important;
|
| 194 |
pointer-events: none !important;
|
| 195 |
}
|
| 196 |
.option-btn.correct {
|
| 197 |
background-color: #4caf506e !important;
|
| 198 |
border-color: #388E3C !important;
|
| 199 |
color: black;
|
| 200 |
font-weight: bold;
|
| 201 |
}
|
| 202 |
.option-btn.incorrect {
|
| 203 |
background-color: #f443367d !important;
|
| 204 |
border-color: #C62828 !important;
|
| 205 |
color: black;
|
| 206 |
font-weight: bold;
|
| 207 |
}
|
| 208 |
background: rgba(255, 255, 255, 0.9);
|
| 209 |
padding: 2vw;
|
| 210 |
border-radius: 1vw;
|
| 211 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 212 |
width: 80vw;
|
| 213 |
position: absolute;
|
| 214 |
top: 55%;
|
| 215 |
left: 50%;
|
| 216 |
transform: translate(-50%, -50%);
|
| 217 |
height: 70vh;
|
| 218 |
display: flex;
|
| 219 |
flex-direction: column;
|
| 220 |
align-items: center;
|
| 221 |
overflow-y: auto;
|
| 222 |
border: 10px solid #009688;
|
| 223 |
background-color: #fff;
|
| 224 |
list-style-type: disc;
|
| 225 |
padding: 0 5vw;
|
| 226 |
color: #000000;
|
| 227 |
overflow-y: auto;
|
| 228 |
height: 18vw;
|
| 229 |
font-size: 1.5vw;
|
| 230 |
margin-bottom: 30px;
|
| 231 |
text-align: justify;
|
| 232 |
.feedback-list1 li {
|
| 233 |
margin-bottom: 10px;
|
| 234 |
line-height: 1.5;
|
| 235 |
display: list-item;
|
| 236 |
}
|
| 237 |
list-style-type: none !important;
|
| 238 |
text-align: justify;
|
| 239 |
height: 20vw;
|
| 240 |
overflow-y: auto;
|
| 241 |
padding: 0 3vw;
|
| 242 |
margin-bottom: 2vw;
|
| 243 |
font-size: 1.5vw;
|
| 244 |
.feedback-list li {
|
| 245 |
margin-bottom: 1vw;
|
| 246 |
font-weight: 500;
|
| 247 |
}
|
| 248 |
color: green;
|
| 249 |
color: red;
|
| 250 |
0% {
|
| 251 |
transform: translate(-50%, -50%) rotate(0deg);
|
| 252 |
}
|
| 253 |
100% {
|
| 254 |
transform: translate(-50%, -50%) rotate(360deg);
|
| 255 |
}
|
| 256 |
background: white;
|
| 257 |
padding: 1vw;
|
| 258 |
border-radius: 1vw;
|
| 259 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 260 |
width: 80vw;
|
| 261 |
position: absolute;
|
| 262 |
top: 55%;
|
| 263 |
left: 50%;
|
| 264 |
transform: translate(-50%, -50%);
|
| 265 |
height: 73vh;
|
| 266 |
max-height: 80vh;
|
| 267 |
display: flex;
|
| 268 |
flex-direction: column;
|
| 269 |
justify-content: space-between;
|
| 270 |
align-items: center;
|
| 271 |
text-align: center;
|
| 272 |
overflow-y: auto;
|
| 273 |
border: 10px solid #009688;
|
| 274 |
|
| 275 |
resize: none
|
| 276 |
font-size: 1.8vw;
|
| 277 |
text-align: center;
|
| 278 |
margin-bottom: 20px;
|
| 279 |
color: #006780;
|
| 280 |
font-weight: 600;
|
| 281 |
display: flex;
|
| 282 |
flex-direction: column;
|
| 283 |
align-items: center;
|
| 284 |
width: 100%;
|
| 285 |
display: flex;
|
| 286 |
justify-content: space-between;
|
| 287 |
align-items: center;
|
| 288 |
width: 80%;
|
| 289 |
max-width: 600px;
|
| 290 |
margin-bottom: 20px;
|
| 291 |
.card4 .sentence-input-group label {
|
| 292 |
font-weight: bold;
|
| 293 |
text-align: left;
|
| 294 |
width: 30%;
|
| 295 |
font-size: 1.7vw;
|
| 296 |
}
|
| 297 |
.card4 .sentence-input-group .input-group {
|
| 298 |
width: 60%;
|
| 299 |
}
|
| 300 |
.card4 .sentence-input-group textarea {
|
| 301 |
width: 138%;
|
| 302 |
height: 100%;
|
| 303 |
font-size: 1.4rem;
|
| 304 |
border: 2px solid #006780;
|
| 305 |
font-family: Arial, sans-serif;
|
| 306 |
border-radius: 8px;
|
| 307 |
padding: 0.4vw;
|
| 308 |
}
|
| 309 |
.card4 .sentence-input-group textarea:focus {
|
| 310 |
outline: none;
|
| 311 |
border: 1px solid #007bff;
|
| 312 |
}
|
| 313 |
background: rgba(255, 255, 255, 0.9);
|
| 314 |
width: 80vw;
|
| 315 |
position: absolute;
|
| 316 |
top: 55%;
|
| 317 |
left: 50%;
|
| 318 |
transform: translate(-50%, -50%);
|
| 319 |
height: 73vh;
|
| 320 |
max-height: 80vh;
|
| 321 |
padding: 20px;
|
| 322 |
display: flex;
|
| 323 |
flex-direction: column;
|
| 324 |
justify-content: space-between;
|
| 325 |
align-items: center;
|
| 326 |
text-align: center;
|
| 327 |
overflow-y: auto;
|
| 328 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 329 |
background-color: #fff;
|
| 330 |
border: 10px solid #009688;
|
| 331 |
border-radius: 1vw;
|
| 332 |
.card5 .feedback-text {
|
| 333 |
font-size: 1.8vw;
|
| 334 |
font-weight: 600;
|
| 335 |
color: #333;
|
| 336 |
margin-top: 1vw;
|
| 337 |
word-wrap: break-word;
|
| 338 |
max-height: 400px;
|
| 339 |
overflow-y: auto;
|
| 340 |
padding-left: 20px;
|
| 341 |
padding-right: 20px;
|
| 342 |
text-align: justify;
|
| 343 |
margin-bottom: 1vw;
|
| 344 |
}
|
| 345 |
position: absolute;
|
| 346 |
top: 1vw;
|
| 347 |
left: 2vw;
|
| 348 |
color: #007bff;
|
| 349 |
font-size: 24px;
|
| 350 |
width: 5vw;
|
| 351 |
cursor: pointer;
|
| 352 |
transition: transform 0.2s ease-in-out;
|
| 353 |
.back-icon:hover {
|
| 354 |
transform: scale(1.1);
|
| 355 |
color: #0056b3;
|
| 356 |
}
|
| 357 |
.back-icon img {
|
| 358 |
width: 30px;
|
| 359 |
height: auto;
|
| 360 |
cursor: pointer;
|
| 361 |
}
|
| 362 |
position: fixed;
|
| 363 |
top: 0;
|
| 364 |
left: 0;
|
| 365 |
width: 100%;
|
| 366 |
height: 100%;
|
| 367 |
|
| 368 |
display: flex;
|
| 369 |
justify-content: center;
|
| 370 |
align-items: center;
|
| 371 |
z-index: 1000;
|
| 372 |
font-size: 15px;
|
| 373 |
width: 1.5em;
|
| 374 |
height: 1.5em;
|
| 375 |
border-radius: 50%;
|
| 376 |
position: relative;
|
| 377 |
text-indent: -9999em;
|
| 378 |
animation: mulShdSpin 1.1s infinite ease;
|
| 379 |
transform: translateZ(0);
|
| 380 |
0%, 100% {
|
| 381 |
box-shadow: 0em -3em 0em 0em #808080, 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.5), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7);
|
| 382 |
}
|
| 383 |
12.5% {
|
| 384 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.7), 2.2em -2.2em 0 0em #808080, 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5);
|
| 385 |
}
|
| 386 |
25% {
|
| 387 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.5), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7), 3em 0em 0 0em #808080, 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 388 |
}
|
| 389 |
37.5% {
|
| 390 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5), 3em 0em 0 0em rgba(128, 128, 128, 0.7), 2.2em 2.2em 0 0em #808080, 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 391 |
}
|
| 392 |
50% {
|
| 393 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.5), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), 0em 3em 0 0em #808080, -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 394 |
}
|
| 395 |
62.5% {
|
| 396 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), 0em 3em 0 0em rgba(128, 128, 128, 0.7), -2.2em 2.2em 0 0em #808080, -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 397 |
}
|
| 398 |
75% {
|
| 399 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.5), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), -3em 0em 0 0em #808080, -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 400 |
}
|
| 401 |
87.5% {
|
| 402 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), -3em 0em 0 0em rgba(128, 128, 128, 0.7), -2.2em -2.2em 0 0em #808080;
|
| 403 |
}
|
|
|
|
| 404 |
margin-top: 1rem;
|
| 405 |
padding: 1rem;
|
| 406 |
background-color: #f0f4f8;
|
| 407 |
border-radius: 8px;
|
| 408 |
border: 1px solid #cdd5df;
|
| 409 |
display: flex;
|
| 410 |
justify-content: space-between;
|
| 411 |
align-items: center;
|
| 412 |
padding: 0vw 2vw;
|
| 413 |
background-color: #009688;
|
| 414 |
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* Soft shadow */
|
| 415 |
width: 100%;
|
| 416 |
position: sticky;
|
| 417 |
top: 0;
|
| 418 |
max-width: 5vw;
|
| 419 |
height: auto;
|
| 420 |
background: #fff;
|
| 421 |
border-radius: 1vw;
|
| 422 |
margin: 0.5vw;
|
| 423 |
text-align: center;
|
| 424 |
flex: 1;
|
| 425 |
.header-title h1 {
|
| 426 |
font-size: 3vw;
|
| 427 |
color: #fff;
|
| 428 |
margin: 0;
|
| 429 |
position: absolute;
|
| 430 |
top: 50%;
|
| 431 |
left: 50%;
|
| 432 |
transform: translate(-50%, -50%);
|
| 433 |
}
|
| 434 |
width: 5vw;
|
| 435 |
.home-btn img:hover {
|
| 436 |
transform: scale(1.1);
|
| 437 |
}
|
| 438 |
background-image: url(/assets/images/grammar-bg.png);
|
| 439 |
background-size: auto;
|
| 440 |
background-position: center;
|
| 441 |
background-attachment: fixed;
|
| 442 |
width: 100%;
|
| 443 |
height: 100%;
|
| 444 |
position: absolute;
|
| 445 |
top: 10%;
|
| 446 |
left: 0;
|
| 447 |
width: 100%;
|
| 448 |
height: auto;
|
| 449 |
max-height: calc(100vh - 100px);
|
| 450 |
object-fit: fill;
|
| 451 |
z-index: -1;
|
| 452 |
opacity: 0.2;
|
| 453 |
background: rgba(255, 255, 255, 0.9);
|
| 454 |
width: 80vw;
|
| 455 |
position: absolute;
|
| 456 |
top: 50%;
|
| 457 |
left: 50%;
|
| 458 |
transform: translate(-50%, -50%);
|
| 459 |
height: 66vh;
|
| 460 |
display: flex;
|
| 461 |
justify-content: space-between;
|
| 462 |
align-items: flex-start;
|
| 463 |
padding: 4vw;
|
| 464 |
gap: 2vw;
|
| 465 |
background-color: #fff;
|
| 466 |
border: 10px solid #009688;
|
| 467 |
border-radius: 1vw;
|
| 468 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 469 |
margin: 2vw auto;
|
| 470 |
max-width: 90%;
|
| 471 |
display: flex;
|
| 472 |
align-items: center;
|
| 473 |
gap: 4vw;
|
| 474 |
width: 50%;
|
| 475 |
font-size: 2.5vw;
|
| 476 |
font-weight: 800;
|
| 477 |
color: #006780;
|
| 478 |
margin-bottom: 20px;
|
| 479 |
text-align: center;
|
| 480 |
width: 100%;
|
| 481 |
height: auto;
|
| 482 |
border-radius: 10px;
|
| 483 |
width: 66%;
|
| 484 |
.description-container p {
|
| 485 |
font-size: 1.4vw;
|
| 486 |
margin-bottom: 30px;
|
| 487 |
text-align: justify;
|
| 488 |
}
|
| 489 |
position: relative;
|
| 490 |
border-radius: 0.5vw;
|
| 491 |
font-size: 1.5vw;
|
| 492 |
transition: background-color 0.3s;
|
| 493 |
width: auto;
|
| 494 |
font-weight: bold;
|
| 495 |
background-color: #006780;
|
| 496 |
border: none;
|
| 497 |
color: white;
|
| 498 |
padding: 15px 32px;
|
| 499 |
text-align: center;
|
| 500 |
text-decoration: none;
|
| 501 |
display: inline-flex;
|
| 502 |
align-items: center;
|
| 503 |
justify-content: center;
|
| 504 |
position: relative;
|
| 505 |
min-width: 5vw;
|
| 506 |
height: 2.9vw;
|
| 507 |
margin-top: 1.5vw;
|
| 508 |
.validate-button:hover {
|
| 509 |
background-color: #bdc3c7;
|
| 510 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 511 |
}
|
| 512 |
.validate-button:disabled {
|
| 513 |
background-color: #ccc;
|
| 514 |
cursor: not-allowed;
|
| 515 |
}
|
| 516 |
position: absolute;
|
| 517 |
border-radius: 0.5vw;
|
| 518 |
font-size: 1.5vw;
|
| 519 |
transition: background-color 0.3s;
|
| 520 |
font-weight: bold;
|
| 521 |
background-color: #006780;
|
| 522 |
border: none;
|
| 523 |
color: white;
|
| 524 |
left: 50%;
|
| 525 |
text-decoration: none;
|
| 526 |
transform: translateX(-50%);
|
| 527 |
padding: 0.5vw;
|
| 528 |
.submit-button:hover {
|
| 529 |
background-color: #bdc3c7;
|
| 530 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 531 |
}
|
| 532 |
.submit-button:disabled {
|
| 533 |
background-color: #ccc;
|
| 534 |
cursor: not-allowed;
|
| 535 |
}
|
| 536 |
background: rgba(255, 255, 255, 0.9);
|
| 537 |
padding: 2vw;
|
| 538 |
border-radius: 1vw;
|
| 539 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 540 |
width: 80vw;
|
| 541 |
position: absolute;
|
| 542 |
top: 54%;
|
| 543 |
left: 50%;
|
| 544 |
transform: translate(-50%, -50%);
|
| 545 |
height: 70vh;
|
| 546 |
border: 10px solid #009688;
|
| 547 |
background-color: #fff;
|
| 548 |
.card2 .content-container {
|
| 549 |
display: flex;
|
| 550 |
justify-content: space-around;
|
| 551 |
align-items: center;
|
| 552 |
height: 100%;
|
| 553 |
}
|
| 554 |
max-width: 100%;
|
| 555 |
height: auto;
|
| 556 |
display: flex;
|
| 557 |
flex-direction: column;
|
| 558 |
align-items: center;
|
| 559 |
justify-content: center;
|
| 560 |
text-align: center;
|
| 561 |
width: 50%;
|
| 562 |
.word-container h2 {
|
| 563 |
font-size: 2.5rem;
|
| 564 |
font-weight: bold;
|
| 565 |
color: #333;
|
| 566 |
margin-top: 2.7vw;
|
| 567 |
}
|
| 568 |
width: 45%;
|
| 569 |
text-align: center;
|
| 570 |
padding: 20px;
|
| 571 |
background: rgba(255, 255, 255, 0.7);
|
| 572 |
border-radius: 10px;
|
| 573 |
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);
|
| 574 |
margin-right: 4vw;
|
| 575 |
font-size: 1.2vw;
|
| 576 |
margin-bottom: 20px;
|
| 577 |
font-weight: 700;
|
| 578 |
display: flex;
|
| 579 |
flex-direction: column;
|
| 580 |
align-items: center;
|
| 581 |
background-color: #ccc;
|
| 582 |
color: white;
|
| 583 |
padding: 12px 24px;
|
| 584 |
border-radius: 5px;
|
| 585 |
cursor: pointer;
|
| 586 |
font-size: 1.2rem;
|
| 587 |
margin: 10px;
|
| 588 |
width: 80%;
|
| 589 |
transition: background-color 0.3s ease;
|
| 590 |
background-color: #ffffff;
|
| 591 |
color: #333;
|
| 592 |
border: 2px solid #000000;
|
| 593 |
font-size: 1.1vw;
|
| 594 |
border-radius: 3vw;
|
| 595 |
transition: all 0.3s ease;
|
| 596 |
font-weight: 600;
|
| 597 |
display: flex;
|
| 598 |
align-items: center;
|
| 599 |
justify-content: center;
|
| 600 |
box-shadow: -1px 1vw 0.5vw rgb(0 0 0 / 13%);
|
| 601 |
height: 100%;
|
| 602 |
text-align: center;
|
| 603 |
white-space: normal;
|
| 604 |
word-break: break-word;
|
| 605 |
width: 21vw;
|
| 606 |
/* Make state classes override :hover */
|
| 607 |
.option-btn.correct,
|
| 608 |
.option-btn.incorrect,
|
| 609 |
.option-btn.selected {
|
| 610 |
position: relative; /* keeps layout stable */
|
| 611 |
}
|
| 612 |
/* Correct = green (state wins even on hover) */
|
| 613 |
.option-btn.correct,
|
| 614 |
.option-btn.correct:hover {
|
| 615 |
background: #e8f7ed; /* soft green */
|
| 616 |
border-color: #22c55e; /* green-500 */
|
| 617 |
color: #14532d; /* dark green text */
|
| 618 |
}
|
| 619 |
/* Incorrect = red (state wins even on hover) */
|
| 620 |
.option-btn.incorrect,
|
| 621 |
.option-btn.incorrect:hover {
|
| 622 |
background: #fee2e2; /* soft red */
|
| 623 |
border-color: #ef4444; /* red-500 */
|
| 624 |
color: #7f1d1d; /* dark red text */
|
| 625 |
}
|
| 626 |
/* Selected (pre-validation) = blue (state wins even on hover) */
|
| 627 |
.option-btn.selected,
|
| 628 |
.option-btn.selected:hover {
|
| 629 |
background: #e0f2fe; /* soft blue */
|
| 630 |
border-color: #3b82f6; /* blue-500 */
|
| 631 |
color: #0c4a6e; /* dark blue text */
|
| 632 |
}
|
| 633 |
/* Default hover only when no state class is present */
|
| 634 |
.option-btn:not(.selected):not(.correct):not(.incorrect):hover {
|
| 635 |
background: #f3f4f6; /* light grey hover */
|
| 636 |
}
|
| 637 |
/* Optional: disabled look still visible */
|
| 638 |
.option-btn.disabled,
|
| 639 |
.option-btn:disabled {
|
| 640 |
cursor: not-allowed;
|
| 641 |
filter: grayscale(10%);
|
| 642 |
}
|
| 643 |
.option-btn.picked {
|
| 644 |
outline: 2px dashed rgba(0,0,0,0.25);
|
| 645 |
outline-offset: 2px;
|
| 646 |
}
|
| 647 |
margin-left: 8px;
|
| 648 |
padding: 2px 8px;
|
| 649 |
border-radius: 12px;
|
| 650 |
font-size: 12px;
|
| 651 |
background: rgba(0,0,0,0.06);
|
| 652 |
background: rgba(255, 255, 255, 0.9);
|
| 653 |
padding: 2vw;
|
| 654 |
border-radius: 1vw;
|
| 655 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 656 |
width: 80vw;
|
| 657 |
position: absolute;
|
| 658 |
top: 54%;
|
| 659 |
left: 50%;
|
| 660 |
transform: translate(-50%, -50%);
|
| 661 |
height: 70vh;
|
| 662 |
border: 10px solid #009688;
|
| 663 |
background-color: #fff;
|
| 664 |
list-style-type: disc;
|
| 665 |
padding: 0 5vw;
|
| 666 |
color: #000000;
|
| 667 |
overflow-y: auto;
|
| 668 |
height: 18vw;
|
| 669 |
font-size: 1.5vw;
|
| 670 |
margin-bottom: 30px;
|
| 671 |
text-align: justify;
|
| 672 |
.feedback-list1 li {
|
| 673 |
margin-bottom: 10px;
|
| 674 |
line-height: 1.5;
|
| 675 |
display: list-item;
|
| 676 |
}
|
| 677 |
list-style-type: none !important;
|
| 678 |
text-align: justify;
|
| 679 |
height: 20vw;
|
| 680 |
overflow-y: auto;
|
| 681 |
padding: 0 3vw;
|
| 682 |
margin-bottom: 2vw;
|
| 683 |
font-size: 1.5vw;
|
| 684 |
.feedback-list li {
|
| 685 |
margin-bottom: 1vw;
|
| 686 |
font-weight: 500;
|
| 687 |
}
|
| 688 |
color: green;
|
| 689 |
color: red;
|
| 690 |
0% {
|
| 691 |
transform: translate(-50%, -50%) rotate(0deg);
|
| 692 |
}
|
| 693 |
100% {
|
| 694 |
transform: translate(-50%, -50%) rotate(360deg);
|
| 695 |
}
|
| 696 |
background: rgba(255, 255, 255, 0.9);
|
| 697 |
padding: 2vw;
|
| 698 |
border-radius: 1vw;
|
| 699 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 700 |
width: 80vw;
|
| 701 |
position: absolute;
|
| 702 |
top: 54%;
|
| 703 |
left: 50%;
|
| 704 |
transform: translate(-50%, -50%);
|
| 705 |
height: 70vh;
|
| 706 |
border: 10px solid #009688;
|
| 707 |
background-color: #fff;
|
| 708 |
resize: none
|
| 709 |
font-size: 1.8vw;
|
| 710 |
text-align: center;
|
| 711 |
margin-bottom: 20px;
|
| 712 |
color: #006780;
|
| 713 |
font-weight: 600;
|
| 714 |
display: flex;
|
| 715 |
flex-direction: column;
|
| 716 |
align-items: center;
|
| 717 |
width: 100%;
|
| 718 |
display: flex;
|
| 719 |
justify-content: space-between;
|
| 720 |
align-items: center;
|
| 721 |
width: 80%;
|
| 722 |
max-width: 600px;
|
| 723 |
margin-bottom: 20px;
|
| 724 |
.card4 .sentence-input-group label {
|
| 725 |
font-weight: bold;
|
| 726 |
text-align: left;
|
| 727 |
width: 30%;
|
| 728 |
font-size: 1.7vw;
|
| 729 |
}
|
| 730 |
.card4 .sentence-input-group .input-group {
|
| 731 |
width: 60%;
|
| 732 |
}
|
| 733 |
.card4 .sentence-input-group textarea {
|
| 734 |
width: 138%;
|
| 735 |
height: 100%;
|
| 736 |
font-size: 1.4rem;
|
| 737 |
border: 2px solid #006780;
|
| 738 |
font-family: Arial, sans-serif;
|
| 739 |
border-radius: 8px;
|
| 740 |
padding: 0.4vw;
|
| 741 |
}
|
| 742 |
.card4 .sentence-input-group textarea:focus {
|
| 743 |
outline: none;
|
| 744 |
border: 1px solid #007bff;
|
| 745 |
}
|
| 746 |
background: rgba(255, 255, 255, 0.9);
|
| 747 |
padding: 2vw;
|
| 748 |
border-radius: 1vw;
|
| 749 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 750 |
width: 80vw;
|
| 751 |
position: absolute;
|
| 752 |
top: 54%;
|
| 753 |
left: 50%;
|
| 754 |
transform: translate(-50%, -50%);
|
| 755 |
height: 70vh;
|
| 756 |
border: 10px solid #009688;
|
| 757 |
background-color: #fff;
|
| 758 |
.card5 .feedback-text {
|
| 759 |
font-size: 1.8vw;
|
| 760 |
font-weight: 600;
|
| 761 |
color: #333;
|
| 762 |
margin-top: 1vw;
|
| 763 |
word-wrap: break-word;
|
| 764 |
max-height: 400px;
|
| 765 |
overflow-y: auto;
|
| 766 |
padding-left: 20px;
|
| 767 |
padding-right: 20px;
|
| 768 |
text-align: justify;
|
| 769 |
margin-bottom: 1vw;
|
| 770 |
}
|
| 771 |
position: absolute;
|
| 772 |
top: 1vw;
|
| 773 |
left: 2vw;
|
| 774 |
color: #007bff;
|
| 775 |
font-size: 24px;
|
| 776 |
width: 5vw;
|
| 777 |
cursor: pointer;
|
| 778 |
transition: transform 0.2s ease-in-out;
|
| 779 |
.back-icon:hover {
|
| 780 |
transform: scale(1.1);
|
| 781 |
color: #0056b3;
|
| 782 |
}
|
| 783 |
.back-icon img {
|
| 784 |
width: 30px;
|
| 785 |
height: auto;
|
| 786 |
cursor: pointer;
|
| 787 |
}
|
| 788 |
position: absolute;
|
| 789 |
top: -1vw;
|
| 790 |
right: -1.4vw;
|
| 791 |
width: 36px;
|
| 792 |
height: 36px;
|
| 793 |
display: grid;
|
| 794 |
place-items: center;
|
| 795 |
border-radius: 50%;
|
| 796 |
background: #009688;
|
| 797 |
color: #0f172a;
|
| 798 |
border: 4px solid #009688;
|
| 799 |
font-size: 18px;
|
| 800 |
font-weight: 800;
|
| 801 |
cursor: pointer;
|
| 802 |
box-shadow: 0 4px 10px rgba(0, 0, 0, .15);
|
| 803 |
transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
|
| 804 |
z-index: 10;
|
| 805 |
.icon-btn1:hover {
|
| 806 |
transform: scale(1.06);
|
| 807 |
box-shadow: 0 6px 14px rgba(0,0,0,.22);
|
| 808 |
background: #f7fafc;
|
| 809 |
}
|
| 810 |
.icon-btn1:active {
|
| 811 |
transform: scale(0.98);
|
| 812 |
}
|
| 813 |
.icon-btn1 {
|
| 814 |
width: 50px;
|
| 815 |
height: 50px;
|
| 816 |
font-size: 20px;
|
| 817 |
}
|
| 818 |
position: fixed;
|
| 819 |
top: 0;
|
| 820 |
left: 0;
|
| 821 |
width: 100%;
|
| 822 |
height: 100%;
|
| 823 |
display: flex;
|
| 824 |
justify-content: center;
|
| 825 |
align-items: center;
|
| 826 |
z-index: 1000;
|
| 827 |
font-size: 15px;
|
| 828 |
width: 1.5em;
|
| 829 |
height: 1.5em;
|
| 830 |
border-radius: 50%;
|
| 831 |
position: relative;
|
| 832 |
text-indent: -9999em;
|
| 833 |
animation: mulShdSpin 1.1s infinite ease;
|
| 834 |
transform: translateZ(0);
|
| 835 |
0%, 100% {
|
| 836 |
box-shadow: 0em -3em 0em 0em #808080, 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.5), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7);
|
| 837 |
}
|
| 838 |
12.5% {
|
| 839 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.7), 2.2em -2.2em 0 0em #808080, 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5);
|
| 840 |
}
|
| 841 |
25% {
|
| 842 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.5), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7), 3em 0em 0 0em #808080, 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 843 |
}
|
| 844 |
37.5% {
|
| 845 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5), 3em 0em 0 0em rgba(128, 128, 128, 0.7), 2.2em 2.2em 0 0em #808080, 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 846 |
}
|
| 847 |
50% {
|
| 848 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.5), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), 0em 3em 0 0em #808080, -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 849 |
}
|
| 850 |
62.5% {
|
| 851 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), 0em 3em 0 0em rgba(128, 128, 128, 0.7), -2.2em 2.2em 0 0em #808080, -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 852 |
}
|
| 853 |
75% {
|
| 854 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.5), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), -3em 0em 0 0em #808080, -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 855 |
}
|
| 856 |
87.5% {
|
| 857 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), -3em 0em 0 0em rgba(128, 128, 128, 0.7), -2.2em -2.2em 0 0em #808080;
|
| 858 |
}
|
|
|
|
|
|
|
| 1 |
margin-top: 1rem;
|
| 2 |
padding: 1rem;
|
| 3 |
background-color: #f0f4f8;
|
| 4 |
border-radius: 8px;
|
| 5 |
border: 1px solid #cdd5df;
|
| 6 |
display: flex;
|
| 7 |
justify-content: space-between;
|
| 8 |
align-items: center;
|
| 9 |
padding: 0vw 2vw;
|
| 10 |
background-color: #009688;
|
| 11 |
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* Soft shadow */
|
| 12 |
width: 100%;
|
| 13 |
position: sticky;
|
| 14 |
top: 0;
|
| 15 |
max-width: 5vw;
|
| 16 |
height: auto;
|
| 17 |
background: #fff;
|
| 18 |
border-radius: 1vw;
|
| 19 |
margin: 0.5vw;
|
| 20 |
text-align: center;
|
| 21 |
flex: 1;
|
| 22 |
.header-title h1 {
|
| 23 |
font-size: 3vw;
|
| 24 |
color: #fff;
|
| 25 |
margin: 0;
|
| 26 |
}
|
| 27 |
width: 5vw;
|
| 28 |
.home-btn img:hover {
|
| 29 |
transform: scale(1.1);
|
| 30 |
}
|
| 31 |
background-image: url(/assets/images/grammar-bg.png);
|
| 32 |
background-size: auto;
|
| 33 |
background-position: center;
|
| 34 |
background-attachment: fixed;
|
| 35 |
width: 100%;
|
| 36 |
height: 100%;
|
| 37 |
position: absolute;
|
| 38 |
top: 10%;
|
| 39 |
left: 0;
|
| 40 |
width: 100%;
|
| 41 |
height: auto;
|
| 42 |
max-height: calc(100vh - 100px);
|
| 43 |
object-fit: fill;
|
| 44 |
z-index: -1;
|
| 45 |
opacity: 0.2;
|
| 46 |
background: rgba(255, 255, 255, 0.9);
|
| 47 |
width: 80vw;
|
| 48 |
position: absolute;
|
| 49 |
top: 50%;
|
| 50 |
left: 50%;
|
| 51 |
transform: translate(-50%, -50%);
|
| 52 |
height: 66vh;
|
| 53 |
display: flex;
|
| 54 |
justify-content: space-between;
|
| 55 |
align-items: flex-start;
|
| 56 |
padding: 4vw;
|
| 57 |
gap: 2vw;
|
| 58 |
background-color: #fff;
|
| 59 |
border: 10px solid #009688;
|
| 60 |
border-radius: 1vw;
|
| 61 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 62 |
margin: 2vw auto;
|
| 63 |
max-width: 90%;
|
| 64 |
display: flex;
|
| 65 |
align-items: center;
|
| 66 |
gap: 4vw;
|
| 67 |
width: 50%;
|
| 68 |
font-size: 2.5vw;
|
| 69 |
font-weight: 800;
|
| 70 |
color: #006780;
|
| 71 |
margin-bottom: 20px;
|
| 72 |
width: 100%;
|
| 73 |
height: auto;
|
| 74 |
border-radius: 10px;
|
| 75 |
width: 66%;
|
| 76 |
.description-container p {
|
| 77 |
font-size: 1.4vw;
|
| 78 |
margin-bottom: 30px;
|
| 79 |
text-align: justify;
|
| 80 |
}
|
| 81 |
position: relative;
|
| 82 |
border-radius: 0.5vw;
|
| 83 |
font-size: 1.5vw;
|
| 84 |
transition: background-color 0.3s;
|
| 85 |
width: auto;
|
| 86 |
font-weight: bold;
|
| 87 |
background-color: #006780;
|
| 88 |
border: none;
|
| 89 |
color: white;
|
| 90 |
padding: 15px 32px;
|
| 91 |
text-align: center;
|
| 92 |
text-decoration: none;
|
| 93 |
display: inline-flex;
|
| 94 |
align-items: center;
|
| 95 |
justify-content: center;
|
| 96 |
position: relative;
|
| 97 |
min-width: 5vw;
|
| 98 |
height: 2.9vw;
|
| 99 |
margin-top: 1.5vw;
|
| 100 |
.submit-button:hover {
|
| 101 |
background-color: #bdc3c7;
|
| 102 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 103 |
}
|
| 104 |
.submit-button:disabled {
|
| 105 |
background-color: #ccc;
|
| 106 |
cursor: not-allowed;
|
| 107 |
}
|
| 108 |
background: rgba(255, 255, 255, 0.9);
|
| 109 |
padding: 2vw;
|
| 110 |
border-radius: 1vw;
|
| 111 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 112 |
width: 80vw;
|
| 113 |
position: absolute;
|
| 114 |
top: 54%;
|
| 115 |
left: 50%;
|
| 116 |
transform: translate(-50%, -50%);
|
| 117 |
height: 70vh;
|
| 118 |
border: 10px solid #009688;
|
| 119 |
background-color: #fff;
|
| 120 |
.card2 .content-container {
|
| 121 |
display: flex;
|
| 122 |
justify-content: space-around;
|
| 123 |
align-items: center;
|
| 124 |
height: 100%;
|
| 125 |
}
|
| 126 |
max-width: 100%;
|
| 127 |
height: auto;
|
| 128 |
|
| 129 |
display: flex;
|
| 130 |
flex-direction: column;
|
| 131 |
align-items: center;
|
| 132 |
justify-content: center;
|
| 133 |
text-align: center;
|
| 134 |
width: 50%;
|
| 135 |
.word-container h2 {
|
| 136 |
font-size: 2.5rem;
|
| 137 |
font-weight: bold;
|
| 138 |
color: #333;
|
| 139 |
margin-top: 2.7vw;
|
| 140 |
}
|
| 141 |
width: 45%;
|
| 142 |
text-align: center;
|
| 143 |
padding: 20px;
|
| 144 |
background: rgba(255, 255, 255, 0.7);
|
| 145 |
border-radius: 10px;
|
| 146 |
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);
|
| 147 |
margin-right: 4vw;
|
| 148 |
font-size: 1.2vw;
|
| 149 |
margin-bottom: 20px;
|
| 150 |
font-weight: 700;
|
| 151 |
display: flex;
|
| 152 |
flex-direction: column;
|
| 153 |
align-items: center;
|
| 154 |
background-color: #ccc;
|
| 155 |
color: white;
|
| 156 |
padding: 12px 24px;
|
| 157 |
border-radius: 5px;
|
| 158 |
cursor: pointer;
|
| 159 |
font-size: 1.2rem;
|
| 160 |
margin: 10px;
|
| 161 |
width: 80%;
|
| 162 |
transition: background-color 0.3s ease;
|
| 163 |
background-color: #ffffff;
|
| 164 |
color: #333;
|
| 165 |
border: 2px solid #000000;
|
| 166 |
font-size: 1.1vw;
|
| 167 |
border-radius: 3vw;
|
| 168 |
transition: all 0.3s ease;
|
| 169 |
font-weight: 600;
|
| 170 |
display: flex;
|
| 171 |
align-items: center;
|
| 172 |
justify-content: center;
|
| 173 |
box-shadow: -1px 1vw 0.5vw rgb(0 0 0 / 13%);
|
| 174 |
height: 100%;
|
| 175 |
text-align: center;
|
| 176 |
white-space: normal;
|
| 177 |
word-break: break-word;
|
| 178 |
width: 21vw;
|
| 179 |
.option-btn.selected {
|
| 180 |
background-color: #e1f5fe !important;
|
| 181 |
border-color: #0277bd !important;
|
| 182 |
color: #01579b !important;
|
| 183 |
font-weight: 600;
|
| 184 |
}
|
| 185 |
.option-btn:hover {
|
| 186 |
background-color: #e1f5fe !important;
|
| 187 |
border-color: #0277bd !important;
|
| 188 |
color: #01579b !important;
|
| 189 |
font-weight: 600;
|
| 190 |
}
|
| 191 |
.option-btn.disabled {
|
| 192 |
cursor: not-allowed !important;
|
| 193 |
pointer-events: none !important;
|
| 194 |
}
|
| 195 |
.option-btn.correct {
|
| 196 |
background-color: #4caf506e !important;
|
| 197 |
border-color: #388E3C !important;
|
| 198 |
color: black;
|
| 199 |
font-weight: bold;
|
| 200 |
}
|
| 201 |
.option-btn.incorrect {
|
| 202 |
background-color: #f443367d !important;
|
| 203 |
border-color: #C62828 !important;
|
| 204 |
color: black;
|
| 205 |
font-weight: bold;
|
| 206 |
}
|
| 207 |
background: rgba(255, 255, 255, 0.9);
|
| 208 |
padding: 2vw;
|
| 209 |
border-radius: 1vw;
|
| 210 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 211 |
width: 80vw;
|
| 212 |
position: absolute;
|
| 213 |
top: 55%;
|
| 214 |
left: 50%;
|
| 215 |
transform: translate(-50%, -50%);
|
| 216 |
height: 70vh;
|
| 217 |
display: flex;
|
| 218 |
flex-direction: column;
|
| 219 |
align-items: center;
|
| 220 |
overflow-y: auto;
|
| 221 |
border: 10px solid #009688;
|
| 222 |
background-color: #fff;
|
| 223 |
list-style-type: disc;
|
| 224 |
padding: 0 5vw;
|
| 225 |
color: #000000;
|
| 226 |
overflow-y: auto;
|
| 227 |
height: 18vw;
|
| 228 |
font-size: 1.5vw;
|
| 229 |
margin-bottom: 30px;
|
| 230 |
text-align: justify;
|
| 231 |
.feedback-list1 li {
|
| 232 |
margin-bottom: 10px;
|
| 233 |
line-height: 1.5;
|
| 234 |
display: list-item;
|
| 235 |
}
|
| 236 |
list-style-type: none !important;
|
| 237 |
text-align: justify;
|
| 238 |
height: 20vw;
|
| 239 |
overflow-y: auto;
|
| 240 |
padding: 0 3vw;
|
| 241 |
margin-bottom: 2vw;
|
| 242 |
font-size: 1.5vw;
|
| 243 |
.feedback-list li {
|
| 244 |
margin-bottom: 1vw;
|
| 245 |
font-weight: 500;
|
| 246 |
}
|
| 247 |
color: green;
|
| 248 |
color: red;
|
| 249 |
0% {
|
| 250 |
transform: translate(-50%, -50%) rotate(0deg);
|
| 251 |
}
|
| 252 |
100% {
|
| 253 |
transform: translate(-50%, -50%) rotate(360deg);
|
| 254 |
}
|
| 255 |
background: white;
|
| 256 |
padding: 1vw;
|
| 257 |
border-radius: 1vw;
|
| 258 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 259 |
width: 80vw;
|
| 260 |
position: absolute;
|
| 261 |
top: 55%;
|
| 262 |
left: 50%;
|
| 263 |
transform: translate(-50%, -50%);
|
| 264 |
height: 73vh;
|
| 265 |
max-height: 80vh;
|
| 266 |
display: flex;
|
| 267 |
flex-direction: column;
|
| 268 |
justify-content: space-between;
|
| 269 |
align-items: center;
|
| 270 |
text-align: center;
|
| 271 |
overflow-y: auto;
|
| 272 |
border: 10px solid #009688;
|
| 273 |
|
| 274 |
resize: none
|
| 275 |
font-size: 1.8vw;
|
| 276 |
text-align: center;
|
| 277 |
margin-bottom: 20px;
|
| 278 |
color: #006780;
|
| 279 |
font-weight: 600;
|
| 280 |
display: flex;
|
| 281 |
flex-direction: column;
|
| 282 |
align-items: center;
|
| 283 |
width: 100%;
|
| 284 |
display: flex;
|
| 285 |
justify-content: space-between;
|
| 286 |
align-items: center;
|
| 287 |
width: 80%;
|
| 288 |
max-width: 600px;
|
| 289 |
margin-bottom: 20px;
|
| 290 |
.card4 .sentence-input-group label {
|
| 291 |
font-weight: bold;
|
| 292 |
text-align: left;
|
| 293 |
width: 30%;
|
| 294 |
font-size: 1.7vw;
|
| 295 |
}
|
| 296 |
.card4 .sentence-input-group .input-group {
|
| 297 |
width: 60%;
|
| 298 |
}
|
| 299 |
.card4 .sentence-input-group textarea {
|
| 300 |
width: 138%;
|
| 301 |
height: 100%;
|
| 302 |
font-size: 1.4rem;
|
| 303 |
border: 2px solid #006780;
|
| 304 |
font-family: Arial, sans-serif;
|
| 305 |
border-radius: 8px;
|
| 306 |
padding: 0.4vw;
|
| 307 |
}
|
| 308 |
.card4 .sentence-input-group textarea:focus {
|
| 309 |
outline: none;
|
| 310 |
border: 1px solid #007bff;
|
| 311 |
}
|
| 312 |
background: rgba(255, 255, 255, 0.9);
|
| 313 |
width: 80vw;
|
| 314 |
position: absolute;
|
| 315 |
top: 55%;
|
| 316 |
left: 50%;
|
| 317 |
transform: translate(-50%, -50%);
|
| 318 |
height: 73vh;
|
| 319 |
max-height: 80vh;
|
| 320 |
padding: 20px;
|
| 321 |
display: flex;
|
| 322 |
flex-direction: column;
|
| 323 |
justify-content: space-between;
|
| 324 |
align-items: center;
|
| 325 |
text-align: center;
|
| 326 |
overflow-y: auto;
|
| 327 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 328 |
background-color: #fff;
|
| 329 |
border: 10px solid #009688;
|
| 330 |
border-radius: 1vw;
|
| 331 |
.card5 .feedback-text {
|
| 332 |
font-size: 1.8vw;
|
| 333 |
font-weight: 600;
|
| 334 |
color: #333;
|
| 335 |
margin-top: 1vw;
|
| 336 |
word-wrap: break-word;
|
| 337 |
max-height: 400px;
|
| 338 |
overflow-y: auto;
|
| 339 |
padding-left: 20px;
|
| 340 |
padding-right: 20px;
|
| 341 |
text-align: justify;
|
| 342 |
margin-bottom: 1vw;
|
| 343 |
}
|
| 344 |
position: absolute;
|
| 345 |
top: 1vw;
|
| 346 |
left: 2vw;
|
| 347 |
color: #007bff;
|
| 348 |
font-size: 24px;
|
| 349 |
width: 5vw;
|
| 350 |
cursor: pointer;
|
| 351 |
transition: transform 0.2s ease-in-out;
|
| 352 |
.back-icon:hover {
|
| 353 |
transform: scale(1.1);
|
| 354 |
color: #0056b3;
|
| 355 |
}
|
| 356 |
.back-icon img {
|
| 357 |
width: 30px;
|
| 358 |
height: auto;
|
| 359 |
cursor: pointer;
|
| 360 |
}
|
| 361 |
position: fixed;
|
| 362 |
top: 0;
|
| 363 |
left: 0;
|
| 364 |
width: 100%;
|
| 365 |
height: 100%;
|
| 366 |
|
| 367 |
display: flex;
|
| 368 |
justify-content: center;
|
| 369 |
align-items: center;
|
| 370 |
z-index: 1000;
|
| 371 |
font-size: 15px;
|
| 372 |
width: 1.5em;
|
| 373 |
height: 1.5em;
|
| 374 |
border-radius: 50%;
|
| 375 |
position: relative;
|
| 376 |
text-indent: -9999em;
|
| 377 |
animation: mulShdSpin 1.1s infinite ease;
|
| 378 |
transform: translateZ(0);
|
| 379 |
0%, 100% {
|
| 380 |
box-shadow: 0em -3em 0em 0em #808080, 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.5), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7);
|
| 381 |
}
|
| 382 |
12.5% {
|
| 383 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.7), 2.2em -2.2em 0 0em #808080, 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5);
|
| 384 |
}
|
| 385 |
25% {
|
| 386 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.5), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7), 3em 0em 0 0em #808080, 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 387 |
}
|
| 388 |
37.5% {
|
| 389 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5), 3em 0em 0 0em rgba(128, 128, 128, 0.7), 2.2em 2.2em 0 0em #808080, 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 390 |
}
|
| 391 |
50% {
|
| 392 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.5), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), 0em 3em 0 0em #808080, -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 393 |
}
|
| 394 |
62.5% {
|
| 395 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), 0em 3em 0 0em rgba(128, 128, 128, 0.7), -2.2em 2.2em 0 0em #808080, -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 396 |
}
|
| 397 |
75% {
|
| 398 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.5), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), -3em 0em 0 0em #808080, -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 399 |
}
|
| 400 |
87.5% {
|
| 401 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), -3em 0em 0 0em rgba(128, 128, 128, 0.7), -2.2em -2.2em 0 0em #808080;
|
| 402 |
}
|
| 403 |
+
|
| 404 |
margin-top: 1rem;
|
| 405 |
padding: 1rem;
|
| 406 |
background-color: #f0f4f8;
|
| 407 |
border-radius: 8px;
|
| 408 |
border: 1px solid #cdd5df;
|
| 409 |
display: flex;
|
| 410 |
justify-content: space-between;
|
| 411 |
align-items: center;
|
| 412 |
padding: 0vw 2vw;
|
| 413 |
background-color: #009688;
|
| 414 |
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* Soft shadow */
|
| 415 |
width: 100%;
|
| 416 |
position: sticky;
|
| 417 |
top: 0;
|
| 418 |
max-width: 5vw;
|
| 419 |
height: auto;
|
| 420 |
background: #fff;
|
| 421 |
border-radius: 1vw;
|
| 422 |
margin: 0.5vw;
|
| 423 |
text-align: center;
|
| 424 |
flex: 1;
|
| 425 |
.header-title h1 {
|
| 426 |
font-size: 3vw;
|
| 427 |
color: #fff;
|
| 428 |
margin: 0;
|
| 429 |
position: absolute;
|
| 430 |
top: 50%;
|
| 431 |
left: 50%;
|
| 432 |
transform: translate(-50%, -50%);
|
| 433 |
}
|
| 434 |
width: 5vw;
|
| 435 |
.home-btn img:hover {
|
| 436 |
transform: scale(1.1);
|
| 437 |
}
|
| 438 |
background-image: url(/assets/images/grammar-bg.png);
|
| 439 |
background-size: auto;
|
| 440 |
background-position: center;
|
| 441 |
background-attachment: fixed;
|
| 442 |
width: 100%;
|
| 443 |
height: 100%;
|
| 444 |
position: absolute;
|
| 445 |
top: 10%;
|
| 446 |
left: 0;
|
| 447 |
width: 100%;
|
| 448 |
height: auto;
|
| 449 |
max-height: calc(100vh - 100px);
|
| 450 |
object-fit: fill;
|
| 451 |
z-index: -1;
|
| 452 |
opacity: 0.2;
|
| 453 |
background: rgba(255, 255, 255, 0.9);
|
| 454 |
width: 80vw;
|
| 455 |
position: absolute;
|
| 456 |
top: 50%;
|
| 457 |
left: 50%;
|
| 458 |
transform: translate(-50%, -50%);
|
| 459 |
height: 66vh;
|
| 460 |
display: flex;
|
| 461 |
justify-content: space-between;
|
| 462 |
align-items: flex-start;
|
| 463 |
padding: 4vw;
|
| 464 |
gap: 2vw;
|
| 465 |
background-color: #fff;
|
| 466 |
border: 10px solid #009688;
|
| 467 |
border-radius: 1vw;
|
| 468 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 469 |
margin: 2vw auto;
|
| 470 |
max-width: 90%;
|
| 471 |
display: flex;
|
| 472 |
align-items: center;
|
| 473 |
gap: 4vw;
|
| 474 |
width: 50%;
|
| 475 |
font-size: 2.5vw;
|
| 476 |
font-weight: 800;
|
| 477 |
color: #006780;
|
| 478 |
margin-bottom: 20px;
|
| 479 |
text-align: center;
|
| 480 |
width: 100%;
|
| 481 |
height: auto;
|
| 482 |
border-radius: 10px;
|
| 483 |
width: 66%;
|
| 484 |
.description-container p {
|
| 485 |
font-size: 1.4vw;
|
| 486 |
margin-bottom: 30px;
|
| 487 |
text-align: justify;
|
| 488 |
}
|
| 489 |
position: relative;
|
| 490 |
border-radius: 0.5vw;
|
| 491 |
font-size: 1.5vw;
|
| 492 |
transition: background-color 0.3s;
|
| 493 |
width: auto;
|
| 494 |
font-weight: bold;
|
| 495 |
background-color: #006780;
|
| 496 |
border: none;
|
| 497 |
color: white;
|
| 498 |
padding: 15px 32px;
|
| 499 |
text-align: center;
|
| 500 |
text-decoration: none;
|
| 501 |
display: inline-flex;
|
| 502 |
align-items: center;
|
| 503 |
justify-content: center;
|
| 504 |
position: relative;
|
| 505 |
min-width: 5vw;
|
| 506 |
height: 2.9vw;
|
| 507 |
margin-top: 1.5vw;
|
| 508 |
.validate-button:hover {
|
| 509 |
background-color: #bdc3c7;
|
| 510 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 511 |
}
|
| 512 |
.validate-button:disabled {
|
| 513 |
background-color: #ccc;
|
| 514 |
cursor: not-allowed;
|
| 515 |
}
|
| 516 |
position: absolute;
|
| 517 |
border-radius: 0.5vw;
|
| 518 |
font-size: 1.5vw;
|
| 519 |
transition: background-color 0.3s;
|
| 520 |
font-weight: bold;
|
| 521 |
background-color: #006780;
|
| 522 |
border: none;
|
| 523 |
color: white;
|
| 524 |
left: 50%;
|
| 525 |
text-decoration: none;
|
| 526 |
transform: translateX(-50%);
|
| 527 |
padding: 0.5vw;
|
| 528 |
.submit-button:hover {
|
| 529 |
background-color: #bdc3c7;
|
| 530 |
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
|
| 531 |
}
|
| 532 |
.submit-button:disabled {
|
| 533 |
background-color: #ccc;
|
| 534 |
cursor: not-allowed;
|
| 535 |
}
|
| 536 |
background: rgba(255, 255, 255, 0.9);
|
| 537 |
padding: 2vw;
|
| 538 |
border-radius: 1vw;
|
| 539 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 540 |
width: 80vw;
|
| 541 |
position: absolute;
|
| 542 |
top: 54%;
|
| 543 |
left: 50%;
|
| 544 |
transform: translate(-50%, -50%);
|
| 545 |
height: 70vh;
|
| 546 |
border: 10px solid #009688;
|
| 547 |
background-color: #fff;
|
| 548 |
.card2 .content-container {
|
| 549 |
display: flex;
|
| 550 |
justify-content: space-around;
|
| 551 |
align-items: center;
|
| 552 |
height: 100%;
|
| 553 |
}
|
| 554 |
max-width: 100%;
|
| 555 |
height: auto;
|
| 556 |
display: flex;
|
| 557 |
flex-direction: column;
|
| 558 |
align-items: center;
|
| 559 |
justify-content: center;
|
| 560 |
text-align: center;
|
| 561 |
width: 50%;
|
| 562 |
.word-container h2 {
|
| 563 |
font-size: 2.5rem;
|
| 564 |
font-weight: bold;
|
| 565 |
color: #333;
|
| 566 |
margin-top: 2.7vw;
|
| 567 |
}
|
| 568 |
width: 45%;
|
| 569 |
text-align: center;
|
| 570 |
padding: 20px;
|
| 571 |
background: rgba(255, 255, 255, 0.7);
|
| 572 |
border-radius: 10px;
|
| 573 |
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);
|
| 574 |
margin-right: 4vw;
|
| 575 |
font-size: 1.2vw;
|
| 576 |
margin-bottom: 20px;
|
| 577 |
font-weight: 700;
|
| 578 |
display: flex;
|
| 579 |
flex-direction: column;
|
| 580 |
align-items: center;
|
| 581 |
background-color: #ccc;
|
| 582 |
color: white;
|
| 583 |
padding: 12px 24px;
|
| 584 |
border-radius: 5px;
|
| 585 |
cursor: pointer;
|
| 586 |
font-size: 1.2rem;
|
| 587 |
margin: 10px;
|
| 588 |
width: 80%;
|
| 589 |
transition: background-color 0.3s ease;
|
| 590 |
background-color: #ffffff;
|
| 591 |
color: #333;
|
| 592 |
border: 2px solid #000000;
|
| 593 |
font-size: 1.1vw;
|
| 594 |
border-radius: 3vw;
|
| 595 |
transition: all 0.3s ease;
|
| 596 |
font-weight: 600;
|
| 597 |
display: flex;
|
| 598 |
align-items: center;
|
| 599 |
justify-content: center;
|
| 600 |
box-shadow: -1px 1vw 0.5vw rgb(0 0 0 / 13%);
|
| 601 |
height: 100%;
|
| 602 |
text-align: center;
|
| 603 |
white-space: normal;
|
| 604 |
word-break: break-word;
|
| 605 |
width: 21vw;
|
| 606 |
/* Make state classes override :hover */
|
| 607 |
.option-btn.correct,
|
| 608 |
.option-btn.incorrect,
|
| 609 |
.option-btn.selected {
|
| 610 |
position: relative; /* keeps layout stable */
|
| 611 |
}
|
| 612 |
/* Correct = green (state wins even on hover) */
|
| 613 |
.option-btn.correct,
|
| 614 |
.option-btn.correct:hover {
|
| 615 |
background: #e8f7ed; /* soft green */
|
| 616 |
border-color: #22c55e; /* green-500 */
|
| 617 |
color: #14532d; /* dark green text */
|
| 618 |
}
|
| 619 |
/* Incorrect = red (state wins even on hover) */
|
| 620 |
.option-btn.incorrect,
|
| 621 |
.option-btn.incorrect:hover {
|
| 622 |
background: #fee2e2; /* soft red */
|
| 623 |
border-color: #ef4444; /* red-500 */
|
| 624 |
color: #7f1d1d; /* dark red text */
|
| 625 |
}
|
| 626 |
/* Selected (pre-validation) = blue (state wins even on hover) */
|
| 627 |
.option-btn.selected,
|
| 628 |
.option-btn.selected:hover {
|
| 629 |
background: #e0f2fe; /* soft blue */
|
| 630 |
border-color: #3b82f6; /* blue-500 */
|
| 631 |
color: #0c4a6e; /* dark blue text */
|
| 632 |
}
|
| 633 |
/* Default hover only when no state class is present */
|
| 634 |
.option-btn:not(.selected):not(.correct):not(.incorrect):hover {
|
| 635 |
background: #f3f4f6; /* light grey hover */
|
| 636 |
}
|
| 637 |
/* Optional: disabled look still visible */
|
| 638 |
.option-btn.disabled,
|
| 639 |
.option-btn:disabled {
|
| 640 |
cursor: not-allowed;
|
| 641 |
filter: grayscale(10%);
|
| 642 |
}
|
| 643 |
.option-btn.picked {
|
| 644 |
outline: 2px dashed rgba(0,0,0,0.25);
|
| 645 |
outline-offset: 2px;
|
| 646 |
}
|
| 647 |
margin-left: 8px;
|
| 648 |
padding: 2px 8px;
|
| 649 |
border-radius: 12px;
|
| 650 |
font-size: 12px;
|
| 651 |
background: rgba(0,0,0,0.06);
|
| 652 |
background: rgba(255, 255, 255, 0.9);
|
| 653 |
padding: 2vw;
|
| 654 |
border-radius: 1vw;
|
| 655 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 656 |
width: 80vw;
|
| 657 |
position: absolute;
|
| 658 |
top: 54%;
|
| 659 |
left: 50%;
|
| 660 |
transform: translate(-50%, -50%);
|
| 661 |
height: 70vh;
|
| 662 |
border: 10px solid #009688;
|
| 663 |
background-color: #fff;
|
| 664 |
list-style-type: disc;
|
| 665 |
padding: 0 5vw;
|
| 666 |
color: #000000;
|
| 667 |
overflow-y: auto;
|
| 668 |
height: 18vw;
|
| 669 |
font-size: 1.5vw;
|
| 670 |
margin-bottom: 30px;
|
| 671 |
text-align: justify;
|
| 672 |
.feedback-list1 li {
|
| 673 |
margin-bottom: 10px;
|
| 674 |
line-height: 1.5;
|
| 675 |
display: list-item;
|
| 676 |
}
|
| 677 |
list-style-type: none !important;
|
| 678 |
text-align: justify;
|
| 679 |
height: 20vw;
|
| 680 |
overflow-y: auto;
|
| 681 |
padding: 0 3vw;
|
| 682 |
margin-bottom: 2vw;
|
| 683 |
font-size: 1.5vw;
|
| 684 |
.feedback-list li {
|
| 685 |
margin-bottom: 1vw;
|
| 686 |
font-weight: 500;
|
| 687 |
}
|
| 688 |
color: green;
|
| 689 |
color: red;
|
| 690 |
0% {
|
| 691 |
transform: translate(-50%, -50%) rotate(0deg);
|
| 692 |
}
|
| 693 |
100% {
|
| 694 |
transform: translate(-50%, -50%) rotate(360deg);
|
| 695 |
}
|
| 696 |
background: rgba(255, 255, 255, 0.9);
|
| 697 |
padding: 2vw;
|
| 698 |
border-radius: 1vw;
|
| 699 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 700 |
width: 80vw;
|
| 701 |
position: absolute;
|
| 702 |
top: 54%;
|
| 703 |
left: 50%;
|
| 704 |
transform: translate(-50%, -50%);
|
| 705 |
height: 70vh;
|
| 706 |
border: 10px solid #009688;
|
| 707 |
background-color: #fff;
|
| 708 |
resize: none
|
| 709 |
font-size: 1.8vw;
|
| 710 |
text-align: center;
|
| 711 |
margin-bottom: 20px;
|
| 712 |
color: #006780;
|
| 713 |
font-weight: 600;
|
| 714 |
display: flex;
|
| 715 |
flex-direction: column;
|
| 716 |
align-items: center;
|
| 717 |
width: 100%;
|
| 718 |
display: flex;
|
| 719 |
justify-content: space-between;
|
| 720 |
align-items: center;
|
| 721 |
width: 80%;
|
| 722 |
max-width: 600px;
|
| 723 |
margin-bottom: 20px;
|
| 724 |
.card4 .sentence-input-group label {
|
| 725 |
font-weight: bold;
|
| 726 |
text-align: left;
|
| 727 |
width: 30%;
|
| 728 |
font-size: 1.7vw;
|
| 729 |
}
|
| 730 |
.card4 .sentence-input-group .input-group {
|
| 731 |
width: 60%;
|
| 732 |
}
|
| 733 |
.card4 .sentence-input-group textarea {
|
| 734 |
width: 138%;
|
| 735 |
height: 100%;
|
| 736 |
font-size: 1.4rem;
|
| 737 |
border: 2px solid #006780;
|
| 738 |
font-family: Arial, sans-serif;
|
| 739 |
border-radius: 8px;
|
| 740 |
padding: 0.4vw;
|
| 741 |
}
|
| 742 |
.card4 .sentence-input-group textarea:focus {
|
| 743 |
outline: none;
|
| 744 |
border: 1px solid #007bff;
|
| 745 |
}
|
| 746 |
background: rgba(255, 255, 255, 0.9);
|
| 747 |
padding: 2vw;
|
| 748 |
border-radius: 1vw;
|
| 749 |
box-shadow: 0 0.4vw 0.8vw rgba(0, 0, 0, 0.6);
|
| 750 |
width: 80vw;
|
| 751 |
position: absolute;
|
| 752 |
top: 54%;
|
| 753 |
left: 50%;
|
| 754 |
transform: translate(-50%, -50%);
|
| 755 |
height: 70vh;
|
| 756 |
border: 10px solid #009688;
|
| 757 |
background-color: #fff;
|
| 758 |
.card5 .feedback-text {
|
| 759 |
font-size: 1.8vw;
|
| 760 |
font-weight: 600;
|
| 761 |
color: #333;
|
| 762 |
margin-top: 1vw;
|
| 763 |
word-wrap: break-word;
|
| 764 |
max-height: 400px;
|
| 765 |
overflow-y: auto;
|
| 766 |
padding-left: 20px;
|
| 767 |
padding-right: 20px;
|
| 768 |
text-align: justify;
|
| 769 |
margin-bottom: 1vw;
|
| 770 |
}
|
| 771 |
position: absolute;
|
| 772 |
top: 1vw;
|
| 773 |
left: 2vw;
|
| 774 |
color: #007bff;
|
| 775 |
font-size: 24px;
|
| 776 |
width: 5vw;
|
| 777 |
cursor: pointer;
|
| 778 |
transition: transform 0.2s ease-in-out;
|
| 779 |
.back-icon:hover {
|
| 780 |
transform: scale(1.1);
|
| 781 |
color: #0056b3;
|
| 782 |
}
|
| 783 |
.back-icon img {
|
| 784 |
width: 30px;
|
| 785 |
height: auto;
|
| 786 |
cursor: pointer;
|
| 787 |
}
|
| 788 |
position: absolute;
|
| 789 |
top: -1vw;
|
| 790 |
right: -1.4vw;
|
| 791 |
width: 36px;
|
| 792 |
height: 36px;
|
| 793 |
display: grid;
|
| 794 |
place-items: center;
|
| 795 |
border-radius: 50%;
|
| 796 |
background: #009688;
|
| 797 |
color: #0f172a;
|
| 798 |
border: 4px solid #009688;
|
| 799 |
font-size: 18px;
|
| 800 |
font-weight: 800;
|
| 801 |
cursor: pointer;
|
| 802 |
box-shadow: 0 4px 10px rgba(0, 0, 0, .15);
|
| 803 |
transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
|
| 804 |
z-index: 10;
|
| 805 |
.icon-btn1:hover {
|
| 806 |
transform: scale(1.06);
|
| 807 |
box-shadow: 0 6px 14px rgba(0,0,0,.22);
|
| 808 |
background: #f7fafc;
|
| 809 |
}
|
| 810 |
.icon-btn1:active {
|
| 811 |
transform: scale(0.98);
|
| 812 |
}
|
| 813 |
.icon-btn1 {
|
| 814 |
width: 50px;
|
| 815 |
height: 50px;
|
| 816 |
font-size: 20px;
|
| 817 |
}
|
| 818 |
position: fixed;
|
| 819 |
top: 0;
|
| 820 |
left: 0;
|
| 821 |
width: 100%;
|
| 822 |
height: 100%;
|
| 823 |
display: flex;
|
| 824 |
justify-content: center;
|
| 825 |
align-items: center;
|
| 826 |
z-index: 1000;
|
| 827 |
font-size: 15px;
|
| 828 |
width: 1.5em;
|
| 829 |
height: 1.5em;
|
| 830 |
border-radius: 50%;
|
| 831 |
position: relative;
|
| 832 |
text-indent: -9999em;
|
| 833 |
animation: mulShdSpin 1.1s infinite ease;
|
| 834 |
transform: translateZ(0);
|
| 835 |
0%, 100% {
|
| 836 |
box-shadow: 0em -3em 0em 0em #808080, 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.5), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7);
|
| 837 |
}
|
| 838 |
12.5% {
|
| 839 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.7), 2.2em -2.2em 0 0em #808080, 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5);
|
| 840 |
}
|
| 841 |
25% {
|
| 842 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.5), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.7), 3em 0em 0 0em #808080, 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 843 |
}
|
| 844 |
37.5% {
|
| 845 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.5), 3em 0em 0 0em rgba(128, 128, 128, 0.7), 2.2em 2.2em 0 0em #808080, 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 846 |
}
|
| 847 |
50% {
|
| 848 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.5), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), 0em 3em 0 0em #808080, -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 849 |
}
|
| 850 |
62.5% {
|
| 851 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), 0em 3em 0 0em rgba(128, 128, 128, 0.7), -2.2em 2.2em 0 0em #808080, -3em 0em 0 0em rgba(128, 128, 128, 0.2), -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 852 |
}
|
| 853 |
75% {
|
| 854 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.5), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.7), -3em 0em 0 0em #808080, -2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2);
|
| 855 |
}
|
| 856 |
87.5% {
|
| 857 |
box-shadow: 0em -3em 0em 0em rgba(128, 128, 128, 0.2), 2.2em -2.2em 0 0em rgba(128, 128, 128, 0.2), 3em 0em 0 0em rgba(128, 128, 128, 0.2), 2.2em 2.2em 0 0em rgba(128, 128, 128, 0.2), 0em 3em 0 0em rgba(128, 128, 128, 0.2), -2.2em 2.2em 0 0em rgba(128, 128, 128, 0.5), -3em 0em 0 0em rgba(128, 128, 128, 0.7), -2.2em -2.2em 0 0em #808080;
|
| 858 |
}
|
src/app/vocabulary-builder/vocabulary-builder.component.html
CHANGED
|
@@ -4,9 +4,10 @@
|
|
| 4 |
<!-- Header -->
|
| 5 |
<div class="header-container">
|
| 6 |
<div class="logo">
|
| 7 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 8 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 9 |
</a>
|
|
|
|
| 10 |
</div>
|
| 11 |
<div class="header-title">
|
| 12 |
<h1>Vocabulary Builder</h1>
|
|
@@ -49,6 +50,9 @@
|
|
| 49 |
<!-- Step 2: Word Options -->
|
| 50 |
<div *ngIf="step === 2" class="card2">
|
| 51 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
<div class="content-container">
|
| 54 |
<div class="word-container">
|
|
@@ -63,25 +67,29 @@
|
|
| 63 |
<button *ngFor="let option of vocabulary.options"
|
| 64 |
class="option-btn"
|
| 65 |
[ngClass]="{
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
|
|
|
| 72 |
(click)="handleOptionClick(option)">
|
| 73 |
-
{{ option }}
|
|
|
|
| 74 |
</button>
|
|
|
|
|
|
|
| 75 |
</div>
|
| 76 |
|
| 77 |
<button *ngIf="buttonState === 'validate'"
|
| 78 |
-
class="
|
| 79 |
[disabled]="!isCheckButtonEnabled || isLoaderVisible"
|
| 80 |
(click)="checkSelections()">
|
| 81 |
<span>Validate</span>
|
| 82 |
</button>
|
| 83 |
|
| 84 |
-
<button *ngIf="buttonState === 'next'" class="
|
| 85 |
<span>Next</span>
|
| 86 |
</button>
|
| 87 |
|
|
@@ -99,6 +107,9 @@
|
|
| 99 |
<!-- Step 3: Feedback -->
|
| 100 |
<div *ngIf="step === 3" class="card3">
|
| 101 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
|
|
|
|
|
|
|
|
|
| 102 |
<h2>Feedback</h2>
|
| 103 |
<ul class="feedback-list">
|
| 104 |
<ng-container *ngFor="let point of formattedFeedback">
|
|
@@ -111,6 +122,9 @@
|
|
| 111 |
<!-- Step 4: Sentence Formation -->
|
| 112 |
<div *ngIf="step === 4" class="card4">
|
| 113 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
|
|
|
|
|
|
|
|
|
| 114 |
<h2>Form a Sentence</h2>
|
| 115 |
<p class="correct-answer">Using the words: <strong class="text-green-500">{{ correctOptions.join(', ') }}</strong></p>
|
| 116 |
<div class="sentence-formation">
|
|
@@ -138,6 +152,9 @@
|
|
| 138 |
<!-- Step 5: Sentence Feedback -->
|
| 139 |
<div *ngIf="step === 5" class="card5">
|
| 140 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
|
|
|
|
|
|
|
|
|
| 141 |
<h2 class="feedback-header">Sentence Feedback</h2>
|
| 142 |
<ul class="feedback-list1">
|
| 143 |
<li *ngFor="let point of formattedSentenceFeedback">
|
|
@@ -147,7 +164,7 @@
|
|
| 147 |
<span *ngIf="!point.includes('correct answer')">{{ point }}</span>
|
| 148 |
</li>
|
| 149 |
</ul>
|
| 150 |
-
<button class="submit-button" (click)="resetQuiz()">Reset</button>
|
| 151 |
</div>
|
| 152 |
|
| 153 |
</div>
|
|
|
|
| 4 |
<!-- Header -->
|
| 5 |
<div class="header-container">
|
| 6 |
<div class="logo">
|
| 7 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 8 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 9 |
</a>
|
| 10 |
+
<span class="product-name">Py-Learn</span>
|
| 11 |
</div>
|
| 12 |
<div class="header-title">
|
| 13 |
<h1>Vocabulary Builder</h1>
|
|
|
|
| 50 |
<!-- Step 2: Word Options -->
|
| 51 |
<div *ngIf="step === 2" class="card2">
|
| 52 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
| 53 |
+
<!-- Top-right close button (NOT on intro/page 1) -->
|
| 54 |
+
<button class="icon-btn1" (click)="closeToMain()" aria-label="Close">✖</button>
|
| 55 |
+
|
| 56 |
|
| 57 |
<div class="content-container">
|
| 58 |
<div class="word-container">
|
|
|
|
| 67 |
<button *ngFor="let option of vocabulary.options"
|
| 68 |
class="option-btn"
|
| 69 |
[ngClass]="{
|
| 70 |
+
'selected': selectedOptions.includes(option) && !optionStates[option],
|
| 71 |
+
'correct': optionStates[option] === 'correct',
|
| 72 |
+
'incorrect': optionStates[option] === 'incorrect',
|
| 73 |
+
'picked': isChecked && pickedAtCheck.has(option)
|
| 74 |
+
|
| 75 |
+
}"
|
| 76 |
+
[disabled]="(selectedOptions.length === 3 && !selectedOptions.includes(option) && buttonState === 'validate') || buttonState !== 'validate'"
|
| 77 |
(click)="handleOptionClick(option)">
|
| 78 |
+
<span class="label">{{ option }}</span>
|
| 79 |
+
<span *ngIf="isChecked && pickedAtCheck?.has(option)" class="picked-chip"></span>
|
| 80 |
</button>
|
| 81 |
+
|
| 82 |
+
|
| 83 |
</div>
|
| 84 |
|
| 85 |
<button *ngIf="buttonState === 'validate'"
|
| 86 |
+
class="validate-button"
|
| 87 |
[disabled]="!isCheckButtonEnabled || isLoaderVisible"
|
| 88 |
(click)="checkSelections()">
|
| 89 |
<span>Validate</span>
|
| 90 |
</button>
|
| 91 |
|
| 92 |
+
<button *ngIf="buttonState === 'next'" class="validate-button" (click)="goNext()">
|
| 93 |
<span>Next</span>
|
| 94 |
</button>
|
| 95 |
|
|
|
|
| 107 |
<!-- Step 3: Feedback -->
|
| 108 |
<div *ngIf="step === 3" class="card3">
|
| 109 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
| 110 |
+
<!-- Top-right close button (NOT on intro/page 1) -->
|
| 111 |
+
<button class="icon-btn1" (click)="closeToMain()" aria-label="Close">✖</button>
|
| 112 |
+
|
| 113 |
<h2>Feedback</h2>
|
| 114 |
<ul class="feedback-list">
|
| 115 |
<ng-container *ngFor="let point of formattedFeedback">
|
|
|
|
| 122 |
<!-- Step 4: Sentence Formation -->
|
| 123 |
<div *ngIf="step === 4" class="card4">
|
| 124 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
| 125 |
+
<!-- Top-right close button (NOT on intro/page 1) -->
|
| 126 |
+
<button class="icon-btn1" (click)="closeToMain()" aria-label="Close">✖</button>
|
| 127 |
+
|
| 128 |
<h2>Form a Sentence</h2>
|
| 129 |
<p class="correct-answer">Using the words: <strong class="text-green-500">{{ correctOptions.join(', ') }}</strong></p>
|
| 130 |
<div class="sentence-formation">
|
|
|
|
| 152 |
<!-- Step 5: Sentence Feedback -->
|
| 153 |
<div *ngIf="step === 5" class="card5">
|
| 154 |
<img src="assets/images/vocabulary/back.png" alt="Go Back" class="back-icon" (click)="goBack()" />
|
| 155 |
+
<!-- Top-right close button (NOT on intro/page 1) -->
|
| 156 |
+
<button class="icon-btn1" (click)="closeToMain()" aria-label="Close">✖</button>
|
| 157 |
+
|
| 158 |
<h2 class="feedback-header">Sentence Feedback</h2>
|
| 159 |
<ul class="feedback-list1">
|
| 160 |
<li *ngFor="let point of formattedSentenceFeedback">
|
|
|
|
| 164 |
<span *ngIf="!point.includes('correct answer')">{{ point }}</span>
|
| 165 |
</li>
|
| 166 |
</ul>
|
| 167 |
+
<button class="submit-button" (click)="resetQuiz()"> Reset </button>
|
| 168 |
</div>
|
| 169 |
|
| 170 |
</div>
|
src/app/vocabulary-builder/vocabulary-builder.component.ts
CHANGED
|
@@ -40,7 +40,7 @@ export class VocabularyBuilderComponent implements OnInit, AfterViewInit {
|
|
| 40 |
buttonState: 'validate' | 'next' | 'formSentence' = 'validate';
|
| 41 |
optionStates: { [key: string]: 'default' | 'selected' | 'correct' | 'incorrect' } = {};
|
| 42 |
skipFeedback: boolean = false;
|
| 43 |
-
|
| 44 |
constructor(private vocabularyService: VocabularyBuilderService, private router: Router) { }
|
| 45 |
|
| 46 |
ngOnInit(): void {
|
|
@@ -83,18 +83,23 @@ export class VocabularyBuilderComponent implements OnInit, AfterViewInit {
|
|
| 83 |
}
|
| 84 |
|
| 85 |
handleOptionClick(option: string): void {
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
|
|
|
|
|
|
|
|
|
| 89 |
} else {
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
}
|
| 93 |
this.selectedOptions.push(option);
|
| 94 |
}
|
|
|
|
|
|
|
| 95 |
this.isCheckButtonEnabled = this.selectedOptions.length === 3;
|
| 96 |
}
|
| 97 |
|
|
|
|
| 98 |
checkSelections(): void {
|
| 99 |
if (this.buttonState === 'next') {
|
| 100 |
this.step = 3;
|
|
@@ -112,14 +117,13 @@ export class VocabularyBuilderComponent implements OnInit, AfterViewInit {
|
|
| 112 |
this.processFeedback(response.feedback);
|
| 113 |
this.isChecked = true;
|
| 114 |
this.correctAnswers = response.correctAnswers || [];
|
|
|
|
|
|
|
| 115 |
|
| 116 |
-
this.
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
this.optionStates[option] = 'incorrect';
|
| 121 |
-
}
|
| 122 |
-
});
|
| 123 |
|
| 124 |
const allCorrectSelected = this.selectedOptions.length === 3 &&
|
| 125 |
this.selectedOptions.every(option => this.correctAnswers.includes(option));
|
|
@@ -300,5 +304,15 @@ export class VocabularyBuilderComponent implements OnInit, AfterViewInit {
|
|
| 300 |
this.isLoaderVisible = false;
|
| 301 |
this.buttonState = 'validate';
|
| 302 |
this.skipFeedback = false;
|
|
|
|
|
|
|
|
|
|
| 303 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
}
|
|
|
|
| 40 |
buttonState: 'validate' | 'next' | 'formSentence' = 'validate';
|
| 41 |
optionStates: { [key: string]: 'default' | 'selected' | 'correct' | 'incorrect' } = {};
|
| 42 |
skipFeedback: boolean = false;
|
| 43 |
+
pickedAtCheck = new Set<string>();
|
| 44 |
constructor(private vocabularyService: VocabularyBuilderService, private router: Router) { }
|
| 45 |
|
| 46 |
ngOnInit(): void {
|
|
|
|
| 83 |
}
|
| 84 |
|
| 85 |
handleOptionClick(option: string): void {
|
| 86 |
+
if (this.buttonState !== 'validate') return;
|
| 87 |
+
|
| 88 |
+
const i = this.selectedOptions.indexOf(option);
|
| 89 |
+
if (i >= 0) {
|
| 90 |
+
// toggle OFF
|
| 91 |
+
this.selectedOptions.splice(i, 1);
|
| 92 |
} else {
|
| 93 |
+
// do NOT auto-deselect the first; just stop at 3
|
| 94 |
+
if (this.selectedOptions.length >= 3) return;
|
|
|
|
| 95 |
this.selectedOptions.push(option);
|
| 96 |
}
|
| 97 |
+
|
| 98 |
+
// Enable Validate only when exactly 3 selected
|
| 99 |
this.isCheckButtonEnabled = this.selectedOptions.length === 3;
|
| 100 |
}
|
| 101 |
|
| 102 |
+
|
| 103 |
checkSelections(): void {
|
| 104 |
if (this.buttonState === 'next') {
|
| 105 |
this.step = 3;
|
|
|
|
| 117 |
this.processFeedback(response.feedback);
|
| 118 |
this.isChecked = true;
|
| 119 |
this.correctAnswers = response.correctAnswers || [];
|
| 120 |
+
// ⬇️ INSERT THIS LINE HERE
|
| 121 |
+
this.pickedAtCheck = new Set(this.selectedOptions);
|
| 122 |
|
| 123 |
+
this.optionStates = {};
|
| 124 |
+
for (const option of this.vocabulary.options) {
|
| 125 |
+
this.optionStates[option] = this.correctAnswers.includes(option) ? 'correct' : 'incorrect';
|
| 126 |
+
}
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
const allCorrectSelected = this.selectedOptions.length === 3 &&
|
| 129 |
this.selectedOptions.every(option => this.correctAnswers.includes(option));
|
|
|
|
| 304 |
this.isLoaderVisible = false;
|
| 305 |
this.buttonState = 'validate';
|
| 306 |
this.skipFeedback = false;
|
| 307 |
+
this.pickedAtCheck.clear();
|
| 308 |
+
// or: this.pickedAtCheck = new Set<string>();
|
| 309 |
+
|
| 310 |
}
|
| 311 |
+
|
| 312 |
+
|
| 313 |
+
closeToMain(): void {
|
| 314 |
+
this.resetQuiz(); // your existing method that sets step = 1 and clears state
|
| 315 |
+
// If you also want to route away, you can add: this.router.navigate(['/home']);
|
| 316 |
+
}
|
| 317 |
+
|
| 318 |
}
|
src/app/writing/writing.component.css
CHANGED
|
@@ -32,6 +32,10 @@
|
|
| 32 |
font-size: 3vw;
|
| 33 |
color: #fff;
|
| 34 |
margin: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
}
|
| 36 |
|
| 37 |
.home-btn img {
|
|
|
|
| 32 |
font-size: 3vw;
|
| 33 |
color: #fff;
|
| 34 |
margin: 0;
|
| 35 |
+
position: absolute;
|
| 36 |
+
top: 50%;
|
| 37 |
+
left: 50%;
|
| 38 |
+
transform: translate(-50%, -50%);
|
| 39 |
}
|
| 40 |
|
| 41 |
.home-btn img {
|
src/app/writing/writing.component.html
CHANGED
|
@@ -1,9 +1,10 @@
|
|
| 1 |
<!-- Header container -->
|
| 2 |
<div class="header-container">
|
| 3 |
<div class="logo">
|
| 4 |
-
<a (click)="goToHome()" routerLink="/home">
|
| 5 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 6 |
</a>
|
|
|
|
| 7 |
</div>
|
| 8 |
<div class="header-title">
|
| 9 |
<h1>Writing Exercise</h1>
|
|
|
|
| 1 |
<!-- Header container -->
|
| 2 |
<div class="header-container">
|
| 3 |
<div class="logo">
|
| 4 |
+
<a (click)="goToHome()" routerLink="/home" class="brand-link">
|
| 5 |
<img src="assets/images/pykara-logo.png" alt="Pykara Logo" />
|
| 6 |
</a>
|
| 7 |
+
<span class="product-name">Py-Learn</span>
|
| 8 |
</div>
|
| 9 |
<div class="header-title">
|
| 10 |
<h1>Writing Exercise</h1>
|
src/styles.css
CHANGED
|
@@ -62,3 +62,36 @@ body, html {
|
|
| 62 |
|
| 63 |
|
| 64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
|
| 64 |
|
| 65 |
+
/*Py-Learn text near Logo css*/
|
| 66 |
+
|
| 67 |
+
/*Py-learn text*/
|
| 68 |
+
/* Keep logo and text in one row */
|
| 69 |
+
.logo {
|
| 70 |
+
display: flex;
|
| 71 |
+
align-items: center;
|
| 72 |
+
gap: 1vw;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
/* Make the anchor wrap both image and name */
|
| 76 |
+
.brand-link {
|
| 77 |
+
display: flex;
|
| 78 |
+
align-items: center;
|
| 79 |
+
gap: 0.6vw; /* space between logo and text */
|
| 80 |
+
text-decoration: none;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
/* “PY-Learn” text next to the logo */
|
| 84 |
+
.product-name {
|
| 85 |
+
color: #fff;
|
| 86 |
+
font-size: 2vw; /* slightly smaller than the 3vw title */
|
| 87 |
+
/*font-weight: 700;*/
|
| 88 |
+
letter-spacing: 0.5px;
|
| 89 |
+
/*font-family: 'Super Cartoon', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;*/
|
| 90 |
+
font-family: Amonk_Outline;
|
| 91 |
+
line-height: 1;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.brand-link:hover .product-name {
|
| 95 |
+
opacity: 0.9; /* subtle hover */
|
| 96 |
+
}
|
| 97 |
+
|