{"id":74,"date":"2026-06-27T20:44:49","date_gmt":"2026-06-27T12:44:49","guid":{"rendered":"https:\/\/www.wanglixian.com\/?p=74"},"modified":"2026-06-27T22:43:08","modified_gmt":"2026-06-27T14:43:08","slug":"74","status":"publish","type":"post","link":"https:\/\/www.wanglixian.com\/index.php\/2026\/06\/27\/74\/","title":{"rendered":"Leo\u5b66\u82f1\u8bed"},"content":{"rendered":"\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.5, user-scalable=yes\">\n    <title>\ud83d\udcda \u5355\u8bcd\u52a9\u8bb0 \u00b7 \u5916\u7814\u4e09\u8d77\u56db\u4e0b\uff08\u5c71\u4e1c\u4e13\u7528\uff09<\/title>\n    <style>\n        * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n        body {\n            font-family: 'Segoe UI', Roboto, system-ui, -apple-system, sans-serif;\n            background: #f0f4f8;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            padding: 16px;\n        }\n        .app {\n            max-width: 780px;\n            width: 100%;\n            background: #ffffff;\n            border-radius: 40px;\n            box-shadow: 0 20px 40px rgba(0,0,0,0.10), 0 8px 16px rgba(0,0,0,0.05);\n            padding: 24px 20px 32px;\n        }\n        h1 {\n            font-size: 26px;\n            font-weight: 600;\n            color: #1a2a3a;\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            margin-bottom: 12px;\n            border-bottom: 2px solid #e2e8f0;\n            padding-bottom: 14px;\n            flex-wrap: wrap;\n        }\n        h1 small {\n            font-size: 16px;\n            font-weight: 400;\n            color: #6b7b8c;\n            margin-left: auto;\n            background: #ecf0f3;\n            padding: 4px 14px;\n            border-radius: 40px;\n        }\n        .user-section {\n            display: flex;\n            align-items: center;\n            gap: 12px;\n            background: #f7f9fc;\n            border-radius: 28px;\n            padding: 12px 18px;\n            margin-bottom: 16px;\n            flex-wrap: wrap;\n        }\n        .user-section label {\n            font-weight: 600;\n            color: #1a2a3a;\n            font-size: 15px;\n        }\n        .user-section input {\n            flex: 1;\n            min-width: 120px;\n            padding: 8px 16px;\n            border-radius: 40px;\n            border: 1px solid #d6cdc2;\n            font-size: 15px;\n            outline: none;\n            background: white;\n            font-weight: 500;\n        }\n        .user-section input:focus {\n            border-color: #b2a18b;\n            box-shadow: 0 0 0 3px rgba(177, 148, 120, 0.2);\n        }\n        .user-section .user-badge {\n            background: #1a2a3a;\n            color: white;\n            padding: 6px 20px;\n            border-radius: 40px;\n            font-size: 14px;\n            font-weight: 600;\n            white-space: nowrap;\n        }\n        .mode-tabs {\n            display: flex;\n            gap: 8px;\n            margin-bottom: 16px;\n            background: #f1f4f8;\n            border-radius: 30px;\n            padding: 4px;\n        }\n        .mode-tab {\n            flex: 1;\n            padding: 10px 0;\n            border: none;\n            border-radius: 26px;\n            font-size: 15px;\n            font-weight: 600;\n            cursor: pointer;\n            background: transparent;\n            color: #5a6a7a;\n            transition: 0.2s;\n        }\n        .mode-tab.active {\n            background: #ffffff;\n            color: #1a2a3a;\n            box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n        }\n        .filter-panel {\n            background: #f7f9fc;\n            border-radius: 28px;\n            padding: 14px 16px 10px;\n            margin-bottom: 20px;\n            display: flex;\n            flex-wrap: wrap;\n            align-items: center;\n            gap: 10px 8px;\n        }\n        .filter-panel select,\n        .filter-panel button {\n            font-size: 15px;\n            padding: 8px 12px;\n            border-radius: 40px;\n            border: 1px solid #d6cdc2;\n            background: white;\n            color: #1e2b36;\n            font-weight: 500;\n            cursor: pointer;\n            outline: none;\n            transition: 0.15s;\n            flex: 1 0 auto;\n            min-width: 70px;\n        }\n        .filter-panel select {\n            background-image: url('data:image\/svg+xml;utf8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"8\" viewBox=\"0 0 12 8\"><path fill=\"%236b7b8c\" d=\"M6 8L0 0h12z\"\/><\/svg>');\n            background-repeat: no-repeat;\n            background-position: right 12px center;\n            background-size: 12px;\n            appearance: none;\n            padding-right: 32px;\n        }\n        .filter-panel select:focus {\n            border-color: #b2a18b;\n            box-shadow: 0 0 0 3px rgba(177, 148, 120, 0.2);\n        }\n        .btn-primary {\n            background: #1a2a3a;\n            border-color: #1a2a3a;\n            color: white;\n            font-weight: 600;\n            flex: 0.8;\n        }\n        .btn-primary:active {\n            transform: scale(0.96);\n        }\n        .btn-outline {\n            background: transparent;\n            border-color: #b2a18b;\n            color: #3d4e5e;\n        }\n        .game-area {\n            background: #fafcfe;\n            border-radius: 32px;\n            padding: 24px 18px 20px;\n            box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.02), 0 4px 12px rgba(0, 0, 0, 0.02);\n        }\n        .word-display {\n            font-size: 48px;\n            font-weight: 700;\n            text-align: center;\n            color: #1a2a3a;\n            background: #f2ede7;\n            border-radius: 48px;\n            padding: 18px 10px 8px;\n            margin-bottom: 4px;\n            line-height: 1.2;\n            font-family: 'Georgia', serif;\n            box-shadow: 0 2px 0 #d6cdc2;\n            letter-spacing: 2px;\n        }\n        .word-display .placeholder {\n            color: #b0b8c0;\n            letter-spacing: 8px;\n        }\n        .phonetic-display {\n            font-size: 22px;\n            text-align: center;\n            color: #5a6a7a;\n            margin-bottom: 16px;\n            font-family: 'Georgia', serif;\n            letter-spacing: 1px;\n        }\n        .options-grid {\n            display: flex;\n            flex-wrap: wrap;\n            justify-content: center;\n            gap: 12px;\n            margin-bottom: 16px;\n            min-height: 50px;\n        }\n        .option-btn {\n            background: white;\n            border: 2px solid #d0c4b6;\n            border-radius: 60px;\n            font-size: 18px;\n            padding: 10px 24px;\n            font-weight: 500;\n            color: #1e2b36;\n            box-shadow: 0 3px 0 #c0b2a2;\n            transition: 0.06s linear;\n            cursor: pointer;\n            min-width: 80px;\n        }\n        .option-btn:active {\n            transform: translateY(3px);\n            box-shadow: 0 0px 0 #b2a18b;\n        }\n        .option-btn.selected-correct {\n            background: #b8d9c0;\n            border-color: #3a8a5a;\n            box-shadow: 0 3px 0 #3a8a5a;\n        }\n        .option-btn.selected-wrong {\n            background: #f5d0d0;\n            border-color: #c0392b;\n            box-shadow: 0 3px 0 #c0392b;\n        }\n        .option-btn:disabled {\n            opacity: 0.6;\n            cursor: not-allowed;\n            transform: none;\n            box-shadow: 0 2px 0 #c0b2a2;\n        }\n        .sentence-box {\n            background: #e8edf4;\n            border-radius: 24px;\n            padding: 14px 18px;\n            margin: 8px 0 12px;\n            text-align: center;\n            font-size: 17px;\n            color: #1a2a3a;\n            line-height: 1.6;\n            min-height: 50px;\n        }\n        .sentence-box .en { font-weight: 600; color: #1a3a5a; }\n        .sentence-box .zh { color: #3a5a7a; font-size: 15px; }\n        .component-grid {\n            display: flex;\n            flex-wrap: wrap;\n            justify-content: center;\n            gap: 12px 16px;\n            margin-bottom: 16px;\n            min-height: 60px;\n        }\n        .component-btn {\n            background: white;\n            border: 2px solid #d0c4b6;\n            border-radius: 60px;\n            font-size: 32px;\n            padding: 4px 20px;\n            line-height: 1.4;\n            font-weight: 400;\n            color: #1e2b36;\n            box-shadow: 0 3px 0 #c0b2a2;\n            transition: 0.06s linear;\n            cursor: pointer;\n            font-family: 'Georgia', serif;\n            min-width: 50px;\n            user-select: none;\n        }\n        .component-btn:active {\n            transform: translateY(3px);\n            box-shadow: 0 0px 0 #b2a18b;\n        }\n        .component-btn.selected {\n            background: #d9e3e8;\n            border-color: #6b7b8c;\n            box-shadow: 0 3px 0 #6b7b8c;\n        }\n        .component-btn.correct-highlight {\n            background: #b8d9c0;\n            border-color: #3a8a5a;\n            box-shadow: 0 3px 0 #3a8a5a;\n        }\n        .component-btn:disabled {\n            opacity: 0.5;\n            cursor: not-allowed;\n            transform: none;\n            box-shadow: 0 2px 0 #c0b2a2;\n        }\n        .component-btn.color-0 { border-color: #e74c3c; color: #e74c3c; }\n        .component-btn.color-1 { border-color: #2980b9; color: #2980b9; }\n        .component-btn.color-2 { border-color: #27ae60; color: #27ae60; }\n        .component-btn.color-3 { border-color: #8e44ad; color: #8e44ad; }\n        .component-btn.color-4 { border-color: #d35400; color: #d35400; }\n        .component-btn.color-5 { border-color: #1abc9c; color: #1abc9c; }\n        .component-btn.color-6 { border-color: #c0392b; color: #c0392b; }\n        .component-btn.color-7 { border-color: #2c3e50; color: #2c3e50; }\n        .component-btn.color-8 { border-color: #16a085; color: #16a085; }\n        .component-btn.color-9 { border-color: #d4ac0d; color: #d4ac0d; }\n        .component-btn.selected {\n            background: #f0f0f0;\n            border-color: #6b7b8c;\n            color: #1e2b36;\n            box-shadow: 0 3px 0 #6b7b8c;\n        }\n        .component-btn.correct-highlight {\n            background: #b8d9c0;\n            border-color: #3a8a5a;\n            color: #1a5a3a;\n            box-shadow: 0 3px 0 #3a8a5a;\n        }\n        .action-bar {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-top: 8px;\n            gap: 12px;\n            flex-wrap: wrap;\n        }\n        .message-box {\n            font-size: 17px;\n            padding: 10px 18px;\n            border-radius: 50px;\n            background: #eef3f7;\n            flex: 2;\n            min-width: 140px;\n            color: #1e3a4b;\n            font-weight: 500;\n            border-left: 4px solid #b2a18b;\n        }\n        .btn-group {\n            display: flex;\n            gap: 8px;\n            flex-wrap: wrap;\n        }\n        .btn-icon {\n            background: #f0ebe4;\n            border: none;\n            border-radius: 60px;\n            padding: 8px 18px;\n            font-size: 15px;\n            font-weight: 500;\n            color: #1f2e3c;\n            box-shadow: 0 2px 0 #cdc0b2;\n            cursor: pointer;\n            transition: 0.06s linear;\n            display: inline-flex;\n            align-items: center;\n            gap: 4px;\n        }\n        .btn-icon:active {\n            transform: translateY(2px);\n            box-shadow: 0 0px 0 #b2a18b;\n        }\n        .continue-btn {\n            background: #2d8f5a;\n            color: white;\n            border: none;\n            border-radius: 60px;\n            padding: 10px 32px;\n            font-size: 18px;\n            font-weight: 600;\n            cursor: pointer;\n            box-shadow: 0 4px 0 #1a5a3a;\n            transition: 0.06s linear;\n            margin-top: 6px;\n        }\n        .continue-btn:active {\n            transform: translateY(4px);\n            box-shadow: 0 0px 0 #1a5a3a;\n        }\n        .continue-btn.hidden {\n            display: none;\n        }\n        .progress-bar {\n            background: #ecf0f1;\n            border-radius: 30px;\n            height: 10px;\n            margin: 6px 0 10px;\n            overflow: hidden;\n            position: relative;\n        }\n        .progress-bar .fill {\n            height: 100%;\n            background: #2d8f5a;\n            border-radius: 30px;\n            transition: width 0.3s ease;\n            width: 0%;\n        }\n        .progress-label {\n            font-size: 15px;\n            color: #2d3e50;\n            font-weight: 500;\n            text-align: center;\n            margin-bottom: 4px;\n        }\n        .footer-stats {\n            display: flex;\n            justify-content: space-between;\n            font-size: 14px;\n            color: #5d6f7e;\n            margin-top: 16px;\n            border-top: 1px solid #e5ddd4;\n            padding-top: 14px;\n            flex-wrap: wrap;\n            gap: 8px;\n        }\n        .error-list {\n            background: #faf6f2;\n            border-radius: 28px;\n            padding: 12px 16px;\n            margin-top: 12px;\n            max-height: 110px;\n            overflow-y: auto;\n            font-size: 15px;\n            color: #1f2e3c;\n            border: 1px solid #e3d9cf;\n        }\n        .error-list span {\n            display: inline-block;\n            background: #eddcd2;\n            padding: 0 14px;\n            border-radius: 40px;\n            margin: 4px 6px 4px 0;\n            font-weight: 500;\n        }\n        .rank-section {\n            margin-top: 16px;\n            border-top: 2px solid #eae3da;\n            padding-top: 14px;\n        }\n        .rank-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            cursor: pointer;\n            user-select: none;\n        }\n        .rank-header h3 {\n            font-size: 16px;\n            color: #2d3e50;\n        }\n        .rank-header .toggle-btn {\n            background: none;\n            border: none;\n            font-size: 20px;\n            cursor: pointer;\n            color: #6b7b8c;\n            padding: 0 8px;\n        }\n        .rank-list {\n            max-height: 200px;\n            overflow-y: auto;\n            margin-top: 8px;\n            transition: max-height 0.3s ease;\n        }\n        .rank-list.collapsed {\n            max-height: 0;\n            overflow: hidden;\n            margin-top: 0;\n        }\n        .rank-item {\n            display: flex;\n            justify-content: space-between;\n            padding: 6px 14px;\n            border-radius: 30px;\n            background: #f8f5f0;\n            margin-bottom: 4px;\n            font-size: 14px;\n            font-weight: 500;\n        }\n        .rank-item .rank-num {\n            color: #6b7b8c;\n            width: 30px;\n        }\n        .rank-item .rank-name {\n            flex: 1;\n            color: #1e2b36;\n        }\n        .rank-item .rank-score {\n            color: #2d8f5a;\n            font-weight: 700;\n        }\n        .rank-item.me {\n            background: #d9e3e8;\n            border: 1px solid #6b7b8c;\n        }\n        .rank-empty {\n            color: #6b7b8c;\n            text-align: center;\n            padding: 12px 0;\n            font-size: 14px;\n        }\n        .hidden {\n            display: none !important;\n        }\n        @media (max-width: 550px) {\n            .app { padding: 16px; }\n            .word-display { font-size: 36px; padding: 14px 6px 6px; }\n            .phonetic-display { font-size: 18px; }\n            .component-btn { font-size: 26px; padding: 2px 14px; min-width: 40px; }\n            .option-btn { font-size: 16px; padding: 8px 16px; }\n            .user-section { flex-direction: column; align-items: stretch; }\n            .user-section .user-badge { text-align: center; }\n        }\n    <\/style>\n\n\n<div class=\"app\" id=\"app\">\n    <h1>\ud83d\udcda \u5355\u8bcd\u52a9\u8bb0 <small>\u5916\u7814\u4e09\u8d77\u56db\u4e0b\u00b7\u5c71\u4e1c\u4e13\u7528<\/small><\/h1>\n\n    <div class=\"user-section\">\n        <label for=\"userNameInput\">\ud83d\udc64 \u59d3\u540d<\/label>\n        <input type=\"text\" id=\"userNameInput\" placeholder=\"\u8bf7\u8f93\u5165\u60a8\u7684\u540d\u5b57\" maxlength=\"12\" value=\"Leo\">\n        <span class=\"user-badge\" id=\"userBadge\">\ud83d\udcda \u5df2\u901a\u5173: 0<\/span>\n    <\/div>\n\n    <div class=\"mode-tabs\">\n        <button class=\"mode-tab active\" data-mode=\"choice\" id=\"modeChoice\">\ud83d\udcdd \u9009\u62e9\u91ca\u4e49<\/button>\n        <button class=\"mode-tab\" data-mode=\"spell\" id=\"modeSpell\">\ud83d\udd24 \u62fc\u5199\u5355\u8bcd<\/button>\n    <\/div>\n\n    <div class=\"filter-panel\">\n        <select id=\"gradeSelect\" aria-label=\"\u5e74\u7ea7\">\n            <option value=\"4\">\u56db\u5e74\u7ea7<\/option>\n        <\/select>\n        <select id=\"termSelect\" aria-label=\"\u5b66\u671f\">\n            <option value=\"2\">\u4e0b\u518c<\/option>\n        <\/select>\n        <select id=\"unitSelect\" aria-label=\"\u5355\u5143\">\n            <option value=\"all\">\ud83d\udcda \u5168\u90e8\u5355\u5143<\/option>\n            <option value=\"1\">Unit 1<\/option>\n            <option value=\"2\">Unit 2<\/option>\n            <option value=\"3\">Unit 3<\/option>\n            <option value=\"4\">Unit 4<\/option>\n            <option value=\"5\">Unit 5<\/option>\n            <option value=\"6\">Unit 6<\/option>\n        <\/select>\n        <button class=\"btn-primary\" id=\"loadBtn\">\ud83c\udfaf \u9501\u5b9a\u8bcd\u5e93<\/button>\n        <button class=\"btn-outline\" id=\"errorModeBtn\" style=\"flex:0.6;\">\ud83d\udcd5 \u9519\u8bcd\u5e93<\/button>\n    <\/div>\n\n    <div class=\"game-area\">\n        <div class=\"progress-label\" id=\"progressLabel\">\ud83d\udcca \u8fdb\u5ea6\uff1a0 \/ 0<\/div>\n        <div class=\"progress-bar\"><div class=\"fill\" id=\"progressFill\"><\/div><\/div>\n\n        <!-- \u9009\u62e9\u91ca\u4e49\u6a21\u5f0f -->\n        <div id=\"choiceMode\">\n            <div class=\"word-display\" id=\"choiceWord\">doctor<\/div>\n            <div class=\"phonetic-display\" id=\"choicePhonetic\">\/\u02c8d\u0252kt\u0259\/<\/div>\n            <div class=\"options-grid\" id=\"optionsGrid\"><\/div>\n            <div class=\"sentence-box\" id=\"sentenceBox\">\u2728 \u9009\u62e9\u6b63\u786e\u91ca\u4e49\u540e\u663e\u793a\u4f8b\u53e5<\/div>\n        <\/div>\n\n        <!-- \u62fc\u5199\u6a21\u5f0f -->\n        <div id=\"spellMode\" class=\"hidden\">\n            <div class=\"word-display\" id=\"spellWord\">doctor<\/div>\n            <div class=\"phonetic-display\" id=\"spellPhonetic\">\/\u02c8d\u0252kt\u0259\/<\/div>\n            <div class=\"component-grid\" id=\"spellComponents\"><\/div>\n            <div class=\"sentence-box\" id=\"spellSentence\">\u2728 \u62fc\u5bf9\u540e\u663e\u793a\u4f8b\u53e5<\/div>\n        <\/div>\n\n        <div style=\"display:flex; justify-content:center;\">\n            <button class=\"continue-btn hidden\" id=\"continueBtn\">\ud83d\udc49 \u7ee7\u7eed\u4e0b\u4e00\u9898<\/button>\n        <\/div>\n\n        <div class=\"action-bar\">\n            <div class=\"message-box\" id=\"messageBox\">\u70b9\u51fb\u9009\u9879\u5f00\u59cb<\/div>\n            <div class=\"btn-group\">\n                <button class=\"btn-icon\" id=\"resetBtn\">\ud83d\udd04 \u91cd\u7f6e<\/button>\n                <button class=\"btn-icon\" id=\"nextBtn\">\u23e9 \u4e0b\u4e00\u9898<\/button>\n            <\/div>\n        <\/div>\n\n        <div class=\"error-list\" id=\"errorList\">\n            <span style=\"background:transparent; color:#6b7b8c;\">\ud83d\udccc \u9519\u8bcd\u5e93\u7a7a<\/span>\n        <\/div>\n        <div class=\"footer-stats\">\n            <span>\u2705 \u6b63\u786e: <strong id=\"correctCount\">0<\/strong><\/span>\n            <span>\u274c \u9519\u8bcd: <strong id=\"errorCount\">0<\/strong><\/span>\n            <span>\ud83d\udcdd \u5f53\u524d: <span id=\"currentLabel\">&#8211;<\/span><\/span>\n        <\/div>\n    <\/div>\n\n    <div class=\"rank-section\">\n        <div class=\"rank-header\" id=\"rankToggle\">\n            <h3>\ud83c\udfc6 \u6392\u884c\u699c<\/h3>\n            <button class=\"toggle-btn\" id=\"rankToggleBtn\">\u25bc<\/button>\n        <\/div>\n        <div class=\"rank-list\" id=\"rankList\">\n            <div class=\"rank-empty\">\u6682\u65e0\u8bb0\u5f55\uff0c\u5feb\u6765\u6311\u6218\u5427\uff01<\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function() {\n    \"use strict\";\n\n    \/\/ ========== \u5b8c\u6574\u5355\u8bcd\u5e93 ==========\n    var FULL_WORD_BANK = [\n        \/\/ ====== Unit 1 ======\n        { word: 'doctor', phonetic: '\/\u02c8d\u0252kt\u0259\/', meaning: '\u533b\u751f\uff0c\u5927\u592b', components: ['doc', 'tor'], sentence: 'My mother is a doctor.', sentenceZh: '\u6211\u5988\u5988\u662f\u4e00\u540d\u533b\u751f\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'fireman', phonetic: '\/\u02c8fa\u026a\u0259m\u0259n\/', meaning: '\u6d88\u9632\u961f\u5458', components: ['fire', 'man'], sentence: 'The fireman is brave.', sentenceZh: '\u6d88\u9632\u961f\u5458\u5f88\u52c7\u6562\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'farmer', phonetic: '\/\u02c8f\u0251\u02d0m\u0259\/', meaning: '\u519c\u6c11\uff1b\u519c\u573a\u4e3b\uff1b\u517b\u6b96\u573a\u4e3b', components: ['farm', 'er'], sentence: 'My grandpa is a farmer.', sentenceZh: '\u6211\u7237\u7237\u662f\u519c\u6c11\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'cook', phonetic: '\/k\u028ak\/', meaning: '\u53a8\u5e08\uff0c\u708a\u4e8b\u5458', components: ['c', 'oo', 'k'], sentence: 'The cook is in the kitchen.', sentenceZh: '\u53a8\u5e08\u5728\u53a8\u623f\u91cc\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'police', phonetic: '\/p\u0259\u02c8li\u02d0s\/', meaning: '\u8b66\u5bdf', components: ['po', 'lice'], sentence: 'The police are on duty.', sentenceZh: '\u8b66\u5bdf\u5728\u503c\u73ed\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'police officer', phonetic: '\/p\u0259\u02c8li\u02d0s \u02c8\u0252f\u026as\u0259\/', meaning: '\u8b66\u5bdf\uff0c\u8b66\u5b98', components: ['police', 'officer'], sentence: 'My uncle is a police officer.', sentenceZh: '\u6211\u53d4\u53d4\u662f\u4e00\u540d\u8b66\u5b98\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'station', phonetic: '\/\u02c8ste\u026a\u0283n\/', meaning: '\u6240\uff1b\u7ad9\uff1b\u53f0\uff1b\u5c40', components: ['sta', 'tion'], sentence: 'The bus station is over there.', sentenceZh: '\u516c\u5171\u6c7d\u8f66\u7ad9\u5728\u90a3\u8fb9\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'police station', phonetic: '\/p\u0259\u02c8li\u02d0s \u02c8ste\u026a\u0283n\/', meaning: '\u8b66\u5bdf\uff08\u5206\uff09\u5c40\uff0c\u6d3e\u51fa\u6240', components: ['police', 'station'], sentence: 'He works at the police station.', sentenceZh: '\u4ed6\u5728\u8b66\u5bdf\u5c40\u5de5\u4f5c\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'often', phonetic: '\/\u02c8\u0252fn\/', meaning: '\u7ecf\u5e38\uff0c\u65f6\u5e38\uff0c\u591a\u6b21', components: ['of', 'ten'], sentence: 'I often go to school by bus.', sentenceZh: '\u6211\u7ecf\u5e38\u5750\u516c\u5171\u6c7d\u8f66\u53bb\u5b66\u6821\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'field', phonetic: '\/fi\u02d0ld\/', meaning: '\u7530\u5730\uff0c\u7530\u91ce', components: ['fie', 'ld'], sentence: 'The farmer works in the field.', sentenceZh: '\u519c\u6c11\u5728\u7530\u91cc\u5e72\u6d3b\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'painter', phonetic: '\/\u02c8pe\u026ant\u0259\/', meaning: '\u753b\u5bb6', components: ['pain', 'ter'], sentence: 'He is a famous painter.', sentenceZh: '\u4ed6\u662f\u4e00\u4f4d\u8457\u540d\u7684\u753b\u5bb6\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'use', phonetic: '\/ju\u02d0z\/', meaning: '\u7528\uff0c\u4f7f\u7528', components: ['us', 'e'], sentence: 'I use a pen to write.', sentenceZh: '\u6211\u7528\u94a2\u7b14\u5199\u5b57\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'brush', phonetic: '\/br\u028c\u0283\/', meaning: '\u5237\u5b50\uff1b\u6bdb\u5237', components: ['br', 'u', 'sh'], sentence: 'This is a brush.', sentenceZh: '\u8fd9\u662f\u4e00\u628a\u5237\u5b50\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'scientist', phonetic: '\/\u02c8sa\u026a\u0259nt\u026ast\/', meaning: '\u79d1\u5b66\u5bb6', components: ['sci', 'en', 'tist'], sentence: 'My brother wants to be a scientist.', sentenceZh: '\u6211\u54e5\u54e5\u60f3\u6210\u4e3a\u4e00\u540d\u79d1\u5b66\u5bb6\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'writer', phonetic: '\/\u02c8ra\u026at\u0259\/', meaning: '\u4f5c\u5bb6\uff1b\u4f5c\u8005', components: ['write', 'r'], sentence: 'She is a famous writer.', sentenceZh: '\u5979\u662f\u4e00\u4f4d\u8457\u540d\u7684\u4f5c\u5bb6\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'worker', phonetic: '\/\u02c8w\u025c\u02d0k\u0259\/', meaning: '\u5de5\u4eba', components: ['work', 'er'], sentence: 'My father is a worker.', sentenceZh: '\u6211\u7238\u7238\u662f\u4e00\u540d\u5de5\u4eba\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'aunt', phonetic: '\/\u0251\u02d0nt\/', meaning: '\u59d1\u6bcd\uff1b\u59e8\u6bcd', components: ['au', 'nt'], sentence: 'My aunt is a nurse.', sentenceZh: '\u6211\u59d1\u5988\u662f\u4e00\u540d\u62a4\u58eb\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'night', phonetic: '\/na\u026at\/', meaning: '\u591c\u665a\uff0c\u591c\u95f4', components: ['n', 'igh', 't'], sentence: 'I like the night sky.', sentenceZh: '\u6211\u559c\u6b22\u591c\u7a7a\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'owl', phonetic: '\/a\u028al\/', meaning: '\u732b\u5934\u9e70', components: ['ow', 'l'], sentence: 'The owl is sleeping during the day.', sentenceZh: '\u732b\u5934\u9e70\u767d\u5929\u7761\u89c9\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'night owl', phonetic: '\/na\u026at a\u028al\/', meaning: '\u591c\u732b\u5b50\uff0c\u559c\u6b22\u71ac\u591c\u7684\u4eba', components: ['night', 'owl'], sentence: 'My father is a night owl.', sentenceZh: '\u6211\u7238\u7238\u662f\u4e2a\u591c\u732b\u5b50\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'driver', phonetic: '\/\u02c8dra\u026av\u0259\/', meaning: '\u53f8\u673a\uff0c\u9a7e\u9a76\u5458', components: ['drive', 'r'], sentence: 'He is a good driver.', sentenceZh: '\u4ed6\u662f\u4e00\u4f4d\u597d\u53f8\u673a\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'taxi', phonetic: '\/\u02c8t\u00e6ksi\/', meaning: '\u51fa\u79df\u8f66\uff0c\u8ba1\u7a0b\u8f66', components: ['tax', 'i'], sentence: 'I take a taxi to the airport.', sentenceZh: '\u6211\u5750\u51fa\u79df\u8f66\u53bb\u673a\u573a\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'safe', phonetic: '\/se\u026af\/', meaning: '\u5b89\u5168\u7684\uff0c\u6ca1\u6709\u5371\u9669\u7684', components: ['s', 'a', 'fe'], sentence: 'This place is safe.', sentenceZh: '\u8fd9\u4e2a\u5730\u65b9\u5f88\u5b89\u5168\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'nurse', phonetic: '\/n\u025c\u02d0s\/', meaning: '\u62a4\u58eb', components: ['n', 'ur', 'se'], sentence: 'My sister is a nurse.', sentenceZh: '\u6211\u59d0\u59d0\u662f\u4e00\u540d\u62a4\u58eb\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'light', phonetic: '\/la\u026at\/', meaning: '\u7167\u4eae', components: ['l', 'igh', 't'], sentence: 'The lamp lights the room.', sentenceZh: '\u53f0\u706f\u7167\u4eae\u4e86\u623f\u95f4\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'uncle', phonetic: '\/\u02c8\u028c\u014bkl\/', meaning: '\u53d4\u53d4\uff0c\u4f2f\u4f2f', components: ['un', 'cle'], sentence: 'My uncle is a doctor.', sentenceZh: '\u6211\u53d4\u53d4\u662f\u4e00\u540d\u533b\u751f\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'bake', phonetic: '\/be\u026ak\/', meaning: '\u70d8\uff0c\u70e4\uff0c\u7119', components: ['b', 'a', 'ke'], sentence: 'I like to bake cakes.', sentenceZh: '\u6211\u559c\u6b22\u70e4\u86cb\u7cd5\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'bee', phonetic: '\/bi\u02d0\/', meaning: '\u871c\u8702', components: ['b', 'ee'], sentence: 'The bee is buzzing.', sentenceZh: '\u871c\u8702\u5728\u55e1\u55e1\u53eb\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'same', phonetic: '\/se\u026am\/', meaning: '\u76f8\u540c\u7684\uff0c\u5b8c\u5168\u76f8\u540c\u7684\uff0c\u4e00\u6a21\u4e00\u6837\u7684', components: ['s', 'a', 'me'], sentence: 'We are in the same class.', sentenceZh: '\u6211\u4eec\u5728\u540c\u4e00\u4e2a\u73ed\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'sound', phonetic: '\/sa\u028and\/', meaning: '\u58f0\uff0c\u58f0\u97f3', components: ['s', 'ou', 'nd'], sentence: 'I like the sound of music.', sentenceZh: '\u6211\u559c\u6b22\u97f3\u4e50\u7684\u58f0\u97f3\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'postman', phonetic: '\/\u02c8p\u0259\u028astm\u0259n\/', meaning: '\u90ae\u9012\u5458', components: ['post', 'man'], sentence: 'The postman brings letters.', sentenceZh: '\u90ae\u9012\u5458\u9001\u6765\u4fe1\u4ef6\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'life', phonetic: '\/la\u026af\/', meaning: '\u751f\u6d3b', components: ['l', 'i', 'fe'], sentence: 'Life is beautiful.', sentenceZh: '\u751f\u6d3b\u662f\u7f8e\u597d\u7684\u3002', unit: 1, grade: 4, term: 2 },\n        { word: 'mountain', phonetic: '\/\u02c8ma\u028ant\u0259n\/', meaning: '\u9ad8\u5c71', components: ['moun', 'tain'], sentence: 'The mountain is very high.', sentenceZh: '\u8fd9\u5ea7\u5c71\u975e\u5e38\u9ad8\u3002', unit: 1, grade: 4, term: 2 },\n\n        \/\/ ====== Unit 2 ======\n        { word: 'worried', phonetic: '\/\u02c8w\u028crid\/', meaning: '\u62c5\u5fc3\u7684\uff0c\u7126\u8651\u7684', components: ['worr', 'ied'], sentence: 'She looks worried.', sentenceZh: '\u5979\u770b\u8d77\u6765\u5f88\u62c5\u5fc3\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'laugh', phonetic: '\/l\u0251\u02d0f\/', meaning: '\u53d1\u51fa\u7b11\u58f0\uff0c\uff08\u5927\uff09\u7b11', components: ['l', 'au', 'gh'], sentence: 'He makes me laugh.', sentenceZh: '\u4ed6\u8ba9\u6211\u53d1\u7b11\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'sad', phonetic: '\/s\u00e6d\/', meaning: '\u4e0d\u6109\u5feb\u7684\uff0c\u4f24\u5fc3\u7684\uff0c\u96be\u8fc7\u7684', components: ['s', 'a', 'd'], sentence: 'She feels sad.', sentenceZh: '\u5979\u611f\u5230\u96be\u8fc7\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'scared', phonetic: '\/ske\u0259d\/', meaning: '\u5bb3\u6015\u7684\uff0c\u6050\u60e7\u7684\uff1b\u7d27\u5f20\u7684', components: ['scar', 'ed'], sentence: 'I am scared of dogs.', sentenceZh: '\u6211\u5bb3\u6015\u72d7\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'angry', phonetic: '\/\u02c8\u00e6\u014b\u0261ri\/', meaning: '\u53d1\u6012\u7684\uff0c\u751f\u6c14\u7684\uff0c\u6c14\u6124\u7684', components: ['an', 'gry'], sentence: 'My father is angry.', sentenceZh: '\u6211\u7238\u7238\u5f88\u751f\u6c14\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'excited', phonetic: '\/\u026ak\u02c8sa\u026at\u026ad\/', meaning: '\u5174\u594b\u7684\uff0c\u6fc0\u52a8\u7684', components: ['ex', 'cit', 'ed'], sentence: 'I am excited about the trip.', sentenceZh: '\u6211\u5bf9\u8fd9\u6b21\u65c5\u884c\u611f\u5230\u5174\u594b\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'opera', phonetic: '\/\u02c8\u0252pr\u0259\/', meaning: '\u6b4c\u5267', components: ['op', 'er', 'a'], sentence: 'My mother likes opera.', sentenceZh: '\u6211\u5988\u5988\u559c\u6b22\u6b4c\u5267\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'next', phonetic: '\/nekst\/', meaning: '\uff08\u65f6\u95f4\uff09\u7d27\u63a5\u7740\u7684\uff1b\u4e0b\u6b21\u7684', components: ['ne', 'xt'], sentence: 'Who is next?', sentenceZh: '\u4e0b\u4e00\u4f4d\u662f\u8c01\uff1f', unit: 2, grade: 4, term: 2 },\n        { word: 'cough', phonetic: '\/k\u0252f\/', meaning: '\u54b3\u55fd\uff0c\u54b3', components: ['c', 'ou', 'gh'], sentence: 'She has a bad cough.', sentenceZh: '\u5979\u54b3\u55fd\u5f97\u5f88\u5389\u5bb3\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'better', phonetic: '\/\u02c8bet\u0259\/', meaning: '\uff08\u5065\u5eb7\u72b6\u51b5\uff09\u597d\u8f6c\u7684\uff1b\uff08\u75bc\u75db\u3001\u4f24\u52bf\u7b49\uff09\u51cf\u8f7b\u7684', components: ['bet', 'ter'], sentence: 'I feel better now.', sentenceZh: '\u6211\u73b0\u5728\u611f\u89c9\u597d\u591a\u4e86\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'gift', phonetic: '\/\u0261\u026aft\/', meaning: '\u793c\u7269', components: ['g', 'i', 'ft'], sentence: 'I have a gift for you.', sentenceZh: '\u6211\u6709\u4e00\u4efd\u793c\u7269\u7ed9\u4f60\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'model', phonetic: '\/\u02c8m\u0252dl\/', meaning: '\uff08\u5c24\u6307\u53ef\u62fc\u88c5\u7684\uff09\u6a21\u578b', components: ['mod', 'el'], sentence: 'He makes model planes.', sentenceZh: '\u4ed6\u5236\u4f5c\u98de\u673a\u6a21\u578b\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'shout', phonetic: '\/\u0283a\u028at\/', meaning: '\u5927\u58f0\u8bf4\uff0c\u558a\u53eb\uff0c\u547c\u558a', components: ['sh', 'ou', 't'], sentence: 'Don\\'t shout in the library.', sentenceZh: '\u4e0d\u8981\u5728\u56fe\u4e66\u9986\u5927\u58f0\u558a\u53eb\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'should', phonetic: '\/\u0283\u028ad\/', meaning: '\u5e94\u5f53\uff0c\u5e94\u8be5', components: ['sh', 'ou', 'ld'], sentence: 'You should study hard.', sentenceZh: '\u4f60\u5e94\u8be5\u52aa\u529b\u5b66\u4e60\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'feeling', phonetic: '\/\u02c8fi\u02d0l\u026a\u014b\/', meaning: '\u611f\u89c9\uff0c\u611f\u89e6', components: ['feel', 'ing'], sentence: 'I have a good feeling.', sentenceZh: '\u6211\u6709\u4e00\u79cd\u5f88\u597d\u7684\u611f\u89c9\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'huge', phonetic: '\/hju\u02d0d\u0292\/', meaning: '\u5de8\u5927\u7684', components: ['h', 'u', 'ge'], sentence: 'There is a huge elephant.', sentenceZh: '\u6709\u4e00\u5934\u5de8\u5927\u7684\u5927\u8c61\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'street', phonetic: '\/stri\u02d0t\/', meaning: '\u5927\u8857\uff0c\u8857\u9053', components: ['str', 'ee', 't'], sentence: 'The street is busy.', sentenceZh: '\u8fd9\u6761\u8857\u9053\u5f88\u7e41\u5fd9\u3002', unit: 2, grade: 4, term: 2 },\n        { word: 'hit', phonetic: '\/h\u026at\/', meaning: '\u649e\u51fb\uff0c\u78b0\u649e', components: ['h', 'i', 't'], sentence: 'The ball hit the window.', sentenceZh: '\u7403\u649e\u5230\u4e86\u7a97\u6237\u3002', unit: 2, grade: 4, term: 2 },\n\n        \/\/ ====== Unit 3 ======\n        { word: 'talent', phonetic: '\/\u02c8t\u00e6l\u0259nt\/', meaning: '\u5929\u8d44\uff0c\u5929\u8d4b\uff0c\u624d\u80fd', components: ['tal', 'ent'], sentence: 'She has a talent for music.', sentenceZh: '\u5979\u6709\u97f3\u4e50\u5929\u8d4b\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'act', phonetic: '\/\u00e6kt\/', meaning: '\u6f14\u51fa\uff1b\u626e\u6f14', components: ['a', 'ct'], sentence: 'I want to act in the play.', sentenceZh: '\u6211\u60f3\u5728\u5267\u4e2d\u6f14\u51fa\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'magic', phonetic: '\/\u02c8m\u00e6d\u0292\u026ak\/', meaning: '\u9b54\u672f\uff0c\u620f\u6cd5', components: ['mag', 'ic'], sentence: 'He can do magic.', sentenceZh: '\u4ed6\u4f1a\u53d8\u9b54\u672f\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'shine', phonetic: '\/\u0283a\u026an\/', meaning: '\u8868\u73b0\u7a81\u51fa\uff0c\u51fa\u4f17', components: ['sh', 'i', 'ne'], sentence: 'She shines in the competition.', sentenceZh: '\u5979\u5728\u6bd4\u8d5b\u4e2d\u8868\u73b0\u7a81\u51fa\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'puzzle', phonetic: '\/\u02c8p\u028czl\/', meaning: '\u62fc\u56fe\u6e38\u620f', components: ['pu', 'zzle'], sentence: 'I like to do puzzles.', sentenceZh: '\u6211\u559c\u6b22\u73a9\u62fc\u56fe\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'dancer', phonetic: '\/\u02c8d\u0251\u02d0ns\u0259\/', meaning: '\u821e\u8e48\u6f14\u5458', components: ['dance', 'r'], sentence: 'She is a dancer.', sentenceZh: '\u5979\u662f\u4e00\u540d\u821e\u8e48\u6f14\u5458\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'win', phonetic: '\/w\u026an\/', meaning: '\u83b7\u80dc\uff0c\u8d62', components: ['w', 'i', 'n'], sentence: 'I hope to win.', sentenceZh: '\u6211\u5e0c\u671b\u83b7\u80dc\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'just', phonetic: '\/d\u0292\u028cst\/', meaning: '\u5c31\uff0c\u53ea\u662f', components: ['j', 'u', 'st'], sentence: 'I\\'m just kidding.', sentenceZh: '\u6211\u53ea\u662f\u5728\u5f00\u73a9\u7b11\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'boy', phonetic: '\/b\u0254\u026a\/', meaning: '\u7537\u5b69\uff1b\u513f\u5b50', components: ['b', 'oy'], sentence: 'He is a boy.', sentenceZh: '\u4ed6\u662f\u4e00\u4e2a\u7537\u5b69\u3002', unit: 3, grade: 4, term: 2 },\n        { word: 'slowly', phonetic: '\/\u02c8sl\u0259\u028ali\/', meaning: '\u7f13\u6162\u5730\uff0c\u6162\u6162\u5730', components: ['slow', 'ly'], sentence: 'He walks slowly.', sentenceZh: '\u4ed6\u8d70\u5f97\u5f88\u6162\u3002', unit: 3, grade: 4, term: 2 },\n\n        \/\/ ====== Unit 4 ======\n        { word: 'seed', phonetic: '\/si\u02d0d\/', meaning: '\u79cd\u5b50\uff0c\u7c7d', components: ['s', 'ee', 'd'], sentence: 'Plants grow from seeds.', sentenceZh: '\u690d\u7269\u4ece\u79cd\u5b50\u751f\u957f\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'earth', phonetic: '\/\u025c\u02d0\u03b8\/', meaning: '\u6ce5\u571f\uff0c\u571f\u58e4', components: ['ear', 'th'], sentence: 'The earth is soft.', sentenceZh: '\u571f\u58e4\u5f88\u677e\u8f6f\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'root', phonetic: '\/ru\u02d0t\/', meaning: '\u6839', components: ['r', 'oo', 't'], sentence: 'The root of the tree is deep.', sentenceZh: '\u6811\u6839\u5f88\u6df1\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'stem', phonetic: '\/stem\/', meaning: '\uff08\u690d\u7269\u7684\uff09\u830e\uff0c\u6897\uff0c\u67c4', components: ['st', 'e', 'm'], sentence: 'The stem is green.', sentenceZh: '\u830e\u662f\u7eff\u8272\u7684\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'thin', phonetic: '\/\u03b8\u026an\/', meaning: '\u7ec6\u7684', components: ['th', 'i', 'n'], sentence: 'The stem is thin.', sentenceZh: '\u830e\u5f88\u7ec6\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'leaf', phonetic: '\/li\u02d0f\/', meaning: '\u53f6\uff0c\u53f6\u5b50', components: ['l', 'ea', 'f'], sentence: 'The leaves are green.', sentenceZh: '\u53f6\u5b50\u662f\u7eff\u8272\u7684\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'dig', phonetic: '\/d\u026a\u0261\/', meaning: '\u6316\uff0c\u6398', components: ['d', 'i', 'g'], sentence: 'I dig a hole.', sentenceZh: '\u6211\u6316\u4e86\u4e00\u4e2a\u5751\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'sunflower', phonetic: '\/\u02c8s\u028cnfla\u028a\u0259\/', meaning: '\u5411\u65e5\u8475', components: ['sun', 'flower'], sentence: 'The sunflower is beautiful.', sentenceZh: '\u5411\u65e5\u8475\u5f88\u6f02\u4eae\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'plant', phonetic: '\/pl\u0251\u02d0nt\/', meaning: '\u79cd\u690d\uff0c\u683d\u79cd\uff1b\u64ad\uff08\u79cd\uff09', components: ['pl', 'ant'], sentence: 'I plant a flower.', sentenceZh: '\u6211\u79cd\u4e86\u4e00\u6735\u82b1\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'dream', phonetic: '\/dri\u02d0m\/', meaning: '\u68a6\u60f3\uff0c\u613f\u671b\uff0c\u7406\u60f3', components: ['dr', 'ea', 'm'], sentence: 'I have a dream.', sentenceZh: '\u6211\u6709\u4e00\u4e2a\u68a6\u60f3\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'sleep', phonetic: '\/sli\u02d0p\/', meaning: '\u7761\uff0c\u7761\u89c9', components: ['sl', 'ee', 'p'], sentence: 'I need to sleep.', sentenceZh: '\u6211\u9700\u8981\u7761\u89c9\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'will', phonetic: '\/w\u026al\/', meaning: '\u5c06\uff0c\u4f1a\uff0c\u8981', components: ['w', 'i', 'll'], sentence: 'I will go to school.', sentenceZh: '\u6211\u5c06\u53bb\u5b66\u6821\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'true', phonetic: '\/tru\u02d0\/', meaning: '\u771f\u7684\uff0c\u771f\u5b9e\u7684', components: ['tr', 'ue'], sentence: 'Is that true?', sentenceZh: '\u90a3\u662f\u771f\u7684\u5417\uff1f', unit: 4, grade: 4, term: 2 },\n        { word: 'come true', phonetic: '\/k\u028cm tru\u02d0\/', meaning: '\uff08\u68a6\u60f3\uff09\u5b9e\u73b0\uff0c\u6210\u771f', components: ['come', 'true'], sentence: 'My dream will come true.', sentenceZh: '\u6211\u7684\u68a6\u60f3\u5c06\u4f1a\u5b9e\u73b0\u3002', unit: 4, grade: 4, term: 2 },\n        { word: 'paper', phonetic: '\/\u02c8pe\u026ap\u0259\/', meaning: '\u7eb8', components: ['pa', 'per'], sentence: 'I need paper.', sentenceZh: '\u6211\u9700\u8981\u7eb8\u3002', unit: 4, grade: 4, term: 2 },\n\n        \/\/ ====== Unit 5 ======\n        { word: 'drama', phonetic: '\/\u02c8dr\u0251\u02d0m\u0259\/', meaning: '\u620f\u5267', components: ['dra', 'ma'], sentence: 'I like drama.', sentenceZh: '\u6211\u559c\u6b22\u620f\u5267\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'trip', phonetic: '\/tr\u026ap\/', meaning: '\u65c5\u6e38\uff1b\u65c5\u884c\uff0c\u51fa\u884c', components: ['tr', 'i', 'p'], sentence: 'We have a trip to Beijing.', sentenceZh: '\u6211\u4eec\u53bb\u5317\u4eac\u65c5\u884c\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'fair', phonetic: '\/fe\u0259\/', meaning: '\u96c6\u5e02\uff1b\u4e49\u5356\u4f1a\uff1b\u6237\u5916\u6e38\u827a\u4f1a', components: ['f', 'ai', 'r'], sentence: 'We go to the school fair.', sentenceZh: '\u6211\u4eec\u53bb\u5b66\u6821\u4e49\u5356\u4f1a\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'festival', phonetic: '\/\u02c8fest\u026avl\/', meaning: '\u8282\uff0c\u8282\u5e86\uff0c\u6c47\u6f14', components: ['fest', 'iv', 'al'], sentence: 'We have a spring festival.', sentenceZh: '\u6211\u4eec\u6709\u6625\u8282\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'horn', phonetic: '\/h\u0254\u02d0n\/', meaning: '\u89d2', components: ['h', 'or', 'n'], sentence: 'The sheep has horns.', sentenceZh: '\u7f8a\u6709\u89d2\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'dot', phonetic: '\/d\u0252t\/', meaning: '\u70b9\uff0c\u5c0f\u5706\u70b9', components: ['d', 'o', 't'], sentence: 'There is a dot on the paper.', sentenceZh: '\u7eb8\u4e0a\u6709\u4e00\u4e2a\u70b9\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'raindrop', phonetic: '\/\u02c8re\u026andr\u0252p\/', meaning: '\u96e8\u70b9\uff0c\u96e8\u6ef4', components: ['rain', 'drop'], sentence: 'The raindrops fall.', sentenceZh: '\u96e8\u70b9\u843d\u4e0b\u6765\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'more', phonetic: '\/m\u0254\u02d0\/', meaning: '\u66f4\u591a\u7684', components: ['m', 'or', 'e'], sentence: 'I want more time.', sentenceZh: '\u6211\u60f3\u8981\u66f4\u591a\u7684\u65f6\u95f4\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'special', phonetic: '\/\u02c8spe\u0283l\/', meaning: '\u7279\u6b8a\u7684\uff0c\u7279\u522b\u7684', components: ['sp', 'ec', 'ial'], sentence: 'This is a special day.', sentenceZh: '\u8fd9\u662f\u7279\u6b8a\u7684\u4e00\u5929\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'keeper', phonetic: '\/\u02c8ki\u02d0p\u0259\/', meaning: '\u770b\u5b88\u4eba\uff0c\u4fdd\u7ba1\u4eba', components: ['keep', 'er'], sentence: 'The keeper takes care of the park.', sentenceZh: '\u7ba1\u7406\u5458\u7167\u770b\u516c\u56ed\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'hey', phonetic: '\/he\u026a\/', meaning: '\u563f\uff0c\u5582', components: ['he', 'y'], sentence: 'Hey, look at me!', sentenceZh: '\u563f\uff0c\u770b\u6211\uff01', unit: 5, grade: 4, term: 2 },\n        { word: 'lovely', phonetic: '\/\u02c8l\u028cvli\/', meaning: '\u7f8e\u597d\u7684\uff1b\u4ee4\u4eba\u6109\u5feb\u7684\uff1b\u53ef\u7231\u7684', components: ['love', 'ly'], sentence: 'She is a lovely girl.', sentenceZh: '\u5979\u662f\u4e00\u4e2a\u53ef\u7231\u7684\u5973\u5b69\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'student', phonetic: '\/\u02c8stju\u02d0dnt\/', meaning: '\u5b66\u751f', components: ['stu', 'dent'], sentence: 'I am a student.', sentenceZh: '\u6211\u662f\u4e00\u540d\u5b66\u751f\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'culture', phonetic: '\/\u02c8k\u028clt\u0283\u0259\/', meaning: '\u6587\u5316', components: ['cul', 'ture'], sentence: 'We learn about culture.', sentenceZh: '\u6211\u4eec\u5b66\u4e60\u6587\u5316\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'hour', phonetic: '\/\u02c8a\u028a\u0259\/', meaning: '\u5c0f\u65f6', components: ['h', 'our'], sentence: 'I wait for an hour.', sentenceZh: '\u6211\u7b49\u4e86\u4e00\u4e2a\u5c0f\u65f6\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'note', phonetic: '\/n\u0259\u028at\/', meaning: '\u7b14\u8bb0\uff0c\u8bb0\u5f55', components: ['n', 'o', 'te'], sentence: 'I write a note.', sentenceZh: '\u6211\u5199\u4e00\u4e2a\u7b14\u8bb0\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'vote', phonetic: '\/v\u0259\u028at\/', meaning: '\u9009\u7968', components: ['v', 'o', 'te'], sentence: 'I have a vote.', sentenceZh: '\u6211\u6709\u4e00\u5f20\u9009\u7968\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'design', phonetic: '\/d\u026a\u02c8za\u026an\/', meaning: '\u8bbe\u8ba1', components: ['de', 'sign'], sentence: 'I design a poster.', sentenceZh: '\u6211\u8bbe\u8ba1\u4e86\u4e00\u5f20\u6d77\u62a5\u3002', unit: 5, grade: 4, term: 2 },\n        { word: 'hometown', phonetic: '\/\u02c8h\u0259\u028amta\u028an\/', meaning: '\u5bb6\u4e61\uff0c\u6545\u4e61', components: ['home', 'town'], sentence: 'I love my hometown.', sentenceZh: '\u6211\u7231\u6211\u7684\u5bb6\u4e61\u3002', unit: 5, grade: 4, term: 2 },\n\n        \/\/ ====== Unit 6 ======\n        { word: 'T-shirt', phonetic: '\/\u02c8ti\u02d0 \u0283\u025c\u02d0t\/', meaning: 'T\u6064\uff08\u886b\uff09', components: ['T', 'shirt'], sentence: 'I wear a T-shirt.', sentenceZh: '\u6211\u7a7f\u4e00\u4ef6T\u6064\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'skirt', phonetic: '\/sk\u025c\u02d0t\/', meaning: '\u534a\u8eab\u88d9\uff0c\u88d9\u5b50', components: ['sk', 'ir', 't'], sentence: 'She wears a skirt.', sentenceZh: '\u5979\u7a7f\u4e00\u6761\u88d9\u5b50\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'shorts', phonetic: '\/\u0283\u0254\u02d0ts\/', meaning: '\u77ed\u88e4', components: ['sh', 'or', 'ts'], sentence: 'I wear shorts.', sentenceZh: '\u6211\u7a7f\u77ed\u88e4\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'shirt', phonetic: '\/\u0283\u025c\u02d0t\/', meaning: '\u886c\u886b', components: ['sh', 'ir', 't'], sentence: 'He wears a shirt.', sentenceZh: '\u4ed6\u7a7f\u4e00\u4ef6\u886c\u886b\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'trousers', phonetic: '\/\u02c8tra\u028az\u0259z\/', meaning: '\u88e4\u5b50', components: ['trou', 'sers'], sentence: 'These are my trousers.', sentenceZh: '\u8fd9\u662f\u6211\u7684\u88e4\u5b50\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'scarf', phonetic: '\/sk\u0251\u02d0f\/', meaning: '\u56f4\u5dfe', components: ['sc', 'ar', 'f'], sentence: 'I wear a scarf.', sentenceZh: '\u6211\u6234\u4e00\u6761\u56f4\u5dfe\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'sweater', phonetic: '\/\u02c8swet\u0259\/', meaning: '\u6bdb\u7ebf\u8863\uff0c\u7f8a\u6bdb\u886b\uff0c\u9488\u7ec7\u886b', components: ['swea', 'ter'], sentence: 'I wear a sweater.', sentenceZh: '\u6211\u7a7f\u4e00\u4ef6\u6bdb\u8863\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'dress', phonetic: '\/dres\/', meaning: '\u8fde\u8863\u88d9', components: ['dr', 'e', 'ss'], sentence: 'She has a beautiful dress.', sentenceZh: '\u5979\u6709\u4e00\u6761\u6f02\u4eae\u7684\u8fde\u8863\u88d9\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'party', phonetic: '\/\u02c8p\u0251\u02d0ti\/', meaning: '\u805a\u4f1a\uff0c\u5bb4\u4f1a', components: ['par', 'ty'], sentence: 'I go to a party.', sentenceZh: '\u6211\u53bb\u53c2\u52a0\u805a\u4f1a\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'dressmaker', phonetic: '\/\u02c8dresme\u026ak\u0259\/', meaning: '\u88c1\u7f1d', components: ['dress', 'maker'], sentence: 'She is a dressmaker.', sentenceZh: '\u5979\u662f\u4e00\u540d\u88c1\u7f1d\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'wrong', phonetic: '\/r\u0252\u014b\/', meaning: '\u4e0d\u6b63\u786e\u7684\uff0c\u9519\u8bef\u7684', components: ['wr', 'o', 'ng'], sentence: 'That is wrong.', sentenceZh: '\u90a3\u662f\u9519\u8bef\u7684\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'clever', phonetic: '\/\u02c8klev\u0259\/', meaning: '\u806a\u660e\u7684', components: ['cle', 'ver'], sentence: 'He is clever.', sentenceZh: '\u4ed6\u5f88\u806a\u660e\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'whale', phonetic: '\/we\u026al\/', meaning: '\u9cb8', components: ['wh', 'a', 'le'], sentence: 'The whale is big.', sentenceZh: '\u9cb8\u5f88\u5927\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'Mr', phonetic: '\/\u02c8m\u026ast\u0259\/', meaning: '\u5148\u751f', components: ['M', 'r'], sentence: 'Mr Smith is my teacher.', sentenceZh: '\u53f2\u5bc6\u65af\u5148\u751f\u662f\u6211\u7684\u8001\u5e08\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'uniform', phonetic: '\/\u02c8ju\u02d0n\u026af\u0254\u02d0m\/', meaning: '\u5236\u670d', components: ['uni', 'form'], sentence: 'He wears a uniform.', sentenceZh: '\u4ed6\u7a7f\u5236\u670d\u3002', unit: 6, grade: 4, term: 2 },\n        { word: 'robe', phonetic: '\/r\u0259\u028ab\/', meaning: '\u957f\u888d', components: ['r', 'o', 'be'], sentence: 'She wears a robe.', sentenceZh: '\u5979\u7a7f\u4e00\u4ef6\u957f\u888d\u3002', unit: 6, grade: 4, term: 2 }\n    ];\n\n    \/\/ ========== \u5e72\u6270\u9879\u6c60 ==========\n    var MEANING_POOL = [];\n    for (var mi = 0; mi < FULL_WORD_BANK.length; mi++) {\n        MEANING_POOL.push(FULL_WORD_BANK[mi].meaning);\n    }\n\n    \/\/ ========== \u72b6\u6001 ==========\n    var currentMode = 'choice';\n    var errorWords = [];\n    var currentWord = null;\n    var selectedComponents = [];\n    var correctCount = 0;\n    var isErrorMode = false;\n    var currentFilteredBank = FULL_WORD_BANK.slice();\n    var isWaitingForNext = false;\n    var isCorrectState = false;\n    var totalCompletedCount = 0;      \/\/ \u6392\u884c\u699c\u7d2f\u8ba1\u901a\u5173\u6570\uff08\u8de8\u5355\u5143\uff0c\u4e0d\u91cd\u7f6e\uff09\n    var currentBankProgress = 0;      \/\/ \u5f53\u524d\u5b57\u5e93\u8fdb\u5ea6\uff08\u5207\u6362\u5355\u5143\u91cd\u7f6e\uff09\n    var completedWordsSet = new Set();\n    var totalBankSize = 0;\n    var currentUserName = 'Leo';\n    var rankData = [];\n    var currentComponentList = [];\n    var choiceOptions = [];\n    var selectedOptionIndex = -1;\n\n    \/\/ DOM\n    var userNameInput = document.getElementById('userNameInput');\n    var userBadge = document.getElementById('userBadge');\n    var gradeSelect = document.getElementById('gradeSelect');\n    var termSelect = document.getElementById('termSelect');\n    var unitSelect = document.getElementById('unitSelect');\n    var loadBtn = document.getElementById('loadBtn');\n    var errorModeBtn = document.getElementById('errorModeBtn');\n    var modeChoice = document.getElementById('modeChoice');\n    var modeSpell = document.getElementById('modeSpell');\n    var choiceModeEl = document.getElementById('choiceMode');\n    var spellModeEl = document.getElementById('spellMode');\n    var choiceWord = document.getElementById('choiceWord');\n    var choicePhonetic = document.getElementById('choicePhonetic');\n    var optionsGrid = document.getElementById('optionsGrid');\n    var sentenceBox = document.getElementById('sentenceBox');\n    var spellWord = document.getElementById('spellWord');\n    var spellPhonetic = document.getElementById('spellPhonetic');\n    var spellComponents = document.getElementById('spellComponents');\n    var spellSentence = document.getElementById('spellSentence');\n    var messageBox = document.getElementById('messageBox');\n    var continueBtn = document.getElementById('continueBtn');\n    var resetBtn = document.getElementById('resetBtn');\n    var nextBtn = document.getElementById('nextBtn');\n    var progressLabel = document.getElementById('progressLabel');\n    var progressFill = document.getElementById('progressFill');\n    var correctSpan = document.getElementById('correctCount');\n    var errorSpan = document.getElementById('errorCount');\n    var currentLabel = document.getElementById('currentLabel');\n    var errorListEl = document.getElementById('errorList');\n    var rankList = document.getElementById('rankList');\n    var rankToggleBtn = document.getElementById('rankToggleBtn');\n    var rankToggle = document.getElementById('rankToggle');\n\n    \/\/ ========== \u6392\u884c\u699c\u51fd\u6570 ==========\n    function loadRank() {\n        try {\n            var stored = localStorage.getItem('wordRank');\n            if (stored) {\n                rankData = JSON.parse(stored);\n            } else {\n                rankData = [];\n            }\n        } catch (e) {\n            rankData = [];\n        }\n        renderRank();\n    }\n\n    function saveRank() {\n        try {\n            localStorage.setItem('wordRank', JSON.stringify(rankData));\n        } catch (e) {}\n    }\n\n    function updateRank(userName, score) {\n        if (!userName || userName.trim() === '') {\n            return;\n        }\n        var name = userName.trim();\n        var existing = null;\n        for (var i = 0; i < rankData.length; i++) {\n            if (rankData[i].name === name) {\n                existing = rankData[i];\n                break;\n            }\n        }\n        if (existing) {\n            if (score > existing.score) {\n                existing.score = score;\n            }\n        } else {\n            rankData.push({ name: name, score: score });\n        }\n        rankData.sort(function(a, b) {\n            return b.score - a.score;\n        });\n        saveRank();\n        renderRank();\n    }\n\n    function renderRank() {\n        if (rankData.length === 0) {\n            rankList.innerHTML = '<div class=\"rank-empty\">\u6682\u65e0\u8bb0\u5f55\uff0c\u5feb\u6765\u6311\u6218\u5427\uff01<\/div>';\n            return;\n        }\n        var currentName = userNameInput.value.trim() || 'Leo';\n        var html = '';\n        var limit = rankData.length < 20 ? rankData.length : 20;\n        for (var i = 0; i < limit; i++) {\n            var item = rankData[i];\n            var isMe = (item.name === currentName);\n            html += '<div class=\"rank-item' + (isMe ? ' me' : '') + '\">';\n            html += '<span class=\"rank-num\">' + (i + 1) + '<\/span>';\n            html += '<span class=\"rank-name\">' + item.name + '<\/span>';\n            html += '<span class=\"rank-score\">' + item.score + ' \u8bcd<\/span>';\n            html += '<\/div>';\n        }\n        rankList.innerHTML = html;\n    }\n\n    \/\/ ========== \u8f85\u52a9\u51fd\u6570 ==========\n    function shuffleArray(arr) {\n        for (var i = arr.length - 1; i > 0; i--) {\n            var j = Math.floor(Math.random() * (i + 1));\n            var temp = arr[i];\n            arr[i] = arr[j];\n            arr[j] = temp;\n        }\n        return arr;\n    }\n\n    function getRandomMeanings(exclude, count) {\n        if (count === undefined) {\n            count = 3;\n        }\n        var pool = [];\n        for (var i = 0; i < MEANING_POOL.length; i++) {\n            if (MEANING_POOL[i] !== exclude) {\n                pool.push(MEANING_POOL[i]);\n            }\n        }\n        var uniquePool = [];\n        var seen = new Set();\n        for (var j = 0; j < pool.length; j++) {\n            if (!seen.has(pool[j])) {\n                seen.add(pool[j]);\n                uniquePool.push(pool[j]);\n            }\n        }\n        var shuffled = shuffleArray(uniquePool.slice());\n        var result = [];\n        var limit = count < shuffled.length ? count : shuffled.length;\n        for (var k = 0; k < limit; k++) {\n            result.push(shuffled[k]);\n        }\n        return result;\n    }\n\n    function filterBank() {\n        var grade = gradeSelect.value;\n        var term = termSelect.value;\n        var unit = unitSelect.value;\n        var filtered = [];\n        for (var i = 0; i < FULL_WORD_BANK.length; i++) {\n            var item = FULL_WORD_BANK[i];\n            var skip = false;\n            if (grade !== 'all') {\n                if (item.grade !== parseInt(grade, 10)) {\n                    skip = true;\n                }\n            }\n            if (!skip) {\n                if (term !== 'all') {\n                    if (item.term !== parseInt(term, 10)) {\n                        skip = true;\n                    }\n                }\n            }\n            if (!skip) {\n                if (unit !== 'all') {\n                    if (item.unit !== parseInt(unit, 10)) {\n                        skip = true;\n                    }\n                }\n            }\n            if (!skip) {\n                filtered.push(item);\n            }\n        }\n        return filtered;\n    }\n\n    function addToError(word) {\n        var found = false;\n        for (var i = 0; i < errorWords.length; i++) {\n            if (errorWords[i] === word) {\n                found = true;\n                break;\n            }\n        }\n        if (!found) {\n            errorWords.push(word);\n            updateStats();\n            renderErrorList();\n        }\n    }\n\n    function updateStats() {\n        correctSpan.textContent = correctCount;\n        errorSpan.textContent = errorWords.length;\n    }\n\n    function renderErrorList() {\n        if (errorWords.length === 0) {\n            errorListEl.innerHTML = '<span style=\"background:transparent; color:#6b7b8c;\">\ud83d\udccc \u9519\u8bcd\u5e93\u7a7a<\/span>';\n            return;\n        }\n        var html = '';\n        for (var i = 0; i < errorWords.length; i++) {\n            html += '<span>' + errorWords[i] + '<\/span>';\n        }\n        errorListEl.innerHTML = html;\n    }\n\n    function updateProgress() {\n        var total = totalBankSize || currentFilteredBank.length;\n        var done = currentBankProgress;\n        progressLabel.textContent = '\ud83d\udcca \u8fdb\u5ea6\uff1a' + done + ' \/ ' + total;\n        var pct = total > 0 ? Math.min(100, (done \/ total) * 100) : 0;\n        progressFill.style.width = pct + '%';\n        userBadge.textContent = '\ud83d\udcda \u5df2\u901a\u5173: ' + totalCompletedCount;\n        var userName = userNameInput.value.trim() || 'Leo';\n        if (totalCompletedCount > 0) {\n            updateRank(userName, totalCompletedCount);\n        }\n        currentUserName = userName;\n    }\n\n    function getNextUncompletedWord() {\n        if (isErrorMode) {\n            if (errorWords.length === 0) {\n                return null;\n            }\n            var available = [];\n            for (var i = 0; i < errorWords.length; i++) {\n                if (!completedWordsSet.has(errorWords[i])) {\n                    available.push(errorWords[i]);\n                }\n            }\n            if (available.length === 0) {\n                return null;\n            }\n            var randomWord = available[Math.floor(Math.random() * available.length)];\n            for (var j = 0; j < FULL_WORD_BANK.length; j++) {\n                if (FULL_WORD_BANK[j].word === randomWord) {\n                    return FULL_WORD_BANK[j];\n                }\n            }\n            return null;\n        }\n        var available2 = [];\n        for (var k = 0; k < currentFilteredBank.length; k++) {\n            if (!completedWordsSet.has(currentFilteredBank[k].word)) {\n                available2.push(currentFilteredBank[k]);\n            }\n        }\n        if (available2.length === 0) {\n            return null;\n        }\n        return available2[Math.floor(Math.random() * available2.length)];\n    }\n\n    \/\/ ========== \u6e32\u67d3\u9009\u62e9\u6a21\u5f0f ==========\n    function renderChoiceMode() {\n        if (isWaitingForNext) {\n            return;\n        }\n        if (!currentWord) {\n            choiceWord.textContent = '\ud83c\udfaf';\n            choicePhonetic.textContent = '';\n            optionsGrid.innerHTML = '';\n            sentenceBox.textContent = '\u2728 \u8bf7\u9501\u5b9a\u8bcd\u5e93';\n            messageBox.textContent = '\u70b9\u51fb\"\u9501\u5b9a\u8bcd\u5e93\" \u6216 \"\u9519\u8bcd\u5e93\"';\n            currentLabel.textContent = '-';\n            continueBtn.classList.add('hidden');\n            updateProgress();\n            return;\n        }\n\n        choiceWord.textContent = currentWord.word;\n        choicePhonetic.textContent = currentWord.phonetic;\n        currentLabel.textContent = currentWord.word;\n\n        var correct = currentWord.meaning;\n        var distractors = getRandomMeanings(correct, 3);\n        var options = [correct];\n        for (var i = 0; i < distractors.length; i++) {\n            options.push(distractors[i]);\n        }\n        var uniqueOptions = [];\n        var seen = new Set();\n        for (var j = 0; j < options.length; j++) {\n            if (!seen.has(options[j])) {\n                seen.add(options[j]);\n                uniqueOptions.push(options[j]);\n            }\n        }\n        while (uniqueOptions.length < 4) {\n            var extra = MEANING_POOL[Math.floor(Math.random() * MEANING_POOL.length)];\n            if (!seen.has(extra)) {\n                if (extra !== correct) {\n                    seen.add(extra);\n                    uniqueOptions.push(extra);\n                }\n            }\n        }\n        choiceOptions = shuffleArray(uniqueOptions);\n\n        optionsGrid.innerHTML = '';\n        for (var k = 0; k < choiceOptions.length; k++) {\n            var opt = choiceOptions[k];\n            var btn = document.createElement('button');\n            btn.className = 'option-btn';\n            btn.textContent = opt;\n            btn.dataset.idx = k;\n            if (isCorrectState) {\n                btn.disabled = true;\n                if (opt === currentWord.meaning) {\n                    btn.classList.add('selected-correct');\n                } else {\n                    if (k === selectedOptionIndex) {\n                        if (opt !== currentWord.meaning) {\n                            btn.classList.add('selected-wrong');\n                        }\n                    }\n                }\n            }\n            btn.addEventListener('click', function(idx) {\n                return function() {\n                    handleChoiceClick(idx);\n                };\n            }(k));\n            optionsGrid.appendChild(btn);\n        }\n\n        if (isCorrectState) {\n            sentenceBox.innerHTML = '<div class=\"en\">\ud83d\udcd6 ' + currentWord.sentence + '<\/div><div class=\"zh\">' + currentWord.sentenceZh + '<\/div>';\n            messageBox.textContent = '\u2705 \u6b63\u786e\uff01\u70b9\u51fb\"\u7ee7\u7eed\"\u8fdb\u5165\u4e0b\u4e00\u9898';\n            continueBtn.classList.remove('hidden');\n        } else {\n            sentenceBox.textContent = '\u2728 \u9009\u62e9\u6b63\u786e\u91ca\u4e49\u540e\u663e\u793a\u4f8b\u53e5';\n            messageBox.textContent = '\u9009\u62e9\u4e00\u4e2a\u91ca\u4e49';\n            continueBtn.classList.add('hidden');\n        }\n        updateStats();\n        renderErrorList();\n        updateProgress();\n    }\n\n    function handleChoiceClick(idx) {\n        if (isWaitingForNext || isCorrectState) {\n            return;\n        }\n        if (!currentWord) {\n            return;\n        }\n\n        selectedOptionIndex = idx;\n        var selected = choiceOptions[idx];\n        var isCorrect = (selected === currentWord.meaning);\n\n        var btns = optionsGrid.querySelectorAll('.option-btn');\n        for (var i = 0; i < btns.length; i++) {\n            btns[i].disabled = true;\n        }\n\n        if (isCorrect) {\n            isCorrectState = true;\n            correctCount++;\n            currentBankProgress++;\n            totalCompletedCount++;\n            completedWordsSet.add(currentWord.word);\n            var errIdx = -1;\n            for (var j = 0; j < errorWords.length; j++) {\n                if (errorWords[j] === currentWord.word) {\n                    errIdx = j;\n                    break;\n                }\n            }\n            if (errIdx !== -1) {\n                errorWords.splice(errIdx, 1);\n            }\n            for (var k = 0; k < btns.length; k++) {\n                if (choiceOptions[k] === currentWord.meaning) {\n                    btns[k].classList.add('selected-correct');\n                }\n            }\n            sentenceBox.innerHTML = '<div class=\"en\">\ud83d\udcd6 ' + currentWord.sentence + '<\/div><div class=\"zh\">' + currentWord.sentenceZh + '<\/div>';\n            messageBox.textContent = '\u2705 \u6b63\u786e\uff01\u70b9\u51fb\"\u7ee7\u7eed\"\u8fdb\u5165\u4e0b\u4e00\u9898';\n            continueBtn.classList.remove('hidden');\n            updateProgress();\n            var userName = userNameInput.value.trim() || 'Leo';\n            updateRank(userName, totalCompletedCount);\n        } else {\n            addToError(currentWord.word);\n            for (var m = 0; m < btns.length; m++) {\n                if (choiceOptions[m] === currentWord.meaning) {\n                    btns[m].classList.add('selected-correct');\n                }\n                if (m === idx) {\n                    btns[m].classList.add('selected-wrong');\n                }\n            }\n            sentenceBox.textContent = '\u274c \u6b63\u786e\u7b54\u6848\u662f\uff1a' + currentWord.meaning;\n            messageBox.textContent = '\u274c \u9009\u9519\u4e86\uff01\u5df2\u8bb0\u5165\u9519\u8bcd\u5e93\uff0c\u70b9\u51fb\"\u4e0b\u4e00\u9898\"\u7ee7\u7eed';\n        }\n        updateStats();\n        renderErrorList();\n    }\n\n    \/\/ ========== \u6e32\u67d3\u62fc\u5199\u6a21\u5f0f ==========\n    function renderSpellMode() {\n        if (isWaitingForNext) {\n            return;\n        }\n        if (!currentWord) {\n            spellWord.textContent = '\ud83c\udfaf';\n            spellPhonetic.textContent = '';\n            spellComponents.innerHTML = '';\n            spellSentence.textContent = '\u2728 \u8bf7\u9501\u5b9a\u8bcd\u5e93';\n            messageBox.textContent = '\u70b9\u51fb\"\u9501\u5b9a\u8bcd\u5e93\" \u6216 \"\u9519\u8bcd\u5e93\"';\n            currentLabel.textContent = '-';\n            continueBtn.classList.add('hidden');\n            updateProgress();\n            return;\n        }\n\n        spellWord.textContent = currentWord.word;\n        spellPhonetic.textContent = currentWord.phonetic;\n        currentLabel.textContent = currentWord.word;\n\n        var comps = currentWord.components;\n        if (currentComponentList.length === 0 || currentComponentList._word !== currentWord.word) {\n            var shuffled = shuffleArray(comps.slice());\n            currentComponentList = shuffled;\n            currentComponentList._word = currentWord.word;\n            currentComponentList._colors = currentComponentList._colors || [];\n            for (var i = 0; i < currentComponentList.length; i++) {\n                currentComponentList._colors[i] = i % 10;\n            }\n        }\n\n        spellComponents.innerHTML = '';\n        for (var j = 0; j < currentComponentList.length; j++) {\n            var comp = currentComponentList[j];\n            var btn = document.createElement('button');\n            btn.className = 'component-btn';\n            var colorIdx = currentComponentList._colors ? currentComponentList._colors[j] : (j % 10);\n            btn.classList.add('color-' + colorIdx);\n            btn.textContent = comp;\n            btn.dataset.comp = comp;\n            var selected = false;\n            for (var s = 0; s < selectedComponents.length; s++) {\n                if (selectedComponents[s] === comp) {\n                    selected = true;\n                    break;\n                }\n            }\n            if (selected) {\n                btn.classList.add('selected');\n            }\n            if (isCorrectState) {\n                btn.disabled = true;\n            }\n            btn.addEventListener('click', function(c) {\n                return function() {\n                    handleSpellClick(c);\n                };\n            }(comp));\n            spellComponents.appendChild(btn);\n        }\n\n        if (isCorrectState) {\n            spellSentence.innerHTML = '<div class=\"en\">\ud83d\udcd6 ' + currentWord.sentence + '<\/div><div class=\"zh\">' + currentWord.sentenceZh + '<\/div>';\n            messageBox.textContent = '\u2705 \u62fc\u5bf9\u4e86\uff01\u70b9\u51fb\"\u7ee7\u7eed\"\u8fdb\u5165\u4e0b\u4e00\u9898';\n            continueBtn.classList.remove('hidden');\n            var btns2 = spellComponents.querySelectorAll('.component-btn');\n            for (var k = 0; k < btns2.length; k++) {\n                var comp2 = btns2[k].dataset.comp;\n                var found2 = false;\n                for (var f = 0; f < currentWord.components.length; f++) {\n                    if (currentWord.components[f] === comp2) {\n                        found2 = true;\n                        break;\n                    }\n                }\n                if (found2) {\n                    btns2[k].classList.add('correct-highlight');\n                }\n            }\n        } else {\n            spellSentence.textContent = '\ud83d\udcdd \u62fc\u5199\u8fdb\u5ea6: ' + selectedComponents.length + '\/' + currentWord.components.length;\n            if (selectedComponents.length === 0) {\n                messageBox.textContent = '\u70b9\u51fb\u90e8\u4ef6\u62fc\u5199';\n            } else {\n                messageBox.textContent = '\u5df2\u9009: ' + selectedComponents.join(' + ');\n            }\n            continueBtn.classList.add('hidden');\n        }\n\n        updateStats();\n        renderErrorList();\n        updateProgress();\n    }\n\n    function handleSpellClick(comp) {\n        if (isWaitingForNext || isCorrectState) {\n            return;\n        }\n        if (!currentWord) {\n            return;\n        }\n\n        if (selectedComponents.length === currentWord.components.length) {\n            messageBox.textContent = '\u5df2\u9009\u6ee1\uff0c\u70b9\u51fb\"\u91cd\u7f6e\"\u91cd\u65b0\u62fc';\n            return;\n        }\n\n        var alreadySelected = false;\n        for (var i = 0; i < selectedComponents.length; i++) {\n            if (selectedComponents[i] === comp) {\n                alreadySelected = true;\n                break;\n            }\n        }\n        if (alreadySelected) {\n            messageBox.textContent = '\u90e8\u4ef6 \"' + comp + '\" \u5df2\u9009\uff0c\u4e0d\u80fd\u91cd\u590d';\n            return;\n        }\n\n        var correctComps = currentWord.components;\n        var nextIndex = selectedComponents.length;\n        if (comp !== correctComps[nextIndex]) {\n            addToError(currentWord.word);\n            messageBox.textContent = '\u274c \u90e8\u4ef6\u201c' + comp + '\u201d\u4e0d\u6b63\u786e\uff0c\u5df2\u8bb0\u5165\u9519\u8bcd\u5e93';\n            var btns = spellComponents.querySelectorAll('.component-btn');\n            for (var j = 0; j < btns.length; j++) {\n                if (btns[j].dataset.comp === correctComps[nextIndex]) {\n                    btns[j].classList.add('correct-highlight');\n                }\n            }\n            updateStats();\n            renderErrorList();\n            return;\n        }\n\n        selectedComponents.push(comp);\n\n        if (selectedComponents.length === currentWord.components.length) {\n            isCorrectState = true;\n            correctCount++;\n            currentBankProgress++;\n            totalCompletedCount++;\n            completedWordsSet.add(currentWord.word);\n            var errIdx = -1;\n            for (var k = 0; k < errorWords.length; k++) {\n                if (errorWords[k] === currentWord.word) {\n                    errIdx = k;\n                    break;\n                }\n            }\n            if (errIdx !== -1) {\n                errorWords.splice(errIdx, 1);\n            }\n            spellSentence.innerHTML = '<div class=\"en\">\ud83d\udcd6 ' + currentWord.sentence + '<\/div><div class=\"zh\">' + currentWord.sentenceZh + '<\/div>';\n            messageBox.textContent = '\u2705 \u62fc\u5bf9\u4e86\uff01\u70b9\u51fb\"\u7ee7\u7eed\"\u8fdb\u5165\u4e0b\u4e00\u9898';\n            continueBtn.classList.remove('hidden');\n            var btns2 = spellComponents.querySelectorAll('.component-btn');\n            for (var m = 0; m < btns2.length; m++) {\n                var comp2 = btns2[m].dataset.comp;\n                var found = false;\n                for (var f = 0; f < currentWord.components.length; f++) {\n                    if (currentWord.components[f] === comp2) {\n                        found = true;\n                        break;\n                    }\n                }\n                if (found) {\n                    btns2[m].classList.add('correct-highlight');\n                }\n                btns2[m].disabled = true;\n            }\n            updateProgress();\n            var userName = userNameInput.value.trim() || 'Leo';\n            updateRank(userName, totalCompletedCount);\n            updateStats();\n            renderErrorList();\n            return;\n        }\n\n        renderSpellMode();\n    }\n\n    \/\/ ========== \u901a\u7528\u51fd\u6570 ==========\n    function loadNextWord() {\n        if (isWaitingForNext) {\n            return;\n        }\n        isCorrectState = false;\n        continueBtn.classList.add('hidden');\n        selectedComponents = [];\n        currentComponentList = [];\n        selectedOptionIndex = -1;\n        var highlights = document.querySelectorAll('.correct-highlight');\n        for (var i = 0; i < highlights.length; i++) {\n            highlights[i].classList.remove('correct-highlight');\n        }\n\n        var next = getNextUncompletedWord();\n\n        if (!next) {\n            if (isErrorMode) {\n                messageBox.textContent = '\ud83c\udf89 \u9519\u8bcd\u5e93\u5df2\u6e05\u7a7a\uff01\u5207\u6362\u56de\u666e\u901a\u6a21\u5f0f';\n                if (currentMode === 'choice') {\n                    sentenceBox.textContent = '\u2728 \u5168\u90e8\u638c\u63e1\uff01';\n                } else {\n                    spellSentence.textContent = '\u2728 \u5168\u90e8\u638c\u63e1\uff01';\n                }\n            } else {\n                var total = totalBankSize || currentFilteredBank.length;\n                var done = currentBankProgress;\n                if (done >= total) {\n                    if (total > 0) {\n                        messageBox.textContent = '\ud83c\udf89 \u592a\u68d2\u4e86\uff01\u5f53\u524d\u8bcd\u5e93\u5168\u90e8\u638c\u63e1\uff01';\n                        if (currentMode === 'choice') {\n                            sentenceBox.textContent = '\u2728 \u6240\u6709\u5355\u8bcd\u5df2\u5b8c\u6210\uff01';\n                        } else {\n                            spellSentence.textContent = '\u2728 \u6240\u6709\u5355\u8bcd\u5df2\u5b8c\u6210\uff01';\n                        }\n                    } else {\n                        messageBox.textContent = '\ud83d\udced \u5f53\u524d\u8bcd\u5e93\u65e0\u53ef\u7528\u8bcd\uff0c\u8bf7\u8c03\u6574\u7b5b\u9009';\n                    }\n                } else {\n                    messageBox.textContent = '\ud83d\udced \u5f53\u524d\u8bcd\u5e93\u65e0\u53ef\u7528\u8bcd\uff0c\u8bf7\u8c03\u6574\u7b5b\u9009';\n                }\n            }\n            currentWord = null;\n            if (currentMode === 'choice') {\n                choiceWord.textContent = '\ud83c\udf1f';\n                choicePhonetic.textContent = '';\n                optionsGrid.innerHTML = '';\n            } else {\n                spellWord.textContent = '\ud83c\udf1f';\n                spellPhonetic.textContent = '';\n                spellComponents.innerHTML = '';\n            }\n            currentLabel.textContent = '-';\n            updateStats();\n            renderErrorList();\n            updateProgress();\n            return;\n        }\n\n        currentWord = next;\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        currentComponentList = [];\n        if (currentMode === 'choice') {\n            renderChoiceMode();\n        } else {\n            renderSpellMode();\n        }\n    }\n\n    function resetCurrent() {\n        if (isWaitingForNext) {\n            return;\n        }\n        if (isCorrectState) {\n            isCorrectState = false;\n            continueBtn.classList.add('hidden');\n            var highlights = document.querySelectorAll('.correct-highlight');\n            for (var i = 0; i < highlights.length; i++) {\n                highlights[i].classList.remove('correct-highlight');\n            }\n        }\n        if (!currentWord) {\n            loadNextWord();\n            return;\n        }\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        currentComponentList = [];\n        if (currentMode === 'choice') {\n            renderChoiceMode();\n        } else {\n            renderSpellMode();\n        }\n        messageBox.textContent = '\ud83d\udd04 \u5df2\u91cd\u7f6e\uff0c\u91cd\u65b0\u4f5c\u7b54';\n    }\n\n    function lockWordBank() {\n        if (isWaitingForNext) {\n            return;\n        }\n        isErrorMode = false;\n        errorModeBtn.textContent = '\ud83d\udcd5 \u9519\u8bcd\u5e93';\n        currentFilteredBank = filterBank();\n        totalBankSize = currentFilteredBank.length;\n        \/\/ \u53ea\u91cd\u7f6e\u5f53\u524d\u5b57\u5e93\u8fdb\u5ea6\uff0c\u6392\u884c\u699c\u7d2f\u8ba1\u4fdd\u6301\u4e0d\u53d8\n        currentBankProgress = 0;\n        completedWordsSet = new Set();\n        currentComponentList = [];\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        isCorrectState = false;\n        continueBtn.classList.add('hidden');\n        var highlights = document.querySelectorAll('.correct-highlight');\n        for (var i = 0; i < highlights.length; i++) {\n            highlights[i].classList.remove('correct-highlight');\n        }\n\n        if (currentFilteredBank.length === 0) {\n            messageBox.textContent = '\u26a0\ufe0f \u7b5b\u9009\u540e\u65e0\u8bcd\uff0c\u8c03\u6574\u6a21\u5757';\n            if (currentMode === 'choice') {\n                choiceWord.textContent = '\ud83d\udced';\n                choicePhonetic.textContent = '';\n                optionsGrid.innerHTML = '';\n                sentenceBox.textContent = '\u2728 \u8c03\u6574\u7b5b\u9009\u8303\u56f4\u5427';\n            } else {\n                spellWord.textContent = '\ud83d\udced';\n                spellPhonetic.textContent = '';\n                spellComponents.innerHTML = '';\n                spellSentence.textContent = '\u2728 \u8c03\u6574\u7b5b\u9009\u8303\u56f4\u5427';\n            }\n            currentWord = null;\n            currentLabel.textContent = '-';\n            updateProgress();\n            return;\n        }\n\n        var next = getNextUncompletedWord();\n        if (next) {\n            currentWord = next;\n        } else {\n            currentWord = currentFilteredBank[0];\n        }\n        if (currentMode === 'choice') {\n            renderChoiceMode();\n        } else {\n            renderSpellMode();\n        }\n        messageBox.textContent = '\ud83d\udd12 \u8bcd\u5e93\u5df2\u9501\u5b9a (' + currentFilteredBank.length + '\u8bcd)';\n        var userName = userNameInput.value.trim() || 'Leo';\n        updateRank(userName, totalCompletedCount);\n    }\n\n    \/\/ ========== \u5207\u6362\u6a21\u5f0f ==========\n    function switchMode(mode) {\n        if (mode === currentMode) {\n            return;\n        }\n        currentMode = mode;\n        if (mode === 'choice') {\n            modeChoice.classList.add('active');\n            modeSpell.classList.remove('active');\n            choiceModeEl.classList.remove('hidden');\n            spellModeEl.classList.add('hidden');\n        } else {\n            modeSpell.classList.add('active');\n            modeChoice.classList.remove('active');\n            spellModeEl.classList.remove('hidden');\n            choiceModeEl.classList.add('hidden');\n        }\n        isCorrectState = false;\n        continueBtn.classList.add('hidden');\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        currentComponentList = [];\n        var highlights = document.querySelectorAll('.correct-highlight');\n        for (var i = 0; i < highlights.length; i++) {\n            highlights[i].classList.remove('correct-highlight');\n        }\n        if (currentWord) {\n            if (mode === 'choice') {\n                renderChoiceMode();\n            } else {\n                renderSpellMode();\n            }\n        } else {\n            loadNextWord();\n        }\n    }\n\n    \/\/ ========== \u4e8b\u4ef6\u7ed1\u5b9a ==========\n    modeChoice.addEventListener('click', function() {\n        switchMode('choice');\n    });\n    modeSpell.addEventListener('click', function() {\n        switchMode('spell');\n    });\n\n    loadBtn.addEventListener('click', lockWordBank);\n\n    errorModeBtn.addEventListener('click', function() {\n        if (isWaitingForNext) {\n            return;\n        }\n        isErrorMode = !isErrorMode;\n        if (isErrorMode) {\n            this.textContent = '\ud83d\udcd6 \u666e\u901a\u6a21\u5f0f';\n            messageBox.textContent = '\ud83d\udcd5 \u9519\u8bcd\u5e93\u6a21\u5f0f';\n            \/\/ \u53ea\u91cd\u7f6e\u5f53\u524d\u5b57\u5e93\u8fdb\u5ea6\n            currentBankProgress = 0;\n            completedWordsSet = new Set();\n            currentComponentList = [];\n            selectedComponents = [];\n            selectedOptionIndex = -1;\n            isCorrectState = false;\n            continueBtn.classList.add('hidden');\n            var highlights = document.querySelectorAll('.correct-highlight');\n            for (var i = 0; i < highlights.length; i++) {\n                highlights[i].classList.remove('correct-highlight');\n            }\n            if (errorWords.length === 0) {\n                messageBox.textContent = '\ud83d\udced \u9519\u8bcd\u5e93\u4e3a\u7a7a\uff0c\u5148\u6536\u96c6\u9519\u8bcd\u5427';\n                if (currentMode === 'choice') {\n                    choiceWord.textContent = '\ud83d\udced';\n                    choicePhonetic.textContent = '';\n                    optionsGrid.innerHTML = '';\n                    sentenceBox.textContent = '\u2728 \u9519\u8bcd\u5e93\u4e3a\u7a7a';\n                } else {\n                    spellWord.textContent = '\ud83d\udced';\n                    spellPhonetic.textContent = '';\n                    spellComponents.innerHTML = '';\n                    spellSentence.textContent = '\u2728 \u9519\u8bcd\u5e93\u4e3a\u7a7a';\n                }\n                currentWord = null;\n                currentLabel.textContent = '-';\n                updateProgress();\n            } else {\n                loadNextWord();\n            }\n        } else {\n            this.textContent = '\ud83d\udcd5 \u9519\u8bcd\u5e93';\n            \/\/ \u53ea\u91cd\u7f6e\u5f53\u524d\u5b57\u5e93\u8fdb\u5ea6\n            currentBankProgress = 0;\n            completedWordsSet = new Set();\n            currentComponentList = [];\n            selectedComponents = [];\n            selectedOptionIndex = -1;\n            isCorrectState = false;\n            continueBtn.classList.add('hidden');\n            var highlights2 = document.querySelectorAll('.correct-highlight');\n            for (var j = 0; j < highlights2.length; j++) {\n                highlights2[j].classList.remove('correct-highlight');\n            }\n            lockWordBank();\n        }\n        renderErrorList();\n    });\n\n    resetBtn.addEventListener('click', resetCurrent);\n\n    nextBtn.addEventListener('click', function() {\n        if (isWaitingForNext) {\n            return;\n        }\n        if (isCorrectState) {\n            isCorrectState = false;\n            continueBtn.classList.add('hidden');\n            var highlights = document.querySelectorAll('.correct-highlight');\n            for (var i = 0; i < highlights.length; i++) {\n                highlights[i].classList.remove('correct-highlight');\n            }\n            currentComponentList = [];\n            selectedComponents = [];\n            selectedOptionIndex = -1;\n            loadNextWord();\n            return;\n        }\n        currentComponentList = [];\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        loadNextWord();\n        var highlights2 = document.querySelectorAll('.correct-highlight');\n        for (var j = 0; j < highlights2.length; j++) {\n            highlights2[j].classList.remove('correct-highlight');\n        }\n    });\n\n    continueBtn.addEventListener('click', function() {\n        if (!isCorrectState) {\n            return;\n        }\n        isCorrectState = false;\n        continueBtn.classList.add('hidden');\n        var highlights = document.querySelectorAll('.correct-highlight');\n        for (var i = 0; i < highlights.length; i++) {\n            highlights[i].classList.remove('correct-highlight');\n        }\n        currentComponentList = [];\n        selectedComponents = [];\n        selectedOptionIndex = -1;\n        loadNextWord();\n    });\n\n    userNameInput.addEventListener('change', function() {\n        var name = this.value.trim() || 'Leo';\n        \/\/ \u4ece\u6392\u884c\u699c\u4e2d\u67e5\u627e\u8be5\u7528\u6237\u5df2\u6709\u7684\u5206\u6570\n        var userScore = 0;\n        for (var i = 0; i < rankData.length; i++) {\n            if (rankData[i].name === name) {\n                userScore = rankData[i].score;\n                break;\n            }\n        }\n        \/\/ \u66f4\u65b0\u5f53\u524d\u7d2f\u8ba1\u6570\u4e3a\u8be5\u7528\u6237\u5df2\u6709\u7684\u5206\u6570\n        totalCompletedCount = userScore;\n        \/\/ \u91cd\u7f6e\u5f53\u524d\u5b57\u5e93\u8fdb\u5ea6\n        currentBankProgress = 0;\n        completedWordsSet = new Set();\n        \/\/ \u91cd\u65b0\u52a0\u8f7d\u5f53\u524d\u5b57\u5e93\n        lockWordBank();\n        renderRank();\n        updateProgress();    });\n\n    var rankCollapsed = false;\n    rankToggle.addEventListener('click', function() {\n        rankCollapsed = !rankCollapsed;\n        rankList.classList.toggle('collapsed', rankCollapsed);\n        rankToggleBtn.textContent = rankCollapsed ? '\u25b6' : '\u25bc';\n    });\n\n    \/\/ ========== \u521d\u59cb\u5316 ==========\n    function init() {\n        currentFilteredBank = filterBank();\n        totalBankSize = currentFilteredBank.length;\n        currentBankProgress = 0;\n        totalCompletedCount = 0;\n        completedWordsSet = new Set();\n        loadRank();\n        lockWordBank();\n        updateStats();\n        renderErrorList();\n        updateProgress();\n        var name = userNameInput.value.trim() || 'Leo';\n        if (totalCompletedCount > 0) {\n            updateRank(name, totalCompletedCount);\n        }\n    }\n    init();\n})();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcda \u5355\u8bcd\u52a9\u8bb0 \u00b7 \u5916\u7814\u4e09\u8d77\u56db\u4e0b\uff08\u5c71\u4e1c\u4e13\u7528\uff09 \ud83d\udcda \u5355\u8bcd\u52a9\u8bb0 \u5916\u7814\u4e09\u8d77\u56db\u4e0b\u00b7\u5c71\u4e1c\u4e13\u7528 \ud83d\udc64 \u59d3\u540d \ud83d\udcda \u5df2\u901a\u5173: 0 \ud83d\udcdd \u9009\u62e9\u91ca\u4e49 \ud83d\udd24 \u62fc\u5199\u5355\u8bcd \u56db\u5e74\u7ea7 \u4e0b\u518c \ud83d\udcda \u5168\u90e8\u5355\u5143Unit 1Unit 2Unit 3Unit 4Unit 5Unit 6 \ud83c\udfaf \u9501\u5b9a\u8bcd\u5e93 \ud83d\udcd5 \u9519\u8bcd\u5e93 \ud83d\udcca \u8fdb\u5ea6\uff1a0 \/ 0 doctor \/\u02c8d\u0252kt\u0259\/ \u2728 \u9009\u62e9\u6b63\u786e\u91ca\u4e49\u540e\u663e\u793a\u4f8b\u53e5 doctor \/\u02c8d\u0252kt\u0259\/ \u2728 \u62fc\u5bf9\u540e\u663e\u793a\u4f8b\u53e5 \ud83d\udc49 \u7ee7\u7eed\u4e0b\u4e00\u9898 \u70b9\u51fb\u9009\u9879\u5f00\u59cb \ud83d\udd04 \u91cd\u7f6e \u23e9 \u4e0b\u4e00\u9898 \ud83d\udccc \u9519\u8bcd\u5e93\u7a7a \u2705 \u6b63\u786e: 0 \u274c \u9519\u8bcd: 0 \ud83d\udcdd \u5f53\u524d: &#8211; \ud83c\udfc6 \u6392\u884c\u699c \u25bc \u6682\u65e0\u8bb0\u5f55\uff0c\u5feb\u6765\u6311\u6218\u5427\uff01<\/p>\n","protected":false},"author":1,"featured_media":104,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-74","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-study-tools"],"_links":{"self":[{"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/comments?post=74"}],"version-history":[{"count":20,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions"}],"predecessor-version":[{"id":102,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions\/102"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/media\/104"}],"wp:attachment":[{"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/media?parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/categories?post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wanglixian.com\/index.php\/wp-json\/wp\/v2\/tags?post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}