{"id":12874,"date":"2025-07-15T23:43:42","date_gmt":"2025-07-15T15:43:42","guid":{"rendered":"https:\/\/tiffanysmandarin.com\/?p=12874"},"modified":"2026-08-31T14:13:25","modified_gmt":"2026-08-31T06:13:25","slug":"contemporary-chinese-vocabulary-practice-b1l1","status":"publish","type":"post","link":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/","title":{"rendered":"B1 L1 Vocabulary and Practice"},"content":{"rendered":"\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:33px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!--\n  \u7576\u4ee3\u4e2d\u6587 Book 1 \u00b7 Lesson 1 \u300c\u6b61\u8fce\u4f60\u4f86\u81fa\u7063\uff01\u300d Vocabulary Embed\n  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  Paste this whole block into a WordPress \"Custom HTML\" block.\n  Follows the established tiffanysmandarin vocab-embed pattern:\n    - No <!DOCTYPE>\/<html>\/<head>\/<body>, no page toggle UI, no footer\n      (site already has its own Text Display \/ Pinyin Display toggle \u2014 that's\n      left untouched; the original Quizlet embed on the page is REPLACED by\n      the flashcard deck + Match It game built into this embed, per request)\n    - CSS fully scoped under .dangdai-b1l1-vocab-embed with its own\n      --db-* variables (never touches site :root)\n    - Ruby markup: <ruby class=\"lang-zh-TW\">...<\/ruby><ruby class=\"lang-zh-CN\">...<\/ruby>\n      written consecutively (no dedupe even when trad = simp)\n    - Every example sentence (and the closing dialogue) is segmented WORD\n      BY WORD into its own ruby+pinyin chunk \u2014 never one ruby spanning a\n      whole sentence \u2014 e.g. \u738b \/ \u5148\u751f \/ \u8981 \/ \u4e0d \/ \u8981 \/ \u559d \/ \u5496\u5561, each with\n      its own pinyin syllable(s). Punctuation is plain text, not ruby.\n    - Root lookup by id (#dangdai-b1l1-vocab-embed-1), not currentScript\n    - Speaker buttons use data-trad\/data-simp + one delegated click listener;\n      icon is an inline SVG play-triangle (emoji glyphs can silently fail\n      once pasted through WordPress; a soundwave-speaker SVG was tried first\n      but was hard to read at this size, so a plain play triangle is used)\n    - A self-contained flashcard deck (07, flip + prev\/next) and a \"Match\n      It\" matching game (08) together fully replace the external Quizlet\n      embed \u2014 no Quizlet embed remains on the page\n    - Traditional\/Simplified conversion: every word\/example\/dialogue\/\n      flashcard\/game piece of Chinese text uses the site's own shared\n      `lang-zh-TW` \/ `lang-zh-CN` classes (same classes the rest of the\n      site uses), so the site's existing Text Display toggle (which is\n      cookie-driven and already works site-wide on ANY element bearing\n      those classes, including content injected by this script after\n      page load, via the site's hyperscript-powered toggle) shows\/hides\n      them automatically \u2014 no separate cookie-reading code is added in\n      this embed, to avoid duplicating\/conflicting with the site's own\n      logic using a guessed cookie name.\n    - Because the site's hyperscript toggle also reaches into every\n      lang-zh-TW\/lang-zh-CN element (including <ruby>\/<rt> here) and can\n      zero out their font-size or force text to white, `ruby` and its\n      inner `.rb` wrapper both get color + font-size hardcoded with\n      !important (font-size: inherit !important, so they still pick up\n      whatever size their containing context \u2014 word card, flashcard\n      front, etc. \u2014 sets); `rt` likewise gets its font-size\/color pinned\n      with !important\n    - No `data-script` (or any hyperscript-reserved) attribute names are\n      used anywhere in this embed, and no literal `&&` appears inside\n      the <script> tag (WordPress's content filter can mangle a literal\n      `&&` into `&#038;&#038;` and break the script) \u2014 the one spot that\n      needed two chained conditions (Match It: both tiles selected) uses\n      nested `if` blocks instead\n-->\n<div class=\"dangdai-b1l1-vocab-embed\" id=\"dangdai-b1l1-vocab-embed-1\">\n<style>\n.dangdai-b1l1-vocab-embed {\n  --db-oxblood: #7b2d26;\n  --db-oxblood-dark: #5e211c;\n  --db-mustard: #c9922b;\n  --db-sage: #7c8b6f;\n  --db-bone: #f7f1e6;\n  --db-ink: #2c2620;\n  --db-line: #e4d9c4;\n  font-family: 'Work Sans', -apple-system, sans-serif;\n  color: var(--db-ink);\n  background: #fff;\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 8px 4px 24px;\n  line-height: 1.6;\n}\n.dangdai-b1l1-vocab-embed * { box-sizing: border-box; }\n.dangdai-b1l1-vocab-embed h1,\n.dangdai-b1l1-vocab-embed h2,\n.dangdai-b1l1-vocab-embed h3 {\n  font-family: 'Bitter', Georgia, serif;\n  color: var(--db-oxblood-dark);\n  margin: 0 0 8px;\n}\n.dangdai-b1l1-vocab-embed .db-lede {\n  margin: 0 0 24px;\n  padding: 14px 16px;\n  background: var(--db-bone);\n  border-left: 4px solid var(--db-mustard);\n  border-radius: 4px;\n  font-size: 0.98rem;\n}\n.dangdai-b1l1-vocab-embed .db-lede b { color: var(--db-oxblood-dark); }\n.dangdai-b1l1-vocab-embed .db-support-note {\n  font-size: 0.85rem;\n  color: var(--db-sage);\n  border-bottom: 1px solid var(--db-line);\n  padding-bottom: 12px;\n  margin: 0 0 16px;\n}\n.dangdai-b1l1-vocab-embed .db-sec-eyebrow {\n  display: inline-block;\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.75rem;\n  letter-spacing: 0.08em;\n  color: #fff;\n  background: var(--db-oxblood);\n  padding: 3px 9px;\n  border-radius: 3px;\n  margin: 32px 0 10px;\n}\n.dangdai-b1l1-vocab-embed .db-word-card {\n  border: 1px solid var(--db-line);\n  border-radius: 8px;\n  padding: 12px 14px;\n  margin-bottom: 10px;\n  background: #fff;\n}\n.dangdai-b1l1-vocab-embed .db-word-top {\n  display: flex;\n  align-items: baseline;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.dangdai-b1l1-vocab-embed .db-num {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.75rem;\n  color: var(--db-mustard);\n  min-width: 22px;\n}\n.dangdai-b1l1-vocab-embed .db-hanzi {\n  font-size: 1.35rem;\n  font-weight: 600;\n}\n.dangdai-b1l1-vocab-embed ruby {\n  ruby-position: over;\n  margin-right: 2px;\n  color: var(--db-ink) !important;\n  font-size: inherit !important;\n}\n.dangdai-b1l1-vocab-embed .rb {\n  color: var(--db-ink) !important;\n  font-size: inherit !important;\n}\n.dangdai-b1l1-vocab-embed rt {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.6rem !important;\n  color: var(--db-sage) !important;\n  font-weight: 400;\n}\n.dangdai-b1l1-vocab-embed rt.hidden { display: none; }\n.dangdai-b1l1-vocab-embed rt.mouseover { opacity: 0; }\n.dangdai-b1l1-vocab-embed rt.mouseover:hover { opacity: 1; }\n.dangdai-b1l1-vocab-embed .db-meaning {\n  font-style: italic;\n  color: #6b5f52;\n  font-size: 0.92rem;\n}\n.dangdai-b1l1-vocab-embed .db-speaker {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex: 0 0 26px;\n  width: 26px;\n  height: 26px;\n  padding: 0;\n  border: none;\n  background: var(--db-bone);\n  color: var(--db-oxblood);\n  border-radius: 50%;\n  cursor: pointer;\n  margin-left: auto;\n}\n.dangdai-b1l1-vocab-embed .db-speaker:hover { background: var(--db-mustard); color: #fff; }\n.dangdai-b1l1-vocab-embed .db-example {\n  margin-top: 8px;\n  padding-top: 8px;\n  border-top: 1px dashed var(--db-line);\n  font-size: 0.95rem;\n}\n.dangdai-b1l1-vocab-embed .db-example .db-sent-word { display: inline-flex; }\n.dangdai-b1l1-vocab-embed .db-example .db-punct { margin-right: 2px; }\n.dangdai-b1l1-vocab-embed .db-example .db-en {\n  display: block;\n  color: #6b5f52;\n  font-size: 0.85rem;\n  margin-top: 4px;\n}\n.dangdai-b1l1-vocab-embed .db-dialogue {\n  background: var(--db-bone);\n  border-radius: 8px;\n  padding: 16px 18px;\n  margin-top: 8px;\n}\n.dangdai-b1l1-vocab-embed .db-line {\n  display: flex;\n  gap: 8px;\n  margin-bottom: 12px;\n  align-items: flex-start;\n  flex-wrap: wrap;\n}\n.dangdai-b1l1-vocab-embed .db-speaker-tag {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.72rem;\n  color: var(--db-oxblood);\n  min-width: 46px;\n  padding-top: 3px;\n}\n.dangdai-b1l1-vocab-embed .db-line-body { flex: 1; min-width: 200px; }\n.dangdai-b1l1-vocab-embed .db-line-en { display: block; color: #6b5f52; font-size: 0.82rem; margin-top: 2px; }\n\n.dangdai-b1l1-vocab-embed .db-game-bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 12px;\n  flex-wrap: wrap;\n}\n.dangdai-b1l1-vocab-embed .db-game-status {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.82rem;\n  color: var(--db-sage);\n}\n.dangdai-b1l1-vocab-embed .db-game-btn {\n  font-family: 'Work Sans', sans-serif;\n  font-size: 0.85rem;\n  border: 1px solid var(--db-oxblood);\n  color: var(--db-oxblood);\n  background: #fff;\n  padding: 6px 14px;\n  border-radius: 20px;\n  cursor: pointer;\n}\n.dangdai-b1l1-vocab-embed .db-game-btn:hover { background: var(--db-oxblood); color: #fff; }\n.dangdai-b1l1-vocab-embed .db-game-board {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 20px;\n}\n.dangdai-b1l1-vocab-embed .db-game-col { display: flex; flex-direction: column; gap: 8px; }\n.dangdai-b1l1-vocab-embed .db-tile {\n  font-family: 'Work Sans', sans-serif;\n  text-align: left;\n  border: 1px solid var(--db-line);\n  background: #fff;\n  border-radius: 6px;\n  padding: 10px 12px;\n  cursor: pointer;\n  font-size: 0.95rem;\n  color: var(--db-ink);\n  transition: background 0.15s, border-color 0.15s, transform 0.1s;\n}\n.dangdai-b1l1-vocab-embed .db-tile .db-tile-py {\n  display: block;\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.7rem;\n  color: var(--db-sage);\n  margin-top: 2px;\n}\n.dangdai-b1l1-vocab-embed .db-tile:hover:not(.db-matched):not(.db-selected) { border-color: var(--db-mustard); }\n.dangdai-b1l1-vocab-embed .db-tile.db-selected {\n  border-color: var(--db-oxblood);\n  background: var(--db-bone);\n}\n.dangdai-b1l1-vocab-embed .db-tile.db-matched {\n  border-color: var(--db-sage);\n  background: #eef2e9;\n  color: var(--db-sage);\n  cursor: default;\n}\n.dangdai-b1l1-vocab-embed .db-tile.db-wrong {\n  border-color: #b5453d;\n  background: #fbeceb;\n  animation: db-shake 0.3s;\n}\n@keyframes db-shake {\n  0%, 100% { transform: translateX(0); }\n  25% { transform: translateX(-4px); }\n  75% { transform: translateX(4px); }\n}\n.dangdai-b1l1-vocab-embed .db-game-win {\n  text-align: center;\n  padding: 14px;\n  font-family: 'Bitter', serif;\n  color: var(--db-oxblood-dark);\n  display: none;\n}\n.dangdai-b1l1-vocab-embed .db-game-win.db-show { display: block; }\n@media (max-width: 480px) {\n  .dangdai-b1l1-vocab-embed .db-game-board { grid-template-columns: 1fr; }\n}\n\n.dangdai-b1l1-vocab-embed .db-dialogue-note {\n  font-size: 0.85rem;\n  color: #6b5f52;\n  margin: 0 0 10px;\n}\n.dangdai-b1l1-vocab-embed .db-fc-hint {\n  font-size: 0.85rem;\n  color: #6b5f52;\n  margin: 0 0 12px;\n  text-align: center;\n}\n.dangdai-b1l1-vocab-embed .db-flashcard-wrap {\n  max-width: 320px;\n  margin: 0 auto 14px;\n  perspective: 1200px;\n}\n.dangdai-b1l1-vocab-embed .db-flashcard {\n  position: relative;\n  width: 100%;\n  height: 230px;\n  cursor: pointer;\n  transform-style: preserve-3d;\n  transition: transform 0.5s;\n}\n.dangdai-b1l1-vocab-embed .db-flashcard.db-flipped { transform: rotateY(180deg); }\n.dangdai-b1l1-vocab-embed .db-fc-face {\n  position: absolute;\n  inset: 0;\n  backface-visibility: hidden;\n  border: 1px solid var(--db-line);\n  border-radius: 12px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 16px;\n  background: #fff;\n  text-align: center;\n}\n.dangdai-b1l1-vocab-embed .db-fc-back {\n  transform: rotateY(180deg);\n  background: var(--db-bone);\n}\n.dangdai-b1l1-vocab-embed .db-fc-front .db-hanzi { font-size: 4rem !important; }\n.dangdai-b1l1-vocab-embed .db-flashcard-wrap rt { font-size: 1.2rem !important; }\n.dangdai-b1l1-vocab-embed .db-fc-back .db-meaning {\n  font-style: italic;\n  color: var(--db-oxblood-dark);\n  font-size: 1.725rem;\n}\n.dangdai-b1l1-vocab-embed .db-flashcard-controls {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 14px;\n  margin-bottom: 28px;\n}\n.dangdai-b1l1-vocab-embed .db-quiz {\n  background: #fff;\n  border: 1px solid var(--db-line);\n  border-radius: 12px;\n  padding: 20px 22px;\n  margin-top: 8px;\n}\n.dangdai-b1l1-vocab-embed .db-quiz-progress { font-size: 0.82rem; color: var(--db-sage); margin: 0 0 10px; font-family: 'IBM Plex Mono', monospace; }\n.dangdai-b1l1-vocab-embed .db-quiz-prompt { font-size: 1.1rem; margin: 0 0 14px; }\n.dangdai-b1l1-vocab-embed .db-quiz-options { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; }\n.dangdai-b1l1-vocab-embed .db-quiz-opt {\n  text-align: left;\n  border: 1px solid var(--db-line);\n  background: var(--db-bone);\n  border-radius: 8px;\n  padding: 10px 14px;\n  cursor: pointer;\n  font-size: 0.98rem;\n  color: var(--db-ink);\n}\n.dangdai-b1l1-vocab-embed .db-quiz-opt:hover { background: #f0e6d2; }\n.dangdai-b1l1-vocab-embed .db-quiz-opt.correct { background: #e3efdd; border-color: #7fae6d; color: #3d5c34; }\n.dangdai-b1l1-vocab-embed .db-quiz-opt.incorrect { background: #f5e0dc; border-color: var(--db-oxblood); color: var(--db-oxblood-dark); }\n.dangdai-b1l1-vocab-embed .db-quiz-opt[disabled] { cursor: default; }\n.dangdai-b1l1-vocab-embed .db-quiz-input-row { display: flex; gap: 8px; margin: 0 0 10px; flex-wrap: wrap; }\n.dangdai-b1l1-vocab-embed .db-quiz-input { flex: 1 1 200px; border: 1px solid var(--db-line); border-radius: 8px; padding: 9px 12px; font-size: 0.98rem; }\n.dangdai-b1l1-vocab-embed .db-quiz-submit,\n.dangdai-b1l1-vocab-embed .db-quiz-next,\n.dangdai-b1l1-vocab-embed .db-quiz-retake {\n  border: none;\n  background: var(--db-oxblood);\n  color: #fff;\n  border-radius: 20px;\n  padding: 8px 18px;\n  font-size: 0.9rem;\n  cursor: pointer;\n}\n.dangdai-b1l1-vocab-embed .db-quiz-submit:hover,\n.dangdai-b1l1-vocab-embed .db-quiz-next:hover,\n.dangdai-b1l1-vocab-embed .db-quiz-retake:hover { background: var(--db-oxblood-dark); }\n.dangdai-b1l1-vocab-embed .db-quiz-feedback { font-size: 0.95rem; margin: 0 0 10px; min-height: 1.4em; }\n.dangdai-b1l1-vocab-embed .db-quiz-feedback.correct { color: #3d5c34; }\n.dangdai-b1l1-vocab-embed .db-quiz-feedback.incorrect { color: var(--db-oxblood-dark); }\n.dangdai-b1l1-vocab-embed .db-quiz-score { text-align: center; }\n.dangdai-b1l1-vocab-embed .db-quiz-score .db-quiz-score-num { font-size: 2.2rem; font-weight: 700; color: var(--db-oxblood-dark); display: block; margin-bottom: 8px; font-family: 'Bitter', serif; }\n<\/style>\n\n<p class=\"db-support-note\"><em>A note before you start: I&#8217;d love for you to support the official textbook \u2014 this page is only meant as a review tool for people who already own a copy, not a replacement for it.<\/em><\/p>\n\n<p class=\"db-lede\">\n<b><span class=\"lang-zh-TW\">\u7576\u4ee3\u4e2d\u6587\u8ab2\u7a0b<\/span><span class=\"lang-zh-CN\">\u5f53\u4ee3\u4e2d\u6587\u8bfe\u7a0b<\/span> Book 1 \u00b7 Lesson 1\u300c<span class=\"lang-zh-TW\">\u6b61\u8fce\u4f60\u4f86\u81fa\u7063\uff01<\/span><span class=\"lang-zh-CN\">\u6b22\u8fce\u4f60\u6765\u53f0\u6e7e\uff01<\/span>\u300dWelcome to Taiwan<\/b> \u2014 the vocabulary from this lesson, with pinyin, meaning, and an example sentence for every word, segmented word by word (not one pinyin block per sentence) so you can see how each piece works on its own.\n<\/p>\n\n<div class=\"db-sec-eyebrow\">01 \u2014 PEOPLE &amp; TITLES<\/div>\n<div id=\"db-word-list-1\"><\/div>\n\n<div class=\"db-sec-eyebrow\">02 \u2014 NATIONALITIES &amp; PLACE<\/div>\n<div id=\"db-word-list-2\"><\/div>\n\n<div class=\"db-sec-eyebrow\">03 \u2014 CORE VERBS &amp; PARTICLES<\/div>\n<div id=\"db-word-list-3\"><\/div>\n\n<div class=\"db-sec-eyebrow\">04 \u2014 GREETINGS &amp; POLITE SPEECH<\/div>\n<div id=\"db-word-list-4\"><\/div>\n\n<div class=\"db-sec-eyebrow\">05 \u2014 DRINKS<\/div>\n<div id=\"db-word-list-5\"><\/div>\n\n<div class=\"db-sec-eyebrow\">06 \u2014 PUT IT TOGETHER<\/div>\n<p class=\"db-dialogue-note\"><em>Note: this dialogue is not from the textbook \u2014 it&#8217;s a short conversation I made up using the vocabulary above so you can see the words used together. For the actual Lesson 1 dialogue, I&#8217;d recommend picking up a copy of the textbook itself.<\/em><\/p>\n<div class=\"db-dialogue\" id=\"db-dialogue\"><\/div>\n\n<div class=\"db-sec-eyebrow\">07 \u2014 FLASHCARDS<\/div>\n<p class=\"db-fc-hint\">Tap the card to flip it, then use the arrows to move through the deck.<\/p>\n<div class=\"db-flashcard-wrap\">\n  <div class=\"db-flashcard\" id=\"db-flashcard\">\n    <div class=\"db-fc-face db-fc-front\" id=\"db-fc-front\"><\/div>\n    <div class=\"db-fc-face db-fc-back\" id=\"db-fc-back\"><\/div>\n  <\/div>\n<\/div>\n<div class=\"db-flashcard-controls\">\n  <button class=\"db-game-btn\" id=\"db-fc-prev\">\u2039 Prev<\/button>\n  <span class=\"db-game-status\" id=\"db-fc-progress\">1 \/ 33<\/span>\n  <button class=\"db-game-btn\" id=\"db-fc-next\">Next \u203a<\/button>\n<\/div>\n\n<div class=\"db-sec-eyebrow\">08 \u2014 MATCH IT<\/div>\n<p style=\"font-size:0.9rem;color:#6b5f52;margin:0 0 10px;\">Tap a Chinese word, then tap the English meaning that matches it. Get all 8 pairs to finish the round.<\/p>\n<div class=\"db-game-bar\">\n  <button class=\"db-game-btn\" id=\"db-game-new\">New Round<\/button>\n  <span class=\"db-game-status\" id=\"db-game-status\">0 \/ 8 matched<\/span>\n<\/div>\n<div class=\"db-game-board\">\n  <div class=\"db-game-col\" id=\"db-game-col-zh\"><\/div>\n  <div class=\"db-game-col\" id=\"db-game-col-en\"><\/div>\n<\/div>\n<div class=\"db-game-win\" id=\"db-game-win\">\ud83c\udf89 All matched! Nice work.<\/div>\n\n<div class=\"db-sec-eyebrow\">09 \u2014 VOCABULARY QUIZ<\/div>\n<p style=\"font-size:0.9rem;color:#6b5f52;margin:0 0 10px;\">15 questions covering this lesson&#8217;s vocabulary \u2014 a mix of multiple choice and type-the-answer.<\/p>\n<div class=\"db-quiz\" id=\"db-quiz\"><\/div>\n\n<script>\n(function () {\n  var root = document.getElementById('dangdai-b1l1-vocab-embed-1');\n  if (!root) return;\n\n  var SPEAKER_SVG = '<svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"currentColor\" aria-hidden=\"true\">' +\n    '<path d=\"M7 4.5v15l13-7.5z\"><\/path>' +\n    '<\/svg>';\n\n  \/\/ W(trad, simp, pinyin) = one word token, same pinyin shown for both scripts.\n  function W(t, s, p) { return { t: t, s: s, pt: p, ps: p }; }\n  \/\/ WD(trad, simp, pinyin_trad, pinyin_simp) = one word token where Taiwan\n  \/\/ and mainland pronunciation genuinely differ (e.g. neutral-tone\n  \/\/ conventions: Taiwan keeps the full tone mark, mainland uses a light\/\n  \/\/ neutral tone with no mark on that syllable) \u2014 use this instead of W()\n  \/\/ whenever the two scripts' pinyin aren't identical.\n  function WD(t, s, pt, ps) { return { t: t, s: s, pt: pt, ps: ps }; }\n\n  \/\/ Word entries: { t, s, p, meaning, ex: [W(...), '\uff0c', W(...), ...], exEn }\n  \/\/ Punctuation is a plain string token (same for both scripts), never ruby.\n  var GROUPS = {\n    'db-word-list-1': [\n      { t: '\u5148\u751f', s: '\u5148\u751f', pt: 'xi\u0101nsh\u0113ng', ps: 'xi\u0101nsheng', meaning: 'Mr.; sir',\n        ex: [W('\u9673','\u9648','Ch\u00e9n'), WD('\u5148\u751f','\u5148\u751f','xi\u0101nsh\u0113ng','xi\u0101nsheng'), W('\u662f','\u662f','sh\u00ec'), W('\u8001\u5e2b','\u8001\u5e08','l\u01ceosh\u012b'), '\u3002'],\n        exEn: 'Mr. Chen is a teacher.' },\n      { t: '\u5c0f\u59d0', s: '\u5c0f\u59d0', p: 'xi\u01ceoji\u011b', meaning: 'Miss; young lady',\n        ex: [W('\u738b','\u738b','W\u00e1ng'), W('\u5c0f\u59d0','\u5c0f\u59d0','xi\u01ceoji\u011b'), W('\u5f88','\u5f88','h\u011bn'), W('\u5fd9','\u5fd9','m\u00e1ng'), '\u3002'],\n        exEn: 'Miss Wang is very busy.' },\n      { t: '\u4f60', s: '\u4f60', p: 'n\u01d0', meaning: 'you',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u597d','\u597d','h\u01ceo'), W('\u55ce','\u5417','ma'), '\uff1f'],\n        exEn: 'How are you?' },\n      { t: '\u6211', s: '\u6211', p: 'w\u01d2', meaning: 'I; me',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d','\u597d','h\u01ceo'), '\u3002'],\n        exEn: \"I'm doing well.\" },\n      { t: '\u8001\u5e2b', s: '\u8001\u5e08', p: 'l\u01ceosh\u012b', meaning: 'teacher',\n        ex: [W('\u4ed6','\u4ed6','t\u0101'), W('\u662f','\u662f','sh\u00ec'), W('\u8001\u5e2b','\u8001\u5e08','l\u01ceosh\u012b'), '\u3002'],\n        exEn: 'He is a teacher.' },\n      { t: '\u5b78\u751f', s: '\u5b66\u751f', p: 'xu\u00e9sh\u0113ng', meaning: 'student',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u662f','\u662f','sh\u00ec'), W('\u5b78\u751f','\u5b66\u751f','xu\u00e9sh\u0113ng'), '\u3002'],\n        exEn: 'I am a student.' }\n    ],\n    'db-word-list-2': [\n      { t: '\u7f8e\u570b\u4eba', s: '\u7f8e\u56fd\u4eba', p: 'm\u011bigu\u00f3r\u00e9n', meaning: 'American (person)',\n        ex: [W('\u738b','\u738b','W\u00e1ng'), W('\u5c0f\u59d0','\u5c0f\u59d0','xi\u01ceoji\u011b'), W('\u662f','\u662f','sh\u00ec'), W('\u7f8e\u570b\u4eba','\u7f8e\u56fd\u4eba','M\u011bigu\u00f3r\u00e9n'), '\u3002'],\n        exEn: 'Miss Wang is American.' },\n      { t: '\u4e2d\u570b\u4eba', s: '\u4e2d\u56fd\u4eba', p: 'zh\u014dnggu\u00f3r\u00e9n', meaning: 'Chinese (person)',\n        ex: [W('\u4ed6','\u4ed6','t\u0101'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u662f','\u662f','sh\u00ec'), W('\u4e2d\u570b\u4eba','\u4e2d\u56fd\u4eba','Zh\u014dnggu\u00f3r\u00e9n'), '\u3002'],\n        exEn: \"He isn't Chinese.\" },\n      { t: '\u65e5\u672c\u4eba', s: '\u65e5\u672c\u4eba', p: 'r\u00ecb\u011bnr\u00e9n', meaning: 'Japanese (person)',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u662f','\u662f','sh\u00ec'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u662f','\u662f','sh\u00ec'), W('\u65e5\u672c\u4eba','\u65e5\u672c\u4eba','R\u00ecb\u011bnr\u00e9n'), '\uff1f'],\n        exEn: 'Are you Japanese?' },\n      { t: '\u81fa\u7063', s: '\u53f0\u6e7e', p: 't\u00e1iw\u0101n', meaning: 'Taiwan',\n        ex: [W('\u6b61\u8fce','\u6b22\u8fce','Hu\u0101ny\u00edng'), W('\u4f60','\u4f60','n\u01d0'), W('\u4f86','\u6765','l\u00e1i'), W('\u81fa\u7063','\u53f0\u6e7e','T\u00e1iw\u0101n'), '\uff01'],\n        exEn: 'Welcome to Taiwan!' }\n    ],\n    'db-word-list-3': [\n      { t: '\u662f', s: '\u662f', p: 'sh\u00ec', meaning: 'to be',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u662f','\u662f','sh\u00ec'), W('\u5b78\u751f','\u5b66\u751f','xu\u00e9sh\u0113ng'), '\u3002'],\n        exEn: 'I am a student.' },\n      { t: '\u4e0d', s: '\u4e0d', p: 'b\u00f9', meaning: 'not',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u5fd9','\u5fd9','m\u00e1ng'), '\u3002'],\n        exEn: \"I'm not busy.\" },\n      { t: '\u55ce', s: '\u5417', p: 'ma', meaning: '(question particle)',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u5fd9','\u5fd9','m\u00e1ng'), W('\u55ce','\u5417','ma'), '\uff1f'],\n        exEn: 'Are you busy?' },\n      { t: '\u5462', s: '\u5462', p: 'ne', meaning: '(question particle, \"and...?\")',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d','\u597d','h\u01ceo'), '\uff0c', W('\u4f60','\u4f60','n\u01d0'), W('\u5462','\u5462','ne'), '\uff1f'],\n        exEn: \"I'm well, and you?\" },\n      { t: '\u4e5f', s: '\u4e5f', p: 'y\u011b', meaning: 'also',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u4e5f','\u4e5f','y\u011b'), W('\u662f','\u662f','sh\u00ec'), W('\u5b78\u751f','\u5b66\u751f','xu\u00e9sh\u0113ng'), '\u3002'],\n        exEn: 'I am also a student.' },\n      { t: '\u5f88', s: '\u5f88', p: 'h\u011bn', meaning: 'very',\n        ex: [W('\u70cf\u9f8d\u8336','\u4e4c\u9f99\u8336','W\u016bl\u00f3ngch\u00e1'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u559d','\u597d\u559d','h\u01ceoh\u0113'), '\u3002'],\n        exEn: 'Oolong tea is very tasty.' },\n      { t: '\u597d', s: '\u597d', p: 'h\u01ceo', meaning: 'good',\n        ex: [W('\u597d','\u597d','H\u01ceo'), '\uff0c', W('\u8b1d\u8b1d','\u8c22\u8c22','xi\u00e8xie'), W('\u4f60','\u4f60','n\u01d0'), '\u3002'],\n        exEn: 'Good, thank you.' },\n      { t: '\u5fd9', s: '\u5fd9', p: 'm\u00e1ng', meaning: 'busy',\n        ex: [W('\u8001\u5e2b','\u8001\u5e08','L\u01ceosh\u012b'), W('\u5f88','\u5f88','h\u011bn'), W('\u5fd9','\u5fd9','m\u00e1ng'), '\u3002'],\n        exEn: 'The teacher is very busy.' },\n      { t: '\u8981', s: '\u8981', p: 'y\u00e0o', meaning: 'to want',\n        ex: [W('\u738b','\u738b','W\u00e1ng'), WD('\u5148\u751f','\u5148\u751f','xi\u0101nsh\u0113ng','xi\u0101nsheng'), W('\u8981','\u8981','y\u00e0o'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u8981','\u8981','y\u00e0o'), W('\u559d','\u559d','h\u0113'), W('\u5496\u5561','\u5496\u5561','k\u0101f\u0113i'), '?'],\n        exEn: 'Does Mr. Wang want to drink coffee?' },\n      { t: '\u4e0d\u8981', s: '\u4e0d\u8981', p: 'b\u00fay\u00e0o', meaning: \"don't want\",\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u4e0d\u8981','\u4e0d\u8981','b\u00fay\u00e0o'), W('\u559d','\u559d','h\u0113'), W('\u5496\u5561','\u5496\u5561','k\u0101f\u0113i'), '\u3002'],\n        exEn: \"I don't want to drink coffee.\" },\n      { t: '\u559c\u6b61', s: '\u559c\u6b22', pt: 'x\u01d0hu\u0101n', ps: 'x\u01d0huan', meaning: 'to like',\n        ex: [W('\u81fa\u7063\u4eba','\u53f0\u6e7e\u4eba','T\u00e1iw\u0101nr\u00e9n'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u4e0d','\u4e0d','b\u00f9'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u559d','\u559d','h\u0113'), W('\u8336','\u8336','ch\u00e1'), '\uff1f'],\n        exEn: 'Do Taiwanese people like drinking tea?' }\n    ],\n    'db-word-list-4': [\n      { t: '\u6b61\u8fce', s: '\u6b22\u8fce', p: 'hu\u0101ny\u00edng', meaning: 'to welcome',\n        ex: [W('\u6b61\u8fce','\u6b22\u8fce','Hu\u0101ny\u00edng'), W('\u4f60','\u4f60','n\u01d0'), W('\u4f86','\u6765','l\u00e1i'), W('\u81fa\u7063','\u53f0\u6e7e','T\u00e1iw\u0101n'), '\u3002'],\n        exEn: 'Welcome to Taiwan.' },\n      { t: '\u4f86', s: '\u6765', p: 'l\u00e1i', meaning: 'to come',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u4f86','\u6765','l\u00e1i'), W('\u81fa\u7063','\u53f0\u6e7e','T\u00e1iw\u0101n'), W('\u4e86','\u4e86','le'), '\uff01'],\n        exEn: \"You've come to Taiwan!\" },\n      { t: '\u8acb\u554f', s: '\u8bf7\u95ee', p: 'q\u01d0ngw\u00e8n', meaning: 'excuse me; may I ask',\n        ex: [W('\u8acb\u554f','\u8bf7\u95ee','Q\u01d0ngw\u00e8n'), '\uff0c', W('\u4f60','\u4f60','n\u01d0'), W('\u8cb4\u59d3','\u8d35\u59d3','gu\u00ecx\u00ecng'), '\uff1f'],\n        exEn: 'Excuse me, what is your surname?' },\n      { t: '\u8cb4\u59d3', s: '\u8d35\u59d3', p: 'gu\u00ecx\u00ecng', meaning: 'your (honorable) surname',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u8cb4\u59d3','\u8d35\u59d3','gu\u00ecx\u00ecng'), '\uff1f'],\n        exEn: 'May I ask your surname?' },\n      { t: '\u53eb', s: '\u53eb', p: 'ji\u00e0o', meaning: 'to be called',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u53eb','\u53eb','ji\u00e0o'), W('\u738b','\u738b','W\u00e1ng'), W('\u958b\u6587','\u5f00\u6587','K\u0101iw\u00e9n'), '\u3002'],\n        exEn: 'My name is Wang Kaiwen.' },\n      { t: '\u540d\u5b57', s: '\u540d\u5b57', p: 'm\u00edngzi', meaning: 'name',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u7684','\u7684','de'), W('\u540d\u5b57','\u540d\u5b57','m\u00edngzi'), W('\u662f','\u662f','sh\u00ec'), W('\u4ec0\u9ebc','\u4ec0\u4e48','sh\u00e9nme'), '\uff1f'],\n        exEn: \"What's your name?\" },\n      { t: '\u8b1d\u8b1d', s: '\u8c22\u8c22', p: 'xi\u00e8xie', meaning: 'thank you',\n        ex: [W('\u8b1d\u8b1d','\u8c22\u8c22','Xi\u00e8xie'), W('\u4f60','\u4f60','n\u01d0'), '\uff01'],\n        exEn: 'Thank you!' }\n    ],\n    'db-word-list-5': [\n      { t: '\u559d', s: '\u559d', p: 'h\u0113', meaning: 'to drink',\n        ex: [W('\u4f60','\u4f60','n\u01d0'), W('\u8981','\u8981','y\u00e0o'), W('\u559d','\u559d','h\u0113'), W('\u4ec0\u9ebc','\u4ec0\u4e48','sh\u00e9nme'), '\uff1f'],\n        exEn: 'What would you like to drink?' },\n      { t: '\u8336', s: '\u8336', p: 'ch\u00e1', meaning: 'tea',\n        ex: [W('\u6211','\u6211','w\u01d2'), W('\u5f88','\u5f88','h\u011bn'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u559d','\u559d','h\u0113'), W('\u8336','\u8336','ch\u00e1'), '\u3002'],\n        exEn: 'I really like drinking tea.' },\n      { t: '\u5496\u5561', s: '\u5496\u5561', p: 'k\u0101f\u0113i', meaning: 'coffee',\n        ex: [W('\u738b','\u738b','W\u00e1ng'), WD('\u5148\u751f','\u5148\u751f','xi\u0101nsh\u0113ng','xi\u0101nsheng'), W('\u8981','\u8981','y\u00e0o'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u8981','\u8981','y\u00e0o'), W('\u559d','\u559d','h\u0113'), W('\u5496\u5561','\u5496\u5561','k\u0101f\u0113i'), '\uff1f'],\n        exEn: 'Does Mr. Wang want to drink coffee?' },\n      { t: '\u70cf\u9f8d\u8336', s: '\u4e4c\u9f99\u8336', p: 'w\u016bl\u00f3ngch\u00e1', meaning: 'oolong tea',\n        ex: [W('\u70cf\u9f8d\u8336','\u4e4c\u9f99\u8336','W\u016bl\u00f3ngch\u00e1'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u559d','\u597d\u559d','h\u01ceoh\u0113'), '\u3002'],\n        exEn: 'Oolong tea is delicious.' },\n      { t: '\u597d\u559d', s: '\u597d\u559d', p: 'h\u01ceoh\u0113', meaning: 'tasty (of drinks)',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u676f','\u676f','b\u0113i'), W('\u5496\u5561','\u5496\u5561','k\u0101f\u0113i'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u559d','\u597d\u559d','h\u01ceoh\u0113'), '\u3002'],\n        exEn: 'This cup of coffee is delicious.' }\n    ]\n  };\n\n  \/\/ Dialogue: each line has a speaker (trad\/simp) and a token sentence.\n  var DIALOGUE = [\n    { speakerT: '\u9673\u5148\u751f', speakerS: '\u9648\u5148\u751f',\n      tokens: [W('\u8acb\u554f','\u8bf7\u95ee','Q\u01d0ngw\u00e8n'), '\uff0c', W('\u4f60','\u4f60','n\u01d0'), W('\u662f','\u662f','sh\u00ec'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u662f','\u662f','sh\u00ec'), W('\u65e5\u672c\u4eba','\u65e5\u672c\u4eba','R\u00ecb\u011bnr\u00e9n'), '\uff1f'],\n      en: 'Excuse me, are you Japanese?' },\n    { speakerT: '\u738b\u5c0f\u59d0', speakerS: '\u738b\u5c0f\u59d0',\n      tokens: [W('\u4e0d','\u4e0d','B\u00fa'), W('\u662f','\u662f','sh\u00ec'), '\uff0c', W('\u6211','\u6211','w\u01d2'), W('\u662f','\u662f','sh\u00ec'), W('\u7f8e\u570b\u4eba','\u7f8e\u56fd\u4eba','M\u011bigu\u00f3r\u00e9n'), '\u3002', W('\u4f60','\u4f60','n\u01d0'), W('\u5462','\u5462','ne'), '\uff1f'],\n      en: \"No, I'm American. And you?\" },\n    { speakerT: '\u9673\u5148\u751f', speakerS: '\u9648\u5148\u751f',\n      tokens: [W('\u6211','\u6211','W\u01d2'), W('\u662f','\u662f','sh\u00ec'), W('\u81fa\u7063\u4eba','\u53f0\u6e7e\u4eba','T\u00e1iw\u0101nr\u00e9n'), '\u3002', W('\u6b61\u8fce','\u6b22\u8fce','Hu\u0101ny\u00edng'), W('\u4f60','\u4f60','n\u01d0'), W('\u4f86','\u6765','l\u00e1i'), W('\u81fa\u7063','\u53f0\u6e7e','T\u00e1iw\u0101n'), '\uff01', W('\u4f60','\u4f60','n\u01d0'), W('\u8981','\u8981','y\u00e0o'), W('\u4e0d','\u4e0d','b\u00f9'), W('\u8981','\u8981','y\u00e0o'), W('\u559d','\u559d','h\u0113'), W('\u8336','\u8336','ch\u00e1'), '\uff1f'],\n      en: \"I'm Taiwanese. Welcome to Taiwan! Would you like some tea?\" },\n    { speakerT: '\u738b\u5c0f\u59d0', speakerS: '\u738b\u5c0f\u59d0',\n      tokens: [W('\u597d','\u597d','H\u01ceo'), '\uff0c', W('\u8b1d\u8b1d','\u8c22\u8c22','xi\u00e8xie'), '\uff01', W('\u6211','\u6211','W\u01d2'), W('\u5f88','\u5f88','h\u011bn'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u559d','\u559d','h\u0113'), W('\u70cf\u9f8d\u8336','\u4e4c\u9f99\u8336','w\u016bl\u00f3ngch\u00e1'), '\uff0c', W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u559d','\u597d\u559d','h\u01ceoh\u0113'), '\u3002'],\n      en: \"Great, thanks! I really like oolong tea, it's delicious.\" }\n  ];\n\n  var ALL_WORDS = [];\n  Object.keys(GROUPS).forEach(function (k) {\n    GROUPS[k].forEach(function (w) { ALL_WORDS.push(w); });\n  });\n\n  function rubyWord(w) {\n    return '<span class=\"db-sent-word\">' +\n      '<ruby class=\"lang-zh-TW\"><span class=\"rb\">' + w.t + '<\/span><rt>' + w.pt + '<\/rt><\/ruby>' +\n      '<ruby class=\"lang-zh-CN\"><span class=\"rb\">' + w.s + '<\/span><rt>' + w.ps + '<\/rt><\/ruby>' +\n      '<\/span>';\n  }\n\n  function renderTokens(tokens) {\n    var html = '';\n    tokens.forEach(function (tok) {\n      if (typeof tok === 'string') {\n        html += '<span class=\"db-punct\">' + tok + '<\/span>';\n      } else {\n        html += rubyWord(tok);\n      }\n    });\n    return html;\n  }\n\n  function headwordRuby(t, s, pt, ps) {\n    return '<ruby class=\"lang-zh-TW\"><span class=\"rb\">' + t + '<\/span><rt>' + pt + '<\/rt><\/ruby>' +\n           '<ruby class=\"lang-zh-CN\"><span class=\"rb\">' + s + '<\/span><rt>' + ps + '<\/rt><\/ruby>';\n  }\n\n  var counter = 0;\n  Object.keys(GROUPS).forEach(function (containerId) {\n    var container = root.querySelector('#' + containerId);\n    if (!container) return;\n    var html = '';\n    GROUPS[containerId].forEach(function (w) {\n      counter++;\n      var num = (counter < 10 ? '0' : '') + counter;\n      html += '<div class=\"db-word-card\">' +\n        '<div class=\"db-word-top\">' +\n          '<span class=\"db-num\">' + num + '<\/span>' +\n          '<span class=\"db-hanzi\">' + headwordRuby(w.t, w.s, w.pt || w.p, w.ps || w.p) + '<\/span>' +\n          '<span class=\"db-meaning\">' + w.meaning + '<\/span>' +\n          '<button class=\"db-speaker\" data-trad=\"' + w.t + '\" data-simp=\"' + w.s + '\" aria-label=\"Play pronunciation\">' + SPEAKER_SVG + '<\/button>' +\n        '<\/div>' +\n        '<div class=\"db-example\">' +\n          renderTokens(w.ex) +\n          '<span class=\"db-en\">' + w.exEn + '<\/span>' +\n        '<\/div>' +\n      '<\/div>';\n    });\n    container.innerHTML = html;\n  });\n\n  var dialogueEl = root.querySelector('#db-dialogue');\n  if (dialogueEl) {\n    var dHtml = '';\n    DIALOGUE.forEach(function (line) {\n      dHtml += '<div class=\"db-line\">' +\n        '<span class=\"db-speaker-tag\">' +\n          '<span class=\"lang-zh-TW\">' + line.speakerT + '<\/span>' +\n          '<span class=\"lang-zh-CN\">' + line.speakerS + '<\/span>' +\n        '<\/span>' +\n        '<span class=\"db-line-body\">' +\n          renderTokens(line.tokens) +\n          '<span class=\"db-line-en\">' + line.en + '<\/span>' +\n        '<\/span>' +\n      '<\/div>';\n    });\n    dialogueEl.innerHTML = dHtml;\n  }\n\n  \/\/ ---- Flashcards ----\n  var fcCard = root.querySelector('#db-flashcard');\n  var fcFront = root.querySelector('#db-fc-front');\n  var fcBack = root.querySelector('#db-fc-back');\n  var fcProgress = root.querySelector('#db-fc-progress');\n  var fcPrevBtn = root.querySelector('#db-fc-prev');\n  var fcNextBtn = root.querySelector('#db-fc-next');\n  var fcIndex = 0;\n  var fcFlipped = false;\n\n  function renderFlashcard() {\n    var w = ALL_WORDS[fcIndex];\n    if (!w || !fcFront || !fcBack) return;\n    fcFront.innerHTML = '<span class=\"db-hanzi\">' + headwordRuby(w.t, w.s, w.pt || w.p, w.ps || w.p) + '<\/span>';\n    fcBack.innerHTML = '<span class=\"db-meaning\">' + w.meaning + '<\/span>';\n    if (fcProgress) fcProgress.textContent = (fcIndex + 1) + ' \/ ' + ALL_WORDS.length;\n    if (fcCard) fcCard.classList.remove('db-flipped');\n    fcFlipped = false;\n  }\n\n  if (fcCard) {\n    fcCard.addEventListener('click', function () {\n      fcFlipped = !fcFlipped;\n      fcCard.classList.toggle('db-flipped', fcFlipped);\n    });\n  }\n  if (fcPrevBtn) fcPrevBtn.addEventListener('click', function () {\n    fcIndex = (fcIndex - 1 + ALL_WORDS.length) % ALL_WORDS.length;\n    renderFlashcard();\n  });\n  if (fcNextBtn) fcNextBtn.addEventListener('click', function () {\n    fcIndex = (fcIndex + 1) % ALL_WORDS.length;\n    renderFlashcard();\n  });\n  renderFlashcard();\n\n  \/\/ ---- Match It game ----\n  var gameColZh = root.querySelector('#db-game-col-zh');\n  var gameColEn = root.querySelector('#db-game-col-en');\n  var gameStatus = root.querySelector('#db-game-status');\n  var gameWin = root.querySelector('#db-game-win');\n  var gameNewBtn = root.querySelector('#db-game-new');\n  var gameRound = [];\n  var gameSelectedZh = null;\n  var gameSelectedEn = null;\n  var gameMatchedCount = 0;\n  var gameBusy = false;\n\n  function shuffle(arr) {\n    var a = arr.slice();\n    for (var i = a.length - 1; i > 0; i--) {\n      var j = Math.floor(Math.random() * (i + 1));\n      var tmp = a[i]; a[i] = a[j]; a[j] = tmp;\n    }\n    return a;\n  }\n\n  function startRound() {\n    gameRound = shuffle(ALL_WORDS).slice(0, 8);\n    gameSelectedZh = null;\n    gameSelectedEn = null;\n    gameMatchedCount = 0;\n    gameBusy = false;\n    if (gameWin) gameWin.classList.remove('db-show');\n\n    var zhOrder = shuffle(gameRound);\n    var enOrder = shuffle(gameRound);\n\n    gameColZh.innerHTML = zhOrder.map(function (w, i) {\n      return '<button class=\"db-tile\" data-id=\"' + w.t + '\" data-side=\"zh\">' +\n        '<span class=\"lang-zh-TW\">' + w.t + '<\/span><span class=\"lang-zh-CN\">' + w.s + '<\/span>' +\n        '<span class=\"db-tile-py\">' + w.p + '<\/span>' +\n      '<\/button>';\n    }).join('');\n\n    gameColEn.innerHTML = enOrder.map(function (w) {\n      return '<button class=\"db-tile\" data-id=\"' + w.t + '\" data-side=\"en\">' + w.meaning + '<\/button>';\n    }).join('');\n\n    updateGameStatus();\n  }\n\n  function updateGameStatus() {\n    if (gameStatus) gameStatus.textContent = gameMatchedCount + ' \/ ' + gameRound.length + ' matched';\n  }\n\n  function handleTileClick(tile) {\n    if (gameBusy || tile.classList.contains('db-matched')) return;\n    var side = tile.getAttribute('data-side');\n\n    if (side === 'zh') {\n      if (gameSelectedZh) gameSelectedZh.classList.remove('db-selected');\n      gameSelectedZh = tile;\n      tile.classList.add('db-selected');\n    } else {\n      if (gameSelectedEn) gameSelectedEn.classList.remove('db-selected');\n      gameSelectedEn = tile;\n      tile.classList.add('db-selected');\n    }\n\n    if (gameSelectedZh) {\n      if (gameSelectedEn) {\n        var zhId = gameSelectedZh.getAttribute('data-id');\n        var enId = gameSelectedEn.getAttribute('data-id');\n        if (zhId === enId) {\n          gameSelectedZh.classList.remove('db-selected');\n          gameSelectedEn.classList.remove('db-selected');\n          gameSelectedZh.classList.add('db-matched');\n          gameSelectedEn.classList.add('db-matched');\n          gameMatchedCount++;\n          updateGameStatus();\n          gameSelectedZh = null;\n          gameSelectedEn = null;\n          var roundDone = (gameMatchedCount === gameRound.length);\n          if (roundDone) {\n            if (gameWin) {\n              gameWin.classList.add('db-show');\n            }\n          }\n        } else {\n          gameBusy = true;\n          var z = gameSelectedZh, en = gameSelectedEn;\n          z.classList.add('db-wrong');\n          en.classList.add('db-wrong');\n          setTimeout(function () {\n            z.classList.remove('db-selected', 'db-wrong');\n            en.classList.remove('db-selected', 'db-wrong');\n            gameBusy = false;\n          }, 400);\n          gameSelectedZh = null;\n          gameSelectedEn = null;\n        }\n      }\n    }\n  }\n\n  root.addEventListener('click', function (e) {\n    var tile = e.target.closest('.db-tile');\n    if (tile) {\n      if (root.contains(tile)) handleTileClick(tile);\n    }\n  });\n  if (gameNewBtn) gameNewBtn.addEventListener('click', startRound);\n\n  startRound();\n\n  \/\/ ---- Vocabulary Quiz (pattern matches the working occupations-page quiz) ----\n  var quizRoot = root.querySelector('#db-quiz');\n  var QUIZ_DATA = [\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u5148\u751f<\/span><span class=\"lang-zh-CN\">\u5148\u751f<\/span> means...', options: ['Mr.; sir', 'Miss; young lady', 'teacher', 'student'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u8001\u5e2b<\/span><span class=\"lang-zh-CN\">\u8001\u5e08<\/span>.', accept: ['laoshi'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u7f8e\u570b\u4eba<\/span><span class=\"lang-zh-CN\">\u7f8e\u56fd\u4eba<\/span> means...', options: ['American (person)', 'Chinese (person)', 'Japanese (person)', 'Taiwan'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for <span class=\"lang-zh-TW\">\u5b78\u751f<\/span><span class=\"lang-zh-CN\">\u5b66\u751f<\/span>.', accept: ['student'] },\n    { type: 'mc', prompt: 'Which word means \"not\"?', options: ['<span class=\"lang-zh-TW\">\u4e0d<\/span><span class=\"lang-zh-CN\">\u4e0d<\/span>', '<span class=\"lang-zh-TW\">\u4e5f<\/span><span class=\"lang-zh-CN\">\u4e5f<\/span>', '<span class=\"lang-zh-TW\">\u5f88<\/span><span class=\"lang-zh-CN\">\u5f88<\/span>', '<span class=\"lang-zh-TW\">\u55ce<\/span><span class=\"lang-zh-CN\">\u5417<\/span>'], answer: 0 },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u5fd9<\/span><span class=\"lang-zh-CN\">\u5fd9<\/span> means...', options: ['busy', 'good', 'tea', 'coffee'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u8981<\/span><span class=\"lang-zh-CN\">\u8981<\/span>.', accept: ['yao'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u4e0d\u8981<\/span><span class=\"lang-zh-CN\">\u4e0d\u8981<\/span> means...', options: [\"don't want\", 'to like', 'to welcome', 'to come'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for <span class=\"lang-zh-TW\">\u559c\u6b61<\/span><span class=\"lang-zh-CN\">\u559c\u6b22<\/span>.', accept: ['like', 'to like'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u6b61\u8fce<\/span><span class=\"lang-zh-CN\">\u6b22\u8fce<\/span> means...', options: ['to welcome', 'to come', 'thank you', 'excuse me'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u8acb\u554f<\/span><span class=\"lang-zh-CN\">\u8bf7\u95ee<\/span>.', accept: ['qingwen'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u8cb4\u59d3<\/span><span class=\"lang-zh-CN\">\u8d35\u59d3<\/span> means...', options: ['your (honorable) surname', 'name', 'thank you', 'welcome'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for <span class=\"lang-zh-TW\">\u8b1d\u8b1d<\/span><span class=\"lang-zh-CN\">\u8c22\u8c22<\/span>.', accept: ['thank you', 'thanks'] },\n    { type: 'mc', prompt: 'Which word means plain \"tea\" (not oolong specifically)?', options: ['<span class=\"lang-zh-TW\">\u8336<\/span><span class=\"lang-zh-CN\">\u8336<\/span>', '<span class=\"lang-zh-TW\">\u5496\u5561<\/span><span class=\"lang-zh-CN\">\u5496\u5561<\/span>', '<span class=\"lang-zh-TW\">\u70cf\u9f8d\u8336<\/span><span class=\"lang-zh-CN\">\u4e4c\u9f99\u8336<\/span>', '<span class=\"lang-zh-TW\">\u597d\u559d<\/span><span class=\"lang-zh-CN\">\u597d\u559d<\/span>'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u5496\u5561<\/span><span class=\"lang-zh-CN\">\u5496\u5561<\/span>.', accept: ['kafei'] }\n  ];\n\n  if (quizRoot) {\n    var quizCurrent = 0;\n    var quizScore = 0;\n    var quizAnswered = false;\n\n    function quizStripTones(s) {\n      return s.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '').toLowerCase().replace(\/[^a-z0-9]\/g, '');\n    }\n\n    function renderQuiz() {\n      if (quizCurrent >= QUIZ_DATA.length) { renderQuizScore(); return; }\n      var q = QUIZ_DATA[quizCurrent];\n      quizAnswered = false;\n      var html = '<p class=\"db-quiz-progress\">Question ' + (quizCurrent + 1) + ' of ' + QUIZ_DATA.length + '<\/p>';\n      html += '<p class=\"db-quiz-prompt\">' + q.prompt + '<\/p>';\n      if (q.type === 'mc') {\n        html += '<div class=\"db-quiz-options\">';\n        for (var i = 0; i < q.options.length; i++) {\n          html += '<button type=\"button\" class=\"db-quiz-opt\" data-i=\"' + i + '\">' + q.options[i] + '<\/button>';\n        }\n        html += '<\/div>';\n      } else {\n        html += '<div class=\"db-quiz-input-row\">';\n        html += '<input type=\"text\" class=\"db-quiz-input\" placeholder=\"Type your answer\">';\n        html += '<button type=\"button\" class=\"db-quiz-submit\">Submit<\/button>';\n        html += '<\/div>';\n      }\n      html += '<p class=\"db-quiz-feedback\"><\/p>';\n      html += '<button type=\"button\" class=\"db-quiz-next\" style=\"display:none;\">Next<\/button>';\n      quizRoot.innerHTML = html;\n\n      if (q.type === 'mc') {\n        var quizOpts = quizRoot.querySelectorAll('.db-quiz-opt');\n        quizOpts.forEach(function (btn) {\n          btn.addEventListener('click', function () {\n            if (quizAnswered) return;\n            quizAnswered = true;\n            var i = parseInt(this.getAttribute('data-i'), 10);\n            var correct = i === q.answer;\n            if (correct) quizScore++;\n            quizOpts.forEach(function (b, bi) {\n              b.setAttribute('disabled', 'disabled');\n              if (bi === q.answer) b.classList.add('correct');\n              else if (bi === i) b.classList.add('incorrect');\n            });\n            showQuizFeedback(correct);\n          });\n        });\n      } else {\n        var quizInput = quizRoot.querySelector('.db-quiz-input');\n        var quizSubmitBtn = quizRoot.querySelector('.db-quiz-submit');\n        var submitQuizAnswer = function () {\n          if (quizAnswered) return;\n          quizAnswered = true;\n          var val = quizStripTones(quizInput.value || '');\n          var correct = q.accept.indexOf(val) !== -1;\n          if (correct) quizScore++;\n          quizInput.setAttribute('disabled', 'disabled');\n          quizSubmitBtn.setAttribute('disabled', 'disabled');\n          showQuizFeedback(correct, q.accept[0]);\n        };\n        quizSubmitBtn.addEventListener('click', submitQuizAnswer);\n        quizInput.addEventListener('keydown', function (e) {\n          if (e.key === 'Enter') submitQuizAnswer();\n        });\n      }\n\n      function showQuizFeedback(correct, correctAnswer) {\n        var fb = quizRoot.querySelector('.db-quiz-feedback');\n        if (correct) {\n          fb.textContent = 'Correct!';\n        } else if (correctAnswer) {\n          fb.textContent = 'Not quite \u2014 the answer is \"' + correctAnswer + '\".';\n        } else {\n          fb.textContent = 'Not quite \u2014 check the highlighted answer above.';\n        }\n        fb.className = 'db-quiz-feedback ' + (correct ? 'correct' : 'incorrect');\n        var quizNextBtn = quizRoot.querySelector('.db-quiz-next');\n        quizNextBtn.style.display = 'inline-block';\n        quizNextBtn.addEventListener('click', function () {\n          quizCurrent++;\n          renderQuiz();\n        });\n      }\n    }\n\n    function renderQuizScore() {\n      quizRoot.innerHTML =\n        '<div class=\"db-quiz-score\">' +\n        '<span class=\"db-quiz-score-num\">' + quizScore + ' \/ ' + QUIZ_DATA.length + '<\/span>' +\n        '<p>Nice work! Want to try again?<\/p>' +\n        '<button type=\"button\" class=\"db-quiz-retake\">Retake Quiz<\/button>' +\n        '<\/div>';\n      quizRoot.querySelector('.db-quiz-retake').addEventListener('click', function () {\n        quizCurrent = 0;\n        quizScore = 0;\n        renderQuiz();\n      });\n    }\n\n    renderQuiz();\n  }\n})();\n<\/script>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium is-resized\"><a href=\"https:\/\/ko-fi.com\/tiffanystalk\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"58\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png\" alt=\"\" class=\"wp-image-570\" style=\"width:150px;height:29px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-600x115.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1024x197.png 1024w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-768x148.png 768w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1536x296.png 1536w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-2048x394.png 2048w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-850x164.png 850w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Do you like it? \ud83d\ude42<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium is-resized\"><a href=\"https:\/\/tiffanysmandarin.com\/index.php\/contemporary-chinese-book-1\/\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"86\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png\" alt=\"\" class=\"wp-image-571\" style=\"width:150px;height:43px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-600x171.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":10970,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_wp_convertkit_post_meta":{"form":"-1","landing_page":"0","tag":"0","restrict_content":"0"},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1099],"tags":[],"class_list":["post-12874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-1099"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>B1 L1 Vocabulary and Practice - OneDotDot Chinese<\/title>\n<meta name=\"description\" content=\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"B1 L1 Vocabulary and Practice - OneDotDot Chinese\" \/>\n<meta property=\"og:description\" content=\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/\" \/>\n<meta property=\"og:site_name\" content=\"OneDotDot Chinese\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-15T15:43:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-31T06:13:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"tiffany\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tiffany\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/\"},\"author\":{\"name\":\"tiffany\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"headline\":\"B1 L1 Vocabulary and Practice\",\"datePublished\":\"2025-07-15T15:43:42+00:00\",\"dateModified\":\"2026-08-31T06:13:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/\"},\"wordCount\":9,\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"articleSection\":[\"\u7576\u4ee3\u4e2d\u6587 1\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/\",\"name\":\"B1 L1 Vocabulary and Practice - OneDotDot Chinese\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"datePublished\":\"2025-07-15T15:43:42+00:00\",\"dateModified\":\"2026-08-31T06:13:25+00:00\",\"description\":\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"contentUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"width\":800,\"height\":300,\"caption\":\"\u7576\u4ee3\u4e2d\u65871\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"B1 L1 Vocabulary and Practice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\",\"name\":\"OneDotDot Chinese\",\"description\":\"Learn a little Chinese every day\",\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tiffanysmandarin.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\",\"name\":\"tiffany\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"url\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"contentUrl\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"width\":214,\"height\":214,\"caption\":\"tiffany\"},\"logo\":{\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/tiffanys_talk\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tiffany-huang-mandarin\\\/\"],\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/author\\\/tiffany\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"B1 L1 Vocabulary and Practice - OneDotDot Chinese","description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/","og_locale":"en_US","og_type":"article","og_title":"B1 L1 Vocabulary and Practice - OneDotDot Chinese","og_description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1","og_url":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/","og_site_name":"OneDotDot Chinese","article_published_time":"2025-07-15T15:43:42+00:00","article_modified_time":"2026-08-31T06:13:25+00:00","og_image":[{"width":800,"height":300,"url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","type":"image\/jpeg"}],"author":"tiffany","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tiffany","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#article","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/"},"author":{"name":"tiffany","@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"headline":"B1 L1 Vocabulary and Practice","datePublished":"2025-07-15T15:43:42+00:00","dateModified":"2026-08-31T06:13:25+00:00","mainEntityOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/"},"wordCount":9,"publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","articleSection":["\u7576\u4ee3\u4e2d\u6587 1"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/","url":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/","name":"B1 L1 Vocabulary and Practice - OneDotDot Chinese","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#primaryimage"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","datePublished":"2025-07-15T15:43:42+00:00","dateModified":"2026-08-31T06:13:25+00:00","description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e00\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 1","breadcrumb":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#primaryimage","url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","contentUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","width":800,"height":300,"caption":"\u7576\u4ee3\u4e2d\u65871"},{"@type":"BreadcrumbList","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/tiffanysmandarin.com\/"},{"@type":"ListItem","position":2,"name":"B1 L1 Vocabulary and Practice"}]},{"@type":"WebSite","@id":"https:\/\/tiffanysmandarin.com\/#website","url":"https:\/\/tiffanysmandarin.com\/","name":"OneDotDot Chinese","description":"Learn a little Chinese every day","publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tiffanysmandarin.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99","name":"tiffany","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","url":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","contentUrl":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","width":214,"height":214,"caption":"tiffany"},"logo":{"@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png"},"sameAs":["https:\/\/www.instagram.com\/tiffanys_talk\/","https:\/\/www.linkedin.com\/in\/tiffany-huang-mandarin\/"],"url":"https:\/\/tiffanysmandarin.com\/index.php\/author\/tiffany\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","_links":{"self":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/comments?post=12874"}],"version-history":[{"count":7,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12874\/revisions"}],"predecessor-version":[{"id":16292,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12874\/revisions\/16292"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media\/10970"}],"wp:attachment":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media?parent=12874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/categories?post=12874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/tags?post=12874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}