{"id":111,"date":"2026-04-16T02:42:01","date_gmt":"2026-04-16T02:42:01","guid":{"rendered":"https:\/\/allenglish4u.com\/grammar\/"},"modified":"2026-05-14T03:38:36","modified_gmt":"2026-05-14T03:38:36","slug":"grammar","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/grammar\/","title":{"rendered":"English Grammar Lessons \u2014 All English 4U"},"content":{"rendered":"\n<p class=\"ext-animate--on wp-block-paragraph\"><\/p>\n\n\n\n<div class=\"ae4u-page-header ae4u-page-header--blue\">\n  <div class=\"ae4u-page-header__inner\">\n    <div class=\"ae4u-page-header__breadcrumb\"><a href=\"\/\">Home<\/a> <span>\u203a<\/span> <span>Grammar<\/span><\/div>\n    <div class=\"ae4u-page-header__label\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 20h9\"><\/path><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"><\/path><\/svg> English Grammar<\/div>\n    <h1 class=\"ae4u-page-header__title\">Grammar Lessons<\/h1>\n    <p class=\"ae4u-page-header__desc\">Build a solid English foundation \u2014 from basic nouns and verbs to complex tenses and sentence structures. Video-based lessons with interactive exercises.<\/p>\n  <\/div>\n<\/div>\n\n\n\n<div class=\"ae4u-index\">\n\n  <div class=\"ae4u-stat-bar ae4u-stat-bar--blue\">\n    <div class=\"ae4u-stat ae4u-stat--blue\"><div class=\"ae4u-stat__n\">3<\/div><div class=\"ae4u-stat__l\">Skill Levels<\/div><\/div>\n    <div class=\"ae4u-stat-divider\"><\/div>\n    <div class=\"ae4u-stat ae4u-stat--blue\"><div class=\"ae4u-stat__n\">1<\/div><div class=\"ae4u-stat__l\">Available Now<\/div><\/div>\n    <div class=\"ae4u-stat-divider\"><\/div>\n    <div class=\"ae4u-stat\"><div class=\"ae4u-stat__n\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 20h9\"><\/path><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"><\/path><\/svg><\/div><div class=\"ae4u-stat__l\">Interactive Exercises<\/div><\/div>\n    <div class=\"ae4u-stat-divider\"><\/div>\n    <div class=\"ae4u-stat\"><div class=\"ae4u-stat__n\">\ud83c\udd93<\/div><div class=\"ae4u-stat__l\">100% Free<\/div><\/div>\n  <\/div>\n\n  <div class=\"ae4u-section\">\n    <div class=\"ae4u-section-header ae4u-section-header--green\">\n      <div>\n        <h2 class=\"ae4u-section-title\"><span class=\"ae4u-dot ae4u-dot--green\" aria-label=\"Available\"><\/span> Beginning Level<\/h2>\n        <p class=\"ae4u-section-subtitle\">Foundation grammar \u2014 nouns, verbs, basic sentences, simple and present tenses.<\/p>\n      <\/div>\n      <span class=\"ae4u-section-badge ae4u-section-badge--green\">Beginner<\/span>\n    <\/div>\n    <div class=\"ae4u-book-block\">\n      <div class=\"ae4u-book-label\"><div class=\"ae4u-book-icon\"><svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"><\/path><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"><\/path><\/svg><\/div>Foundation<\/div>\n      <div class=\"ae4u-grid\">\n        <a href=\"\/grammar-for-beginning\/\" class=\"ae4u-card ae4u-card--live\">\n          <span class=\"ae4u-card__label\">Course<\/span>\n          <p class=\"ae4u-card__title\">Grammar for Beginning<\/p>\n          <div class=\"ae4u-card__badges\">\n            <span class=\"ae4u-badge ae4u-badge--video\">\u25b6 Video<\/span>\n            <span class=\"ae4u-badge ae4u-badge--fill\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M12 20h9\"><\/path><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"><\/path><\/svg> Fill-in<\/span>\n          <\/div>\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"ae4u-section\">\n    <div class=\"ae4u-section-header ae4u-section-header--orange\">\n      <div>\n        <h2 class=\"ae4u-section-title\"><span class=\"ae4u-dot ae4u-dot--orange\" aria-label=\"Coming Soon\"><\/span> Intermediate Level<\/h2>\n        <p class=\"ae4u-section-subtitle\">Build on the basics \u2014 perfect tenses, passive voice, conditionals, and more.<\/p>\n      <\/div>\n      <span class=\"ae4u-section-badge ae4u-section-badge--orange\">Intermediate<\/span>\n    <\/div>\n    <div class=\"ae4u-coming-box\">\n      <div class=\"ae4u-coming-box__icon\"><\/div>\n      <div class=\"ae4u-coming-box__body\">\n        <p class=\"ae4u-coming-box__title\">Intermediate Grammar \u2014 Coming Soon<\/p>\n        <p class=\"ae4u-coming-box__desc\">We&#8217;re building the intermediate grammar course. Subscribe on YouTube to be notified when it launches.<\/p>\n\n      <\/div>\n      <a href=\"https:\/\/www.youtube.com\/@AllEnglish4U\" target=\"_blank\" rel=\"noopener\" class=\"ae4u-yt-btn\">\u25b6 Notify Me<\/a>\n    <\/div>\n  <\/div>\n\n  <div class=\"ae4u-section\">\n    <div class=\"ae4u-section-header\">\n      <div>\n        <h2 class=\"ae4u-section-title\"><span class=\"ae4u-dot ae4u-dot--red\" aria-label=\"Planned\"><\/span> Advanced Level<\/h2>\n        <p class=\"ae4u-section-subtitle\">Complex structures \u2014 subjunctive mood, inversion, cleft sentences, formal writing.<\/p>\n      <\/div>\n      <span class=\"ae4u-section-badge\">Advanced<\/span>\n    <\/div>\n    <div class=\"ae4u-coming-box\">\n      <div class=\"ae4u-coming-box__icon\"><\/div>\n      <div class=\"ae4u-coming-box__body\">\n        <p class=\"ae4u-coming-box__title\">Advanced Grammar \u2014 Coming Soon<\/p>\n        <p class=\"ae4u-coming-box__desc\">Advanced grammar is in development. Follow us on YouTube for updates.<\/p>\n      <\/div>\n      <a href=\"https:\/\/www.youtube.com\/@AllEnglish4U\" target=\"_blank\" rel=\"noopener\" class=\"ae4u-yt-btn\">\u25b6 Notify Me<\/a>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Present Tenses Interactive Worksheet \u2013 allenglish4u.com<\/title>\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  body {\n    font-family: 'Segoe UI', Arial, sans-serif;\n    background: #f4f6fb;\n    color: #1a1a2e;\n    min-height: 100vh;\n    padding: 0;\n  }\n\n  .ws-wrap {\n    max-width: 860px;\n    margin: 0 auto;\n    padding: 24px 16px 48px;\n  }\n\n  \/* HEADER *\/\n  .ws-header {\n    background: linear-gradient(135deg, #1a3a6b 0%, #0d2a54 100%);\n    border-radius: 16px;\n    padding: 28px 32px 24px;\n    margin-bottom: 20px;\n    position: relative;\n    overflow: hidden;\n  }\n  .ws-header::after {\n    content: '';\n    position: absolute;\n    right: -30px; top: -30px;\n    width: 180px; height: 180px;\n    border-radius: 50%;\n    background: rgba(255,255,255,0.06);\n    pointer-events: none;\n  }\n  .ws-logo {\n    font-size: 12px;\n    color: #7aa4d0;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    margin-bottom: 8px;\n    font-weight: 600;\n  }\n  .ws-header h1 {\n    font-size: 32px;\n    font-weight: 700;\n    color: #fff;\n    margin-bottom: 6px;\n    letter-spacing: -0.5px;\n  }\n  .ws-header p {\n    font-size: 14px;\n    color: #a5c4e0;\n    margin-bottom: 14px;\n  }\n  .ws-meta { display: flex; gap: 8px; flex-wrap: wrap; }\n  .ws-badge {\n    background: rgba(255,255,255,0.15);\n    color: #e0ecf8;\n    border-radius: 20px;\n    padding: 4px 14px;\n    font-size: 12px;\n    font-weight: 500;\n    border: 1px solid rgba(255,255,255,0.15);\n  }\n\n  \/* SCORE BAR *\/\n  .score-bar {\n    background: #fff;\n    border-radius: 12px;\n    padding: 16px 22px;\n    margin-bottom: 18px;\n    display: flex;\n    align-items: center;\n    gap: 18px;\n    box-shadow: 0 2px 8px rgba(26,58,107,0.08);\n    border: 1px solid #e3eaf7;\n  }\n  .score-num {\n    font-size: 30px;\n    font-weight: 700;\n    color: #1a3a6b;\n    min-width: 64px;\n    line-height: 1;\n  }\n  .progress-wrap { flex: 1; }\n  .progress-label { font-size: 12px; color: #6b7280; margin-bottom: 7px; font-weight: 500; }\n  .progress-track {\n    height: 9px;\n    background: #e8eef8;\n    border-radius: 8px;\n    overflow: hidden;\n  }\n  .progress-fill {\n    height: 100%;\n    background: linear-gradient(90deg, #1a3a6b, #3a6bc8);\n    border-radius: 8px;\n    transition: width 0.5s cubic-bezier(.4,0,.2,1);\n    width: 0%;\n  }\n  .btn-reset {\n    border: 1px solid #d1d9f0;\n    background: #fff;\n    color: #6b7280;\n    padding: 8px 18px;\n    border-radius: 8px;\n    font-size: 13px;\n    cursor: pointer;\n    transition: all 0.15s;\n    white-space: nowrap;\n  }\n  .btn-reset:hover { background: #f4f6fb; border-color: #1a3a6b; color: #1a3a6b; }\n\n  \/* TABS *\/\n  .tab-nav {\n    display: flex;\n    gap: 6px;\n    margin-bottom: 18px;\n    flex-wrap: wrap;\n  }\n  .tab-btn {\n    padding: 9px 18px;\n    border: 1.5px solid #dce6f5;\n    border-radius: 10px;\n    background: #fff;\n    font-size: 13px;\n    cursor: pointer;\n    color: #4b5563;\n    font-weight: 500;\n    transition: all 0.15s;\n  }\n  .tab-btn:hover:not(.active) { border-color: #1a3a6b; color: #1a3a6b; background: #f0f4ff; }\n  .tab-btn.active {\n    background: #1a3a6b;\n    color: #fff;\n    border-color: #1a3a6b;\n    box-shadow: 0 4px 12px rgba(26,58,107,0.25);\n  }\n\n  \/* PANELS *\/\n  .tab-panel { display: none; }\n  .tab-panel.active { display: block; animation: fadeIn 0.2s ease; }\n  @keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }\n\n  .section-title {\n    font-size: 17px;\n    font-weight: 700;\n    color: #1a3a6b;\n    margin-bottom: 4px;\n  }\n  .section-sub {\n    font-size: 13px;\n    color: #6b7280;\n    margin-bottom: 18px;\n  }\n\n  \/* GRAMMAR NOTES *\/\n  .grammar-card {\n    background: #fff;\n    border-radius: 14px;\n    border: 1px solid #e3eaf7;\n    padding: 20px 24px;\n    margin-bottom: 14px;\n    border-left: 5px solid #1a3a6b;\n    box-shadow: 0 2px 8px rgba(26,58,107,0.06);\n  }\n  .grammar-card h3 { font-size: 15px; font-weight: 700; color: #1a3a6b; margin-bottom: 8px; }\n  .grammar-card .form-pill {\n    display: inline-block;\n    background: #e8f0fb;\n    color: #1a3a6b;\n    border-radius: 6px;\n    padding: 3px 10px;\n    font-family: 'Courier New', monospace;\n    font-size: 13px;\n    margin: 2px 4px 2px 0;\n    font-weight: 600;\n  }\n  .grammar-card .signals {\n    margin-top: 10px;\n    font-size: 13px;\n    color: #4b5563;\n  }\n  .grammar-card .signals span {\n    display: inline-block;\n    background: #f3f4f6;\n    border-radius: 4px;\n    padding: 2px 8px;\n    margin: 2px 3px;\n    font-size: 12px;\n    color: #374151;\n    border: 1px solid #e5e7eb;\n  }\n  .grammar-card .examples {\n    margin-top: 10px;\n    padding: 10px 14px;\n    background: #f8faff;\n    border-radius: 8px;\n    font-size: 13px;\n    line-height: 2;\n    color: #374151;\n  }\n  .grammar-card .examples em { color: #1a3a6b; font-style: normal; font-weight: 600; }\n  .grammar-cards-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\n  @media (max-width: 600px) { .grammar-cards-grid { grid-template-columns: 1fr; } }\n\n  .gc-teal { border-left-color: #0d6e6e; }\n  .gc-teal h3 { color: #0d6e6e; }\n  .gc-teal .form-pill { background: #e0f5f5; color: #0d6e6e; }\n  .gc-purple { border-left-color: #7c3aed; }\n  .gc-purple h3 { color: #7c3aed; }\n  .gc-purple .form-pill { background: #f0ebff; color: #7c3aed; }\n  .gc-amber { border-left-color: #b45309; }\n  .gc-amber h3 { color: #b45309; }\n  .gc-amber .form-pill { background: #fef3e0; color: #b45309; }\n\n  \/* EXERCISES *\/\n  .exercise-card {\n    background: #fff;\n    border-radius: 14px;\n    border: 1px solid #e3eaf7;\n    padding: 20px 24px;\n    margin-bottom: 14px;\n    box-shadow: 0 2px 8px rgba(26,58,107,0.05);\n    transition: box-shadow 0.2s;\n  }\n  .exercise-card:hover { box-shadow: 0 4px 16px rgba(26,58,107,0.1); }\n  .ex-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 10px;\n  }\n  .ex-num {\n    font-size: 12px;\n    font-weight: 600;\n    color: #9ca3af;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n  }\n  .ex-badge {\n    font-size: 11px;\n    background: #e8f0fb;\n    color: #1a3a6b;\n    padding: 3px 10px;\n    border-radius: 10px;\n    font-weight: 600;\n  }\n  .ex-sentence {\n    font-size: 15px;\n    line-height: 2;\n    color: #1a1a2e;\n    margin-bottom: 8px;\n  }\n\n  \/* FILL IN THE BLANK *\/\n  .blank-input {\n    border: none;\n    border-bottom: 2.5px solid #1a3a6b;\n    background: transparent;\n    font-size: 15px;\n    color: #1a1a2e;\n    padding: 0 6px 2px;\n    width: 130px;\n    outline: none;\n    font-family: inherit;\n    text-align: center;\n    transition: border-color 0.2s, background 0.2s;\n    border-radius: 0;\n  }\n  .blank-input:focus { border-color: #2563eb; background: #f0f4ff; }\n  .blank-input.correct { border-color: #16a34a; background: #f0fdf4; color: #15803d; font-weight: 600; }\n  .blank-input.wrong { border-color: #dc2626; background: #fef2f2; color: #b91c1c; }\n\n  \/* MULTIPLE CHOICE *\/\n  .mc-options { display: flex; flex-direction: column; gap: 9px; margin-top: 6px; }\n  .mc-opt {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    padding: 11px 16px;\n    border: 1.5px solid #e3eaf7;\n    border-radius: 10px;\n    cursor: pointer;\n    font-size: 14px;\n    color: #374151;\n    transition: all 0.15s;\n    user-select: none;\n  }\n  .mc-opt:hover { border-color: #1a3a6b; background: #f0f4ff; }\n  .mc-opt.selected { border-color: #1a3a6b; background: #e8f0fb; color: #1a3a6b; }\n  .mc-opt.correct { border-color: #16a34a !important; background: #f0fdf4 !important; color: #15803d !important; }\n  .mc-opt.wrong { border-color: #dc2626 !important; background: #fef2f2 !important; color: #b91c1c !important; }\n  .mc-letter {\n    width: 26px; height: 26px;\n    border-radius: 50%;\n    border: 1.5px solid currentColor;\n    display: flex; align-items: center; justify-content: center;\n    font-size: 12px; font-weight: 700;\n    flex-shrink: 0;\n  }\n\n  \/* TRUE\/FALSE *\/\n  .tf-sentence {\n    font-size: 15px;\n    line-height: 1.7;\n    color: #374151;\n    font-style: italic;\n    margin-bottom: 12px;\n    padding: 10px 14px;\n    background: #f8faff;\n    border-radius: 8px;\n    border-left: 3px solid #d1d9f0;\n  }\n  .tf-options { display: flex; gap: 12px; }\n  .tf-btn {\n    flex: 1;\n    padding: 13px;\n    border: 1.5px solid #e3eaf7;\n    border-radius: 10px;\n    cursor: pointer;\n    font-size: 14px;\n    font-weight: 600;\n    background: #fff;\n    color: #374151;\n    transition: all 0.15s;\n  }\n  .tf-btn:hover { border-color: #1a3a6b; background: #f0f4ff; color: #1a3a6b; }\n  .tf-btn.selected { border-color: #1a3a6b; background: #e8f0fb; color: #1a3a6b; }\n  .tf-btn.correct { border-color: #16a34a !important; background: #f0fdf4 !important; color: #15803d !important; }\n  .tf-btn.wrong { border-color: #dc2626 !important; background: #fef2f2 !important; color: #b91c1c !important; }\n  .tf-correction {\n    margin-top: 8px;\n    font-size: 13px;\n    color: #15803d;\n    background: #f0fdf4;\n    border-radius: 7px;\n    padding: 7px 12px;\n    border: 1px solid #bbf7d0;\n  }\n\n  \/* DRAG & DROP *\/\n  .word-bank-label { font-size: 12px; color: #6b7280; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; }\n  .word-bank {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    padding: 12px 14px;\n    background: #f8faff;\n    border-radius: 10px;\n    border: 1px dashed #c5d5f0;\n    margin-bottom: 14px;\n    min-height: 50px;\n  }\n  .drag-chip {\n    display: inline-flex;\n    align-items: center;\n    padding: 6px 16px;\n    background: #fff;\n    border: 1.5px solid #c5d5f0;\n    border-radius: 20px;\n    font-size: 14px;\n    cursor: grab;\n    user-select: none;\n    transition: all 0.15s;\n    color: #1a3a6b;\n    font-weight: 500;\n    box-shadow: 0 1px 4px rgba(26,58,107,0.08);\n  }\n  .drag-chip:hover { border-color: #1a3a6b; background: #e8f0fb; transform: translateY(-1px); }\n  .drag-chip.dragging { opacity: 0.45; transform: scale(0.97); }\n  .drag-chip.used { opacity: 0.3; cursor: default; pointer-events: none; }\n  .drag-zone {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-width: 150px;\n    min-height: 38px;\n    border: 2px dashed #a5bce8;\n    border-radius: 8px;\n    padding: 4px 12px;\n    background: transparent;\n    vertical-align: middle;\n    margin: 0 4px;\n    transition: all 0.15s;\n    font-size: 14px;\n    color: #6b7280;\n  }\n  .drag-zone.over { background: #e8f0fb; border-color: #1a3a6b; color: #1a3a6b; }\n  .drag-zone.filled { border-style: solid; border-color: #1a3a6b; background: #f0f4ff; color: #1a3a6b; font-weight: 600; }\n  .drag-zone.correct { border-color: #16a34a !important; background: #f0fdf4 !important; color: #15803d !important; }\n  .drag-zone.wrong { border-color: #dc2626 !important; background: #fef2f2 !important; color: #b91c1c !important; }\n\n  \/* FEEDBACK *\/\n  .ex-feedback { font-size: 13px; margin-top: 10px; min-height: 20px; line-height: 1.6; }\n  .feedback-correct { color: #16a34a; font-weight: 600; }\n  .feedback-wrong { color: #dc2626; font-weight: 600; }\n\n  \/* BUTTONS *\/\n  .check-all-btn {\n    background: #1a3a6b;\n    color: #fff;\n    border: none;\n    padding: 12px 28px;\n    border-radius: 10px;\n    font-size: 14px;\n    font-weight: 600;\n    cursor: pointer;\n    margin-top: 8px;\n    transition: all 0.15s;\n    letter-spacing: 0.2px;\n    box-shadow: 0 4px 14px rgba(26,58,107,0.25);\n  }\n  .check-all-btn:hover { background: #15316b; transform: translateY(-1px); box-shadow: 0 6px 18px rgba(26,58,107,0.3); }\n  .start-btn {\n    background: #1a3a6b;\n    color: #fff;\n    border: none;\n    padding: 12px 28px;\n    border-radius: 10px;\n    font-size: 14px;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.15s;\n    box-shadow: 0 4px 14px rgba(26,58,107,0.25);\n  }\n  .start-btn:hover { background: #15316b; transform: translateY(-1px); }\n\n  \/* RESULT POPUP *\/\n  .result-popup {\n    display: none;\n    background: #fff;\n    border: 1.5px solid #e3eaf7;\n    border-radius: 14px;\n    padding: 24px;\n    margin-top: 16px;\n    text-align: center;\n    box-shadow: 0 4px 20px rgba(26,58,107,0.1);\n  }\n  .result-popup.show { display: block; animation: fadeIn 0.3s ease; }\n  .result-emoji { font-size: 40px; margin-bottom: 10px; }\n  .result-score { font-size: 24px; font-weight: 700; color: #1a3a6b; }\n  .result-msg { font-size: 14px; color: #6b7280; margin-top: 6px; }\n\n  \/* FOOTER *\/\n  .ws-footer {\n    text-align: center;\n    margin-top: 32px;\n    font-size: 12px;\n    color: #9ca3af;\n    padding-bottom: 8px;\n  }\n  .ws-footer a { color: #1a3a6b; text-decoration: none; font-weight: 600; }\n  .ws-footer a:hover { text-decoration: underline; }\n\n  \/* MOBILE *\/\n  @media (max-width: 600px) {\n    .ws-header { padding: 20px; }\n    .ws-header h1 { font-size: 24px; }\n    .tab-btn { padding: 8px 12px; font-size: 12px; }\n    .exercise-card { padding: 16px; }\n    .blank-input { width: 100px; }\n    .tf-options { flex-direction: column; }\n  }\n<\/style>\n<\/head>\n<body>\n<div class=\"ws-wrap\">\n\n  <!-- HEADER -->\n  <div class=\"ws-header\">\n    <div class=\"ws-logo\">allenglish4u.com \u00b7 Grammar Workshop<\/div>\n    <h1>Present Tenses<\/h1>\n    <p>English Grammar in Use \u00b7 Intermediate B1\u2013B2 \u00b7 Units 1\u20137<\/p>\n    <div class=\"ws-meta\">\n      <span class=\"ws-badge\">\ud83d\udcda Intermediate B1\u2013B2<\/span>\n      <span class=\"ws-badge\">\ud83d\udcdd 4 exercise types<\/span>\n      <span class=\"ws-badge\">\u2705 Auto-graded<\/span>\n    <\/div>\n  <\/div>\n\n  <!-- SCORE BAR -->\n  <div class=\"score-bar\">\n    <div class=\"score-num\" id=\"totalScore\">0%<\/div>\n    <div class=\"progress-wrap\">\n      <div class=\"progress-label\">Overall score \u2014 complete all 4 exercises<\/div>\n      <div class=\"progress-track\"><div class=\"progress-fill\" id=\"progressFill\"><\/div><\/div>\n    <\/div>\n    <button class=\"btn-reset\" onclick=\"resetAll()\">\u21ba Reset all<\/button>\n  <\/div>\n\n  <!-- TABS -->\n  <div class=\"tab-nav\">\n    <button class=\"tab-btn active\" onclick=\"showTab('grammar')\">\ud83d\udcd6 Grammar Notes<\/button>\n    <button class=\"tab-btn\" onclick=\"showTab('fill')\">\u270f\ufe0f Fill in the Blank<\/button>\n    <button class=\"tab-btn\" onclick=\"showTab('mc')\">\ud83d\udd18 Multiple Choice<\/button>\n    <button class=\"tab-btn\" onclick=\"showTab('tf')\">\u2705 True \/ False<\/button>\n    <button class=\"tab-btn\" onclick=\"showTab('drag')\">\ud83d\udd00 Drag &amp; Drop<\/button>\n  <\/div>\n\n  <!-- ===== GRAMMAR NOTES ===== -->\n  <div class=\"tab-panel active\" id=\"tab-grammar\">\n    <div class=\"section-title\">Grammar Reference \u2014 Present Tenses<\/div>\n    <div class=\"section-sub\">Study the notes carefully before starting the exercises.<\/div>\n\n    <div class=\"grammar-cards-grid\">\n      <div class=\"grammar-card\">\n        <h3>1. Present Simple<\/h3>\n        <span class=\"form-pill\">I\/You\/We\/They + V\u2081<\/span>\n        <span class=\"form-pill\">He\/She\/It + V\u2081s<\/span>\n        <span class=\"form-pill\">don&#8217;t \/ doesn&#8217;t + V\u2081<\/span>\n        <div class=\"signals\"><strong>Signal words:<\/strong><br>\n          <span>always<\/span><span>usually<\/span><span>often<\/span><span>sometimes<\/span>\n          <span>never<\/span><span>every day<\/span><span>on Mondays<\/span><span>in general<\/span>\n        <\/div>\n        <div class=\"examples\">\n          <em>She works<\/em> at a hospital. (permanent)<br>\n          Water <em>boils<\/em> at 100\u00b0C. (fact)<br>\n          The train <em>leaves<\/em> at 9:30. (schedule)\n        <\/div>\n      <\/div>\n\n      <div class=\"grammar-card gc-teal\">\n        <h3>2. Present Continuous<\/h3>\n        <span class=\"form-pill\">am \/ is \/ are + V-ing<\/span>\n        <span class=\"form-pill\">am not \/ isn&#8217;t \/ aren&#8217;t + V-ing<\/span>\n        <div class=\"signals\"><strong>Signal words:<\/strong><br>\n          <span>now<\/span><span>at the moment<\/span><span>currently<\/span>\n          <span>today<\/span><span>this week<\/span><span>Look!<\/span><span>Listen!<\/span>\n        <\/div>\n        <div class=\"examples\">\n          I <em>am studying<\/em> right now. (action now)<br>\n          She <em>is staying<\/em> with us this week. (temporary)<br>\n          We <em>are meeting<\/em> them on Friday. (future plan)\n        <\/div>\n      <\/div>\n\n      <div class=\"grammar-card gc-purple\">\n        <h3>3. Present Perfect Simple<\/h3>\n        <span class=\"form-pill\">have \/ has + past participle<\/span>\n        <span class=\"form-pill\">haven&#8217;t \/ hasn&#8217;t + V\u2083<\/span>\n        <div class=\"signals\"><strong>Signal words:<\/strong><br>\n          <span>just<\/span><span>already<\/span><span>yet<\/span><span>ever<\/span>\n          <span>never<\/span><span>recently<\/span><span>since<\/span><span>for<\/span><span>so far<\/span>\n        <\/div>\n        <div class=\"examples\">\n          I <em>have lost<\/em> my keys. (present result)<br>\n          She <em>has never been<\/em> to Paris. (experience)<br>\n          He <em>has just finished<\/em> the report. (very recent)\n        <\/div>\n      <\/div>\n\n      <div class=\"grammar-card gc-amber\">\n        <h3>4. Present Perfect Continuous<\/h3>\n        <span class=\"form-pill\">have \/ has + been + V-ing<\/span>\n        <div class=\"signals\"><strong>Signal words:<\/strong><br>\n          <span>for<\/span><span>since<\/span><span>all day<\/span><span>all week<\/span>\n          <span>How long?<\/span><span>lately<\/span><span>recently<\/span>\n        <\/div>\n        <div class=\"examples\">\n          I <em>have been waiting<\/em> for 2 hours. (still waiting)<br>\n          She <em>has been learning<\/em> French since 2020.<br>\n          It <em>has been raining<\/em> all day. (ongoing)\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"grammar-card\" style=\"border-left-color:#dc2626; margin-top:0;\">\n      <h3 style=\"color:#dc2626;\">\u26a0 Stative Verbs \u2014 NEVER use in continuous form<\/h3>\n      <div class=\"signals\">\n        <span>know<\/span><span>believe<\/span><span>understand<\/span><span>think<\/span>\n        <span>love<\/span><span>hate<\/span><span>like<\/span><span>want<\/span><span>need<\/span>\n        <span>see<\/span><span>hear<\/span><span>smell<\/span><span>have<\/span><span>own<\/span><span>belong<\/span>\n      <\/div>\n      <div class=\"examples\" style=\"margin-top:10px;\">\n        \u2717 &nbsp;<s style=\"color:#dc2626;\">I am knowing the answer.<\/s><br>\n        \u2713 &nbsp;<span style=\"color:#16a34a;font-weight:600;\">I know the answer.<\/span>\n      <\/div>\n    <\/div>\n\n    <button class=\"start-btn\" onclick=\"showTab('fill')\">Start Exercise 1: Fill in the Blank \u2192<\/button>\n  <\/div>\n\n  <!-- ===== FILL IN THE BLANK ===== -->\n  <div class=\"tab-panel\" id=\"tab-fill\">\n    <div class=\"section-title\">Exercise 1 \u2014 Fill in the Blank<\/div>\n    <div class=\"section-sub\">Put the verb in brackets into the correct present tense form.<\/div>\n    <div id=\"fill-exercises\"><\/div>\n    <button class=\"check-all-btn\" onclick=\"checkAllFill()\">Check My Answers \u2713<\/button>\n    <div class=\"result-popup\" id=\"fill-result\"><\/div>\n  <\/div>\n\n  <!-- ===== MULTIPLE CHOICE ===== -->\n  <div class=\"tab-panel\" id=\"tab-mc\">\n    <div class=\"section-title\">Exercise 2 \u2014 Multiple Choice<\/div>\n    <div class=\"section-sub\">Choose the best answer for each sentence.<\/div>\n    <div id=\"mc-exercises\"><\/div>\n    <button class=\"check-all-btn\" onclick=\"checkAllMC()\">Check My Answers \u2713<\/button>\n    <div class=\"result-popup\" id=\"mc-result\"><\/div>\n  <\/div>\n\n  <!-- ===== TRUE\/FALSE ===== -->\n  <div class=\"tab-panel\" id=\"tab-tf\">\n    <div class=\"section-title\">Exercise 3 \u2014 True or False<\/div>\n    <div class=\"section-sub\">Is the sentence grammatically correct? Select True or False, then check your answers.<\/div>\n    <div id=\"tf-exercises\"><\/div>\n    <button class=\"check-all-btn\" onclick=\"checkAllTF()\">Check My Answers \u2713<\/button>\n    <div class=\"result-popup\" id=\"tf-result\"><\/div>\n  <\/div>\n\n  <!-- ===== DRAG & DROP ===== -->\n  <div class=\"tab-panel\" id=\"tab-drag\">\n    <div class=\"section-title\">Exercise 4 \u2014 Drag &amp; Drop<\/div>\n    <div class=\"section-sub\">Drag the correct verb form from the word bank into the gap in each sentence.<\/div>\n    <div id=\"drag-exercises\"><\/div>\n    <button class=\"check-all-btn\" onclick=\"checkAllDrag()\">Check My Answers \u2713<\/button>\n    <div class=\"result-popup\" id=\"drag-result\"><\/div>\n  <\/div>\n\n  <!-- FOOTER -->\n  <div class=\"ws-footer\">\n    Made with \u2764 for English learners &nbsp;\u00b7&nbsp;\n    <a href=\"https:\/\/allenglish4u.com\" target=\"_blank\">allenglish4u.com<\/a>\n    &nbsp;\u00b7&nbsp; Based on <em>English Grammar in Use<\/em> (Cambridge)\n  <\/div>\n\n<\/div><!-- .ws-wrap -->\n\n<script>\nconst fillData = [\n  {\n    parts: [\"1. She \", \" (work) at a hospital. She \", \" (work) there for ten years.\"],\n    blanks: [\"works\", \"has worked\"],\n    hints: [\"simple form\", \"perfect form\"]\n  },\n  {\n    parts: [\"2. Look! It \", \" (rain) outside. We can't go out.\"],\n    blanks: [\"is raining\"],\n    hints: [\"continuous\"]\n  },\n  {\n    parts: [\"3. I \", \" (never \/ try) sushi before. I really want to try it.\"],\n    blanks: [\"have never tried\"],\n    hints: [\"perfect + never\"]\n  },\n  {\n    parts: [\"4. They \", \" (study) English for two hours \u2014 and they're still going!\"],\n    blanks: [\"have been studying\"],\n    hints: [\"perfect continuous\"]\n  },\n  {\n    parts: [\"5. The sun \", \" (rise) in the east. This is a scientific fact.\"],\n    blanks: [\"rises\"],\n    hints: [\"fact \u2192 simple\"]\n  },\n  {\n    parts: [\"6. He \", \" (just \/ finish) his homework, so now he's free.\"],\n    blanks: [\"has just finished\"],\n    hints: [\"just \u2192 perfect\"]\n  },\n  {\n    parts: [\"7. I \", \" (meet) him at the caf\u00e9 every Friday. It's our routine.\"],\n    blanks: [\"meet\"],\n    hints: [\"routine \u2192 simple\"]\n  },\n  {\n    parts: [\"8. She \", \" (prepare) for the exam at the moment \u2014 don't disturb her.\"],\n    blanks: [\"is preparing\"],\n    hints: [\"at the moment \u2192 continuous\"]\n  },\n];\n\nconst mcData = [\n  { q: \"I ___ to the gym every Monday.\", opts: [\"go\", \"am going\", \"have gone\", \"have been going\"], ans: 0, exp: \"Routine \u2192 Present Simple.\" },\n  { q: \"She ___ on the phone right now \u2014 don't disturb her.\", opts: [\"talks\", \"is talking\", \"has talked\", \"has been talking\"], ans: 1, exp: \"'Right now' \u2192 Present Continuous.\" },\n  { q: \"How long ___ you ___ English?\", opts: [\"do \/ learn\", \"are \/ learning\", \"have \/ learned\", \"have \/ been learning\"], ans: 3, exp: \"'How long' + ongoing action \u2192 Present Perfect Continuous.\" },\n  { q: \"___ you ever ___ to Japan?\", opts: [\"Do \/ go\", \"Are \/ going\", \"Have \/ been\", \"Did \/ go\"], ans: 2, exp: \"Life experience \u2192 Present Perfect.\" },\n  { q: \"The concert ___ at 8 pm. Don't be late!\", opts: [\"starts\", \"is starting\", \"has started\", \"has been starting\"], ans: 0, exp: \"Scheduled event \u2192 Present Simple.\" },\n  { q: \"I'm tired because I ___ all day.\", opts: [\"work\", \"am working\", \"worked\", \"have been working\"], ans: 3, exp: \"Explaining a present state caused by recent activity \u2192 Present Perfect Continuous.\" },\n  { q: \"She ___ already ___ the report.\", opts: [\"is \/ writing\", \"has \/ written\", \"writes \/ \u2014\", \"was \/ writing\"], ans: 1, exp: \"'Already' \u2192 Present Perfect.\" },\n  { q: \"Look at Tom! He ___ in the swimming pool.\", opts: [\"swims\", \"swam\", \"is swimming\", \"has swum\"], ans: 2, exp: \"'Look!' = action happening right now \u2192 Present Continuous.\" },\n];\n\nconst tfData = [\n  { sentence: \"I am knowing the answer.\", correct: false, correction: \"I know the answer. \u2014 'know' is a stative verb, never used in continuous.\" },\n  { sentence: \"She has been living here since 2015.\", correct: true },\n  { sentence: \"He is working in London at the moment.\", correct: true },\n  { sentence: \"They have been here for three hours.\", correct: true },\n  { sentence: \"I am usually going to school by bus.\", correct: false, correction: \"I usually go to school by bus. \u2014 Routine \u2192 Present Simple.\" },\n  { sentence: \"She has just arrived at the airport.\", correct: true },\n  { sentence: \"Water is boiling at 100\u00b0C.\", correct: false, correction: \"Water boils at 100\u00b0C. \u2014 Scientific fact \u2192 Present Simple.\" },\n  { sentence: \"We have been waiting for over an hour.\", correct: true },\n];\n\nconst dragData = [\n  { template: \"He ___ his keys. He can't find them anywhere.\", answer: \"has lost\", bank: [\"has lost\", \"is losing\", \"lose\", \"was losing\"] },\n  { template: \"Be quiet! The baby ___.\", answer: \"is sleeping\", bank: [\"sleeps\", \"is sleeping\", \"has slept\", \"slept\"] },\n  { template: \"I ___ French for two years now. I'm getting much better.\", answer: \"have been learning\", bank: [\"learn\", \"am learning\", \"have been learning\", \"learned\"] },\n  { template: \"This train ___ at 9:30. Please be on time!\", answer: \"leaves\", bank: [\"is leaving\", \"has left\", \"leaves\", \"left\"] },\n  { template: \"She ___ three cups of coffee today and it's only noon!\", answer: \"has had\", bank: [\"has had\", \"is having\", \"have\", \"had\"] },\n  { template: \"They ___ a brand new office building downtown.\", answer: \"are building\", bank: [\"build\", \"have built\", \"are building\", \"built\"] },\n];\n\nlet fillScores = new Array(fillData.length).fill(null);\nlet mcScores   = new Array(mcData.length).fill(null);\nlet tfScores   = new Array(tfData.length).fill(null);\nlet dragScores = new Array(dragData.length).fill(null);\nlet mcSelected = new Array(mcData.length).fill(null);\nlet tfSelected = new Array(tfData.length).fill(null);\nlet dragState  = {};\n\n\/\/ ---- TABS ----\nfunction showTab(id) {\n  document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));\n  document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));\n  document.getElementById('tab-' + id).classList.add('active');\n  const idx = ['grammar','fill','mc','tf','drag'].indexOf(id);\n  document.querySelectorAll('.tab-btn')[idx].classList.add('active');\n  window.scrollTo({ top: 0, behavior: 'smooth' });\n}\n\n\/\/ ---- PROGRESS ----\nfunction updateProgress() {\n  const all = [...fillScores, ...mcScores, ...tfScores, ...dragScores];\n  const answered = all.filter(s => s !== null).length;\n  const correct  = all.filter(s => s === true).length;\n  const pct = all.length ? Math.round((correct \/ all.length) * 100) : 0;\n  document.getElementById('totalScore').textContent = pct + '%';\n  document.getElementById('progressFill').style.width = pct + '%';\n}\n\nfunction resultMsg(correct, total) {\n  const pct = Math.round((correct\/total)*100);\n  const emoji = pct === 100 ? '\ud83c\udf1f' : pct >= 75 ? '\ud83c\udf89' : pct >= 50 ? '\ud83d\udc4d' : '\ud83d\udcd6';\n  const msg   = pct === 100 ? 'Perfect score! Excellent work!' :\n                pct >= 75   ? 'Great job! Review the ones you missed.' :\n                pct >= 50   ? 'Good effort! Study the grammar notes and try again.' :\n                              'Keep practicing \u2014 review the grammar notes carefully.';\n  return `<div class=\"result-emoji\">${emoji}<\/div>\n    <div class=\"result-score\">${correct} \/ ${total} correct &nbsp;(${pct}%)<\/div>\n    <div class=\"result-msg\">${msg}<\/div>`;\n}\n\n\/\/ ---- FILL IN THE BLANK ----\nfunction buildFill() {\n  const c = document.getElementById('fill-exercises');\n  c.innerHTML = '';\n  fillData.forEach((item, i) => {\n    let sentHTML = '';\n    let bi = 0;\n    item.parts.forEach(part => {\n      sentHTML += part;\n      if (bi < item.blanks.length) {\n        sentHTML += `<input class=\"blank-input\" id=\"fill-${i}-${bi}\" placeholder=\"${item.hints[bi]}\" autocomplete=\"off\" spellcheck=\"false\" \/>`;\n        bi++;\n      }\n    });\n    c.innerHTML += `<div class=\"exercise-card\">\n      <div class=\"ex-header\"><span class=\"ex-num\">Question ${i+1} of ${fillData.length}<\/span><span class=\"ex-badge\">fill in the blank<\/span><\/div>\n      <div class=\"ex-sentence\">${sentHTML}<\/div>\n      <div class=\"ex-feedback\" id=\"fill-fb-${i}\"><\/div>\n    <\/div>`;\n  });\n}\n\nfunction checkAllFill() {\n  let correct = 0;\n  fillData.forEach((item, i) => {\n    let allOk = true;\n    item.blanks.forEach((ans, j) => {\n      const inp = document.getElementById(`fill-${i}-${j}`);\n      const ok  = inp.value.trim().toLowerCase() === ans.toLowerCase();\n      inp.classList.remove('correct','wrong');\n      inp.classList.add(ok ? 'correct' : 'wrong');\n      if (!ok) allOk = false;\n    });\n    fillScores[i] = allOk;\n    if (allOk) correct++;\n    document.getElementById(`fill-fb-${i}`).innerHTML = allOk\n      ? `<span class=\"feedback-correct\">\u2713 Correct!<\/span>`\n      : `<span class=\"feedback-wrong\">\u2717 Answer: <strong>${item.blanks.join(' | ')}<\/strong><\/span>`;\n  });\n  const r = document.getElementById('fill-result');\n  r.classList.add('show');\n  r.innerHTML = resultMsg(correct, fillData.length);\n  updateProgress();\n}\n\n\/\/ ---- MULTIPLE CHOICE ----\nfunction buildMC() {\n  const letters = ['A','B','C','D'];\n  const c = document.getElementById('mc-exercises');\n  c.innerHTML = '';\n  mcData.forEach((item, i) => {\n    const opts = item.opts.map((o, j) =>\n      `<div class=\"mc-opt\" id=\"mc-${i}-${j}\" onclick=\"selectMC(${i},${j})\">\n        <span class=\"mc-letter\">${letters[j]}<\/span> ${o}\n      <\/div>`\n    ).join('');\n    c.innerHTML += `<div class=\"exercise-card\">\n      <div class=\"ex-header\"><span class=\"ex-num\">Question ${i+1} of ${mcData.length}<\/span><span class=\"ex-badge\">multiple choice<\/span><\/div>\n      <div class=\"ex-sentence\">${item.q}<\/div>\n      <div class=\"mc-options\">${opts}<\/div>\n      <div class=\"ex-feedback\" id=\"mc-fb-${i}\"><\/div>\n    <\/div>`;\n  });\n}\n\nfunction selectMC(q, a) {\n  if (mcScores[q] !== null) return;\n  mcSelected[q] = a;\n  for (let j = 0; j < mcData[q].opts.length; j++) {\n    document.getElementById(`mc-${q}-${j}`).classList.remove('selected','correct','wrong');\n  }\n  document.getElementById(`mc-${q}-${a}`).classList.add('selected');\n}\n\nfunction checkAllMC() {\n  let correct = 0;\n  mcData.forEach((item, i) => {\n    const sel = mcSelected[i];\n    const ok  = sel === item.ans;\n    mcScores[i] = ok;\n    if (ok) correct++;\n    for (let j = 0; j < item.opts.length; j++) {\n      const el = document.getElementById(`mc-${i}-${j}`);\n      el.classList.remove('selected','correct','wrong');\n      if (j === item.ans) el.classList.add('correct');\n      else if (j === sel)  el.classList.add('wrong');\n    }\n    document.getElementById(`mc-fb-${i}`).innerHTML = ok\n      ? `<span class=\"feedback-correct\">\u2713 Correct! ${item.exp}<\/span>`\n      : `<span class=\"feedback-wrong\">\u2717 ${sel === null ? 'No answer selected. ' : ''}${item.exp}<\/span>`;\n  });\n  const r = document.getElementById('mc-result');\n  r.classList.add('show');\n  r.innerHTML = resultMsg(correct, mcData.length);\n  updateProgress();\n}\n\n\/\/ ---- TRUE\/FALSE ----\nfunction buildTF() {\n  const c = document.getElementById('tf-exercises');\n  c.innerHTML = '';\n  tfData.forEach((item, i) => {\n    c.innerHTML += `<div class=\"exercise-card\">\n      <div class=\"ex-header\"><span class=\"ex-num\">Question ${i+1} of ${tfData.length}<\/span><span class=\"ex-badge\">true \/ false<\/span><\/div>\n      <div class=\"tf-sentence\">\"${item.sentence}\"<\/div>\n      <div class=\"tf-options\">\n        <button class=\"tf-btn\" id=\"tf-${i}-T\" onclick=\"selectTF(${i}, true)\">\u2713 &nbsp;True \u2014 correct grammar<\/button>\n        <button class=\"tf-btn\" id=\"tf-${i}-F\" onclick=\"selectTF(${i}, false)\">\u2717 &nbsp;False \u2014 incorrect grammar<\/button>\n      <\/div>\n      <div class=\"ex-feedback\" id=\"tf-fb-${i}\"><\/div>\n    <\/div>`;\n  });\n}\n\nfunction selectTF(q, val) {\n  if (tfScores[q] !== null) return;\n  tfSelected[q] = val;\n  document.getElementById(`tf-${q}-T`).classList.toggle('selected', val === true);\n  document.getElementById(`tf-${q}-F`).classList.toggle('selected', val === false);\n}\n\nfunction checkAllTF() {\n  let correct = 0;\n  tfData.forEach((item, i) => {\n    const sel = tfSelected[i];\n    const ok  = sel === item.correct;\n    tfScores[i] = ok;\n    if (ok) correct++;\n    const tBtn = document.getElementById(`tf-${i}-T`);\n    const fBtn = document.getElementById(`tf-${i}-F`);\n    tBtn.classList.remove('selected','correct','wrong');\n    fBtn.classList.remove('selected','correct','wrong');\n    (item.correct ? tBtn : fBtn).classList.add('correct');\n    if (sel !== null && sel !== item.correct) {\n      (sel ? tBtn : fBtn).classList.add('wrong');\n    }\n    const fb = document.getElementById(`tf-fb-${i}`);\n    if (ok) {\n      fb.innerHTML = `<span class=\"feedback-correct\">\u2713 Correct!<\/span>`;\n    } else {\n      fb.innerHTML = `<span class=\"feedback-wrong\">\u2717 This sentence is ${item.correct ? 'correct' : 'incorrect'}.<\/span>\n        ${!item.correct && item.correction ? `<div class=\"tf-correction\">\u270e ${item.correction}<\/div>` : ''}`;\n    }\n  });\n  const r = document.getElementById('tf-result');\n  r.classList.add('show');\n  r.innerHTML = resultMsg(correct, tfData.length);\n  updateProgress();\n}\n\n\/\/ ---- DRAG & DROP ----\nlet currentDrag = null;\nlet currentDragQ = null;\n\nfunction buildDrag() {\n  const c = document.getElementById('drag-exercises');\n  c.innerHTML = '';\n  dragData.forEach((item, i) => {\n    const shuffled = [...item.bank].sort(() => Math.random() - 0.5);\n    const bank = shuffled.map(w =>\n      `<span class=\"drag-chip\" draggable=\"true\" data-word=\"${w}\" id=\"chip-${i}-${w.replace(\/\\s+\/g,'_')}\"\n        ondragstart=\"onDragStart(event,'${w}',${i})\">${w}<\/span>`\n    ).join('');\n    const parts = item.template.split('___');\n    const sent  = parts[0]\n      + `<span class=\"drag-zone\" id=\"dz-${i}\"\n          ondragover=\"event.preventDefault();this.classList.add('over')\"\n          ondragleave=\"this.classList.remove('over')\"\n          ondrop=\"onDrop(event,${i})\">drop here<\/span>`\n      + (parts[1] || '');\n    c.innerHTML += `<div class=\"exercise-card\">\n      <div class=\"ex-header\"><span class=\"ex-num\">Question ${i+1} of ${dragData.length}<\/span><span class=\"ex-badge\">drag &amp; drop<\/span><\/div>\n      <div class=\"word-bank-label\">Word bank:<\/div>\n      <div class=\"word-bank\" id=\"bank-${i}\">${bank}<\/div>\n      <div class=\"ex-sentence\">${sent}<\/div>\n      <div class=\"ex-feedback\" id=\"drag-fb-${i}\"><\/div>\n    <\/div>`;\n    dragState[i] = null;\n  });\n}\n\nfunction onDragStart(e, word, q) {\n  currentDrag  = word;\n  currentDragQ = q;\n  e.dataTransfer.setData('text\/plain', word);\n  setTimeout(() => e.target.classList.add('dragging'), 0);\n  e.target.addEventListener('dragend', () => e.target.classList.remove('dragging'), { once: true });\n}\n\nfunction onDrop(e, q) {\n  e.preventDefault();\n  const zone = document.getElementById(`dz-${q}`);\n  zone.classList.remove('over');\n  if (dragScores[q] !== null) return;\n  const word = e.dataTransfer.getData('text\/plain') || currentDrag;\n  if (!word) return;\n  if (dragState[q]) {\n    const oldId = `chip-${q}-${dragState[q].replace(\/\\s+\/g,'_')}`;\n    const oldEl = document.getElementById(oldId);\n    if (oldEl) oldEl.classList.remove('used');\n  }\n  dragState[q] = word;\n  zone.textContent = word;\n  zone.classList.remove('filled','correct','wrong');\n  zone.classList.add('filled');\n  const chipEl = document.getElementById(`chip-${q}-${word.replace(\/\\s+\/g,'_')}`);\n  if (chipEl) chipEl.classList.add('used');\n  currentDrag = null;\n}\n\nfunction checkAllDrag() {\n  let correct = 0;\n  dragData.forEach((item, i) => {\n    const ans = dragState[i];\n    const ok  = ans && ans.toLowerCase() === item.answer.toLowerCase();\n    dragScores[i] = !!ok;\n    if (ok) correct++;\n    const zone = document.getElementById(`dz-${i}`);\n    zone.classList.remove('filled','correct','wrong');\n    zone.classList.add(ok ? 'correct' : 'wrong');\n    if (!ok) zone.textContent = ans || '\u2014';\n    document.getElementById(`drag-fb-${i}`).innerHTML = ok\n      ? `<span class=\"feedback-correct\">\u2713 Correct!<\/span>`\n      : `<span class=\"feedback-wrong\">\u2717 Answer: <strong>${item.answer}<\/strong><\/span>`;\n  });\n  const r = document.getElementById('drag-result');\n  r.classList.add('show');\n  r.innerHTML = resultMsg(correct, dragData.length);\n  updateProgress();\n}\n\n\/\/ ---- RESET ----\nfunction resetAll() {\n  fillScores.fill(null); mcScores.fill(null); tfScores.fill(null); dragScores.fill(null);\n  mcSelected.fill(null); tfSelected.fill(null);\n  buildFill(); buildMC(); buildTF(); buildDrag();\n  document.querySelectorAll('.result-popup').forEach(p => p.classList.remove('show'));\n  updateProgress();\n  showTab('grammar');\n}\n\n\/\/ INIT\nbuildFill(); buildMC(); buildTF(); buildDrag();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Home \u203a Grammar English Grammar Grammar Lessons Build a solid English foundation \u2014 from basic nouns and verbs to complex tenses and sentence structures. Video-based lessons with interactive exercises. 3 Skill Levels 1 Available Now Interactive Exercises \ud83c\udd93 100% Free Beginning Level Foundation grammar \u2014 nouns, verbs, basic sentences, simple and present tenses. Beginner Foundation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-with-title","meta":{"footnotes":""},"class_list":["post-111","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/comments?post=111"}],"version-history":[{"count":15,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/111\/revisions"}],"predecessor-version":[{"id":675,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/111\/revisions\/675"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}